From 9bc107467cda9bc3ad05bd7209a84d503d54aaa9 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:10:46 +0000 Subject: [PATCH 01/12] feat(grpc): trace and events for ExecuteAction ExecuteActionRequest takes trace and events, ExecuteActionResponse carries the run's trace as DocumentEvent records: the action executor records each token step, wait, accept, decision, assignment and the completion as typed records that print no line, and events are posted to the performer in turn as the run waits, as the REPL's %send does. The gRPC service and the wasm engine advertise the action_trace capability. Co-Authored-By: jason.han --- api/proto/sysml.pb.go | 672 ++++++++++-------- api/proto/sysml.proto | 53 +- .../execute-action-trace-events.added.md | 1 + internal/doc/queryexec/event.go | 30 +- internal/doc/queryexec/events.go | 11 + internal/exec/runtime/action_choice.go | 26 +- internal/exec/runtime/action_executor.go | 59 +- internal/exec/runtime/action_frame.go | 3 + internal/exec/runtime/action_statements.go | 4 + internal/exec/runtime/action_subflow.go | 2 + .../exec/runtime/action_trace_records_test.go | 138 ++++ internal/exec/runtime/context.go | 46 ++ internal/exec/runtime/statements.go | 134 ++-- internal/exec/runtime/trace.go | 82 ++- internal/frontend/combined/combined.go | 1 + internal/frontend/engine/engine.go | 78 +- internal/frontend/engine/json.go | 10 +- internal/frontend/grpc/action_trace_test.go | 172 +++++ internal/frontend/grpc/docquery.go | 5 + internal/frontend/grpc/run_options.go | 17 +- internal/frontend/grpc/service.go | 91 ++- tests/grpc/conformance_test.go | 19 +- tests/grpc/testdata/conformance/README.md | 3 +- ...execute_action_events_accept.expected.json | 42 ++ .../execute_action_events_accept.sysml | 21 + ...xecute_action_events_waiting.expected.json | 22 + .../execute_action_events_waiting.sysml | 21 + .../execute_action_trace.expected.json | 32 + .../conformance/execute_action_trace.sysml | 21 + tests/wasm/combined_test.go | 1 + 30 files changed, 1434 insertions(+), 383 deletions(-) create mode 100644 changes/unreleased/execute-action-trace-events.added.md create mode 100644 internal/exec/runtime/action_trace_records_test.go create mode 100644 internal/frontend/grpc/action_trace_test.go create mode 100644 tests/grpc/testdata/conformance/execute_action_events_accept.expected.json create mode 100644 tests/grpc/testdata/conformance/execute_action_events_accept.sysml create mode 100644 tests/grpc/testdata/conformance/execute_action_events_waiting.expected.json create mode 100644 tests/grpc/testdata/conformance/execute_action_events_waiting.sysml create mode 100644 tests/grpc/testdata/conformance/execute_action_trace.expected.json create mode 100644 tests/grpc/testdata/conformance/execute_action_trace.sysml diff --git a/api/proto/sysml.pb.go b/api/proto/sysml.pb.go index e38b10b548..29bfd9dff5 100644 --- a/api/proto/sysml.pb.go +++ b/api/proto/sysml.pb.go @@ -5105,7 +5105,21 @@ type ExecuteActionRequest struct { // wait comes due at the first multiple of it not before the wait ends. 0, the // default, is a continuous clock; a negative or non-finite step is // INVALID_ARGUMENT. - ClockStep float64 `protobuf:"fixed64,9,opt,name=clock_step,json=clockStep,proto3" json:"clock_step,omitempty"` + ClockStep float64 `protobuf:"fixed64,9,opt,name=clock_step,json=clockStep,proto3" json:"clock_step,omitempty"` + // Ask for the run's trace in ExecuteActionResponse.trace. Advertised as the + // "action_trace" capability; a service withholding it refuses true with + // UNIMPLEMENTED, as does an explore schedule with INVALID_ARGUMENT. + Trace bool `protobuf:"varint,10,opt,name=trace,proto3" json:"trace,omitempty"` + // Signals or items to post to the performing object, in this order, as the + // REPL's `%send` does: the run goes until it completes or every token waits, + // the next event is then posted to the object's queue and the run goes on, + // an accept node waiting for it taking it on the next step. An event of a + // type no accept node of the performance names is refused, with the accepts + // still waiting. The events exhausted, the run goes on to completion (or for + // `advance`); a token still waiting at the end is an accept deadlock, + // reported in `error` with the message it waits for. Needs a performer and + // is refused without one with INVALID_ARGUMENT. + Events []string `protobuf:"bytes,11,rep,name=events,proto3" json:"events,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -5203,6 +5217,20 @@ func (x *ExecuteActionRequest) GetClockStep() float64 { return 0 } +func (x *ExecuteActionRequest) GetTrace() bool { + if x != nil { + return x.Trace + } + return false +} + +func (x *ExecuteActionRequest) GetEvents() []string { + if x != nil { + return x.Events + } + return nil +} + // ExecuteActionResponse contains action execution results type ExecuteActionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -5228,8 +5256,15 @@ type ExecuteActionResponse struct { // output nothing order-dependent wrote is absent. Populated under the // "order_dependence" capability; empty under an explore schedule. OrderDependent map[string]int32 `protobuf:"bytes,8,rep,name=order_dependent,json=orderDependent,proto3" json:"order_dependent,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // The run's trace in the order the run made it, when the request asked for + // it: the token steps, waits, accepts, sends, decisions, assignments and + // completion of the action, each a DocumentEvent (see its `kind`), also on a + // run that failed, up to the failure. Empty under an explore schedule. + Trace []*DocumentEvent `protobuf:"bytes,9,rep,name=trace,proto3" json:"trace,omitempty"` + // How many of the oldest records the service's held-events bound discarded. + TraceDropped int32 `protobuf:"varint,10,opt,name=trace_dropped,json=traceDropped,proto3" json:"trace_dropped,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExecuteActionResponse) Reset() { @@ -5318,6 +5353,20 @@ func (x *ExecuteActionResponse) GetOrderDependent() map[string]int32 { return nil } +func (x *ExecuteActionResponse) GetTrace() []*DocumentEvent { + if x != nil { + return x.Trace + } + return nil +} + +func (x *ExecuteActionResponse) GetTraceDropped() int32 { + if x != nil { + return x.TraceDropped + } + return 0 +} + // ExecuteStateRequest requests state machine execution type ExecuteStateRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -13981,7 +14030,12 @@ func (x *DocumentState) GetEnclosing() []string { // session's trace, in the order the run made it. type DocumentEvent struct { state protoimpl.MessageState `protogen:"open.v1"` - // "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". + // "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or + // "terminate" for a state machine's records; an action's run adds "step" (a + // token arriving at a node), "wait" (a token parking at an accept node), + // "assign" (a feature written), "decide" (a decision node resolved) and + // "complete" (the action's performance completed); its "accept" is the accept + // node taking a message and its "send" a message posted. Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // The clock's instant when the record was made: a quantity in the clock's // unit when the library reduces one, else a bare real of clock units. @@ -13992,23 +14046,37 @@ type DocumentEvent struct { // The behavior the record is about, by the name the object exhibits it // under, else its declared name; empty for the run's own records. Machine string `protobuf:"bytes,4,opt,name=machine,proto3" json:"machine,omitempty"` - // The state entered, exited or stepped by an entry, exit or do record. + // The state entered, exited or stepped by an entry, exit or do record; the + // action node a wait, assign, decide or action accept record is at. State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - // A fired transition's source and target states. + // A fired transition's source and target states; a step's source node (empty + // where the token's flow starts) and the node it arrived at; a decide's + // branch taken, as `taken` names it. From string `protobuf:"bytes,6,opt,name=from,proto3" json:"from,omitempty"` To string `protobuf:"bytes,7,opt,name=to,proto3" json:"to,omitempty"` // The object a send was addressed to; unset for every other kind and a // send addressed to no object. Target *DocumentObject `protobuf:"bytes,8,opt,name=target,proto3" json:"target,omitempty"` - // The signal or event accepted or sent, or the trigger a transition fired on. + // The signal or event accepted or sent, the trigger a transition fired on, or + // the message type or trigger a wait record waits for. Event string `protobuf:"bytes,9,opt,name=event,proto3" json:"event,omitempty"` // An accept's payload, one `name = value` entry per parameter in name order. Payload []string `protobuf:"bytes,10,rep,name=payload,proto3" json:"payload,omitempty"` - // A choice's alternatives, in the order they were offered, and the one taken. + // A choice's alternatives, in the order they were offered, and the one taken; + // a decide's branches as `->`, and the one taken. Alternatives []string `protobuf:"bytes,11,rep,name=alternatives,proto3" json:"alternatives,omitempty"` Taken string `protobuf:"bytes,12,opt,name=taken,proto3" json:"taken,omitempty"` // The line the trace prints for the record. - Text string `protobuf:"bytes,13,opt,name=text,proto3" json:"text,omitempty"` + Text string `protobuf:"bytes,13,opt,name=text,proto3" json:"text,omitempty"` + // The action token a step, wait, assign, decide or action accept record is + // about, and the executor step (1-based) that made the record; 0 for a record + // of neither (a state machine's, a send from outside the model). + Token int64 `protobuf:"varint,14,opt,name=token,proto3" json:"token,omitempty"` + Step int32 `protobuf:"varint,15,opt,name=step,proto3" json:"step,omitempty"` + // The feature an assign record wrote and the value it holds since, as the + // run's outputs carry values. + Feature string `protobuf:"bytes,16,opt,name=feature,proto3" json:"feature,omitempty"` + Value *Value `protobuf:"bytes,17,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -14134,6 +14202,34 @@ func (x *DocumentEvent) GetText() string { return "" } +func (x *DocumentEvent) GetToken() int64 { + if x != nil { + return x.Token + } + return 0 +} + +func (x *DocumentEvent) GetStep() int32 { + if x != nil { + return x.Step + } + return 0 +} + +func (x *DocumentEvent) GetFeature() string { + if x != nil { + return x.Feature + } + return "" +} + +func (x *DocumentEvent) GetValue() *Value { + if x != nil { + return x.Value + } + return nil +} + // DocumentQueryColumn is one projected property, in projection order. type DocumentQueryColumn struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -17841,7 +17937,7 @@ const file_sysml_proto_rawDesc = "" + "\binstance\x18\x01 \x01(\v2\x0f.sysml.InstanceR\binstance\x12\x14\n" + "\x05error\x18\x02 \x01(\tR\x05error\x123\n" + "\vdiagnostics\x18\x03 \x03(\v2\x11.sysml.DiagnosticR\vdiagnostics\x12-\n" + - "\tinstances\x18\x04 \x03(\v2\x0f.sysml.InstanceR\tinstances\"\xb7\x03\n" + + "\tinstances\x18\x04 \x03(\v2\x0f.sysml.InstanceR\tinstances\"\xe5\x03\n" + "\x14ExecuteActionRequest\x12\x1d\n" + "\n" + "model_hash\x18\x01 \x01(\tR\tmodelHash\x12(\n" + @@ -17853,13 +17949,16 @@ const file_sysml_proto_rawDesc = "" + "\x04seed\x18\a \x01(\x04H\x01R\x04seed\x88\x01\x01\x12\x14\n" + "\x05draws\x18\b \x01(\tR\x05draws\x12\x1d\n" + "\n" + - "clock_step\x18\t \x01(\x01R\tclockStep\x1aG\n" + + "clock_step\x18\t \x01(\x01R\tclockStep\x12\x14\n" + + "\x05trace\x18\n" + + " \x01(\bR\x05trace\x12\x16\n" + + "\x06events\x18\v \x03(\tR\x06events\x1aG\n" + "\vInputsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\"\n" + "\x05value\x18\x02 \x01(\v2\f.sysml.ValueR\x05value:\x028\x01B\n" + "\n" + "\b_advanceB\a\n" + - "\x05_seed\"\xd6\x05\n" + + "\x05_seed\"\xa7\x06\n" + "\x15ExecuteActionResponse\x12C\n" + "\aoutputs\x18\x01 \x03(\v2).sysml.ExecuteActionResponse.OutputsEntryR\aoutputs\x12\x14\n" + "\x05error\x18\x02 \x01(\tR\x05error\x123\n" + @@ -17869,7 +17968,10 @@ const file_sysml_proto_rawDesc = "" + "\n" + "final_time\x18\x06 \x01(\x01R\tfinalTime\x12h\n" + "\x14performer_attributes\x18\a \x03(\v25.sysml.ExecuteActionResponse.PerformerAttributesEntryR\x13performerAttributes\x12Y\n" + - "\x0forder_dependent\x18\b \x03(\v20.sysml.ExecuteActionResponse.OrderDependentEntryR\x0eorderDependent\x1aH\n" + + "\x0forder_dependent\x18\b \x03(\v20.sysml.ExecuteActionResponse.OrderDependentEntryR\x0eorderDependent\x12*\n" + + "\x05trace\x18\t \x03(\v2\x14.sysml.DocumentEventR\x05trace\x12#\n" + + "\rtrace_dropped\x18\n" + + " \x01(\x05R\ftraceDropped\x1aH\n" + "\fOutputsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\"\n" + "\x05value\x18\x02 \x01(\v2\f.sysml.ValueR\x05value:\x028\x01\x1aT\n" + @@ -18603,7 +18705,7 @@ const file_sysml_proto_rawDesc = "" + "state_path\x18\x04 \x01(\tR\tstatePath\x12*\n" + "\x05state\x18\x05 \x01(\v2\x14.sysml.DocumentValueR\x05state\x12\x16\n" + "\x06region\x18\x06 \x01(\tR\x06region\x12\x1c\n" + - "\tenclosing\x18\a \x03(\tR\tenclosing\"\xfd\x02\n" + + "\tenclosing\x18\a \x03(\tR\tenclosing\"\xe5\x03\n" + "\rDocumentEvent\x12\x12\n" + "\x04kind\x18\x01 \x01(\tR\x04kind\x12(\n" + "\x04time\x18\x02 \x01(\v2\x14.sysml.DocumentValueR\x04time\x12-\n" + @@ -18618,7 +18720,11 @@ const file_sysml_proto_rawDesc = "" + " \x03(\tR\apayload\x12\"\n" + "\falternatives\x18\v \x03(\tR\falternatives\x12\x14\n" + "\x05taken\x18\f \x01(\tR\x05taken\x12\x12\n" + - "\x04text\x18\r \x01(\tR\x04text\")\n" + + "\x04text\x18\r \x01(\tR\x04text\x12\x14\n" + + "\x05token\x18\x0e \x01(\x03R\x05token\x12\x12\n" + + "\x04step\x18\x0f \x01(\x05R\x04step\x12\x18\n" + + "\afeature\x18\x10 \x01(\tR\afeature\x12\"\n" + + "\x05value\x18\x11 \x01(\v2\f.sysml.ValueR\x05value\")\n" + "\x13DocumentQueryColumn\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"A\n" + "\x11DocumentQueryCell\x12,\n" + @@ -19296,273 +19402,275 @@ var file_sysml_proto_depIdxs = []int32{ 29, // 88: sysml.ExecuteActionResponse.exploration:type_name -> sysml.ExplorationStatus 196, // 89: sysml.ExecuteActionResponse.performer_attributes:type_name -> sysml.ExecuteActionResponse.PerformerAttributesEntry 197, // 90: sysml.ExecuteActionResponse.order_dependent:type_name -> sysml.ExecuteActionResponse.OrderDependentEntry - 198, // 91: sysml.ExecuteStateResponse.final_context:type_name -> sysml.ExecuteStateResponse.FinalContextEntry - 114, // 92: sysml.ExecuteStateResponse.diagnostics:type_name -> sysml.Diagnostic - 28, // 93: sysml.ExecuteStateResponse.outcomes:type_name -> sysml.Outcome - 29, // 94: sysml.ExecuteStateResponse.exploration:type_name -> sysml.ExplorationStatus - 147, // 95: sysml.ExecuteStateResponse.trace:type_name -> sysml.DocumentEvent - 199, // 96: sysml.ExecuteStateResponse.order_dependent:type_name -> sysml.ExecuteStateResponse.OrderDependentEntry - 114, // 97: sysml.ConvertResponse.diagnostics:type_name -> sysml.Diagnostic - 62, // 98: sysml.ConvertResponse.library_references:type_name -> sysml.LibraryReference - 65, // 99: sysml.MigrateResponse.report:type_name -> sysml.MigrationReport - 67, // 100: sysml.MigrateResponse.files:type_name -> sysml.MigrationFile - 66, // 101: sysml.MigrationReport.entries:type_name -> sysml.MigrationEntry - 69, // 102: sysml.ApplyEditsRequest.operations:type_name -> sysml.EditOperation - 86, // 103: sysml.EditOperation.set_value:type_name -> sysml.SetValueEdit - 87, // 104: sysml.EditOperation.rename:type_name -> sysml.RenameEdit - 70, // 105: sysml.EditOperation.add_member:type_name -> sysml.AddMemberEdit - 84, // 106: sysml.EditOperation.delete:type_name -> sysml.DeleteEdit - 85, // 107: sysml.EditOperation.move:type_name -> sysml.MoveEdit - 83, // 108: sysml.EditOperation.add_connection:type_name -> sysml.AddConnectionEdit - 71, // 109: sysml.EditOperation.add_satisfy:type_name -> sysml.AddSatisfyEdit - 72, // 110: sysml.EditOperation.add_requirement_constraint:type_name -> sysml.AddRequirementConstraintEdit - 73, // 111: sysml.EditOperation.add_transition:type_name -> sysml.AddTransitionEdit - 78, // 112: sysml.EditOperation.add_import:type_name -> sysml.AddImportEdit - 79, // 113: sysml.EditOperation.add_documentation:type_name -> sysml.AddDocumentationEdit - 74, // 114: sysml.EditOperation.add_verify:type_name -> sysml.AddVerifyEdit - 76, // 115: sysml.EditOperation.add_metadata:type_name -> sysml.AddMetadataEdit - 82, // 116: sysml.EditOperation.add_sequence:type_name -> sysml.AddSequenceEdit - 77, // 117: sysml.EditOperation.add_metadata_prefix:type_name -> sysml.AddMetadataPrefixEdit - 80, // 118: sysml.EditOperation.add_comment:type_name -> sysml.AddCommentEdit - 81, // 119: sysml.EditOperation.add_note:type_name -> sysml.AddNoteEdit - 75, // 120: sysml.AddMetadataEdit.values:type_name -> sysml.MetadataFeatureValue - 82, // 121: sysml.AddSequenceEdit.body:type_name -> sysml.AddSequenceEdit - 82, // 122: sysml.AddSequenceEdit.else_body:type_name -> sysml.AddSequenceEdit - 91, // 123: sysml.ApplyEditsResponse.applied:type_name -> sysml.AppliedEdit - 1, // 124: sysml.ApplyEditsResponse.failure:type_name -> sysml.EditFailure - 114, // 125: sysml.ApplyEditsResponse.diagnostics:type_name -> sysml.Diagnostic - 89, // 126: sysml.ApplyEditsResponse.documents:type_name -> sysml.EditedDocument - 90, // 127: sysml.ApplyEditsResponse.referrers:type_name -> sysml.Referrer - 200, // 128: sysml.SymbolInfo.metadata:type_name -> sysml.SymbolInfo.MetadataEntry - 96, // 129: sysml.SymbolInfo.attributes:type_name -> sysml.AttributeInfo - 94, // 130: sysml.SymbolInfo.type_info:type_name -> sysml.TypeInfo - 95, // 131: sysml.SymbolInfo.multiplicity:type_name -> sysml.MultiplicityInfo - 93, // 132: sysml.SymbolInfo.specializations:type_name -> sysml.Specialization - 97, // 133: sysml.AttributeInfo.value:type_name -> sysml.Value - 109, // 134: sysml.Value.sequence:type_name -> sysml.ValueSequence - 110, // 135: sysml.Value.quantity:type_name -> sysml.Quantity - 108, // 136: sysml.Value.enum_literal:type_name -> sysml.EnumLiteral - 107, // 137: sysml.Value.complex:type_name -> sysml.Complex - 104, // 138: sysml.Value.array:type_name -> sysml.Array - 105, // 139: sysml.Value.vector:type_name -> sysml.Vector - 106, // 140: sysml.Value.vector_quantity:type_name -> sysml.VectorQuantity - 111, // 141: sysml.Value.measurement_ref:type_name -> sysml.MeasurementRef - 101, // 142: sysml.Value.function:type_name -> sysml.Function - 102, // 143: sysml.Value.set:type_name -> sysml.ValueSet - 103, // 144: sysml.Value.tensor_quantity:type_name -> sysml.TensorQuantity - 99, // 145: sysml.Value.metaobject:type_name -> sysml.Metaobject - 100, // 146: sysml.Value.undetermined:type_name -> sysml.Undetermined - 98, // 147: sysml.Value.rational_value:type_name -> sysml.Rational - 95, // 148: sysml.Undetermined.count:type_name -> sysml.MultiplicityInfo - 97, // 149: sysml.ValueSet.elements:type_name -> sysml.Value - 110, // 150: sysml.TensorQuantity.components:type_name -> sysml.Quantity - 97, // 151: sysml.Array.elements:type_name -> sysml.Value - 97, // 152: sysml.Vector.components:type_name -> sysml.Value - 110, // 153: sysml.VectorQuantity.components:type_name -> sysml.Quantity - 97, // 154: sysml.EnumLiteral.value:type_name -> sysml.Value - 97, // 155: sysml.ValueSequence.elements:type_name -> sysml.Value - 98, // 156: sysml.Quantity.rational_magnitude:type_name -> sysml.Rational - 112, // 157: sysml.Quantity.unit_term:type_name -> sysml.UnitTerm - 112, // 158: sysml.MeasurementRef.unit_term:type_name -> sysml.UnitTerm - 113, // 159: sysml.UnitTerm.factors:type_name -> sysml.UnitFactor - 115, // 160: sysml.Diagnostic.span:type_name -> sysml.Span - 120, // 161: sysml.QueryRequest.query:type_name -> sysml.Query - 124, // 162: sysml.QueryResponse.elements:type_name -> sysml.QueryResultElement - 121, // 163: sysml.Query.where:type_name -> sysml.Constraint - 122, // 164: sysml.Constraint.primitive:type_name -> sysml.PrimitiveConstraint - 123, // 165: sysml.Constraint.composite:type_name -> sysml.CompositeConstraint - 2, // 166: sysml.PrimitiveConstraint.operator:type_name -> sysml.PrimitiveOperator - 3, // 167: sysml.CompositeConstraint.operator:type_name -> sysml.CompositeOperator - 121, // 168: sysml.CompositeConstraint.constraint:type_name -> sysml.Constraint - 201, // 169: sysml.QueryResultElement.properties:type_name -> sysml.QueryResultElement.PropertiesEntry - 97, // 170: sysml.SweepRange.start:type_name -> sysml.Value - 97, // 171: sysml.SweepRange.end:type_name -> sysml.Value - 97, // 172: sysml.SweepRange.step:type_name -> sysml.Value - 97, // 173: sysml.RunSweepRequest.arguments:type_name -> sysml.Value - 202, // 174: sysml.RunSweepRequest.named_arguments:type_name -> sysml.RunSweepRequest.NamedArgumentsEntry - 125, // 175: sysml.RunSweepRequest.ranges:type_name -> sysml.SweepRange - 19, // 176: sysml.SweepRow.inputs:type_name -> sysml.CalcOutput - 19, // 177: sysml.SweepRow.outputs:type_name -> sysml.CalcOutput - 4, // 178: sysml.SweepRow.verdicts:type_name -> sysml.Verdict - 0, // 179: sysml.SweepRow.failure_reason:type_name -> sysml.FailureReason - 20, // 180: sysml.SweepRow.evaluations:type_name -> sysml.CaseEvaluation - 127, // 181: sysml.RunSweepResponse.rows:type_name -> sysml.SweepRow - 114, // 182: sysml.RunSweepResponse.diagnostics:type_name -> sysml.Diagnostic - 0, // 183: sysml.RunSweepResponse.failure_reason:type_name -> sysml.FailureReason - 52, // 184: sysml.RunSweepResponse.instances:type_name -> sysml.Instance - 7, // 185: sysml.RunSweepResponse.bounds:type_name -> sysml.Bound - 203, // 186: sysml.RunRunsRequest.inputs:type_name -> sysml.RunRunsRequest.InputsEntry - 97, // 187: sysml.RunRunsRequest.arguments:type_name -> sysml.Value - 204, // 188: sysml.RunRunsRequest.named_arguments:type_name -> sysml.RunRunsRequest.NamedArgumentsEntry - 97, // 189: sysml.RunDistribution.min:type_name -> sysml.Value - 97, // 190: sysml.RunDistribution.max:type_name -> sysml.Value - 97, // 191: sysml.RunDistribution.mean:type_name -> sysml.Value - 131, // 192: sysml.RunDistribution.percentiles:type_name -> sysml.RunPercentile - 132, // 193: sysml.RunDistribution.histogram:type_name -> sysml.RunHistogramBin - 133, // 194: sysml.RunDistribution.values:type_name -> sysml.RunCountedValue - 97, // 195: sysml.RunPercentile.value:type_name -> sysml.Value - 97, // 196: sysml.RunHistogramBin.low:type_name -> sysml.Value - 97, // 197: sysml.RunHistogramBin.high:type_name -> sysml.Value - 97, // 198: sysml.RunCountedValue.value:type_name -> sysml.Value - 135, // 199: sysml.SelfCheckResponse.findings:type_name -> sysml.SelfCheckFinding - 136, // 200: sysml.SelfCheckResponse.applications:type_name -> sysml.SelfCheckApplication - 114, // 201: sysml.SelfCheckResponse.diagnostics:type_name -> sysml.Diagnostic - 97, // 202: sysml.RecordRunRequest.arguments:type_name -> sysml.Value - 205, // 203: sysml.RecordRunRequest.named_arguments:type_name -> sysml.RecordRunRequest.NamedArgumentsEntry - 125, // 204: sysml.RecordRunRequest.ranges:type_name -> sysml.SweepRange - 26, // 205: sysml.RecordRunResponse.run:type_name -> sysml.RunAnalysisResponse - 128, // 206: sysml.RecordRunResponse.sweep:type_name -> sysml.RunSweepResponse - 140, // 207: sysml.RecordRunResponse.sample:type_name -> sysml.RunRunsResponse - 89, // 208: sysml.RecordRunResponse.documents:type_name -> sysml.EditedDocument - 0, // 209: sysml.RecordRunResponse.failure_reason:type_name -> sysml.FailureReason - 114, // 210: sysml.RecordRunResponse.diagnostics:type_name -> sysml.Diagnostic - 127, // 211: sysml.RunRunsResponse.rows:type_name -> sysml.SweepRow - 130, // 212: sysml.RunRunsResponse.distributions:type_name -> sysml.RunDistribution - 19, // 213: sysml.RunRunsResponse.outputs:type_name -> sysml.CalcOutput - 4, // 214: sysml.RunRunsResponse.verdicts:type_name -> sysml.Verdict - 114, // 215: sysml.RunRunsResponse.diagnostics:type_name -> sysml.Diagnostic - 0, // 216: sysml.RunRunsResponse.failure_reason:type_name -> sysml.FailureReason - 52, // 217: sysml.RunRunsResponse.instances:type_name -> sysml.Instance - 7, // 218: sysml.RunRunsResponse.bounds:type_name -> sysml.Bound - 142, // 219: sysml.RunDocumentQueryRequest.bindings:type_name -> sysml.DocumentQueryBinding - 143, // 220: sysml.DocumentQueryBinding.values:type_name -> sysml.DocumentValue - 110, // 221: sysml.DocumentValue.quantity:type_name -> sysml.Quantity - 145, // 222: sysml.DocumentValue.verdict:type_name -> sysml.DocumentVerdict - 144, // 223: sysml.DocumentValue.object:type_name -> sysml.DocumentObject - 146, // 224: sysml.DocumentValue.state:type_name -> sysml.DocumentState - 147, // 225: sysml.DocumentValue.event:type_name -> sysml.DocumentEvent - 98, // 226: sysml.DocumentValue.rational_value:type_name -> sysml.Rational - 143, // 227: sysml.DocumentObject.element:type_name -> sysml.DocumentValue - 143, // 228: sysml.DocumentVerdict.assertion:type_name -> sysml.DocumentValue - 144, // 229: sysml.DocumentState.object:type_name -> sysml.DocumentObject - 143, // 230: sysml.DocumentState.state:type_name -> sysml.DocumentValue - 143, // 231: sysml.DocumentEvent.time:type_name -> sysml.DocumentValue - 144, // 232: sysml.DocumentEvent.object:type_name -> sysml.DocumentObject - 144, // 233: sysml.DocumentEvent.target:type_name -> sysml.DocumentObject - 143, // 234: sysml.DocumentQueryCell.values:type_name -> sysml.DocumentValue - 143, // 235: sysml.DocumentQueryRow.element:type_name -> sysml.DocumentValue - 149, // 236: sysml.DocumentQueryRow.cells:type_name -> sysml.DocumentQueryCell - 148, // 237: sysml.RunDocumentQueryResponse.columns:type_name -> sysml.DocumentQueryColumn - 150, // 238: sysml.RunDocumentQueryResponse.rows:type_name -> sysml.DocumentQueryRow - 153, // 239: sysml.QueryOutcome.failures:type_name -> sysml.QueryFailure - 157, // 240: sysml.QueryOutcome.findings:type_name -> sysml.QueryFinding - 153, // 241: sysml.QueryOutcome.path_failures:type_name -> sysml.QueryFailure - 154, // 242: sysml.QueryFailure.frontier:type_name -> sysml.QueryFrontier - 155, // 243: sysml.QueryFrontier.members:type_name -> sysml.QueryFrontierMember - 156, // 244: sysml.QueryFrontier.features:type_name -> sysml.QueryFrontierFeature - 162, // 245: sysml.RenderViewResponse.nodes:type_name -> sysml.RenderNode - 164, // 246: sysml.RenderViewResponse.edges:type_name -> sysml.RenderEdge - 169, // 247: sysml.RenderViewResponse.rows:type_name -> sysml.RenderRow - 166, // 248: sysml.RenderViewResponse.canvas:type_name -> sysml.RenderCanvas - 170, // 249: sysml.RenderViewResponse.notes:type_name -> sysml.RenderNote - 163, // 250: sysml.RenderNode.ports:type_name -> sysml.RenderPort - 115, // 251: sysml.RenderNode.origin:type_name -> sysml.Span - 165, // 252: sysml.RenderNode.geometry:type_name -> sysml.RenderGeometry - 167, // 253: sysml.RenderNode.style:type_name -> sysml.RenderStyle - 115, // 254: sysml.RenderEdge.origin:type_name -> sysml.Span - 168, // 255: sysml.RenderEdge.route:type_name -> sysml.RenderPoint - 167, // 256: sysml.RenderEdge.style:type_name -> sysml.RenderStyle - 115, // 257: sysml.RenderRow.origin:type_name -> sysml.Span - 115, // 258: sysml.RenderNote.origin:type_name -> sysml.Span - 174, // 259: sysml.ImportDataRequest.imports:type_name -> sysml.DataImport - 176, // 260: sysml.ImportDataResponse.files:type_name -> sysml.ImportedFile - 89, // 261: sysml.ImportDataResponse.documents:type_name -> sysml.EditedDocument - 114, // 262: sysml.ImportDataResponse.diagnostics:type_name -> sysml.Diagnostic - 177, // 263: sysml.ImportedFile.assignments:type_name -> sysml.ImportedValue - 179, // 264: sysml.CompareResultsRequest.observe:type_name -> sysml.ObservablePair - 181, // 265: sysml.CompareResultsResponse.configurations:type_name -> sysml.ConfigurationComparison - 114, // 266: sysml.CompareResultsResponse.diagnostics:type_name -> sysml.Diagnostic - 0, // 267: sysml.CompareResultsResponse.failure_reason:type_name -> sysml.FailureReason - 7, // 268: sysml.CompareResultsResponse.bounds:type_name -> sysml.Bound - 127, // 269: sysml.ConfigurationComparison.rows:type_name -> sysml.SweepRow - 52, // 270: sysml.ConfigurationComparison.instances:type_name -> sysml.Instance - 182, // 271: sysml.ConfigurationComparison.observables:type_name -> sysml.ObservableComparison - 183, // 272: sysml.ObservableComparison.tool:type_name -> sysml.ComparedDistribution - 183, // 273: sysml.ObservableComparison.run:type_name -> sysml.ComparedDistribution - 184, // 274: sysml.ObservableComparison.difference:type_name -> sysml.StatisticDifference - 185, // 275: sysml.ObservableComparison.declared:type_name -> sysml.CaseStatistics - 186, // 276: sysml.CaseStatistics.rows:type_name -> sysml.CaseStatistic - 97, // 277: sysml.VerifyConstraintRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 97, // 278: sysml.VerifyRequirementRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 97, // 279: sysml.RunAnalysisRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 97, // 280: sysml.Outcome.OutputsEntry.value:type_name -> sysml.Value - 97, // 281: sysml.CheckBehaviorRequest.InputsEntry.value:type_name -> sysml.Value - 53, // 282: sysml.Instance.FeatureValuesEntry.value:type_name -> sysml.FeatureValue - 97, // 283: sysml.ExecuteActionRequest.InputsEntry.value:type_name -> sysml.Value - 97, // 284: sysml.ExecuteActionResponse.OutputsEntry.value:type_name -> sysml.Value - 97, // 285: sysml.ExecuteActionResponse.PerformerAttributesEntry.value:type_name -> sysml.Value - 97, // 286: sysml.ExecuteStateResponse.FinalContextEntry.value:type_name -> sysml.Value - 97, // 287: sysml.RunSweepRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 97, // 288: sysml.RunRunsRequest.InputsEntry.value:type_name -> sysml.Value - 97, // 289: sysml.RunRunsRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 97, // 290: sysml.RecordRunRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 116, // 291: sysml.SysMLService.GetServerInfo:input_type -> sysml.ServerInfoRequest - 41, // 292: sysml.SysMLService.ParseFile:input_type -> sysml.ParseFileRequest - 43, // 293: sysml.SysMLService.ParseSources:input_type -> sysml.ParseSourcesRequest - 46, // 294: sysml.SysMLService.GetSymbol:input_type -> sysml.GetSymbolRequest - 48, // 295: sysml.SysMLService.GetDiagnostics:input_type -> sysml.DiagnosticsRequest - 50, // 296: sysml.SysMLService.Evaluate:input_type -> sysml.EvaluateRequest - 54, // 297: sysml.SysMLService.Instantiate:input_type -> sysml.InstantiateRequest - 56, // 298: sysml.SysMLService.ExecuteAction:input_type -> sysml.ExecuteActionRequest - 58, // 299: sysml.SysMLService.ExecuteState:input_type -> sysml.ExecuteStateRequest - 60, // 300: sysml.SysMLService.Convert:input_type -> sysml.ConvertRequest - 63, // 301: sysml.SysMLService.Migrate:input_type -> sysml.MigrateRequest - 68, // 302: sysml.SysMLService.ApplyEdits:input_type -> sysml.ApplyEditsRequest - 8, // 303: sysml.SysMLService.VerifyConstraint:input_type -> sysml.VerifyConstraintRequest - 10, // 304: sysml.SysMLService.VerifyRequirement:input_type -> sysml.VerifyRequirementRequest - 13, // 305: sysml.SysMLService.VerifySatisfaction:input_type -> sysml.VerifySatisfactionRequest - 15, // 306: sysml.SysMLService.ValidateInstance:input_type -> sysml.ValidateInstanceRequest - 17, // 307: sysml.SysMLService.EvaluateCalc:input_type -> sysml.EvaluateCalcRequest - 21, // 308: sysml.SysMLService.RunAnalysis:input_type -> sysml.RunAnalysisRequest - 30, // 309: sysml.SysMLService.CheckBehavior:input_type -> sysml.CheckBehaviorRequest - 126, // 310: sysml.SysMLService.RunSweep:input_type -> sysml.RunSweepRequest - 129, // 311: sysml.SysMLService.RunRuns:input_type -> sysml.RunRunsRequest - 134, // 312: sysml.SysMLService.SelfCheck:input_type -> sysml.SelfCheckRequest - 138, // 313: sysml.SysMLService.RecordRun:input_type -> sysml.RecordRunRequest - 38, // 314: sysml.SysMLService.ListEngines:input_type -> sysml.ListEnginesRequest - 118, // 315: sysml.SysMLService.Query:input_type -> sysml.QueryRequest - 141, // 316: sysml.SysMLService.RunDocumentQuery:input_type -> sysml.RunDocumentQueryRequest - 158, // 317: sysml.SysMLService.RenderDocument:input_type -> sysml.RenderDocumentRequest - 160, // 318: sysml.SysMLService.RenderView:input_type -> sysml.RenderViewRequest - 171, // 319: sysml.SysMLService.ExportGraphs:input_type -> sysml.ExportGraphsRequest - 173, // 320: sysml.SysMLService.ImportData:input_type -> sysml.ImportDataRequest - 178, // 321: sysml.SysMLService.CompareResults:input_type -> sysml.CompareResultsRequest - 117, // 322: sysml.SysMLService.GetServerInfo:output_type -> sysml.ServerInfoResponse - 45, // 323: sysml.SysMLService.ParseFile:output_type -> sysml.ParseFileResponse - 44, // 324: sysml.SysMLService.ParseSources:output_type -> sysml.ParseSourcesResponse - 47, // 325: sysml.SysMLService.GetSymbol:output_type -> sysml.SymbolResponse - 49, // 326: sysml.SysMLService.GetDiagnostics:output_type -> sysml.DiagnosticsResponse - 51, // 327: sysml.SysMLService.Evaluate:output_type -> sysml.EvaluateResponse - 55, // 328: sysml.SysMLService.Instantiate:output_type -> sysml.InstantiateResponse - 57, // 329: sysml.SysMLService.ExecuteAction:output_type -> sysml.ExecuteActionResponse - 59, // 330: sysml.SysMLService.ExecuteState:output_type -> sysml.ExecuteStateResponse - 61, // 331: sysml.SysMLService.Convert:output_type -> sysml.ConvertResponse - 64, // 332: sysml.SysMLService.Migrate:output_type -> sysml.MigrateResponse - 88, // 333: sysml.SysMLService.ApplyEdits:output_type -> sysml.ApplyEditsResponse - 9, // 334: sysml.SysMLService.VerifyConstraint:output_type -> sysml.VerifyConstraintResponse - 12, // 335: sysml.SysMLService.VerifyRequirement:output_type -> sysml.VerifyRequirementResponse - 14, // 336: sysml.SysMLService.VerifySatisfaction:output_type -> sysml.VerifySatisfactionResponse - 16, // 337: sysml.SysMLService.ValidateInstance:output_type -> sysml.ValidateInstanceResponse - 18, // 338: sysml.SysMLService.EvaluateCalc:output_type -> sysml.EvaluateCalcResponse - 26, // 339: sysml.SysMLService.RunAnalysis:output_type -> sysml.RunAnalysisResponse - 37, // 340: sysml.SysMLService.CheckBehavior:output_type -> sysml.CheckBehaviorResponse - 128, // 341: sysml.SysMLService.RunSweep:output_type -> sysml.RunSweepResponse - 140, // 342: sysml.SysMLService.RunRuns:output_type -> sysml.RunRunsResponse - 137, // 343: sysml.SysMLService.SelfCheck:output_type -> sysml.SelfCheckResponse - 139, // 344: sysml.SysMLService.RecordRun:output_type -> sysml.RecordRunResponse - 40, // 345: sysml.SysMLService.ListEngines:output_type -> sysml.ListEnginesResponse - 119, // 346: sysml.SysMLService.Query:output_type -> sysml.QueryResponse - 151, // 347: sysml.SysMLService.RunDocumentQuery:output_type -> sysml.RunDocumentQueryResponse - 159, // 348: sysml.SysMLService.RenderDocument:output_type -> sysml.RenderDocumentResponse - 161, // 349: sysml.SysMLService.RenderView:output_type -> sysml.RenderViewResponse - 172, // 350: sysml.SysMLService.ExportGraphs:output_type -> sysml.ExportGraphsResponse - 175, // 351: sysml.SysMLService.ImportData:output_type -> sysml.ImportDataResponse - 180, // 352: sysml.SysMLService.CompareResults:output_type -> sysml.CompareResultsResponse - 322, // [322:353] is the sub-list for method output_type - 291, // [291:322] is the sub-list for method input_type - 291, // [291:291] is the sub-list for extension type_name - 291, // [291:291] is the sub-list for extension extendee - 0, // [0:291] is the sub-list for field type_name + 147, // 91: sysml.ExecuteActionResponse.trace:type_name -> sysml.DocumentEvent + 198, // 92: sysml.ExecuteStateResponse.final_context:type_name -> sysml.ExecuteStateResponse.FinalContextEntry + 114, // 93: sysml.ExecuteStateResponse.diagnostics:type_name -> sysml.Diagnostic + 28, // 94: sysml.ExecuteStateResponse.outcomes:type_name -> sysml.Outcome + 29, // 95: sysml.ExecuteStateResponse.exploration:type_name -> sysml.ExplorationStatus + 147, // 96: sysml.ExecuteStateResponse.trace:type_name -> sysml.DocumentEvent + 199, // 97: sysml.ExecuteStateResponse.order_dependent:type_name -> sysml.ExecuteStateResponse.OrderDependentEntry + 114, // 98: sysml.ConvertResponse.diagnostics:type_name -> sysml.Diagnostic + 62, // 99: sysml.ConvertResponse.library_references:type_name -> sysml.LibraryReference + 65, // 100: sysml.MigrateResponse.report:type_name -> sysml.MigrationReport + 67, // 101: sysml.MigrateResponse.files:type_name -> sysml.MigrationFile + 66, // 102: sysml.MigrationReport.entries:type_name -> sysml.MigrationEntry + 69, // 103: sysml.ApplyEditsRequest.operations:type_name -> sysml.EditOperation + 86, // 104: sysml.EditOperation.set_value:type_name -> sysml.SetValueEdit + 87, // 105: sysml.EditOperation.rename:type_name -> sysml.RenameEdit + 70, // 106: sysml.EditOperation.add_member:type_name -> sysml.AddMemberEdit + 84, // 107: sysml.EditOperation.delete:type_name -> sysml.DeleteEdit + 85, // 108: sysml.EditOperation.move:type_name -> sysml.MoveEdit + 83, // 109: sysml.EditOperation.add_connection:type_name -> sysml.AddConnectionEdit + 71, // 110: sysml.EditOperation.add_satisfy:type_name -> sysml.AddSatisfyEdit + 72, // 111: sysml.EditOperation.add_requirement_constraint:type_name -> sysml.AddRequirementConstraintEdit + 73, // 112: sysml.EditOperation.add_transition:type_name -> sysml.AddTransitionEdit + 78, // 113: sysml.EditOperation.add_import:type_name -> sysml.AddImportEdit + 79, // 114: sysml.EditOperation.add_documentation:type_name -> sysml.AddDocumentationEdit + 74, // 115: sysml.EditOperation.add_verify:type_name -> sysml.AddVerifyEdit + 76, // 116: sysml.EditOperation.add_metadata:type_name -> sysml.AddMetadataEdit + 82, // 117: sysml.EditOperation.add_sequence:type_name -> sysml.AddSequenceEdit + 77, // 118: sysml.EditOperation.add_metadata_prefix:type_name -> sysml.AddMetadataPrefixEdit + 80, // 119: sysml.EditOperation.add_comment:type_name -> sysml.AddCommentEdit + 81, // 120: sysml.EditOperation.add_note:type_name -> sysml.AddNoteEdit + 75, // 121: sysml.AddMetadataEdit.values:type_name -> sysml.MetadataFeatureValue + 82, // 122: sysml.AddSequenceEdit.body:type_name -> sysml.AddSequenceEdit + 82, // 123: sysml.AddSequenceEdit.else_body:type_name -> sysml.AddSequenceEdit + 91, // 124: sysml.ApplyEditsResponse.applied:type_name -> sysml.AppliedEdit + 1, // 125: sysml.ApplyEditsResponse.failure:type_name -> sysml.EditFailure + 114, // 126: sysml.ApplyEditsResponse.diagnostics:type_name -> sysml.Diagnostic + 89, // 127: sysml.ApplyEditsResponse.documents:type_name -> sysml.EditedDocument + 90, // 128: sysml.ApplyEditsResponse.referrers:type_name -> sysml.Referrer + 200, // 129: sysml.SymbolInfo.metadata:type_name -> sysml.SymbolInfo.MetadataEntry + 96, // 130: sysml.SymbolInfo.attributes:type_name -> sysml.AttributeInfo + 94, // 131: sysml.SymbolInfo.type_info:type_name -> sysml.TypeInfo + 95, // 132: sysml.SymbolInfo.multiplicity:type_name -> sysml.MultiplicityInfo + 93, // 133: sysml.SymbolInfo.specializations:type_name -> sysml.Specialization + 97, // 134: sysml.AttributeInfo.value:type_name -> sysml.Value + 109, // 135: sysml.Value.sequence:type_name -> sysml.ValueSequence + 110, // 136: sysml.Value.quantity:type_name -> sysml.Quantity + 108, // 137: sysml.Value.enum_literal:type_name -> sysml.EnumLiteral + 107, // 138: sysml.Value.complex:type_name -> sysml.Complex + 104, // 139: sysml.Value.array:type_name -> sysml.Array + 105, // 140: sysml.Value.vector:type_name -> sysml.Vector + 106, // 141: sysml.Value.vector_quantity:type_name -> sysml.VectorQuantity + 111, // 142: sysml.Value.measurement_ref:type_name -> sysml.MeasurementRef + 101, // 143: sysml.Value.function:type_name -> sysml.Function + 102, // 144: sysml.Value.set:type_name -> sysml.ValueSet + 103, // 145: sysml.Value.tensor_quantity:type_name -> sysml.TensorQuantity + 99, // 146: sysml.Value.metaobject:type_name -> sysml.Metaobject + 100, // 147: sysml.Value.undetermined:type_name -> sysml.Undetermined + 98, // 148: sysml.Value.rational_value:type_name -> sysml.Rational + 95, // 149: sysml.Undetermined.count:type_name -> sysml.MultiplicityInfo + 97, // 150: sysml.ValueSet.elements:type_name -> sysml.Value + 110, // 151: sysml.TensorQuantity.components:type_name -> sysml.Quantity + 97, // 152: sysml.Array.elements:type_name -> sysml.Value + 97, // 153: sysml.Vector.components:type_name -> sysml.Value + 110, // 154: sysml.VectorQuantity.components:type_name -> sysml.Quantity + 97, // 155: sysml.EnumLiteral.value:type_name -> sysml.Value + 97, // 156: sysml.ValueSequence.elements:type_name -> sysml.Value + 98, // 157: sysml.Quantity.rational_magnitude:type_name -> sysml.Rational + 112, // 158: sysml.Quantity.unit_term:type_name -> sysml.UnitTerm + 112, // 159: sysml.MeasurementRef.unit_term:type_name -> sysml.UnitTerm + 113, // 160: sysml.UnitTerm.factors:type_name -> sysml.UnitFactor + 115, // 161: sysml.Diagnostic.span:type_name -> sysml.Span + 120, // 162: sysml.QueryRequest.query:type_name -> sysml.Query + 124, // 163: sysml.QueryResponse.elements:type_name -> sysml.QueryResultElement + 121, // 164: sysml.Query.where:type_name -> sysml.Constraint + 122, // 165: sysml.Constraint.primitive:type_name -> sysml.PrimitiveConstraint + 123, // 166: sysml.Constraint.composite:type_name -> sysml.CompositeConstraint + 2, // 167: sysml.PrimitiveConstraint.operator:type_name -> sysml.PrimitiveOperator + 3, // 168: sysml.CompositeConstraint.operator:type_name -> sysml.CompositeOperator + 121, // 169: sysml.CompositeConstraint.constraint:type_name -> sysml.Constraint + 201, // 170: sysml.QueryResultElement.properties:type_name -> sysml.QueryResultElement.PropertiesEntry + 97, // 171: sysml.SweepRange.start:type_name -> sysml.Value + 97, // 172: sysml.SweepRange.end:type_name -> sysml.Value + 97, // 173: sysml.SweepRange.step:type_name -> sysml.Value + 97, // 174: sysml.RunSweepRequest.arguments:type_name -> sysml.Value + 202, // 175: sysml.RunSweepRequest.named_arguments:type_name -> sysml.RunSweepRequest.NamedArgumentsEntry + 125, // 176: sysml.RunSweepRequest.ranges:type_name -> sysml.SweepRange + 19, // 177: sysml.SweepRow.inputs:type_name -> sysml.CalcOutput + 19, // 178: sysml.SweepRow.outputs:type_name -> sysml.CalcOutput + 4, // 179: sysml.SweepRow.verdicts:type_name -> sysml.Verdict + 0, // 180: sysml.SweepRow.failure_reason:type_name -> sysml.FailureReason + 20, // 181: sysml.SweepRow.evaluations:type_name -> sysml.CaseEvaluation + 127, // 182: sysml.RunSweepResponse.rows:type_name -> sysml.SweepRow + 114, // 183: sysml.RunSweepResponse.diagnostics:type_name -> sysml.Diagnostic + 0, // 184: sysml.RunSweepResponse.failure_reason:type_name -> sysml.FailureReason + 52, // 185: sysml.RunSweepResponse.instances:type_name -> sysml.Instance + 7, // 186: sysml.RunSweepResponse.bounds:type_name -> sysml.Bound + 203, // 187: sysml.RunRunsRequest.inputs:type_name -> sysml.RunRunsRequest.InputsEntry + 97, // 188: sysml.RunRunsRequest.arguments:type_name -> sysml.Value + 204, // 189: sysml.RunRunsRequest.named_arguments:type_name -> sysml.RunRunsRequest.NamedArgumentsEntry + 97, // 190: sysml.RunDistribution.min:type_name -> sysml.Value + 97, // 191: sysml.RunDistribution.max:type_name -> sysml.Value + 97, // 192: sysml.RunDistribution.mean:type_name -> sysml.Value + 131, // 193: sysml.RunDistribution.percentiles:type_name -> sysml.RunPercentile + 132, // 194: sysml.RunDistribution.histogram:type_name -> sysml.RunHistogramBin + 133, // 195: sysml.RunDistribution.values:type_name -> sysml.RunCountedValue + 97, // 196: sysml.RunPercentile.value:type_name -> sysml.Value + 97, // 197: sysml.RunHistogramBin.low:type_name -> sysml.Value + 97, // 198: sysml.RunHistogramBin.high:type_name -> sysml.Value + 97, // 199: sysml.RunCountedValue.value:type_name -> sysml.Value + 135, // 200: sysml.SelfCheckResponse.findings:type_name -> sysml.SelfCheckFinding + 136, // 201: sysml.SelfCheckResponse.applications:type_name -> sysml.SelfCheckApplication + 114, // 202: sysml.SelfCheckResponse.diagnostics:type_name -> sysml.Diagnostic + 97, // 203: sysml.RecordRunRequest.arguments:type_name -> sysml.Value + 205, // 204: sysml.RecordRunRequest.named_arguments:type_name -> sysml.RecordRunRequest.NamedArgumentsEntry + 125, // 205: sysml.RecordRunRequest.ranges:type_name -> sysml.SweepRange + 26, // 206: sysml.RecordRunResponse.run:type_name -> sysml.RunAnalysisResponse + 128, // 207: sysml.RecordRunResponse.sweep:type_name -> sysml.RunSweepResponse + 140, // 208: sysml.RecordRunResponse.sample:type_name -> sysml.RunRunsResponse + 89, // 209: sysml.RecordRunResponse.documents:type_name -> sysml.EditedDocument + 0, // 210: sysml.RecordRunResponse.failure_reason:type_name -> sysml.FailureReason + 114, // 211: sysml.RecordRunResponse.diagnostics:type_name -> sysml.Diagnostic + 127, // 212: sysml.RunRunsResponse.rows:type_name -> sysml.SweepRow + 130, // 213: sysml.RunRunsResponse.distributions:type_name -> sysml.RunDistribution + 19, // 214: sysml.RunRunsResponse.outputs:type_name -> sysml.CalcOutput + 4, // 215: sysml.RunRunsResponse.verdicts:type_name -> sysml.Verdict + 114, // 216: sysml.RunRunsResponse.diagnostics:type_name -> sysml.Diagnostic + 0, // 217: sysml.RunRunsResponse.failure_reason:type_name -> sysml.FailureReason + 52, // 218: sysml.RunRunsResponse.instances:type_name -> sysml.Instance + 7, // 219: sysml.RunRunsResponse.bounds:type_name -> sysml.Bound + 142, // 220: sysml.RunDocumentQueryRequest.bindings:type_name -> sysml.DocumentQueryBinding + 143, // 221: sysml.DocumentQueryBinding.values:type_name -> sysml.DocumentValue + 110, // 222: sysml.DocumentValue.quantity:type_name -> sysml.Quantity + 145, // 223: sysml.DocumentValue.verdict:type_name -> sysml.DocumentVerdict + 144, // 224: sysml.DocumentValue.object:type_name -> sysml.DocumentObject + 146, // 225: sysml.DocumentValue.state:type_name -> sysml.DocumentState + 147, // 226: sysml.DocumentValue.event:type_name -> sysml.DocumentEvent + 98, // 227: sysml.DocumentValue.rational_value:type_name -> sysml.Rational + 143, // 228: sysml.DocumentObject.element:type_name -> sysml.DocumentValue + 143, // 229: sysml.DocumentVerdict.assertion:type_name -> sysml.DocumentValue + 144, // 230: sysml.DocumentState.object:type_name -> sysml.DocumentObject + 143, // 231: sysml.DocumentState.state:type_name -> sysml.DocumentValue + 143, // 232: sysml.DocumentEvent.time:type_name -> sysml.DocumentValue + 144, // 233: sysml.DocumentEvent.object:type_name -> sysml.DocumentObject + 144, // 234: sysml.DocumentEvent.target:type_name -> sysml.DocumentObject + 97, // 235: sysml.DocumentEvent.value:type_name -> sysml.Value + 143, // 236: sysml.DocumentQueryCell.values:type_name -> sysml.DocumentValue + 143, // 237: sysml.DocumentQueryRow.element:type_name -> sysml.DocumentValue + 149, // 238: sysml.DocumentQueryRow.cells:type_name -> sysml.DocumentQueryCell + 148, // 239: sysml.RunDocumentQueryResponse.columns:type_name -> sysml.DocumentQueryColumn + 150, // 240: sysml.RunDocumentQueryResponse.rows:type_name -> sysml.DocumentQueryRow + 153, // 241: sysml.QueryOutcome.failures:type_name -> sysml.QueryFailure + 157, // 242: sysml.QueryOutcome.findings:type_name -> sysml.QueryFinding + 153, // 243: sysml.QueryOutcome.path_failures:type_name -> sysml.QueryFailure + 154, // 244: sysml.QueryFailure.frontier:type_name -> sysml.QueryFrontier + 155, // 245: sysml.QueryFrontier.members:type_name -> sysml.QueryFrontierMember + 156, // 246: sysml.QueryFrontier.features:type_name -> sysml.QueryFrontierFeature + 162, // 247: sysml.RenderViewResponse.nodes:type_name -> sysml.RenderNode + 164, // 248: sysml.RenderViewResponse.edges:type_name -> sysml.RenderEdge + 169, // 249: sysml.RenderViewResponse.rows:type_name -> sysml.RenderRow + 166, // 250: sysml.RenderViewResponse.canvas:type_name -> sysml.RenderCanvas + 170, // 251: sysml.RenderViewResponse.notes:type_name -> sysml.RenderNote + 163, // 252: sysml.RenderNode.ports:type_name -> sysml.RenderPort + 115, // 253: sysml.RenderNode.origin:type_name -> sysml.Span + 165, // 254: sysml.RenderNode.geometry:type_name -> sysml.RenderGeometry + 167, // 255: sysml.RenderNode.style:type_name -> sysml.RenderStyle + 115, // 256: sysml.RenderEdge.origin:type_name -> sysml.Span + 168, // 257: sysml.RenderEdge.route:type_name -> sysml.RenderPoint + 167, // 258: sysml.RenderEdge.style:type_name -> sysml.RenderStyle + 115, // 259: sysml.RenderRow.origin:type_name -> sysml.Span + 115, // 260: sysml.RenderNote.origin:type_name -> sysml.Span + 174, // 261: sysml.ImportDataRequest.imports:type_name -> sysml.DataImport + 176, // 262: sysml.ImportDataResponse.files:type_name -> sysml.ImportedFile + 89, // 263: sysml.ImportDataResponse.documents:type_name -> sysml.EditedDocument + 114, // 264: sysml.ImportDataResponse.diagnostics:type_name -> sysml.Diagnostic + 177, // 265: sysml.ImportedFile.assignments:type_name -> sysml.ImportedValue + 179, // 266: sysml.CompareResultsRequest.observe:type_name -> sysml.ObservablePair + 181, // 267: sysml.CompareResultsResponse.configurations:type_name -> sysml.ConfigurationComparison + 114, // 268: sysml.CompareResultsResponse.diagnostics:type_name -> sysml.Diagnostic + 0, // 269: sysml.CompareResultsResponse.failure_reason:type_name -> sysml.FailureReason + 7, // 270: sysml.CompareResultsResponse.bounds:type_name -> sysml.Bound + 127, // 271: sysml.ConfigurationComparison.rows:type_name -> sysml.SweepRow + 52, // 272: sysml.ConfigurationComparison.instances:type_name -> sysml.Instance + 182, // 273: sysml.ConfigurationComparison.observables:type_name -> sysml.ObservableComparison + 183, // 274: sysml.ObservableComparison.tool:type_name -> sysml.ComparedDistribution + 183, // 275: sysml.ObservableComparison.run:type_name -> sysml.ComparedDistribution + 184, // 276: sysml.ObservableComparison.difference:type_name -> sysml.StatisticDifference + 185, // 277: sysml.ObservableComparison.declared:type_name -> sysml.CaseStatistics + 186, // 278: sysml.CaseStatistics.rows:type_name -> sysml.CaseStatistic + 97, // 279: sysml.VerifyConstraintRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 97, // 280: sysml.VerifyRequirementRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 97, // 281: sysml.RunAnalysisRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 97, // 282: sysml.Outcome.OutputsEntry.value:type_name -> sysml.Value + 97, // 283: sysml.CheckBehaviorRequest.InputsEntry.value:type_name -> sysml.Value + 53, // 284: sysml.Instance.FeatureValuesEntry.value:type_name -> sysml.FeatureValue + 97, // 285: sysml.ExecuteActionRequest.InputsEntry.value:type_name -> sysml.Value + 97, // 286: sysml.ExecuteActionResponse.OutputsEntry.value:type_name -> sysml.Value + 97, // 287: sysml.ExecuteActionResponse.PerformerAttributesEntry.value:type_name -> sysml.Value + 97, // 288: sysml.ExecuteStateResponse.FinalContextEntry.value:type_name -> sysml.Value + 97, // 289: sysml.RunSweepRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 97, // 290: sysml.RunRunsRequest.InputsEntry.value:type_name -> sysml.Value + 97, // 291: sysml.RunRunsRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 97, // 292: sysml.RecordRunRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 116, // 293: sysml.SysMLService.GetServerInfo:input_type -> sysml.ServerInfoRequest + 41, // 294: sysml.SysMLService.ParseFile:input_type -> sysml.ParseFileRequest + 43, // 295: sysml.SysMLService.ParseSources:input_type -> sysml.ParseSourcesRequest + 46, // 296: sysml.SysMLService.GetSymbol:input_type -> sysml.GetSymbolRequest + 48, // 297: sysml.SysMLService.GetDiagnostics:input_type -> sysml.DiagnosticsRequest + 50, // 298: sysml.SysMLService.Evaluate:input_type -> sysml.EvaluateRequest + 54, // 299: sysml.SysMLService.Instantiate:input_type -> sysml.InstantiateRequest + 56, // 300: sysml.SysMLService.ExecuteAction:input_type -> sysml.ExecuteActionRequest + 58, // 301: sysml.SysMLService.ExecuteState:input_type -> sysml.ExecuteStateRequest + 60, // 302: sysml.SysMLService.Convert:input_type -> sysml.ConvertRequest + 63, // 303: sysml.SysMLService.Migrate:input_type -> sysml.MigrateRequest + 68, // 304: sysml.SysMLService.ApplyEdits:input_type -> sysml.ApplyEditsRequest + 8, // 305: sysml.SysMLService.VerifyConstraint:input_type -> sysml.VerifyConstraintRequest + 10, // 306: sysml.SysMLService.VerifyRequirement:input_type -> sysml.VerifyRequirementRequest + 13, // 307: sysml.SysMLService.VerifySatisfaction:input_type -> sysml.VerifySatisfactionRequest + 15, // 308: sysml.SysMLService.ValidateInstance:input_type -> sysml.ValidateInstanceRequest + 17, // 309: sysml.SysMLService.EvaluateCalc:input_type -> sysml.EvaluateCalcRequest + 21, // 310: sysml.SysMLService.RunAnalysis:input_type -> sysml.RunAnalysisRequest + 30, // 311: sysml.SysMLService.CheckBehavior:input_type -> sysml.CheckBehaviorRequest + 126, // 312: sysml.SysMLService.RunSweep:input_type -> sysml.RunSweepRequest + 129, // 313: sysml.SysMLService.RunRuns:input_type -> sysml.RunRunsRequest + 134, // 314: sysml.SysMLService.SelfCheck:input_type -> sysml.SelfCheckRequest + 138, // 315: sysml.SysMLService.RecordRun:input_type -> sysml.RecordRunRequest + 38, // 316: sysml.SysMLService.ListEngines:input_type -> sysml.ListEnginesRequest + 118, // 317: sysml.SysMLService.Query:input_type -> sysml.QueryRequest + 141, // 318: sysml.SysMLService.RunDocumentQuery:input_type -> sysml.RunDocumentQueryRequest + 158, // 319: sysml.SysMLService.RenderDocument:input_type -> sysml.RenderDocumentRequest + 160, // 320: sysml.SysMLService.RenderView:input_type -> sysml.RenderViewRequest + 171, // 321: sysml.SysMLService.ExportGraphs:input_type -> sysml.ExportGraphsRequest + 173, // 322: sysml.SysMLService.ImportData:input_type -> sysml.ImportDataRequest + 178, // 323: sysml.SysMLService.CompareResults:input_type -> sysml.CompareResultsRequest + 117, // 324: sysml.SysMLService.GetServerInfo:output_type -> sysml.ServerInfoResponse + 45, // 325: sysml.SysMLService.ParseFile:output_type -> sysml.ParseFileResponse + 44, // 326: sysml.SysMLService.ParseSources:output_type -> sysml.ParseSourcesResponse + 47, // 327: sysml.SysMLService.GetSymbol:output_type -> sysml.SymbolResponse + 49, // 328: sysml.SysMLService.GetDiagnostics:output_type -> sysml.DiagnosticsResponse + 51, // 329: sysml.SysMLService.Evaluate:output_type -> sysml.EvaluateResponse + 55, // 330: sysml.SysMLService.Instantiate:output_type -> sysml.InstantiateResponse + 57, // 331: sysml.SysMLService.ExecuteAction:output_type -> sysml.ExecuteActionResponse + 59, // 332: sysml.SysMLService.ExecuteState:output_type -> sysml.ExecuteStateResponse + 61, // 333: sysml.SysMLService.Convert:output_type -> sysml.ConvertResponse + 64, // 334: sysml.SysMLService.Migrate:output_type -> sysml.MigrateResponse + 88, // 335: sysml.SysMLService.ApplyEdits:output_type -> sysml.ApplyEditsResponse + 9, // 336: sysml.SysMLService.VerifyConstraint:output_type -> sysml.VerifyConstraintResponse + 12, // 337: sysml.SysMLService.VerifyRequirement:output_type -> sysml.VerifyRequirementResponse + 14, // 338: sysml.SysMLService.VerifySatisfaction:output_type -> sysml.VerifySatisfactionResponse + 16, // 339: sysml.SysMLService.ValidateInstance:output_type -> sysml.ValidateInstanceResponse + 18, // 340: sysml.SysMLService.EvaluateCalc:output_type -> sysml.EvaluateCalcResponse + 26, // 341: sysml.SysMLService.RunAnalysis:output_type -> sysml.RunAnalysisResponse + 37, // 342: sysml.SysMLService.CheckBehavior:output_type -> sysml.CheckBehaviorResponse + 128, // 343: sysml.SysMLService.RunSweep:output_type -> sysml.RunSweepResponse + 140, // 344: sysml.SysMLService.RunRuns:output_type -> sysml.RunRunsResponse + 137, // 345: sysml.SysMLService.SelfCheck:output_type -> sysml.SelfCheckResponse + 139, // 346: sysml.SysMLService.RecordRun:output_type -> sysml.RecordRunResponse + 40, // 347: sysml.SysMLService.ListEngines:output_type -> sysml.ListEnginesResponse + 119, // 348: sysml.SysMLService.Query:output_type -> sysml.QueryResponse + 151, // 349: sysml.SysMLService.RunDocumentQuery:output_type -> sysml.RunDocumentQueryResponse + 159, // 350: sysml.SysMLService.RenderDocument:output_type -> sysml.RenderDocumentResponse + 161, // 351: sysml.SysMLService.RenderView:output_type -> sysml.RenderViewResponse + 172, // 352: sysml.SysMLService.ExportGraphs:output_type -> sysml.ExportGraphsResponse + 175, // 353: sysml.SysMLService.ImportData:output_type -> sysml.ImportDataResponse + 180, // 354: sysml.SysMLService.CompareResults:output_type -> sysml.CompareResultsResponse + 324, // [324:355] is the sub-list for method output_type + 293, // [293:324] is the sub-list for method input_type + 293, // [293:293] is the sub-list for extension type_name + 293, // [293:293] is the sub-list for extension extendee + 0, // [0:293] is the sub-list for field type_name } func init() { file_sysml_proto_init() } diff --git a/api/proto/sysml.proto b/api/proto/sysml.proto index 295cf957a1..8cdc5b2b0d 100644 --- a/api/proto/sysml.proto +++ b/api/proto/sysml.proto @@ -1118,6 +1118,23 @@ message ExecuteActionRequest { // default, is a continuous clock; a negative or non-finite step is // INVALID_ARGUMENT. double clock_step = 9; + // Ask for the run's trace in ExecuteActionResponse.trace. Advertised as the + // "action_trace" capability; a service withholding it refuses true with + // UNIMPLEMENTED, as does an explore schedule with INVALID_ARGUMENT. + bool trace = 10; + // Signals or items to post to the performing object, in this order, as the + // REPL's `%send` does: the run goes until it completes or every token waits, + // the next event is then posted to the object's queue and the run goes on, + // an accept node waiting for it taking it on the next step. An event of a + // type no accept node of the performance names is refused, with the accepts + // still waiting. The events exhausted, the run goes on to completion (or for + // `advance`); a token still waiting at the end is an accept deadlock, + // reported in `error` with the message it waits for. Each names a signal or + // item definition, qualified or as the action's namespace sees it; a name no + // definition answers to is matched by name alone, as ExecuteState's events + // are. Posted to the object performer_symbol_id names, as `%send` posts to + // one: INVALID_ARGUMENT without it. + repeated string events = 11; } // ExecuteActionResponse contains action execution results @@ -1144,6 +1161,13 @@ message ExecuteActionResponse { // output nothing order-dependent wrote is absent. Populated under the // "order_dependence" capability; empty under an explore schedule. map order_dependent = 8; + // The run's trace in the order the run made it, when the request asked for + // it: the token steps, waits, accepts, sends, decisions, assignments and + // completion of the action, each a DocumentEvent (see its `kind`), also on a + // run that failed, up to the failure. Empty under an explore schedule. + repeated DocumentEvent trace = 9; + // How many of the oldest records the service's held-events bound discarded. + int32 trace_dropped = 10; } // ExecuteStateRequest requests state machine execution @@ -2852,7 +2876,12 @@ message DocumentState { // DocumentEvent is one row an `Events` query answered: one record of the // session's trace, in the order the run made it. message DocumentEvent { - // "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". + // "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or + // "terminate" for a state machine's records; an action's run adds "step" (a + // token arriving at a node), "wait" (a token parking at an accept node), + // "assign" (a feature written), "decide" (a decision node resolved) and + // "complete" (the action's performance completed); its "accept" is the accept + // node taking a message and its "send" a message posted. string kind = 1; // The clock's instant when the record was made: a quantity in the clock's // unit when the library reduces one, else a bare real of clock units. @@ -2863,23 +2892,37 @@ message DocumentEvent { // The behavior the record is about, by the name the object exhibits it // under, else its declared name; empty for the run's own records. string machine = 4; - // The state entered, exited or stepped by an entry, exit or do record. + // The state entered, exited or stepped by an entry, exit or do record; the + // action node a wait, assign, decide or action accept record is at. string state = 5; - // A fired transition's source and target states. + // A fired transition's source and target states; a step's source node (empty + // where the token's flow starts) and the node it arrived at; a decide's + // branch taken, as `taken` names it. string from = 6; string to = 7; // The object a send was addressed to; unset for every other kind and a // send addressed to no object. DocumentObject target = 8; - // The signal or event accepted or sent, or the trigger a transition fired on. + // The signal or event accepted or sent, the trigger a transition fired on, or + // the message type or trigger a wait record waits for. string event = 9; // An accept's payload, one `name = value` entry per parameter in name order. repeated string payload = 10; - // A choice's alternatives, in the order they were offered, and the one taken. + // A choice's alternatives, in the order they were offered, and the one taken; + // a decide's branches as `->`, and the one taken. repeated string alternatives = 11; string taken = 12; // The line the trace prints for the record. string text = 13; + // The action token a step, wait, assign, decide or action accept record is + // about, and the executor step (1-based) that made the record; 0 for a record + // of neither (a state machine's, a send from outside the model). + int64 token = 14; + int32 step = 15; + // The feature an assign record wrote and the value it holds since, as the + // run's outputs carry values. + string feature = 16; + Value value = 17; } // DocumentQueryColumn is one projected property, in projection order. diff --git a/changes/unreleased/execute-action-trace-events.added.md b/changes/unreleased/execute-action-trace-events.added.md new file mode 100644 index 0000000000..6bb577e3bd --- /dev/null +++ b/changes/unreleased/execute-action-trace-events.added.md @@ -0,0 +1 @@ +- `ExecuteAction` takes `trace` and `events`: the run's trace comes back as `DocumentEvent` records of each token step, wait, accept, send, decision, assignment and the completion (capability `action_trace`, in the wasm module too), and the events are posted to the performer in turn as the run waits, as the REPL's `%send` does; every client passes both options. diff --git a/internal/doc/queryexec/event.go b/internal/doc/queryexec/event.go index 00e787ba57..f916ce9b7b 100644 --- a/internal/doc/queryexec/event.go +++ b/internal/doc/queryexec/event.go @@ -25,9 +25,26 @@ type Event struct { } // Kind names the record's kind as its `kind` property does: `accept`, `send`, -// `transition`, `entry`, `exit`, `do`, `choice`, `guard`, `terminate`. +// `transition`, `entry`, `exit`, `do`, `choice`, `guard`, `terminate`, and for +// an action's run `step`, `wait`, `assign`, `decide`, `complete`. func (ev Event) Kind() string { return ev.record.Kind.String() } +// Token is the action token a step, wait, assign, decide or action accept record +// is about, and Step the executor step that made it; both 0 for any other record. +func (ev Event) Token() int64 { return ev.record.Token } + +// Step is the executor step the record was made in, 0 for a record of none. +func (ev Event) Step() int { return ev.record.Step } + +// Assigned is the feature an assign record wrote and the value it holds since; +// ok is false for any other record. +func (ev Event) Assigned() (feature string, value runtime.Value, ok bool) { + if ev.record.Kind != runtime.TraceAssign { + return "", runtime.Value{}, false + } + return ev.record.Feature, ev.record.Value, true +} + // At is the clock instant the record was made at, in clock units. func (ev Event) At() float64 { return ev.at } @@ -52,16 +69,23 @@ func (ev Event) Machine() string { return ev.machine } // name order, in the runtime's notation. func (ev Event) Payload() []string { return ev.record.PayloadTexts() } -// Alternatives are a choice's alternatives as offered, nil for any other record. +// Alternatives are a choice's alternatives as offered, or a decide's branches, +// nil for any other record. func (ev Event) Alternatives() []string { + if ev.record.Kind == runtime.TraceDecide { + return append([]string(nil), ev.record.Alternatives...) + } if choice, ok := ev.record.Note.(runtime.ChoicePoint); ok { return append([]string(nil), choice.Alternatives...) } return nil } -// Taken is the alternative a choice took, "" for any other record. +// Taken is the alternative a choice took or the branch a decide took, "" for any other record. func (ev Event) Taken() string { + if ev.record.Kind == runtime.TraceDecide { + return ev.record.To + } choice, ok := ev.record.Note.(runtime.ChoicePoint) if !ok || choice.Taken < 0 || choice.Taken >= len(choice.Alternatives) { return "" diff --git a/internal/doc/queryexec/events.go b/internal/doc/queryexec/events.go index 47eb52da21..bf77f256cf 100644 --- a/internal/doc/queryexec/events.go +++ b/internal/doc/queryexec/events.go @@ -41,6 +41,11 @@ var eventKinds = map[string]runtime.TraceKind{ "choice": runtime.TraceChoice, "guard": runtime.TraceGuard, "terminate": runtime.TraceTerminate, + "step": runtime.TraceStep, + "wait": runtime.TraceWait, + "assign": runtime.TraceAssign, + "decide": runtime.TraceDecide, + "complete": runtime.TraceComplete, } // EventsFromTrace converts documented trace records into rows in run order. @@ -357,6 +362,12 @@ func eventName(record runtime.TraceRecord) string { return record.To case runtime.TraceEntry, runtime.TraceExit, runtime.TraceDo: return record.State + case runtime.TraceStep, runtime.TraceDecide: + return record.To + case runtime.TraceWait: + return record.Event + case runtime.TraceAssign: + return record.Feature case runtime.TraceChoice: if choice, ok := record.Note.(runtime.ChoicePoint); ok { return choice.Kind.String() diff --git a/internal/exec/runtime/action_choice.go b/internal/exec/runtime/action_choice.go index a133d14f88..ba02cf1542 100644 --- a/internal/exec/runtime/action_choice.go +++ b/internal/exec/runtime/action_choice.go @@ -73,18 +73,30 @@ func (e *performances) noteGuard(g UnevaluableGuard) { e.ctx.noteFrom(g, e.self, e.behavior) } -// beginTokenStep marks the token whose step is running, returning what to -// restore once its step is over. -func (e *performances) beginTokenStep(id int64) func() { +// beginTokenStep marks the token whose step, the step-th of the executor, is +// running, returning what to restore once its step is over. +func (e *performances) beginTokenStep(id int64, step int) func() { + savedToken, savedStep := e.stepping, e.step + e.stepping, e.step = id, step ledger := e.ctx.stepWrites if ledger == nil { - return func() { - // No ledger was open, so no writer was marked and none is restored. - } + return func() { e.stepping, e.step = savedToken, savedStep } } saved := ledger.writer ledger.writer = id - return func() { ledger.writer = saved } + return func() { + e.stepping, e.step = savedToken, savedStep + ledger.writer = saved + } +} + +// recordAssign records the token whose step is running writing value to feature +// from the body of node. +func (e *performances) recordAssign(node ast.Node, feature string, value Value) { + if tr := e.ctx.trace; tr != nil { + tr.recordAssign(TraceOrigin{At: e.ctx.clock.now, Object: e.self, Behavior: e.behavior}, + e.stepping, e.step, nodeIdentifier(node), feature, value) + } } // noteFrameWrite records a write the running token made to a feature f holds. diff --git a/internal/exec/runtime/action_executor.go b/internal/exec/runtime/action_executor.go index 6d6018eeed..03f4c5c839 100644 --- a/internal/exec/runtime/action_executor.go +++ b/internal/exec/runtime/action_executor.go @@ -1745,6 +1745,9 @@ func (e *ActionExecutor) completeRoot() error { e.state = StateCompleted e.endRootPerformance() e.ctx.unregisterActionExecutor(e) + if tr := e.trace(); tr != nil { + tr.recordActionComplete(e.traceOrigin(), e.stepCount+1) + } return nil } @@ -1945,7 +1948,7 @@ func (e *ActionExecutor) stepToken(tokenIdx int) error { } } id := e.tokens[tokenIdx].ID - defer e.beginTokenStep(id)() + defer e.beginTokenStep(id, e.stepCount+1)() defer e.ctx.releaseControl(e.ctx.underControl(e.tokens[tokenIdx].controlSerials())) if err := e.stepTokenAt(tokenIdx); err != nil { return e.endTerminatedFor(id, err) @@ -2031,6 +2034,7 @@ func (e *ActionExecutor) synchronize(tokenIdx int) (int, bool) { control: control, }) e.nextTokenID++ + e.recordTokenAt(&e.tokens[len(e.tokens)-1], nil) return len(e.tokens) - 1, true } @@ -2575,6 +2579,7 @@ func (e *ActionExecutor) split(tokenIdx int, successors []lower.ActionEdge) { e.nextTokenID++ newTokens = append(newTokens, newToken) e.noteTraversal(&newToken, edge) + e.recordTokenAt(&newToken, &edge) } e.removeToken(tokenIdx) e.tokens = append(e.tokens, newTokens...) @@ -2691,6 +2696,7 @@ func (e *ActionExecutor) stepDecisionNode(tokenIdx int) error { // 2. If none holds, use unguarded edge as fallback (else branch) var unguardedEdge *lower.ActionEdge + unguardedAt := -1 var holding []int // Pass 1: Check guarded edges. Once one holds the branch is decided; the rest @@ -2703,7 +2709,7 @@ func (e *ActionExecutor) stepDecisionNode(tokenIdx int) error { continue } // No guard = remember for fallback - unguardedEdge = edge + unguardedEdge, unguardedAt = edge, i continue } @@ -2753,6 +2759,7 @@ func (e *ActionExecutor) stepDecisionNode(tokenIdx int) error { } } token.underControl(by, commonReach(graph, successors)) + e.recordDecide(token, successors, holding[pick]) e.move(token, successors[holding[pick]]) return nil } @@ -2761,6 +2768,7 @@ func (e *ActionExecutor) stepDecisionNode(tokenIdx int) error { // fallback stands on what they read as a taken branch would. if unguardedEdge != nil { token.underControl(e.guardsStanding(graph, successors, len(successors)-1), commonReach(graph, successors)) + e.recordDecide(token, successors, unguardedAt) e.move(token, *unguardedEdge) return nil } @@ -2929,6 +2937,7 @@ func (e *ActionExecutor) awaitTrigger(token *Token, accept lower.Accept) (bool, Trigger: triggerDescription(accept.Trigger), Since: e.stepCount + 1, } + e.recordTokenWait(token, token.Wait.Trigger) } return false, nil } @@ -2960,12 +2969,13 @@ func (e *ActionExecutor) awaitSignal(token *Token, accept lower.Accept, usage *a // step now in progress is the next one. Since: e.stepCount + 1, } + e.recordTokenWait(token, want) } return nil, false, nil } token.Wait = nil if tr := e.trace(); tr != nil { - tr.RecordAccept(TraceOrigin{At: e.ctx.clock.now, Object: e.self, Behavior: e.action}, + tr.recordActionAccept(e.traceOrigin(), token.ID, e.stepCount+1, nodeIdentifier(token.Location), msg.Serial, acceptedEventName(msg), msg.Payload) } if accepting, err := e.materializeOccurrence(); err != nil { @@ -3094,6 +3104,9 @@ func (e *ActionExecutor) triggerHolds(token *Token, accept lower.Accept) (bool, if due <= e.ctx.clock.now { return true, nil } + if token.Wait == nil { + e.recordTokenWait(token, triggerDescription(t)) + } token.Wait = &AcceptWait{ ParamName: accept.ParamName, Trigger: triggerDescription(t), @@ -3549,6 +3562,7 @@ func (e *ActionExecutor) noteTraversal(token *Token, edge lower.ActionEdge) { func (e *ActionExecutor) move(token *Token, edge lower.ActionEdge) { token.travel(edge, e.sweep) e.noteTraversal(token, edge) + e.recordTokenAt(token, &edge) } // State returns current execution state. @@ -3730,6 +3744,45 @@ func (e *ActionExecutor) trace() *TraceRecorder { return e.ctx.trace } +// traceOrigin is the origin the executor's records carry: the clock now, the +// performer and the action performed. +func (e *ActionExecutor) traceOrigin() TraceOrigin { + return TraceOrigin{At: e.ctx.clock.now, Object: e.self, Behavior: e.action} +} + +// recordTokenAt records token arriving where it is, over edge where it followed one. +func (e *ActionExecutor) recordTokenAt(token *Token, edge *lower.ActionEdge) { + tr := e.trace() + if tr == nil { + return + } + from := "" + if edge != nil { + from = nodeIdentifier(edge.Source) + } + tr.recordTokenStep(e.traceOrigin(), token.ID, e.stepCount+1, from, nodeIdentifier(token.Location)) +} + +// recordTokenWait records token parking where it is for awaited. +func (e *ActionExecutor) recordTokenWait(token *Token, awaited string) { + if tr := e.trace(); tr != nil { + tr.recordTokenWait(e.traceOrigin(), token.ID, e.stepCount+1, nodeIdentifier(token.Location), awaited) + } +} + +// recordDecide records token resolving the decision among successors, taking the one at pick. +func (e *ActionExecutor) recordDecide(token *Token, successors []lower.ActionEdge, pick int) { + tr := e.trace() + if tr == nil { + return + } + alternatives := make([]string, len(successors)) + for i := range successors { + alternatives[i] = branchName(successors, i) + } + tr.recordDecide(e.traceOrigin(), token.ID, e.stepCount+1, nodeIdentifier(token.Location), alternatives, branchName(successors, pick)) +} + // SetTrace sets the trace recorder for this executor and the context it // evaluates in. func (e *ActionExecutor) SetTrace(trace *TraceRecorder) { diff --git a/internal/exec/runtime/action_frame.go b/internal/exec/runtime/action_frame.go index ac0b4469b0..702a34e8a5 100644 --- a/internal/exec/runtime/action_frame.go +++ b/internal/exec/runtime/action_frame.go @@ -30,6 +30,9 @@ type performances struct { // behavior is the action or state machine the trace names as making what // these performances send and draw; nil for a body no behavior owns. behavior *symbols.Symbol + // stepping is the token whose step is running, in the step-th executor step. + stepping int64 + step int // thisOccurrence materializes the performance occurrence `this` denotes the // first time a directly run definition denotes it; nil where none can be. thisOccurrence func() (*Instance, error) diff --git a/internal/exec/runtime/action_statements.go b/internal/exec/runtime/action_statements.go index ba5dacd266..a72a461f32 100644 --- a/internal/exec/runtime/action_statements.go +++ b/internal/exec/runtime/action_statements.go @@ -66,6 +66,10 @@ func (h *actionStmtHost) describe() string { return "action node " + ActionNodeName(h.node) } +func (h *actionStmtHost) recordAssign(feature string, value Value) { + h.exec.recordAssign(h.node, feature, value) +} + func (h *actionStmtHost) send(ec *EvalContext, s lower.Send) error { return h.exec.ctx.send(ec, h.exec.root.scope, h.perf.connections, s, h.exec.self, h.exec.behavior) } diff --git a/internal/exec/runtime/action_subflow.go b/internal/exec/runtime/action_subflow.go index 71150955f8..ba87596ed9 100644 --- a/internal/exec/runtime/action_subflow.go +++ b/internal/exec/runtime/action_subflow.go @@ -87,6 +87,7 @@ func (e *ActionExecutor) enterSubflow(tokenIdx int, perf *actionFrame) error { return e.leaveSubflow(tokenIdx) } token.Location = starts[0] + e.recordTokenAt(token, nil) e.seedTokens(perf, starts[1:], e.sweep) return nil } @@ -97,6 +98,7 @@ func (e *ActionExecutor) seedTokens(frame *actionFrame, starts []ast.Node, moved for _, start := range starts { e.tokens = append(e.tokens, Token{ID: e.nextTokenID, Location: start, frame: frame, moved: moved}) e.nextTokenID++ + e.recordTokenAt(&e.tokens[len(e.tokens)-1], nil) } } diff --git a/internal/exec/runtime/action_trace_records_test.go b/internal/exec/runtime/action_trace_records_test.go new file mode 100644 index 0000000000..314291ceb8 --- /dev/null +++ b/internal/exec/runtime/action_trace_records_test.go @@ -0,0 +1,138 @@ +package runtime + +import ( + "sort" + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/semantics" +) + +// An action's run leaves typed records of each token step, wait, accept, decision, +// assignment and its completion, none of which the printed trace shows. +func TestActionTraceRecordsFollowTheTokens(t *testing.T) { + src := ` + package test { + private import ScalarValues::*; + item def Go; + part def Craft; + part craft : Craft; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then fork split; + action land assign landed := true; + action survey; + join meet; + action finish; + then done; + succession first split then land; + succession first split then survey; + succession first land then meet; + succession first survey then meet; + succession first meet then finish; + } + }` + idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, src)) + trace := NewTraceRecorder() + ctx.SetTrace(trace) + craft, err := ctx.Instantiate(oneSymbol(t, idx, "test::craft")) + if err != nil { + t.Fatalf("instantiate: %v", err) + } + flow := oneSymbol(t, idx, "test::Flow") + exec, _, err := ctx.StartActionPerformedBy(flow, craft, map[string]Value{"budget": {Kind: ValConst, Const: semantics.IntValue(10)}}) + if err != nil { + t.Fatalf("start: %v", err) + } + go_, err := ctx.SignalMessage(oneSymbol(t, idx, "test::Go"), nil, craft) + if err != nil { + t.Fatalf("message: %v", err) + } + if err := ctx.DeliverEvents(exec, []Message{go_}); err != nil { + t.Fatalf("deliver: %v", err) + } + if err := exec.RunToCompletion(); err != nil { + t.Fatalf("run: %v", err) + } + + var got []string + for _, r := range trace.Records() { + switch r.Kind { + case TraceStep, TraceWait, TraceAccept, TraceDecide, TraceAssign, TraceComplete: + default: + continue + } + if r.Origin.Object != craft || r.Origin.Behavior != flow { + t.Errorf("%s record made by %v/%v, want craft/Flow", r.Kind, r.Origin.Object, r.Origin.Behavior) + } + if r.Kind != TraceComplete && r.Token == 0 { + t.Errorf("%s record names no token: %+v", r.Kind, r) + } + got = append(got, r.Text()) + } + // The two branches of the fork step in the order the schedule picks, so the + // records between the fork and the join are compared as a set. + head := []string{ + "step start", + "step start -> burn", + "assign remaining = 7", + "step burn -> route", + "decide route -> 1->waiting", + "step route -> waiting", + "wait Go", + "accept Go", + "step waiting -> split", + "step split -> land", + "step split -> survey", + } + branches := []string{"assign landed = true", "step land -> meet", "step survey -> meet"} + tail := []string{"step meet", "step meet -> finish", "step finish -> done", "complete"} + if len(got) != len(head)+len(branches)+len(tail) { + t.Fatalf("records:\n%s", strings.Join(got, "\n")) + } + middle := append([]string(nil), got[len(head):len(head)+len(branches)]...) + sort.Strings(middle) + sort.Strings(branches) + if strings.Join(got[:len(head)], "\n") != strings.Join(head, "\n") || + strings.Join(middle, "\n") != strings.Join(branches, "\n") || + strings.Join(got[len(got)-len(tail):], "\n") != strings.Join(tail, "\n") { + t.Fatalf("records:\n%s\nwant %v, then %v in any order, then %v", strings.Join(got, "\n"), head, branches, tail) + } + for _, line := range trace.Entries() { + for _, kind := range []string{"step start", "wait ", "assign remaining =", "decide ", "complete"} { + if strings.HasPrefix(line, kind) { + t.Errorf("printed trace shows the typed record %q", line) + } + } + } +} + +// Each new kind reads as its query name and prints no line. +func TestActionTraceKindsPrintNoLine(t *testing.T) { + for kind, name := range map[TraceKind]string{ + TraceStep: "step", TraceWait: "wait", TraceAssign: "assign", TraceDecide: "decide", TraceComplete: "complete", + } { + if kind.String() != name { + t.Errorf("%d.String() = %q, want %q", kind, kind.String(), name) + } + if line, printed := (TraceRecord{Kind: kind}).Line(); printed || line != "" { + t.Errorf("%s prints %q", name, line) + } + } + record := TraceRecord{Kind: TraceAssign, Feature: "remaining", Value: Value{Kind: ValConst, Const: semantics.IntValue(7)}} + if got := record.Text(); got != "assign remaining = 7" { + t.Errorf("assign text = %q", got) + } + record = TraceRecord{Kind: TraceDecide, State: "route", To: "1->waiting", Alternatives: []string{"1->waiting", "2->finish"}} + if got := record.Text(); got != "decide route -> 1->waiting" { + t.Errorf("decide text = %q", got) + } +} diff --git a/internal/exec/runtime/context.go b/internal/exec/runtime/context.go index 611011a090..759a3f0d8e 100644 --- a/internal/exec/runtime/context.go +++ b/internal/exec/runtime/context.go @@ -1816,6 +1816,52 @@ func (ctx *Context) ExecuteActionReportingPerformer(action *symbols.Symbol, self return outputs, (&Invocation{Actions: []*ActionExecutor{exec}}).PerformerAttributes(), nil } +// ExecuteActionWithEvents runs an action as ExecuteActionReportingPerformer does, +// posting each of events to the run in turn once every token of it waits, as the +// REPL's %send does, and running on; without events it is that call. +func (ctx *Context) ExecuteActionWithEvents(action *symbols.Symbol, self *Instance, inputs map[string]Value, events []Message) (outputs, performer map[string]Value, err error) { + if len(events) == 0 { + return ctx.ExecuteActionReportingPerformer(action, self, inputs) + } + exec, _, err := ctx.StartActionPerformedBy(action, self, inputs) + if err != nil { + return nil, nil, err + } + top := ctx.runDepth == 0 + defer ctx.beginRun()() + if err := ctx.DeliverEvents(exec, events); err != nil { + return nil, nil, err + } + if err := ctx.runPerformance(exec, top); err != nil { + return nil, nil, err + } + outputs, err = exec.ResultsWithError() + if err != nil { + return nil, nil, err + } + return outputs, (&Invocation{Actions: []*ActionExecutor{exec}}).PerformerAttributes(), nil +} + +// DeliverEvents posts each of events to exec's run in turn: the run goes until it +// completes or every token waits, the event is posted, and an accept node waiting +// for it takes it on the next step. One no waiting accept takes is an error, as +// is one the run completed before. +func (ctx *Context) DeliverEvents(exec *ActionExecutor, events []Message) error { + for _, msg := range events { + if err := exec.RunToQuiescence(); err != nil { + return fmt.Errorf("execute action: %w", err) + } + if exec.State().Ended() { + return fmt.Errorf("execute action: event %s was posted after the action completed", msg.SignalType) + } + ctx.PostMessage(msg) + if !exec.HasPendingSignal() { + return fmt.Errorf("execute action: no accept of the action waits for event %s: %s", msg.SignalType, exec.describeWaits(nil)) + } + } + return nil +} + // performAction runs action to completion, performed by self, and returns the // executor that ran it, whose root performance holds what it produced. An object // performing the action runs the performance it already runs rather than a second. diff --git a/internal/exec/runtime/statements.go b/internal/exec/runtime/statements.go index fc5f297773..6e46186d24 100644 --- a/internal/exec/runtime/statements.go +++ b/internal/exec/runtime/statements.go @@ -884,61 +884,11 @@ func (e *stmtEngine) execute(stmt lower.Statement) (stmtFlow, error) { case lower.Send: return flowNext, e.host.send(e.evalIn(s.Scope), s) case lower.Assign: - if s.Target == "" { - return flowNext, fmt.Errorf("%s: unsupported assignment target", e.host.describe()) + value, err := e.assign(s) + if err == nil { + e.noteAssign(s.Target, value) } - if err := e.ctx.checkAssignable(e.host.describe, s); err != nil { - return flowNext, err - } - value, err := e.evalIn(s.Scope).Eval(s.Value) - if err != nil { - return flowNext, fmt.Errorf("eval assignment RHS: %w", err) - } - // A chained target writes the object its chain reaches, whatever the body - // declares of the name it starts from, so no host binding applies to it. - if s.Chain != nil { - return flowNext, e.host.assignChain(e.evalIn(s.Scope), s, value) - } - // A qualified target names the feature on the object its qualifier denotes: - // the performance running that def (`Probe::count` is the Probe run's own - // count), else the performing object (`Scope::azimuth` on a Scope), as a - // name shadowed by a nearer declaration still reaches it. - if s.Qualified { - ec := e.evalIn(s.Scope) - // The qualifier denoting this body's own run makes the write the - // unqualified one: the host writes and streams it as `assign n := 3`. - if e.env.data.runs(ec.ctx, s.Owner) { - if !e.host.declaredOutput(s.Target) && e.env.rootDeclares(s.Target) { - return flowNext, e.host.assignOuter(e.env, s.Target, value, s) - } - if !e.host.declaredOutput(s.Target) && e.env.data.has(s.Target) { - return flowNext, e.host.assignData(e.env, s.Target, value, s) - } - return flowNext, e.host.assignOuter(e.env, s.Target, value, s) - } - return flowNext, e.host.assignForeign(ec, s, value) - } - // An output is bound by the host even when the body's data holds it, so a - // second binding is reported; a block-local of the name shadows it. - if e.env.holdsLocal(s.Target) { - if err := e.ctx.checkBodyWrite(e.host, s, &value); err != nil { - return flowNext, err - } - rootLocal := e.env.rootLocal(s.Target) - e.env.assignLocal(e.ctx, s.Target, value) - if rootLocal { - if mirror, ok := e.host.(rootLocalMirror); ok { - return flowNext, mirror.mirrorRootLocal(s.Target, value) - } - } - return flowNext, nil - } - if !e.host.declaredOutput(s.Target) { - if e.env.data.has(s.Target) { - return flowNext, e.host.assignData(e.env, s.Target, value, s) - } - } - return flowNext, e.host.assignOuter(e.env, s.Target, value, s) + return flowNext, err case lower.Declare: if s.Binding && s.Value != nil { var cells *bodyCells @@ -1733,3 +1683,79 @@ func (e *stmtEngine) checkBodyDeclaration(scope *symbols.Scope, name string, val _, calc := e.host.(*calcStmtHost) return e.ctx.checkBodyDeclarationHeld(scope, e.host.describe, name, value, !calc) } + +// assign runs an assignment statement and returns the value it wrote. +func (e *stmtEngine) assign(s lower.Assign) (value Value, err error) { + if s.Target == "" { + return value, fmt.Errorf("%s: unsupported assignment target", e.host.describe()) + } + if err := e.ctx.checkAssignable(e.host.describe, s); err != nil { + return value, err + } + value, err = e.evalIn(s.Scope).Eval(s.Value) + if err != nil { + return value, fmt.Errorf("eval assignment RHS: %w", err) + } + // A chained target writes the object its chain reaches, whatever the body + // declares of the name it starts from, so no host binding applies to it. + if s.Chain != nil { + return value, e.host.assignChain(e.evalIn(s.Scope), s, value) + } + // A qualified target names the feature on the object its qualifier denotes: + // the performance running that def (`Probe::count` is the Probe run's own + // count), else the performing object (`Scope::azimuth` on a Scope), as a + // name shadowed by a nearer declaration still reaches it. + if s.Qualified { + ec := e.evalIn(s.Scope) + // The qualifier denoting this body's own run makes the write the + // unqualified one: the host writes and streams it as `assign n := 3`. + if e.env.data.runs(ec.ctx, s.Owner) { + if !e.host.declaredOutput(s.Target) && e.env.rootDeclares(s.Target) { + return value, e.host.assignOuter(e.env, s.Target, value, s) + } + if !e.host.declaredOutput(s.Target) && e.env.data.has(s.Target) { + return value, e.host.assignData(e.env, s.Target, value, s) + } + return value, e.host.assignOuter(e.env, s.Target, value, s) + } + return value, e.host.assignForeign(ec, s, value) + } + // An output is bound by the host even when the body's data holds it, so a + // second binding is reported; a block-local of the name shadows it. + if e.env.holdsLocal(s.Target) { + if err := e.ctx.checkBodyWrite(e.host, s, &value); err != nil { + return value, err + } + rootLocal := e.env.rootLocal(s.Target) + e.env.assignLocal(e.ctx, s.Target, value) + if rootLocal { + if mirror, ok := e.host.(rootLocalMirror); ok { + return value, mirror.mirrorRootLocal(s.Target, value) + } + } + return value, nil + } + if !e.host.declaredOutput(s.Target) { + if e.env.data.has(s.Target) { + return value, e.host.assignData(e.env, s.Target, value, s) + } + } + return value, e.host.assignOuter(e.env, s.Target, value, s) +} + +// actionStepHost is a host stepping an action token, which the trace names the +// assignments of. +type actionStepHost interface { + recordAssign(feature string, value Value) +} + +// noteAssign records in the trace the value an assignment wrote, under the +// action token stepping the statement where one is. +func (e *stmtEngine) noteAssign(feature string, value Value) { + if e.ctx.trace == nil { + return + } + if host, ok := e.host.(actionStepHost); ok { + host.recordAssign(feature, value) + } +} diff --git a/internal/exec/runtime/trace.go b/internal/exec/runtime/trace.go index b7d129e52d..49f4353e85 100644 --- a/internal/exec/runtime/trace.go +++ b/internal/exec/runtime/trace.go @@ -41,6 +41,20 @@ const ( // TraceTerminate is a state machine's performance ending without exiting its states: // a terminate action, or the end of the occurrence performing it. TraceTerminate + // TraceStep is an action token arriving at a node: over the succession it + // followed, or where its flow starts. The trace prints no line for it. + TraceStep + // TraceWait is an action token parking at an accept node until the message or + // trigger it awaits arrives. The trace prints no line for it. + TraceWait + // TraceAssign is a value a body statement assigned to a feature; the statement's + // own lines show the evaluation, so the trace prints no line for it. + TraceAssign + // TraceDecide is a decision node resolved: its branches and the one taken. + // The trace prints no line for it. + TraceDecide + // TraceComplete is an action's performance completing. The trace prints no line for it. + TraceComplete ) // String names the kind as a query reads it. @@ -66,6 +80,16 @@ func (k TraceKind) String() string { return "guard" case TraceTerminate: return "terminate" + case TraceStep: + return "step" + case TraceWait: + return "wait" + case TraceAssign: + return "assign" + case TraceDecide: + return "decide" + case TraceComplete: + return "complete" } return fmt.Sprintf("TraceKind(%d)", int(k)) } @@ -104,6 +128,16 @@ type TraceRecord struct { Action bool // Note is a TraceChoice's or TraceGuard's note. Note RunNote + // Token is the action token a step, wait, assign, decide or action accept record + // is about and Step the executor step that made it; 0 for a record of neither. + Token int64 + Step int + // Feature is the feature a TraceAssign wrote and Value what it holds since. + Feature string + Value Value + // Alternatives are a TraceDecide's branches, as its choice line would name them; + // the one taken is in To and the decision node in State. + Alternatives []string // text and depth are a TraceLine's line and nesting. text string depth int @@ -115,7 +149,7 @@ func (r TraceRecord) Line() (line string, printed bool) { switch r.Kind { case TraceLine: return strings.Repeat(traceIndent, r.depth) + r.text, true - case TraceAccept, TraceSend: + case TraceAccept, TraceSend, TraceStep, TraceWait, TraceAssign, TraceDecide, TraceComplete: return "", false case TraceTransition: if r.Event == "" { @@ -148,6 +182,19 @@ func (r TraceRecord) Text() string { if line, printed := r.Line(); printed { return line } + switch r.Kind { + case TraceStep: + if r.From == "" { + return "step " + r.To + } + return fmt.Sprintf("step %s -> %s", r.From, r.To) + case TraceAssign: + return fmt.Sprintf("assign %s = %s", r.Feature, FormatValue(r.Value)) + case TraceDecide: + return fmt.Sprintf("decide %s -> %s", r.State, r.To) + case TraceComplete: + return "complete" + } return r.Kind.String() + " " + r.Event } @@ -335,6 +382,39 @@ func (tr *TraceRecorder) RecordAccept(origin TraceOrigin, serial uint64, event s tr.add(TraceRecord{Kind: TraceAccept, Origin: origin, Event: event, Message: serial, Payload: payload}) } +// recordActionAccept records an accept node taking a message off the queue, as +// RecordAccept does, under the token and node that took it. +func (tr *TraceRecorder) recordActionAccept(origin TraceOrigin, token int64, step int, node string, serial uint64, event string, payload map[string]Value) { + tr.add(TraceRecord{Kind: TraceAccept, Origin: origin, Token: token, Step: step, State: node, Event: event, Message: serial, Payload: payload}) +} + +// recordTokenStep records token arriving at node to in step: over the succession +// from from, or where its flow starts when from is empty. +func (tr *TraceRecorder) recordTokenStep(origin TraceOrigin, token int64, step int, from, to string) { + tr.add(TraceRecord{Kind: TraceStep, Origin: origin, Token: token, Step: step, From: from, To: to}) +} + +// recordTokenWait records token parking at accept node node for awaited: the +// message type, or the trigger, it waits for. +func (tr *TraceRecorder) recordTokenWait(origin TraceOrigin, token int64, step int, node, awaited string) { + tr.add(TraceRecord{Kind: TraceWait, Origin: origin, Token: token, Step: step, State: node, Event: awaited}) +} + +// recordAssign records the statement token steps at node writing value to feature. +func (tr *TraceRecorder) recordAssign(origin TraceOrigin, token int64, step int, node, feature string, value Value) { + tr.add(TraceRecord{Kind: TraceAssign, Origin: origin, Token: token, Step: step, State: node, Feature: feature, Value: value}) +} + +// recordDecide records token resolving decision node node among alternatives, taking taken. +func (tr *TraceRecorder) recordDecide(origin TraceOrigin, token int64, step int, node string, alternatives []string, taken string) { + tr.add(TraceRecord{Kind: TraceDecide, Origin: origin, Token: token, Step: step, State: node, Alternatives: alternatives, To: taken}) +} + +// recordActionComplete records the action's performance completing in step. +func (tr *TraceRecorder) recordActionComplete(origin TraceOrigin, step int) { + tr.add(TraceRecord{Kind: TraceComplete, Origin: origin, Step: step}) +} + // RecordSend records a message posted onto the bus by the object at origin, or // from outside the run where it has none. func (tr *TraceRecorder) RecordSend(origin TraceOrigin, msg Message, target *Instance) { diff --git a/internal/frontend/combined/combined.go b/internal/frontend/combined/combined.go index fb3e2b1d34..0f087b36e1 100644 --- a/internal/frontend/combined/combined.go +++ b/internal/frontend/combined/combined.go @@ -44,6 +44,7 @@ var capabilities = []string{ "big_int_values", "render_view", "state_trace", + "action_trace", } // Server combines the parsing/validation and execution JSON surfaces. diff --git a/internal/frontend/engine/engine.go b/internal/frontend/engine/engine.go index 84580f80ef..2fbf3d6a95 100644 --- a/internal/frontend/engine/engine.go +++ b/internal/frontend/engine/engine.go @@ -854,6 +854,10 @@ func (e *Engine) executeAction(ctx context.Context, req *JExecuteActionRequest) return nil, err } + if len(req.Events) > 0 && req.PerformerSymbolId == "" { + return nil, statusError(codeInvalidArgument, "events are posted to the object performing the action: name one in performerSymbolId") + } + cached, ok := e.get(req.ModelHash) if !ok { return nil, statusErrorf(codeNotFound, msgModelNotFound, req.ModelHash) @@ -888,13 +892,24 @@ func (e *Engine) executeAction(ctx context.Context, req *JExecuteActionRequest) if err := runtimeCtx.SetSchedule(schedule); err != nil { return nil, statusError(codeInvalidArgument, err.Error()) } + var traceRecorder *runtime.TraceRecorder + if req.Trace { + traceRecorder = runtime.NewEventRecorder(stateTraceLimit) + runtimeCtx.SetTrace(traceRecorder) + } self, err := e.performer(cached, runtimeCtx, req.PerformerSymbolId) if err != nil { - return marshal(&JExecuteActionResponse{Error: err.Error()}) + trace, dropped := traceToJSON(runtimeCtx, cached.Index, traceRecorder) + return marshal(&JExecuteActionResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}) + } + events, err := eventMessages(cached, runtimeCtx, action, req.Events, self) + if err != nil { + trace, dropped := traceToJSON(runtimeCtx, cached.Index, traceRecorder) + return marshal(&JExecuteActionResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}) } // Execute action with the supplied inputs - outputs, performer, err := runtimeCtx.ExecuteActionReportingPerformer(action, self, inputs) + outputs, performer, err := runtimeCtx.ExecuteActionWithEvents(action, self, inputs, events) if err != nil { if gone := ctx.Err(); gone != nil { return nil, contextError(gone) @@ -903,11 +918,14 @@ func (e *Engine) executeAction(ctx context.Context, req *JExecuteActionRequest) // The choices the run made are reported with its outcome, failed or not: a // failure may hang on the order taken. diags := runNoteDiagnosticsToProto(runtimeCtx.Notes(), cached) + trace, dropped := traceToJSON(runtimeCtx, cached.Index, traceRecorder) if err != nil { return marshal(&JExecuteActionResponse{ - Error: fmt.Sprintf("action execution failed: %v", err), - Diagnostics: diags, - FinalTime: F64(runtimeCtx.Clock().Now()), + Error: fmt.Sprintf("action execution failed: %v", err), + Diagnostics: diags, + FinalTime: F64(runtimeCtx.Clock().Now()), + Trace: trace, + TraceDropped: dropped, }) } @@ -916,9 +934,31 @@ func (e *Engine) executeAction(ctx context.Context, req *JExecuteActionRequest) Diagnostics: diags, FinalTime: F64(runtimeCtx.Clock().Now()), PerformerAttributes: valuesToProto(runtimeCtx, performer, cached.Index), + Trace: trace, + TraceDropped: dropped, }) } +// eventMessages builds the messages executeAction's events post to self, in +// order, as grpc's ExecuteAction does: a signal definition's message where the +// name resolves to one, else one matched by name alone. +func eventMessages(cached *cachedModel, rt *runtime.Context, action *symbols.Symbol, events []string, self *runtime.Instance) ([]runtime.Message, error) { + messages := make([]runtime.Message, 0, len(events)) + for _, event := range events { + sym := resolveEvent(func(id string) []*symbols.Symbol { return lookupNamed(cached.Index, id) }, action, event) + if sym == nil { + messages = append(messages, runtime.NamedSignalMessage(event, self)) + continue + } + msg, err := rt.SignalMessage(sym, nil, self) + if err != nil { + return nil, fmt.Errorf("event %s: %w", event, err) + } + messages = append(messages, msg) + } + return messages, nil +} + // executeState executes a state machine, as grpc's non-exploring ExecuteState // does. func (e *Engine) executeState(ctx context.Context, req *JExecuteStateRequest) ([]byte, error) { @@ -951,7 +991,7 @@ func (e *Engine) executeState(ctx context.Context, req *JExecuteStateRequest) ([ } self, err := e.performer(cached, runtimeCtx, req.PerformerSymbolId) if err != nil { - trace, dropped := stateTraceToJSON(runtimeCtx, cached.Index, traceRecorder) + trace, dropped := traceToJSON(runtimeCtx, cached.Index, traceRecorder) return marshal(&JExecuteStateResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}) } @@ -963,7 +1003,7 @@ func (e *Engine) executeState(ctx context.Context, req *JExecuteStateRequest) ([ } finalContext, statesVisited := outcome.Outputs, outcome.StateVisits diags := runNoteDiagnosticsToProto(runtimeCtx.Notes(), cached) - trace, dropped := stateTraceToJSON(runtimeCtx, cached.Index, traceRecorder) + trace, dropped := traceToJSON(runtimeCtx, cached.Index, traceRecorder) if err != nil { return marshal(&JExecuteStateResponse{ Error: fmt.Sprintf("state machine execution failed: %v", err), @@ -984,7 +1024,7 @@ func (e *Engine) executeState(ctx context.Context, req *JExecuteStateRequest) ([ }) } -func stateTraceToJSON(rt *runtime.Context, idx *symbols.Index, recorder *runtime.TraceRecorder) ([]JDocumentEvent, int) { +func traceToJSON(rt *runtime.Context, idx *symbols.Index, recorder *runtime.TraceRecorder) ([]JDocumentEvent, int) { if recorder == nil { return nil, 0 } @@ -992,6 +1032,9 @@ func stateTraceToJSON(rt *runtime.Context, idx *symbols.Index, recorder *runtime trace := make([]JDocumentEvent, len(events)) for i, event := range events { trace[i] = documentEventToJSON(idx, event) + if _, value, ok := event.Assigned(); ok { + trace[i].Value = valueToProto(rt, value, idx) + } } dropped, _ := recorder.Dropped() return trace, dropped @@ -1012,6 +1055,11 @@ func documentEventToJSON(idx *symbols.Index, event queryexec.Event) JDocumentEve Alternatives: event.Alternatives(), Taken: event.Taken(), Text: event.Text(), + Token: I64(event.Token()), + Step: event.Step(), + } + if feature, _, ok := event.Assigned(); ok { + out.Feature = feature } if inst, label := event.Object(); inst != nil { out.Object = documentObjectToJSON(idx, queryexec.ObjectValue(inst, label)) @@ -1192,3 +1240,17 @@ func unquotedName(id string) (string, bool) { } return strings.Join(segments, "::"), true } + +// resolveEvent finds the definition an event name denotes, as grpc's ExecuteAction +// does: as written, else as each namespace enclosing action sees it, innermost first. +func resolveEvent(lookup func(string) []*symbols.Symbol, action *symbols.Symbol, event string) *symbols.Symbol { + if syms := lookup(event); len(syms) > 0 { + return syms[0] + } + for owner := action.Owner(); owner != nil; owner = owner.Owner() { + if syms := lookup(symbols.FQNOf(owner) + "::" + event); len(syms) > 0 { + return syms[0] + } + } + return nil +} diff --git a/internal/frontend/engine/json.go b/internal/frontend/engine/json.go index 4d1b3d9f3f..784d6c1caf 100644 --- a/internal/frontend/engine/json.go +++ b/internal/frontend/engine/json.go @@ -475,6 +475,8 @@ type JExecuteActionRequest struct { Inputs map[string]*JValue `json:"inputs,omitempty"` Schedule string `json:"schedule,omitempty"` PerformerSymbolId string `json:"performerSymbolId,omitempty"` + Trace bool `json:"trace,omitempty"` + Events []string `json:"events,omitempty"` } type JExecuteActionResponse struct { @@ -483,6 +485,8 @@ type JExecuteActionResponse struct { Diagnostics []*JDiagnostic `json:"diagnostics,omitempty"` FinalTime F64 `json:"finalTime,omitempty"` PerformerAttributes map[string]*JValue `json:"performerAttributes,omitempty"` + Trace []JDocumentEvent `json:"trace,omitempty"` + TraceDropped int `json:"traceDropped,omitempty"` } type JExecuteStateRequest struct { @@ -505,7 +509,7 @@ type JExecuteStateResponse struct { } // JDocumentEvent is the DocumentEvent message: one documented record of a traced -// state-machine run, as the service's ExecuteState answers it. +// run, as the service's ExecuteState and ExecuteAction answer it. type JDocumentEvent struct { Kind string `json:"kind"` Time *JDocumentValue `json:"time,omitempty"` @@ -520,6 +524,10 @@ type JDocumentEvent struct { Alternatives []string `json:"alternatives,omitempty"` Taken string `json:"taken,omitempty"` Text string `json:"text"` + Token I64 `json:"token,omitempty"` + Step int `json:"step,omitempty"` + Feature string `json:"feature,omitempty"` + Value *JValue `json:"value,omitempty"` } // JDocumentObject is the DocumentObject message: an object Instantiate created, diff --git a/internal/frontend/grpc/action_trace_test.go b/internal/frontend/grpc/action_trace_test.go new file mode 100644 index 0000000000..8ae4d294f3 --- /dev/null +++ b/internal/frontend/grpc/action_trace_test.go @@ -0,0 +1,172 @@ +package grpc + +import ( + "context" + "strings" + "testing" + + "connectrpc.com/connect" + pb "github.com/Open-MBEE/OpenSysML/api/proto" +) + +const actionTraceModel = ` +package Trace { + private import ScalarValues::*; + item def Go; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } + part def Craft; + part craft : Craft; +} +` + +func traceTexts(trace []*pb.DocumentEvent) []string { + texts := make([]string, len(trace)) + for i, event := range trace { + texts[i] = event.Text + } + return texts +} + +func TestExecuteActionTraceRecordsTheRun(t *testing.T) { + service := mustNewService(t, 10) + modelHash := parseStateTraceModel(t, service, actionTraceModel) + request := &pb.ExecuteActionRequest{ + ModelHash: modelHash, + ActionSymbolId: "Trace::Flow", + Inputs: map[string]*pb.Value{"budget": {Kind: &pb.Value_IntValue{IntValue: 2}}}, + } + plain, err := service.ExecuteAction(context.Background(), request) + if err != nil { + t.Fatalf("ExecuteAction without trace: %v", err) + } + if plain.Error != "" || len(plain.Trace) != 0 || plain.TraceDropped != 0 { + t.Fatalf("unrequested trace = %v dropped %d error %q", plain.Trace, plain.TraceDropped, plain.Error) + } + + request.Trace = true + traced, err := service.ExecuteAction(context.Background(), request) + if err != nil { + t.Fatalf("ExecuteAction with trace: %v", err) + } + if traced.Error != "" { + t.Fatalf("execution error: %s", traced.Error) + } + want := []string{ + "step start", + "step start -> burn", + "assign remaining = -1", + "step burn -> route", + "decide route -> 2->finish", + "step route -> finish", + "step finish -> done", + "complete", + } + if got := traceTexts(traced.Trace); strings.Join(got, "\n") != strings.Join(want, "\n") { + t.Fatalf("trace:\n%s\nwant:\n%s", strings.Join(got, "\n"), strings.Join(want, "\n")) + } + assign := traced.Trace[2] + if assign.Kind != "assign" || assign.Feature != "remaining" || assign.Token != 1 || assign.Step != 2 || assign.State != "burn" { + t.Fatalf("assign record = %v", assign) + } + if value, ok := assign.Value.Kind.(*pb.Value_IntValue); !ok || value.IntValue != -1 { + t.Fatalf("assign value = %v, want -1", assign.Value) + } + decide := traced.Trace[4] + if decide.Kind != "decide" || decide.State != "route" || decide.Taken != "2->finish" || + strings.Join(decide.Alternatives, ",") != "1->waiting,2->finish" { + t.Fatalf("decide record = %v", decide) + } + if step := traced.Trace[1]; step.Kind != "step" || step.From != "start" || step.To != "burn" || step.Token != 1 || step.Step != 1 { + t.Fatalf("step record = %v", step) + } +} + +func TestExecuteActionEventsReachAWaitingAccept(t *testing.T) { + service := mustNewService(t, 10) + modelHash := parseStateTraceModel(t, service, actionTraceModel) + request := &pb.ExecuteActionRequest{ + ModelHash: modelHash, + ActionSymbolId: "Trace::Flow", + Inputs: map[string]*pb.Value{"budget": {Kind: &pb.Value_IntValue{IntValue: 10}}}, + Trace: true, + } + _, err := service.ExecuteAction(context.Background(), &pb.ExecuteActionRequest{ + ModelHash: modelHash, ActionSymbolId: "Trace::Flow", Events: []string{"Go"}, + }) + if connect.CodeOf(err) != connect.CodeInvalidArgument || !strings.Contains(err.Error(), "performer_symbol_id") { + t.Fatalf("events without a performer: %v, want INVALID_ARGUMENT naming performer_symbol_id", err) + } + request.PerformerSymbolId = "Trace::craft" + waiting, err := service.ExecuteAction(context.Background(), request) + if err != nil { + t.Fatalf("ExecuteAction without events: %v", err) + } + if !strings.Contains(waiting.Error, "accept deadlock") || !strings.Contains(waiting.Error, "Go") { + t.Fatalf("error without the event = %q, want an accept deadlock naming Go", waiting.Error) + } + texts := traceTexts(waiting.Trace) + if len(texts) == 0 || texts[len(texts)-1] != "wait Go" { + t.Fatalf("trace without the event ends in %v, want a wait for Go", texts) + } + + request.Events = []string{"Go"} + landed, err := service.ExecuteAction(context.Background(), request) + if err != nil { + t.Fatalf("ExecuteAction with the event: %v", err) + } + if landed.Error != "" { + t.Fatalf("execution error: %s", landed.Error) + } + if got := landed.Outputs["landed"].String(); !strings.Contains(got, "bool_value:true") { + t.Fatalf("landed = %s, want true", got) + } + texts = traceTexts(landed.Trace) + joined := strings.Join(texts, "\n") + for _, want := range []string{"wait Go\n", "send Go\n", "accept Go\n", "step waiting -> land\n", "assign landed = true\n", "complete"} { + if !strings.Contains(joined+"\n", want) { + t.Errorf("trace lacks %q:\n%s", strings.TrimSpace(want), joined) + } + } + if strings.Index(joined, "wait Go") > strings.Index(joined, "send Go") || strings.Index(joined, "send Go") > strings.Index(joined, "accept Go") { + t.Fatalf("the event was not posted after the wait and taken after the post:\n%s", joined) + } + + request.Inputs = map[string]*pb.Value{"budget": {Kind: &pb.Value_IntValue{IntValue: 2}}} + unawaited, err := service.ExecuteAction(context.Background(), request) + if err != nil { + t.Fatalf("ExecuteAction with an unawaited event: %v", err) + } + if !strings.Contains(unawaited.Error, "event Go was posted after the action completed") { + t.Fatalf("error for an event after completion = %q", unawaited.Error) + } +} + +func TestExecuteActionTraceCapabilityAndExplore(t *testing.T) { + _, err := mustNewServiceWithout(t, CapabilityActionTrace).ExecuteAction(context.Background(), &pb.ExecuteActionRequest{Trace: true}) + if connect.CodeOf(err) != connect.CodeUnimplemented || !strings.Contains(err.Error(), CapabilityActionTrace) { + t.Fatalf("without capability: %v, want UNIMPLEMENTED naming %q", err, CapabilityActionTrace) + } + service := mustNewService(t, 10) + _, err = service.ExecuteAction(context.Background(), &pb.ExecuteActionRequest{Schedule: "explore", Trace: true}) + if connect.CodeOf(err) != connect.CodeInvalidArgument { + t.Fatalf("trace under explore: %v, want INVALID_ARGUMENT", err) + } + _, err = service.ExecuteAction(context.Background(), &pb.ExecuteActionRequest{Schedule: "explore", Events: []string{"Go"}}) + if connect.CodeOf(err) != connect.CodeInvalidArgument { + t.Fatalf("events under explore: %v, want INVALID_ARGUMENT", err) + } +} diff --git a/internal/frontend/grpc/docquery.go b/internal/frontend/grpc/docquery.go index e4dc6a1dea..8a917894b6 100644 --- a/internal/frontend/grpc/docquery.go +++ b/internal/frontend/grpc/docquery.go @@ -470,6 +470,11 @@ func documentEvent(idx *symbols.Index, event queryexec.Event) *pb.DocumentEvent Event: record.Event, Payload: event.Payload(), Text: event.Text(), + Token: event.Token(), + Step: traceDroppedCountToInt32(int64(event.Step())), + } + if feature, _, ok := event.Assigned(); ok { + out.Feature = feature } if inst, label := event.Object(); inst != nil { out.Object = documentObject(idx, queryexec.ObjectValue(inst, label)) diff --git a/internal/frontend/grpc/run_options.go b/internal/frontend/grpc/run_options.go index a49d425a51..70c1a12a8e 100644 --- a/internal/frontend/grpc/run_options.go +++ b/internal/frontend/grpc/run_options.go @@ -67,14 +67,15 @@ func (o runOptions) apply(rt *runtime.Context) { _ = rt.SetClockStep(o.clockStep) // checked by readRunOptions } -// runAction runs action performed by self on rt: to completion, or for the +// runAction runs action performed by self on rt, posting events to it as the run +// waits (runtime.DeliverEvents): to completion, or for the // duration asked, in which case one that has not completed is ErrNotCompleted. -func (o runOptions) runAction(rt *runtime.Context, name string, action *symbols.Symbol, self *runtime.Instance, inputs map[string]runtime.Value) (actionRun, error) { +func (o runOptions) runAction(rt *runtime.Context, name string, action *symbols.Symbol, self *runtime.Instance, inputs map[string]runtime.Value, events []runtime.Message) (actionRun, error) { if o.advance == nil { - outputs, performer, err := rt.ExecuteActionReportingPerformer(action, self, inputs) + outputs, performer, err := rt.ExecuteActionWithEvents(action, self, inputs, events) return actionRun{outputs: outputs, performer: performer}, err } - exec, release, err := o.startAction(rt, name, action, self, inputs) + exec, release, err := o.startAction(rt, name, action, self, inputs, events) if err != nil { return actionRun{}, err } @@ -92,7 +93,7 @@ func (o runOptions) actionOutcome(rt *runtime.Context, name string, action *symb if o.advance == nil { return rt.ActionOutcomePerformedBy(action, self, inputs) } - exec, _, err := o.startAction(rt, name, action, self, inputs) + exec, _, err := o.startAction(rt, name, action, self, inputs, nil) if err != nil { return runtime.Outcome{}, err } @@ -104,7 +105,7 @@ func (o runOptions) actionOutcome(rt *runtime.Context, name string, action *symb // startAction starts the performance a run to completion would run and moves the clock by // the duration asked, as `-action X -advance T` does; release lets go of one started for the call. -func (o runOptions) startAction(rt *runtime.Context, name string, action *symbols.Symbol, self *runtime.Instance, inputs map[string]runtime.Value) (*runtime.ActionExecutor, func(), error) { +func (o runOptions) startAction(rt *runtime.Context, name string, action *symbols.Symbol, self *runtime.Instance, inputs map[string]runtime.Value, events []runtime.Message) (*runtime.ActionExecutor, func(), error) { exec, reused, err := rt.StartActionPerformedBy(action, self, inputs) if err != nil { return nil, nil, err @@ -113,6 +114,10 @@ func (o runOptions) startAction(rt *runtime.Context, name string, action *symbol if reused { release = func() { /* a reused performance is the run's own; nothing was started for the call */ } } + if err := rt.DeliverEvents(exec, events); err != nil { + release() + return nil, nil, err + } if _, err := rt.Advance(*o.advance); err != nil { release() return nil, nil, err diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index 134f9f71bf..39307ebc5d 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -338,6 +338,9 @@ const CapabilityPerformer = "performer" // CapabilityStateTrace names the ExecuteState trace request field. const CapabilityStateTrace = "state_trace" +// CapabilityActionTrace names the ExecuteAction trace request field. +const CapabilityActionTrace = "action_trace" + // CapabilityMetaobjectValues names the capability of carrying an element // reflected on as an instance of its metaclass (`x meta T`, the last element of // `x.metadata`) as Value.metaobject, rather than as an unsupported null. @@ -393,6 +396,7 @@ var capabilities = []string{ CapabilityBigIntValues, CapabilityRationalValues, CapabilityStateTrace, + CapabilityActionTrace, CapabilityRenderView, CapabilityExportGraphs, CapabilityImportData, @@ -1325,6 +1329,21 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques if err != nil { return nil, err } + _, explores := schedule.Exploration() + if req.Trace && explores { + return nil, statusError(connect.CodeInvalidArgument, "action traces are unavailable under an explore schedule") + } + if req.Trace { + if err := s.requireCapability(CapabilityActionTrace); err != nil { + return nil, err + } + } + if len(req.Events) > 0 && explores { + return nil, statusError(connect.CodeInvalidArgument, "events cannot be posted under an explore schedule") + } + if len(req.Events) > 0 && req.PerformerSymbolId == "" { + return nil, statusError(connect.CodeInvalidArgument, "events are posted to the object performing the action: name one in performer_symbol_id") + } if req.PerformerSymbolId != "" { if err := s.requireCapability(CapabilityPerformer); err != nil { return nil, err @@ -1353,6 +1372,11 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques runtimeCtx, release := s.newRuntime(ctx, cached) defer release() opts.apply(runtimeCtx) + var traceRecorder *runtime.TraceRecorder + if req.Trace { + traceRecorder = runtime.NewEventRecorder(s.maxHeldEvents) + runtimeCtx.SetTrace(traceRecorder) + } // Converted against the model's index, so a quantity input keeps the base // units it is commensurable with instead of binding an unusable value. @@ -1380,7 +1404,7 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques return resp, err } - if _, explores := schedule.Exploration(); explores { + if explores { // Inputs are read and the performer made again on each run's own context, // so an object among them belongs to the run that binds it. x, err := s.exploreWith(ctx, req.ActionSymbolId, schedule, analysis.Auto(), cached, opts, func(rt *runtime.Context) (runtime.Outcome, error) { @@ -1414,12 +1438,18 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques } self, err := s.performer(cached, runtimeCtx, req.PerformerSymbolId) if err != nil { - return &pb.ExecuteActionResponse{Error: err.Error()}, nil + trace, dropped := s.traceToProto(runtimeCtx, cached.Index, traceRecorder) + return &pb.ExecuteActionResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}, nil + } + events, err := eventMessages(cached, runtimeCtx, action, req.Events, self) + if err != nil { + trace, dropped := s.traceToProto(runtimeCtx, cached.Index, traceRecorder) + return &pb.ExecuteActionResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}, nil } // Execute action with the supplied inputs ran, _, err := performOn(ctx, s, runtimeCtx, analysis.Auto(), req.ActionSymbolId, func(rt *runtime.Context) (actionRun, error) { - return opts.runAction(rt, req.ActionSymbolId, action, self, inputs) + return opts.runAction(rt, req.ActionSymbolId, action, self, inputs, events) }, func(ran actionRun, err error) analysis.Answer { return heldAnswer(ran.outputs, err) }) if gone := callerGone(ctx, err); gone != nil { return nil, gone @@ -1427,11 +1457,14 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques // The choices the run made are reported with its outcome, failed or not: a // failure may hang on the order taken. diags := s.filterDiagnosticCapabilities(RunNoteDiagnosticsToProto(runtimeCtx.Notes(), cached)) + trace, dropped := s.traceToProto(runtimeCtx, cached.Index, traceRecorder) if err != nil { return &pb.ExecuteActionResponse{ - Error: fmt.Sprintf("action execution failed: %v", err), - Diagnostics: diags, - FinalTime: s.finalTime(runtimeCtx), + Error: fmt.Sprintf("action execution failed: %v", err), + Diagnostics: diags, + FinalTime: s.finalTime(runtimeCtx), + Trace: trace, + TraceDropped: dropped, }, nil } @@ -1441,9 +1474,32 @@ func (s *Service) ExecuteAction(ctx context.Context, req *pb.ExecuteActionReques FinalTime: s.finalTime(runtimeCtx), PerformerAttributes: s.valuesToProto(runtimeCtx, ran.performer, cached.Index), OrderDependent: s.orderDependent(runtimeCtx, ran.outputs), + Trace: trace, + TraceDropped: dropped, }, nil } +// eventMessages builds the messages ExecuteAction's events post to self, in +// order: a signal definition's message where the name resolves to one, qualified +// or from action's namespaces, else one matched by name alone, as the REPL's +// %send sends an undeclared signal. +func eventMessages(cached *CachedModel, rt *runtime.Context, action *symbols.Symbol, events []string, self *runtime.Instance) ([]runtime.Message, error) { + messages := make([]runtime.Message, 0, len(events)) + for _, event := range events { + sym := resolveEvent(cached.LookupNamedMember, action, event) + if sym == nil { + messages = append(messages, runtime.NamedSignalMessage(event, self)) + continue + } + msg, err := rt.SignalMessage(sym, nil, self) + if err != nil { + return nil, fmt.Errorf("event %s: %w", event, err) + } + messages = append(messages, msg) + } + return messages, nil +} + // orderDependent is, for each value an unresolved choice point of the run // touches, how many do, under the order_dependence capability. func (s *Service) orderDependent(runtimeCtx *runtime.Context, values map[string]runtime.Value) map[string]int32 { @@ -1549,7 +1605,7 @@ func (s *Service) ExecuteState(ctx context.Context, req *pb.ExecuteStateRequest) } self, err := s.performer(cached, runtimeCtx, req.PerformerSymbolId) if err != nil { - trace, dropped := stateTraceToProto(runtimeCtx, cached.Index, traceRecorder) + trace, dropped := s.traceToProto(runtimeCtx, cached.Index, traceRecorder) return &pb.ExecuteStateResponse{Error: err.Error(), Trace: trace, TraceDropped: dropped}, nil } @@ -1564,7 +1620,7 @@ func (s *Service) ExecuteState(ctx context.Context, req *pb.ExecuteStateRequest) } finalContext, statesVisited := ran.final, ran.visited diags := s.filterDiagnosticCapabilities(RunNoteDiagnosticsToProto(runtimeCtx.Notes(), cached)) - trace, dropped := stateTraceToProto(runtimeCtx, cached.Index, traceRecorder) + trace, dropped := s.traceToProto(runtimeCtx, cached.Index, traceRecorder) if err != nil { return &pb.ExecuteStateResponse{ Error: fmt.Sprintf("state machine execution failed: %v", err), @@ -1592,7 +1648,7 @@ func (s *Service) ExecuteState(ctx context.Context, req *pb.ExecuteStateRequest) }, nil } -func stateTraceToProto(rt *runtime.Context, idx *symbols.Index, recorder *runtime.TraceRecorder) ([]*pb.DocumentEvent, int32) { +func (s *Service) traceToProto(rt *runtime.Context, idx *symbols.Index, recorder *runtime.TraceRecorder) ([]*pb.DocumentEvent, int32) { if recorder == nil { return nil, 0 } @@ -1600,6 +1656,9 @@ func stateTraceToProto(rt *runtime.Context, idx *symbols.Index, recorder *runtim trace := make([]*pb.DocumentEvent, len(events)) for i, event := range events { trace[i] = documentEvent(idx, event) + if _, value, ok := event.Assigned(); ok { + trace[i].Value = s.valueToProto(rt, value, idx) + } } dropped, _ := recorder.Dropped() return trace, traceDroppedCountToInt32(int64(dropped)) @@ -1640,3 +1699,17 @@ func computeHash(content string) string { hash := sha256.Sum256([]byte(content)) return fmt.Sprintf("%x", hash) } + +// resolveEvent finds the definition an event name denotes: as written, else as +// each namespace enclosing action sees it, innermost first; nil for none. +func resolveEvent(lookup func(string) []*symbols.Symbol, action *symbols.Symbol, event string) *symbols.Symbol { + if syms := lookup(event); len(syms) > 0 { + return syms[0] + } + for owner := action.Owner(); owner != nil; owner = owner.Owner() { + if syms := lookup(symbols.FQNOf(owner) + "::" + event); len(syms) > 0 { + return syms[0] + } + } + return nil +} diff --git a/tests/grpc/conformance_test.go b/tests/grpc/conformance_test.go index 54b0ee7158..a3c02ad201 100644 --- a/tests/grpc/conformance_test.go +++ b/tests/grpc/conformance_test.go @@ -109,12 +109,14 @@ type conformanceCase struct { ExpectedCodes []string `json:"expected_codes,omitempty"` AbsentCodes []string `json:"absent_codes,omitempty"` - // ExecuteState: the events injected in order, whether to ask for the run's - // trace, and the usages the traced transitions' objects are held under, in - // first-appearance order (one entry per object that took a transition). + // ExecuteState and ExecuteAction: the events injected in order, whether to ask + // for the run's trace, the usages the traced transitions' objects are held under, + // in first-appearance order (one entry per object that took a transition), and + // the text of every record of an action's trace, in order. Events []string `json:"events,omitempty"` Trace bool `json:"trace,omitempty"` ExpectedTraceObjects []string `json:"expected_trace_objects,omitempty"` + ExpectedTrace []string `json:"expected_trace,omitempty"` // RunRuns, RecordRun Runs int64 `json:"runs,omitempty"` @@ -955,6 +957,8 @@ func runExecuteActionCase(t *testing.T, srv *grpc.Service, ctx context.Context, Seed: tc.Seed, Draws: tc.Draws, ClockStep: tc.ClockStep, + Trace: tc.Trace, + Events: tc.Events, }) if err != nil { t.Fatalf("ExecuteAction: %v", err) @@ -962,6 +966,15 @@ func runExecuteActionCase(t *testing.T, srv *grpc.Service, ctx context.Context, if tc.ExpectedFinalTime != nil && resp.FinalTime != *tc.ExpectedFinalTime { t.Errorf("final_time = %g, want %g", resp.FinalTime, *tc.ExpectedFinalTime) } + if tc.ExpectedTrace != nil { + texts := make([]string, len(resp.Trace)) + for i, event := range resp.Trace { + texts[i] = event.Text + } + if !slices.Equal(texts, tc.ExpectedTrace) { + t.Errorf("trace = %q, want %q", texts, tc.ExpectedTrace) + } + } if checkExpectedError(t, tc, resp.Error) { return } diff --git a/tests/grpc/testdata/conformance/README.md b/tests/grpc/testdata/conformance/README.md index 9e1fffcfc6..5a09f8ae2c 100644 --- a/tests/grpc/testdata/conformance/README.md +++ b/tests/grpc/testdata/conformance/README.md @@ -49,7 +49,8 @@ empty else blocks are not authorable. | `advance`, `seed`, `draws`, `clock_step` | ExecuteAction | the run options of `sysml -advance`, `-seed`, `-draws` and `-clock-step`; absent sends none | | `disable_lint`, `enable_lint` | GetDiagnostics | lint codes left out of, and opt-in lint codes kept in, the diagnostics, as `sysml -disable-lint`/`-enable-lint` select them | | `expected_codes`, `absent_codes` | GetDiagnostics | diagnostic codes the answer must carry, and must not | -| `events` | ExecuteState | event names injected, in order | +| `events` | ExecuteState, ExecuteAction | event names injected, in order; an action's are posted to its performer once every token waits, each taken by the accept waiting for it | +| `trace`, `expected_trace` | ExecuteAction | ask for the run's trace, and the text of every record of it in order (`step a -> b`, `wait Go`, `accept Go`, `decide route -> 1->b`, `assign x = 3`, `complete`), checked on a failed run too | | `trace`, `expected_trace_objects` | ExecuteState | ask for the run's trace, and the usages the objects taking its transitions are held under, in first-appearance order, one per object (a machine run on the exhibited usage's own path traces its owner's one run) | | `advance`, `expected_final_time` | ExecuteState | the simulated time to run for after the events, and the clock the run ended at | | `performer_symbol_id` | CheckBehavior, ExecuteAction, ExecuteState | FQN of the part/usage whose object performs the behavior, or a path from one into what it holds; an ExecuteAction on it joins the performance that object already holds or runs, so `inputs` must be the bindings its declaration states (an `instance_id` input names an object of the instantiated performer) | diff --git a/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json b/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json new file mode 100644 index 0000000000..020ca9323d --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json @@ -0,0 +1,42 @@ +{ + "rpc": "ExecuteAction", + "symbol_id": "test::Flow", + "performer_symbol_id": "test::craft", + "inputs": { + "budget": { + "kind": "int_value", + "value": 10 + } + }, + "trace": true, + "events": [ + "Go" + ], + "expected_trace": [ + "step start", + "step start -> burn", + "assign remaining = 7", + "step burn -> route", + "decide route -> 1->waiting", + "step route -> waiting", + "wait Go", + "send Go", + "accept Go", + "step waiting -> land", + "assign landed = true", + "step land -> finish", + "step finish -> done", + "complete" + ], + "expected_outputs": { + "landed": { + "kind": "sequence", + "elements": [ + { + "kind": "bool_value", + "value": true + } + ] + } + } +} diff --git a/tests/grpc/testdata/conformance/execute_action_events_accept.sysml b/tests/grpc/testdata/conformance/execute_action_events_accept.sysml new file mode 100644 index 0000000000..74444740e8 --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_events_accept.sysml @@ -0,0 +1,21 @@ +package test { + private import ScalarValues::*; + item def Go; + part def Craft; + part craft : Craft; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } +} diff --git a/tests/grpc/testdata/conformance/execute_action_events_waiting.expected.json b/tests/grpc/testdata/conformance/execute_action_events_waiting.expected.json new file mode 100644 index 0000000000..92a4902fa6 --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_events_waiting.expected.json @@ -0,0 +1,22 @@ +{ + "rpc": "ExecuteAction", + "symbol_id": "test::Flow", + "performer_symbol_id": "test::craft", + "inputs": { + "budget": { + "kind": "int_value", + "value": 10 + } + }, + "trace": true, + "expected_trace": [ + "step start", + "step start -> burn", + "assign remaining = 7", + "step burn -> route", + "decide route -> 1->waiting", + "step route -> waiting", + "wait Go" + ], + "expected_error": "accept deadlock" +} diff --git a/tests/grpc/testdata/conformance/execute_action_events_waiting.sysml b/tests/grpc/testdata/conformance/execute_action_events_waiting.sysml new file mode 100644 index 0000000000..74444740e8 --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_events_waiting.sysml @@ -0,0 +1,21 @@ +package test { + private import ScalarValues::*; + item def Go; + part def Craft; + part craft : Craft; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } +} diff --git a/tests/grpc/testdata/conformance/execute_action_trace.expected.json b/tests/grpc/testdata/conformance/execute_action_trace.expected.json new file mode 100644 index 0000000000..e6bed82e85 --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_trace.expected.json @@ -0,0 +1,32 @@ +{ + "rpc": "ExecuteAction", + "symbol_id": "test::Flow", + "inputs": { + "budget": { + "kind": "int_value", + "value": 2 + } + }, + "trace": true, + "expected_trace": [ + "step start", + "step start -> burn", + "assign remaining = -1", + "step burn -> route", + "decide route -> 2->finish", + "step route -> finish", + "step finish -> done", + "complete" + ], + "expected_outputs": { + "landed": { + "kind": "sequence", + "elements": [ + { + "kind": "bool_value", + "value": false + } + ] + } + } +} diff --git a/tests/grpc/testdata/conformance/execute_action_trace.sysml b/tests/grpc/testdata/conformance/execute_action_trace.sysml new file mode 100644 index 0000000000..74444740e8 --- /dev/null +++ b/tests/grpc/testdata/conformance/execute_action_trace.sysml @@ -0,0 +1,21 @@ +package test { + private import ScalarValues::*; + item def Go; + part def Craft; + part craft : Craft; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } +} diff --git a/tests/wasm/combined_test.go b/tests/wasm/combined_test.go index b407bb5d9b..72fe25beda 100644 --- a/tests/wasm/combined_test.go +++ b/tests/wasm/combined_test.go @@ -364,6 +364,7 @@ func TestCombinedWireParity(t *testing.T) { "function_values", "set_values", "tensor_values", "infinity_value", "diagnostic_codes", "schedule", "final_time", "metaobject_values", "undetermined_value", "performer", "big_int_values", "render_view", "state_trace", + "action_trace", } if info.Version != "combined-wire-test" { t.Errorf("GetServerInfo version = %q", info.Version) From 573f6c07d98611cafadfdd40218e5a73ae987ef0 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:19:19 +0000 Subject: [PATCH 02/12] feat(client): trace and events options for ExecuteAction in the Go and Python clients Regenerates the protobuf stubs for the request and response fields. Co-Authored-By: jason.han --- api/proto/sysml.pb.go | 7 +- client/node/src/generated/sysml_pb.ts | 93 +- client/opensysml/documents.go | 22 +- client/opensysml/errors.go | 4 +- client/opensysml/execute.go | 57 +- client/opensysml/explore.go | 5 +- client/opensysml/schedule_internal_test.go | 15 +- client/opensysml/surface_test.go | 70 + client/opensysml/types.go | 1 + client/python/opensysml/action_run.py | 8 +- client/python/opensysml/capabilities.py | 1 + client/python/opensysml/connection.py | 47 +- client/python/opensysml/document.py | 20 +- client/python/opensysml/model.py | 8 +- client/python/opensysml/proto/sysml_pb2.py | 568 +- client/python/opensysml/proto/sysml_pb2.pyi | 28 +- client/python/tests/test_model.py | 2 +- client/python/tests/test_performer.py | 61 + .../rust/conformance/sysml.descriptor.binpb | 7064 +++++++++-------- .../rust/opensysml/src/proto/sysml/sysml.rs | 61 +- 20 files changed, 4313 insertions(+), 3829 deletions(-) diff --git a/api/proto/sysml.pb.go b/api/proto/sysml.pb.go index 29bfd9dff5..55a3a4b92a 100644 --- a/api/proto/sysml.pb.go +++ b/api/proto/sysml.pb.go @@ -5117,8 +5117,11 @@ type ExecuteActionRequest struct { // type no accept node of the performance names is refused, with the accepts // still waiting. The events exhausted, the run goes on to completion (or for // `advance`); a token still waiting at the end is an accept deadlock, - // reported in `error` with the message it waits for. Needs a performer and - // is refused without one with INVALID_ARGUMENT. + // reported in `error` with the message it waits for. Each names a signal or + // item definition, qualified or as the action's namespace sees it; a name no + // definition answers to is matched by name alone, as ExecuteState's events + // are. Posted to the object performer_symbol_id names, as `%send` posts to + // one: INVALID_ARGUMENT without it. Events []string `protobuf:"bytes,11,rep,name=events,proto3" json:"events,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache diff --git a/client/node/src/generated/sysml_pb.ts b/client/node/src/generated/sysml_pb.ts index 0c020a1891..7453fb244c 100644 --- a/client/node/src/generated/sysml_pb.ts +++ b/client/node/src/generated/sysml_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file sysml.proto. */ export const file_sysml: GenFile = /*@__PURE__*/ - fileDesc("CgtzeXNtbC5wcm90bxIFc3lzbWwiqQMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQSIQoFbm90ZXMYEiADKAsyEi5zeXNtbC5WZXJkaWN0Tm90ZSI6CgtWZXJkaWN0Tm90ZRIMCgRraW5kGAEgASgJEg8KB3N1YmplY3QYAiABKAkSDAoEdGV4dBgDIAEoCSJeChFXaXRuZXNzQXNzaWdubWVudBIPCgdmZWF0dXJlGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUSDAoEdW5pdBgDIAEoCRINCgVleGFjdBgEIAEoCSI1CgVCb3VuZBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgDEg8KB3JlYWNoZWQYAyABKAgisAIKF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCRIfCglhcmd1bWVudHMYBiADKAsyDC5zeXNtbC5WYWx1ZRJLCg9uYW1lZF9hcmd1bWVudHMYByADKAsyMi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpYBChhWZXJpZnlDb25zdHJhaW50UmVzcG9uc2USHwoHdmVyZGljdBgBIAEoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljIrICChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJEh8KCWFyZ3VtZW50cxgGIAMoCzIMLnN5c21sLlZhbHVlEkwKD25hbWVkX2FyZ3VtZW50cxgHIAMoCzIzLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpwBChNWZXJpZmljYXRpb25WZXJkaWN0Eg8KB2Nhc2VfaWQYASABKAkSDAoEa2luZBgCIAEoCRIOCgZkZXRhaWwYAyABKAkSDwoHc3ViY2FzZRgEIAEoCBIWCg5yZXF1aXJlbWVudF9pZBgFIAEoCRITCgtpbnN0YW5jZV9pZBgGIAEoAxIYChBpbnN0YW5jZV90eXBlX2lkGAcgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgivAIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkSFAoMdG9vbF9kcnlfcnVuGAggASgIGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIvQCCgpUb29sRHJ5UnVuEg4KBmFjdGlvbhgBIAEoCRIMCgR0b29sGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSEAoIbWFuaWZlc3QYBCABKAkSEgoKZXhlY3V0YWJsZRgFIAEoCRIQCghwcm90b2NvbBgGIAEoCRIMCgRhcmdzGAcgAygJEgsKA2VudhgIIAMoCRILCgNjd2QYCSABKAkSDQoFc3RkaW4YCiABKAkSEgoKc3RkaW5fZGF0YRgLIAEoCRIpCgppbnB1dF9maWxlGAwgASgLMhUuc3lzbWwuVG9vbERyeVJ1bkZpbGUSEgoKb3V0cHV0X2RpchgNIAEoCBImCgZpbnB1dHMYDiADKAsyFi5zeXNtbC5Ub29sRHJ5UnVuSW5wdXQSKAoHb3V0cHV0cxgPIAMoCzIXLnN5c21sLlRvb2xEcnlSdW5PdXRwdXQSFAoMcmVwbHlfc291cmNlGBAgASgJEg0KBWxpbmVzGBEgAygJIjwKDlRvb2xEcnlSdW5GaWxlEgwKBG5hbWUYASABKAkSDgoGZm9ybWF0GAIgASgJEgwKBGRhdGEYAyABKAkiUwoPVG9vbERyeVJ1bklucHV0EhAKCHZhcmlhYmxlGAEgASgJEhEKCXBhcmFtZXRlchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIMCgR1bml0GAQgASgJIjcKEFRvb2xEcnlSdW5PdXRwdXQSEAoIdmFyaWFibGUYASABKAkSEQoJcGFyYW1ldGVyGAIgASgJIoUEChNSdW5BbmFseXNpc1Jlc3BvbnNlEiIKB291dHB1dHMYASADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAIgAygLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSIAoIb3V0Y29tZXMYCCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAkgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSKgoLZXZhbHVhdGlvbnMYCiADKAsyFS5zeXNtbC5DYXNlRXZhbHVhdGlvbhIOCgZlbmdpbmUYCyABKAkSEAoIc3RyZW5ndGgYDCABKAkSHAoGYm91bmRzGA0gAygLMgwuc3lzbWwuQm91bmQSJwoMdG9vbF9kcnlfcnVuGA4gASgLMhEuc3lzbWwuVG9vbERyeVJ1biIsChBQcm9iYWJpbGl0eVJhbmdlEgsKA21pbhgBIAEoARILCgNtYXgYAiABKAEiywIKB091dGNvbWUSLAoHb3V0cHV0cxgBIAMoCzIbLnN5c21sLk91dGNvbWUuT3V0cHV0c0VudHJ5EhMKC2ZpbmFsX3N0YXRlGAIgASgJEhYKDnN0YXRlc192aXNpdGVkGAMgAygJEg0KBWVycm9yGAQgASgJEhYKDmxpbmVhcml6YXRpb25zGAUgASgFEg8KB3dpdG5lc3MYBiADKAkSJgoLZGlhZ25vc3RpY3MYByADKAsyES5zeXNtbC5EaWFnbm9zdGljEhMKC3Byb2JhYmlsaXR5GAggASgBEjIKEXByb2JhYmlsaXR5X3JhbmdlGAkgASgLMhcuc3lzbWwuUHJvYmFiaWxpdHlSYW5nZRo8CgxPdXRwdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIssBChFFeHBsb3JhdGlvblN0YXR1cxIQCghjb21wbGV0ZRgBIAEoCBIMCgRydW5zGAIgASgFEhMKC2J1ZGdldHNfaGl0GAMgAygJEhMKC3J1bnNfYnVkZ2V0GAQgASgFEhQKDGRlcHRoX2J1ZGdldBgFIAEoBRIhChlwcm9iYWJpbGl0aWVzX2xvd2VyX2JvdW5kGAYgASgIEh0KFWZhaWxlZF9saW5lYXJpemF0aW9ucxgHIAEoBRIUCgx1bmVudW1lcmF0ZWQYCCADKAki0QMKFENoZWNrQmVoYXZpb3JSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGAoQYWN0aW9uX3N5bWJvbF9pZBgCIAEoCRIfChdzdGF0ZV9tYWNoaW5lX3N5bWJvbF9pZBgDIAEoCRI3CgZpbnB1dHMYBCADKAsyJy5zeXNtbC5DaGVja0JlaGF2aW9yUmVxdWVzdC5JbnB1dHNFbnRyeRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhYKDmNoZWNrX3Byb3BlcnR5GAYgAygJEhUKDWNoZWNrX2RpdmVyZ2UYByADKAkSEwoLY2hlY2tfaW5wdXQYCCADKAkSFAoMY2hlY2tfYXNzdW1lGAkgAygJEhUKDWNoZWNrX3dpdG5lc3MYCiABKAgSEwoLY2hlY2tfZGVwdGgYCyABKAUSFAoMY2hlY2tfc3RhdGVzGAwgASgFEhQKDGNoZWNrX3Vucm9sbBgNIAEoBRIVCg1jaGVja190aW1lb3V0GA4gASgBEg4KBmVuZ2luZRgPIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEieQoMQ2hlY2tXaXRuZXNzEhAKCHNjaGVkdWxlGAEgASgJEg0KBWRyYXdzGAIgAygJEg8KB2Nob2ljZXMYAyADKAkSDgoGaW5wdXRzGAQgAygJEhEKCWZpbGVfbmFtZRgFIAEoCRIUCgxmaWxlX2NvbnRlbnQYBiABKAkilwEKDkNoZWNrVmlvbGF0aW9uEgwKBGtpbmQYASABKAkSEAoIcHJvcGVydHkYAiABKAkSDQoFZXJyb3IYAyABKAkSDQoFZGVwdGgYBCABKAUSEwoLcHJvYmFiaWxpdHkYBSABKAESJAoHd2l0bmVzcxgGIAEoCzITLnN5c21sLkNoZWNrV2l0bmVzcxIMCgR0ZXh0GAcgASgJIkoKE0NoZWNrRGl2ZXJnZW50VmFsdWUSDQoFdmFsdWUYASABKAkSJAoHd2l0bmVzcxgCIAEoCzITLnN5c21sLkNoZWNrV2l0bmVzcyJOCg9DaGVja0RpdmVyZ2VuY2USDwoHZmVhdHVyZRgBIAEoCRIqCgZ2YWx1ZXMYAiADKAsyGi5zeXNtbC5DaGVja0RpdmVyZ2VudFZhbHVlIqEBCgpDaGVja0ZpbmFsEg8KB291dGNvbWUYASABKAkSLQoGdmFsdWVzGAIgAygLMh0uc3lzbWwuQ2hlY2tGaW5hbC5WYWx1ZXNFbnRyeRIkCgd3aXRuZXNzGAMgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzGi0KC1ZhbHVlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEivQEKC0NoZWNrU2VhcmNoEg4KBnN0YXRlcxgBIAEoBRINCgVtb3ZlcxgCIAEoBRIRCgltYXhfZGVwdGgYAyABKAUSEgoKYm91bmRzX2hpdBgEIAMoCRIPCgdob3Jpem9uGAUgASgBEhMKC2hvcml6b25fc2V0GAYgASgIEhQKDG1hc3NfYm91bmRlZBgHIAEoCBINCgVub3RlcxgIIAMoCRINCgVzY29wZRgJIAMoCRIOCgZzdGF0dXMYCiABKAkiuwMKFUNoZWNrQmVoYXZpb3JSZXNwb25zZRIPCgd2ZXJkaWN0GAEgASgJEg0KBWxpbmVzGAIgAygJEiIKBnNlYXJjaBgDIAEoCzISLnN5c21sLkNoZWNrU2VhcmNoEikKCnZpb2xhdGlvbnMYBCADKAsyFS5zeXNtbC5DaGVja1Zpb2xhdGlvbhIrCgtkaXZlcmdlbmNlcxgFIAMoCzIWLnN5c21sLkNoZWNrRGl2ZXJnZW5jZRIhCgZmaW5hbHMYBiADKAsyES5zeXNtbC5DaGVja0ZpbmFsEg0KBWNsYWltGAcgASgJEhMKC2ZyZWVfaW5wdXRzGAggAygJEhMKC2Fzc3VtcHRpb25zGAkgAygJEiQKB3dpdG5lc3MYCiABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MSJQoIY29udHJhc3QYCyABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MSDgoGZW5naW5lGAwgASgJEhAKCHN0cmVuZ3RoGA0gASgJEhwKBmJvdW5kcxgOIAMoCzIMLnN5c21sLkJvdW5kEg4KBnJlYXNvbhgPIAEoCRINCgVlcnJvchgRIAEoCSIjChJMaXN0RW5naW5lc1JlcXVlc3QSDQoFcHJvYmUYASABKAgi/AEKCkVuZ2luZUluZm8SDAoEbmFtZRgBIAEoCRIRCglhdXRob3JpdHkYAiABKAkSDwoHYW5zd2VycxgDIAMoCRIOCgZib3VuZHMYBCADKAkSDwoHcHJvY2VzcxgFIAEoCRIVCg1wcm9jZXNzX2ZvdW5kGAYgASgJEg0KBXJlYWR5GAcgASgIEhMKC3VuYXZhaWxhYmxlGAggASgJEgwKBGtpbmQYCSABKAkSEAoIcHJvdG9jb2wYCiABKAkSDgoGc291cmNlGAsgASgJEg8KB2NvbW1hbmQYDCABKAkSDwoHdmVyc2lvbhgNIAEoCRIOCgZzZXJ2ZWQYDiABKAgiOQoTTGlzdEVuZ2luZXNSZXNwb25zZRIiCgdlbmdpbmVzGAEgAygLMhEuc3lzbWwuRW5naW5lSW5mbyKMAQoQUGFyc2VGaWxlUmVxdWVzdBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASGAoMY29udGVudF9oYXNoGAMgASgJQgIYARIQCghsYW5ndWFnZRgEIAEoCRIaChJzdHJpY3RfY29uZm9ybWFuY2UYBSABKAhCCAoGc291cmNlImIKDlNvdXJjZURvY3VtZW50EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIQCghsYW5ndWFnZRgDIAEoCRIMCgRuYW1lGAQgASgJQggKBnNvdXJjZSJ0ChNQYXJzZVNvdXJjZXNSZXF1ZXN0EigKCWRvY3VtZW50cxgBIAMoCzIVLnN5c21sLlNvdXJjZURvY3VtZW50EhoKEnN0cmljdF9jb25mb3JtYW5jZRgCIAEoCBIXCg9iYXNlX21vZGVsX2hhc2gYAyABKAkilQEKFFBhcnNlU291cmNlc1Jlc3BvbnNlEhIKCm1vZGVsX2hhc2gYASABKAkSIAoFcm9vdHMYAiADKAsyES5zeXNtbC5TeW1ib2xJbmZvEiYKC2RpYWdub3N0aWNzGAMgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgEIAEoCRIQCghhZmZlY3RlZBgFIAMoCSJ/ChFQYXJzZUZpbGVSZXNwb25zZRISCgptb2RlbF9oYXNoGAEgASgJEh8KBHJvb3QYAiABKAsyES5zeXNtbC5TeW1ib2xJbmZvEiYKC2RpYWdub3N0aWNzGAMgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgEIAEoCSI5ChBHZXRTeW1ib2xSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIkIKDlN5bWJvbFJlc3BvbnNlEiEKBnN5bWJvbBgBIAEoCzIRLnN5c21sLlN5bWJvbEluZm8SDQoFZXJyb3IYAiABKAkiUwoSRGlhZ25vc3RpY3NSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSFAoMZGlzYWJsZV9saW50GAIgAygJEhMKC2VuYWJsZV9saW50GAMgAygJIkwKE0RpYWdub3N0aWNzUmVzcG9uc2USJgoLZGlhZ25vc3RpY3MYASADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAIgASgJIm8KD0V2YWx1YXRlUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhIKCmV4cHJlc3Npb24YAiABKAkSGQoRY29udGV4dF9zeW1ib2xfaWQYAyABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYBCABKAkiZwoQRXZhbHVhdGVSZXNwb25zZRIcCgZyZXN1bHQYASABKAsyDC5zeXNtbC5WYWx1ZRINCgVlcnJvchgCIAEoCRImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMiwgEKCEluc3RhbmNlEgoKAmlkGAEgASgDEhYKDnR5cGVfc3ltYm9sX2lkGAIgASgJEjoKDmZlYXR1cmVfdmFsdWVzGAQgAygLMiIuc3lzbWwuSW5zdGFuY2UuRmVhdHVyZVZhbHVlc0VudHJ5GkkKEkZlYXR1cmVWYWx1ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy5zeXNtbC5GZWF0dXJlVmFsdWU6AjgBSgQIAxAEUgVzbG90cyKdAQoMRmVhdHVyZVZhbHVlEhQKDGZlYXR1cmVfbmFtZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEhwKBnZhbHVlcxgDIAMoCzIMLnN5c21sLlZhbHVlEhQKDG1hdGVyaWFsaXplZBgEIAEoCBINCgVlcnJvchgFIAEoCRIXCg9vcmRlcl9kZXBlbmRlbnQYBiABKAUiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIsoCChRFeGVjdXRlQWN0aW9uUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhgKEGFjdGlvbl9zeW1ib2xfaWQYAiABKAkSNwoGaW5wdXRzGAMgAygLMicuc3lzbWwuRXhlY3V0ZUFjdGlvblJlcXVlc3QuSW5wdXRzRW50cnkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRIUCgdhZHZhbmNlGAYgASgBSACIAQESEQoEc2VlZBgHIAEoBEgBiAEBEg0KBWRyYXdzGAggASgJEhIKCmNsb2NrX3N0ZXAYCSABKAEaOwoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBQgoKCF9hZHZhbmNlQgcKBV9zZWVkIs4EChVFeGVjdXRlQWN0aW9uUmVzcG9uc2USOgoHb3V0cHV0cxgBIAMoCzIpLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PdXRwdXRzRW50cnkSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiAKCG91dGNvbWVzGAQgAygLMg4uc3lzbWwuT3V0Y29tZRItCgtleHBsb3JhdGlvbhgFIAEoCzIYLnN5c21sLkV4cGxvcmF0aW9uU3RhdHVzEhIKCmZpbmFsX3RpbWUYBiABKAESUwoUcGVyZm9ybWVyX2F0dHJpYnV0ZXMYByADKAsyNS5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2UuUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EkkKD29yZGVyX2RlcGVuZGVudBgIIAMoCzIwLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5GjwKDE91dHB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaSAoYUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEi+QEKE0V4ZWN1dGVTdGF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIfChdzdGF0ZV9tYWNoaW5lX3N5bWJvbF9pZBgCIAEoCRIOCgZldmVudHMYAyADKAkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRINCgV0cmFjZRgGIAEoCBIUCgdhZHZhbmNlGAcgASgBSACIAQESEQoEc2VlZBgIIAEoBEgBiAEBEg0KBWRyYXdzGAkgASgJEhIKCmNsb2NrX3N0ZXAYCiABKAFCCgoIX2FkdmFuY2VCBwoFX3NlZWQikAQKFEV4ZWN1dGVTdGF0ZVJlc3BvbnNlEhYKDnN0YXRlc192aXNpdGVkGAEgAygJEkQKDWZpbmFsX2NvbnRleHQYAiADKAsyLS5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5GaW5hbENvbnRleHRFbnRyeRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBSADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAYgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgHIAEoARIjCgV0cmFjZRgIIAMoCzIULnN5c21sLkRvY3VtZW50RXZlbnQSFQoNdHJhY2VfZHJvcHBlZBgJIAEoBRJICg9vcmRlcl9kZXBlbmRlbnQYCiADKAsyLy5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5GkEKEUZpbmFsQ29udGV4dEVudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEiwwIKDkNvbnZlcnRSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIUCgptb2RlbF9oYXNoGAYgASgJSAASEwoLZnJvbV9mb3JtYXQYAyABKAkSEQoJdG9fZm9ybWF0GAQgASgJEh4KFnRvbGVyYXRlX3N5bnRheF9lcnJvcnMYBSABKAgSDwoHaWRfZm9ybRgHIAEoCRIRCglkb2N1bWVudHMYCCADKAkSDwoHY29tcGFjdBgJIAEoCBIUCgxvbWl0X2Rlcml2ZWQYCiABKAgSFAoMa2VlcF9kZXJpdmVkGAsgAygJEiEKGWluY2x1ZGVfY2hlY2tfZGlhZ25vc3RpY3MYDCABKAgSHQoVaW5jbHVkZV9saWJyYXJ5X3N0dWJzGA0gASgIQggKBnNvdXJjZSLpAQoPQ29udmVydFJlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSEwoLZnJvbV9mb3JtYXQYAiABKAkSEQoJdG9fZm9ybWF0GAMgASgJEg0KBWVycm9yGAQgASgJEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIUCgxleHBlcmltZW50YWwYBiABKAgSGwoTZXhwZXJpbWVudGFsX25vdGljZRgHIAEoCRIzChJsaWJyYXJ5X3JlZmVyZW5jZXMYCCADKAsyFy5zeXNtbC5MaWJyYXJ5UmVmZXJlbmNlIkQKEExpYnJhcnlSZWZlcmVuY2USCgoCaWQYASABKAkSFgoOcXVhbGlmaWVkX25hbWUYAiABKAkSDAoEdHlwZRgDIAEoCSLuAQoOTWlncmF0ZVJlcXVlc3QSEwoJZmlsZV9wYXRoGAEgASgJSAASEQoHY29udGVudBgCIAEoDEgAEhMKC2Zyb21fZm9ybWF0GAMgASgJEhEKCXRvX2Zvcm1hdBgEIAEoCRIOCgZyZXBvcnQYBSABKAgSDwoHcmVzdWx0cxgGIAEoCBIVCgtsYXlvdXRfcGF0aBgHIAEoCUgBEhgKDmxheW91dF9jb250ZW50GAggASgJSAESFgoOaW1hZ2VfYmFzZV91cmwYCSABKAkSDgoGc3RyaWN0GAogASgIQggKBnNvdXJjZUIICgZsYXlvdXQi6gEKD01pZ3JhdGVSZXNwb25zZRIPCgdjb250ZW50GAEgASgJEhMKC2Zyb21fZm9ybWF0GAIgASgJEhEKCXRvX2Zvcm1hdBgDIAEoCRINCgVlcnJvchgEIAEoCRIUCgxleHBlcmltZW50YWwYBSABKAgSGwoTZXhwZXJpbWVudGFsX25vdGljZRgGIAEoCRImCgZyZXBvcnQYByABKAsyFi5zeXNtbC5NaWdyYXRpb25SZXBvcnQSDwoHcmVzdWx0cxgIIAEoCRIjCgVmaWxlcxgJIAMoCzIULnN5c21sLk1pZ3JhdGlvbkZpbGUiwwEKD01pZ3JhdGlvblJlcG9ydBIOCgZzb3VyY2UYASABKAkSEAoIZXhwb3J0ZXIYAiABKAkSDwoHc3VtbWFyeRgDIAEoCRIOCgZtYXBwZWQYBCABKAUSFAoMYXBwcm94aW1hdGVkGAUgASgFEhAKCHVubWFwcGVkGAYgASgFEg8KB3NraXBwZWQYByABKAUSJgoHZW50cmllcxgIIAMoCzIVLnN5c21sLk1pZ3JhdGlvbkVudHJ5EgwKBHRleHQYCSABKAkiZwoOTWlncmF0aW9uRW50cnkSCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEg4KBnRhcmdldBgEIAEoCRIPCgd2ZXJkaWN0GAUgASgJEgwKBG5vdGUYBiABKAkiLgoNTWlncmF0aW9uRmlsZRIMCgRwYXRoGAEgASgJEg8KB2NvbnRlbnQYAiABKAwifQoRQXBwbHlFZGl0c1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIoCgpvcGVyYXRpb25zGAIgAygLMhQuc3lzbWwuRWRpdE9wZXJhdGlvbhIQCghkb2N1bWVudBgDIAEoCRIYChBhY2NlcHRfZG9jdW1lbnRzGAQgASgIIsMGCg1FZGl0T3BlcmF0aW9uEigKCXNldF92YWx1ZRgBIAEoCzITLnN5c21sLlNldFZhbHVlRWRpdEgAEiMKBnJlbmFtZRgCIAEoCzIRLnN5c21sLlJlbmFtZUVkaXRIABIqCgphZGRfbWVtYmVyGAMgASgLMhQuc3lzbWwuQWRkTWVtYmVyRWRpdEgAEiMKBmRlbGV0ZRgEIAEoCzIRLnN5c21sLkRlbGV0ZUVkaXRIABIfCgRtb3ZlGAUgASgLMg8uc3lzbWwuTW92ZUVkaXRIABIyCg5hZGRfY29ubmVjdGlvbhgGIAEoCzIYLnN5c21sLkFkZENvbm5lY3Rpb25FZGl0SAASLAoLYWRkX3NhdGlzZnkYByABKAsyFS5zeXNtbC5BZGRTYXRpc2Z5RWRpdEgAEkkKGmFkZF9yZXF1aXJlbWVudF9jb25zdHJhaW50GAggASgLMiMuc3lzbWwuQWRkUmVxdWlyZW1lbnRDb25zdHJhaW50RWRpdEgAEjIKDmFkZF90cmFuc2l0aW9uGAkgASgLMhguc3lzbWwuQWRkVHJhbnNpdGlvbkVkaXRIABIqCgphZGRfaW1wb3J0GAogASgLMhQuc3lzbWwuQWRkSW1wb3J0RWRpdEgAEjgKEWFkZF9kb2N1bWVudGF0aW9uGAsgASgLMhsuc3lzbWwuQWRkRG9jdW1lbnRhdGlvbkVkaXRIABIqCgphZGRfdmVyaWZ5GAwgASgLMhQuc3lzbWwuQWRkVmVyaWZ5RWRpdEgAEi4KDGFkZF9tZXRhZGF0YRgNIAEoCzIWLnN5c21sLkFkZE1ldGFkYXRhRWRpdEgAEi4KDGFkZF9zZXF1ZW5jZRgOIAEoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdEgAEjsKE2FkZF9tZXRhZGF0YV9wcmVmaXgYDyABKAsyHC5zeXNtbC5BZGRNZXRhZGF0YVByZWZpeEVkaXRIABIsCgthZGRfY29tbWVudBgQIAEoCzIVLnN5c21sLkFkZENvbW1lbnRFZGl0SAASJgoIYWRkX25vdGUYEiABKAsyEi5zeXNtbC5BZGROb3RlRWRpdEgAQgsKCW9wZXJhdGlvbiKSAgoNQWRkTWVtYmVyRWRpdBINCgVvd25lchgBIAEoCRIMCgRraW5kGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEdHlwZRgEIAEoCRIUCgxtdWx0aXBsaWNpdHkYBSABKAkSDQoFdmFsdWUYBiABKAkSEwoLc3BlY2lhbGl6ZXMYByADKAkSEwoLaXNfYWJzdHJhY3QYCCABKAgSEQoJcmVkZWZpbmVzGAkgAygJEhIKCmlzX2RlZmF1bHQYCiABKAgSEQoJZGlyZWN0aW9uGAsgASgJEhkKEW1ldGFkYXRhX3ByZWZpeGVzGA4gAygJEgsKA2RvYxgMIAEoCRIXCg9ib2R5X2V4cHJlc3Npb24YDSABKAkieQoOQWRkU2F0aXNmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkSGgoSc2F0aXNmeWluZ19mZWF0dXJlGAMgASgJEhMKC2lzX2Fzc2VydGVkGAQgASgIEhIKCmlzX25lZ2F0ZWQYBSABKAgiXQocQWRkUmVxdWlyZW1lbnRDb25zdHJhaW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRraW5kGAIgASgJEhIKCmV4cHJlc3Npb24YAyABKAkSDAoEbmFtZRgEIAEoCSKRAQoRQWRkVHJhbnNpdGlvbkVkaXQSDQoFb3duZXIYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZzb3VyY2UYAyABKAkSDgoGdGFyZ2V0GAQgASgJEg8KB3RyaWdnZXIYBSABKAkSDQoFZ3VhcmQYBiABKAkSDgoGZWZmZWN0GAcgASgJEg8KB2luaXRpYWwYCCABKAgiMwoNQWRkVmVyaWZ5RWRpdBINCgVvd25lchgBIAEoCRITCgtyZXF1aXJlbWVudBgCIAEoCSI2ChRNZXRhZGF0YUZlYXR1cmVWYWx1ZRIPCgdmZWF0dXJlGAEgASgJEg0KBXZhbHVlGAIgASgJIpQBCg9BZGRNZXRhZGF0YUVkaXQSDQoFb3duZXIYASABKAkSFQoNbWV0YWRhdGFfdHlwZRgCIAEoCRIMCgRuYW1lGAMgASgJEg0KBWFib3V0GAQgAygJEisKBnZhbHVlcxgFIAMoCzIbLnN5c21sLk1ldGFkYXRhRmVhdHVyZVZhbHVlEhEKCXNob3J0aGFuZBgGIAEoCCI+ChVBZGRNZXRhZGF0YVByZWZpeEVkaXQSDgoGdGFyZ2V0GAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkigAEKDUFkZEltcG9ydEVkaXQSDQoFb3duZXIYASABKAkSEgoKdmlzaWJpbGl0eRgCIAEoCRIOCgZ0YXJnZXQYAyABKAkSFAoMaXNfcmVjdXJzaXZlGAQgASgIEhUKDWlzX2ltcG9ydF9hbGwYBSABKAgSDwoHZmlsdGVycxgGIAMoCSJjChRBZGREb2N1bWVudGF0aW9uRWRpdBIOCgZ0YXJnZXQYASABKAkSDAoEYm9keRgCIAEoCRIMCgRuYW1lGAMgASgJEg4KBmxvY2FsZRgEIAEoCRIPCgdyZXBsYWNlGAUgASgIIloKDkFkZENvbW1lbnRFZGl0Eg0KBW93bmVyGAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIOCgZsb2NhbGUYBSABKAkiKwoLQWRkTm90ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBHRleHQYAiABKAkizQIKD0FkZFNlcXVlbmNlRWRpdBINCgVvd25lchgBIAEoCRIPCgdrZXl3b3JkGAIgASgJEgsKA3JlZhgDIAEoCRITCgttZW1iZXJfa2luZBgEIAEoCRITCgttZW1iZXJfbmFtZRgFIAEoCRIMCgR0eXBlGAYgASgJEg0KBWFmdGVyGAcgASgJEhEKCWNvbmRpdGlvbhgIIAEoCRINCgV2YWx1ZRgJIAEoCRIOCgZ0YXJnZXQYCiABKAkSCwoDdmlhGAsgASgJEg0KBXVudGlsGAwgASgJEiQKBGJvZHkYDSADKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXQSKQoJZWxzZV9ib2R5GA4gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EhQKDG11bHRpcGxpY2l0eRgPIAEoCRIRCglwYXJhbWV0ZXIYECABKAkibgoRQWRkQ29ubmVjdGlvbkVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIQCghmcm9tX2VuZBgDIAEoCRIOCgZ0b19lbmQYBCABKAkSDAoEbmFtZRgFIAEoCRIMCgR0eXBlGAYgASgJIi0KCkRlbGV0ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg8KB2Nhc2NhZGUYAiABKAgiKQoITW92ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBW93bmVyGAIgASgJIi0KDFNldFZhbHVlRWRpdBIOCgZ0YXJnZXQYASABKAkSDQoFdmFsdWUYAiABKAkiLgoKUmVuYW1lRWRpdBIOCgZ0YXJnZXQYASABKAkSEAoIbmV3X25hbWUYAiABKAkikAIKEkFwcGx5RWRpdHNSZXNwb25zZRIPCgdjb250ZW50GAEgASgJEiMKB2FwcGxpZWQYAiADKAsyEi5zeXNtbC5BcHBsaWVkRWRpdBINCgVlcnJvchgDIAEoCRIjCgdmYWlsdXJlGAQgASgOMhIuc3lzbWwuRWRpdEZhaWx1cmUSJgoLZGlhZ25vc3RpY3MYBSADKAsyES5zeXNtbC5EaWFnbm9zdGljEhoKEnJlZmVycmluZ19lbGVtZW50cxgGIAMoCRIoCglkb2N1bWVudHMYByADKAsyFS5zeXNtbC5FZGl0ZWREb2N1bWVudBIiCglyZWZlcnJlcnMYCCADKAsyDy5zeXNtbC5SZWZlcnJlciIvCg5FZGl0ZWREb2N1bWVudBIMCgRuYW1lGAEgASgJEg8KB2NvbnRlbnQYAiABKAkiKgoIUmVmZXJyZXISDAoEbmFtZRgBIAEoCRIQCghkb2N1bWVudBgCIAEoCSKMAQoLQXBwbGllZEVkaXQSFwoPb3BlcmF0aW9uX2luZGV4GAEgASgFEg4KBnRhcmdldBgCIAEoCRIOCgZvZmZzZXQYAyABKAUSDgoGbGVuZ3RoGAQgASgFEhAKCG9sZF90ZXh0GAUgASgJEhAKCG5ld190ZXh0GAYgASgJEhAKCGRvY3VtZW50GAcgASgJIv0CCgpTeW1ib2xJbmZvEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEa2luZBgDIAEoCRIxCghtZXRhZGF0YRgEIAMoCzIfLnN5c21sLlN5bWJvbEluZm8uTWV0YWRhdGFFbnRyeRIRCgljaGlsZF9pZHMYBSADKAkSKAoKYXR0cmlidXRlcxgGIAMoCzIULnN5c21sLkF0dHJpYnV0ZUluZm8SIgoJdHlwZV9pbmZvGAcgASgLMg8uc3lzbWwuVHlwZUluZm8SLQoMbXVsdGlwbGljaXR5GAggASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbxIuCg9zcGVjaWFsaXphdGlvbnMYCSADKAsyFS5zeXNtbC5TcGVjaWFsaXphdGlvbhIjCht3aXRoaGVsZF9saWJyYXJ5X2F0dHJpYnV0ZXMYCiABKAUaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIlgKDlNwZWNpYWxpemF0aW9uEgwKBGtpbmQYASABKAkSEAoIZGVjbGFyZWQYAiABKAkSEQoJdGFyZ2V0X2lkGAMgASgJEhMKC3RhcmdldF9raW5kGAQgASgJIpUBCghUeXBlSW5mbxIQCghkZWNsYXJlZBgBIAEoCRITCgtyZXNvbHZlZF9pZBgCIAEoCRIVCg1yZXNvbHZlZF9raW5kGAMgASgJEhEKCXByaW1pdGl2ZRgEIAEoCRIYChBwcmltaXRpdmVfc291cmNlGAUgASgJEhAKCHF1YW50aXR5GAYgASgIEgwKBHVuaXQYByABKAkiMAoQTXVsdGlwbGljaXR5SW5mbxINCgVsb3dlchgBIAEoCRINCgV1cHBlchgCIAEoCSJWCg1BdHRyaWJ1dGVJbmZvEgwKBG5hbWUYASABKAkSDAoEdHlwZRgCIAEoCRIbCgV2YWx1ZRgDIAEoCzIMLnN5c21sLlZhbHVlEgwKBHVuaXQYBCABKAkihwYKBVZhbHVlEhMKCWludF92YWx1ZRgBIAEoA0gAEhQKCnJlYWxfdmFsdWUYAiABKAFIABIUCgpib29sX3ZhbHVlGAMgASgISAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFQoLaW5zdGFuY2VfaWQYBSABKANIABIoCghzZXF1ZW5jZRgGIAEoCzIULnN5c21sLlZhbHVlU2VxdWVuY2VIABIOCgRudWxsGAcgASgJSAASIwoIcXVhbnRpdHkYCCABKAsyDy5zeXNtbC5RdWFudGl0eUgAEioKDGVudW1fbGl0ZXJhbBgJIAEoCzISLnN5c21sLkVudW1MaXRlcmFsSAASDwoFdW5zZXQYCiABKAhIABIhCgdjb21wbGV4GAsgASgLMg4uc3lzbWwuQ29tcGxleEgAEh0KBWFycmF5GAwgASgLMgwuc3lzbWwuQXJyYXlIABIfCgZ2ZWN0b3IYDSABKAsyDS5zeXNtbC5WZWN0b3JIABIwCg92ZWN0b3JfcXVhbnRpdHkYDiABKAsyFS5zeXNtbC5WZWN0b3JRdWFudGl0eUgAEjAKD21lYXN1cmVtZW50X3JlZhgPIAEoCzIVLnN5c21sLk1lYXN1cmVtZW50UmVmSAASEgoIaW5maW5pdHkYECABKAhIABIjCghmdW5jdGlvbhgRIAEoCzIPLnN5c21sLkZ1bmN0aW9uSAASHgoDc2V0GBIgASgLMg8uc3lzbWwuVmFsdWVTZXRIABIwCg90ZW5zb3JfcXVhbnRpdHkYEyABKAsyFS5zeXNtbC5UZW5zb3JRdWFudGl0eUgAEicKCm1ldGFvYmplY3QYFCABKAsyES5zeXNtbC5NZXRhb2JqZWN0SAASKwoMdW5kZXRlcm1pbmVkGBUgASgLMhMuc3lzbWwuVW5kZXRlcm1pbmVkSAASFwoNYmlnX2ludF92YWx1ZRgWIAEoCUgAEikKDnJhdGlvbmFsX3ZhbHVlGBcgASgLMg8uc3lzbWwuUmF0aW9uYWxIAEIGCgRraW5kIjIKCFJhdGlvbmFsEhEKCW51bWVyYXRvchgBIAEoCRITCgtkZW5vbWluYXRvchgCIAEoCSI2CgpNZXRhb2JqZWN0EhIKCmVsZW1lbnRfaWQYASABKAkSFAoMbWV0YWNsYXNzX2lkGAIgASgJIkYKDFVuZGV0ZXJtaW5lZBIOCgZyZWFzb24YASABKAkSJgoFY291bnQYAiABKAsyFy5zeXNtbC5NdWx0aXBsaWNpdHlJbmZvIiwKCEZ1bmN0aW9uEg8KB2NhbGNfaWQYASABKAkSDwoHc2VsZl9pZBgCIAEoAyIqCghWYWx1ZVNldBIeCghlbGVtZW50cxgBIAMoCzIMLnN5c21sLlZhbHVlIkkKDlRlbnNvclF1YW50aXR5EhIKCmRpbWVuc2lvbnMYASADKAMSIwoKY29tcG9uZW50cxgCIAMoCzIPLnN5c21sLlF1YW50aXR5IjsKBUFycmF5EhIKCmRpbWVuc2lvbnMYASADKAMSHgoIZWxlbWVudHMYAiADKAsyDC5zeXNtbC5WYWx1ZSIqCgZWZWN0b3ISIAoKY29tcG9uZW50cxgBIAMoCzIMLnN5c21sLlZhbHVlIjUKDlZlY3RvclF1YW50aXR5EiMKCmNvbXBvbmVudHMYASADKAsyDy5zeXNtbC5RdWFudGl0eSIqCgdDb21wbGV4EgwKBHJlYWwYASABKAESEQoJaW1hZ2luYXJ5GAIgASgBImQKC0VudW1MaXRlcmFsEhIKCmxpdGVyYWxfaWQYASABKAkSFgoOZW51bWVyYXRpb25faWQYAiABKAkSDAoEbmFtZRgDIAEoCRIbCgV2YWx1ZRgEIAEoCzIMLnN5c21sLlZhbHVlIi8KDVZhbHVlU2VxdWVuY2USHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSLIAQoIUXVhbnRpdHkSFwoNaW50X21hZ25pdHVkZRgBIAEoA0gAEhgKDnJlYWxfbWFnbml0dWRlGAIgASgBSAASGwoRYmlnX2ludF9tYWduaXR1ZGUYBSABKAlIABItChJyYXRpb25hbF9tYWduaXR1ZGUYBiABKAsyDy5zeXNtbC5SYXRpb25hbEgAEgwKBHVuaXQYAyABKAkSIgoJdW5pdF90ZXJtGAQgASgLMg8uc3lzbWwuVW5pdFRlcm1CCwoJbWFnbml0dWRlIlMKDk1lYXN1cmVtZW50UmVmEgwKBHVuaXQYASABKAkSIgoJdW5pdF90ZXJtGAIgASgLMg8uc3lzbWwuVW5pdFRlcm0SDwoHdW5pdF9pZBgDIAEoCSJUCghVbml0VGVybRIRCglzY2FsZV9udW0YASABKAESEQoJc2NhbGVfZGVuGAIgASgBEiIKB2ZhY3RvcnMYAyADKAsyES5zeXNtbC5Vbml0RmFjdG9yIi8KClVuaXRGYWN0b3ISDwoHdW5pdF9pZBgBIAEoCRIQCghleHBvbmVudBgCIAEoASKGAQoKRGlhZ25vc3RpYxIQCghzZXZlcml0eRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhkKBHNwYW4YAyABKAsyCy5zeXNtbC5TcGFuEgwKBGNvZGUYBCABKAkSFwoPb3JkZXJfZGVwZW5kZW50GAUgAygJEhMKC2luZGVwZW5kZW50GAYgASgIIl4KBFNwYW4SDAoEZmlsZRgBIAEoCRISCgpzdGFydF9saW5lGAIgASgFEhEKCXN0YXJ0X2NvbBgDIAEoBRIQCghlbmRfbGluZRgEIAEoBRIPCgdlbmRfY29sGAUgASgFIhMKEVNlcnZlckluZm9SZXF1ZXN0IjsKElNlcnZlckluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhQKDGNhcGFiaWxpdGllcxgCIAMoCSJTCgxRdWVyeVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIbCgVxdWVyeRgCIAEoCzIMLnN5c21sLlF1ZXJ5EhIKCm9zbGNfcXVlcnkYAyABKAkiPAoNUXVlcnlSZXNwb25zZRIrCghlbGVtZW50cxgBIAMoCzIZLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudCJaCgVRdWVyeRINCgVzY29wZRgBIAMoCRIOCgZzZWxlY3QYAiADKAkSIAoFd2hlcmUYAyABKAsyES5zeXNtbC5Db25zdHJhaW50EhAKCG9yZGVyX2J5GAQgAygJInwKCkNvbnN0cmFpbnQSLwoJcHJpbWl0aXZlGAEgASgLMhouc3lzbWwuUHJpbWl0aXZlQ29uc3RyYWludEgAEi8KCWNvbXBvc2l0ZRgCIAEoCzIaLnN5c21sLkNvbXBvc2l0ZUNvbnN0cmFpbnRIAEIMCgpjb25zdHJhaW50InMKE1ByaW1pdGl2ZUNvbnN0cmFpbnQSDwoHaW52ZXJzZRgBIAEoCBIQCghwcm9wZXJ0eRgCIAEoCRIqCghvcGVyYXRvchgDIAEoDjIYLnN5c21sLlByaW1pdGl2ZU9wZXJhdG9yEg0KBXZhbHVlGAQgAygJImgKE0NvbXBvc2l0ZUNvbnN0cmFpbnQSKgoIb3BlcmF0b3IYASABKA4yGC5zeXNtbC5Db21wb3NpdGVPcGVyYXRvchIlCgpjb25zdHJhaW50GAIgAygLMhEuc3lzbWwuQ29uc3RyYWludCKgAQoSUXVlcnlSZXN1bHRFbGVtZW50EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSPQoKcHJvcGVydGllcxgDIAMoCzIpLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudC5Qcm9wZXJ0aWVzRW50cnkaMQoPUHJvcGVydGllc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicwoKU3dlZXBSYW5nZRIRCglwYXJhbWV0ZXIYASABKAkSGwoFc3RhcnQYAiABKAsyDC5zeXNtbC5WYWx1ZRIZCgNlbmQYAyABKAsyDC5zeXNtbC5WYWx1ZRIaCgRzdGVwGAQgASgLMgwuc3lzbWwuVmFsdWUi0AIKD1J1blN3ZWVwUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJDCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyKi5zeXNtbC5SdW5Td2VlcFJlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIhCgZyYW5nZXMYBiADKAsyES5zeXNtbC5Td2VlcFJhbmdlEg8KB3NhbXBsZXMYByABKAMSDAoEc2VlZBgIIAEoBBIOCgZlbmdpbmUYCSABKAkaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEi9AEKCFN3ZWVwUm93EiEKBmlucHV0cxgBIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYAyADKAsyDi5zeXNtbC5WZXJkaWN0EhYKDmVsYXBzZWRfbWljcm9zGAQgASgDEg0KBWVycm9yGAUgASgJEiwKDmZhaWx1cmVfcmVhc29uGAYgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIqCgtldmFsdWF0aW9ucxgHIAMoCzIVLnN5c21sLkNhc2VFdmFsdWF0aW9uIq0CChBSdW5Td2VlcFJlc3BvbnNlEh0KBHJvd3MYASADKAsyDy5zeXNtbC5Td2VlcFJvdxISCgpwYXJhbWV0ZXJzGAIgAygJEg8KB3NhbXBsZWQYAyABKAgSDAoEc2VlZBgEIAEoBBINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YByABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiIKCWluc3RhbmNlcxgIIAMoCzIPLnN5c21sLkluc3RhbmNlEg4KBmVuZ2luZRgJIAEoCRIQCghzdHJlbmd0aBgKIAEoCRIcCgZib3VuZHMYCyADKAsyDC5zeXNtbC5Cb3VuZCKaBAoOUnVuUnVuc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIYChBhY3Rpb25fc3ltYm9sX2lkGAIgASgJEhoKEmFuYWx5c2lzX3N5bWJvbF9pZBgDIAEoCRIxCgZpbnB1dHMYBCADKAsyIS5zeXNtbC5SdW5SdW5zUmVxdWVzdC5JbnB1dHNFbnRyeRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAYgASgJEh8KCWFyZ3VtZW50cxgHIAMoCzIMLnN5c21sLlZhbHVlEkIKD25hbWVkX2FyZ3VtZW50cxgIIAMoCzIpLnN5c21sLlJ1blJ1bnNSZXF1ZXN0Lk5hbWVkQXJndW1lbnRzRW50cnkSDAoEcnVucxgJIAEoAxIRCgRzZWVkGAogASgESACIAQESDQoFZHJhd3MYCyABKAkSEgoKY2xvY2tfc3RlcBgMIAEoARIPCgdvYnNlcnZlGA0gAygJEg4KBmVuZ2luZRgOIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAFCBwoFX3NlZWQisAIKD1J1bkRpc3RyaWJ1dGlvbhIMCgRuYW1lGAEgASgJEgwKBHVuaXQYAiABKAkSDQoFY291bnQYAyABKAMSDwoHbnVtZXJpYxgEIAEoCBIZCgNtaW4YBSABKAsyDC5zeXNtbC5WYWx1ZRIZCgNtYXgYBiABKAsyDC5zeXNtbC5WYWx1ZRIaCgRtZWFuGAcgASgLMgwuc3lzbWwuVmFsdWUSEQoJZGV2aWF0aW9uGAggASgBEikKC3BlcmNlbnRpbGVzGAkgAygLMhQuc3lzbWwuUnVuUGVyY2VudGlsZRIpCgloaXN0b2dyYW0YCiADKAsyFi5zeXNtbC5SdW5IaXN0b2dyYW1CaW4SJgoGdmFsdWVzGAsgAygLMhYuc3lzbWwuUnVuQ291bnRlZFZhbHVlIkAKDVJ1blBlcmNlbnRpbGUSEgoKcGVyY2VudGlsZRgBIAEoARIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlIlcKD1J1bkhpc3RvZ3JhbUJpbhIZCgNsb3cYASABKAsyDC5zeXNtbC5WYWx1ZRIaCgRoaWdoGAIgASgLMgwuc3lzbWwuVmFsdWUSDQoFY291bnQYAyABKAMiPQoPUnVuQ291bnRlZFZhbHVlEhsKBXZhbHVlGAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFY291bnQYAiABKAMiQgoQU2VsZkNoZWNrUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhoKEnNlbGZfY2hlY2tfcGFja2FnZRgCIAMoCSKJAQoQU2VsZkNoZWNrRmluZGluZxIOCgZzdGF0dXMYASABKAkSDwoHc3ViamVjdBgCIAEoCRIQCghsb2NhdGlvbhgDIAEoCRISCgpjb25zdHJhaW50GAQgASgJEg8KB2VsZW1lbnQYBSABKAkSDwoHbWVzc2FnZRgGIAEoCRIMCgRsaW5lGAcgASgJIjkKFFNlbGZDaGVja0FwcGxpY2F0aW9uEhIKCmNvbnN0cmFpbnQYASABKAkSDQoFY291bnQYAiABKAMirwIKEVNlbGZDaGVja1Jlc3BvbnNlEg4KBnN0YXR1cxgBIAEoCRIpCghmaW5kaW5ncxgCIAMoCzIXLnN5c21sLlNlbGZDaGVja0ZpbmRpbmcSEAoIZWxlbWVudHMYAyABKAMSDgoGY2hlY2tzGAQgASgDEhIKCnZpb2xhdGlvbnMYBSABKAMSEwoLdW5ldmFsdWF0ZWQYBiABKAMSGQoRZXZhbHVhdGlvbl9lcnJvcnMYByABKAMSMQoMYXBwbGljYXRpb25zGAggAygLMhsuc3lzbWwuU2VsZkNoZWNrQXBwbGljYXRpb24SDwoHc3VtbWFyeRgJIAEoCRINCgVlcnJvchgKIAEoCRImCgtkaWFnbm9zdGljcxgLIAMoCzIRLnN5c21sLkRpYWdub3N0aWMilQMKEFJlY29yZFJ1blJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIaChJhbmFseXNpc19zeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSHwoJYXJndW1lbnRzGAQgAygLMgwuc3lzbWwuVmFsdWUSRAoPbmFtZWRfYXJndW1lbnRzGAUgAygLMisuc3lzbWwuUmVjb3JkUnVuUmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5Eg4KBmVuZ2luZRgGIAEoCRITCgtyZWNvcmRfaW50bxgHIAEoCRIhCgZyYW5nZXMYCCADKAsyES5zeXNtbC5Td2VlcFJhbmdlEgwKBHJ1bnMYCSABKAMSEQoEc2VlZBgKIAEoBEgAiAEBEhgKEGFjY2VwdF9kb2N1bWVudHMYCyABKAgaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAFCBwoFX3NlZWQiqAMKEVJlY29yZFJ1blJlc3BvbnNlEicKA3J1bhgBIAEoCzIaLnN5c21sLlJ1bkFuYWx5c2lzUmVzcG9uc2USJgoFc3dlZXAYAiABKAsyFy5zeXNtbC5SdW5Td2VlcFJlc3BvbnNlEiYKBnNhbXBsZRgDIAEoCzIWLnN5c21sLlJ1blJ1bnNSZXNwb25zZRIPCgdwYWNrYWdlGAQgASgJEhIKCmRlZmluaXRpb24YBSABKAkSDwoHcmVjb3JkcxgGIAMoCRIOCgZzb3VyY2UYByABKAkSDwoHY29udGVudBgIIAEoCRIoCglkb2N1bWVudHMYCSADKAsyFS5zeXNtbC5FZGl0ZWREb2N1bWVudBIPCgdza2lwcGVkGAogASgDEg8KB3JlYXNvbnMYCyADKAkSDQoFZXJyb3IYDCABKAkSLAoOZmFpbHVyZV9yZWFzb24YDSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiYKC2RpYWdub3N0aWNzGA4gAygLMhEuc3lzbWwuRGlhZ25vc3RpYxISCgptb2RlbF9oYXNoGA8gASgJIsMDCg9SdW5SdW5zUmVzcG9uc2USHQoEcm93cxgBIAMoCzIPLnN5c21sLlN3ZWVwUm93EhMKC29ic2VydmFibGVzGAIgAygJEi0KDWRpc3RyaWJ1dGlvbnMYAyADKAsyFi5zeXNtbC5SdW5EaXN0cmlidXRpb24SDQoFbGluZXMYBCADKAkSIgoHb3V0cHV0cxgFIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYBiADKAsyDi5zeXNtbC5WZXJkaWN0EhMKC3VuY29uY2x1ZGVkGAcgASgJEg0KBWVycm9yGAggASgJEiYKC2RpYWdub3N0aWNzGAkgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgKIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SIgoJaW5zdGFuY2VzGAsgAygLMg8uc3lzbWwuSW5zdGFuY2USDgoGZW5naW5lGAwgASgJEhAKCHN0cmVuZ3RoGA0gASgJEhwKBmJvdW5kcxgOIAMoCzIMLnN5c21sLkJvdW5kEhEKBHNlZWQYDyABKARIAIgBAUIHCgVfc2VlZCJuChdSdW5Eb2N1bWVudFF1ZXJ5UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhAKCHF1ZXJ5X2lkGAIgASgJEi0KCGJpbmRpbmdzGAMgAygLMhsuc3lzbWwuRG9jdW1lbnRRdWVyeUJpbmRpbmciTwoURG9jdW1lbnRRdWVyeUJpbmRpbmcSEQoJcGFyYW1ldGVyGAEgASgJEiQKBnZhbHVlcxgCIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUiuwMKDURvY3VtZW50VmFsdWUSFAoKZWxlbWVudF9pZBgBIAEoCUgAEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhMKCWludF92YWx1ZRgDIAEoA0gAEhQKCnJlYWxfdmFsdWUYBCABKAFIABIUCgpib29sX3ZhbHVlGAUgASgISAASEgoIaW5maW5pdHkYBiABKAhIABIjCghxdWFudGl0eRgIIAEoCzIPLnN5c21sLlF1YW50aXR5SAASKQoHdmVyZGljdBgJIAEoCzIWLnN5c21sLkRvY3VtZW50VmVyZGljdEgAEicKBm9iamVjdBgKIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0SAASJQoFc3RhdGUYCyABKAsyFC5zeXNtbC5Eb2N1bWVudFN0YXRlSAASJQoFZXZlbnQYDCABKAsyFC5zeXNtbC5Eb2N1bWVudEV2ZW50SAASFwoNYmlnX2ludF92YWx1ZRgNIAEoCUgAEikKDnJhdGlvbmFsX3ZhbHVlGA4gASgLMg8uc3lzbWwuUmF0aW9uYWxIABIUCgxlbGVtZW50X3R5cGUYByABKAlCBgoEa2luZCJaCg5Eb2N1bWVudE9iamVjdBITCgtpbnN0YW5jZV9pZBgBIAEoAxIMCgRwYXRoGAIgASgJEiUKB2VsZW1lbnQYAyABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlIq4BCg9Eb2N1bWVudFZlcmRpY3QSJwoJYXNzZXJ0aW9uGAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIMCgRraW5kGAIgASgJEgwKBHRleHQYAyABKAkSDAoEcGF0aBgEIAEoCRIPCgd2ZXJkaWN0GAUgASgJEhEKCWNvbmRpdGlvbhgGIAEoCRIOCgZyZWFzb24YByABKAkSFAoMdmVyaWZpY2F0aW9uGAggAygJIrEBCg1Eb2N1bWVudFN0YXRlEiUKBm9iamVjdBgBIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg8KB21hY2hpbmUYAiABKAkSDAoEbmFtZRgDIAEoCRISCgpzdGF0ZV9wYXRoGAQgASgJEiMKBXN0YXRlGAUgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIOCgZyZWdpb24YBiABKAkSEQoJZW5jbG9zaW5nGAcgAygJIpwCCg1Eb2N1bWVudEV2ZW50EgwKBGtpbmQYASABKAkSIgoEdGltZRgCIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSJQoGb2JqZWN0GAMgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QSDwoHbWFjaGluZRgEIAEoCRINCgVzdGF0ZRgFIAEoCRIMCgRmcm9tGAYgASgJEgoKAnRvGAcgASgJEiUKBnRhcmdldBgIIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg0KBWV2ZW50GAkgASgJEg8KB3BheWxvYWQYCiADKAkSFAoMYWx0ZXJuYXRpdmVzGAsgAygJEg0KBXRha2VuGAwgASgJEgwKBHRleHQYDSABKAkiIwoTRG9jdW1lbnRRdWVyeUNvbHVtbhIMCgRuYW1lGAEgASgJIjkKEURvY3VtZW50UXVlcnlDZWxsEiQKBnZhbHVlcxgBIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUiYgoQRG9jdW1lbnRRdWVyeVJvdxIlCgdlbGVtZW50GAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRInCgVjZWxscxgCIAMoCzIYLnN5c21sLkRvY3VtZW50UXVlcnlDZWxsIm4KGFJ1bkRvY3VtZW50UXVlcnlSZXNwb25zZRIrCgdjb2x1bW5zGAEgAygLMhouc3lzbWwuRG9jdW1lbnRRdWVyeUNvbHVtbhIlCgRyb3dzGAIgAygLMhcuc3lzbWwuRG9jdW1lbnRRdWVyeVJvdyKkAQoMUXVlcnlPdXRjb21lEgwKBGtpbmQYASABKAkSDAoEc3RlcBgCIAEoCRIlCghmYWlsdXJlcxgDIAMoCzITLnN5c21sLlF1ZXJ5RmFpbHVyZRIlCghmaW5kaW5ncxgEIAMoCzITLnN5c21sLlF1ZXJ5RmluZGluZxIqCg1wYXRoX2ZhaWx1cmVzGAUgAygLMhMuc3lzbWwuUXVlcnlGYWlsdXJlIlYKDFF1ZXJ5RmFpbHVyZRIMCgRzdGVwGAEgASgJEhAKCGV4cGVjdGVkGAIgASgJEiYKCGZyb250aWVyGAMgASgLMhQuc3lzbWwuUXVlcnlGcm9udGllciKXAQoNUXVlcnlGcm9udGllchIKCgJhdBgBIAEoCRIrCgdtZW1iZXJzGAIgAygLMhouc3lzbWwuUXVlcnlGcm9udGllck1lbWJlchItCghmZWF0dXJlcxgDIAMoCzIbLnN5c21sLlF1ZXJ5RnJvbnRpZXJGZWF0dXJlEg0KBWtpbmRzGAQgAygJEg8KB25lYXJlc3QYBSABKAkiNgoTUXVlcnlGcm9udGllck1lbWJlchIMCgRuYW1lGAEgASgJEhEKCW1ldGFjbGFzcxgCIAEoCSIyChRRdWVyeUZyb250aWVyRmVhdHVyZRIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkiUwoMUXVlcnlGaW5kaW5nEgwKBHN0ZXAYASABKAkSDwoHZWxlbWVudBgCIAEoCRISCgpjb25zdHJhaW50GAMgASgJEhAKCG9ic2VydmVkGAQgASgJIk4KFVJlbmRlckRvY3VtZW50UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEgwKBGZvcm0YAyABKAkiXQoWUmVuZGVyRG9jdW1lbnRSZXNwb25zZRIQCghtYXJrZG93bhgBIAEoCRIMCgRodG1sGAIgASgJEhAKCGFzY2lpZG9jGAQgASgJEhEKCWZpbGVfbmFtZRgDIAEoCSJ3ChFSZW5kZXJWaWV3UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEgwKBHZpZXcYAiABKAkSDQoFcG9ydHMYAyABKAkSDAoEc2hvdxgEIAMoCRINCgVkZXB0aBgFIAEoBRIUCgxjb21wYXJ0bWVudHMYBiABKAkinAIKElJlbmRlclZpZXdSZXNwb25zZRIMCgR2aWV3GAEgASgJEgwKBGtpbmQYAiABKAkSDgoGc3RhdGVkGAMgASgJEiAKBW5vZGVzGAQgAygLMhEuc3lzbWwuUmVuZGVyTm9kZRIgCgVlZGdlcxgFIAMoCzIRLnN5c21sLlJlbmRlckVkZ2USDwoHY29sdW1ucxgGIAMoCRIeCgRyb3dzGAcgAygLMhAuc3lzbWwuUmVuZGVyUm93EiMKBmNhbnZhcxgIIAEoCzITLnN5c21sLlJlbmRlckNhbnZhcxIgCgVub3RlcxgJIAMoCzIRLnN5c21sLlJlbmRlck5vdGUSDwoHbm90aWNlcxgKIAMoCRINCgVzaG93bhgLIAMoCSLPAgoKUmVuZGVyTm9kZRIKCgJpZBgBIAEoCRIMCgRraW5kGAIgASgJEgwKBG5hbWUYAyABKAkSGAoQbmFtZV9zeW50aGVzaXplZBgEIAEoCBIMCgR0eXBlGAUgASgJEg4KBmRldGFpbBgGIAEoCRIMCgR0ZXh0GAcgASgJEhAKCHN0YW5kX2luGAggASgIEg4KBnBhcmVudBgJIAEoCRIgCgVwb3J0cxgKIAMoCzIRLnN5c21sLlJlbmRlclBvcnQSGwoGb3JpZ2luGAsgASgLMgsuc3lzbWwuU3BhbhInCghnZW9tZXRyeRgMIAEoCzIVLnN5c21sLlJlbmRlckdlb21ldHJ5EiEKBXN0eWxlGA0gASgLMhIuc3lzbWwuUmVuZGVyU3R5bGUSEwoLY29tcGFydG1lbnQYDiABKAkSEQoJaW5oZXJpdGVkGA8gASgIIloKClJlbmRlclBvcnQSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgR0eXBlGAMgASgJEhEKCWRpcmVjdGlvbhgEIAEoCRIRCglpbmhlcml0ZWQYBSABKAgi2AEKClJlbmRlckVkZ2USDAoEZnJvbRgBIAEoCRIKCgJ0bxgCIAEoCRIRCglmcm9tX3BvcnQYAyABKAkSDwoHdG9fcG9ydBgEIAEoCRINCgVsYWJlbBgFIAEoCRIMCgRuYW1lGAYgASgJEgwKBGtpbmQYByABKAkSGwoGb3JpZ2luGAggASgLMgsuc3lzbWwuU3BhbhIhCgVyb3V0ZRgJIAMoCzISLnN5c21sLlJlbmRlclBvaW50EiEKBXN0eWxlGAogASgLMhIuc3lzbWwuUmVuZGVyU3R5bGUifAoOUmVuZGVyR2VvbWV0cnkSCQoBeBgBIAEoARIJCgF5GAIgASgBEg0KBXdpZHRoGAMgASgBEg4KBmhlaWdodBgEIAEoARIQCghoYXNfc2l6ZRgFIAEoCBIRCgljb2xsYXBzZWQYBiABKAgSEAoIdW5wbGFjZWQYByABKAgiTQoMUmVuZGVyQ2FudmFzEgwKBHVuaXQYASABKAkSDQoFd2lkdGgYAiABKAESDgoGaGVpZ2h0GAMgASgBEhAKCGhhc19zaXplGAQgASgIInYKC1JlbmRlclN0eWxlEgwKBGZpbGwYASABKAkSDAoEbGluZRgCIAEoCRIMCgR0ZXh0GAMgASgJEgwKBGZvbnQYBCABKAkSEQoJZm9udF9zaXplGAUgASgBEgwKBGJvbGQYBiABKAgSDgoGaXRhbGljGAcgASgIIiMKC1JlbmRlclBvaW50EgkKAXgYASABKAESCQoBeRgCIAEoASI3CglSZW5kZXJSb3cSDQoFY2VsbHMYASADKAkSGwoGb3JpZ2luGAIgASgLMgsuc3lzbWwuU3BhbiKyAQoKUmVuZGVyTm90ZRIMCgR0ZXh0GAEgASgJEg4KBmFuY2hvchgCIAEoCRIRCgllZGdlX2Zyb20YAyABKAkSDwoHZWRnZV90bxgEIAEoCRIJCgF4GAUgASgBEgkKAXkYBiABKAESDQoFd2lkdGgYByABKAESDgoGaGVpZ2h0GAggASgBEhAKCGhhc19zaXplGAkgASgIEhsKBm9yaWdpbhgKIAEoCzILLnN5c21sLlNwYW4iOgoTRXhwb3J0R3JhcGhzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEg8KB3N1YmplY3QYAiABKAkiSQoURXhwb3J0R3JhcGhzUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRIPCgd2ZXJzaW9uGAIgASgFEg8KB3N1YmplY3QYAyABKAkikAEKEUltcG9ydERhdGFSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSIgoHaW1wb3J0cxgCIAMoCzIRLnN5c21sLkRhdGFJbXBvcnQSEQoJaW1wb3J0X2FzGAMgASgJEhYKDmltcG9ydF9kcnlfcnVuGAQgASgIEhgKEGFjY2VwdF9kb2N1bWVudHMYBSABKAgiVgoKRGF0YUltcG9ydBIMCgRuYW1lGAEgASgJEg8KB2NvbnRlbnQYAiABKAkSFQoNaW1wb3J0X2Zvcm1hdBgDIAEoCRISCgppbXBvcnRfbWFwGAQgASgJIr4BChJJbXBvcnREYXRhUmVzcG9uc2USIgoFZmlsZXMYASADKAsyEy5zeXNtbC5JbXBvcnRlZEZpbGUSKAoJZG9jdW1lbnRzGAIgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSDwoHY29udGVudBgDIAEoCRISCgptb2RlbF9oYXNoGAQgASgJEg0KBWVycm9yGAUgASgJEiYKC2RpYWdub3N0aWNzGAYgAygLMhEuc3lzbWwuRGlhZ25vc3RpYyJpCgxJbXBvcnRlZEZpbGUSDAoEbmFtZRgBIAEoCRIOCgZ2YWx1ZXMYAiABKAMSEAoIZWxlbWVudHMYAyABKAMSKQoLYXNzaWdubWVudHMYBCADKAsyFC5zeXNtbC5JbXBvcnRlZFZhbHVlIncKDUltcG9ydGVkVmFsdWUSDwoHZWxlbWVudBgBIAEoCRIPCgdmZWF0dXJlGAIgASgJEg0KBXZhbHVlGAMgASgJEhEKCXJlZGVmaW5lcxgEIAEoCRINCgV3aGVyZRgFIAEoCRITCgtkZXNjcmlwdGlvbhgGIAEoCSLmAQoVQ29tcGFyZVJlc3VsdHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSDwoHcmVzdWx0cxgCIAEoCRIPCgdhY3Rpb25zGAMgAygJEgwKBHJ1bnMYBCABKAMSEQoEc2VlZBgFIAEoBEgAiAEBEg0KBWRyYXdzGAYgASgJEhcKCmNsb2NrX3N0ZXAYByABKAFIAYgBARImCgdvYnNlcnZlGAggAygLMhUuc3lzbWwuT2JzZXJ2YWJsZVBhaXISDgoGZW5naW5lGAkgASgJQgcKBV9zZWVkQg0KC19jbG9ja19zdGVwIjEKDk9ic2VydmFibGVQYWlyEg4KBnN0b3JlZBgBIAEoCRIPCgdmZWF0dXJlGAIgASgJIoUCChZDb21wYXJlUmVzdWx0c1Jlc3BvbnNlEjYKDmNvbmZpZ3VyYXRpb25zGAEgAygLMh4uc3lzbWwuQ29uZmlndXJhdGlvbkNvbXBhcmlzb24SDgoGc291cmNlGAIgASgJEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgFIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SDgoGZW5naW5lGAYgASgJEhAKCHN0cmVuZ3RoGAcgASgJEhwKBmJvdW5kcxgIIAMoCzIMLnN5c21sLkJvdW5kIsQDChdDb25maWd1cmF0aW9uQ29tcGFyaXNvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhAKCGJlaGF2aW9yGAMgASgJEg4KBnRhcmdldBgEIAEoCRIXCg9yZXN1bHRfbG9jYXRpb24YBSABKAkSDgoGc3RhdHVzGAYgASgJEhIKCnVucmVzb2x2ZWQYByABKAkSEwoLc3RvcmVkX3J1bnMYCCABKAMSGAoQc3RvcmVkX3NuYXBzaG90cxgJIAEoAxIMCgRydW5zGAogASgDEhEKCWNvbXBsZXRlZBgLIAEoAxINCgVkcmF3cxgMIAEoCRIRCgRzZWVkGA0gASgESACIAQESEgoKY2xvY2tfc3RlcBgOIAEoARIdCgRyb3dzGA8gAygLMg8uc3lzbWwuU3dlZXBSb3cSIgoJaW5zdGFuY2VzGBAgAygLMg8uc3lzbWwuSW5zdGFuY2USMAoLb2JzZXJ2YWJsZXMYESADKAsyGy5zeXNtbC5PYnNlcnZhYmxlQ29tcGFyaXNvbhIOCgZlcnJvcnMYEiADKAkSDQoFbm90ZXMYEyADKAkSDQoFbGluZXMYFCADKAlCBwoFX3NlZWQiyAIKFE9ic2VydmFibGVDb21wYXJpc29uEg4KBnN0b3JlZBgBIAEoCRIPCgdmZWF0dXJlGAIgASgJEgwKBHVuaXQYAyABKAkSKQoEdG9vbBgEIAEoCzIbLnN5c21sLkNvbXBhcmVkRGlzdHJpYnV0aW9uEg4KBnBvb2xlZBgFIAEoCBIQCgh1bnN0b3JlZBgGIAEoCBIoCgNydW4YByABKAsyGy5zeXNtbC5Db21wYXJlZERpc3RyaWJ1dGlvbhIQCghwcm9kdWNlZBgIIAEoAxIQCghjb21wYXJlZBgJIAEoCBIuCgpkaWZmZXJlbmNlGAogASgLMhouc3lzbWwuU3RhdGlzdGljRGlmZmVyZW5jZRInCghkZWNsYXJlZBgLIAEoCzIVLnN5c21sLkNhc2VTdGF0aXN0aWNzEg0KBW5vdGVzGAwgAygJInoKFENvbXBhcmVkRGlzdHJpYnV0aW9uEg0KBWNvdW50GAEgASgDEgsKA21pbhgCIAEoARIMCgRtZWFuGAMgASgBEgsKA3A1MBgEIAEoARILCgNwOTAYBSABKAESCwoDbWF4GAYgASgBEhEKCWRldmlhdGlvbhgHIAEoASJXChNTdGF0aXN0aWNEaWZmZXJlbmNlEgsKA21pbhgBIAEoCRIMCgRtZWFuGAIgASgJEgsKA3A1MBgDIAEoCRILCgNwOTAYBCABKAkSCwoDbWF4GAUgASgJIlUKDkNhc2VTdGF0aXN0aWNzEhAKCGFuYWx5c2lzGAEgASgJEiIKBHJvd3MYAiADKAsyFC5zeXNtbC5DYXNlU3RhdGlzdGljEg0KBW5vdGVzGAMgAygJIl0KDUNhc2VTdGF0aXN0aWMSEQoJc3RhdGlzdGljGAEgASgJEgoKAm9mGAIgASgJEgwKBHRvb2wYAyABKAkSCwoDcnVuGAQgASgJEhIKCmRpZmZlcmVuY2UYBSABKAkqsQEKDUZhaWx1cmVSZWFzb24SHgoaRkFJTFVSRV9SRUFTT05fVU5TUEVDSUZJRUQQABIdChlGQUlMVVJFX1JFQVNPTl9FVkFMVUFUSU9OEAESHQoZRkFJTFVSRV9SRUFTT05fV1JPTkdfS0lORBACEiQKIEZBSUxVUkVfUkVBU09OX0FNQklHVU9VU19TVUJKRUNUEAMSHAoYRkFJTFVSRV9SRUFTT05fVU5ERUNJREVEEAQqjAUKC0VkaXRGYWlsdXJlEhwKGEVESVRfRkFJTFVSRV9VTlNQRUNJRklFRBAAEh4KGkVESVRfRkFJTFVSRV9OT19PUEVSQVRJT05TEAESHwobRURJVF9GQUlMVVJFX1VOS05PV05fVEFSR0VUEAISIQodRURJVF9GQUlMVVJFX0FNQklHVU9VU19UQVJHRVQQAxIbChdFRElUX0ZBSUxVUkVfTk9UX1ZBTFVFRBAEEh4KGkVESVRfRkFJTFVSRV9JTlZBTElEX1ZBTFVFEAUSHQoZRURJVF9GQUlMVVJFX0lOVkFMSURfTkFNRRAGEhoKFkVESVRfRkFJTFVSRV9OT1RfTkFNRUQQBxIiCh5FRElUX0ZBSUxVUkVfUkVOQU1FX1JFRkVSRU5DRUQQCBIiCh5FRElUX0ZBSUxVUkVfT1ZFUkxBUFBJTkdfRURJVFMQCRIfChtFRElUX0ZBSUxVUkVfUkVTVUxUX0lOVkFMSUQQChIeChpFRElUX0ZBSUxVUkVfT1dORVJfVU5LTk9XThALEiQKIEVESVRfRkFJTFVSRV9PV05FUl9OT1RfTkFNRVNQQUNFEAwSHQoZRURJVF9GQUlMVVJFX0lMTEVHQUxfS0lORBANEiIKHkVESVRfRkFJTFVSRV9NRU1CRVJfTkFNRV9UQUtFThAOEiIKHkVESVRfRkFJTFVSRV9ERUxFVEVfUkVGRVJFTkNFRBAPEiQKIEVESVRfRkFJTFVSRV9PV05FUl9JTlNJREVfVEFSR0VUEBASIAocRURJVF9GQUlMVVJFX01PVkVfUkVGRVJFTkNFRBAREiUKIUVESVRfRkFJTFVSRV9SRUZFUkVOQ0VEX0VMU0VXSEVSRRASKpoCChFQcmltaXRpdmVPcGVyYXRvchIiCh5QUklNSVRJVkVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIcChhQUklNSVRJVkVfT1BFUkFUT1JfRVFVQUwQARIeChpQUklNSVRJVkVfT1BFUkFUT1JfR1JFQVRFUhACEhsKF1BSSU1JVElWRV9PUEVSQVRPUl9MRVNTEAMSIQodUFJJTUlUSVZFX09QRVJBVE9SX0xFU1NfRVFVQUwQBBIkCiBQUklNSVRJVkVfT1BFUkFUT1JfR1JFQVRFUl9FUVVBTBAFEhkKFVBSSU1JVElWRV9PUEVSQVRPUl9JThAGEiIKHlBSSU1JVElWRV9PUEVSQVRPUl9JTlNUQU5DRV9PRhAHKm4KEUNvbXBvc2l0ZU9wZXJhdG9yEiIKHkNPTVBPU0lURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEhoKFkNPTVBPU0lURV9PUEVSQVRPUl9BTkQQARIZChVDT01QT1NJVEVfT1BFUkFUT1JfT1IQAjKdEQoMU3lzTUxTZXJ2aWNlEkQKDUdldFNlcnZlckluZm8SGC5zeXNtbC5TZXJ2ZXJJbmZvUmVxdWVzdBoZLnN5c21sLlNlcnZlckluZm9SZXNwb25zZRI+CglQYXJzZUZpbGUSFy5zeXNtbC5QYXJzZUZpbGVSZXF1ZXN0Ghguc3lzbWwuUGFyc2VGaWxlUmVzcG9uc2USRwoMUGFyc2VTb3VyY2VzEhouc3lzbWwuUGFyc2VTb3VyY2VzUmVxdWVzdBobLnN5c21sLlBhcnNlU291cmNlc1Jlc3BvbnNlEjsKCUdldFN5bWJvbBIXLnN5c21sLkdldFN5bWJvbFJlcXVlc3QaFS5zeXNtbC5TeW1ib2xSZXNwb25zZRJHCg5HZXREaWFnbm9zdGljcxIZLnN5c21sLkRpYWdub3N0aWNzUmVxdWVzdBoaLnN5c21sLkRpYWdub3N0aWNzUmVzcG9uc2USOwoIRXZhbHVhdGUSFi5zeXNtbC5FdmFsdWF0ZVJlcXVlc3QaFy5zeXNtbC5FdmFsdWF0ZVJlc3BvbnNlEkQKC0luc3RhbnRpYXRlEhkuc3lzbWwuSW5zdGFudGlhdGVSZXF1ZXN0Ghouc3lzbWwuSW5zdGFudGlhdGVSZXNwb25zZRJKCg1FeGVjdXRlQWN0aW9uEhsuc3lzbWwuRXhlY3V0ZUFjdGlvblJlcXVlc3QaHC5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2USRwoMRXhlY3V0ZVN0YXRlEhouc3lzbWwuRXhlY3V0ZVN0YXRlUmVxdWVzdBobLnN5c21sLkV4ZWN1dGVTdGF0ZVJlc3BvbnNlEjgKB0NvbnZlcnQSFS5zeXNtbC5Db252ZXJ0UmVxdWVzdBoWLnN5c21sLkNvbnZlcnRSZXNwb25zZRI4CgdNaWdyYXRlEhUuc3lzbWwuTWlncmF0ZVJlcXVlc3QaFi5zeXNtbC5NaWdyYXRlUmVzcG9uc2USQQoKQXBwbHlFZGl0cxIYLnN5c21sLkFwcGx5RWRpdHNSZXF1ZXN0Ghkuc3lzbWwuQXBwbHlFZGl0c1Jlc3BvbnNlElMKEFZlcmlmeUNvbnN0cmFpbnQSHi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdBofLnN5c21sLlZlcmlmeUNvbnN0cmFpbnRSZXNwb25zZRJWChFWZXJpZnlSZXF1aXJlbWVudBIfLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdBogLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVzcG9uc2USWQoSVmVyaWZ5U2F0aXNmYWN0aW9uEiAuc3lzbWwuVmVyaWZ5U2F0aXNmYWN0aW9uUmVxdWVzdBohLnN5c21sLlZlcmlmeVNhdGlzZmFjdGlvblJlc3BvbnNlElMKEFZhbGlkYXRlSW5zdGFuY2USHi5zeXNtbC5WYWxpZGF0ZUluc3RhbmNlUmVxdWVzdBofLnN5c21sLlZhbGlkYXRlSW5zdGFuY2VSZXNwb25zZRJHCgxFdmFsdWF0ZUNhbGMSGi5zeXNtbC5FdmFsdWF0ZUNhbGNSZXF1ZXN0Ghsuc3lzbWwuRXZhbHVhdGVDYWxjUmVzcG9uc2USRAoLUnVuQW5hbHlzaXMSGS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QaGi5zeXNtbC5SdW5BbmFseXNpc1Jlc3BvbnNlEkoKDUNoZWNrQmVoYXZpb3ISGy5zeXNtbC5DaGVja0JlaGF2aW9yUmVxdWVzdBocLnN5c21sLkNoZWNrQmVoYXZpb3JSZXNwb25zZRI7CghSdW5Td2VlcBIWLnN5c21sLlJ1blN3ZWVwUmVxdWVzdBoXLnN5c21sLlJ1blN3ZWVwUmVzcG9uc2USOAoHUnVuUnVucxIVLnN5c21sLlJ1blJ1bnNSZXF1ZXN0GhYuc3lzbWwuUnVuUnVuc1Jlc3BvbnNlEj4KCVNlbGZDaGVjaxIXLnN5c21sLlNlbGZDaGVja1JlcXVlc3QaGC5zeXNtbC5TZWxmQ2hlY2tSZXNwb25zZRI+CglSZWNvcmRSdW4SFy5zeXNtbC5SZWNvcmRSdW5SZXF1ZXN0Ghguc3lzbWwuUmVjb3JkUnVuUmVzcG9uc2USRAoLTGlzdEVuZ2luZXMSGS5zeXNtbC5MaXN0RW5naW5lc1JlcXVlc3QaGi5zeXNtbC5MaXN0RW5naW5lc1Jlc3BvbnNlEjIKBVF1ZXJ5EhMuc3lzbWwuUXVlcnlSZXF1ZXN0GhQuc3lzbWwuUXVlcnlSZXNwb25zZRJTChBSdW5Eb2N1bWVudFF1ZXJ5Eh4uc3lzbWwuUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QaHy5zeXNtbC5SdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USTQoOUmVuZGVyRG9jdW1lbnQSHC5zeXNtbC5SZW5kZXJEb2N1bWVudFJlcXVlc3QaHS5zeXNtbC5SZW5kZXJEb2N1bWVudFJlc3BvbnNlEkEKClJlbmRlclZpZXcSGC5zeXNtbC5SZW5kZXJWaWV3UmVxdWVzdBoZLnN5c21sLlJlbmRlclZpZXdSZXNwb25zZRJHCgxFeHBvcnRHcmFwaHMSGi5zeXNtbC5FeHBvcnRHcmFwaHNSZXF1ZXN0Ghsuc3lzbWwuRXhwb3J0R3JhcGhzUmVzcG9uc2USQQoKSW1wb3J0RGF0YRIYLnN5c21sLkltcG9ydERhdGFSZXF1ZXN0Ghkuc3lzbWwuSW1wb3J0RGF0YVJlc3BvbnNlEk0KDkNvbXBhcmVSZXN1bHRzEhwuc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXF1ZXN0Gh0uc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXNwb25zZUIqWihnaXRodWIuY29tL09wZW4tTUJFRS9PcGVuU3lzTUwvYXBpL3Byb3RvYgZwcm90bzM"); + fileDesc("CgtzeXNtbC5wcm90bxIFc3lzbWwiqQMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQSIQoFbm90ZXMYEiADKAsyEi5zeXNtbC5WZXJkaWN0Tm90ZSI6CgtWZXJkaWN0Tm90ZRIMCgRraW5kGAEgASgJEg8KB3N1YmplY3QYAiABKAkSDAoEdGV4dBgDIAEoCSJeChFXaXRuZXNzQXNzaWdubWVudBIPCgdmZWF0dXJlGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUSDAoEdW5pdBgDIAEoCRINCgVleGFjdBgEIAEoCSI1CgVCb3VuZBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgDEg8KB3JlYWNoZWQYAyABKAgisAIKF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCRIfCglhcmd1bWVudHMYBiADKAsyDC5zeXNtbC5WYWx1ZRJLCg9uYW1lZF9hcmd1bWVudHMYByADKAsyMi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpYBChhWZXJpZnlDb25zdHJhaW50UmVzcG9uc2USHwoHdmVyZGljdBgBIAEoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljIrICChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJEh8KCWFyZ3VtZW50cxgGIAMoCzIMLnN5c21sLlZhbHVlEkwKD25hbWVkX2FyZ3VtZW50cxgHIAMoCzIzLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpwBChNWZXJpZmljYXRpb25WZXJkaWN0Eg8KB2Nhc2VfaWQYASABKAkSDAoEa2luZBgCIAEoCRIOCgZkZXRhaWwYAyABKAkSDwoHc3ViY2FzZRgEIAEoCBIWCg5yZXF1aXJlbWVudF9pZBgFIAEoCRITCgtpbnN0YW5jZV9pZBgGIAEoAxIYChBpbnN0YW5jZV90eXBlX2lkGAcgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgivAIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkSFAoMdG9vbF9kcnlfcnVuGAggASgIGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIvQCCgpUb29sRHJ5UnVuEg4KBmFjdGlvbhgBIAEoCRIMCgR0b29sGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSEAoIbWFuaWZlc3QYBCABKAkSEgoKZXhlY3V0YWJsZRgFIAEoCRIQCghwcm90b2NvbBgGIAEoCRIMCgRhcmdzGAcgAygJEgsKA2VudhgIIAMoCRILCgNjd2QYCSABKAkSDQoFc3RkaW4YCiABKAkSEgoKc3RkaW5fZGF0YRgLIAEoCRIpCgppbnB1dF9maWxlGAwgASgLMhUuc3lzbWwuVG9vbERyeVJ1bkZpbGUSEgoKb3V0cHV0X2RpchgNIAEoCBImCgZpbnB1dHMYDiADKAsyFi5zeXNtbC5Ub29sRHJ5UnVuSW5wdXQSKAoHb3V0cHV0cxgPIAMoCzIXLnN5c21sLlRvb2xEcnlSdW5PdXRwdXQSFAoMcmVwbHlfc291cmNlGBAgASgJEg0KBWxpbmVzGBEgAygJIjwKDlRvb2xEcnlSdW5GaWxlEgwKBG5hbWUYASABKAkSDgoGZm9ybWF0GAIgASgJEgwKBGRhdGEYAyABKAkiUwoPVG9vbERyeVJ1bklucHV0EhAKCHZhcmlhYmxlGAEgASgJEhEKCXBhcmFtZXRlchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIMCgR1bml0GAQgASgJIjcKEFRvb2xEcnlSdW5PdXRwdXQSEAoIdmFyaWFibGUYASABKAkSEQoJcGFyYW1ldGVyGAIgASgJIoUEChNSdW5BbmFseXNpc1Jlc3BvbnNlEiIKB291dHB1dHMYASADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAIgAygLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSIAoIb3V0Y29tZXMYCCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAkgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSKgoLZXZhbHVhdGlvbnMYCiADKAsyFS5zeXNtbC5DYXNlRXZhbHVhdGlvbhIOCgZlbmdpbmUYCyABKAkSEAoIc3RyZW5ndGgYDCABKAkSHAoGYm91bmRzGA0gAygLMgwuc3lzbWwuQm91bmQSJwoMdG9vbF9kcnlfcnVuGA4gASgLMhEuc3lzbWwuVG9vbERyeVJ1biIsChBQcm9iYWJpbGl0eVJhbmdlEgsKA21pbhgBIAEoARILCgNtYXgYAiABKAEiywIKB091dGNvbWUSLAoHb3V0cHV0cxgBIAMoCzIbLnN5c21sLk91dGNvbWUuT3V0cHV0c0VudHJ5EhMKC2ZpbmFsX3N0YXRlGAIgASgJEhYKDnN0YXRlc192aXNpdGVkGAMgAygJEg0KBWVycm9yGAQgASgJEhYKDmxpbmVhcml6YXRpb25zGAUgASgFEg8KB3dpdG5lc3MYBiADKAkSJgoLZGlhZ25vc3RpY3MYByADKAsyES5zeXNtbC5EaWFnbm9zdGljEhMKC3Byb2JhYmlsaXR5GAggASgBEjIKEXByb2JhYmlsaXR5X3JhbmdlGAkgASgLMhcuc3lzbWwuUHJvYmFiaWxpdHlSYW5nZRo8CgxPdXRwdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIssBChFFeHBsb3JhdGlvblN0YXR1cxIQCghjb21wbGV0ZRgBIAEoCBIMCgRydW5zGAIgASgFEhMKC2J1ZGdldHNfaGl0GAMgAygJEhMKC3J1bnNfYnVkZ2V0GAQgASgFEhQKDGRlcHRoX2J1ZGdldBgFIAEoBRIhChlwcm9iYWJpbGl0aWVzX2xvd2VyX2JvdW5kGAYgASgIEh0KFWZhaWxlZF9saW5lYXJpemF0aW9ucxgHIAEoBRIUCgx1bmVudW1lcmF0ZWQYCCADKAki0QMKFENoZWNrQmVoYXZpb3JSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGAoQYWN0aW9uX3N5bWJvbF9pZBgCIAEoCRIfChdzdGF0ZV9tYWNoaW5lX3N5bWJvbF9pZBgDIAEoCRI3CgZpbnB1dHMYBCADKAsyJy5zeXNtbC5DaGVja0JlaGF2aW9yUmVxdWVzdC5JbnB1dHNFbnRyeRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhYKDmNoZWNrX3Byb3BlcnR5GAYgAygJEhUKDWNoZWNrX2RpdmVyZ2UYByADKAkSEwoLY2hlY2tfaW5wdXQYCCADKAkSFAoMY2hlY2tfYXNzdW1lGAkgAygJEhUKDWNoZWNrX3dpdG5lc3MYCiABKAgSEwoLY2hlY2tfZGVwdGgYCyABKAUSFAoMY2hlY2tfc3RhdGVzGAwgASgFEhQKDGNoZWNrX3Vucm9sbBgNIAEoBRIVCg1jaGVja190aW1lb3V0GA4gASgBEg4KBmVuZ2luZRgPIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEieQoMQ2hlY2tXaXRuZXNzEhAKCHNjaGVkdWxlGAEgASgJEg0KBWRyYXdzGAIgAygJEg8KB2Nob2ljZXMYAyADKAkSDgoGaW5wdXRzGAQgAygJEhEKCWZpbGVfbmFtZRgFIAEoCRIUCgxmaWxlX2NvbnRlbnQYBiABKAkilwEKDkNoZWNrVmlvbGF0aW9uEgwKBGtpbmQYASABKAkSEAoIcHJvcGVydHkYAiABKAkSDQoFZXJyb3IYAyABKAkSDQoFZGVwdGgYBCABKAUSEwoLcHJvYmFiaWxpdHkYBSABKAESJAoHd2l0bmVzcxgGIAEoCzITLnN5c21sLkNoZWNrV2l0bmVzcxIMCgR0ZXh0GAcgASgJIkoKE0NoZWNrRGl2ZXJnZW50VmFsdWUSDQoFdmFsdWUYASABKAkSJAoHd2l0bmVzcxgCIAEoCzITLnN5c21sLkNoZWNrV2l0bmVzcyJOCg9DaGVja0RpdmVyZ2VuY2USDwoHZmVhdHVyZRgBIAEoCRIqCgZ2YWx1ZXMYAiADKAsyGi5zeXNtbC5DaGVja0RpdmVyZ2VudFZhbHVlIqEBCgpDaGVja0ZpbmFsEg8KB291dGNvbWUYASABKAkSLQoGdmFsdWVzGAIgAygLMh0uc3lzbWwuQ2hlY2tGaW5hbC5WYWx1ZXNFbnRyeRIkCgd3aXRuZXNzGAMgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzGi0KC1ZhbHVlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEivQEKC0NoZWNrU2VhcmNoEg4KBnN0YXRlcxgBIAEoBRINCgVtb3ZlcxgCIAEoBRIRCgltYXhfZGVwdGgYAyABKAUSEgoKYm91bmRzX2hpdBgEIAMoCRIPCgdob3Jpem9uGAUgASgBEhMKC2hvcml6b25fc2V0GAYgASgIEhQKDG1hc3NfYm91bmRlZBgHIAEoCBINCgVub3RlcxgIIAMoCRINCgVzY29wZRgJIAMoCRIOCgZzdGF0dXMYCiABKAkiuwMKFUNoZWNrQmVoYXZpb3JSZXNwb25zZRIPCgd2ZXJkaWN0GAEgASgJEg0KBWxpbmVzGAIgAygJEiIKBnNlYXJjaBgDIAEoCzISLnN5c21sLkNoZWNrU2VhcmNoEikKCnZpb2xhdGlvbnMYBCADKAsyFS5zeXNtbC5DaGVja1Zpb2xhdGlvbhIrCgtkaXZlcmdlbmNlcxgFIAMoCzIWLnN5c21sLkNoZWNrRGl2ZXJnZW5jZRIhCgZmaW5hbHMYBiADKAsyES5zeXNtbC5DaGVja0ZpbmFsEg0KBWNsYWltGAcgASgJEhMKC2ZyZWVfaW5wdXRzGAggAygJEhMKC2Fzc3VtcHRpb25zGAkgAygJEiQKB3dpdG5lc3MYCiABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MSJQoIY29udHJhc3QYCyABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MSDgoGZW5naW5lGAwgASgJEhAKCHN0cmVuZ3RoGA0gASgJEhwKBmJvdW5kcxgOIAMoCzIMLnN5c21sLkJvdW5kEg4KBnJlYXNvbhgPIAEoCRINCgVlcnJvchgRIAEoCSIjChJMaXN0RW5naW5lc1JlcXVlc3QSDQoFcHJvYmUYASABKAgi/AEKCkVuZ2luZUluZm8SDAoEbmFtZRgBIAEoCRIRCglhdXRob3JpdHkYAiABKAkSDwoHYW5zd2VycxgDIAMoCRIOCgZib3VuZHMYBCADKAkSDwoHcHJvY2VzcxgFIAEoCRIVCg1wcm9jZXNzX2ZvdW5kGAYgASgJEg0KBXJlYWR5GAcgASgIEhMKC3VuYXZhaWxhYmxlGAggASgJEgwKBGtpbmQYCSABKAkSEAoIcHJvdG9jb2wYCiABKAkSDgoGc291cmNlGAsgASgJEg8KB2NvbW1hbmQYDCABKAkSDwoHdmVyc2lvbhgNIAEoCRIOCgZzZXJ2ZWQYDiABKAgiOQoTTGlzdEVuZ2luZXNSZXNwb25zZRIiCgdlbmdpbmVzGAEgAygLMhEuc3lzbWwuRW5naW5lSW5mbyKMAQoQUGFyc2VGaWxlUmVxdWVzdBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASGAoMY29udGVudF9oYXNoGAMgASgJQgIYARIQCghsYW5ndWFnZRgEIAEoCRIaChJzdHJpY3RfY29uZm9ybWFuY2UYBSABKAhCCAoGc291cmNlImIKDlNvdXJjZURvY3VtZW50EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIQCghsYW5ndWFnZRgDIAEoCRIMCgRuYW1lGAQgASgJQggKBnNvdXJjZSJ0ChNQYXJzZVNvdXJjZXNSZXF1ZXN0EigKCWRvY3VtZW50cxgBIAMoCzIVLnN5c21sLlNvdXJjZURvY3VtZW50EhoKEnN0cmljdF9jb25mb3JtYW5jZRgCIAEoCBIXCg9iYXNlX21vZGVsX2hhc2gYAyABKAkilQEKFFBhcnNlU291cmNlc1Jlc3BvbnNlEhIKCm1vZGVsX2hhc2gYASABKAkSIAoFcm9vdHMYAiADKAsyES5zeXNtbC5TeW1ib2xJbmZvEiYKC2RpYWdub3N0aWNzGAMgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgEIAEoCRIQCghhZmZlY3RlZBgFIAMoCSJ/ChFQYXJzZUZpbGVSZXNwb25zZRISCgptb2RlbF9oYXNoGAEgASgJEh8KBHJvb3QYAiABKAsyES5zeXNtbC5TeW1ib2xJbmZvEiYKC2RpYWdub3N0aWNzGAMgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgEIAEoCSI5ChBHZXRTeW1ib2xSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIkIKDlN5bWJvbFJlc3BvbnNlEiEKBnN5bWJvbBgBIAEoCzIRLnN5c21sLlN5bWJvbEluZm8SDQoFZXJyb3IYAiABKAkiUwoSRGlhZ25vc3RpY3NSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSFAoMZGlzYWJsZV9saW50GAIgAygJEhMKC2VuYWJsZV9saW50GAMgAygJIkwKE0RpYWdub3N0aWNzUmVzcG9uc2USJgoLZGlhZ25vc3RpY3MYASADKAsyES5zeXNtbC5EaWFnbm9zdGljEg0KBWVycm9yGAIgASgJIm8KD0V2YWx1YXRlUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhIKCmV4cHJlc3Npb24YAiABKAkSGQoRY29udGV4dF9zeW1ib2xfaWQYAyABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYBCABKAkiZwoQRXZhbHVhdGVSZXNwb25zZRIcCgZyZXN1bHQYASABKAsyDC5zeXNtbC5WYWx1ZRINCgVlcnJvchgCIAEoCRImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMiwgEKCEluc3RhbmNlEgoKAmlkGAEgASgDEhYKDnR5cGVfc3ltYm9sX2lkGAIgASgJEjoKDmZlYXR1cmVfdmFsdWVzGAQgAygLMiIuc3lzbWwuSW5zdGFuY2UuRmVhdHVyZVZhbHVlc0VudHJ5GkkKEkZlYXR1cmVWYWx1ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy5zeXNtbC5GZWF0dXJlVmFsdWU6AjgBSgQIAxAEUgVzbG90cyKdAQoMRmVhdHVyZVZhbHVlEhQKDGZlYXR1cmVfbmFtZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEhwKBnZhbHVlcxgDIAMoCzIMLnN5c21sLlZhbHVlEhQKDG1hdGVyaWFsaXplZBgEIAEoCBINCgVlcnJvchgFIAEoCRIXCg9vcmRlcl9kZXBlbmRlbnQYBiABKAUiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIukCChRFeGVjdXRlQWN0aW9uUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhgKEGFjdGlvbl9zeW1ib2xfaWQYAiABKAkSNwoGaW5wdXRzGAMgAygLMicuc3lzbWwuRXhlY3V0ZUFjdGlvblJlcXVlc3QuSW5wdXRzRW50cnkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRIUCgdhZHZhbmNlGAYgASgBSACIAQESEQoEc2VlZBgHIAEoBEgBiAEBEg0KBWRyYXdzGAggASgJEhIKCmNsb2NrX3N0ZXAYCSABKAESDQoFdHJhY2UYCiABKAgSDgoGZXZlbnRzGAsgAygJGjsKC0lucHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4AUIKCghfYWR2YW5jZUIHCgVfc2VlZCKKBQoVRXhlY3V0ZUFjdGlvblJlc3BvbnNlEjoKB291dHB1dHMYASADKAsyKS5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2UuT3V0cHV0c0VudHJ5Eg0KBWVycm9yGAIgASgJEiYKC2RpYWdub3N0aWNzGAMgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIgCghvdXRjb21lcxgEIAMoCzIOLnN5c21sLk91dGNvbWUSLQoLZXhwbG9yYXRpb24YBSABKAsyGC5zeXNtbC5FeHBsb3JhdGlvblN0YXR1cxISCgpmaW5hbF90aW1lGAYgASgBElMKFHBlcmZvcm1lcl9hdHRyaWJ1dGVzGAcgAygLMjUuc3lzbWwuRXhlY3V0ZUFjdGlvblJlc3BvbnNlLlBlcmZvcm1lckF0dHJpYnV0ZXNFbnRyeRJJCg9vcmRlcl9kZXBlbmRlbnQYCCADKAsyMC5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2UuT3JkZXJEZXBlbmRlbnRFbnRyeRIjCgV0cmFjZRgJIAMoCzIULnN5c21sLkRvY3VtZW50RXZlbnQSFQoNdHJhY2VfZHJvcHBlZBgKIAEoBRo8CgxPdXRwdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBGkgKGFBlcmZvcm1lckF0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaNQoTT3JkZXJEZXBlbmRlbnRFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAU6AjgBIvkBChNFeGVjdXRlU3RhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSHwoXc3RhdGVfbWFjaGluZV9zeW1ib2xfaWQYAiABKAkSDgoGZXZlbnRzGAMgAygJEhAKCHNjaGVkdWxlGAQgASgJEhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAkSDQoFdHJhY2UYBiABKAgSFAoHYWR2YW5jZRgHIAEoAUgAiAEBEhEKBHNlZWQYCCABKARIAYgBARINCgVkcmF3cxgJIAEoCRISCgpjbG9ja19zdGVwGAogASgBQgoKCF9hZHZhbmNlQgcKBV9zZWVkIpAEChRFeGVjdXRlU3RhdGVSZXNwb25zZRIWCg5zdGF0ZXNfdmlzaXRlZBgBIAMoCRJECg1maW5hbF9jb250ZXh0GAIgAygLMi0uc3lzbWwuRXhlY3V0ZVN0YXRlUmVzcG9uc2UuRmluYWxDb250ZXh0RW50cnkSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiAKCG91dGNvbWVzGAUgAygLMg4uc3lzbWwuT3V0Y29tZRItCgtleHBsb3JhdGlvbhgGIAEoCzIYLnN5c21sLkV4cGxvcmF0aW9uU3RhdHVzEhIKCmZpbmFsX3RpbWUYByABKAESIwoFdHJhY2UYCCADKAsyFC5zeXNtbC5Eb2N1bWVudEV2ZW50EhUKDXRyYWNlX2Ryb3BwZWQYCSABKAUSSAoPb3JkZXJfZGVwZW5kZW50GAogAygLMi8uc3lzbWwuRXhlY3V0ZVN0YXRlUmVzcG9uc2UuT3JkZXJEZXBlbmRlbnRFbnRyeRpBChFGaW5hbENvbnRleHRFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaNQoTT3JkZXJEZXBlbmRlbnRFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAU6AjgBIsMCCg5Db252ZXJ0UmVxdWVzdBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASFAoKbW9kZWxfaGFzaBgGIAEoCUgAEhMKC2Zyb21fZm9ybWF0GAMgASgJEhEKCXRvX2Zvcm1hdBgEIAEoCRIeChZ0b2xlcmF0ZV9zeW50YXhfZXJyb3JzGAUgASgIEg8KB2lkX2Zvcm0YByABKAkSEQoJZG9jdW1lbnRzGAggAygJEg8KB2NvbXBhY3QYCSABKAgSFAoMb21pdF9kZXJpdmVkGAogASgIEhQKDGtlZXBfZGVyaXZlZBgLIAMoCRIhChlpbmNsdWRlX2NoZWNrX2RpYWdub3N0aWNzGAwgASgIEh0KFWluY2x1ZGVfbGlicmFyeV9zdHVicxgNIAEoCEIICgZzb3VyY2Ui6QEKD0NvbnZlcnRSZXNwb25zZRIPCgdjb250ZW50GAEgASgJEhMKC2Zyb21fZm9ybWF0GAIgASgJEhEKCXRvX2Zvcm1hdBgDIAEoCRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSFAoMZXhwZXJpbWVudGFsGAYgASgIEhsKE2V4cGVyaW1lbnRhbF9ub3RpY2UYByABKAkSMwoSbGlicmFyeV9yZWZlcmVuY2VzGAggAygLMhcuc3lzbWwuTGlicmFyeVJlZmVyZW5jZSJEChBMaWJyYXJ5UmVmZXJlbmNlEgoKAmlkGAEgASgJEhYKDnF1YWxpZmllZF9uYW1lGAIgASgJEgwKBHR5cGUYAyABKAki7gEKDk1pZ3JhdGVSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAxIABITCgtmcm9tX2Zvcm1hdBgDIAEoCRIRCgl0b19mb3JtYXQYBCABKAkSDgoGcmVwb3J0GAUgASgIEg8KB3Jlc3VsdHMYBiABKAgSFQoLbGF5b3V0X3BhdGgYByABKAlIARIYCg5sYXlvdXRfY29udGVudBgIIAEoCUgBEhYKDmltYWdlX2Jhc2VfdXJsGAkgASgJEg4KBnN0cmljdBgKIAEoCEIICgZzb3VyY2VCCAoGbGF5b3V0IuoBCg9NaWdyYXRlUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRITCgtmcm9tX2Zvcm1hdBgCIAEoCRIRCgl0b19mb3JtYXQYAyABKAkSDQoFZXJyb3IYBCABKAkSFAoMZXhwZXJpbWVudGFsGAUgASgIEhsKE2V4cGVyaW1lbnRhbF9ub3RpY2UYBiABKAkSJgoGcmVwb3J0GAcgASgLMhYuc3lzbWwuTWlncmF0aW9uUmVwb3J0Eg8KB3Jlc3VsdHMYCCABKAkSIwoFZmlsZXMYCSADKAsyFC5zeXNtbC5NaWdyYXRpb25GaWxlIsMBCg9NaWdyYXRpb25SZXBvcnQSDgoGc291cmNlGAEgASgJEhAKCGV4cG9ydGVyGAIgASgJEg8KB3N1bW1hcnkYAyABKAkSDgoGbWFwcGVkGAQgASgFEhQKDGFwcHJveGltYXRlZBgFIAEoBRIQCgh1bm1hcHBlZBgGIAEoBRIPCgdza2lwcGVkGAcgASgFEiYKB2VudHJpZXMYCCADKAsyFS5zeXNtbC5NaWdyYXRpb25FbnRyeRIMCgR0ZXh0GAkgASgJImcKDk1pZ3JhdGlvbkVudHJ5EgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSDwoHdmVyZGljdBgFIAEoCRIMCgRub3RlGAYgASgJIi4KDU1pZ3JhdGlvbkZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIn0KEUFwcGx5RWRpdHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSKAoKb3BlcmF0aW9ucxgCIAMoCzIULnN5c21sLkVkaXRPcGVyYXRpb24SEAoIZG9jdW1lbnQYAyABKAkSGAoQYWNjZXB0X2RvY3VtZW50cxgEIAEoCCLDBgoNRWRpdE9wZXJhdGlvbhIoCglzZXRfdmFsdWUYASABKAsyEy5zeXNtbC5TZXRWYWx1ZUVkaXRIABIjCgZyZW5hbWUYAiABKAsyES5zeXNtbC5SZW5hbWVFZGl0SAASKgoKYWRkX21lbWJlchgDIAEoCzIULnN5c21sLkFkZE1lbWJlckVkaXRIABIjCgZkZWxldGUYBCABKAsyES5zeXNtbC5EZWxldGVFZGl0SAASHwoEbW92ZRgFIAEoCzIPLnN5c21sLk1vdmVFZGl0SAASMgoOYWRkX2Nvbm5lY3Rpb24YBiABKAsyGC5zeXNtbC5BZGRDb25uZWN0aW9uRWRpdEgAEiwKC2FkZF9zYXRpc2Z5GAcgASgLMhUuc3lzbWwuQWRkU2F0aXNmeUVkaXRIABJJChphZGRfcmVxdWlyZW1lbnRfY29uc3RyYWludBgIIAEoCzIjLnN5c21sLkFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXRIABIyCg5hZGRfdHJhbnNpdGlvbhgJIAEoCzIYLnN5c21sLkFkZFRyYW5zaXRpb25FZGl0SAASKgoKYWRkX2ltcG9ydBgKIAEoCzIULnN5c21sLkFkZEltcG9ydEVkaXRIABI4ChFhZGRfZG9jdW1lbnRhdGlvbhgLIAEoCzIbLnN5c21sLkFkZERvY3VtZW50YXRpb25FZGl0SAASKgoKYWRkX3ZlcmlmeRgMIAEoCzIULnN5c21sLkFkZFZlcmlmeUVkaXRIABIuCgxhZGRfbWV0YWRhdGEYDSABKAsyFi5zeXNtbC5BZGRNZXRhZGF0YUVkaXRIABIuCgxhZGRfc2VxdWVuY2UYDiABKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXRIABI7ChNhZGRfbWV0YWRhdGFfcHJlZml4GA8gASgLMhwuc3lzbWwuQWRkTWV0YWRhdGFQcmVmaXhFZGl0SAASLAoLYWRkX2NvbW1lbnQYECABKAsyFS5zeXNtbC5BZGRDb21tZW50RWRpdEgAEiYKCGFkZF9ub3RlGBIgASgLMhIuc3lzbWwuQWRkTm90ZUVkaXRIAEILCglvcGVyYXRpb24ikgIKDUFkZE1lbWJlckVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEgwKBHR5cGUYBCABKAkSFAoMbXVsdGlwbGljaXR5GAUgASgJEg0KBXZhbHVlGAYgASgJEhMKC3NwZWNpYWxpemVzGAcgAygJEhMKC2lzX2Fic3RyYWN0GAggASgIEhEKCXJlZGVmaW5lcxgJIAMoCRISCgppc19kZWZhdWx0GAogASgIEhEKCWRpcmVjdGlvbhgLIAEoCRIZChFtZXRhZGF0YV9wcmVmaXhlcxgOIAMoCRILCgNkb2MYDCABKAkSFwoPYm9keV9leHByZXNzaW9uGA0gASgJInkKDkFkZFNhdGlzZnlFZGl0Eg0KBW93bmVyGAEgASgJEhMKC3JlcXVpcmVtZW50GAIgASgJEhoKEnNhdGlzZnlpbmdfZmVhdHVyZRgDIAEoCRITCgtpc19hc3NlcnRlZBgEIAEoCBISCgppc19uZWdhdGVkGAUgASgIIl0KHEFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRISCgpleHByZXNzaW9uGAMgASgJEgwKBG5hbWUYBCABKAkikQEKEUFkZFRyYW5zaXRpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBG5hbWUYAiABKAkSDgoGc291cmNlGAMgASgJEg4KBnRhcmdldBgEIAEoCRIPCgd0cmlnZ2VyGAUgASgJEg0KBWd1YXJkGAYgASgJEg4KBmVmZmVjdBgHIAEoCRIPCgdpbml0aWFsGAggASgIIjMKDUFkZFZlcmlmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkiNgoUTWV0YWRhdGFGZWF0dXJlVmFsdWUSDwoHZmVhdHVyZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKUAQoPQWRkTWV0YWRhdGFFZGl0Eg0KBW93bmVyGAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5NZXRhZGF0YUZlYXR1cmVWYWx1ZRIRCglzaG9ydGhhbmQYBiABKAgiPgoVQWRkTWV0YWRhdGFQcmVmaXhFZGl0Eg4KBnRhcmdldBgBIAEoCRIVCg1tZXRhZGF0YV90eXBlGAIgASgJIoABCg1BZGRJbXBvcnRFZGl0Eg0KBW93bmVyGAEgASgJEhIKCnZpc2liaWxpdHkYAiABKAkSDgoGdGFyZ2V0GAMgASgJEhQKDGlzX3JlY3Vyc2l2ZRgEIAEoCBIVCg1pc19pbXBvcnRfYWxsGAUgASgIEg8KB2ZpbHRlcnMYBiADKAkiYwoUQWRkRG9jdW1lbnRhdGlvbkVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZsb2NhbGUYBCABKAkSDwoHcmVwbGFjZRgFIAEoCCJaCg5BZGRDb21tZW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRib2R5GAIgASgJEgwKBG5hbWUYAyABKAkSDQoFYWJvdXQYBCADKAkSDgoGbG9jYWxlGAUgASgJIisKC0FkZE5vdGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIMCgR0ZXh0GAIgASgJIs0CCg9BZGRTZXF1ZW5jZUVkaXQSDQoFb3duZXIYASABKAkSDwoHa2V5d29yZBgCIAEoCRILCgNyZWYYAyABKAkSEwoLbWVtYmVyX2tpbmQYBCABKAkSEwoLbWVtYmVyX25hbWUYBSABKAkSDAoEdHlwZRgGIAEoCRINCgVhZnRlchgHIAEoCRIRCgljb25kaXRpb24YCCABKAkSDQoFdmFsdWUYCSABKAkSDgoGdGFyZ2V0GAogASgJEgsKA3ZpYRgLIAEoCRINCgV1bnRpbBgMIAEoCRIkCgRib2R5GA0gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EikKCWVsc2VfYm9keRgOIAMoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdBIUCgxtdWx0aXBsaWNpdHkYDyABKAkSEQoJcGFyYW1ldGVyGBAgASgJIm4KEUFkZENvbm5lY3Rpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBGtpbmQYAiABKAkSEAoIZnJvbV9lbmQYAyABKAkSDgoGdG9fZW5kGAQgASgJEgwKBG5hbWUYBSABKAkSDAoEdHlwZRgGIAEoCSItCgpEZWxldGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIPCgdjYXNjYWRlGAIgASgIIikKCE1vdmVFZGl0Eg4KBnRhcmdldBgBIAEoCRINCgVvd25lchgCIAEoCSItCgxTZXRWYWx1ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBXZhbHVlGAIgASgJIi4KClJlbmFtZUVkaXQSDgoGdGFyZ2V0GAEgASgJEhAKCG5ld19uYW1lGAIgASgJIpACChJBcHBseUVkaXRzUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRIjCgdhcHBsaWVkGAIgAygLMhIuc3lzbWwuQXBwbGllZEVkaXQSDQoFZXJyb3IYAyABKAkSIwoHZmFpbHVyZRgEIAEoDjISLnN5c21sLkVkaXRGYWlsdXJlEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIaChJyZWZlcnJpbmdfZWxlbWVudHMYBiADKAkSKAoJZG9jdW1lbnRzGAcgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSIgoJcmVmZXJyZXJzGAggAygLMg8uc3lzbWwuUmVmZXJyZXIiLwoORWRpdGVkRG9jdW1lbnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJIioKCFJlZmVycmVyEgwKBG5hbWUYASABKAkSEAoIZG9jdW1lbnQYAiABKAkijAEKC0FwcGxpZWRFZGl0EhcKD29wZXJhdGlvbl9pbmRleBgBIAEoBRIOCgZ0YXJnZXQYAiABKAkSDgoGb2Zmc2V0GAMgASgFEg4KBmxlbmd0aBgEIAEoBRIQCghvbGRfdGV4dBgFIAEoCRIQCghuZXdfdGV4dBgGIAEoCRIQCghkb2N1bWVudBgHIAEoCSL9AgoKU3ltYm9sSW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSMQoIbWV0YWRhdGEYBCADKAsyHy5zeXNtbC5TeW1ib2xJbmZvLk1ldGFkYXRhRW50cnkSEQoJY2hpbGRfaWRzGAUgAygJEigKCmF0dHJpYnV0ZXMYBiADKAsyFC5zeXNtbC5BdHRyaWJ1dGVJbmZvEiIKCXR5cGVfaW5mbxgHIAEoCzIPLnN5c21sLlR5cGVJbmZvEi0KDG11bHRpcGxpY2l0eRgIIAEoCzIXLnN5c21sLk11bHRpcGxpY2l0eUluZm8SLgoPc3BlY2lhbGl6YXRpb25zGAkgAygLMhUuc3lzbWwuU3BlY2lhbGl6YXRpb24SIwobd2l0aGhlbGRfbGlicmFyeV9hdHRyaWJ1dGVzGAogASgFGi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJYCg5TcGVjaWFsaXphdGlvbhIMCgRraW5kGAEgASgJEhAKCGRlY2xhcmVkGAIgASgJEhEKCXRhcmdldF9pZBgDIAEoCRITCgt0YXJnZXRfa2luZBgEIAEoCSKVAQoIVHlwZUluZm8SEAoIZGVjbGFyZWQYASABKAkSEwoLcmVzb2x2ZWRfaWQYAiABKAkSFQoNcmVzb2x2ZWRfa2luZBgDIAEoCRIRCglwcmltaXRpdmUYBCABKAkSGAoQcHJpbWl0aXZlX3NvdXJjZRgFIAEoCRIQCghxdWFudGl0eRgGIAEoCBIMCgR1bml0GAcgASgJIjAKEE11bHRpcGxpY2l0eUluZm8SDQoFbG93ZXIYASABKAkSDQoFdXBwZXIYAiABKAkiVgoNQXR0cmlidXRlSW5mbxIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkSGwoFdmFsdWUYAyABKAsyDC5zeXNtbC5WYWx1ZRIMCgR1bml0GAQgASgJIocGCgVWYWx1ZRITCglpbnRfdmFsdWUYASABKANIABIUCgpyZWFsX3ZhbHVlGAIgASgBSAASFAoKYm9vbF92YWx1ZRgDIAEoCEgAEhYKDHN0cmluZ192YWx1ZRgEIAEoCUgAEhUKC2luc3RhbmNlX2lkGAUgASgDSAASKAoIc2VxdWVuY2UYBiABKAsyFC5zeXNtbC5WYWx1ZVNlcXVlbmNlSAASDgoEbnVsbBgHIAEoCUgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIqCgxlbnVtX2xpdGVyYWwYCSABKAsyEi5zeXNtbC5FbnVtTGl0ZXJhbEgAEg8KBXVuc2V0GAogASgISAASIQoHY29tcGxleBgLIAEoCzIOLnN5c21sLkNvbXBsZXhIABIdCgVhcnJheRgMIAEoCzIMLnN5c21sLkFycmF5SAASHwoGdmVjdG9yGA0gASgLMg0uc3lzbWwuVmVjdG9ySAASMAoPdmVjdG9yX3F1YW50aXR5GA4gASgLMhUuc3lzbWwuVmVjdG9yUXVhbnRpdHlIABIwCg9tZWFzdXJlbWVudF9yZWYYDyABKAsyFS5zeXNtbC5NZWFzdXJlbWVudFJlZkgAEhIKCGluZmluaXR5GBAgASgISAASIwoIZnVuY3Rpb24YESABKAsyDy5zeXNtbC5GdW5jdGlvbkgAEh4KA3NldBgSIAEoCzIPLnN5c21sLlZhbHVlU2V0SAASMAoPdGVuc29yX3F1YW50aXR5GBMgASgLMhUuc3lzbWwuVGVuc29yUXVhbnRpdHlIABInCgptZXRhb2JqZWN0GBQgASgLMhEuc3lzbWwuTWV0YW9iamVjdEgAEisKDHVuZGV0ZXJtaW5lZBgVIAEoCzITLnN5c21sLlVuZGV0ZXJtaW5lZEgAEhcKDWJpZ19pbnRfdmFsdWUYFiABKAlIABIpCg5yYXRpb25hbF92YWx1ZRgXIAEoCzIPLnN5c21sLlJhdGlvbmFsSABCBgoEa2luZCIyCghSYXRpb25hbBIRCgludW1lcmF0b3IYASABKAkSEwoLZGVub21pbmF0b3IYAiABKAkiNgoKTWV0YW9iamVjdBISCgplbGVtZW50X2lkGAEgASgJEhQKDG1ldGFjbGFzc19pZBgCIAEoCSJGCgxVbmRldGVybWluZWQSDgoGcmVhc29uGAEgASgJEiYKBWNvdW50GAIgASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbyIsCghGdW5jdGlvbhIPCgdjYWxjX2lkGAEgASgJEg8KB3NlbGZfaWQYAiABKAMiKgoIVmFsdWVTZXQSHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSJJCg5UZW5zb3JRdWFudGl0eRISCgpkaW1lbnNpb25zGAEgAygDEiMKCmNvbXBvbmVudHMYAiADKAsyDy5zeXNtbC5RdWFudGl0eSI7CgVBcnJheRISCgpkaW1lbnNpb25zGAEgAygDEh4KCGVsZW1lbnRzGAIgAygLMgwuc3lzbWwuVmFsdWUiKgoGVmVjdG9yEiAKCmNvbXBvbmVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSI1Cg5WZWN0b3JRdWFudGl0eRIjCgpjb21wb25lbnRzGAEgAygLMg8uc3lzbWwuUXVhbnRpdHkiKgoHQ29tcGxleBIMCgRyZWFsGAEgASgBEhEKCWltYWdpbmFyeRgCIAEoASJkCgtFbnVtTGl0ZXJhbBISCgpsaXRlcmFsX2lkGAEgASgJEhYKDmVudW1lcmF0aW9uX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSGwoFdmFsdWUYBCABKAsyDC5zeXNtbC5WYWx1ZSIvCg1WYWx1ZVNlcXVlbmNlEh4KCGVsZW1lbnRzGAEgAygLMgwuc3lzbWwuVmFsdWUiyAEKCFF1YW50aXR5EhcKDWludF9tYWduaXR1ZGUYASABKANIABIYCg5yZWFsX21hZ25pdHVkZRgCIAEoAUgAEhsKEWJpZ19pbnRfbWFnbml0dWRlGAUgASgJSAASLQoScmF0aW9uYWxfbWFnbml0dWRlGAYgASgLMg8uc3lzbWwuUmF0aW9uYWxIABIMCgR1bml0GAMgASgJEiIKCXVuaXRfdGVybRgEIAEoCzIPLnN5c21sLlVuaXRUZXJtQgsKCW1hZ25pdHVkZSJTCg5NZWFzdXJlbWVudFJlZhIMCgR1bml0GAEgASgJEiIKCXVuaXRfdGVybRgCIAEoCzIPLnN5c21sLlVuaXRUZXJtEg8KB3VuaXRfaWQYAyABKAkiVAoIVW5pdFRlcm0SEQoJc2NhbGVfbnVtGAEgASgBEhEKCXNjYWxlX2RlbhgCIAEoARIiCgdmYWN0b3JzGAMgAygLMhEuc3lzbWwuVW5pdEZhY3RvciIvCgpVbml0RmFjdG9yEg8KB3VuaXRfaWQYASABKAkSEAoIZXhwb25lbnQYAiABKAEihgEKCkRpYWdub3N0aWMSEAoIc2V2ZXJpdHkYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIZCgRzcGFuGAMgASgLMgsuc3lzbWwuU3BhbhIMCgRjb2RlGAQgASgJEhcKD29yZGVyX2RlcGVuZGVudBgFIAMoCRITCgtpbmRlcGVuZGVudBgGIAEoCCJeCgRTcGFuEgwKBGZpbGUYASABKAkSEgoKc3RhcnRfbGluZRgCIAEoBRIRCglzdGFydF9jb2wYAyABKAUSEAoIZW5kX2xpbmUYBCABKAUSDwoHZW5kX2NvbBgFIAEoBSITChFTZXJ2ZXJJbmZvUmVxdWVzdCI7ChJTZXJ2ZXJJbmZvUmVzcG9uc2USDwoHdmVyc2lvbhgBIAEoCRIUCgxjYXBhYmlsaXRpZXMYAiADKAkiUwoMUXVlcnlSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGwoFcXVlcnkYAiABKAsyDC5zeXNtbC5RdWVyeRISCgpvc2xjX3F1ZXJ5GAMgASgJIjwKDVF1ZXJ5UmVzcG9uc2USKwoIZWxlbWVudHMYASADKAsyGS5zeXNtbC5RdWVyeVJlc3VsdEVsZW1lbnQiWgoFUXVlcnkSDQoFc2NvcGUYASADKAkSDgoGc2VsZWN0GAIgAygJEiAKBXdoZXJlGAMgASgLMhEuc3lzbWwuQ29uc3RyYWludBIQCghvcmRlcl9ieRgEIAMoCSJ8CgpDb25zdHJhaW50Ei8KCXByaW1pdGl2ZRgBIAEoCzIaLnN5c21sLlByaW1pdGl2ZUNvbnN0cmFpbnRIABIvCgljb21wb3NpdGUYAiABKAsyGi5zeXNtbC5Db21wb3NpdGVDb25zdHJhaW50SABCDAoKY29uc3RyYWludCJzChNQcmltaXRpdmVDb25zdHJhaW50Eg8KB2ludmVyc2UYASABKAgSEAoIcHJvcGVydHkYAiABKAkSKgoIb3BlcmF0b3IYAyABKA4yGC5zeXNtbC5QcmltaXRpdmVPcGVyYXRvchINCgV2YWx1ZRgEIAMoCSJoChNDb21wb3NpdGVDb25zdHJhaW50EioKCG9wZXJhdG9yGAEgASgOMhguc3lzbWwuQ29tcG9zaXRlT3BlcmF0b3ISJQoKY29uc3RyYWludBgCIAMoCzIRLnN5c21sLkNvbnN0cmFpbnQioAEKElF1ZXJ5UmVzdWx0RWxlbWVudBIKCgJpZBgBIAEoCRIMCgR0eXBlGAIgASgJEj0KCnByb3BlcnRpZXMYAyADKAsyKS5zeXNtbC5RdWVyeVJlc3VsdEVsZW1lbnQuUHJvcGVydGllc0VudHJ5GjEKD1Byb3BlcnRpZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBInMKClN3ZWVwUmFuZ2USEQoJcGFyYW1ldGVyGAEgASgJEhsKBXN0YXJ0GAIgASgLMgwuc3lzbWwuVmFsdWUSGQoDZW5kGAMgASgLMgwuc3lzbWwuVmFsdWUSGgoEc3RlcBgEIAEoCzIMLnN5c21sLlZhbHVlItACCg9SdW5Td2VlcFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSHwoJYXJndW1lbnRzGAQgAygLMgwuc3lzbWwuVmFsdWUSQwoPbmFtZWRfYXJndW1lbnRzGAUgAygLMiouc3lzbWwuUnVuU3dlZXBSZXF1ZXN0Lk5hbWVkQXJndW1lbnRzRW50cnkSIQoGcmFuZ2VzGAYgAygLMhEuc3lzbWwuU3dlZXBSYW5nZRIPCgdzYW1wbGVzGAcgASgDEgwKBHNlZWQYCCABKAQSDgoGZW5naW5lGAkgASgJGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIvQBCghTd2VlcFJvdxIhCgZpbnB1dHMYASADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiIKB291dHB1dHMYAiADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAMgAygLMg4uc3lzbWwuVmVyZGljdBIWCg5lbGFwc2VkX21pY3JvcxgEIAEoAxINCgVlcnJvchgFIAEoCRIsCg5mYWlsdXJlX3JlYXNvbhgGIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SKgoLZXZhbHVhdGlvbnMYByADKAsyFS5zeXNtbC5DYXNlRXZhbHVhdGlvbiKtAgoQUnVuU3dlZXBSZXNwb25zZRIdCgRyb3dzGAEgAygLMg8uc3lzbWwuU3dlZXBSb3cSEgoKcGFyYW1ldGVycxgCIAMoCRIPCgdzYW1wbGVkGAMgASgIEgwKBHNlZWQYBCABKAQSDQoFZXJyb3IYBSABKAkSJgoLZGlhZ25vc3RpY3MYBiADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAcgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIiCglpbnN0YW5jZXMYCCADKAsyDy5zeXNtbC5JbnN0YW5jZRIOCgZlbmdpbmUYCSABKAkSEAoIc3RyZW5ndGgYCiABKAkSHAoGYm91bmRzGAsgAygLMgwuc3lzbWwuQm91bmQimgQKDlJ1blJ1bnNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGAoQYWN0aW9uX3N5bWJvbF9pZBgCIAEoCRIaChJhbmFseXNpc19zeW1ib2xfaWQYAyABKAkSMQoGaW5wdXRzGAQgAygLMiEuc3lzbWwuUnVuUnVuc1JlcXVlc3QuSW5wdXRzRW50cnkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgGIAEoCRIfCglhcmd1bWVudHMYByADKAsyDC5zeXNtbC5WYWx1ZRJCCg9uYW1lZF9hcmd1bWVudHMYCCADKAsyKS5zeXNtbC5SdW5SdW5zUmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5EgwKBHJ1bnMYCSABKAMSEQoEc2VlZBgKIAEoBEgAiAEBEg0KBWRyYXdzGAsgASgJEhIKCmNsb2NrX3N0ZXAYDCABKAESDwoHb2JzZXJ2ZRgNIAMoCRIOCgZlbmdpbmUYDiABKAkaOwoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBQgcKBV9zZWVkIrACCg9SdW5EaXN0cmlidXRpb24SDAoEbmFtZRgBIAEoCRIMCgR1bml0GAIgASgJEg0KBWNvdW50GAMgASgDEg8KB251bWVyaWMYBCABKAgSGQoDbWluGAUgASgLMgwuc3lzbWwuVmFsdWUSGQoDbWF4GAYgASgLMgwuc3lzbWwuVmFsdWUSGgoEbWVhbhgHIAEoCzIMLnN5c21sLlZhbHVlEhEKCWRldmlhdGlvbhgIIAEoARIpCgtwZXJjZW50aWxlcxgJIAMoCzIULnN5c21sLlJ1blBlcmNlbnRpbGUSKQoJaGlzdG9ncmFtGAogAygLMhYuc3lzbWwuUnVuSGlzdG9ncmFtQmluEiYKBnZhbHVlcxgLIAMoCzIWLnN5c21sLlJ1bkNvdW50ZWRWYWx1ZSJACg1SdW5QZXJjZW50aWxlEhIKCnBlcmNlbnRpbGUYASABKAESGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZSJXCg9SdW5IaXN0b2dyYW1CaW4SGQoDbG93GAEgASgLMgwuc3lzbWwuVmFsdWUSGgoEaGlnaBgCIAEoCzIMLnN5c21sLlZhbHVlEg0KBWNvdW50GAMgASgDIj0KD1J1bkNvdW50ZWRWYWx1ZRIbCgV2YWx1ZRgBIAEoCzIMLnN5c21sLlZhbHVlEg0KBWNvdW50GAIgASgDIkIKEFNlbGZDaGVja1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIaChJzZWxmX2NoZWNrX3BhY2thZ2UYAiADKAkiiQEKEFNlbGZDaGVja0ZpbmRpbmcSDgoGc3RhdHVzGAEgASgJEg8KB3N1YmplY3QYAiABKAkSEAoIbG9jYXRpb24YAyABKAkSEgoKY29uc3RyYWludBgEIAEoCRIPCgdlbGVtZW50GAUgASgJEg8KB21lc3NhZ2UYBiABKAkSDAoEbGluZRgHIAEoCSI5ChRTZWxmQ2hlY2tBcHBsaWNhdGlvbhISCgpjb25zdHJhaW50GAEgASgJEg0KBWNvdW50GAIgASgDIq8CChFTZWxmQ2hlY2tSZXNwb25zZRIOCgZzdGF0dXMYASABKAkSKQoIZmluZGluZ3MYAiADKAsyFy5zeXNtbC5TZWxmQ2hlY2tGaW5kaW5nEhAKCGVsZW1lbnRzGAMgASgDEg4KBmNoZWNrcxgEIAEoAxISCgp2aW9sYXRpb25zGAUgASgDEhMKC3VuZXZhbHVhdGVkGAYgASgDEhkKEWV2YWx1YXRpb25fZXJyb3JzGAcgASgDEjEKDGFwcGxpY2F0aW9ucxgIIAMoCzIbLnN5c21sLlNlbGZDaGVja0FwcGxpY2F0aW9uEg8KB3N1bW1hcnkYCSABKAkSDQoFZXJyb3IYCiABKAkSJgoLZGlhZ25vc3RpY3MYCyADKAsyES5zeXNtbC5EaWFnbm9zdGljIpUDChBSZWNvcmRSdW5SZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGgoSYW5hbHlzaXNfc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEh8KCWFyZ3VtZW50cxgEIAMoCzIMLnN5c21sLlZhbHVlEkQKD25hbWVkX2FyZ3VtZW50cxgFIAMoCzIrLnN5c21sLlJlY29yZFJ1blJlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIOCgZlbmdpbmUYBiABKAkSEwoLcmVjb3JkX2ludG8YByABKAkSIQoGcmFuZ2VzGAggAygLMhEuc3lzbWwuU3dlZXBSYW5nZRIMCgRydW5zGAkgASgDEhEKBHNlZWQYCiABKARIAIgBARIYChBhY2NlcHRfZG9jdW1lbnRzGAsgASgIGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBQgcKBV9zZWVkIqgDChFSZWNvcmRSdW5SZXNwb25zZRInCgNydW4YASABKAsyGi5zeXNtbC5SdW5BbmFseXNpc1Jlc3BvbnNlEiYKBXN3ZWVwGAIgASgLMhcuc3lzbWwuUnVuU3dlZXBSZXNwb25zZRImCgZzYW1wbGUYAyABKAsyFi5zeXNtbC5SdW5SdW5zUmVzcG9uc2USDwoHcGFja2FnZRgEIAEoCRISCgpkZWZpbml0aW9uGAUgASgJEg8KB3JlY29yZHMYBiADKAkSDgoGc291cmNlGAcgASgJEg8KB2NvbnRlbnQYCCABKAkSKAoJZG9jdW1lbnRzGAkgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSDwoHc2tpcHBlZBgKIAEoAxIPCgdyZWFzb25zGAsgAygJEg0KBWVycm9yGAwgASgJEiwKDmZhaWx1cmVfcmVhc29uGA0gASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhImCgtkaWFnbm9zdGljcxgOIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSEgoKbW9kZWxfaGFzaBgPIAEoCSLDAwoPUnVuUnVuc1Jlc3BvbnNlEh0KBHJvd3MYASADKAsyDy5zeXNtbC5Td2VlcFJvdxITCgtvYnNlcnZhYmxlcxgCIAMoCRItCg1kaXN0cmlidXRpb25zGAMgAygLMhYuc3lzbWwuUnVuRGlzdHJpYnV0aW9uEg0KBWxpbmVzGAQgAygJEiIKB291dHB1dHMYBSADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAYgAygLMg4uc3lzbWwuVmVyZGljdBITCgt1bmNvbmNsdWRlZBgHIAEoCRINCgVlcnJvchgIIAEoCRImCgtkaWFnbm9zdGljcxgJIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YCiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiIKCWluc3RhbmNlcxgLIAMoCzIPLnN5c21sLkluc3RhbmNlEg4KBmVuZ2luZRgMIAEoCRIQCghzdHJlbmd0aBgNIAEoCRIcCgZib3VuZHMYDiADKAsyDC5zeXNtbC5Cb3VuZBIRCgRzZWVkGA8gASgESACIAQFCBwoFX3NlZWQibgoXUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIQCghxdWVyeV9pZBgCIAEoCRItCghiaW5kaW5ncxgDIAMoCzIbLnN5c21sLkRvY3VtZW50UXVlcnlCaW5kaW5nIk8KFERvY3VtZW50UXVlcnlCaW5kaW5nEhEKCXBhcmFtZXRlchgBIAEoCRIkCgZ2YWx1ZXMYAiADKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlIrsDCg1Eb2N1bWVudFZhbHVlEhQKCmVsZW1lbnRfaWQYASABKAlIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABITCglpbnRfdmFsdWUYAyABKANIABIUCgpyZWFsX3ZhbHVlGAQgASgBSAASFAoKYm9vbF92YWx1ZRgFIAEoCEgAEhIKCGluZmluaXR5GAYgASgISAASIwoIcXVhbnRpdHkYCCABKAsyDy5zeXNtbC5RdWFudGl0eUgAEikKB3ZlcmRpY3QYCSABKAsyFi5zeXNtbC5Eb2N1bWVudFZlcmRpY3RIABInCgZvYmplY3QYCiABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdEgAEiUKBXN0YXRlGAsgASgLMhQuc3lzbWwuRG9jdW1lbnRTdGF0ZUgAEiUKBWV2ZW50GAwgASgLMhQuc3lzbWwuRG9jdW1lbnRFdmVudEgAEhcKDWJpZ19pbnRfdmFsdWUYDSABKAlIABIpCg5yYXRpb25hbF92YWx1ZRgOIAEoCzIPLnN5c21sLlJhdGlvbmFsSAASFAoMZWxlbWVudF90eXBlGAcgASgJQgYKBGtpbmQiWgoORG9jdW1lbnRPYmplY3QSEwoLaW5zdGFuY2VfaWQYASABKAMSDAoEcGF0aBgCIAEoCRIlCgdlbGVtZW50GAMgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZSKuAQoPRG9jdW1lbnRWZXJkaWN0EicKCWFzc2VydGlvbhgBIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSDAoEa2luZBgCIAEoCRIMCgR0ZXh0GAMgASgJEgwKBHBhdGgYBCABKAkSDwoHdmVyZGljdBgFIAEoCRIRCgljb25kaXRpb24YBiABKAkSDgoGcmVhc29uGAcgASgJEhQKDHZlcmlmaWNhdGlvbhgIIAMoCSKxAQoNRG9jdW1lbnRTdGF0ZRIlCgZvYmplY3QYASABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdBIPCgdtYWNoaW5lGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKc3RhdGVfcGF0aBgEIAEoCRIjCgVzdGF0ZRgFIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSDgoGcmVnaW9uGAYgASgJEhEKCWVuY2xvc2luZxgHIAMoCSLnAgoNRG9jdW1lbnRFdmVudBIMCgRraW5kGAEgASgJEiIKBHRpbWUYAiABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlEiUKBm9iamVjdBgDIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg8KB21hY2hpbmUYBCABKAkSDQoFc3RhdGUYBSABKAkSDAoEZnJvbRgGIAEoCRIKCgJ0bxgHIAEoCRIlCgZ0YXJnZXQYCCABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdBINCgVldmVudBgJIAEoCRIPCgdwYXlsb2FkGAogAygJEhQKDGFsdGVybmF0aXZlcxgLIAMoCRINCgV0YWtlbhgMIAEoCRIMCgR0ZXh0GA0gASgJEg0KBXRva2VuGA4gASgDEgwKBHN0ZXAYDyABKAUSDwoHZmVhdHVyZRgQIAEoCRIbCgV2YWx1ZRgRIAEoCzIMLnN5c21sLlZhbHVlIiMKE0RvY3VtZW50UXVlcnlDb2x1bW4SDAoEbmFtZRgBIAEoCSI5ChFEb2N1bWVudFF1ZXJ5Q2VsbBIkCgZ2YWx1ZXMYASADKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlImIKEERvY3VtZW50UXVlcnlSb3cSJQoHZWxlbWVudBgBIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSJwoFY2VsbHMYAiADKAsyGC5zeXNtbC5Eb2N1bWVudFF1ZXJ5Q2VsbCJuChhSdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USKwoHY29sdW1ucxgBIAMoCzIaLnN5c21sLkRvY3VtZW50UXVlcnlDb2x1bW4SJQoEcm93cxgCIAMoCzIXLnN5c21sLkRvY3VtZW50UXVlcnlSb3cipAEKDFF1ZXJ5T3V0Y29tZRIMCgRraW5kGAEgASgJEgwKBHN0ZXAYAiABKAkSJQoIZmFpbHVyZXMYAyADKAsyEy5zeXNtbC5RdWVyeUZhaWx1cmUSJQoIZmluZGluZ3MYBCADKAsyEy5zeXNtbC5RdWVyeUZpbmRpbmcSKgoNcGF0aF9mYWlsdXJlcxgFIAMoCzITLnN5c21sLlF1ZXJ5RmFpbHVyZSJWCgxRdWVyeUZhaWx1cmUSDAoEc3RlcBgBIAEoCRIQCghleHBlY3RlZBgCIAEoCRImCghmcm9udGllchgDIAEoCzIULnN5c21sLlF1ZXJ5RnJvbnRpZXIilwEKDVF1ZXJ5RnJvbnRpZXISCgoCYXQYASABKAkSKwoHbWVtYmVycxgCIAMoCzIaLnN5c21sLlF1ZXJ5RnJvbnRpZXJNZW1iZXISLQoIZmVhdHVyZXMYAyADKAsyGy5zeXNtbC5RdWVyeUZyb250aWVyRmVhdHVyZRINCgVraW5kcxgEIAMoCRIPCgduZWFyZXN0GAUgASgJIjYKE1F1ZXJ5RnJvbnRpZXJNZW1iZXISDAoEbmFtZRgBIAEoCRIRCgltZXRhY2xhc3MYAiABKAkiMgoUUXVlcnlGcm9udGllckZlYXR1cmUSDAoEbmFtZRgBIAEoCRIMCgR0eXBlGAIgASgJIlMKDFF1ZXJ5RmluZGluZxIMCgRzdGVwGAEgASgJEg8KB2VsZW1lbnQYAiABKAkSEgoKY29uc3RyYWludBgDIAEoCRIQCghvYnNlcnZlZBgEIAEoCSJOChVSZW5kZXJEb2N1bWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIMCgRmb3JtGAMgASgJIl0KFlJlbmRlckRvY3VtZW50UmVzcG9uc2USEAoIbWFya2Rvd24YASABKAkSDAoEaHRtbBgCIAEoCRIQCghhc2NpaWRvYxgEIAEoCRIRCglmaWxlX25hbWUYAyABKAkidwoRUmVuZGVyVmlld1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIMCgR2aWV3GAIgASgJEg0KBXBvcnRzGAMgASgJEgwKBHNob3cYBCADKAkSDQoFZGVwdGgYBSABKAUSFAoMY29tcGFydG1lbnRzGAYgASgJIpwCChJSZW5kZXJWaWV3UmVzcG9uc2USDAoEdmlldxgBIAEoCRIMCgRraW5kGAIgASgJEg4KBnN0YXRlZBgDIAEoCRIgCgVub2RlcxgEIAMoCzIRLnN5c21sLlJlbmRlck5vZGUSIAoFZWRnZXMYBSADKAsyES5zeXNtbC5SZW5kZXJFZGdlEg8KB2NvbHVtbnMYBiADKAkSHgoEcm93cxgHIAMoCzIQLnN5c21sLlJlbmRlclJvdxIjCgZjYW52YXMYCCABKAsyEy5zeXNtbC5SZW5kZXJDYW52YXMSIAoFbm90ZXMYCSADKAsyES5zeXNtbC5SZW5kZXJOb3RlEg8KB25vdGljZXMYCiADKAkSDQoFc2hvd24YCyADKAkizwIKClJlbmRlck5vZGUSCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEhgKEG5hbWVfc3ludGhlc2l6ZWQYBCABKAgSDAoEdHlwZRgFIAEoCRIOCgZkZXRhaWwYBiABKAkSDAoEdGV4dBgHIAEoCRIQCghzdGFuZF9pbhgIIAEoCBIOCgZwYXJlbnQYCSABKAkSIAoFcG9ydHMYCiADKAsyES5zeXNtbC5SZW5kZXJQb3J0EhsKBm9yaWdpbhgLIAEoCzILLnN5c21sLlNwYW4SJwoIZ2VvbWV0cnkYDCABKAsyFS5zeXNtbC5SZW5kZXJHZW9tZXRyeRIhCgVzdHlsZRgNIAEoCzISLnN5c21sLlJlbmRlclN0eWxlEhMKC2NvbXBhcnRtZW50GA4gASgJEhEKCWluaGVyaXRlZBgPIAEoCCJaCgpSZW5kZXJQb3J0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIRCglkaXJlY3Rpb24YBCABKAkSEQoJaW5oZXJpdGVkGAUgASgIItgBCgpSZW5kZXJFZGdlEgwKBGZyb20YASABKAkSCgoCdG8YAiABKAkSEQoJZnJvbV9wb3J0GAMgASgJEg8KB3RvX3BvcnQYBCABKAkSDQoFbGFiZWwYBSABKAkSDAoEbmFtZRgGIAEoCRIMCgRraW5kGAcgASgJEhsKBm9yaWdpbhgIIAEoCzILLnN5c21sLlNwYW4SIQoFcm91dGUYCSADKAsyEi5zeXNtbC5SZW5kZXJQb2ludBIhCgVzdHlsZRgKIAEoCzISLnN5c21sLlJlbmRlclN0eWxlInwKDlJlbmRlckdlb21ldHJ5EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAESEAoIaGFzX3NpemUYBSABKAgSEQoJY29sbGFwc2VkGAYgASgIEhAKCHVucGxhY2VkGAcgASgIIk0KDFJlbmRlckNhbnZhcxIMCgR1bml0GAEgASgJEg0KBXdpZHRoGAIgASgBEg4KBmhlaWdodBgDIAEoARIQCghoYXNfc2l6ZRgEIAEoCCJ2CgtSZW5kZXJTdHlsZRIMCgRmaWxsGAEgASgJEgwKBGxpbmUYAiABKAkSDAoEdGV4dBgDIAEoCRIMCgRmb250GAQgASgJEhEKCWZvbnRfc2l6ZRgFIAEoARIMCgRib2xkGAYgASgIEg4KBml0YWxpYxgHIAEoCCIjCgtSZW5kZXJQb2ludBIJCgF4GAEgASgBEgkKAXkYAiABKAEiNwoJUmVuZGVyUm93Eg0KBWNlbGxzGAEgAygJEhsKBm9yaWdpbhgCIAEoCzILLnN5c21sLlNwYW4isgEKClJlbmRlck5vdGUSDAoEdGV4dBgBIAEoCRIOCgZhbmNob3IYAiABKAkSEQoJZWRnZV9mcm9tGAMgASgJEg8KB2VkZ2VfdG8YBCABKAkSCQoBeBgFIAEoARIJCgF5GAYgASgBEg0KBXdpZHRoGAcgASgBEg4KBmhlaWdodBgIIAEoARIQCghoYXNfc2l6ZRgJIAEoCBIbCgZvcmlnaW4YCiABKAsyCy5zeXNtbC5TcGFuIjoKE0V4cG9ydEdyYXBoc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIPCgdzdWJqZWN0GAIgASgJIkkKFEV4cG9ydEdyYXBoc1Jlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSDwoHdmVyc2lvbhgCIAEoBRIPCgdzdWJqZWN0GAMgASgJIpABChFJbXBvcnREYXRhUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEiIKB2ltcG9ydHMYAiADKAsyES5zeXNtbC5EYXRhSW1wb3J0EhEKCWltcG9ydF9hcxgDIAEoCRIWCg5pbXBvcnRfZHJ5X3J1bhgEIAEoCBIYChBhY2NlcHRfZG9jdW1lbnRzGAUgASgIIlYKCkRhdGFJbXBvcnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEhUKDWltcG9ydF9mb3JtYXQYAyABKAkSEgoKaW1wb3J0X21hcBgEIAEoCSK+AQoSSW1wb3J0RGF0YVJlc3BvbnNlEiIKBWZpbGVzGAEgAygLMhMuc3lzbWwuSW1wb3J0ZWRGaWxlEigKCWRvY3VtZW50cxgCIAMoCzIVLnN5c21sLkVkaXRlZERvY3VtZW50Eg8KB2NvbnRlbnQYAyABKAkSEgoKbW9kZWxfaGFzaBgEIAEoCRINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMiaQoMSW1wb3J0ZWRGaWxlEgwKBG5hbWUYASABKAkSDgoGdmFsdWVzGAIgASgDEhAKCGVsZW1lbnRzGAMgASgDEikKC2Fzc2lnbm1lbnRzGAQgAygLMhQuc3lzbWwuSW1wb3J0ZWRWYWx1ZSJ3Cg1JbXBvcnRlZFZhbHVlEg8KB2VsZW1lbnQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIRCglyZWRlZmluZXMYBCABKAkSDQoFd2hlcmUYBSABKAkSEwoLZGVzY3JpcHRpb24YBiABKAki5gEKFUNvbXBhcmVSZXN1bHRzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEg8KB3Jlc3VsdHMYAiABKAkSDwoHYWN0aW9ucxgDIAMoCRIMCgRydW5zGAQgASgDEhEKBHNlZWQYBSABKARIAIgBARINCgVkcmF3cxgGIAEoCRIXCgpjbG9ja19zdGVwGAcgASgBSAGIAQESJgoHb2JzZXJ2ZRgIIAMoCzIVLnN5c21sLk9ic2VydmFibGVQYWlyEg4KBmVuZ2luZRgJIAEoCUIHCgVfc2VlZEINCgtfY2xvY2tfc3RlcCIxCg5PYnNlcnZhYmxlUGFpchIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCSKFAgoWQ29tcGFyZVJlc3VsdHNSZXNwb25zZRI2Cg5jb25maWd1cmF0aW9ucxgBIAMoCzIeLnN5c21sLkNvbmZpZ3VyYXRpb25Db21wYXJpc29uEg4KBnNvdXJjZRgCIAEoCRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEg4KBmVuZ2luZRgGIAEoCRIQCghzdHJlbmd0aBgHIAEoCRIcCgZib3VuZHMYCCADKAsyDC5zeXNtbC5Cb3VuZCLEAwoXQ29uZmlndXJhdGlvbkNvbXBhcmlzb24SCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghiZWhhdmlvchgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSFwoPcmVzdWx0X2xvY2F0aW9uGAUgASgJEg4KBnN0YXR1cxgGIAEoCRISCgp1bnJlc29sdmVkGAcgASgJEhMKC3N0b3JlZF9ydW5zGAggASgDEhgKEHN0b3JlZF9zbmFwc2hvdHMYCSABKAMSDAoEcnVucxgKIAEoAxIRCgljb21wbGV0ZWQYCyABKAMSDQoFZHJhd3MYDCABKAkSEQoEc2VlZBgNIAEoBEgAiAEBEhIKCmNsb2NrX3N0ZXAYDiABKAESHQoEcm93cxgPIAMoCzIPLnN5c21sLlN3ZWVwUm93EiIKCWluc3RhbmNlcxgQIAMoCzIPLnN5c21sLkluc3RhbmNlEjAKC29ic2VydmFibGVzGBEgAygLMhsuc3lzbWwuT2JzZXJ2YWJsZUNvbXBhcmlzb24SDgoGZXJyb3JzGBIgAygJEg0KBW5vdGVzGBMgAygJEg0KBWxpbmVzGBQgAygJQgcKBV9zZWVkIsgCChRPYnNlcnZhYmxlQ29tcGFyaXNvbhIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRIMCgR1bml0GAMgASgJEikKBHRvb2wYBCABKAsyGy5zeXNtbC5Db21wYXJlZERpc3RyaWJ1dGlvbhIOCgZwb29sZWQYBSABKAgSEAoIdW5zdG9yZWQYBiABKAgSKAoDcnVuGAcgASgLMhsuc3lzbWwuQ29tcGFyZWREaXN0cmlidXRpb24SEAoIcHJvZHVjZWQYCCABKAMSEAoIY29tcGFyZWQYCSABKAgSLgoKZGlmZmVyZW5jZRgKIAEoCzIaLnN5c21sLlN0YXRpc3RpY0RpZmZlcmVuY2USJwoIZGVjbGFyZWQYCyABKAsyFS5zeXNtbC5DYXNlU3RhdGlzdGljcxINCgVub3RlcxgMIAMoCSJ6ChRDb21wYXJlZERpc3RyaWJ1dGlvbhINCgVjb3VudBgBIAEoAxILCgNtaW4YAiABKAESDAoEbWVhbhgDIAEoARILCgNwNTAYBCABKAESCwoDcDkwGAUgASgBEgsKA21heBgGIAEoARIRCglkZXZpYXRpb24YByABKAEiVwoTU3RhdGlzdGljRGlmZmVyZW5jZRILCgNtaW4YASABKAkSDAoEbWVhbhgCIAEoCRILCgNwNTAYAyABKAkSCwoDcDkwGAQgASgJEgsKA21heBgFIAEoCSJVCg5DYXNlU3RhdGlzdGljcxIQCghhbmFseXNpcxgBIAEoCRIiCgRyb3dzGAIgAygLMhQuc3lzbWwuQ2FzZVN0YXRpc3RpYxINCgVub3RlcxgDIAMoCSJdCg1DYXNlU3RhdGlzdGljEhEKCXN0YXRpc3RpYxgBIAEoCRIKCgJvZhgCIAEoCRIMCgR0b29sGAMgASgJEgsKA3J1bhgEIAEoCRISCgpkaWZmZXJlbmNlGAUgASgJKrEBCg1GYWlsdXJlUmVhc29uEh4KGkZBSUxVUkVfUkVBU09OX1VOU1BFQ0lGSUVEEAASHQoZRkFJTFVSRV9SRUFTT05fRVZBTFVBVElPThABEh0KGUZBSUxVUkVfUkVBU09OX1dST05HX0tJTkQQAhIkCiBGQUlMVVJFX1JFQVNPTl9BTUJJR1VPVVNfU1VCSkVDVBADEhwKGEZBSUxVUkVfUkVBU09OX1VOREVDSURFRBAEKowFCgtFZGl0RmFpbHVyZRIcChhFRElUX0ZBSUxVUkVfVU5TUEVDSUZJRUQQABIeChpFRElUX0ZBSUxVUkVfTk9fT1BFUkFUSU9OUxABEh8KG0VESVRfRkFJTFVSRV9VTktOT1dOX1RBUkdFVBACEiEKHUVESVRfRkFJTFVSRV9BTUJJR1VPVVNfVEFSR0VUEAMSGwoXRURJVF9GQUlMVVJFX05PVF9WQUxVRUQQBBIeChpFRElUX0ZBSUxVUkVfSU5WQUxJRF9WQUxVRRAFEh0KGUVESVRfRkFJTFVSRV9JTlZBTElEX05BTUUQBhIaChZFRElUX0ZBSUxVUkVfTk9UX05BTUVEEAcSIgoeRURJVF9GQUlMVVJFX1JFTkFNRV9SRUZFUkVOQ0VEEAgSIgoeRURJVF9GQUlMVVJFX09WRVJMQVBQSU5HX0VESVRTEAkSHwobRURJVF9GQUlMVVJFX1JFU1VMVF9JTlZBTElEEAoSHgoaRURJVF9GQUlMVVJFX09XTkVSX1VOS05PV04QCxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfTk9UX05BTUVTUEFDRRAMEh0KGUVESVRfRkFJTFVSRV9JTExFR0FMX0tJTkQQDRIiCh5FRElUX0ZBSUxVUkVfTUVNQkVSX05BTUVfVEFLRU4QDhIiCh5FRElUX0ZBSUxVUkVfREVMRVRFX1JFRkVSRU5DRUQQDxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfSU5TSURFX1RBUkdFVBAQEiAKHEVESVRfRkFJTFVSRV9NT1ZFX1JFRkVSRU5DRUQQERIlCiFFRElUX0ZBSUxVUkVfUkVGRVJFTkNFRF9FTFNFV0hFUkUQEiqaAgoRUHJpbWl0aXZlT3BlcmF0b3ISIgoeUFJJTUlUSVZFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASHAoYUFJJTUlUSVZFX09QRVJBVE9SX0VRVUFMEAESHgoaUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVIQAhIbChdQUklNSVRJVkVfT1BFUkFUT1JfTEVTUxADEiEKHVBSSU1JVElWRV9PUEVSQVRPUl9MRVNTX0VRVUFMEAQSJAogUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVJfRVFVQUwQBRIZChVQUklNSVRJVkVfT1BFUkFUT1JfSU4QBhIiCh5QUklNSVRJVkVfT1BFUkFUT1JfSU5TVEFOQ0VfT0YQBypuChFDb21wb3NpdGVPcGVyYXRvchIiCh5DT01QT1NJVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIaChZDT01QT1NJVEVfT1BFUkFUT1JfQU5EEAESGQoVQ09NUE9TSVRFX09QRVJBVE9SX09SEAIynREKDFN5c01MU2VydmljZRJECg1HZXRTZXJ2ZXJJbmZvEhguc3lzbWwuU2VydmVySW5mb1JlcXVlc3QaGS5zeXNtbC5TZXJ2ZXJJbmZvUmVzcG9uc2USPgoJUGFyc2VGaWxlEhcuc3lzbWwuUGFyc2VGaWxlUmVxdWVzdBoYLnN5c21sLlBhcnNlRmlsZVJlc3BvbnNlEkcKDFBhcnNlU291cmNlcxIaLnN5c21sLlBhcnNlU291cmNlc1JlcXVlc3QaGy5zeXNtbC5QYXJzZVNvdXJjZXNSZXNwb25zZRI7CglHZXRTeW1ib2wSFy5zeXNtbC5HZXRTeW1ib2xSZXF1ZXN0GhUuc3lzbWwuU3ltYm9sUmVzcG9uc2USRwoOR2V0RGlhZ25vc3RpY3MSGS5zeXNtbC5EaWFnbm9zdGljc1JlcXVlc3QaGi5zeXNtbC5EaWFnbm9zdGljc1Jlc3BvbnNlEjsKCEV2YWx1YXRlEhYuc3lzbWwuRXZhbHVhdGVSZXF1ZXN0Ghcuc3lzbWwuRXZhbHVhdGVSZXNwb25zZRJECgtJbnN0YW50aWF0ZRIZLnN5c21sLkluc3RhbnRpYXRlUmVxdWVzdBoaLnN5c21sLkluc3RhbnRpYXRlUmVzcG9uc2USSgoNRXhlY3V0ZUFjdGlvbhIbLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXF1ZXN0Ghwuc3lzbWwuRXhlY3V0ZUFjdGlvblJlc3BvbnNlEkcKDEV4ZWN1dGVTdGF0ZRIaLnN5c21sLkV4ZWN1dGVTdGF0ZVJlcXVlc3QaGy5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZRI4CgdDb252ZXJ0EhUuc3lzbWwuQ29udmVydFJlcXVlc3QaFi5zeXNtbC5Db252ZXJ0UmVzcG9uc2USOAoHTWlncmF0ZRIVLnN5c21sLk1pZ3JhdGVSZXF1ZXN0GhYuc3lzbWwuTWlncmF0ZVJlc3BvbnNlEkEKCkFwcGx5RWRpdHMSGC5zeXNtbC5BcHBseUVkaXRzUmVxdWVzdBoZLnN5c21sLkFwcGx5RWRpdHNSZXNwb25zZRJTChBWZXJpZnlDb25zdHJhaW50Eh4uc3lzbWwuVmVyaWZ5Q29uc3RyYWludFJlcXVlc3QaHy5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVzcG9uc2USVgoRVmVyaWZ5UmVxdWlyZW1lbnQSHy5zeXNtbC5WZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QaIC5zeXNtbC5WZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlElkKElZlcmlmeVNhdGlzZmFjdGlvbhIgLnN5c21sLlZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QaIS5zeXNtbC5WZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRJTChBWYWxpZGF0ZUluc3RhbmNlEh4uc3lzbWwuVmFsaWRhdGVJbnN0YW5jZVJlcXVlc3QaHy5zeXNtbC5WYWxpZGF0ZUluc3RhbmNlUmVzcG9uc2USRwoMRXZhbHVhdGVDYWxjEhouc3lzbWwuRXZhbHVhdGVDYWxjUmVxdWVzdBobLnN5c21sLkV2YWx1YXRlQ2FsY1Jlc3BvbnNlEkQKC1J1bkFuYWx5c2lzEhkuc3lzbWwuUnVuQW5hbHlzaXNSZXF1ZXN0Ghouc3lzbWwuUnVuQW5hbHlzaXNSZXNwb25zZRJKCg1DaGVja0JlaGF2aW9yEhsuc3lzbWwuQ2hlY2tCZWhhdmlvclJlcXVlc3QaHC5zeXNtbC5DaGVja0JlaGF2aW9yUmVzcG9uc2USOwoIUnVuU3dlZXASFi5zeXNtbC5SdW5Td2VlcFJlcXVlc3QaFy5zeXNtbC5SdW5Td2VlcFJlc3BvbnNlEjgKB1J1blJ1bnMSFS5zeXNtbC5SdW5SdW5zUmVxdWVzdBoWLnN5c21sLlJ1blJ1bnNSZXNwb25zZRI+CglTZWxmQ2hlY2sSFy5zeXNtbC5TZWxmQ2hlY2tSZXF1ZXN0Ghguc3lzbWwuU2VsZkNoZWNrUmVzcG9uc2USPgoJUmVjb3JkUnVuEhcuc3lzbWwuUmVjb3JkUnVuUmVxdWVzdBoYLnN5c21sLlJlY29yZFJ1blJlc3BvbnNlEkQKC0xpc3RFbmdpbmVzEhkuc3lzbWwuTGlzdEVuZ2luZXNSZXF1ZXN0Ghouc3lzbWwuTGlzdEVuZ2luZXNSZXNwb25zZRIyCgVRdWVyeRITLnN5c21sLlF1ZXJ5UmVxdWVzdBoULnN5c21sLlF1ZXJ5UmVzcG9uc2USUwoQUnVuRG9jdW1lbnRRdWVyeRIeLnN5c21sLlJ1bkRvY3VtZW50UXVlcnlSZXF1ZXN0Gh8uc3lzbWwuUnVuRG9jdW1lbnRRdWVyeVJlc3BvbnNlEk0KDlJlbmRlckRvY3VtZW50Ehwuc3lzbWwuUmVuZGVyRG9jdW1lbnRSZXF1ZXN0Gh0uc3lzbWwuUmVuZGVyRG9jdW1lbnRSZXNwb25zZRJBCgpSZW5kZXJWaWV3Ehguc3lzbWwuUmVuZGVyVmlld1JlcXVlc3QaGS5zeXNtbC5SZW5kZXJWaWV3UmVzcG9uc2USRwoMRXhwb3J0R3JhcGhzEhouc3lzbWwuRXhwb3J0R3JhcGhzUmVxdWVzdBobLnN5c21sLkV4cG9ydEdyYXBoc1Jlc3BvbnNlEkEKCkltcG9ydERhdGESGC5zeXNtbC5JbXBvcnREYXRhUmVxdWVzdBoZLnN5c21sLkltcG9ydERhdGFSZXNwb25zZRJNCg5Db21wYXJlUmVzdWx0cxIcLnN5c21sLkNvbXBhcmVSZXN1bHRzUmVxdWVzdBodLnN5c21sLkNvbXBhcmVSZXN1bHRzUmVzcG9uc2VCKlooZ2l0aHViLmNvbS9PcGVuLU1CRUUvT3BlblN5c01ML2FwaS9wcm90b2IGcHJvdG8z"); /** * Verdict is one verification's answer: whether the condition held, and, when @@ -2944,6 +2944,33 @@ export type ExecuteActionRequest = Message<"sysml.ExecuteActionRequest"> & { * @generated from field: double clock_step = 9; */ clockStep: number; + + /** + * Ask for the run's trace in ExecuteActionResponse.trace. Advertised as the + * "action_trace" capability; a service withholding it refuses true with + * UNIMPLEMENTED, as does an explore schedule with INVALID_ARGUMENT. + * + * @generated from field: bool trace = 10; + */ + trace: boolean; + + /** + * Signals or items to post to the performing object, in this order, as the + * REPL's `%send` does: the run goes until it completes or every token waits, + * the next event is then posted to the object's queue and the run goes on, + * an accept node waiting for it taking it on the next step. An event of a + * type no accept node of the performance names is refused, with the accepts + * still waiting. The events exhausted, the run goes on to completion (or for + * `advance`); a token still waiting at the end is an accept deadlock, + * reported in `error` with the message it waits for. Each names a signal or + * item definition, qualified or as the action's namespace sees it; a name no + * definition answers to is matched by name alone, as ExecuteState's events + * are. Posted to the object performer_symbol_id names, as `%send` posts to + * one: INVALID_ARGUMENT without it. + * + * @generated from field: repeated string events = 11; + */ + events: string[]; }; /** @@ -3018,6 +3045,23 @@ export type ExecuteActionResponse = Message<"sysml.ExecuteActionResponse"> & { * @generated from field: map order_dependent = 8; */ orderDependent: { [key: string]: number }; + + /** + * The run's trace in the order the run made it, when the request asked for + * it: the token steps, waits, accepts, sends, decisions, assignments and + * completion of the action, each a DocumentEvent (see its `kind`), also on a + * run that failed, up to the failure. Empty under an explore schedule. + * + * @generated from field: repeated sysml.DocumentEvent trace = 9; + */ + trace: DocumentEvent[]; + + /** + * How many of the oldest records the service's held-events bound discarded. + * + * @generated from field: int32 trace_dropped = 10; + */ + traceDropped: number; }; /** @@ -8060,7 +8104,12 @@ export const DocumentStateSchema: GenMessage = /*@__PURE__*/ */ export type DocumentEvent = Message<"sysml.DocumentEvent"> & { /** - * "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". + * "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or + * "terminate" for a state machine's records; an action's run adds "step" (a + * token arriving at a node), "wait" (a token parking at an accept node), + * "assign" (a feature written), "decide" (a decision node resolved) and + * "complete" (the action's performance completed); its "accept" is the accept + * node taking a message and its "send" a message posted. * * @generated from field: string kind = 1; */ @@ -8091,14 +8140,17 @@ export type DocumentEvent = Message<"sysml.DocumentEvent"> & { machine: string; /** - * The state entered, exited or stepped by an entry, exit or do record. + * The state entered, exited or stepped by an entry, exit or do record; the + * action node a wait, assign, decide or action accept record is at. * * @generated from field: string state = 5; */ state: string; /** - * A fired transition's source and target states. + * A fired transition's source and target states; a step's source node (empty + * where the token's flow starts) and the node it arrived at; a decide's + * branch taken, as `taken` names it. * * @generated from field: string from = 6; */ @@ -8118,7 +8170,8 @@ export type DocumentEvent = Message<"sysml.DocumentEvent"> & { target?: DocumentObject | undefined; /** - * The signal or event accepted or sent, or the trigger a transition fired on. + * The signal or event accepted or sent, the trigger a transition fired on, or + * the message type or trigger a wait record waits for. * * @generated from field: string event = 9; */ @@ -8132,7 +8185,8 @@ export type DocumentEvent = Message<"sysml.DocumentEvent"> & { payload: string[]; /** - * A choice's alternatives, in the order they were offered, and the one taken. + * A choice's alternatives, in the order they were offered, and the one taken; + * a decide's branches as `->`, and the one taken. * * @generated from field: repeated string alternatives = 11; */ @@ -8149,6 +8203,33 @@ export type DocumentEvent = Message<"sysml.DocumentEvent"> & { * @generated from field: string text = 13; */ text: string; + + /** + * The action token a step, wait, assign, decide or action accept record is + * about, and the executor step (1-based) that made the record; 0 for a record + * of neither (a state machine's, a send from outside the model). + * + * @generated from field: int64 token = 14; + */ + token: bigint; + + /** + * @generated from field: int32 step = 15; + */ + step: number; + + /** + * The feature an assign record wrote and the value it holds since, as the + * run's outputs carry values. + * + * @generated from field: string feature = 16; + */ + feature: string; + + /** + * @generated from field: sysml.Value value = 17; + */ + value?: Value | undefined; }; /** diff --git a/client/opensysml/documents.go b/client/opensysml/documents.go index 9dba3cfdf1..8ebca99b01 100644 --- a/client/opensysml/documents.go +++ b/client/opensysml/documents.go @@ -101,7 +101,8 @@ type DocumentState struct { // trace. It is answered, never bound. type DocumentEvent struct { // Kind is "accept", "send", "transition", "entry", "exit", "do", "choice", - // "guard" or "terminate". + // "guard" or "terminate"; an action's run adds "step", "wait", "assign", + // "decide" and "complete". Kind string // Time is the run's clock when the record was made: a Quantity when the // clock carries a unit, a Real otherwise. @@ -110,8 +111,9 @@ type DocumentEvent struct { Object *Object // Machine is the state machine the record is about, as DocumentState.Machine names it. Machine string - // State is the state entered, exited or performing, by path; From and To - // are a transition's source and target. + // State is the state entered, exited or performing, by path, or the action + // node a wait, assign, decide or accept record is at; From and To are a + // transition's source and target, or a step's. State, From, To string // Target is the object a send was addressed to; nil for any other record. Target *Object @@ -124,6 +126,14 @@ type DocumentEvent struct { Taken string // Text is the record as the trace prints it. Text string + // Token is the action token a step, wait, assign, decide or accept record is + // about and Step the executor step that made it; 0 for a record of neither. + Token int64 + Step int + // Feature is the feature an assign record wrote and Value what it holds since; + // Value is nil for any other record. + Feature string + Value Value } func (Element) isCell() { /* marker: closed Cell set */ } @@ -495,6 +505,12 @@ func documentEventFromProto(event *pb.DocumentEvent) DocumentEvent { Alternatives: append([]string(nil), event.GetAlternatives()...), Taken: event.GetTaken(), Text: event.GetText(), + Token: event.GetToken(), + Step: int(event.GetStep()), + Feature: event.GetFeature(), + } + if event.GetValue() != nil { + converted.Value = valueFromProto(event.GetValue()) } if event.GetObject() != nil { object := objectFromProto(event.GetObject()) diff --git a/client/opensysml/errors.go b/client/opensysml/errors.go index 19aa69c46e..10c86c1909 100644 --- a/client/opensysml/errors.go +++ b/client/opensysml/errors.go @@ -105,9 +105,9 @@ type FailureError struct { Message string // Diagnostics the response carried alongside the failure, if any. Diagnostics []Diagnostic - // Trace is the partial ExecuteState trace when that run failed. + // Trace is the partial ExecuteAction or ExecuteState trace when a traced run failed. Trace []DocumentEvent - // TraceDropped is the number of oldest ExecuteState trace records discarded. + // TraceDropped is the number of oldest trace records discarded. TraceDropped int // FinalTime is the simulation clock an ExecuteAction or ExecuteState run // stopped at, in seconds, when it failed under WithAdvance. diff --git a/client/opensysml/execute.go b/client/opensysml/execute.go index be566ea39d..cde41390ce 100644 --- a/client/opensysml/execute.go +++ b/client/opensysml/execute.go @@ -21,6 +21,11 @@ type ActionRun struct { // FinalTime is the run's simulation clock when it ended, in seconds from // the 0 it started at; 0 from a service without CapabilityFinalTime. FinalTime float64 + // Trace is the run's records (token steps, waits, accepts, decisions, + // assignments, completion) when requested with WithTrace. + Trace []DocumentEvent + // TraceDropped is the number of oldest trace records the service discarded. + TraceDropped int // Diagnostics the execution reported. Diagnostics []Diagnostic } @@ -49,12 +54,20 @@ type executeOptions struct { schedule string performer string trace bool + events []string advance *float64 seed *uint64 draws string clockStep float64 } +// WithEvents posts the named signals to the object an action is performed on +// (PerformedBy), in order, each once every token of the run waits, as the REPL's +// %send does; the accept waiting for it takes it on the next step. +func WithEvents(events ...string) ExecuteOption { + return func(o *executeOptions) { o.events = append(o.events, events...) } +} + // WithAdvance runs the behavior for that many simulated seconds, as sysml // -advance does, instead of to completion; a run still waiting then is a // *FailureError that still reports FinalTime. @@ -92,12 +105,13 @@ func PerformedBy(path string) ExecuteOption { return func(o *executeOptions) { o.performer = path } } -// WithTrace asks ExecuteState to return the run's execution trace. +// WithTrace asks ExecuteAction or ExecuteState to return the run's execution +// trace; the service must have CapabilityActionTrace or CapabilityStateTrace. func WithTrace() ExecuteOption { return func(o *executeOptions) { o.trace = true } } -func (c *client) requireTrace(ctx context.Context, trace bool) error { +func (c *client) requireTrace(ctx context.Context, trace bool, capability string) error { if !trace { return nil } @@ -105,10 +119,10 @@ func (c *client) requireTrace(ctx context.Context, trace bool) error { if err != nil { return err } - if !info.Has(CapabilityStateTrace) { + if !info.Has(capability) { return &StatusError{ Code: CodeUnimplemented, - Message: fmt.Sprintf("capability %q is unavailable", CapabilityStateTrace), + Message: fmt.Sprintf("capability %q is unavailable", capability), } } return nil @@ -163,12 +177,12 @@ func (c *client) ExecuteAction( for _, opt := range opts { opt(&options) } - if err := refuseTrace(options.trace, "WithTrace is only valid for ExecuteState"); err != nil { - return nil, err - } if err := refuseExploring("ExecuteAction", "ExploreAction", options.schedule); err != nil { return nil, err } + if len(options.events) > 0 && options.performer == "" { + return nil, &StatusError{Code: CodeInvalidArgument, Message: "WithEvents posts to the object the action is performed on: name one with PerformedBy"} + } hash, err := c.call(model) if err != nil { return nil, err @@ -179,6 +193,9 @@ func (c *client) ExecuteAction( if err := c.requirePerformer(ctx, options.performer); err != nil { return nil, err } + if err := c.requireTrace(ctx, options.trace, CapabilityActionTrace); err != nil { + return nil, err + } req := &pb.ExecuteActionRequest{ ModelHash: hash, ActionSymbolId: actionSymbolID, @@ -188,6 +205,8 @@ func (c *client) ExecuteAction( Seed: options.seed, Draws: options.draws, ClockStep: options.clockStep, + Trace: options.trace, + Events: append([]string(nil), options.events...), } if len(inputs) > 0 { if err := c.requireValueCapabilities(ctx, slices.Collect(maps.Values(inputs))...); err != nil { @@ -211,13 +230,22 @@ func (c *client) ExecuteAction( } diagnostics := diagnosticsFromProto(resp.Diagnostics) if resp.Error != "" { - return nil, &FailureError{Op: "ExecuteAction", Message: resp.Error, Diagnostics: diagnostics, FinalTime: resp.FinalTime} + return nil, &FailureError{ + Op: "ExecuteAction", + Message: resp.Error, + Diagnostics: diagnostics, + Trace: documentEventsFromProto(resp.Trace), + TraceDropped: int(resp.TraceDropped), + FinalTime: resp.FinalTime, + } } return &ActionRun{ - Outputs: valuesFromProto(resp.Outputs), - Performer: valuesFromProto(resp.PerformerAttributes), - FinalTime: resp.FinalTime, - Diagnostics: diagnostics, + Outputs: valuesFromProto(resp.Outputs), + Performer: valuesFromProto(resp.PerformerAttributes), + FinalTime: resp.FinalTime, + Trace: documentEventsFromProto(resp.Trace), + TraceDropped: int(resp.TraceDropped), + Diagnostics: diagnostics, }, nil } @@ -252,9 +280,12 @@ func (c *client) ExecuteState( if err := c.requirePerformer(ctx, options.performer); err != nil { return nil, err } - if err := c.requireTrace(ctx, options.trace); err != nil { + if err := c.requireTrace(ctx, options.trace, CapabilityStateTrace); err != nil { return nil, err } + if len(options.events) > 0 { + return nil, &StatusError{Code: CodeInvalidArgument, Message: "ExecuteState takes its events as an argument, not WithEvents"} + } resp, err := c.caller.executeState(ctx, &pb.ExecuteStateRequest{ ModelHash: hash, StateMachineSymbolId: stateMachineSymbolID, diff --git a/client/opensysml/explore.go b/client/opensysml/explore.go index 502783d6ef..d66b5808dd 100644 --- a/client/opensysml/explore.go +++ b/client/opensysml/explore.go @@ -150,9 +150,12 @@ func (c *client) ExploreAction( for _, opt := range opts { opt(&options) } - if err := refuseTrace(options.trace, "WithTrace is only valid for ExecuteState"); err != nil { + if err := refuseTrace(options.trace, "a trace describes one run, not an exploration"); err != nil { return nil, err } + if len(options.events) > 0 { + return nil, &StatusError{Code: CodeInvalidArgument, Message: "events are posted to one run, not an exploration"} + } policy, err := explorePolicy("ExploreAction", options.schedule) if err != nil { return nil, err diff --git a/client/opensysml/schedule_internal_test.go b/client/opensysml/schedule_internal_test.go index bd9c1704e2..f6f95ee7dc 100644 --- a/client/opensysml/schedule_internal_test.go +++ b/client/opensysml/schedule_internal_test.go @@ -88,12 +88,23 @@ func TestStateTraceIsNotSentWithoutTheCapability(t *testing.T) { wantUnimplemented(t, "ExecuteState", err) } -func TestTraceOptionIsLimitedToSingleStateRuns(t *testing.T) { +func TestActionTraceIsNotSentWithoutTheCapability(t *testing.T) { + old := &oldCaller{t: t, capabilities: []string{CapabilityVerification, CapabilitySchedule}} + c := &client{caller: old} + _, err := c.ExecuteAction(context.Background(), &Model{Hash: "h"}, "A", nil, WithTrace()) + wantUnimplemented(t, "ExecuteAction", err) +} + +func TestTraceOptionIsLimitedToSingleRuns(t *testing.T) { c := &client{caller: &oldCaller{t: t}} model := &Model{Hash: "h"} for _, operation := range []func() error{ func() error { - _, err := c.ExecuteAction(context.Background(), model, "A", nil, WithTrace()) + _, err := c.ExecuteAction(context.Background(), model, "A", nil, WithEvents("Go")) + return err + }, + func() error { + _, err := c.ExploreAction(context.Background(), model, "A", nil, WithEvents("Go")) return err }, func() error { diff --git a/client/opensysml/surface_test.go b/client/opensysml/surface_test.go index 97b5e2c71d..8e2e23dbac 100644 --- a/client/opensysml/surface_test.go +++ b/client/opensysml/surface_test.go @@ -1707,3 +1707,73 @@ func TestCheckActionAgainstService(t *testing.T) { t.Errorf("negative depth: %v, want INVALID_ARGUMENT", err) } } + +const actionTraceSource = ` +package Trace { + private import ScalarValues::*; + item def Go; + part def Craft; + part craft : Craft; + action def Flow { + in budget : Integer; + attribute remaining : Integer = budget; + out landed : Boolean = false; + first start; + then action burn assign remaining := remaining - 3; + then decide route; + if remaining >= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } +} +` + +// WithTrace on an action answers the run's records; WithEvents posts to the +// performer once the run waits, and a run left waiting fails with its partial trace. +func TestExecuteActionTraceAndEvents(t *testing.T) { + client := newClient(t) + model := parse(t, client, actionTraceSource) + inputs := map[string]opensysml.Value{"budget": opensysml.Int(10)} + + _, err := client.ExecuteAction(context.Background(), model, "Trace::Flow", inputs, + opensysml.PerformedBy("Trace::craft"), opensysml.WithTrace()) + var failure *opensysml.FailureError + if !errors.As(err, &failure) || !strings.Contains(failure.Message, "accept deadlock") { + t.Fatalf("ExecuteAction without the event: %v, want an accept deadlock", err) + } + if n := len(failure.Trace); n == 0 || failure.Trace[n-1].Kind != "wait" || failure.Trace[n-1].Event != "Go" { + t.Fatalf("partial trace = %v, want it to end waiting for Go", failure.Trace) + } + + run, err := client.ExecuteAction(context.Background(), model, "Trace::Flow", inputs, + opensysml.PerformedBy("Trace::craft"), opensysml.WithTrace(), opensysml.WithEvents("Go")) + if err != nil { + t.Fatalf("ExecuteAction with the event: %v", err) + } + if sole(t, "landed", run.Outputs["landed"]) != opensysml.Bool(true) { + t.Errorf("landed = %#v, want Bool(true)", run.Outputs["landed"]) + } + var kinds []string + for _, event := range run.Trace { + kinds = append(kinds, event.Kind) + if event.Kind == "assign" && event.Feature == "remaining" && event.Value != opensysml.Int(7) { + t.Errorf("assign remaining = %#v, want Int(7)", event.Value) + } + } + joined := strings.Join(kinds, ",") + for _, want := range []string{"step,", "assign,", "decide,", "wait,", "accept,", "complete"} { + if !strings.Contains(joined, want) { + t.Errorf("trace kinds %s lack %q", joined, strings.TrimSuffix(want, ",")) + } + } + + _, err = client.ExecuteAction(context.Background(), model, "Trace::Flow", inputs, opensysml.WithEvents("Go")) + var status *opensysml.StatusError + if !errors.As(err, &status) || status.Code != opensysml.CodeInvalidArgument { + t.Errorf("WithEvents without PerformedBy: %v, want CodeInvalidArgument", err) + } +} diff --git a/client/opensysml/types.go b/client/opensysml/types.go index 01dc64e81a..c40ccae6f1 100644 --- a/client/opensysml/types.go +++ b/client/opensysml/types.go @@ -71,6 +71,7 @@ const ( CapabilitySelfCheck = sysmlgrpc.CapabilitySelfCheck CapabilityRecordRun = sysmlgrpc.CapabilityRecordRun CapabilityStateTrace = sysmlgrpc.CapabilityStateTrace + CapabilityActionTrace = sysmlgrpc.CapabilityActionTrace CapabilityEngines = sysmlgrpc.CapabilityEngines CapabilityUndeterminedValue = sysmlgrpc.CapabilityUndeterminedValue CapabilityBigIntValues = sysmlgrpc.CapabilityBigIntValues diff --git a/client/python/opensysml/action_run.py b/client/python/opensysml/action_run.py index 275ba4dbce..7308c46d3e 100644 --- a/client/python/opensysml/action_run.py +++ b/client/python/opensysml/action_run.py @@ -17,9 +17,15 @@ class ActionOutputs(dict): took, and :meth:`~opensysml.connection.Connection.explore_action` shows the set. An output nothing order-dependent wrote is absent; empty from a service without the ``order_dependence`` capability. + trace (tuple[DocumentEvent, ...]): The run's records when requested + with ``trace=True``: each token step, wait, accept, send, decision, + assignment and the completion, in order + trace_dropped (int): Oldest trace records the service discarded """ - def __init__(self, outputs=(), performer=None, order_dependent=None): + def __init__(self, outputs=(), performer=None, order_dependent=None, trace=(), trace_dropped=0): super().__init__(outputs) self.performer = dict(performer or {}) self.order_dependent = dict(order_dependent or {}) + self.trace = tuple(trace) + self.trace_dropped = trace_dropped diff --git a/client/python/opensysml/capabilities.py b/client/python/opensysml/capabilities.py index fb853a3be6..9e5df8ce23 100644 --- a/client/python/opensysml/capabilities.py +++ b/client/python/opensysml/capabilities.py @@ -258,6 +258,7 @@ #: behavior outside any object, so the client refuses to send a performer. CAPABILITY_PERFORMER = "performer" CAPABILITY_STATE_TRACE = "state_trace" +CAPABILITY_ACTION_TRACE = "action_trace" #: ``final_time`` populated on an action or state run's response: the run's #: simulation clock when it ended, in seconds, read as the ``final_time`` of diff --git a/client/python/opensysml/connection.py b/client/python/opensysml/connection.py index a1002e1a39..0ae04fa1a2 100644 --- a/client/python/opensysml/connection.py +++ b/client/python/opensysml/connection.py @@ -57,6 +57,7 @@ CAPABILITY_RUNS, CAPABILITY_SELF_CHECK, CAPABILITY_STATE_TRACE, + CAPABILITY_ACTION_TRACE, CAPABILITY_QUERY, CAPABILITY_QUERY_ORDER_BY, CAPABILITY_RENDER_DOCUMENT, @@ -2357,13 +2358,21 @@ def instantiate(self, symbol_id, model_hash): def execute_action(self, action_symbol_id, model_hash, inputs=None, schedule=None, performer=None, advance=None, seed=None, - draws=None, clock_step=0.0): + draws=None, clock_step=0.0, trace=False, events=None): """Execute an action definition. Args: action_symbol_id (str): FQN of action def model_hash (str): Hash from ParseFile response inputs (dict, optional): Input parameter name → value + trace (bool): Whether to return the run's typed execution trace + (token steps, waits, accepts, decisions, assignments, completion) + as :attr:`~opensysml.ActionOutputs.trace`; requires the + ``action_trace`` capability + events (list[str], optional): Signals or items to post to the + performer in order, each once every token of the run waits, as + the REPL's ``%send`` does; the accept waiting for it takes it + on the next step. Needs ``performer`` advance (float, optional): Simulated seconds to run for, as ``sysml -advance`` does; the action is started and its clock moved by this much, and one not completed by then fails with @@ -2395,11 +2404,13 @@ def execute_action(self, action_symbol_id, model_hash, inputs=None, discard the rest. Its ``performer`` holds the performer's attributes as the run left them under ``this.`` (``'this.level'``), as an explored outcome's outputs spell them; - empty without a performer + empty without a performer; its ``trace`` the run's records when + requested Raises: - ValueError: If the schedule explores - ExecutionError: If execution fails + ValueError: If the schedule explores, or events are given without a performer + ExecutionError: If execution fails; a traced failure carries its + partial ``trace`` and ``trace_dropped`` ModelNotFoundError: If the service no longer holds the model MissingCapabilityError: If an input holds a ``complex`` and the service predates ``complex_values``, an :class:`~opensysml.values.Array`, @@ -2413,21 +2424,29 @@ def execute_action(self, action_symbol_id, model_hash, inputs=None, and the service predates ``tensor_values``, a :class:`~opensysml.values.Metaobject` and the service predates ``metaobject_values``, a schedule is given and the service - predates ``schedule``, or a performer is given and the service - predates ``performer``; nothing is sent + predates ``schedule``, a performer is given and the service + predates ``performer``, or a trace is requested and it predates + ``action_trace``; nothing is sent InvalidRequestError: If the schedule names no policy """ _refuse_exploring(schedule, "explore_action") + if events and not performer: + raise ValueError("events are posted to the object performing the action: name one with performer") response = self._execute_action(action_symbol_id, model_hash, inputs, schedule, performer, - advance=advance, seed=seed, draws=draws, clock_step=clock_step) + advance=advance, seed=seed, draws=draws, clock_step=clock_step, + trace=trace, events=events) + trace_events = tuple(document_event_of(event) for event in response.trace) if response.error: wrapped_diags = [Diagnostic(d) for d in response.diagnostics] - raise ExecutionError(response.error, diagnostics=wrapped_diags) + raise ExecutionError(response.error, diagnostics=wrapped_diags, + trace=trace_events, trace_dropped=response.trace_dropped) return ActionOutputs( self._values_to_python(response.outputs), self._values_to_python(response.performer_attributes), dict(response.order_dependent), + trace=trace_events, + trace_dropped=response.trace_dropped, ) def explore_action(self, action_symbol_id, model_hash, inputs=None, @@ -2470,10 +2489,10 @@ def explore_action(self, action_symbol_id, model_hash, inputs=None, return self._exploration_of(response) def _execute_action(self, action_symbol_id, model_hash, inputs, schedule, performer, - advance=None, seed=None, draws=None, clock_step=0.0): + advance=None, seed=None, draws=None, clock_step=0.0, trace=False, events=None): """Send an ExecuteAction request, the schedule's and performer's capabilities checked first.""" pb_inputs = {name: self._python_to_value(val) for name, val in (inputs or {}).items()} - capabilities = self._run_capabilities(schedule, performer) + capabilities = self._run_capabilities(schedule, performer, trace, CAPABILITY_ACTION_TRACE) req = sysml_pb2.ExecuteActionRequest( model_hash=model_hash, action_symbol_id=action_symbol_id, @@ -2482,6 +2501,8 @@ def _execute_action(self, action_symbol_id, model_hash, inputs, schedule, perfor performer_symbol_id=performer or "", draws=draws or "", clock_step=clock_step, + trace=trace, + events=events or [], ) _set_run_options(req, advance, seed) with translate_rpc_errors(unimplemented=self._capability_refusal(capabilities)): @@ -3665,13 +3686,13 @@ def _require_schedule(self, schedule): for capability in self._schedule_capabilities(schedule): require(self.server_info(), capability, upgrade_remedy(capability)) - def _run_capabilities(self, schedule, performer, trace=False): - """The capabilities a run's schedule and performer need, each required of the service.""" + def _run_capabilities(self, schedule, performer, trace=False, trace_capability=CAPABILITY_STATE_TRACE): + """The capabilities a run's schedule, performer and trace need, each required of the service.""" capabilities = self._schedule_capabilities(schedule) if performer: capabilities.append(CAPABILITY_PERFORMER) if trace: - capabilities.append(CAPABILITY_STATE_TRACE) + capabilities.append(trace_capability) for capability in capabilities: require(self.server_info(), capability, upgrade_remedy(capability)) return capabilities diff --git a/client/python/opensysml/document.py b/client/python/opensysml/document.py index 0b2b4eec01..643fd758d0 100644 --- a/client/python/opensysml/document.py +++ b/client/python/opensysml/document.py @@ -24,6 +24,7 @@ from opensysml.errors import OpenSysMLError, UnsupportedValueError from opensysml.proto import sysml_pb2 from opensysml.values import ( + value_to_python, INFINITY, Quantity, _Infinity, @@ -159,7 +160,9 @@ class DocumentEvent: Attributes: kind: ``"accept"``, ``"send"``, ``"transition"``, ``"entry"``, - ``"exit"``, ``"do"``, ``"choice"``, ``"guard"`` or ``"terminate"`` + ``"exit"``, ``"do"``, ``"choice"``, ``"guard"`` or ``"terminate"``; + an action's run adds ``"step"``, ``"wait"``, ``"assign"``, + ``"decide"`` and ``"complete"`` time: The instant the record was written at, in the runtime clock's unit — a :class:`~opensysml.values.Quantity` when the clock carries one, a plain number otherwise @@ -174,8 +177,13 @@ class DocumentEvent: event: The accepted or sent event's type name payload: The accept's payload, one ``name = value`` text per attribute alternatives: What a choice drew from, in order - taken: The alternative the choice took + taken: The alternative the choice took, or the branch a decide took text: The record as the trace prints it + token: The action token a step, wait, assign, decide or accept record + is about, 0 for a record of none + step: The executor step that made the record, 0 for none + feature: The feature an assign record wrote + value: What that feature holds since, ``None`` for any other record """ kind: str @@ -191,6 +199,10 @@ class DocumentEvent: payload: tuple = () alternatives: tuple = () taken: str = "" + token: int = 0 + step: int = 0 + feature: str = "" + value: object = None def __str__(self): return f"{self.time}: {self.text}" @@ -719,4 +731,8 @@ def document_event_of(event): payload=tuple(event.payload), alternatives=tuple(event.alternatives), taken=event.taken, + token=event.token, + step=event.step, + feature=event.feature, + value=value_to_python(event.value) if event.HasField("value") else None, ) diff --git a/client/python/opensysml/model.py b/client/python/opensysml/model.py index 3302c4b655..d00b87b865 100644 --- a/client/python/opensysml/model.py +++ b/client/python/opensysml/model.py @@ -761,12 +761,16 @@ def instantiate(self, symbol_id): return self._client.instantiate(symbol_id, self._hash) def execute_action(self, action_symbol_id, inputs=None, schedule=None, performer=None, - advance=None, seed=None, draws=None, clock_step=0.0): + advance=None, seed=None, draws=None, clock_step=0.0, trace=False, events=None): """Execute one of this model's actions. Args: action_symbol_id (str): FQN of the action definition or usage inputs (dict, optional): Input parameter name → Python value + trace (bool): Whether to return the run's typed execution trace as + ``.trace`` of the result; requires the ``action_trace`` capability + events (list[str], optional): Signals to post to the performer in + order, each once every token of the run waits; needs ``performer`` schedule (str, optional): Scheduling policy the run resolves its choice points under — ``"declared"``, ``"reverse"`` (the default) or ``"seed:"``; ``"explore"`` belongs to @@ -800,7 +804,7 @@ def execute_action(self, action_symbol_id, inputs=None, schedule=None, performer """ return self._client.execute_action( action_symbol_id, self._hash, inputs=inputs, schedule=schedule, performer=performer, - advance=advance, seed=seed, draws=draws, clock_step=clock_step, + advance=advance, seed=seed, draws=draws, clock_step=clock_step, trace=trace, events=events, ) def explore_action(self, action_symbol_id, inputs=None, schedule="explore", performer=None): diff --git a/client/python/opensysml/proto/sysml_pb2.py b/client/python/opensysml/proto/sysml_pb2.py index a1171a1c09..b9b86ccae4 100644 --- a/client/python/opensysml/proto/sysml_pb2.py +++ b/client/python/opensysml/proto/sysml_pb2.py @@ -24,7 +24,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bsysml.proto\x12\x05sysml\"\xa9\x03\n\x07Verdict\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x0f\n\x07\x65lement\x18\x03 \x01(\t\x12\r\n\x05holds\x18\x04 \x01(\x08\x12\x11\n\tcondition\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\t \x01(\x0e\x32\x14.sysml.FailureReason\x12\x16\n\x0erequirement_id\x18\n \x01(\t\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\x15\n\rinstance_path\x18\x0e \x01(\t\x12\x10\n\x08question\x18\x0f \x01(\t\x12\x0e\n\x06status\x18\x10 \x01(\t\x12)\n\x07witness\x18\x11 \x03(\x0b\x32\x18.sysml.WitnessAssignment\x12!\n\x05notes\x18\x12 \x03(\x0b\x32\x12.sysml.VerdictNote\":\n\x0bVerdictNote\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\"^\n\x11WitnessAssignment\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\r\n\x05\x65xact\x18\x04 \x01(\t\"5\n\x05\x42ound\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x03\x12\x0f\n\x07reached\x18\x03 \x01(\x08\"\xb0\x02\n\x17VerifyConstraintRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\x12\x1f\n\targuments\x18\x06 \x03(\x0b\x32\x0c.sysml.Value\x12K\n\x0fnamed_arguments\x18\x07 \x03(\x0b\x32\x32.sysml.VerifyConstraintRequest.NamedArgumentsEntry\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x96\x01\n\x18VerifyConstraintResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xb2\x02\n\x18VerifyRequirementRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\x12\x1f\n\targuments\x18\x06 \x03(\x0b\x32\x0c.sysml.Value\x12L\n\x0fnamed_arguments\x18\x07 \x03(\x0b\x32\x33.sysml.VerifyRequirementRequest.NamedArgumentsEntry\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x9c\x01\n\x13VerificationVerdict\x12\x0f\n\x07\x63\x61se_id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x03 \x01(\t\x12\x0f\n\x07subcase\x18\x04 \x01(\x08\x12\x16\n\x0erequirement_id\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\"\xd2\x01\n\x19VerifyRequirementResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x39\n\x15verification_verdicts\x18\x05 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"d\n\x19VerifySatisfactionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\x12\x10\n\x08question\x18\x04 \x01(\t\"\x82\x02\n\x1aVerifySatisfactionResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x06 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"P\n\x17ValidateInstanceRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\"\xb2\x02\n\x18ValidateInstanceResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x1f\n\x07summary\x18\x02 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12\x0f\n\x07\x62ounded\x18\x08 \x01(\x08\"m\n\x13\x45valuateCalcRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\targuments\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\"\xfd\x01\n\x14\x45valuateCalcResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"7\n\nCalcOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"\x93\x01\n\x0e\x43\x61seEvaluation\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12\x1f\n\targuments\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06result\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08selected\x18\x05 \x01(\x08\x12\x0c\n\x04tied\x18\x06 \x01(\x08\"\xbc\x02\n\x12RunAnalysisRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x46\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32-.sysml.RunAnalysisRequest.NamedArgumentsEntry\x12\x10\n\x08schedule\x18\x06 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x07 \x01(\t\x12\x14\n\x0ctool_dry_run\x18\x08 \x01(\x08\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x02\n\nToolDryRun\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0c\n\x04tool\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x10\n\x08manifest\x18\x04 \x01(\t\x12\x12\n\nexecutable\x18\x05 \x01(\t\x12\x10\n\x08protocol\x18\x06 \x01(\t\x12\x0c\n\x04\x61rgs\x18\x07 \x03(\t\x12\x0b\n\x03\x65nv\x18\x08 \x03(\t\x12\x0b\n\x03\x63wd\x18\t \x01(\t\x12\r\n\x05stdin\x18\n \x01(\t\x12\x12\n\nstdin_data\x18\x0b \x01(\t\x12)\n\ninput_file\x18\x0c \x01(\x0b\x32\x15.sysml.ToolDryRunFile\x12\x12\n\noutput_dir\x18\r \x01(\x08\x12&\n\x06inputs\x18\x0e \x03(\x0b\x32\x16.sysml.ToolDryRunInput\x12(\n\x07outputs\x18\x0f \x03(\x0b\x32\x17.sysml.ToolDryRunOutput\x12\x14\n\x0creply_source\x18\x10 \x01(\t\x12\r\n\x05lines\x18\x11 \x03(\t\"<\n\x0eToolDryRunFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x66ormat\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\t\"S\n\x0fToolDryRunInput\x12\x10\n\x08variable\x18\x01 \x01(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x0c\n\x04unit\x18\x04 \x01(\t\"7\n\x10ToolDryRunOutput\x12\x10\n\x08variable\x18\x01 \x01(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\"\x85\x04\n\x13RunAnalysisResponse\x12\"\n\x07outputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x02 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12 \n\x08outcomes\x18\x08 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\t \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12*\n\x0b\x65valuations\x18\n \x03(\x0b\x32\x15.sysml.CaseEvaluation\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\'\n\x0ctool_dry_run\x18\x0e \x01(\x0b\x32\x11.sysml.ToolDryRun\",\n\x10ProbabilityRange\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\"\xcb\x02\n\x07Outcome\x12,\n\x07outputs\x18\x01 \x03(\x0b\x32\x1b.sysml.Outcome.OutputsEntry\x12\x13\n\x0b\x66inal_state\x18\x02 \x01(\t\x12\x16\n\x0estates_visited\x18\x03 \x03(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x16\n\x0elinearizations\x18\x05 \x01(\x05\x12\x0f\n\x07witness\x18\x06 \x03(\t\x12&\n\x0b\x64iagnostics\x18\x07 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x13\n\x0bprobability\x18\x08 \x01(\x01\x12\x32\n\x11probability_range\x18\t \x01(\x0b\x32\x17.sysml.ProbabilityRange\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xcb\x01\n\x11\x45xplorationStatus\x12\x10\n\x08\x63omplete\x18\x01 \x01(\x08\x12\x0c\n\x04runs\x18\x02 \x01(\x05\x12\x13\n\x0b\x62udgets_hit\x18\x03 \x03(\t\x12\x13\n\x0bruns_budget\x18\x04 \x01(\x05\x12\x14\n\x0c\x64\x65pth_budget\x18\x05 \x01(\x05\x12!\n\x19probabilities_lower_bound\x18\x06 \x01(\x08\x12\x1d\n\x15\x66\x61iled_linearizations\x18\x07 \x01(\x05\x12\x14\n\x0cunenumerated\x18\x08 \x03(\t\"\xd1\x03\n\x14\x43heckBehaviorRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x03 \x01(\t\x12\x37\n\x06inputs\x18\x04 \x03(\x0b\x32\'.sysml.CheckBehaviorRequest.InputsEntry\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x16\n\x0e\x63heck_property\x18\x06 \x03(\t\x12\x15\n\rcheck_diverge\x18\x07 \x03(\t\x12\x13\n\x0b\x63heck_input\x18\x08 \x03(\t\x12\x14\n\x0c\x63heck_assume\x18\t \x03(\t\x12\x15\n\rcheck_witness\x18\n \x01(\x08\x12\x13\n\x0b\x63heck_depth\x18\x0b \x01(\x05\x12\x14\n\x0c\x63heck_states\x18\x0c \x01(\x05\x12\x14\n\x0c\x63heck_unroll\x18\r \x01(\x05\x12\x15\n\rcheck_timeout\x18\x0e \x01(\x01\x12\x0e\n\x06\x65ngine\x18\x0f \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"y\n\x0c\x43heckWitness\x12\x10\n\x08schedule\x18\x01 \x01(\t\x12\r\n\x05\x64raws\x18\x02 \x03(\t\x12\x0f\n\x07\x63hoices\x18\x03 \x03(\t\x12\x0e\n\x06inputs\x18\x04 \x03(\t\x12\x11\n\tfile_name\x18\x05 \x01(\t\x12\x14\n\x0c\x66ile_content\x18\x06 \x01(\t\"\x97\x01\n\x0e\x43heckViolation\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08property\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\r\n\x05\x64\x65pth\x18\x04 \x01(\x05\x12\x13\n\x0bprobability\x18\x05 \x01(\x01\x12$\n\x07witness\x18\x06 \x01(\x0b\x32\x13.sysml.CheckWitness\x12\x0c\n\x04text\x18\x07 \x01(\t\"J\n\x13\x43heckDivergentValue\x12\r\n\x05value\x18\x01 \x01(\t\x12$\n\x07witness\x18\x02 \x01(\x0b\x32\x13.sysml.CheckWitness\"N\n\x0f\x43heckDivergence\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12*\n\x06values\x18\x02 \x03(\x0b\x32\x1a.sysml.CheckDivergentValue\"\xa1\x01\n\nCheckFinal\x12\x0f\n\x07outcome\x18\x01 \x01(\t\x12-\n\x06values\x18\x02 \x03(\x0b\x32\x1d.sysml.CheckFinal.ValuesEntry\x12$\n\x07witness\x18\x03 \x01(\x0b\x32\x13.sysml.CheckWitness\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbd\x01\n\x0b\x43heckSearch\x12\x0e\n\x06states\x18\x01 \x01(\x05\x12\r\n\x05moves\x18\x02 \x01(\x05\x12\x11\n\tmax_depth\x18\x03 \x01(\x05\x12\x12\n\nbounds_hit\x18\x04 \x03(\t\x12\x0f\n\x07horizon\x18\x05 \x01(\x01\x12\x13\n\x0bhorizon_set\x18\x06 \x01(\x08\x12\x14\n\x0cmass_bounded\x18\x07 \x01(\x08\x12\r\n\x05notes\x18\x08 \x03(\t\x12\r\n\x05scope\x18\t \x03(\t\x12\x0e\n\x06status\x18\n \x01(\t\"\xbb\x03\n\x15\x43heckBehaviorResponse\x12\x0f\n\x07verdict\x18\x01 \x01(\t\x12\r\n\x05lines\x18\x02 \x03(\t\x12\"\n\x06search\x18\x03 \x01(\x0b\x32\x12.sysml.CheckSearch\x12)\n\nviolations\x18\x04 \x03(\x0b\x32\x15.sysml.CheckViolation\x12+\n\x0b\x64ivergences\x18\x05 \x03(\x0b\x32\x16.sysml.CheckDivergence\x12!\n\x06\x66inals\x18\x06 \x03(\x0b\x32\x11.sysml.CheckFinal\x12\r\n\x05\x63laim\x18\x07 \x01(\t\x12\x13\n\x0b\x66ree_inputs\x18\x08 \x03(\t\x12\x13\n\x0b\x61ssumptions\x18\t \x03(\t\x12$\n\x07witness\x18\n \x01(\x0b\x32\x13.sysml.CheckWitness\x12%\n\x08\x63ontrast\x18\x0b \x01(\x0b\x32\x13.sysml.CheckWitness\x12\x0e\n\x06\x65ngine\x18\x0c \x01(\t\x12\x10\n\x08strength\x18\r \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0e \x03(\x0b\x32\x0c.sysml.Bound\x12\x0e\n\x06reason\x18\x0f \x01(\t\x12\r\n\x05\x65rror\x18\x11 \x01(\t\"#\n\x12ListEnginesRequest\x12\r\n\x05probe\x18\x01 \x01(\x08\"\xfc\x01\n\nEngineInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tauthority\x18\x02 \x01(\t\x12\x0f\n\x07\x61nswers\x18\x03 \x03(\t\x12\x0e\n\x06\x62ounds\x18\x04 \x03(\t\x12\x0f\n\x07process\x18\x05 \x01(\t\x12\x15\n\rprocess_found\x18\x06 \x01(\t\x12\r\n\x05ready\x18\x07 \x01(\x08\x12\x13\n\x0bunavailable\x18\x08 \x01(\t\x12\x0c\n\x04kind\x18\t \x01(\t\x12\x10\n\x08protocol\x18\n \x01(\t\x12\x0e\n\x06source\x18\x0b \x01(\t\x12\x0f\n\x07\x63ommand\x18\x0c \x01(\t\x12\x0f\n\x07version\x18\r \x01(\t\x12\x0e\n\x06served\x18\x0e \x01(\x08\"9\n\x13ListEnginesResponse\x12\"\n\x07\x65ngines\x18\x01 \x03(\x0b\x32\x11.sysml.EngineInfo\"\x8c\x01\n\x10ParseFileRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x18\n\x0c\x63ontent_hash\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08language\x18\x04 \x01(\t\x12\x1a\n\x12strict_conformance\x18\x05 \x01(\x08\x42\x08\n\x06source\"b\n\x0eSourceDocument\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x10\n\x08language\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\tB\x08\n\x06source\"t\n\x13ParseSourcesRequest\x12(\n\tdocuments\x18\x01 \x03(\x0b\x32\x15.sysml.SourceDocument\x12\x1a\n\x12strict_conformance\x18\x02 \x01(\x08\x12\x17\n\x0f\x62\x61se_model_hash\x18\x03 \x01(\t\"\x95\x01\n\x14ParseSourcesResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12 \n\x05roots\x18\x02 \x03(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08\x61\x66\x66\x65\x63ted\x18\x05 \x03(\t\"\x7f\n\x11ParseFileResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x04root\x18\x02 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"9\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"S\n\x12\x44iagnosticsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x14\n\x0c\x64isable_lint\x18\x02 \x03(\t\x12\x13\n\x0b\x65nable_lint\x18\x03 \x03(\t\"L\n\x13\x44iagnosticsResponse\x12&\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"o\n\x0f\x45valuateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nexpression\x18\x02 \x01(\t\x12\x19\n\x11\x63ontext_symbol_id\x18\x03 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x04 \x01(\t\"g\n\x10\x45valuateResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xc2\x01\n\x08Instance\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0etype_symbol_id\x18\x02 \x01(\t\x12:\n\x0e\x66\x65\x61ture_values\x18\x04 \x03(\x0b\x32\".sysml.Instance.FeatureValuesEntry\x1aI\n\x12\x46\x65\x61tureValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.sysml.FeatureValue:\x02\x38\x01J\x04\x08\x03\x10\x04R\x05slots\"\x9d\x01\n\x0c\x46\x65\x61tureValue\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x14\n\x0cmaterialized\x18\x04 \x01(\x08\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12\x17\n\x0forder_dependent\x18\x06 \x01(\x05\";\n\x12InstantiateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"\x93\x01\n\x13InstantiateResponse\x12!\n\x08instance\x18\x01 \x01(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\"\n\tinstances\x18\x04 \x03(\x0b\x32\x0f.sysml.Instance\"\xca\x02\n\x14\x45xecuteActionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x37\n\x06inputs\x18\x03 \x03(\x0b\x32\'.sysml.ExecuteActionRequest.InputsEntry\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x14\n\x07\x61\x64vance\x18\x06 \x01(\x01H\x00\x88\x01\x01\x12\x11\n\x04seed\x18\x07 \x01(\x04H\x01\x88\x01\x01\x12\r\n\x05\x64raws\x18\x08 \x01(\t\x12\x12\n\nclock_step\x18\t \x01(\x01\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\n\n\x08_advanceB\x07\n\x05_seed\"\xce\x04\n\x15\x45xecuteActionResponse\x12:\n\x07outputs\x18\x01 \x03(\x0b\x32).sysml.ExecuteActionResponse.OutputsEntry\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x04 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x05 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x06 \x01(\x01\x12S\n\x14performer_attributes\x18\x07 \x03(\x0b\x32\x35.sysml.ExecuteActionResponse.PerformerAttributesEntry\x12I\n\x0forder_dependent\x18\x08 \x03(\x0b\x32\x30.sysml.ExecuteActionResponse.OrderDependentEntry\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1aH\n\x18PerformerAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x35\n\x13OrderDependentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\xf9\x01\n\x13\x45xecuteStateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\r\n\x05trace\x18\x06 \x01(\x08\x12\x14\n\x07\x61\x64vance\x18\x07 \x01(\x01H\x00\x88\x01\x01\x12\x11\n\x04seed\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\r\n\x05\x64raws\x18\t \x01(\t\x12\x12\n\nclock_step\x18\n \x01(\x01\x42\n\n\x08_advanceB\x07\n\x05_seed\"\x90\x04\n\x14\x45xecuteStateResponse\x12\x16\n\x0estates_visited\x18\x01 \x03(\t\x12\x44\n\rfinal_context\x18\x02 \x03(\x0b\x32-.sysml.ExecuteStateResponse.FinalContextEntry\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x05 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x06 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x07 \x01(\x01\x12#\n\x05trace\x18\x08 \x03(\x0b\x32\x14.sysml.DocumentEvent\x12\x15\n\rtrace_dropped\x18\t \x01(\x05\x12H\n\x0forder_dependent\x18\n \x03(\x0b\x32/.sysml.ExecuteStateResponse.OrderDependentEntry\x1a\x41\n\x11\x46inalContextEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x35\n\x13OrderDependentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\xc3\x02\n\x0e\x43onvertRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x14\n\nmodel_hash\x18\x06 \x01(\tH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x1e\n\x16tolerate_syntax_errors\x18\x05 \x01(\x08\x12\x0f\n\x07id_form\x18\x07 \x01(\t\x12\x11\n\tdocuments\x18\x08 \x03(\t\x12\x0f\n\x07\x63ompact\x18\t \x01(\x08\x12\x14\n\x0comit_derived\x18\n \x01(\x08\x12\x14\n\x0ckeep_derived\x18\x0b \x03(\t\x12!\n\x19include_check_diagnostics\x18\x0c \x01(\x08\x12\x1d\n\x15include_library_stubs\x18\r \x01(\x08\x42\x08\n\x06source\"\xe9\x01\n\x0f\x43onvertResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x14\n\x0c\x65xperimental\x18\x06 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x07 \x01(\t\x12\x33\n\x12library_references\x18\x08 \x03(\x0b\x32\x17.sysml.LibraryReference\"D\n\x10LibraryReference\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0equalified_name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\"\xee\x01\n\x0eMigrateRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\x0cH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x0e\n\x06report\x18\x05 \x01(\x08\x12\x0f\n\x07results\x18\x06 \x01(\x08\x12\x15\n\x0blayout_path\x18\x07 \x01(\tH\x01\x12\x18\n\x0elayout_content\x18\x08 \x01(\tH\x01\x12\x16\n\x0eimage_base_url\x18\t \x01(\t\x12\x0e\n\x06strict\x18\n \x01(\x08\x42\x08\n\x06sourceB\x08\n\x06layout\"\xea\x01\n\x0fMigrateResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x14\n\x0c\x65xperimental\x18\x05 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x06 \x01(\t\x12&\n\x06report\x18\x07 \x01(\x0b\x32\x16.sysml.MigrationReport\x12\x0f\n\x07results\x18\x08 \x01(\t\x12#\n\x05\x66iles\x18\t \x03(\x0b\x32\x14.sysml.MigrationFile\"\xc3\x01\n\x0fMigrationReport\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08\x65xporter\x18\x02 \x01(\t\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\x0e\n\x06mapped\x18\x04 \x01(\x05\x12\x14\n\x0c\x61pproximated\x18\x05 \x01(\x05\x12\x10\n\x08unmapped\x18\x06 \x01(\x05\x12\x0f\n\x07skipped\x18\x07 \x01(\x05\x12&\n\x07\x65ntries\x18\x08 \x03(\x0b\x32\x15.sysml.MigrationEntry\x12\x0c\n\x04text\x18\t \x01(\t\"g\n\x0eMigrationEntry\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x0c\n\x04note\x18\x06 \x01(\t\".\n\rMigrationFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"}\n\x11\x41pplyEditsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12(\n\noperations\x18\x02 \x03(\x0b\x32\x14.sysml.EditOperation\x12\x10\n\x08\x64ocument\x18\x03 \x01(\t\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x04 \x01(\x08\"\xc3\x06\n\rEditOperation\x12(\n\tset_value\x18\x01 \x01(\x0b\x32\x13.sysml.SetValueEditH\x00\x12#\n\x06rename\x18\x02 \x01(\x0b\x32\x11.sysml.RenameEditH\x00\x12*\n\nadd_member\x18\x03 \x01(\x0b\x32\x14.sysml.AddMemberEditH\x00\x12#\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x11.sysml.DeleteEditH\x00\x12\x1f\n\x04move\x18\x05 \x01(\x0b\x32\x0f.sysml.MoveEditH\x00\x12\x32\n\x0e\x61\x64\x64_connection\x18\x06 \x01(\x0b\x32\x18.sysml.AddConnectionEditH\x00\x12,\n\x0b\x61\x64\x64_satisfy\x18\x07 \x01(\x0b\x32\x15.sysml.AddSatisfyEditH\x00\x12I\n\x1a\x61\x64\x64_requirement_constraint\x18\x08 \x01(\x0b\x32#.sysml.AddRequirementConstraintEditH\x00\x12\x32\n\x0e\x61\x64\x64_transition\x18\t \x01(\x0b\x32\x18.sysml.AddTransitionEditH\x00\x12*\n\nadd_import\x18\n \x01(\x0b\x32\x14.sysml.AddImportEditH\x00\x12\x38\n\x11\x61\x64\x64_documentation\x18\x0b \x01(\x0b\x32\x1b.sysml.AddDocumentationEditH\x00\x12*\n\nadd_verify\x18\x0c \x01(\x0b\x32\x14.sysml.AddVerifyEditH\x00\x12.\n\x0c\x61\x64\x64_metadata\x18\r \x01(\x0b\x32\x16.sysml.AddMetadataEditH\x00\x12.\n\x0c\x61\x64\x64_sequence\x18\x0e \x01(\x0b\x32\x16.sysml.AddSequenceEditH\x00\x12;\n\x13\x61\x64\x64_metadata_prefix\x18\x0f \x01(\x0b\x32\x1c.sysml.AddMetadataPrefixEditH\x00\x12,\n\x0b\x61\x64\x64_comment\x18\x10 \x01(\x0b\x32\x15.sysml.AddCommentEditH\x00\x12&\n\x08\x61\x64\x64_note\x18\x12 \x01(\x0b\x32\x12.sysml.AddNoteEditH\x00\x42\x0b\n\toperation\"\x92\x02\n\rAddMemberEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x14\n\x0cmultiplicity\x18\x05 \x01(\t\x12\r\n\x05value\x18\x06 \x01(\t\x12\x13\n\x0bspecializes\x18\x07 \x03(\t\x12\x13\n\x0bis_abstract\x18\x08 \x01(\x08\x12\x11\n\tredefines\x18\t \x03(\t\x12\x12\n\nis_default\x18\n \x01(\x08\x12\x11\n\tdirection\x18\x0b \x01(\t\x12\x19\n\x11metadata_prefixes\x18\x0e \x03(\t\x12\x0b\n\x03\x64oc\x18\x0c \x01(\t\x12\x17\n\x0f\x62ody_expression\x18\r \x01(\t\"y\n\x0e\x41\x64\x64SatisfyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\x12\x1a\n\x12satisfying_feature\x18\x03 \x01(\t\x12\x13\n\x0bis_asserted\x18\x04 \x01(\x08\x12\x12\n\nis_negated\x18\x05 \x01(\x08\"]\n\x1c\x41\x64\x64RequirementConstraintEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x12\n\nexpression\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"\x91\x01\n\x11\x41\x64\x64TransitionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07trigger\x18\x05 \x01(\t\x12\r\n\x05guard\x18\x06 \x01(\t\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x07 \x01(\t\x12\x0f\n\x07initial\x18\x08 \x01(\x08\"3\n\rAddVerifyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\"6\n\x14MetadataFeatureValue\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x94\x01\n\x0f\x41\x64\x64MetadataEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.MetadataFeatureValue\x12\x11\n\tshorthand\x18\x06 \x01(\x08\">\n\x15\x41\x64\x64MetadataPrefixEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\"\x80\x01\n\rAddImportEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x12\n\nvisibility\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x14\n\x0cis_recursive\x18\x04 \x01(\x08\x12\x15\n\ris_import_all\x18\x05 \x01(\x08\x12\x0f\n\x07\x66ilters\x18\x06 \x03(\t\"c\n\x14\x41\x64\x64\x44ocumentationEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06locale\x18\x04 \x01(\t\x12\x0f\n\x07replace\x18\x05 \x01(\x08\"Z\n\x0e\x41\x64\x64\x43ommentEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12\x0e\n\x06locale\x18\x05 \x01(\t\"+\n\x0b\x41\x64\x64NoteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\"\xcd\x02\n\x0f\x41\x64\x64SequenceEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0f\n\x07keyword\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\x13\n\x0bmember_kind\x18\x04 \x01(\t\x12\x13\n\x0bmember_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x07 \x01(\t\x12\x11\n\tcondition\x18\x08 \x01(\t\x12\r\n\x05value\x18\t \x01(\t\x12\x0e\n\x06target\x18\n \x01(\t\x12\x0b\n\x03via\x18\x0b \x01(\t\x12\r\n\x05until\x18\x0c \x01(\t\x12$\n\x04\x62ody\x18\r \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12)\n\telse_body\x18\x0e \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12\x14\n\x0cmultiplicity\x18\x0f \x01(\t\x12\x11\n\tparameter\x18\x10 \x01(\t\"n\n\x11\x41\x64\x64\x43onnectionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x10\n\x08\x66rom_end\x18\x03 \x01(\t\x12\x0e\n\x06to_end\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\"-\n\nDeleteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61scade\x18\x02 \x01(\x08\")\n\x08MoveEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\"-\n\x0cSetValueEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\".\n\nRenameEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"\x90\x02\n\x12\x41pplyEditsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12#\n\x07\x61pplied\x18\x02 \x03(\x0b\x32\x12.sysml.AppliedEdit\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12#\n\x07\x66\x61ilure\x18\x04 \x01(\x0e\x32\x12.sysml.EditFailure\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x1a\n\x12referring_elements\x18\x06 \x03(\t\x12(\n\tdocuments\x18\x07 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\"\n\treferrers\x18\x08 \x03(\x0b\x32\x0f.sysml.Referrer\"/\n\x0e\x45\x64itedDocument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\"*\n\x08Referrer\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocument\x18\x02 \x01(\t\"\x8c\x01\n\x0b\x41ppliedEdit\x12\x17\n\x0foperation_index\x18\x01 \x01(\x05\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\x0e\n\x06length\x18\x04 \x01(\x05\x12\x10\n\x08old_text\x18\x05 \x01(\t\x12\x10\n\x08new_text\x18\x06 \x01(\t\x12\x10\n\x08\x64ocument\x18\x07 \x01(\t\"\xfd\x02\n\nSymbolInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x31\n\x08metadata\x18\x04 \x03(\x0b\x32\x1f.sysml.SymbolInfo.MetadataEntry\x12\x11\n\tchild_ids\x18\x05 \x03(\t\x12(\n\nattributes\x18\x06 \x03(\x0b\x32\x14.sysml.AttributeInfo\x12\"\n\ttype_info\x18\x07 \x01(\x0b\x32\x0f.sysml.TypeInfo\x12-\n\x0cmultiplicity\x18\x08 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\x12.\n\x0fspecializations\x18\t \x03(\x0b\x32\x15.sysml.Specialization\x12#\n\x1bwithheld_library_attributes\x18\n \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"X\n\x0eSpecialization\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63lared\x18\x02 \x01(\t\x12\x11\n\ttarget_id\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\"\x95\x01\n\x08TypeInfo\x12\x10\n\x08\x64\x65\x63lared\x18\x01 \x01(\t\x12\x13\n\x0bresolved_id\x18\x02 \x01(\t\x12\x15\n\rresolved_kind\x18\x03 \x01(\t\x12\x11\n\tprimitive\x18\x04 \x01(\t\x12\x18\n\x10primitive_source\x18\x05 \x01(\t\x12\x10\n\x08quantity\x18\x06 \x01(\x08\x12\x0c\n\x04unit\x18\x07 \x01(\t\"0\n\x10MultiplicityInfo\x12\r\n\x05lower\x18\x01 \x01(\t\x12\r\n\x05upper\x18\x02 \x01(\t\"V\n\rAttributeInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x1b\n\x05value\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x04 \x01(\t\"\x87\x06\n\x05Value\x12\x13\n\tint_value\x18\x01 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x12\x15\n\x0binstance_id\x18\x05 \x01(\x03H\x00\x12(\n\x08sequence\x18\x06 \x01(\x0b\x32\x14.sysml.ValueSequenceH\x00\x12\x0e\n\x04null\x18\x07 \x01(\tH\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12*\n\x0c\x65num_literal\x18\t \x01(\x0b\x32\x12.sysml.EnumLiteralH\x00\x12\x0f\n\x05unset\x18\n \x01(\x08H\x00\x12!\n\x07\x63omplex\x18\x0b \x01(\x0b\x32\x0e.sysml.ComplexH\x00\x12\x1d\n\x05\x61rray\x18\x0c \x01(\x0b\x32\x0c.sysml.ArrayH\x00\x12\x1f\n\x06vector\x18\r \x01(\x0b\x32\r.sysml.VectorH\x00\x12\x30\n\x0fvector_quantity\x18\x0e \x01(\x0b\x32\x15.sysml.VectorQuantityH\x00\x12\x30\n\x0fmeasurement_ref\x18\x0f \x01(\x0b\x32\x15.sysml.MeasurementRefH\x00\x12\x12\n\x08infinity\x18\x10 \x01(\x08H\x00\x12#\n\x08\x66unction\x18\x11 \x01(\x0b\x32\x0f.sysml.FunctionH\x00\x12\x1e\n\x03set\x18\x12 \x01(\x0b\x32\x0f.sysml.ValueSetH\x00\x12\x30\n\x0ftensor_quantity\x18\x13 \x01(\x0b\x32\x15.sysml.TensorQuantityH\x00\x12\'\n\nmetaobject\x18\x14 \x01(\x0b\x32\x11.sysml.MetaobjectH\x00\x12+\n\x0cundetermined\x18\x15 \x01(\x0b\x32\x13.sysml.UndeterminedH\x00\x12\x17\n\rbig_int_value\x18\x16 \x01(\tH\x00\x12)\n\x0erational_value\x18\x17 \x01(\x0b\x32\x0f.sysml.RationalH\x00\x42\x06\n\x04kind\"2\n\x08Rational\x12\x11\n\tnumerator\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65nominator\x18\x02 \x01(\t\"6\n\nMetaobject\x12\x12\n\nelement_id\x18\x01 \x01(\t\x12\x14\n\x0cmetaclass_id\x18\x02 \x01(\t\"F\n\x0cUndetermined\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12&\n\x05\x63ount\x18\x02 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\",\n\x08\x46unction\x12\x0f\n\x07\x63\x61lc_id\x18\x01 \x01(\t\x12\x0f\n\x07self_id\x18\x02 \x01(\x03\"*\n\x08ValueSet\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"I\n\x0eTensorQuantity\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12#\n\ncomponents\x18\x02 \x03(\x0b\x32\x0f.sysml.Quantity\";\n\x05\x41rray\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12\x1e\n\x08\x65lements\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\"*\n\x06Vector\x12 \n\ncomponents\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"5\n\x0eVectorQuantity\x12#\n\ncomponents\x18\x01 \x03(\x0b\x32\x0f.sysml.Quantity\"*\n\x07\x43omplex\x12\x0c\n\x04real\x18\x01 \x01(\x01\x12\x11\n\timaginary\x18\x02 \x01(\x01\"d\n\x0b\x45numLiteral\x12\x12\n\nliteral_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65numeration_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x1b\n\x05value\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"/\n\rValueSequence\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"\xc8\x01\n\x08Quantity\x12\x17\n\rint_magnitude\x18\x01 \x01(\x03H\x00\x12\x18\n\x0ereal_magnitude\x18\x02 \x01(\x01H\x00\x12\x1b\n\x11\x62ig_int_magnitude\x18\x05 \x01(\tH\x00\x12-\n\x12rational_magnitude\x18\x06 \x01(\x0b\x32\x0f.sysml.RationalH\x00\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\"\n\tunit_term\x18\x04 \x01(\x0b\x32\x0f.sysml.UnitTermB\x0b\n\tmagnitude\"S\n\x0eMeasurementRef\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\"\n\tunit_term\x18\x02 \x01(\x0b\x32\x0f.sysml.UnitTerm\x12\x0f\n\x07unit_id\x18\x03 \x01(\t\"T\n\x08UnitTerm\x12\x11\n\tscale_num\x18\x01 \x01(\x01\x12\x11\n\tscale_den\x18\x02 \x01(\x01\x12\"\n\x07\x66\x61\x63tors\x18\x03 \x03(\x0b\x32\x11.sysml.UnitFactor\"/\n\nUnitFactor\x12\x0f\n\x07unit_id\x18\x01 \x01(\t\x12\x10\n\x08\x65xponent\x18\x02 \x01(\x01\"\x86\x01\n\nDiagnostic\x12\x10\n\x08severity\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x19\n\x04span\x18\x03 \x01(\x0b\x32\x0b.sysml.Span\x12\x0c\n\x04\x63ode\x18\x04 \x01(\t\x12\x17\n\x0forder_dependent\x18\x05 \x03(\t\x12\x13\n\x0bindependent\x18\x06 \x01(\x08\"^\n\x04Span\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\x12\x12\n\nstart_line\x18\x02 \x01(\x05\x12\x11\n\tstart_col\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_line\x18\x04 \x01(\x05\x12\x0f\n\x07\x65nd_col\x18\x05 \x01(\x05\"\x13\n\x11ServerInfoRequest\";\n\x12ServerInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\"S\n\x0cQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1b\n\x05query\x18\x02 \x01(\x0b\x32\x0c.sysml.Query\x12\x12\n\noslc_query\x18\x03 \x01(\t\"<\n\rQueryResponse\x12+\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x19.sysml.QueryResultElement\"Z\n\x05Query\x12\r\n\x05scope\x18\x01 \x03(\t\x12\x0e\n\x06select\x18\x02 \x03(\t\x12 \n\x05where\x18\x03 \x01(\x0b\x32\x11.sysml.Constraint\x12\x10\n\x08order_by\x18\x04 \x03(\t\"|\n\nConstraint\x12/\n\tprimitive\x18\x01 \x01(\x0b\x32\x1a.sysml.PrimitiveConstraintH\x00\x12/\n\tcomposite\x18\x02 \x01(\x0b\x32\x1a.sysml.CompositeConstraintH\x00\x42\x0c\n\nconstraint\"s\n\x13PrimitiveConstraint\x12\x0f\n\x07inverse\x18\x01 \x01(\x08\x12\x10\n\x08property\x18\x02 \x01(\t\x12*\n\x08operator\x18\x03 \x01(\x0e\x32\x18.sysml.PrimitiveOperator\x12\r\n\x05value\x18\x04 \x03(\t\"h\n\x13\x43ompositeConstraint\x12*\n\x08operator\x18\x01 \x01(\x0e\x32\x18.sysml.CompositeOperator\x12%\n\nconstraint\x18\x02 \x03(\x0b\x32\x11.sysml.Constraint\"\xa0\x01\n\x12QueryResultElement\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12=\n\nproperties\x18\x03 \x03(\x0b\x32).sysml.QueryResultElement.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"s\n\nSweepRange\x12\x11\n\tparameter\x18\x01 \x01(\t\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04step\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"\xd0\x02\n\x0fRunSweepRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x43\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32*.sysml.RunSweepRequest.NamedArgumentsEntry\x12!\n\x06ranges\x18\x06 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0f\n\x07samples\x18\x07 \x01(\x03\x12\x0c\n\x04seed\x18\x08 \x01(\x04\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x01\n\x08SweepRow\x12!\n\x06inputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x03 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x16\n\x0e\x65lapsed_micros\x18\x04 \x01(\x03\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12*\n\x0b\x65valuations\x18\x07 \x03(\x0b\x32\x15.sysml.CaseEvaluation\"\xad\x02\n\x10RunSweepResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x0f\n\x07sampled\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x04\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x07 \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x08 \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x12\x10\n\x08strength\x18\n \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0b \x03(\x0b\x32\x0c.sysml.Bound\"\x9a\x04\n\x0eRunRunsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x1a\n\x12\x61nalysis_symbol_id\x18\x03 \x01(\t\x12\x31\n\x06inputs\x18\x04 \x03(\x0b\x32!.sysml.RunRunsRequest.InputsEntry\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x06 \x01(\t\x12\x1f\n\targuments\x18\x07 \x03(\x0b\x32\x0c.sysml.Value\x12\x42\n\x0fnamed_arguments\x18\x08 \x03(\x0b\x32).sysml.RunRunsRequest.NamedArgumentsEntry\x12\x0c\n\x04runs\x18\t \x01(\x03\x12\x11\n\x04seed\x18\n \x01(\x04H\x00\x88\x01\x01\x12\r\n\x05\x64raws\x18\x0b \x01(\t\x12\x12\n\nclock_step\x18\x0c \x01(\x01\x12\x0f\n\x07observe\x18\r \x03(\t\x12\x0e\n\x06\x65ngine\x18\x0e \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\x07\n\x05_seed\"\xb0\x02\n\x0fRunDistribution\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04unit\x18\x02 \x01(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x0f\n\x07numeric\x18\x04 \x01(\x08\x12\x19\n\x03min\x18\x05 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03max\x18\x06 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04mean\x18\x07 \x01(\x0b\x32\x0c.sysml.Value\x12\x11\n\tdeviation\x18\x08 \x01(\x01\x12)\n\x0bpercentiles\x18\t \x03(\x0b\x32\x14.sysml.RunPercentile\x12)\n\thistogram\x18\n \x03(\x0b\x32\x16.sysml.RunHistogramBin\x12&\n\x06values\x18\x0b \x03(\x0b\x32\x16.sysml.RunCountedValue\"@\n\rRunPercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"W\n\x0fRunHistogramBin\x12\x19\n\x03low\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04high\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\"=\n\x0fRunCountedValue\x12\x1b\n\x05value\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x63ount\x18\x02 \x01(\x03\"B\n\x10SelfCheckRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1a\n\x12self_check_package\x18\x02 \x03(\t\"\x89\x01\n\x10SelfCheckFinding\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x10\n\x08location\x18\x03 \x01(\t\x12\x12\n\nconstraint\x18\x04 \x01(\t\x12\x0f\n\x07\x65lement\x18\x05 \x01(\t\x12\x0f\n\x07message\x18\x06 \x01(\t\x12\x0c\n\x04line\x18\x07 \x01(\t\"9\n\x14SelfCheckApplication\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x03\"\xaf\x02\n\x11SelfCheckResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12)\n\x08\x66indings\x18\x02 \x03(\x0b\x32\x17.sysml.SelfCheckFinding\x12\x10\n\x08\x65lements\x18\x03 \x01(\x03\x12\x0e\n\x06\x63hecks\x18\x04 \x01(\x03\x12\x12\n\nviolations\x18\x05 \x01(\x03\x12\x13\n\x0bunevaluated\x18\x06 \x01(\x03\x12\x19\n\x11\x65valuation_errors\x18\x07 \x01(\x03\x12\x31\n\x0c\x61pplications\x18\x08 \x03(\x0b\x32\x1b.sysml.SelfCheckApplication\x12\x0f\n\x07summary\x18\t \x01(\t\x12\r\n\x05\x65rror\x18\n \x01(\t\x12&\n\x0b\x64iagnostics\x18\x0b \x03(\x0b\x32\x11.sysml.Diagnostic\"\x95\x03\n\x10RecordRunRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1a\n\x12\x61nalysis_symbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x44\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32+.sysml.RecordRunRequest.NamedArgumentsEntry\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x13\n\x0brecord_into\x18\x07 \x01(\t\x12!\n\x06ranges\x18\x08 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0c\n\x04runs\x18\t \x01(\x03\x12\x11\n\x04seed\x18\n \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x0b \x01(\x08\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\x07\n\x05_seed\"\xa8\x03\n\x11RecordRunResponse\x12\'\n\x03run\x18\x01 \x01(\x0b\x32\x1a.sysml.RunAnalysisResponse\x12&\n\x05sweep\x18\x02 \x01(\x0b\x32\x17.sysml.RunSweepResponse\x12&\n\x06sample\x18\x03 \x01(\x0b\x32\x16.sysml.RunRunsResponse\x12\x0f\n\x07package\x18\x04 \x01(\t\x12\x12\n\ndefinition\x18\x05 \x01(\t\x12\x0f\n\x07records\x18\x06 \x03(\t\x12\x0e\n\x06source\x18\x07 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\x12(\n\tdocuments\x18\t \x03(\x0b\x32\x15.sysml.EditedDocument\x12\x0f\n\x07skipped\x18\n \x01(\x03\x12\x0f\n\x07reasons\x18\x0b \x03(\t\x12\r\n\x05\x65rror\x18\x0c \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\r \x01(\x0e\x32\x14.sysml.FailureReason\x12&\n\x0b\x64iagnostics\x18\x0e \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x12\n\nmodel_hash\x18\x0f \x01(\t\"\xc3\x03\n\x0fRunRunsResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x13\n\x0bobservables\x18\x02 \x03(\t\x12-\n\rdistributions\x18\x03 \x03(\x0b\x32\x16.sysml.RunDistribution\x12\r\n\x05lines\x18\x04 \x03(\t\x12\"\n\x07outputs\x18\x05 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x06 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x13\n\x0bunconcluded\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12&\n\x0b\x64iagnostics\x18\t \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x0b \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\x0c \x01(\t\x12\x10\n\x08strength\x18\r \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0e \x03(\x0b\x32\x0c.sysml.Bound\x12\x11\n\x04seed\x18\x0f \x01(\x04H\x00\x88\x01\x01\x42\x07\n\x05_seed\"n\n\x17RunDocumentQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x10\n\x08query_id\x18\x02 \x01(\t\x12-\n\x08\x62indings\x18\x03 \x03(\x0b\x32\x1b.sysml.DocumentQueryBinding\"O\n\x14\x44ocumentQueryBinding\x12\x11\n\tparameter\x18\x01 \x01(\t\x12$\n\x06values\x18\x02 \x03(\x0b\x32\x14.sysml.DocumentValue\"\xbb\x03\n\rDocumentValue\x12\x14\n\nelement_id\x18\x01 \x01(\tH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x04 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x05 \x01(\x08H\x00\x12\x12\n\x08infinity\x18\x06 \x01(\x08H\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12)\n\x07verdict\x18\t \x01(\x0b\x32\x16.sysml.DocumentVerdictH\x00\x12\'\n\x06object\x18\n \x01(\x0b\x32\x15.sysml.DocumentObjectH\x00\x12%\n\x05state\x18\x0b \x01(\x0b\x32\x14.sysml.DocumentStateH\x00\x12%\n\x05\x65vent\x18\x0c \x01(\x0b\x32\x14.sysml.DocumentEventH\x00\x12\x17\n\rbig_int_value\x18\r \x01(\tH\x00\x12)\n\x0erational_value\x18\x0e \x01(\x0b\x32\x0f.sysml.RationalH\x00\x12\x14\n\x0c\x65lement_type\x18\x07 \x01(\tB\x06\n\x04kind\"Z\n\x0e\x44ocumentObject\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x0c\n\x04path\x18\x02 \x01(\t\x12%\n\x07\x65lement\x18\x03 \x01(\x0b\x32\x14.sysml.DocumentValue\"\xae\x01\n\x0f\x44ocumentVerdict\x12\'\n\tassertion\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x11\n\tcondition\x18\x06 \x01(\t\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x14\n\x0cverification\x18\x08 \x03(\t\"\xb1\x01\n\rDocumentState\x12%\n\x06object\x18\x01 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\nstate_path\x18\x04 \x01(\t\x12#\n\x05state\x18\x05 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0e\n\x06region\x18\x06 \x01(\t\x12\x11\n\tenclosing\x18\x07 \x03(\t\"\x9c\x02\n\rDocumentEvent\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\"\n\x04time\x18\x02 \x01(\x0b\x32\x14.sysml.DocumentValue\x12%\n\x06object\x18\x03 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0c\n\x04\x66rom\x18\x06 \x01(\t\x12\n\n\x02to\x18\x07 \x01(\t\x12%\n\x06target\x18\x08 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\r\n\x05\x65vent\x18\t \x01(\t\x12\x0f\n\x07payload\x18\n \x03(\t\x12\x14\n\x0c\x61lternatives\x18\x0b \x03(\t\x12\r\n\x05taken\x18\x0c \x01(\t\x12\x0c\n\x04text\x18\r \x01(\t\"#\n\x13\x44ocumentQueryColumn\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x11\x44ocumentQueryCell\x12$\n\x06values\x18\x01 \x03(\x0b\x32\x14.sysml.DocumentValue\"b\n\x10\x44ocumentQueryRow\x12%\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\'\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32\x18.sysml.DocumentQueryCell\"n\n\x18RunDocumentQueryResponse\x12+\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x1a.sysml.DocumentQueryColumn\x12%\n\x04rows\x18\x02 \x03(\x0b\x32\x17.sysml.DocumentQueryRow\"\xa4\x01\n\x0cQueryOutcome\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04step\x18\x02 \x01(\t\x12%\n\x08\x66\x61ilures\x18\x03 \x03(\x0b\x32\x13.sysml.QueryFailure\x12%\n\x08\x66indings\x18\x04 \x03(\x0b\x32\x13.sysml.QueryFinding\x12*\n\rpath_failures\x18\x05 \x03(\x0b\x32\x13.sysml.QueryFailure\"V\n\x0cQueryFailure\x12\x0c\n\x04step\x18\x01 \x01(\t\x12\x10\n\x08\x65xpected\x18\x02 \x01(\t\x12&\n\x08\x66rontier\x18\x03 \x01(\x0b\x32\x14.sysml.QueryFrontier\"\x97\x01\n\rQueryFrontier\x12\n\n\x02\x61t\x18\x01 \x01(\t\x12+\n\x07members\x18\x02 \x03(\x0b\x32\x1a.sysml.QueryFrontierMember\x12-\n\x08\x66\x65\x61tures\x18\x03 \x03(\x0b\x32\x1b.sysml.QueryFrontierFeature\x12\r\n\x05kinds\x18\x04 \x03(\t\x12\x0f\n\x07nearest\x18\x05 \x01(\t\"6\n\x13QueryFrontierMember\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmetaclass\x18\x02 \x01(\t\"2\n\x14QueryFrontierFeature\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\"S\n\x0cQueryFinding\x12\x0c\n\x04step\x18\x01 \x01(\t\x12\x0f\n\x07\x65lement\x18\x02 \x01(\t\x12\x12\n\nconstraint\x18\x03 \x01(\t\x12\x10\n\x08observed\x18\x04 \x01(\t\"N\n\x15RenderDocumentRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x02 \x01(\t\x12\x0c\n\x04\x66orm\x18\x03 \x01(\t\"]\n\x16RenderDocumentResponse\x12\x10\n\x08markdown\x18\x01 \x01(\t\x12\x0c\n\x04html\x18\x02 \x01(\t\x12\x10\n\x08\x61sciidoc\x18\x04 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\"w\n\x11RenderViewRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0c\n\x04view\x18\x02 \x01(\t\x12\r\n\x05ports\x18\x03 \x01(\t\x12\x0c\n\x04show\x18\x04 \x03(\t\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\x12\x14\n\x0c\x63ompartments\x18\x06 \x01(\t\"\x9c\x02\n\x12RenderViewResponse\x12\x0c\n\x04view\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06stated\x18\x03 \x01(\t\x12 \n\x05nodes\x18\x04 \x03(\x0b\x32\x11.sysml.RenderNode\x12 \n\x05\x65\x64ges\x18\x05 \x03(\x0b\x32\x11.sysml.RenderEdge\x12\x0f\n\x07\x63olumns\x18\x06 \x03(\t\x12\x1e\n\x04rows\x18\x07 \x03(\x0b\x32\x10.sysml.RenderRow\x12#\n\x06\x63\x61nvas\x18\x08 \x01(\x0b\x32\x13.sysml.RenderCanvas\x12 \n\x05notes\x18\t \x03(\x0b\x32\x11.sysml.RenderNote\x12\x0f\n\x07notices\x18\n \x03(\t\x12\r\n\x05shown\x18\x0b \x03(\t\"\xcf\x02\n\nRenderNode\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x10name_synthesized\x18\x04 \x01(\x08\x12\x0c\n\x04type\x18\x05 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x06 \x01(\t\x12\x0c\n\x04text\x18\x07 \x01(\t\x12\x10\n\x08stand_in\x18\x08 \x01(\x08\x12\x0e\n\x06parent\x18\t \x01(\t\x12 \n\x05ports\x18\n \x03(\x0b\x32\x11.sysml.RenderPort\x12\x1b\n\x06origin\x18\x0b \x01(\x0b\x32\x0b.sysml.Span\x12\'\n\x08geometry\x18\x0c \x01(\x0b\x32\x15.sysml.RenderGeometry\x12!\n\x05style\x18\r \x01(\x0b\x32\x12.sysml.RenderStyle\x12\x13\n\x0b\x63ompartment\x18\x0e \x01(\t\x12\x11\n\tinherited\x18\x0f \x01(\x08\"Z\n\nRenderPort\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x11\n\tdirection\x18\x04 \x01(\t\x12\x11\n\tinherited\x18\x05 \x01(\x08\"\xd8\x01\n\nRenderEdge\x12\x0c\n\x04\x66rom\x18\x01 \x01(\t\x12\n\n\x02to\x18\x02 \x01(\t\x12\x11\n\tfrom_port\x18\x03 \x01(\t\x12\x0f\n\x07to_port\x18\x04 \x01(\t\x12\r\n\x05label\x18\x05 \x01(\t\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x0c\n\x04kind\x18\x07 \x01(\t\x12\x1b\n\x06origin\x18\x08 \x01(\x0b\x32\x0b.sysml.Span\x12!\n\x05route\x18\t \x03(\x0b\x32\x12.sysml.RenderPoint\x12!\n\x05style\x18\n \x01(\x0b\x32\x12.sysml.RenderStyle\"|\n\x0eRenderGeometry\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\x12\r\n\x05width\x18\x03 \x01(\x01\x12\x0e\n\x06height\x18\x04 \x01(\x01\x12\x10\n\x08has_size\x18\x05 \x01(\x08\x12\x11\n\tcollapsed\x18\x06 \x01(\x08\x12\x10\n\x08unplaced\x18\x07 \x01(\x08\"M\n\x0cRenderCanvas\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\r\n\x05width\x18\x02 \x01(\x01\x12\x0e\n\x06height\x18\x03 \x01(\x01\x12\x10\n\x08has_size\x18\x04 \x01(\x08\"v\n\x0bRenderStyle\x12\x0c\n\x04\x66ill\x18\x01 \x01(\t\x12\x0c\n\x04line\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04\x66ont\x18\x04 \x01(\t\x12\x11\n\tfont_size\x18\x05 \x01(\x01\x12\x0c\n\x04\x62old\x18\x06 \x01(\x08\x12\x0e\n\x06italic\x18\x07 \x01(\x08\"#\n\x0bRenderPoint\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\"7\n\tRenderRow\x12\r\n\x05\x63\x65lls\x18\x01 \x03(\t\x12\x1b\n\x06origin\x18\x02 \x01(\x0b\x32\x0b.sysml.Span\"\xb2\x01\n\nRenderNote\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x0e\n\x06\x61nchor\x18\x02 \x01(\t\x12\x11\n\tedge_from\x18\x03 \x01(\t\x12\x0f\n\x07\x65\x64ge_to\x18\x04 \x01(\t\x12\t\n\x01x\x18\x05 \x01(\x01\x12\t\n\x01y\x18\x06 \x01(\x01\x12\r\n\x05width\x18\x07 \x01(\x01\x12\x0e\n\x06height\x18\x08 \x01(\x01\x12\x10\n\x08has_size\x18\t \x01(\x08\x12\x1b\n\x06origin\x18\n \x01(\x0b\x32\x0b.sysml.Span\":\n\x13\x45xportGraphsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\"I\n\x14\x45xportGraphsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x0f\n\x07subject\x18\x03 \x01(\t\"\x90\x01\n\x11ImportDataRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\"\n\x07imports\x18\x02 \x03(\x0b\x32\x11.sysml.DataImport\x12\x11\n\timport_as\x18\x03 \x01(\t\x12\x16\n\x0eimport_dry_run\x18\x04 \x01(\x08\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x05 \x01(\x08\"V\n\nDataImport\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x15\n\rimport_format\x18\x03 \x01(\t\x12\x12\n\nimport_map\x18\x04 \x01(\t\"\xbe\x01\n\x12ImportDataResponse\x12\"\n\x05\x66iles\x18\x01 \x03(\x0b\x32\x13.sysml.ImportedFile\x12(\n\tdocuments\x18\x02 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\t\x12\x12\n\nmodel_hash\x18\x04 \x01(\t\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\"i\n\x0cImportedFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06values\x18\x02 \x01(\x03\x12\x10\n\x08\x65lements\x18\x03 \x01(\x03\x12)\n\x0b\x61ssignments\x18\x04 \x03(\x0b\x32\x14.sysml.ImportedValue\"w\n\rImportedValue\x12\x0f\n\x07\x65lement\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x11\n\tredefines\x18\x04 \x01(\t\x12\r\n\x05where\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\"\xe6\x01\n\x15\x43ompareResultsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0f\n\x07results\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x63tions\x18\x03 \x03(\t\x12\x0c\n\x04runs\x18\x04 \x01(\x03\x12\x11\n\x04seed\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\r\n\x05\x64raws\x18\x06 \x01(\t\x12\x17\n\nclock_step\x18\x07 \x01(\x01H\x01\x88\x01\x01\x12&\n\x07observe\x18\x08 \x03(\x0b\x32\x15.sysml.ObservablePair\x12\x0e\n\x06\x65ngine\x18\t \x01(\tB\x07\n\x05_seedB\r\n\x0b_clock_step\"1\n\x0eObservablePair\x12\x0e\n\x06stored\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\"\x85\x02\n\x16\x43ompareResultsResponse\x12\x36\n\x0e\x63onfigurations\x18\x01 \x03(\x0b\x32\x1e.sysml.ConfigurationComparison\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"\xc4\x03\n\x17\x43onfigurationComparison\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x65havior\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x17\n\x0fresult_location\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x12\n\nunresolved\x18\x07 \x01(\t\x12\x13\n\x0bstored_runs\x18\x08 \x01(\x03\x12\x18\n\x10stored_snapshots\x18\t \x01(\x03\x12\x0c\n\x04runs\x18\n \x01(\x03\x12\x11\n\tcompleted\x18\x0b \x01(\x03\x12\r\n\x05\x64raws\x18\x0c \x01(\t\x12\x11\n\x04seed\x18\r \x01(\x04H\x00\x88\x01\x01\x12\x12\n\nclock_step\x18\x0e \x01(\x01\x12\x1d\n\x04rows\x18\x0f \x03(\x0b\x32\x0f.sysml.SweepRow\x12\"\n\tinstances\x18\x10 \x03(\x0b\x32\x0f.sysml.Instance\x12\x30\n\x0bobservables\x18\x11 \x03(\x0b\x32\x1b.sysml.ObservableComparison\x12\x0e\n\x06\x65rrors\x18\x12 \x03(\t\x12\r\n\x05notes\x18\x13 \x03(\t\x12\r\n\x05lines\x18\x14 \x03(\tB\x07\n\x05_seed\"\xc8\x02\n\x14ObservableComparison\x12\x0e\n\x06stored\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12)\n\x04tool\x18\x04 \x01(\x0b\x32\x1b.sysml.ComparedDistribution\x12\x0e\n\x06pooled\x18\x05 \x01(\x08\x12\x10\n\x08unstored\x18\x06 \x01(\x08\x12(\n\x03run\x18\x07 \x01(\x0b\x32\x1b.sysml.ComparedDistribution\x12\x10\n\x08produced\x18\x08 \x01(\x03\x12\x10\n\x08\x63ompared\x18\t \x01(\x08\x12.\n\ndifference\x18\n \x01(\x0b\x32\x1a.sysml.StatisticDifference\x12\'\n\x08\x64\x65\x63lared\x18\x0b \x01(\x0b\x32\x15.sysml.CaseStatistics\x12\r\n\x05notes\x18\x0c \x03(\t\"z\n\x14\x43omparedDistribution\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x0b\n\x03min\x18\x02 \x01(\x01\x12\x0c\n\x04mean\x18\x03 \x01(\x01\x12\x0b\n\x03p50\x18\x04 \x01(\x01\x12\x0b\n\x03p90\x18\x05 \x01(\x01\x12\x0b\n\x03max\x18\x06 \x01(\x01\x12\x11\n\tdeviation\x18\x07 \x01(\x01\"W\n\x13StatisticDifference\x12\x0b\n\x03min\x18\x01 \x01(\t\x12\x0c\n\x04mean\x18\x02 \x01(\t\x12\x0b\n\x03p50\x18\x03 \x01(\t\x12\x0b\n\x03p90\x18\x04 \x01(\t\x12\x0b\n\x03max\x18\x05 \x01(\t\"U\n\x0e\x43\x61seStatistics\x12\x10\n\x08\x61nalysis\x18\x01 \x01(\t\x12\"\n\x04rows\x18\x02 \x03(\x0b\x32\x14.sysml.CaseStatistic\x12\r\n\x05notes\x18\x03 \x03(\t\"]\n\rCaseStatistic\x12\x11\n\tstatistic\x18\x01 \x01(\t\x12\n\n\x02of\x18\x02 \x01(\t\x12\x0c\n\x04tool\x18\x03 \x01(\t\x12\x0b\n\x03run\x18\x04 \x01(\t\x12\x12\n\ndifference\x18\x05 \x01(\t*\xb1\x01\n\rFailureReason\x12\x1e\n\x1a\x46\x41ILURE_REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46\x41ILURE_REASON_EVALUATION\x10\x01\x12\x1d\n\x19\x46\x41ILURE_REASON_WRONG_KIND\x10\x02\x12$\n FAILURE_REASON_AMBIGUOUS_SUBJECT\x10\x03\x12\x1c\n\x18\x46\x41ILURE_REASON_UNDECIDED\x10\x04*\x8c\x05\n\x0b\x45\x64itFailure\x12\x1c\n\x18\x45\x44IT_FAILURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x45\x44IT_FAILURE_NO_OPERATIONS\x10\x01\x12\x1f\n\x1b\x45\x44IT_FAILURE_UNKNOWN_TARGET\x10\x02\x12!\n\x1d\x45\x44IT_FAILURE_AMBIGUOUS_TARGET\x10\x03\x12\x1b\n\x17\x45\x44IT_FAILURE_NOT_VALUED\x10\x04\x12\x1e\n\x1a\x45\x44IT_FAILURE_INVALID_VALUE\x10\x05\x12\x1d\n\x19\x45\x44IT_FAILURE_INVALID_NAME\x10\x06\x12\x1a\n\x16\x45\x44IT_FAILURE_NOT_NAMED\x10\x07\x12\"\n\x1e\x45\x44IT_FAILURE_RENAME_REFERENCED\x10\x08\x12\"\n\x1e\x45\x44IT_FAILURE_OVERLAPPING_EDITS\x10\t\x12\x1f\n\x1b\x45\x44IT_FAILURE_RESULT_INVALID\x10\n\x12\x1e\n\x1a\x45\x44IT_FAILURE_OWNER_UNKNOWN\x10\x0b\x12$\n EDIT_FAILURE_OWNER_NOT_NAMESPACE\x10\x0c\x12\x1d\n\x19\x45\x44IT_FAILURE_ILLEGAL_KIND\x10\r\x12\"\n\x1e\x45\x44IT_FAILURE_MEMBER_NAME_TAKEN\x10\x0e\x12\"\n\x1e\x45\x44IT_FAILURE_DELETE_REFERENCED\x10\x0f\x12$\n EDIT_FAILURE_OWNER_INSIDE_TARGET\x10\x10\x12 \n\x1c\x45\x44IT_FAILURE_MOVE_REFERENCED\x10\x11\x12%\n!EDIT_FAILURE_REFERENCED_ELSEWHERE\x10\x12*\x9a\x02\n\x11PrimitiveOperator\x12\"\n\x1ePRIMITIVE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRIMITIVE_OPERATOR_EQUAL\x10\x01\x12\x1e\n\x1aPRIMITIVE_OPERATOR_GREATER\x10\x02\x12\x1b\n\x17PRIMITIVE_OPERATOR_LESS\x10\x03\x12!\n\x1dPRIMITIVE_OPERATOR_LESS_EQUAL\x10\x04\x12$\n PRIMITIVE_OPERATOR_GREATER_EQUAL\x10\x05\x12\x19\n\x15PRIMITIVE_OPERATOR_IN\x10\x06\x12\"\n\x1ePRIMITIVE_OPERATOR_INSTANCE_OF\x10\x07*n\n\x11\x43ompositeOperator\x12\"\n\x1e\x43OMPOSITE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OMPOSITE_OPERATOR_AND\x10\x01\x12\x19\n\x15\x43OMPOSITE_OPERATOR_OR\x10\x02\x32\x9d\x11\n\x0cSysMLService\x12\x44\n\rGetServerInfo\x12\x18.sysml.ServerInfoRequest\x1a\x19.sysml.ServerInfoResponse\x12>\n\tParseFile\x12\x17.sysml.ParseFileRequest\x1a\x18.sysml.ParseFileResponse\x12G\n\x0cParseSources\x12\x1a.sysml.ParseSourcesRequest\x1a\x1b.sysml.ParseSourcesResponse\x12;\n\tGetSymbol\x12\x17.sysml.GetSymbolRequest\x1a\x15.sysml.SymbolResponse\x12G\n\x0eGetDiagnostics\x12\x19.sysml.DiagnosticsRequest\x1a\x1a.sysml.DiagnosticsResponse\x12;\n\x08\x45valuate\x12\x16.sysml.EvaluateRequest\x1a\x17.sysml.EvaluateResponse\x12\x44\n\x0bInstantiate\x12\x19.sysml.InstantiateRequest\x1a\x1a.sysml.InstantiateResponse\x12J\n\rExecuteAction\x12\x1b.sysml.ExecuteActionRequest\x1a\x1c.sysml.ExecuteActionResponse\x12G\n\x0c\x45xecuteState\x12\x1a.sysml.ExecuteStateRequest\x1a\x1b.sysml.ExecuteStateResponse\x12\x38\n\x07\x43onvert\x12\x15.sysml.ConvertRequest\x1a\x16.sysml.ConvertResponse\x12\x38\n\x07Migrate\x12\x15.sysml.MigrateRequest\x1a\x16.sysml.MigrateResponse\x12\x41\n\nApplyEdits\x12\x18.sysml.ApplyEditsRequest\x1a\x19.sysml.ApplyEditsResponse\x12S\n\x10VerifyConstraint\x12\x1e.sysml.VerifyConstraintRequest\x1a\x1f.sysml.VerifyConstraintResponse\x12V\n\x11VerifyRequirement\x12\x1f.sysml.VerifyRequirementRequest\x1a .sysml.VerifyRequirementResponse\x12Y\n\x12VerifySatisfaction\x12 .sysml.VerifySatisfactionRequest\x1a!.sysml.VerifySatisfactionResponse\x12S\n\x10ValidateInstance\x12\x1e.sysml.ValidateInstanceRequest\x1a\x1f.sysml.ValidateInstanceResponse\x12G\n\x0c\x45valuateCalc\x12\x1a.sysml.EvaluateCalcRequest\x1a\x1b.sysml.EvaluateCalcResponse\x12\x44\n\x0bRunAnalysis\x12\x19.sysml.RunAnalysisRequest\x1a\x1a.sysml.RunAnalysisResponse\x12J\n\rCheckBehavior\x12\x1b.sysml.CheckBehaviorRequest\x1a\x1c.sysml.CheckBehaviorResponse\x12;\n\x08RunSweep\x12\x16.sysml.RunSweepRequest\x1a\x17.sysml.RunSweepResponse\x12\x38\n\x07RunRuns\x12\x15.sysml.RunRunsRequest\x1a\x16.sysml.RunRunsResponse\x12>\n\tSelfCheck\x12\x17.sysml.SelfCheckRequest\x1a\x18.sysml.SelfCheckResponse\x12>\n\tRecordRun\x12\x17.sysml.RecordRunRequest\x1a\x18.sysml.RecordRunResponse\x12\x44\n\x0bListEngines\x12\x19.sysml.ListEnginesRequest\x1a\x1a.sysml.ListEnginesResponse\x12\x32\n\x05Query\x12\x13.sysml.QueryRequest\x1a\x14.sysml.QueryResponse\x12S\n\x10RunDocumentQuery\x12\x1e.sysml.RunDocumentQueryRequest\x1a\x1f.sysml.RunDocumentQueryResponse\x12M\n\x0eRenderDocument\x12\x1c.sysml.RenderDocumentRequest\x1a\x1d.sysml.RenderDocumentResponse\x12\x41\n\nRenderView\x12\x18.sysml.RenderViewRequest\x1a\x19.sysml.RenderViewResponse\x12G\n\x0c\x45xportGraphs\x12\x1a.sysml.ExportGraphsRequest\x1a\x1b.sysml.ExportGraphsResponse\x12\x41\n\nImportData\x12\x18.sysml.ImportDataRequest\x1a\x19.sysml.ImportDataResponse\x12M\n\x0e\x43ompareResults\x12\x1c.sysml.CompareResultsRequest\x1a\x1d.sysml.CompareResultsResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bsysml.proto\x12\x05sysml\"\xa9\x03\n\x07Verdict\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x0f\n\x07\x65lement\x18\x03 \x01(\t\x12\r\n\x05holds\x18\x04 \x01(\x08\x12\x11\n\tcondition\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\t \x01(\x0e\x32\x14.sysml.FailureReason\x12\x16\n\x0erequirement_id\x18\n \x01(\t\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\x15\n\rinstance_path\x18\x0e \x01(\t\x12\x10\n\x08question\x18\x0f \x01(\t\x12\x0e\n\x06status\x18\x10 \x01(\t\x12)\n\x07witness\x18\x11 \x03(\x0b\x32\x18.sysml.WitnessAssignment\x12!\n\x05notes\x18\x12 \x03(\x0b\x32\x12.sysml.VerdictNote\":\n\x0bVerdictNote\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\"^\n\x11WitnessAssignment\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\r\n\x05\x65xact\x18\x04 \x01(\t\"5\n\x05\x42ound\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x03\x12\x0f\n\x07reached\x18\x03 \x01(\x08\"\xb0\x02\n\x17VerifyConstraintRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\x12\x1f\n\targuments\x18\x06 \x03(\x0b\x32\x0c.sysml.Value\x12K\n\x0fnamed_arguments\x18\x07 \x03(\x0b\x32\x32.sysml.VerifyConstraintRequest.NamedArgumentsEntry\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x96\x01\n\x18VerifyConstraintResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xb2\x02\n\x18VerifyRequirementRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\x12\x10\n\x08question\x18\x05 \x01(\t\x12\x1f\n\targuments\x18\x06 \x03(\x0b\x32\x0c.sysml.Value\x12L\n\x0fnamed_arguments\x18\x07 \x03(\x0b\x32\x33.sysml.VerifyRequirementRequest.NamedArgumentsEntry\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\x9c\x01\n\x13VerificationVerdict\x12\x0f\n\x07\x63\x61se_id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x03 \x01(\t\x12\x0f\n\x07subcase\x18\x04 \x01(\x08\x12\x16\n\x0erequirement_id\x18\x05 \x01(\t\x12\x13\n\x0binstance_id\x18\x06 \x01(\x03\x12\x18\n\x10instance_type_id\x18\x07 \x01(\t\"\xd2\x01\n\x19VerifyRequirementResponse\x12\x1f\n\x07verdict\x18\x01 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x39\n\x15verification_verdicts\x18\x05 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"d\n\x19VerifySatisfactionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\x12\x10\n\x08question\x18\x04 \x01(\t\"\x82\x02\n\x1aVerifySatisfactionResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x02 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x06 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\"P\n\x17ValidateInstanceRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x03 \x01(\t\"\xb2\x02\n\x18ValidateInstanceResponse\x12 \n\x08verdicts\x18\x01 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x1f\n\x07summary\x18\x02 \x01(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12\x0f\n\x07\x62ounded\x18\x08 \x01(\x08\"m\n\x13\x45valuateCalcRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\targuments\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x0e\n\x06\x65ngine\x18\x04 \x01(\t\"\xfd\x01\n\x14\x45valuateCalcResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"7\n\nCalcOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"\x93\x01\n\x0e\x43\x61seEvaluation\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12\x1f\n\targuments\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06result\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08selected\x18\x05 \x01(\x08\x12\x0c\n\x04tied\x18\x06 \x01(\x08\"\xbc\x02\n\x12RunAnalysisRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x46\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32-.sysml.RunAnalysisRequest.NamedArgumentsEntry\x12\x10\n\x08schedule\x18\x06 \x01(\t\x12\x0e\n\x06\x65ngine\x18\x07 \x01(\t\x12\x14\n\x0ctool_dry_run\x18\x08 \x01(\x08\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x02\n\nToolDryRun\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0c\n\x04tool\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x10\n\x08manifest\x18\x04 \x01(\t\x12\x12\n\nexecutable\x18\x05 \x01(\t\x12\x10\n\x08protocol\x18\x06 \x01(\t\x12\x0c\n\x04\x61rgs\x18\x07 \x03(\t\x12\x0b\n\x03\x65nv\x18\x08 \x03(\t\x12\x0b\n\x03\x63wd\x18\t \x01(\t\x12\r\n\x05stdin\x18\n \x01(\t\x12\x12\n\nstdin_data\x18\x0b \x01(\t\x12)\n\ninput_file\x18\x0c \x01(\x0b\x32\x15.sysml.ToolDryRunFile\x12\x12\n\noutput_dir\x18\r \x01(\x08\x12&\n\x06inputs\x18\x0e \x03(\x0b\x32\x16.sysml.ToolDryRunInput\x12(\n\x07outputs\x18\x0f \x03(\x0b\x32\x17.sysml.ToolDryRunOutput\x12\x14\n\x0creply_source\x18\x10 \x01(\t\x12\r\n\x05lines\x18\x11 \x03(\t\"<\n\x0eToolDryRunFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x66ormat\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\t\"S\n\x0fToolDryRunInput\x12\x10\n\x08variable\x18\x01 \x01(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x0c\n\x04unit\x18\x04 \x01(\t\"7\n\x10ToolDryRunOutput\x12\x10\n\x08variable\x18\x01 \x01(\t\x12\x11\n\tparameter\x18\x02 \x01(\t\"\x85\x04\n\x13RunAnalysisResponse\x12\"\n\x07outputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x02 \x03(\x0b\x32\x0e.sysml.Verdict\x12\"\n\tinstances\x18\x03 \x03(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x39\n\x15verification_verdicts\x18\x07 \x03(\x0b\x32\x1a.sysml.VerificationVerdict\x12 \n\x08outcomes\x18\x08 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\t \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12*\n\x0b\x65valuations\x18\n \x03(\x0b\x32\x15.sysml.CaseEvaluation\x12\x0e\n\x06\x65ngine\x18\x0b \x01(\t\x12\x10\n\x08strength\x18\x0c \x01(\t\x12\x1c\n\x06\x62ounds\x18\r \x03(\x0b\x32\x0c.sysml.Bound\x12\'\n\x0ctool_dry_run\x18\x0e \x01(\x0b\x32\x11.sysml.ToolDryRun\",\n\x10ProbabilityRange\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\"\xcb\x02\n\x07Outcome\x12,\n\x07outputs\x18\x01 \x03(\x0b\x32\x1b.sysml.Outcome.OutputsEntry\x12\x13\n\x0b\x66inal_state\x18\x02 \x01(\t\x12\x16\n\x0estates_visited\x18\x03 \x03(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x16\n\x0elinearizations\x18\x05 \x01(\x05\x12\x0f\n\x07witness\x18\x06 \x03(\t\x12&\n\x0b\x64iagnostics\x18\x07 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x13\n\x0bprobability\x18\x08 \x01(\x01\x12\x32\n\x11probability_range\x18\t \x01(\x0b\x32\x17.sysml.ProbabilityRange\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xcb\x01\n\x11\x45xplorationStatus\x12\x10\n\x08\x63omplete\x18\x01 \x01(\x08\x12\x0c\n\x04runs\x18\x02 \x01(\x05\x12\x13\n\x0b\x62udgets_hit\x18\x03 \x03(\t\x12\x13\n\x0bruns_budget\x18\x04 \x01(\x05\x12\x14\n\x0c\x64\x65pth_budget\x18\x05 \x01(\x05\x12!\n\x19probabilities_lower_bound\x18\x06 \x01(\x08\x12\x1d\n\x15\x66\x61iled_linearizations\x18\x07 \x01(\x05\x12\x14\n\x0cunenumerated\x18\x08 \x03(\t\"\xd1\x03\n\x14\x43heckBehaviorRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x03 \x01(\t\x12\x37\n\x06inputs\x18\x04 \x03(\x0b\x32\'.sysml.CheckBehaviorRequest.InputsEntry\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x16\n\x0e\x63heck_property\x18\x06 \x03(\t\x12\x15\n\rcheck_diverge\x18\x07 \x03(\t\x12\x13\n\x0b\x63heck_input\x18\x08 \x03(\t\x12\x14\n\x0c\x63heck_assume\x18\t \x03(\t\x12\x15\n\rcheck_witness\x18\n \x01(\x08\x12\x13\n\x0b\x63heck_depth\x18\x0b \x01(\x05\x12\x14\n\x0c\x63heck_states\x18\x0c \x01(\x05\x12\x14\n\x0c\x63heck_unroll\x18\r \x01(\x05\x12\x15\n\rcheck_timeout\x18\x0e \x01(\x01\x12\x0e\n\x06\x65ngine\x18\x0f \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"y\n\x0c\x43heckWitness\x12\x10\n\x08schedule\x18\x01 \x01(\t\x12\r\n\x05\x64raws\x18\x02 \x03(\t\x12\x0f\n\x07\x63hoices\x18\x03 \x03(\t\x12\x0e\n\x06inputs\x18\x04 \x03(\t\x12\x11\n\tfile_name\x18\x05 \x01(\t\x12\x14\n\x0c\x66ile_content\x18\x06 \x01(\t\"\x97\x01\n\x0e\x43heckViolation\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08property\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\r\n\x05\x64\x65pth\x18\x04 \x01(\x05\x12\x13\n\x0bprobability\x18\x05 \x01(\x01\x12$\n\x07witness\x18\x06 \x01(\x0b\x32\x13.sysml.CheckWitness\x12\x0c\n\x04text\x18\x07 \x01(\t\"J\n\x13\x43heckDivergentValue\x12\r\n\x05value\x18\x01 \x01(\t\x12$\n\x07witness\x18\x02 \x01(\x0b\x32\x13.sysml.CheckWitness\"N\n\x0f\x43heckDivergence\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12*\n\x06values\x18\x02 \x03(\x0b\x32\x1a.sysml.CheckDivergentValue\"\xa1\x01\n\nCheckFinal\x12\x0f\n\x07outcome\x18\x01 \x01(\t\x12-\n\x06values\x18\x02 \x03(\x0b\x32\x1d.sysml.CheckFinal.ValuesEntry\x12$\n\x07witness\x18\x03 \x01(\x0b\x32\x13.sysml.CheckWitness\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xbd\x01\n\x0b\x43heckSearch\x12\x0e\n\x06states\x18\x01 \x01(\x05\x12\r\n\x05moves\x18\x02 \x01(\x05\x12\x11\n\tmax_depth\x18\x03 \x01(\x05\x12\x12\n\nbounds_hit\x18\x04 \x03(\t\x12\x0f\n\x07horizon\x18\x05 \x01(\x01\x12\x13\n\x0bhorizon_set\x18\x06 \x01(\x08\x12\x14\n\x0cmass_bounded\x18\x07 \x01(\x08\x12\r\n\x05notes\x18\x08 \x03(\t\x12\r\n\x05scope\x18\t \x03(\t\x12\x0e\n\x06status\x18\n \x01(\t\"\xbb\x03\n\x15\x43heckBehaviorResponse\x12\x0f\n\x07verdict\x18\x01 \x01(\t\x12\r\n\x05lines\x18\x02 \x03(\t\x12\"\n\x06search\x18\x03 \x01(\x0b\x32\x12.sysml.CheckSearch\x12)\n\nviolations\x18\x04 \x03(\x0b\x32\x15.sysml.CheckViolation\x12+\n\x0b\x64ivergences\x18\x05 \x03(\x0b\x32\x16.sysml.CheckDivergence\x12!\n\x06\x66inals\x18\x06 \x03(\x0b\x32\x11.sysml.CheckFinal\x12\r\n\x05\x63laim\x18\x07 \x01(\t\x12\x13\n\x0b\x66ree_inputs\x18\x08 \x03(\t\x12\x13\n\x0b\x61ssumptions\x18\t \x03(\t\x12$\n\x07witness\x18\n \x01(\x0b\x32\x13.sysml.CheckWitness\x12%\n\x08\x63ontrast\x18\x0b \x01(\x0b\x32\x13.sysml.CheckWitness\x12\x0e\n\x06\x65ngine\x18\x0c \x01(\t\x12\x10\n\x08strength\x18\r \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0e \x03(\x0b\x32\x0c.sysml.Bound\x12\x0e\n\x06reason\x18\x0f \x01(\t\x12\r\n\x05\x65rror\x18\x11 \x01(\t\"#\n\x12ListEnginesRequest\x12\r\n\x05probe\x18\x01 \x01(\x08\"\xfc\x01\n\nEngineInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tauthority\x18\x02 \x01(\t\x12\x0f\n\x07\x61nswers\x18\x03 \x03(\t\x12\x0e\n\x06\x62ounds\x18\x04 \x03(\t\x12\x0f\n\x07process\x18\x05 \x01(\t\x12\x15\n\rprocess_found\x18\x06 \x01(\t\x12\r\n\x05ready\x18\x07 \x01(\x08\x12\x13\n\x0bunavailable\x18\x08 \x01(\t\x12\x0c\n\x04kind\x18\t \x01(\t\x12\x10\n\x08protocol\x18\n \x01(\t\x12\x0e\n\x06source\x18\x0b \x01(\t\x12\x0f\n\x07\x63ommand\x18\x0c \x01(\t\x12\x0f\n\x07version\x18\r \x01(\t\x12\x0e\n\x06served\x18\x0e \x01(\x08\"9\n\x13ListEnginesResponse\x12\"\n\x07\x65ngines\x18\x01 \x03(\x0b\x32\x11.sysml.EngineInfo\"\x8c\x01\n\x10ParseFileRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x18\n\x0c\x63ontent_hash\x18\x03 \x01(\tB\x02\x18\x01\x12\x10\n\x08language\x18\x04 \x01(\t\x12\x1a\n\x12strict_conformance\x18\x05 \x01(\x08\x42\x08\n\x06source\"b\n\x0eSourceDocument\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x10\n\x08language\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\tB\x08\n\x06source\"t\n\x13ParseSourcesRequest\x12(\n\tdocuments\x18\x01 \x03(\x0b\x32\x15.sysml.SourceDocument\x12\x1a\n\x12strict_conformance\x18\x02 \x01(\x08\x12\x17\n\x0f\x62\x61se_model_hash\x18\x03 \x01(\t\"\x95\x01\n\x14ParseSourcesResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12 \n\x05roots\x18\x02 \x03(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x10\n\x08\x61\x66\x66\x65\x63ted\x18\x05 \x03(\t\"\x7f\n\x11ParseFileResponse\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x04root\x18\x02 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"9\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"S\n\x12\x44iagnosticsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x14\n\x0c\x64isable_lint\x18\x02 \x03(\t\x12\x13\n\x0b\x65nable_lint\x18\x03 \x03(\t\"L\n\x13\x44iagnosticsResponse\x12&\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"o\n\x0f\x45valuateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nexpression\x18\x02 \x01(\t\x12\x19\n\x11\x63ontext_symbol_id\x18\x03 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x04 \x01(\t\"g\n\x10\x45valuateResponse\x12\x1c\n\x06result\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\"\xc2\x01\n\x08Instance\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0etype_symbol_id\x18\x02 \x01(\t\x12:\n\x0e\x66\x65\x61ture_values\x18\x04 \x03(\x0b\x32\".sysml.Instance.FeatureValuesEntry\x1aI\n\x12\x46\x65\x61tureValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.sysml.FeatureValue:\x02\x38\x01J\x04\x08\x03\x10\x04R\x05slots\"\x9d\x01\n\x0c\x46\x65\x61tureValue\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x1c\n\x06values\x18\x03 \x03(\x0b\x32\x0c.sysml.Value\x12\x14\n\x0cmaterialized\x18\x04 \x01(\x08\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12\x17\n\x0forder_dependent\x18\x06 \x01(\x05\";\n\x12InstantiateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"\x93\x01\n\x13InstantiateResponse\x12!\n\x08instance\x18\x01 \x01(\x0b\x32\x0f.sysml.Instance\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\"\n\tinstances\x18\x04 \x03(\x0b\x32\x0f.sysml.Instance\"\xe9\x02\n\x14\x45xecuteActionRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x37\n\x06inputs\x18\x03 \x03(\x0b\x32\'.sysml.ExecuteActionRequest.InputsEntry\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x14\n\x07\x61\x64vance\x18\x06 \x01(\x01H\x00\x88\x01\x01\x12\x11\n\x04seed\x18\x07 \x01(\x04H\x01\x88\x01\x01\x12\r\n\x05\x64raws\x18\x08 \x01(\t\x12\x12\n\nclock_step\x18\t \x01(\x01\x12\r\n\x05trace\x18\n \x01(\x08\x12\x0e\n\x06\x65vents\x18\x0b \x03(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\n\n\x08_advanceB\x07\n\x05_seed\"\x8a\x05\n\x15\x45xecuteActionResponse\x12:\n\x07outputs\x18\x01 \x03(\x0b\x32).sysml.ExecuteActionResponse.OutputsEntry\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x03 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x04 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x05 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x06 \x01(\x01\x12S\n\x14performer_attributes\x18\x07 \x03(\x0b\x32\x35.sysml.ExecuteActionResponse.PerformerAttributesEntry\x12I\n\x0forder_dependent\x18\x08 \x03(\x0b\x32\x30.sysml.ExecuteActionResponse.OrderDependentEntry\x12#\n\x05trace\x18\t \x03(\x0b\x32\x14.sysml.DocumentEvent\x12\x15\n\rtrace_dropped\x18\n \x01(\x05\x1a<\n\x0cOutputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1aH\n\x18PerformerAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x35\n\x13OrderDependentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\xf9\x01\n\x13\x45xecuteStateRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1f\n\x17state_machine_symbol_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x10\n\x08schedule\x18\x04 \x01(\t\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\r\n\x05trace\x18\x06 \x01(\x08\x12\x14\n\x07\x61\x64vance\x18\x07 \x01(\x01H\x00\x88\x01\x01\x12\x11\n\x04seed\x18\x08 \x01(\x04H\x01\x88\x01\x01\x12\r\n\x05\x64raws\x18\t \x01(\t\x12\x12\n\nclock_step\x18\n \x01(\x01\x42\n\n\x08_advanceB\x07\n\x05_seed\"\x90\x04\n\x14\x45xecuteStateResponse\x12\x16\n\x0estates_visited\x18\x01 \x03(\t\x12\x44\n\rfinal_context\x18\x02 \x03(\x0b\x32-.sysml.ExecuteStateResponse.FinalContextEntry\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12 \n\x08outcomes\x18\x05 \x03(\x0b\x32\x0e.sysml.Outcome\x12-\n\x0b\x65xploration\x18\x06 \x01(\x0b\x32\x18.sysml.ExplorationStatus\x12\x12\n\nfinal_time\x18\x07 \x01(\x01\x12#\n\x05trace\x18\x08 \x03(\x0b\x32\x14.sysml.DocumentEvent\x12\x15\n\rtrace_dropped\x18\t \x01(\x05\x12H\n\x0forder_dependent\x18\n \x03(\x0b\x32/.sysml.ExecuteStateResponse.OrderDependentEntry\x1a\x41\n\x11\x46inalContextEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x35\n\x13OrderDependentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\xc3\x02\n\x0e\x43onvertRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\tH\x00\x12\x14\n\nmodel_hash\x18\x06 \x01(\tH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x1e\n\x16tolerate_syntax_errors\x18\x05 \x01(\x08\x12\x0f\n\x07id_form\x18\x07 \x01(\t\x12\x11\n\tdocuments\x18\x08 \x03(\t\x12\x0f\n\x07\x63ompact\x18\t \x01(\x08\x12\x14\n\x0comit_derived\x18\n \x01(\x08\x12\x14\n\x0ckeep_derived\x18\x0b \x03(\t\x12!\n\x19include_check_diagnostics\x18\x0c \x01(\x08\x12\x1d\n\x15include_library_stubs\x18\r \x01(\x08\x42\x08\n\x06source\"\xe9\x01\n\x0f\x43onvertResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x14\n\x0c\x65xperimental\x18\x06 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x07 \x01(\t\x12\x33\n\x12library_references\x18\x08 \x03(\x0b\x32\x17.sysml.LibraryReference\"D\n\x10LibraryReference\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0equalified_name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\"\xee\x01\n\x0eMigrateRequest\x12\x13\n\tfile_path\x18\x01 \x01(\tH\x00\x12\x11\n\x07\x63ontent\x18\x02 \x01(\x0cH\x00\x12\x13\n\x0b\x66rom_format\x18\x03 \x01(\t\x12\x11\n\tto_format\x18\x04 \x01(\t\x12\x0e\n\x06report\x18\x05 \x01(\x08\x12\x0f\n\x07results\x18\x06 \x01(\x08\x12\x15\n\x0blayout_path\x18\x07 \x01(\tH\x01\x12\x18\n\x0elayout_content\x18\x08 \x01(\tH\x01\x12\x16\n\x0eimage_base_url\x18\t \x01(\t\x12\x0e\n\x06strict\x18\n \x01(\x08\x42\x08\n\x06sourceB\x08\n\x06layout\"\xea\x01\n\x0fMigrateResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66rom_format\x18\x02 \x01(\t\x12\x11\n\tto_format\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\x12\x14\n\x0c\x65xperimental\x18\x05 \x01(\x08\x12\x1b\n\x13\x65xperimental_notice\x18\x06 \x01(\t\x12&\n\x06report\x18\x07 \x01(\x0b\x32\x16.sysml.MigrationReport\x12\x0f\n\x07results\x18\x08 \x01(\t\x12#\n\x05\x66iles\x18\t \x03(\x0b\x32\x14.sysml.MigrationFile\"\xc3\x01\n\x0fMigrationReport\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x10\n\x08\x65xporter\x18\x02 \x01(\t\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\x0e\n\x06mapped\x18\x04 \x01(\x05\x12\x14\n\x0c\x61pproximated\x18\x05 \x01(\x05\x12\x10\n\x08unmapped\x18\x06 \x01(\x05\x12\x0f\n\x07skipped\x18\x07 \x01(\x05\x12&\n\x07\x65ntries\x18\x08 \x03(\x0b\x32\x15.sysml.MigrationEntry\x12\x0c\n\x04text\x18\t \x01(\t\"g\n\x0eMigrationEntry\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x0c\n\x04note\x18\x06 \x01(\t\".\n\rMigrationFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"}\n\x11\x41pplyEditsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12(\n\noperations\x18\x02 \x03(\x0b\x32\x14.sysml.EditOperation\x12\x10\n\x08\x64ocument\x18\x03 \x01(\t\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x04 \x01(\x08\"\xc3\x06\n\rEditOperation\x12(\n\tset_value\x18\x01 \x01(\x0b\x32\x13.sysml.SetValueEditH\x00\x12#\n\x06rename\x18\x02 \x01(\x0b\x32\x11.sysml.RenameEditH\x00\x12*\n\nadd_member\x18\x03 \x01(\x0b\x32\x14.sysml.AddMemberEditH\x00\x12#\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x11.sysml.DeleteEditH\x00\x12\x1f\n\x04move\x18\x05 \x01(\x0b\x32\x0f.sysml.MoveEditH\x00\x12\x32\n\x0e\x61\x64\x64_connection\x18\x06 \x01(\x0b\x32\x18.sysml.AddConnectionEditH\x00\x12,\n\x0b\x61\x64\x64_satisfy\x18\x07 \x01(\x0b\x32\x15.sysml.AddSatisfyEditH\x00\x12I\n\x1a\x61\x64\x64_requirement_constraint\x18\x08 \x01(\x0b\x32#.sysml.AddRequirementConstraintEditH\x00\x12\x32\n\x0e\x61\x64\x64_transition\x18\t \x01(\x0b\x32\x18.sysml.AddTransitionEditH\x00\x12*\n\nadd_import\x18\n \x01(\x0b\x32\x14.sysml.AddImportEditH\x00\x12\x38\n\x11\x61\x64\x64_documentation\x18\x0b \x01(\x0b\x32\x1b.sysml.AddDocumentationEditH\x00\x12*\n\nadd_verify\x18\x0c \x01(\x0b\x32\x14.sysml.AddVerifyEditH\x00\x12.\n\x0c\x61\x64\x64_metadata\x18\r \x01(\x0b\x32\x16.sysml.AddMetadataEditH\x00\x12.\n\x0c\x61\x64\x64_sequence\x18\x0e \x01(\x0b\x32\x16.sysml.AddSequenceEditH\x00\x12;\n\x13\x61\x64\x64_metadata_prefix\x18\x0f \x01(\x0b\x32\x1c.sysml.AddMetadataPrefixEditH\x00\x12,\n\x0b\x61\x64\x64_comment\x18\x10 \x01(\x0b\x32\x15.sysml.AddCommentEditH\x00\x12&\n\x08\x61\x64\x64_note\x18\x12 \x01(\x0b\x32\x12.sysml.AddNoteEditH\x00\x42\x0b\n\toperation\"\x92\x02\n\rAddMemberEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x14\n\x0cmultiplicity\x18\x05 \x01(\t\x12\r\n\x05value\x18\x06 \x01(\t\x12\x13\n\x0bspecializes\x18\x07 \x03(\t\x12\x13\n\x0bis_abstract\x18\x08 \x01(\x08\x12\x11\n\tredefines\x18\t \x03(\t\x12\x12\n\nis_default\x18\n \x01(\x08\x12\x11\n\tdirection\x18\x0b \x01(\t\x12\x19\n\x11metadata_prefixes\x18\x0e \x03(\t\x12\x0b\n\x03\x64oc\x18\x0c \x01(\t\x12\x17\n\x0f\x62ody_expression\x18\r \x01(\t\"y\n\x0e\x41\x64\x64SatisfyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\x12\x1a\n\x12satisfying_feature\x18\x03 \x01(\t\x12\x13\n\x0bis_asserted\x18\x04 \x01(\x08\x12\x12\n\nis_negated\x18\x05 \x01(\x08\"]\n\x1c\x41\x64\x64RequirementConstraintEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x12\n\nexpression\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\"\x91\x01\n\x11\x41\x64\x64TransitionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07trigger\x18\x05 \x01(\t\x12\r\n\x05guard\x18\x06 \x01(\t\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x07 \x01(\t\x12\x0f\n\x07initial\x18\x08 \x01(\x08\"3\n\rAddVerifyEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x13\n\x0brequirement\x18\x02 \x01(\t\"6\n\x14MetadataFeatureValue\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x94\x01\n\x0f\x41\x64\x64MetadataEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.MetadataFeatureValue\x12\x11\n\tshorthand\x18\x06 \x01(\x08\">\n\x15\x41\x64\x64MetadataPrefixEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x15\n\rmetadata_type\x18\x02 \x01(\t\"\x80\x01\n\rAddImportEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x12\n\nvisibility\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x14\n\x0cis_recursive\x18\x04 \x01(\x08\x12\x15\n\ris_import_all\x18\x05 \x01(\x08\x12\x0f\n\x07\x66ilters\x18\x06 \x03(\t\"c\n\x14\x41\x64\x64\x44ocumentationEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06locale\x18\x04 \x01(\t\x12\x0f\n\x07replace\x18\x05 \x01(\x08\"Z\n\x0e\x41\x64\x64\x43ommentEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04\x62ody\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\r\n\x05\x61\x62out\x18\x04 \x03(\t\x12\x0e\n\x06locale\x18\x05 \x01(\t\"+\n\x0b\x41\x64\x64NoteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\"\xcd\x02\n\x0f\x41\x64\x64SequenceEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0f\n\x07keyword\x18\x02 \x01(\t\x12\x0b\n\x03ref\x18\x03 \x01(\t\x12\x13\n\x0bmember_kind\x18\x04 \x01(\t\x12\x13\n\x0bmember_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\r\n\x05\x61\x66ter\x18\x07 \x01(\t\x12\x11\n\tcondition\x18\x08 \x01(\t\x12\r\n\x05value\x18\t \x01(\t\x12\x0e\n\x06target\x18\n \x01(\t\x12\x0b\n\x03via\x18\x0b \x01(\t\x12\r\n\x05until\x18\x0c \x01(\t\x12$\n\x04\x62ody\x18\r \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12)\n\telse_body\x18\x0e \x03(\x0b\x32\x16.sysml.AddSequenceEdit\x12\x14\n\x0cmultiplicity\x18\x0f \x01(\t\x12\x11\n\tparameter\x18\x10 \x01(\t\"n\n\x11\x41\x64\x64\x43onnectionEdit\x12\r\n\x05owner\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x10\n\x08\x66rom_end\x18\x03 \x01(\t\x12\x0e\n\x06to_end\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\"-\n\nDeleteEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0f\n\x07\x63\x61scade\x18\x02 \x01(\x08\")\n\x08MoveEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05owner\x18\x02 \x01(\t\"-\n\x0cSetValueEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\".\n\nRenameEdit\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x10\n\x08new_name\x18\x02 \x01(\t\"\x90\x02\n\x12\x41pplyEditsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12#\n\x07\x61pplied\x18\x02 \x03(\x0b\x32\x12.sysml.AppliedEdit\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12#\n\x07\x66\x61ilure\x18\x04 \x01(\x0e\x32\x12.sysml.EditFailure\x12&\n\x0b\x64iagnostics\x18\x05 \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x1a\n\x12referring_elements\x18\x06 \x03(\t\x12(\n\tdocuments\x18\x07 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\"\n\treferrers\x18\x08 \x03(\x0b\x32\x0f.sysml.Referrer\"/\n\x0e\x45\x64itedDocument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\"*\n\x08Referrer\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08\x64ocument\x18\x02 \x01(\t\"\x8c\x01\n\x0b\x41ppliedEdit\x12\x17\n\x0foperation_index\x18\x01 \x01(\x05\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\x0e\n\x06length\x18\x04 \x01(\x05\x12\x10\n\x08old_text\x18\x05 \x01(\t\x12\x10\n\x08new_text\x18\x06 \x01(\t\x12\x10\n\x08\x64ocument\x18\x07 \x01(\t\"\xfd\x02\n\nSymbolInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12\x31\n\x08metadata\x18\x04 \x03(\x0b\x32\x1f.sysml.SymbolInfo.MetadataEntry\x12\x11\n\tchild_ids\x18\x05 \x03(\t\x12(\n\nattributes\x18\x06 \x03(\x0b\x32\x14.sysml.AttributeInfo\x12\"\n\ttype_info\x18\x07 \x01(\x0b\x32\x0f.sysml.TypeInfo\x12-\n\x0cmultiplicity\x18\x08 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\x12.\n\x0fspecializations\x18\t \x03(\x0b\x32\x15.sysml.Specialization\x12#\n\x1bwithheld_library_attributes\x18\n \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"X\n\x0eSpecialization\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x10\n\x08\x64\x65\x63lared\x18\x02 \x01(\t\x12\x11\n\ttarget_id\x18\x03 \x01(\t\x12\x13\n\x0btarget_kind\x18\x04 \x01(\t\"\x95\x01\n\x08TypeInfo\x12\x10\n\x08\x64\x65\x63lared\x18\x01 \x01(\t\x12\x13\n\x0bresolved_id\x18\x02 \x01(\t\x12\x15\n\rresolved_kind\x18\x03 \x01(\t\x12\x11\n\tprimitive\x18\x04 \x01(\t\x12\x18\n\x10primitive_source\x18\x05 \x01(\t\x12\x10\n\x08quantity\x18\x06 \x01(\x08\x12\x0c\n\x04unit\x18\x07 \x01(\t\"0\n\x10MultiplicityInfo\x12\r\n\x05lower\x18\x01 \x01(\t\x12\r\n\x05upper\x18\x02 \x01(\t\"V\n\rAttributeInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x1b\n\x05value\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x0c\n\x04unit\x18\x04 \x01(\t\"\x87\x06\n\x05Value\x12\x13\n\tint_value\x18\x01 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x16\n\x0cstring_value\x18\x04 \x01(\tH\x00\x12\x15\n\x0binstance_id\x18\x05 \x01(\x03H\x00\x12(\n\x08sequence\x18\x06 \x01(\x0b\x32\x14.sysml.ValueSequenceH\x00\x12\x0e\n\x04null\x18\x07 \x01(\tH\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12*\n\x0c\x65num_literal\x18\t \x01(\x0b\x32\x12.sysml.EnumLiteralH\x00\x12\x0f\n\x05unset\x18\n \x01(\x08H\x00\x12!\n\x07\x63omplex\x18\x0b \x01(\x0b\x32\x0e.sysml.ComplexH\x00\x12\x1d\n\x05\x61rray\x18\x0c \x01(\x0b\x32\x0c.sysml.ArrayH\x00\x12\x1f\n\x06vector\x18\r \x01(\x0b\x32\r.sysml.VectorH\x00\x12\x30\n\x0fvector_quantity\x18\x0e \x01(\x0b\x32\x15.sysml.VectorQuantityH\x00\x12\x30\n\x0fmeasurement_ref\x18\x0f \x01(\x0b\x32\x15.sysml.MeasurementRefH\x00\x12\x12\n\x08infinity\x18\x10 \x01(\x08H\x00\x12#\n\x08\x66unction\x18\x11 \x01(\x0b\x32\x0f.sysml.FunctionH\x00\x12\x1e\n\x03set\x18\x12 \x01(\x0b\x32\x0f.sysml.ValueSetH\x00\x12\x30\n\x0ftensor_quantity\x18\x13 \x01(\x0b\x32\x15.sysml.TensorQuantityH\x00\x12\'\n\nmetaobject\x18\x14 \x01(\x0b\x32\x11.sysml.MetaobjectH\x00\x12+\n\x0cundetermined\x18\x15 \x01(\x0b\x32\x13.sysml.UndeterminedH\x00\x12\x17\n\rbig_int_value\x18\x16 \x01(\tH\x00\x12)\n\x0erational_value\x18\x17 \x01(\x0b\x32\x0f.sysml.RationalH\x00\x42\x06\n\x04kind\"2\n\x08Rational\x12\x11\n\tnumerator\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65nominator\x18\x02 \x01(\t\"6\n\nMetaobject\x12\x12\n\nelement_id\x18\x01 \x01(\t\x12\x14\n\x0cmetaclass_id\x18\x02 \x01(\t\"F\n\x0cUndetermined\x12\x0e\n\x06reason\x18\x01 \x01(\t\x12&\n\x05\x63ount\x18\x02 \x01(\x0b\x32\x17.sysml.MultiplicityInfo\",\n\x08\x46unction\x12\x0f\n\x07\x63\x61lc_id\x18\x01 \x01(\t\x12\x0f\n\x07self_id\x18\x02 \x01(\x03\"*\n\x08ValueSet\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"I\n\x0eTensorQuantity\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12#\n\ncomponents\x18\x02 \x03(\x0b\x32\x0f.sysml.Quantity\";\n\x05\x41rray\x12\x12\n\ndimensions\x18\x01 \x03(\x03\x12\x1e\n\x08\x65lements\x18\x02 \x03(\x0b\x32\x0c.sysml.Value\"*\n\x06Vector\x12 \n\ncomponents\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"5\n\x0eVectorQuantity\x12#\n\ncomponents\x18\x01 \x03(\x0b\x32\x0f.sysml.Quantity\"*\n\x07\x43omplex\x12\x0c\n\x04real\x18\x01 \x01(\x01\x12\x11\n\timaginary\x18\x02 \x01(\x01\"d\n\x0b\x45numLiteral\x12\x12\n\nliteral_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65numeration_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x1b\n\x05value\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"/\n\rValueSequence\x12\x1e\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x0c.sysml.Value\"\xc8\x01\n\x08Quantity\x12\x17\n\rint_magnitude\x18\x01 \x01(\x03H\x00\x12\x18\n\x0ereal_magnitude\x18\x02 \x01(\x01H\x00\x12\x1b\n\x11\x62ig_int_magnitude\x18\x05 \x01(\tH\x00\x12-\n\x12rational_magnitude\x18\x06 \x01(\x0b\x32\x0f.sysml.RationalH\x00\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12\"\n\tunit_term\x18\x04 \x01(\x0b\x32\x0f.sysml.UnitTermB\x0b\n\tmagnitude\"S\n\x0eMeasurementRef\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\"\n\tunit_term\x18\x02 \x01(\x0b\x32\x0f.sysml.UnitTerm\x12\x0f\n\x07unit_id\x18\x03 \x01(\t\"T\n\x08UnitTerm\x12\x11\n\tscale_num\x18\x01 \x01(\x01\x12\x11\n\tscale_den\x18\x02 \x01(\x01\x12\"\n\x07\x66\x61\x63tors\x18\x03 \x03(\x0b\x32\x11.sysml.UnitFactor\"/\n\nUnitFactor\x12\x0f\n\x07unit_id\x18\x01 \x01(\t\x12\x10\n\x08\x65xponent\x18\x02 \x01(\x01\"\x86\x01\n\nDiagnostic\x12\x10\n\x08severity\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x19\n\x04span\x18\x03 \x01(\x0b\x32\x0b.sysml.Span\x12\x0c\n\x04\x63ode\x18\x04 \x01(\t\x12\x17\n\x0forder_dependent\x18\x05 \x03(\t\x12\x13\n\x0bindependent\x18\x06 \x01(\x08\"^\n\x04Span\x12\x0c\n\x04\x66ile\x18\x01 \x01(\t\x12\x12\n\nstart_line\x18\x02 \x01(\x05\x12\x11\n\tstart_col\x18\x03 \x01(\x05\x12\x10\n\x08\x65nd_line\x18\x04 \x01(\x05\x12\x0f\n\x07\x65nd_col\x18\x05 \x01(\x05\"\x13\n\x11ServerInfoRequest\";\n\x12ServerInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x14\n\x0c\x63\x61pabilities\x18\x02 \x03(\t\"S\n\x0cQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1b\n\x05query\x18\x02 \x01(\x0b\x32\x0c.sysml.Query\x12\x12\n\noslc_query\x18\x03 \x01(\t\"<\n\rQueryResponse\x12+\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x19.sysml.QueryResultElement\"Z\n\x05Query\x12\r\n\x05scope\x18\x01 \x03(\t\x12\x0e\n\x06select\x18\x02 \x03(\t\x12 \n\x05where\x18\x03 \x01(\x0b\x32\x11.sysml.Constraint\x12\x10\n\x08order_by\x18\x04 \x03(\t\"|\n\nConstraint\x12/\n\tprimitive\x18\x01 \x01(\x0b\x32\x1a.sysml.PrimitiveConstraintH\x00\x12/\n\tcomposite\x18\x02 \x01(\x0b\x32\x1a.sysml.CompositeConstraintH\x00\x42\x0c\n\nconstraint\"s\n\x13PrimitiveConstraint\x12\x0f\n\x07inverse\x18\x01 \x01(\x08\x12\x10\n\x08property\x18\x02 \x01(\t\x12*\n\x08operator\x18\x03 \x01(\x0e\x32\x18.sysml.PrimitiveOperator\x12\r\n\x05value\x18\x04 \x03(\t\"h\n\x13\x43ompositeConstraint\x12*\n\x08operator\x18\x01 \x01(\x0e\x32\x18.sysml.CompositeOperator\x12%\n\nconstraint\x18\x02 \x03(\x0b\x32\x11.sysml.Constraint\"\xa0\x01\n\x12QueryResultElement\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12=\n\nproperties\x18\x03 \x03(\x0b\x32).sysml.QueryResultElement.PropertiesEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"s\n\nSweepRange\x12\x11\n\tparameter\x18\x01 \x01(\t\x12\x1b\n\x05start\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04step\x18\x04 \x01(\x0b\x32\x0c.sysml.Value\"\xd0\x02\n\x0fRunSweepRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x43\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32*.sysml.RunSweepRequest.NamedArgumentsEntry\x12!\n\x06ranges\x18\x06 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0f\n\x07samples\x18\x07 \x01(\x03\x12\x0c\n\x04seed\x18\x08 \x01(\x04\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\"\xf4\x01\n\x08SweepRow\x12!\n\x06inputs\x18\x01 \x03(\x0b\x32\x11.sysml.CalcOutput\x12\"\n\x07outputs\x18\x02 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x03 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x16\n\x0e\x65lapsed_micros\x18\x04 \x01(\x03\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\x06 \x01(\x0e\x32\x14.sysml.FailureReason\x12*\n\x0b\x65valuations\x18\x07 \x03(\x0b\x32\x15.sysml.CaseEvaluation\"\xad\x02\n\x10RunSweepResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x0f\n\x07sampled\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x04\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x07 \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x08 \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\t \x01(\t\x12\x10\n\x08strength\x18\n \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0b \x03(\x0b\x32\x0c.sysml.Bound\"\x9a\x04\n\x0eRunRunsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x18\n\x10\x61\x63tion_symbol_id\x18\x02 \x01(\t\x12\x1a\n\x12\x61nalysis_symbol_id\x18\x03 \x01(\t\x12\x31\n\x06inputs\x18\x04 \x03(\x0b\x32!.sysml.RunRunsRequest.InputsEntry\x12\x1b\n\x13performer_symbol_id\x18\x05 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x06 \x01(\t\x12\x1f\n\targuments\x18\x07 \x03(\x0b\x32\x0c.sysml.Value\x12\x42\n\x0fnamed_arguments\x18\x08 \x03(\x0b\x32).sysml.RunRunsRequest.NamedArgumentsEntry\x12\x0c\n\x04runs\x18\t \x01(\x03\x12\x11\n\x04seed\x18\n \x01(\x04H\x00\x88\x01\x01\x12\r\n\x05\x64raws\x18\x0b \x01(\t\x12\x12\n\nclock_step\x18\x0c \x01(\x01\x12\x0f\n\x07observe\x18\r \x03(\t\x12\x0e\n\x06\x65ngine\x18\x0e \x01(\t\x1a;\n\x0bInputsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\x07\n\x05_seed\"\xb0\x02\n\x0fRunDistribution\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04unit\x18\x02 \x01(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\x12\x0f\n\x07numeric\x18\x04 \x01(\x08\x12\x19\n\x03min\x18\x05 \x01(\x0b\x32\x0c.sysml.Value\x12\x19\n\x03max\x18\x06 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04mean\x18\x07 \x01(\x0b\x32\x0c.sysml.Value\x12\x11\n\tdeviation\x18\x08 \x01(\x01\x12)\n\x0bpercentiles\x18\t \x03(\x0b\x32\x14.sysml.RunPercentile\x12)\n\thistogram\x18\n \x03(\x0b\x32\x16.sysml.RunHistogramBin\x12&\n\x06values\x18\x0b \x03(\x0b\x32\x16.sysml.RunCountedValue\"@\n\rRunPercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\"W\n\x0fRunHistogramBin\x12\x19\n\x03low\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\x1a\n\x04high\x18\x02 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x63ount\x18\x03 \x01(\x03\"=\n\x0fRunCountedValue\x12\x1b\n\x05value\x18\x01 \x01(\x0b\x32\x0c.sysml.Value\x12\r\n\x05\x63ount\x18\x02 \x01(\x03\"B\n\x10SelfCheckRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1a\n\x12self_check_package\x18\x02 \x03(\t\"\x89\x01\n\x10SelfCheckFinding\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x10\n\x08location\x18\x03 \x01(\t\x12\x12\n\nconstraint\x18\x04 \x01(\t\x12\x0f\n\x07\x65lement\x18\x05 \x01(\t\x12\x0f\n\x07message\x18\x06 \x01(\t\x12\x0c\n\x04line\x18\x07 \x01(\t\"9\n\x14SelfCheckApplication\x12\x12\n\nconstraint\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x03\"\xaf\x02\n\x11SelfCheckResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12)\n\x08\x66indings\x18\x02 \x03(\x0b\x32\x17.sysml.SelfCheckFinding\x12\x10\n\x08\x65lements\x18\x03 \x01(\x03\x12\x0e\n\x06\x63hecks\x18\x04 \x01(\x03\x12\x12\n\nviolations\x18\x05 \x01(\x03\x12\x13\n\x0bunevaluated\x18\x06 \x01(\x03\x12\x19\n\x11\x65valuation_errors\x18\x07 \x01(\x03\x12\x31\n\x0c\x61pplications\x18\x08 \x03(\x0b\x32\x1b.sysml.SelfCheckApplication\x12\x0f\n\x07summary\x18\t \x01(\t\x12\r\n\x05\x65rror\x18\n \x01(\t\x12&\n\x0b\x64iagnostics\x18\x0b \x03(\x0b\x32\x11.sysml.Diagnostic\"\x95\x03\n\x10RecordRunRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x1a\n\x12\x61nalysis_symbol_id\x18\x02 \x01(\t\x12\x19\n\x11subject_symbol_id\x18\x03 \x01(\t\x12\x1f\n\targuments\x18\x04 \x03(\x0b\x32\x0c.sysml.Value\x12\x44\n\x0fnamed_arguments\x18\x05 \x03(\x0b\x32+.sysml.RecordRunRequest.NamedArgumentsEntry\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x13\n\x0brecord_into\x18\x07 \x01(\t\x12!\n\x06ranges\x18\x08 \x03(\x0b\x32\x11.sysml.SweepRange\x12\x0c\n\x04runs\x18\t \x01(\x03\x12\x11\n\x04seed\x18\n \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x0b \x01(\x08\x1a\x43\n\x13NamedArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.sysml.Value:\x02\x38\x01\x42\x07\n\x05_seed\"\xa8\x03\n\x11RecordRunResponse\x12\'\n\x03run\x18\x01 \x01(\x0b\x32\x1a.sysml.RunAnalysisResponse\x12&\n\x05sweep\x18\x02 \x01(\x0b\x32\x17.sysml.RunSweepResponse\x12&\n\x06sample\x18\x03 \x01(\x0b\x32\x16.sysml.RunRunsResponse\x12\x0f\n\x07package\x18\x04 \x01(\t\x12\x12\n\ndefinition\x18\x05 \x01(\t\x12\x0f\n\x07records\x18\x06 \x03(\t\x12\x0e\n\x06source\x18\x07 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x08 \x01(\t\x12(\n\tdocuments\x18\t \x03(\x0b\x32\x15.sysml.EditedDocument\x12\x0f\n\x07skipped\x18\n \x01(\x03\x12\x0f\n\x07reasons\x18\x0b \x03(\t\x12\r\n\x05\x65rror\x18\x0c \x01(\t\x12,\n\x0e\x66\x61ilure_reason\x18\r \x01(\x0e\x32\x14.sysml.FailureReason\x12&\n\x0b\x64iagnostics\x18\x0e \x03(\x0b\x32\x11.sysml.Diagnostic\x12\x12\n\nmodel_hash\x18\x0f \x01(\t\"\xc3\x03\n\x0fRunRunsResponse\x12\x1d\n\x04rows\x18\x01 \x03(\x0b\x32\x0f.sysml.SweepRow\x12\x13\n\x0bobservables\x18\x02 \x03(\t\x12-\n\rdistributions\x18\x03 \x03(\x0b\x32\x16.sysml.RunDistribution\x12\r\n\x05lines\x18\x04 \x03(\t\x12\"\n\x07outputs\x18\x05 \x03(\x0b\x32\x11.sysml.CalcOutput\x12 \n\x08verdicts\x18\x06 \x03(\x0b\x32\x0e.sysml.Verdict\x12\x13\n\x0bunconcluded\x18\x07 \x01(\t\x12\r\n\x05\x65rror\x18\x08 \x01(\t\x12&\n\x0b\x64iagnostics\x18\t \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32\x14.sysml.FailureReason\x12\"\n\tinstances\x18\x0b \x03(\x0b\x32\x0f.sysml.Instance\x12\x0e\n\x06\x65ngine\x18\x0c \x01(\t\x12\x10\n\x08strength\x18\r \x01(\t\x12\x1c\n\x06\x62ounds\x18\x0e \x03(\x0b\x32\x0c.sysml.Bound\x12\x11\n\x04seed\x18\x0f \x01(\x04H\x00\x88\x01\x01\x42\x07\n\x05_seed\"n\n\x17RunDocumentQueryRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x10\n\x08query_id\x18\x02 \x01(\t\x12-\n\x08\x62indings\x18\x03 \x03(\x0b\x32\x1b.sysml.DocumentQueryBinding\"O\n\x14\x44ocumentQueryBinding\x12\x11\n\tparameter\x18\x01 \x01(\t\x12$\n\x06values\x18\x02 \x03(\x0b\x32\x14.sysml.DocumentValue\"\xbb\x03\n\rDocumentValue\x12\x14\n\nelement_id\x18\x01 \x01(\tH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x04 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x05 \x01(\x08H\x00\x12\x12\n\x08infinity\x18\x06 \x01(\x08H\x00\x12#\n\x08quantity\x18\x08 \x01(\x0b\x32\x0f.sysml.QuantityH\x00\x12)\n\x07verdict\x18\t \x01(\x0b\x32\x16.sysml.DocumentVerdictH\x00\x12\'\n\x06object\x18\n \x01(\x0b\x32\x15.sysml.DocumentObjectH\x00\x12%\n\x05state\x18\x0b \x01(\x0b\x32\x14.sysml.DocumentStateH\x00\x12%\n\x05\x65vent\x18\x0c \x01(\x0b\x32\x14.sysml.DocumentEventH\x00\x12\x17\n\rbig_int_value\x18\r \x01(\tH\x00\x12)\n\x0erational_value\x18\x0e \x01(\x0b\x32\x0f.sysml.RationalH\x00\x12\x14\n\x0c\x65lement_type\x18\x07 \x01(\tB\x06\n\x04kind\"Z\n\x0e\x44ocumentObject\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x0c\n\x04path\x18\x02 \x01(\t\x12%\n\x07\x65lement\x18\x03 \x01(\x0b\x32\x14.sysml.DocumentValue\"\xae\x01\n\x0f\x44ocumentVerdict\x12\'\n\tassertion\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x11\n\tcondition\x18\x06 \x01(\t\x12\x0e\n\x06reason\x18\x07 \x01(\t\x12\x14\n\x0cverification\x18\x08 \x03(\t\"\xb1\x01\n\rDocumentState\x12%\n\x06object\x18\x01 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x12\n\nstate_path\x18\x04 \x01(\t\x12#\n\x05state\x18\x05 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\x0e\n\x06region\x18\x06 \x01(\t\x12\x11\n\tenclosing\x18\x07 \x03(\t\"\xe7\x02\n\rDocumentEvent\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\"\n\x04time\x18\x02 \x01(\x0b\x32\x14.sysml.DocumentValue\x12%\n\x06object\x18\x03 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\x0f\n\x07machine\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0c\n\x04\x66rom\x18\x06 \x01(\t\x12\n\n\x02to\x18\x07 \x01(\t\x12%\n\x06target\x18\x08 \x01(\x0b\x32\x15.sysml.DocumentObject\x12\r\n\x05\x65vent\x18\t \x01(\t\x12\x0f\n\x07payload\x18\n \x03(\t\x12\x14\n\x0c\x61lternatives\x18\x0b \x03(\t\x12\r\n\x05taken\x18\x0c \x01(\t\x12\x0c\n\x04text\x18\r \x01(\t\x12\r\n\x05token\x18\x0e \x01(\x03\x12\x0c\n\x04step\x18\x0f \x01(\x05\x12\x0f\n\x07\x66\x65\x61ture\x18\x10 \x01(\t\x12\x1b\n\x05value\x18\x11 \x01(\x0b\x32\x0c.sysml.Value\"#\n\x13\x44ocumentQueryColumn\x12\x0c\n\x04name\x18\x01 \x01(\t\"9\n\x11\x44ocumentQueryCell\x12$\n\x06values\x18\x01 \x03(\x0b\x32\x14.sysml.DocumentValue\"b\n\x10\x44ocumentQueryRow\x12%\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x14.sysml.DocumentValue\x12\'\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32\x18.sysml.DocumentQueryCell\"n\n\x18RunDocumentQueryResponse\x12+\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x1a.sysml.DocumentQueryColumn\x12%\n\x04rows\x18\x02 \x03(\x0b\x32\x17.sysml.DocumentQueryRow\"\xa4\x01\n\x0cQueryOutcome\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04step\x18\x02 \x01(\t\x12%\n\x08\x66\x61ilures\x18\x03 \x03(\x0b\x32\x13.sysml.QueryFailure\x12%\n\x08\x66indings\x18\x04 \x03(\x0b\x32\x13.sysml.QueryFinding\x12*\n\rpath_failures\x18\x05 \x03(\x0b\x32\x13.sysml.QueryFailure\"V\n\x0cQueryFailure\x12\x0c\n\x04step\x18\x01 \x01(\t\x12\x10\n\x08\x65xpected\x18\x02 \x01(\t\x12&\n\x08\x66rontier\x18\x03 \x01(\x0b\x32\x14.sysml.QueryFrontier\"\x97\x01\n\rQueryFrontier\x12\n\n\x02\x61t\x18\x01 \x01(\t\x12+\n\x07members\x18\x02 \x03(\x0b\x32\x1a.sysml.QueryFrontierMember\x12-\n\x08\x66\x65\x61tures\x18\x03 \x03(\x0b\x32\x1b.sysml.QueryFrontierFeature\x12\r\n\x05kinds\x18\x04 \x03(\t\x12\x0f\n\x07nearest\x18\x05 \x01(\t\"6\n\x13QueryFrontierMember\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tmetaclass\x18\x02 \x01(\t\"2\n\x14QueryFrontierFeature\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\"S\n\x0cQueryFinding\x12\x0c\n\x04step\x18\x01 \x01(\t\x12\x0f\n\x07\x65lement\x18\x02 \x01(\t\x12\x12\n\nconstraint\x18\x03 \x01(\t\x12\x10\n\x08observed\x18\x04 \x01(\t\"N\n\x15RenderDocumentRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x02 \x01(\t\x12\x0c\n\x04\x66orm\x18\x03 \x01(\t\"]\n\x16RenderDocumentResponse\x12\x10\n\x08markdown\x18\x01 \x01(\t\x12\x0c\n\x04html\x18\x02 \x01(\t\x12\x10\n\x08\x61sciidoc\x18\x04 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\"w\n\x11RenderViewRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0c\n\x04view\x18\x02 \x01(\t\x12\r\n\x05ports\x18\x03 \x01(\t\x12\x0c\n\x04show\x18\x04 \x03(\t\x12\r\n\x05\x64\x65pth\x18\x05 \x01(\x05\x12\x14\n\x0c\x63ompartments\x18\x06 \x01(\t\"\x9c\x02\n\x12RenderViewResponse\x12\x0c\n\x04view\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0e\n\x06stated\x18\x03 \x01(\t\x12 \n\x05nodes\x18\x04 \x03(\x0b\x32\x11.sysml.RenderNode\x12 \n\x05\x65\x64ges\x18\x05 \x03(\x0b\x32\x11.sysml.RenderEdge\x12\x0f\n\x07\x63olumns\x18\x06 \x03(\t\x12\x1e\n\x04rows\x18\x07 \x03(\x0b\x32\x10.sysml.RenderRow\x12#\n\x06\x63\x61nvas\x18\x08 \x01(\x0b\x32\x13.sysml.RenderCanvas\x12 \n\x05notes\x18\t \x03(\x0b\x32\x11.sysml.RenderNote\x12\x0f\n\x07notices\x18\n \x03(\t\x12\r\n\x05shown\x18\x0b \x03(\t\"\xcf\x02\n\nRenderNode\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x10name_synthesized\x18\x04 \x01(\x08\x12\x0c\n\x04type\x18\x05 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x06 \x01(\t\x12\x0c\n\x04text\x18\x07 \x01(\t\x12\x10\n\x08stand_in\x18\x08 \x01(\x08\x12\x0e\n\x06parent\x18\t \x01(\t\x12 \n\x05ports\x18\n \x03(\x0b\x32\x11.sysml.RenderPort\x12\x1b\n\x06origin\x18\x0b \x01(\x0b\x32\x0b.sysml.Span\x12\'\n\x08geometry\x18\x0c \x01(\x0b\x32\x15.sysml.RenderGeometry\x12!\n\x05style\x18\r \x01(\x0b\x32\x12.sysml.RenderStyle\x12\x13\n\x0b\x63ompartment\x18\x0e \x01(\t\x12\x11\n\tinherited\x18\x0f \x01(\x08\"Z\n\nRenderPort\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x11\n\tdirection\x18\x04 \x01(\t\x12\x11\n\tinherited\x18\x05 \x01(\x08\"\xd8\x01\n\nRenderEdge\x12\x0c\n\x04\x66rom\x18\x01 \x01(\t\x12\n\n\x02to\x18\x02 \x01(\t\x12\x11\n\tfrom_port\x18\x03 \x01(\t\x12\x0f\n\x07to_port\x18\x04 \x01(\t\x12\r\n\x05label\x18\x05 \x01(\t\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x0c\n\x04kind\x18\x07 \x01(\t\x12\x1b\n\x06origin\x18\x08 \x01(\x0b\x32\x0b.sysml.Span\x12!\n\x05route\x18\t \x03(\x0b\x32\x12.sysml.RenderPoint\x12!\n\x05style\x18\n \x01(\x0b\x32\x12.sysml.RenderStyle\"|\n\x0eRenderGeometry\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\x12\r\n\x05width\x18\x03 \x01(\x01\x12\x0e\n\x06height\x18\x04 \x01(\x01\x12\x10\n\x08has_size\x18\x05 \x01(\x08\x12\x11\n\tcollapsed\x18\x06 \x01(\x08\x12\x10\n\x08unplaced\x18\x07 \x01(\x08\"M\n\x0cRenderCanvas\x12\x0c\n\x04unit\x18\x01 \x01(\t\x12\r\n\x05width\x18\x02 \x01(\x01\x12\x0e\n\x06height\x18\x03 \x01(\x01\x12\x10\n\x08has_size\x18\x04 \x01(\x08\"v\n\x0bRenderStyle\x12\x0c\n\x04\x66ill\x18\x01 \x01(\t\x12\x0c\n\x04line\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04\x66ont\x18\x04 \x01(\t\x12\x11\n\tfont_size\x18\x05 \x01(\x01\x12\x0c\n\x04\x62old\x18\x06 \x01(\x08\x12\x0e\n\x06italic\x18\x07 \x01(\x08\"#\n\x0bRenderPoint\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\"7\n\tRenderRow\x12\r\n\x05\x63\x65lls\x18\x01 \x03(\t\x12\x1b\n\x06origin\x18\x02 \x01(\x0b\x32\x0b.sysml.Span\"\xb2\x01\n\nRenderNote\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x0e\n\x06\x61nchor\x18\x02 \x01(\t\x12\x11\n\tedge_from\x18\x03 \x01(\t\x12\x0f\n\x07\x65\x64ge_to\x18\x04 \x01(\t\x12\t\n\x01x\x18\x05 \x01(\x01\x12\t\n\x01y\x18\x06 \x01(\x01\x12\r\n\x05width\x18\x07 \x01(\x01\x12\x0e\n\x06height\x18\x08 \x01(\x01\x12\x10\n\x08has_size\x18\t \x01(\x08\x12\x1b\n\x06origin\x18\n \x01(\x0b\x32\x0b.sysml.Span\":\n\x13\x45xportGraphsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\"I\n\x14\x45xportGraphsResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\x12\x0f\n\x07subject\x18\x03 \x01(\t\"\x90\x01\n\x11ImportDataRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\"\n\x07imports\x18\x02 \x03(\x0b\x32\x11.sysml.DataImport\x12\x11\n\timport_as\x18\x03 \x01(\t\x12\x16\n\x0eimport_dry_run\x18\x04 \x01(\x08\x12\x18\n\x10\x61\x63\x63\x65pt_documents\x18\x05 \x01(\x08\"V\n\nDataImport\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x15\n\rimport_format\x18\x03 \x01(\t\x12\x12\n\nimport_map\x18\x04 \x01(\t\"\xbe\x01\n\x12ImportDataResponse\x12\"\n\x05\x66iles\x18\x01 \x03(\x0b\x32\x13.sysml.ImportedFile\x12(\n\tdocuments\x18\x02 \x03(\x0b\x32\x15.sysml.EditedDocument\x12\x0f\n\x07\x63ontent\x18\x03 \x01(\t\x12\x12\n\nmodel_hash\x18\x04 \x01(\t\x12\r\n\x05\x65rror\x18\x05 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x06 \x03(\x0b\x32\x11.sysml.Diagnostic\"i\n\x0cImportedFile\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06values\x18\x02 \x01(\x03\x12\x10\n\x08\x65lements\x18\x03 \x01(\x03\x12)\n\x0b\x61ssignments\x18\x04 \x03(\x0b\x32\x14.sysml.ImportedValue\"w\n\rImportedValue\x12\x0f\n\x07\x65lement\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x11\n\tredefines\x18\x04 \x01(\t\x12\r\n\x05where\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\"\xe6\x01\n\x15\x43ompareResultsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x0f\n\x07results\x18\x02 \x01(\t\x12\x0f\n\x07\x61\x63tions\x18\x03 \x03(\t\x12\x0c\n\x04runs\x18\x04 \x01(\x03\x12\x11\n\x04seed\x18\x05 \x01(\x04H\x00\x88\x01\x01\x12\r\n\x05\x64raws\x18\x06 \x01(\t\x12\x17\n\nclock_step\x18\x07 \x01(\x01H\x01\x88\x01\x01\x12&\n\x07observe\x18\x08 \x03(\x0b\x32\x15.sysml.ObservablePair\x12\x0e\n\x06\x65ngine\x18\t \x01(\tB\x07\n\x05_seedB\r\n\x0b_clock_step\"1\n\x0eObservablePair\x12\x0e\n\x06stored\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\"\x85\x02\n\x16\x43ompareResultsResponse\x12\x36\n\x0e\x63onfigurations\x18\x01 \x03(\x0b\x32\x1e.sysml.ConfigurationComparison\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\x12,\n\x0e\x66\x61ilure_reason\x18\x05 \x01(\x0e\x32\x14.sysml.FailureReason\x12\x0e\n\x06\x65ngine\x18\x06 \x01(\t\x12\x10\n\x08strength\x18\x07 \x01(\t\x12\x1c\n\x06\x62ounds\x18\x08 \x03(\x0b\x32\x0c.sysml.Bound\"\xc4\x03\n\x17\x43onfigurationComparison\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x62\x65havior\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x17\n\x0fresult_location\x18\x05 \x01(\t\x12\x0e\n\x06status\x18\x06 \x01(\t\x12\x12\n\nunresolved\x18\x07 \x01(\t\x12\x13\n\x0bstored_runs\x18\x08 \x01(\x03\x12\x18\n\x10stored_snapshots\x18\t \x01(\x03\x12\x0c\n\x04runs\x18\n \x01(\x03\x12\x11\n\tcompleted\x18\x0b \x01(\x03\x12\r\n\x05\x64raws\x18\x0c \x01(\t\x12\x11\n\x04seed\x18\r \x01(\x04H\x00\x88\x01\x01\x12\x12\n\nclock_step\x18\x0e \x01(\x01\x12\x1d\n\x04rows\x18\x0f \x03(\x0b\x32\x0f.sysml.SweepRow\x12\"\n\tinstances\x18\x10 \x03(\x0b\x32\x0f.sysml.Instance\x12\x30\n\x0bobservables\x18\x11 \x03(\x0b\x32\x1b.sysml.ObservableComparison\x12\x0e\n\x06\x65rrors\x18\x12 \x03(\t\x12\r\n\x05notes\x18\x13 \x03(\t\x12\r\n\x05lines\x18\x14 \x03(\tB\x07\n\x05_seed\"\xc8\x02\n\x14ObservableComparison\x12\x0e\n\x06stored\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x02 \x01(\t\x12\x0c\n\x04unit\x18\x03 \x01(\t\x12)\n\x04tool\x18\x04 \x01(\x0b\x32\x1b.sysml.ComparedDistribution\x12\x0e\n\x06pooled\x18\x05 \x01(\x08\x12\x10\n\x08unstored\x18\x06 \x01(\x08\x12(\n\x03run\x18\x07 \x01(\x0b\x32\x1b.sysml.ComparedDistribution\x12\x10\n\x08produced\x18\x08 \x01(\x03\x12\x10\n\x08\x63ompared\x18\t \x01(\x08\x12.\n\ndifference\x18\n \x01(\x0b\x32\x1a.sysml.StatisticDifference\x12\'\n\x08\x64\x65\x63lared\x18\x0b \x01(\x0b\x32\x15.sysml.CaseStatistics\x12\r\n\x05notes\x18\x0c \x03(\t\"z\n\x14\x43omparedDistribution\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x0b\n\x03min\x18\x02 \x01(\x01\x12\x0c\n\x04mean\x18\x03 \x01(\x01\x12\x0b\n\x03p50\x18\x04 \x01(\x01\x12\x0b\n\x03p90\x18\x05 \x01(\x01\x12\x0b\n\x03max\x18\x06 \x01(\x01\x12\x11\n\tdeviation\x18\x07 \x01(\x01\"W\n\x13StatisticDifference\x12\x0b\n\x03min\x18\x01 \x01(\t\x12\x0c\n\x04mean\x18\x02 \x01(\t\x12\x0b\n\x03p50\x18\x03 \x01(\t\x12\x0b\n\x03p90\x18\x04 \x01(\t\x12\x0b\n\x03max\x18\x05 \x01(\t\"U\n\x0e\x43\x61seStatistics\x12\x10\n\x08\x61nalysis\x18\x01 \x01(\t\x12\"\n\x04rows\x18\x02 \x03(\x0b\x32\x14.sysml.CaseStatistic\x12\r\n\x05notes\x18\x03 \x03(\t\"]\n\rCaseStatistic\x12\x11\n\tstatistic\x18\x01 \x01(\t\x12\n\n\x02of\x18\x02 \x01(\t\x12\x0c\n\x04tool\x18\x03 \x01(\t\x12\x0b\n\x03run\x18\x04 \x01(\t\x12\x12\n\ndifference\x18\x05 \x01(\t*\xb1\x01\n\rFailureReason\x12\x1e\n\x1a\x46\x41ILURE_REASON_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x46\x41ILURE_REASON_EVALUATION\x10\x01\x12\x1d\n\x19\x46\x41ILURE_REASON_WRONG_KIND\x10\x02\x12$\n FAILURE_REASON_AMBIGUOUS_SUBJECT\x10\x03\x12\x1c\n\x18\x46\x41ILURE_REASON_UNDECIDED\x10\x04*\x8c\x05\n\x0b\x45\x64itFailure\x12\x1c\n\x18\x45\x44IT_FAILURE_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x45\x44IT_FAILURE_NO_OPERATIONS\x10\x01\x12\x1f\n\x1b\x45\x44IT_FAILURE_UNKNOWN_TARGET\x10\x02\x12!\n\x1d\x45\x44IT_FAILURE_AMBIGUOUS_TARGET\x10\x03\x12\x1b\n\x17\x45\x44IT_FAILURE_NOT_VALUED\x10\x04\x12\x1e\n\x1a\x45\x44IT_FAILURE_INVALID_VALUE\x10\x05\x12\x1d\n\x19\x45\x44IT_FAILURE_INVALID_NAME\x10\x06\x12\x1a\n\x16\x45\x44IT_FAILURE_NOT_NAMED\x10\x07\x12\"\n\x1e\x45\x44IT_FAILURE_RENAME_REFERENCED\x10\x08\x12\"\n\x1e\x45\x44IT_FAILURE_OVERLAPPING_EDITS\x10\t\x12\x1f\n\x1b\x45\x44IT_FAILURE_RESULT_INVALID\x10\n\x12\x1e\n\x1a\x45\x44IT_FAILURE_OWNER_UNKNOWN\x10\x0b\x12$\n EDIT_FAILURE_OWNER_NOT_NAMESPACE\x10\x0c\x12\x1d\n\x19\x45\x44IT_FAILURE_ILLEGAL_KIND\x10\r\x12\"\n\x1e\x45\x44IT_FAILURE_MEMBER_NAME_TAKEN\x10\x0e\x12\"\n\x1e\x45\x44IT_FAILURE_DELETE_REFERENCED\x10\x0f\x12$\n EDIT_FAILURE_OWNER_INSIDE_TARGET\x10\x10\x12 \n\x1c\x45\x44IT_FAILURE_MOVE_REFERENCED\x10\x11\x12%\n!EDIT_FAILURE_REFERENCED_ELSEWHERE\x10\x12*\x9a\x02\n\x11PrimitiveOperator\x12\"\n\x1ePRIMITIVE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRIMITIVE_OPERATOR_EQUAL\x10\x01\x12\x1e\n\x1aPRIMITIVE_OPERATOR_GREATER\x10\x02\x12\x1b\n\x17PRIMITIVE_OPERATOR_LESS\x10\x03\x12!\n\x1dPRIMITIVE_OPERATOR_LESS_EQUAL\x10\x04\x12$\n PRIMITIVE_OPERATOR_GREATER_EQUAL\x10\x05\x12\x19\n\x15PRIMITIVE_OPERATOR_IN\x10\x06\x12\"\n\x1ePRIMITIVE_OPERATOR_INSTANCE_OF\x10\x07*n\n\x11\x43ompositeOperator\x12\"\n\x1e\x43OMPOSITE_OPERATOR_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OMPOSITE_OPERATOR_AND\x10\x01\x12\x19\n\x15\x43OMPOSITE_OPERATOR_OR\x10\x02\x32\x9d\x11\n\x0cSysMLService\x12\x44\n\rGetServerInfo\x12\x18.sysml.ServerInfoRequest\x1a\x19.sysml.ServerInfoResponse\x12>\n\tParseFile\x12\x17.sysml.ParseFileRequest\x1a\x18.sysml.ParseFileResponse\x12G\n\x0cParseSources\x12\x1a.sysml.ParseSourcesRequest\x1a\x1b.sysml.ParseSourcesResponse\x12;\n\tGetSymbol\x12\x17.sysml.GetSymbolRequest\x1a\x15.sysml.SymbolResponse\x12G\n\x0eGetDiagnostics\x12\x19.sysml.DiagnosticsRequest\x1a\x1a.sysml.DiagnosticsResponse\x12;\n\x08\x45valuate\x12\x16.sysml.EvaluateRequest\x1a\x17.sysml.EvaluateResponse\x12\x44\n\x0bInstantiate\x12\x19.sysml.InstantiateRequest\x1a\x1a.sysml.InstantiateResponse\x12J\n\rExecuteAction\x12\x1b.sysml.ExecuteActionRequest\x1a\x1c.sysml.ExecuteActionResponse\x12G\n\x0c\x45xecuteState\x12\x1a.sysml.ExecuteStateRequest\x1a\x1b.sysml.ExecuteStateResponse\x12\x38\n\x07\x43onvert\x12\x15.sysml.ConvertRequest\x1a\x16.sysml.ConvertResponse\x12\x38\n\x07Migrate\x12\x15.sysml.MigrateRequest\x1a\x16.sysml.MigrateResponse\x12\x41\n\nApplyEdits\x12\x18.sysml.ApplyEditsRequest\x1a\x19.sysml.ApplyEditsResponse\x12S\n\x10VerifyConstraint\x12\x1e.sysml.VerifyConstraintRequest\x1a\x1f.sysml.VerifyConstraintResponse\x12V\n\x11VerifyRequirement\x12\x1f.sysml.VerifyRequirementRequest\x1a .sysml.VerifyRequirementResponse\x12Y\n\x12VerifySatisfaction\x12 .sysml.VerifySatisfactionRequest\x1a!.sysml.VerifySatisfactionResponse\x12S\n\x10ValidateInstance\x12\x1e.sysml.ValidateInstanceRequest\x1a\x1f.sysml.ValidateInstanceResponse\x12G\n\x0c\x45valuateCalc\x12\x1a.sysml.EvaluateCalcRequest\x1a\x1b.sysml.EvaluateCalcResponse\x12\x44\n\x0bRunAnalysis\x12\x19.sysml.RunAnalysisRequest\x1a\x1a.sysml.RunAnalysisResponse\x12J\n\rCheckBehavior\x12\x1b.sysml.CheckBehaviorRequest\x1a\x1c.sysml.CheckBehaviorResponse\x12;\n\x08RunSweep\x12\x16.sysml.RunSweepRequest\x1a\x17.sysml.RunSweepResponse\x12\x38\n\x07RunRuns\x12\x15.sysml.RunRunsRequest\x1a\x16.sysml.RunRunsResponse\x12>\n\tSelfCheck\x12\x17.sysml.SelfCheckRequest\x1a\x18.sysml.SelfCheckResponse\x12>\n\tRecordRun\x12\x17.sysml.RecordRunRequest\x1a\x18.sysml.RecordRunResponse\x12\x44\n\x0bListEngines\x12\x19.sysml.ListEnginesRequest\x1a\x1a.sysml.ListEnginesResponse\x12\x32\n\x05Query\x12\x13.sysml.QueryRequest\x1a\x14.sysml.QueryResponse\x12S\n\x10RunDocumentQuery\x12\x1e.sysml.RunDocumentQueryRequest\x1a\x1f.sysml.RunDocumentQueryResponse\x12M\n\x0eRenderDocument\x12\x1c.sysml.RenderDocumentRequest\x1a\x1d.sysml.RenderDocumentResponse\x12\x41\n\nRenderView\x12\x18.sysml.RenderViewRequest\x1a\x19.sysml.RenderViewResponse\x12G\n\x0c\x45xportGraphs\x12\x1a.sysml.ExportGraphsRequest\x1a\x1b.sysml.ExportGraphsResponse\x12\x41\n\nImportData\x12\x18.sysml.ImportDataRequest\x1a\x19.sysml.ImportDataResponse\x12M\n\x0e\x43ompareResults\x12\x1c.sysml.CompareResultsRequest\x1a\x1d.sysml.CompareResultsResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -72,14 +72,14 @@ _globals['_RUNRUNSREQUEST_NAMEDARGUMENTSENTRY']._serialized_options = b'8\001' _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._loaded_options = None _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._serialized_options = b'8\001' - _globals['_FAILUREREASON']._serialized_start=29825 - _globals['_FAILUREREASON']._serialized_end=30002 - _globals['_EDITFAILURE']._serialized_start=30005 - _globals['_EDITFAILURE']._serialized_end=30657 - _globals['_PRIMITIVEOPERATOR']._serialized_start=30660 - _globals['_PRIMITIVEOPERATOR']._serialized_end=30942 - _globals['_COMPOSITEOPERATOR']._serialized_start=30944 - _globals['_COMPOSITEOPERATOR']._serialized_end=31054 + _globals['_FAILUREREASON']._serialized_start=29991 + _globals['_FAILUREREASON']._serialized_end=30168 + _globals['_EDITFAILURE']._serialized_start=30171 + _globals['_EDITFAILURE']._serialized_end=30823 + _globals['_PRIMITIVEOPERATOR']._serialized_start=30826 + _globals['_PRIMITIVEOPERATOR']._serialized_end=31108 + _globals['_COMPOSITEOPERATOR']._serialized_start=31110 + _globals['_COMPOSITEOPERATOR']._serialized_end=31220 _globals['_VERDICT']._serialized_start=23 _globals['_VERDICT']._serialized_end=448 _globals['_VERDICTNOTE']._serialized_start=450 @@ -199,291 +199,291 @@ _globals['_INSTANTIATERESPONSE']._serialized_start=8757 _globals['_INSTANTIATERESPONSE']._serialized_end=8904 _globals['_EXECUTEACTIONREQUEST']._serialized_start=8907 - _globals['_EXECUTEACTIONREQUEST']._serialized_end=9237 + _globals['_EXECUTEACTIONREQUEST']._serialized_end=9268 _globals['_EXECUTEACTIONREQUEST_INPUTSENTRY']._serialized_start=5541 _globals['_EXECUTEACTIONREQUEST_INPUTSENTRY']._serialized_end=5600 - _globals['_EXECUTEACTIONRESPONSE']._serialized_start=9240 - _globals['_EXECUTEACTIONRESPONSE']._serialized_end=9830 + _globals['_EXECUTEACTIONRESPONSE']._serialized_start=9271 + _globals['_EXECUTEACTIONRESPONSE']._serialized_end=9921 _globals['_EXECUTEACTIONRESPONSE_OUTPUTSENTRY']._serialized_start=4866 _globals['_EXECUTEACTIONRESPONSE_OUTPUTSENTRY']._serialized_end=4926 - _globals['_EXECUTEACTIONRESPONSE_PERFORMERATTRIBUTESENTRY']._serialized_start=9703 - _globals['_EXECUTEACTIONRESPONSE_PERFORMERATTRIBUTESENTRY']._serialized_end=9775 - _globals['_EXECUTEACTIONRESPONSE_ORDERDEPENDENTENTRY']._serialized_start=9777 - _globals['_EXECUTEACTIONRESPONSE_ORDERDEPENDENTENTRY']._serialized_end=9830 - _globals['_EXECUTESTATEREQUEST']._serialized_start=9833 - _globals['_EXECUTESTATEREQUEST']._serialized_end=10082 - _globals['_EXECUTESTATERESPONSE']._serialized_start=10085 - _globals['_EXECUTESTATERESPONSE']._serialized_end=10613 - _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_start=10493 - _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_end=10558 - _globals['_EXECUTESTATERESPONSE_ORDERDEPENDENTENTRY']._serialized_start=9777 - _globals['_EXECUTESTATERESPONSE_ORDERDEPENDENTENTRY']._serialized_end=9830 - _globals['_CONVERTREQUEST']._serialized_start=10616 - _globals['_CONVERTREQUEST']._serialized_end=10939 - _globals['_CONVERTRESPONSE']._serialized_start=10942 - _globals['_CONVERTRESPONSE']._serialized_end=11175 - _globals['_LIBRARYREFERENCE']._serialized_start=11177 - _globals['_LIBRARYREFERENCE']._serialized_end=11245 - _globals['_MIGRATEREQUEST']._serialized_start=11248 - _globals['_MIGRATEREQUEST']._serialized_end=11486 - _globals['_MIGRATERESPONSE']._serialized_start=11489 - _globals['_MIGRATERESPONSE']._serialized_end=11723 - _globals['_MIGRATIONREPORT']._serialized_start=11726 - _globals['_MIGRATIONREPORT']._serialized_end=11921 - _globals['_MIGRATIONENTRY']._serialized_start=11923 - _globals['_MIGRATIONENTRY']._serialized_end=12026 - _globals['_MIGRATIONFILE']._serialized_start=12028 - _globals['_MIGRATIONFILE']._serialized_end=12074 - _globals['_APPLYEDITSREQUEST']._serialized_start=12076 - _globals['_APPLYEDITSREQUEST']._serialized_end=12201 - _globals['_EDITOPERATION']._serialized_start=12204 - _globals['_EDITOPERATION']._serialized_end=13039 - _globals['_ADDMEMBEREDIT']._serialized_start=13042 - _globals['_ADDMEMBEREDIT']._serialized_end=13316 - _globals['_ADDSATISFYEDIT']._serialized_start=13318 - _globals['_ADDSATISFYEDIT']._serialized_end=13439 - _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_start=13441 - _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_end=13534 - _globals['_ADDTRANSITIONEDIT']._serialized_start=13537 - _globals['_ADDTRANSITIONEDIT']._serialized_end=13682 - _globals['_ADDVERIFYEDIT']._serialized_start=13684 - _globals['_ADDVERIFYEDIT']._serialized_end=13735 - _globals['_METADATAFEATUREVALUE']._serialized_start=13737 - _globals['_METADATAFEATUREVALUE']._serialized_end=13791 - _globals['_ADDMETADATAEDIT']._serialized_start=13794 - _globals['_ADDMETADATAEDIT']._serialized_end=13942 - _globals['_ADDMETADATAPREFIXEDIT']._serialized_start=13944 - _globals['_ADDMETADATAPREFIXEDIT']._serialized_end=14006 - _globals['_ADDIMPORTEDIT']._serialized_start=14009 - _globals['_ADDIMPORTEDIT']._serialized_end=14137 - _globals['_ADDDOCUMENTATIONEDIT']._serialized_start=14139 - _globals['_ADDDOCUMENTATIONEDIT']._serialized_end=14238 - _globals['_ADDCOMMENTEDIT']._serialized_start=14240 - _globals['_ADDCOMMENTEDIT']._serialized_end=14330 - _globals['_ADDNOTEEDIT']._serialized_start=14332 - _globals['_ADDNOTEEDIT']._serialized_end=14375 - _globals['_ADDSEQUENCEEDIT']._serialized_start=14378 - _globals['_ADDSEQUENCEEDIT']._serialized_end=14711 - _globals['_ADDCONNECTIONEDIT']._serialized_start=14713 - _globals['_ADDCONNECTIONEDIT']._serialized_end=14823 - _globals['_DELETEEDIT']._serialized_start=14825 - _globals['_DELETEEDIT']._serialized_end=14870 - _globals['_MOVEEDIT']._serialized_start=14872 - _globals['_MOVEEDIT']._serialized_end=14913 - _globals['_SETVALUEEDIT']._serialized_start=14915 - _globals['_SETVALUEEDIT']._serialized_end=14960 - _globals['_RENAMEEDIT']._serialized_start=14962 - _globals['_RENAMEEDIT']._serialized_end=15008 - _globals['_APPLYEDITSRESPONSE']._serialized_start=15011 - _globals['_APPLYEDITSRESPONSE']._serialized_end=15283 - _globals['_EDITEDDOCUMENT']._serialized_start=15285 - _globals['_EDITEDDOCUMENT']._serialized_end=15332 - _globals['_REFERRER']._serialized_start=15334 - _globals['_REFERRER']._serialized_end=15376 - _globals['_APPLIEDEDIT']._serialized_start=15379 - _globals['_APPLIEDEDIT']._serialized_end=15519 - _globals['_SYMBOLINFO']._serialized_start=15522 - _globals['_SYMBOLINFO']._serialized_end=15903 - _globals['_SYMBOLINFO_METADATAENTRY']._serialized_start=15856 - _globals['_SYMBOLINFO_METADATAENTRY']._serialized_end=15903 - _globals['_SPECIALIZATION']._serialized_start=15905 - _globals['_SPECIALIZATION']._serialized_end=15993 - _globals['_TYPEINFO']._serialized_start=15996 - _globals['_TYPEINFO']._serialized_end=16145 - _globals['_MULTIPLICITYINFO']._serialized_start=16147 - _globals['_MULTIPLICITYINFO']._serialized_end=16195 - _globals['_ATTRIBUTEINFO']._serialized_start=16197 - _globals['_ATTRIBUTEINFO']._serialized_end=16283 - _globals['_VALUE']._serialized_start=16286 - _globals['_VALUE']._serialized_end=17061 - _globals['_RATIONAL']._serialized_start=17063 - _globals['_RATIONAL']._serialized_end=17113 - _globals['_METAOBJECT']._serialized_start=17115 - _globals['_METAOBJECT']._serialized_end=17169 - _globals['_UNDETERMINED']._serialized_start=17171 - _globals['_UNDETERMINED']._serialized_end=17241 - _globals['_FUNCTION']._serialized_start=17243 - _globals['_FUNCTION']._serialized_end=17287 - _globals['_VALUESET']._serialized_start=17289 - _globals['_VALUESET']._serialized_end=17331 - _globals['_TENSORQUANTITY']._serialized_start=17333 - _globals['_TENSORQUANTITY']._serialized_end=17406 - _globals['_ARRAY']._serialized_start=17408 - _globals['_ARRAY']._serialized_end=17467 - _globals['_VECTOR']._serialized_start=17469 - _globals['_VECTOR']._serialized_end=17511 - _globals['_VECTORQUANTITY']._serialized_start=17513 - _globals['_VECTORQUANTITY']._serialized_end=17566 - _globals['_COMPLEX']._serialized_start=17568 - _globals['_COMPLEX']._serialized_end=17610 - _globals['_ENUMLITERAL']._serialized_start=17612 - _globals['_ENUMLITERAL']._serialized_end=17712 - _globals['_VALUESEQUENCE']._serialized_start=17714 - _globals['_VALUESEQUENCE']._serialized_end=17761 - _globals['_QUANTITY']._serialized_start=17764 - _globals['_QUANTITY']._serialized_end=17964 - _globals['_MEASUREMENTREF']._serialized_start=17966 - _globals['_MEASUREMENTREF']._serialized_end=18049 - _globals['_UNITTERM']._serialized_start=18051 - _globals['_UNITTERM']._serialized_end=18135 - _globals['_UNITFACTOR']._serialized_start=18137 - _globals['_UNITFACTOR']._serialized_end=18184 - _globals['_DIAGNOSTIC']._serialized_start=18187 - _globals['_DIAGNOSTIC']._serialized_end=18321 - _globals['_SPAN']._serialized_start=18323 - _globals['_SPAN']._serialized_end=18417 - _globals['_SERVERINFOREQUEST']._serialized_start=18419 - _globals['_SERVERINFOREQUEST']._serialized_end=18438 - _globals['_SERVERINFORESPONSE']._serialized_start=18440 - _globals['_SERVERINFORESPONSE']._serialized_end=18499 - _globals['_QUERYREQUEST']._serialized_start=18501 - _globals['_QUERYREQUEST']._serialized_end=18584 - _globals['_QUERYRESPONSE']._serialized_start=18586 - _globals['_QUERYRESPONSE']._serialized_end=18646 - _globals['_QUERY']._serialized_start=18648 - _globals['_QUERY']._serialized_end=18738 - _globals['_CONSTRAINT']._serialized_start=18740 - _globals['_CONSTRAINT']._serialized_end=18864 - _globals['_PRIMITIVECONSTRAINT']._serialized_start=18866 - _globals['_PRIMITIVECONSTRAINT']._serialized_end=18981 - _globals['_COMPOSITECONSTRAINT']._serialized_start=18983 - _globals['_COMPOSITECONSTRAINT']._serialized_end=19087 - _globals['_QUERYRESULTELEMENT']._serialized_start=19090 - _globals['_QUERYRESULTELEMENT']._serialized_end=19250 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=19201 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=19250 - _globals['_SWEEPRANGE']._serialized_start=19252 - _globals['_SWEEPRANGE']._serialized_end=19367 - _globals['_RUNSWEEPREQUEST']._serialized_start=19370 - _globals['_RUNSWEEPREQUEST']._serialized_end=19706 + _globals['_EXECUTEACTIONRESPONSE_PERFORMERATTRIBUTESENTRY']._serialized_start=9794 + _globals['_EXECUTEACTIONRESPONSE_PERFORMERATTRIBUTESENTRY']._serialized_end=9866 + _globals['_EXECUTEACTIONRESPONSE_ORDERDEPENDENTENTRY']._serialized_start=9868 + _globals['_EXECUTEACTIONRESPONSE_ORDERDEPENDENTENTRY']._serialized_end=9921 + _globals['_EXECUTESTATEREQUEST']._serialized_start=9924 + _globals['_EXECUTESTATEREQUEST']._serialized_end=10173 + _globals['_EXECUTESTATERESPONSE']._serialized_start=10176 + _globals['_EXECUTESTATERESPONSE']._serialized_end=10704 + _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_start=10584 + _globals['_EXECUTESTATERESPONSE_FINALCONTEXTENTRY']._serialized_end=10649 + _globals['_EXECUTESTATERESPONSE_ORDERDEPENDENTENTRY']._serialized_start=9868 + _globals['_EXECUTESTATERESPONSE_ORDERDEPENDENTENTRY']._serialized_end=9921 + _globals['_CONVERTREQUEST']._serialized_start=10707 + _globals['_CONVERTREQUEST']._serialized_end=11030 + _globals['_CONVERTRESPONSE']._serialized_start=11033 + _globals['_CONVERTRESPONSE']._serialized_end=11266 + _globals['_LIBRARYREFERENCE']._serialized_start=11268 + _globals['_LIBRARYREFERENCE']._serialized_end=11336 + _globals['_MIGRATEREQUEST']._serialized_start=11339 + _globals['_MIGRATEREQUEST']._serialized_end=11577 + _globals['_MIGRATERESPONSE']._serialized_start=11580 + _globals['_MIGRATERESPONSE']._serialized_end=11814 + _globals['_MIGRATIONREPORT']._serialized_start=11817 + _globals['_MIGRATIONREPORT']._serialized_end=12012 + _globals['_MIGRATIONENTRY']._serialized_start=12014 + _globals['_MIGRATIONENTRY']._serialized_end=12117 + _globals['_MIGRATIONFILE']._serialized_start=12119 + _globals['_MIGRATIONFILE']._serialized_end=12165 + _globals['_APPLYEDITSREQUEST']._serialized_start=12167 + _globals['_APPLYEDITSREQUEST']._serialized_end=12292 + _globals['_EDITOPERATION']._serialized_start=12295 + _globals['_EDITOPERATION']._serialized_end=13130 + _globals['_ADDMEMBEREDIT']._serialized_start=13133 + _globals['_ADDMEMBEREDIT']._serialized_end=13407 + _globals['_ADDSATISFYEDIT']._serialized_start=13409 + _globals['_ADDSATISFYEDIT']._serialized_end=13530 + _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_start=13532 + _globals['_ADDREQUIREMENTCONSTRAINTEDIT']._serialized_end=13625 + _globals['_ADDTRANSITIONEDIT']._serialized_start=13628 + _globals['_ADDTRANSITIONEDIT']._serialized_end=13773 + _globals['_ADDVERIFYEDIT']._serialized_start=13775 + _globals['_ADDVERIFYEDIT']._serialized_end=13826 + _globals['_METADATAFEATUREVALUE']._serialized_start=13828 + _globals['_METADATAFEATUREVALUE']._serialized_end=13882 + _globals['_ADDMETADATAEDIT']._serialized_start=13885 + _globals['_ADDMETADATAEDIT']._serialized_end=14033 + _globals['_ADDMETADATAPREFIXEDIT']._serialized_start=14035 + _globals['_ADDMETADATAPREFIXEDIT']._serialized_end=14097 + _globals['_ADDIMPORTEDIT']._serialized_start=14100 + _globals['_ADDIMPORTEDIT']._serialized_end=14228 + _globals['_ADDDOCUMENTATIONEDIT']._serialized_start=14230 + _globals['_ADDDOCUMENTATIONEDIT']._serialized_end=14329 + _globals['_ADDCOMMENTEDIT']._serialized_start=14331 + _globals['_ADDCOMMENTEDIT']._serialized_end=14421 + _globals['_ADDNOTEEDIT']._serialized_start=14423 + _globals['_ADDNOTEEDIT']._serialized_end=14466 + _globals['_ADDSEQUENCEEDIT']._serialized_start=14469 + _globals['_ADDSEQUENCEEDIT']._serialized_end=14802 + _globals['_ADDCONNECTIONEDIT']._serialized_start=14804 + _globals['_ADDCONNECTIONEDIT']._serialized_end=14914 + _globals['_DELETEEDIT']._serialized_start=14916 + _globals['_DELETEEDIT']._serialized_end=14961 + _globals['_MOVEEDIT']._serialized_start=14963 + _globals['_MOVEEDIT']._serialized_end=15004 + _globals['_SETVALUEEDIT']._serialized_start=15006 + _globals['_SETVALUEEDIT']._serialized_end=15051 + _globals['_RENAMEEDIT']._serialized_start=15053 + _globals['_RENAMEEDIT']._serialized_end=15099 + _globals['_APPLYEDITSRESPONSE']._serialized_start=15102 + _globals['_APPLYEDITSRESPONSE']._serialized_end=15374 + _globals['_EDITEDDOCUMENT']._serialized_start=15376 + _globals['_EDITEDDOCUMENT']._serialized_end=15423 + _globals['_REFERRER']._serialized_start=15425 + _globals['_REFERRER']._serialized_end=15467 + _globals['_APPLIEDEDIT']._serialized_start=15470 + _globals['_APPLIEDEDIT']._serialized_end=15610 + _globals['_SYMBOLINFO']._serialized_start=15613 + _globals['_SYMBOLINFO']._serialized_end=15994 + _globals['_SYMBOLINFO_METADATAENTRY']._serialized_start=15947 + _globals['_SYMBOLINFO_METADATAENTRY']._serialized_end=15994 + _globals['_SPECIALIZATION']._serialized_start=15996 + _globals['_SPECIALIZATION']._serialized_end=16084 + _globals['_TYPEINFO']._serialized_start=16087 + _globals['_TYPEINFO']._serialized_end=16236 + _globals['_MULTIPLICITYINFO']._serialized_start=16238 + _globals['_MULTIPLICITYINFO']._serialized_end=16286 + _globals['_ATTRIBUTEINFO']._serialized_start=16288 + _globals['_ATTRIBUTEINFO']._serialized_end=16374 + _globals['_VALUE']._serialized_start=16377 + _globals['_VALUE']._serialized_end=17152 + _globals['_RATIONAL']._serialized_start=17154 + _globals['_RATIONAL']._serialized_end=17204 + _globals['_METAOBJECT']._serialized_start=17206 + _globals['_METAOBJECT']._serialized_end=17260 + _globals['_UNDETERMINED']._serialized_start=17262 + _globals['_UNDETERMINED']._serialized_end=17332 + _globals['_FUNCTION']._serialized_start=17334 + _globals['_FUNCTION']._serialized_end=17378 + _globals['_VALUESET']._serialized_start=17380 + _globals['_VALUESET']._serialized_end=17422 + _globals['_TENSORQUANTITY']._serialized_start=17424 + _globals['_TENSORQUANTITY']._serialized_end=17497 + _globals['_ARRAY']._serialized_start=17499 + _globals['_ARRAY']._serialized_end=17558 + _globals['_VECTOR']._serialized_start=17560 + _globals['_VECTOR']._serialized_end=17602 + _globals['_VECTORQUANTITY']._serialized_start=17604 + _globals['_VECTORQUANTITY']._serialized_end=17657 + _globals['_COMPLEX']._serialized_start=17659 + _globals['_COMPLEX']._serialized_end=17701 + _globals['_ENUMLITERAL']._serialized_start=17703 + _globals['_ENUMLITERAL']._serialized_end=17803 + _globals['_VALUESEQUENCE']._serialized_start=17805 + _globals['_VALUESEQUENCE']._serialized_end=17852 + _globals['_QUANTITY']._serialized_start=17855 + _globals['_QUANTITY']._serialized_end=18055 + _globals['_MEASUREMENTREF']._serialized_start=18057 + _globals['_MEASUREMENTREF']._serialized_end=18140 + _globals['_UNITTERM']._serialized_start=18142 + _globals['_UNITTERM']._serialized_end=18226 + _globals['_UNITFACTOR']._serialized_start=18228 + _globals['_UNITFACTOR']._serialized_end=18275 + _globals['_DIAGNOSTIC']._serialized_start=18278 + _globals['_DIAGNOSTIC']._serialized_end=18412 + _globals['_SPAN']._serialized_start=18414 + _globals['_SPAN']._serialized_end=18508 + _globals['_SERVERINFOREQUEST']._serialized_start=18510 + _globals['_SERVERINFOREQUEST']._serialized_end=18529 + _globals['_SERVERINFORESPONSE']._serialized_start=18531 + _globals['_SERVERINFORESPONSE']._serialized_end=18590 + _globals['_QUERYREQUEST']._serialized_start=18592 + _globals['_QUERYREQUEST']._serialized_end=18675 + _globals['_QUERYRESPONSE']._serialized_start=18677 + _globals['_QUERYRESPONSE']._serialized_end=18737 + _globals['_QUERY']._serialized_start=18739 + _globals['_QUERY']._serialized_end=18829 + _globals['_CONSTRAINT']._serialized_start=18831 + _globals['_CONSTRAINT']._serialized_end=18955 + _globals['_PRIMITIVECONSTRAINT']._serialized_start=18957 + _globals['_PRIMITIVECONSTRAINT']._serialized_end=19072 + _globals['_COMPOSITECONSTRAINT']._serialized_start=19074 + _globals['_COMPOSITECONSTRAINT']._serialized_end=19178 + _globals['_QUERYRESULTELEMENT']._serialized_start=19181 + _globals['_QUERYRESULTELEMENT']._serialized_end=19341 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=19292 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=19341 + _globals['_SWEEPRANGE']._serialized_start=19343 + _globals['_SWEEPRANGE']._serialized_end=19458 + _globals['_RUNSWEEPREQUEST']._serialized_start=19461 + _globals['_RUNSWEEPREQUEST']._serialized_end=19797 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_SWEEPROW']._serialized_start=19709 - _globals['_SWEEPROW']._serialized_end=19953 - _globals['_RUNSWEEPRESPONSE']._serialized_start=19956 - _globals['_RUNSWEEPRESPONSE']._serialized_end=20257 - _globals['_RUNRUNSREQUEST']._serialized_start=20260 - _globals['_RUNRUNSREQUEST']._serialized_end=20798 + _globals['_SWEEPROW']._serialized_start=19800 + _globals['_SWEEPROW']._serialized_end=20044 + _globals['_RUNSWEEPRESPONSE']._serialized_start=20047 + _globals['_RUNSWEEPRESPONSE']._serialized_end=20348 + _globals['_RUNRUNSREQUEST']._serialized_start=20351 + _globals['_RUNRUNSREQUEST']._serialized_end=20889 _globals['_RUNRUNSREQUEST_INPUTSENTRY']._serialized_start=5541 _globals['_RUNRUNSREQUEST_INPUTSENTRY']._serialized_end=5600 _globals['_RUNRUNSREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RUNRUNSREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_RUNDISTRIBUTION']._serialized_start=20801 - _globals['_RUNDISTRIBUTION']._serialized_end=21105 - _globals['_RUNPERCENTILE']._serialized_start=21107 - _globals['_RUNPERCENTILE']._serialized_end=21171 - _globals['_RUNHISTOGRAMBIN']._serialized_start=21173 - _globals['_RUNHISTOGRAMBIN']._serialized_end=21260 - _globals['_RUNCOUNTEDVALUE']._serialized_start=21262 - _globals['_RUNCOUNTEDVALUE']._serialized_end=21323 - _globals['_SELFCHECKREQUEST']._serialized_start=21325 - _globals['_SELFCHECKREQUEST']._serialized_end=21391 - _globals['_SELFCHECKFINDING']._serialized_start=21394 - _globals['_SELFCHECKFINDING']._serialized_end=21531 - _globals['_SELFCHECKAPPLICATION']._serialized_start=21533 - _globals['_SELFCHECKAPPLICATION']._serialized_end=21590 - _globals['_SELFCHECKRESPONSE']._serialized_start=21593 - _globals['_SELFCHECKRESPONSE']._serialized_end=21896 - _globals['_RECORDRUNREQUEST']._serialized_start=21899 - _globals['_RECORDRUNREQUEST']._serialized_end=22304 + _globals['_RUNDISTRIBUTION']._serialized_start=20892 + _globals['_RUNDISTRIBUTION']._serialized_end=21196 + _globals['_RUNPERCENTILE']._serialized_start=21198 + _globals['_RUNPERCENTILE']._serialized_end=21262 + _globals['_RUNHISTOGRAMBIN']._serialized_start=21264 + _globals['_RUNHISTOGRAMBIN']._serialized_end=21351 + _globals['_RUNCOUNTEDVALUE']._serialized_start=21353 + _globals['_RUNCOUNTEDVALUE']._serialized_end=21414 + _globals['_SELFCHECKREQUEST']._serialized_start=21416 + _globals['_SELFCHECKREQUEST']._serialized_end=21482 + _globals['_SELFCHECKFINDING']._serialized_start=21485 + _globals['_SELFCHECKFINDING']._serialized_end=21622 + _globals['_SELFCHECKAPPLICATION']._serialized_start=21624 + _globals['_SELFCHECKAPPLICATION']._serialized_end=21681 + _globals['_SELFCHECKRESPONSE']._serialized_start=21684 + _globals['_SELFCHECKRESPONSE']._serialized_end=21987 + _globals['_RECORDRUNREQUEST']._serialized_start=21990 + _globals['_RECORDRUNREQUEST']._serialized_end=22395 _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_RECORDRUNRESPONSE']._serialized_start=22307 - _globals['_RECORDRUNRESPONSE']._serialized_end=22731 - _globals['_RUNRUNSRESPONSE']._serialized_start=22734 - _globals['_RUNRUNSRESPONSE']._serialized_end=23185 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=23187 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=23297 - _globals['_DOCUMENTQUERYBINDING']._serialized_start=23299 - _globals['_DOCUMENTQUERYBINDING']._serialized_end=23378 - _globals['_DOCUMENTVALUE']._serialized_start=23381 - _globals['_DOCUMENTVALUE']._serialized_end=23824 - _globals['_DOCUMENTOBJECT']._serialized_start=23826 - _globals['_DOCUMENTOBJECT']._serialized_end=23916 - _globals['_DOCUMENTVERDICT']._serialized_start=23919 - _globals['_DOCUMENTVERDICT']._serialized_end=24093 - _globals['_DOCUMENTSTATE']._serialized_start=24096 - _globals['_DOCUMENTSTATE']._serialized_end=24273 - _globals['_DOCUMENTEVENT']._serialized_start=24276 - _globals['_DOCUMENTEVENT']._serialized_end=24560 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=24562 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=24597 - _globals['_DOCUMENTQUERYCELL']._serialized_start=24599 - _globals['_DOCUMENTQUERYCELL']._serialized_end=24656 - _globals['_DOCUMENTQUERYROW']._serialized_start=24658 - _globals['_DOCUMENTQUERYROW']._serialized_end=24756 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=24758 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=24868 - _globals['_QUERYOUTCOME']._serialized_start=24871 - _globals['_QUERYOUTCOME']._serialized_end=25035 - _globals['_QUERYFAILURE']._serialized_start=25037 - _globals['_QUERYFAILURE']._serialized_end=25123 - _globals['_QUERYFRONTIER']._serialized_start=25126 - _globals['_QUERYFRONTIER']._serialized_end=25277 - _globals['_QUERYFRONTIERMEMBER']._serialized_start=25279 - _globals['_QUERYFRONTIERMEMBER']._serialized_end=25333 - _globals['_QUERYFRONTIERFEATURE']._serialized_start=25335 - _globals['_QUERYFRONTIERFEATURE']._serialized_end=25385 - _globals['_QUERYFINDING']._serialized_start=25387 - _globals['_QUERYFINDING']._serialized_end=25470 - _globals['_RENDERDOCUMENTREQUEST']._serialized_start=25472 - _globals['_RENDERDOCUMENTREQUEST']._serialized_end=25550 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=25552 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=25645 - _globals['_RENDERVIEWREQUEST']._serialized_start=25647 - _globals['_RENDERVIEWREQUEST']._serialized_end=25766 - _globals['_RENDERVIEWRESPONSE']._serialized_start=25769 - _globals['_RENDERVIEWRESPONSE']._serialized_end=26053 - _globals['_RENDERNODE']._serialized_start=26056 - _globals['_RENDERNODE']._serialized_end=26391 - _globals['_RENDERPORT']._serialized_start=26393 - _globals['_RENDERPORT']._serialized_end=26483 - _globals['_RENDEREDGE']._serialized_start=26486 - _globals['_RENDEREDGE']._serialized_end=26702 - _globals['_RENDERGEOMETRY']._serialized_start=26704 - _globals['_RENDERGEOMETRY']._serialized_end=26828 - _globals['_RENDERCANVAS']._serialized_start=26830 - _globals['_RENDERCANVAS']._serialized_end=26907 - _globals['_RENDERSTYLE']._serialized_start=26909 - _globals['_RENDERSTYLE']._serialized_end=27027 - _globals['_RENDERPOINT']._serialized_start=27029 - _globals['_RENDERPOINT']._serialized_end=27064 - _globals['_RENDERROW']._serialized_start=27066 - _globals['_RENDERROW']._serialized_end=27121 - _globals['_RENDERNOTE']._serialized_start=27124 - _globals['_RENDERNOTE']._serialized_end=27302 - _globals['_EXPORTGRAPHSREQUEST']._serialized_start=27304 - _globals['_EXPORTGRAPHSREQUEST']._serialized_end=27362 - _globals['_EXPORTGRAPHSRESPONSE']._serialized_start=27364 - _globals['_EXPORTGRAPHSRESPONSE']._serialized_end=27437 - _globals['_IMPORTDATAREQUEST']._serialized_start=27440 - _globals['_IMPORTDATAREQUEST']._serialized_end=27584 - _globals['_DATAIMPORT']._serialized_start=27586 - _globals['_DATAIMPORT']._serialized_end=27672 - _globals['_IMPORTDATARESPONSE']._serialized_start=27675 - _globals['_IMPORTDATARESPONSE']._serialized_end=27865 - _globals['_IMPORTEDFILE']._serialized_start=27867 - _globals['_IMPORTEDFILE']._serialized_end=27972 - _globals['_IMPORTEDVALUE']._serialized_start=27974 - _globals['_IMPORTEDVALUE']._serialized_end=28093 - _globals['_COMPARERESULTSREQUEST']._serialized_start=28096 - _globals['_COMPARERESULTSREQUEST']._serialized_end=28326 - _globals['_OBSERVABLEPAIR']._serialized_start=28328 - _globals['_OBSERVABLEPAIR']._serialized_end=28377 - _globals['_COMPARERESULTSRESPONSE']._serialized_start=28380 - _globals['_COMPARERESULTSRESPONSE']._serialized_end=28641 - _globals['_CONFIGURATIONCOMPARISON']._serialized_start=28644 - _globals['_CONFIGURATIONCOMPARISON']._serialized_end=29096 - _globals['_OBSERVABLECOMPARISON']._serialized_start=29099 - _globals['_OBSERVABLECOMPARISON']._serialized_end=29427 - _globals['_COMPAREDDISTRIBUTION']._serialized_start=29429 - _globals['_COMPAREDDISTRIBUTION']._serialized_end=29551 - _globals['_STATISTICDIFFERENCE']._serialized_start=29553 - _globals['_STATISTICDIFFERENCE']._serialized_end=29640 - _globals['_CASESTATISTICS']._serialized_start=29642 - _globals['_CASESTATISTICS']._serialized_end=29727 - _globals['_CASESTATISTIC']._serialized_start=29729 - _globals['_CASESTATISTIC']._serialized_end=29822 - _globals['_SYSMLSERVICE']._serialized_start=31057 - _globals['_SYSMLSERVICE']._serialized_end=33262 + _globals['_RECORDRUNRESPONSE']._serialized_start=22398 + _globals['_RECORDRUNRESPONSE']._serialized_end=22822 + _globals['_RUNRUNSRESPONSE']._serialized_start=22825 + _globals['_RUNRUNSRESPONSE']._serialized_end=23276 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=23278 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=23388 + _globals['_DOCUMENTQUERYBINDING']._serialized_start=23390 + _globals['_DOCUMENTQUERYBINDING']._serialized_end=23469 + _globals['_DOCUMENTVALUE']._serialized_start=23472 + _globals['_DOCUMENTVALUE']._serialized_end=23915 + _globals['_DOCUMENTOBJECT']._serialized_start=23917 + _globals['_DOCUMENTOBJECT']._serialized_end=24007 + _globals['_DOCUMENTVERDICT']._serialized_start=24010 + _globals['_DOCUMENTVERDICT']._serialized_end=24184 + _globals['_DOCUMENTSTATE']._serialized_start=24187 + _globals['_DOCUMENTSTATE']._serialized_end=24364 + _globals['_DOCUMENTEVENT']._serialized_start=24367 + _globals['_DOCUMENTEVENT']._serialized_end=24726 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=24728 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=24763 + _globals['_DOCUMENTQUERYCELL']._serialized_start=24765 + _globals['_DOCUMENTQUERYCELL']._serialized_end=24822 + _globals['_DOCUMENTQUERYROW']._serialized_start=24824 + _globals['_DOCUMENTQUERYROW']._serialized_end=24922 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=24924 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=25034 + _globals['_QUERYOUTCOME']._serialized_start=25037 + _globals['_QUERYOUTCOME']._serialized_end=25201 + _globals['_QUERYFAILURE']._serialized_start=25203 + _globals['_QUERYFAILURE']._serialized_end=25289 + _globals['_QUERYFRONTIER']._serialized_start=25292 + _globals['_QUERYFRONTIER']._serialized_end=25443 + _globals['_QUERYFRONTIERMEMBER']._serialized_start=25445 + _globals['_QUERYFRONTIERMEMBER']._serialized_end=25499 + _globals['_QUERYFRONTIERFEATURE']._serialized_start=25501 + _globals['_QUERYFRONTIERFEATURE']._serialized_end=25551 + _globals['_QUERYFINDING']._serialized_start=25553 + _globals['_QUERYFINDING']._serialized_end=25636 + _globals['_RENDERDOCUMENTREQUEST']._serialized_start=25638 + _globals['_RENDERDOCUMENTREQUEST']._serialized_end=25716 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=25718 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=25811 + _globals['_RENDERVIEWREQUEST']._serialized_start=25813 + _globals['_RENDERVIEWREQUEST']._serialized_end=25932 + _globals['_RENDERVIEWRESPONSE']._serialized_start=25935 + _globals['_RENDERVIEWRESPONSE']._serialized_end=26219 + _globals['_RENDERNODE']._serialized_start=26222 + _globals['_RENDERNODE']._serialized_end=26557 + _globals['_RENDERPORT']._serialized_start=26559 + _globals['_RENDERPORT']._serialized_end=26649 + _globals['_RENDEREDGE']._serialized_start=26652 + _globals['_RENDEREDGE']._serialized_end=26868 + _globals['_RENDERGEOMETRY']._serialized_start=26870 + _globals['_RENDERGEOMETRY']._serialized_end=26994 + _globals['_RENDERCANVAS']._serialized_start=26996 + _globals['_RENDERCANVAS']._serialized_end=27073 + _globals['_RENDERSTYLE']._serialized_start=27075 + _globals['_RENDERSTYLE']._serialized_end=27193 + _globals['_RENDERPOINT']._serialized_start=27195 + _globals['_RENDERPOINT']._serialized_end=27230 + _globals['_RENDERROW']._serialized_start=27232 + _globals['_RENDERROW']._serialized_end=27287 + _globals['_RENDERNOTE']._serialized_start=27290 + _globals['_RENDERNOTE']._serialized_end=27468 + _globals['_EXPORTGRAPHSREQUEST']._serialized_start=27470 + _globals['_EXPORTGRAPHSREQUEST']._serialized_end=27528 + _globals['_EXPORTGRAPHSRESPONSE']._serialized_start=27530 + _globals['_EXPORTGRAPHSRESPONSE']._serialized_end=27603 + _globals['_IMPORTDATAREQUEST']._serialized_start=27606 + _globals['_IMPORTDATAREQUEST']._serialized_end=27750 + _globals['_DATAIMPORT']._serialized_start=27752 + _globals['_DATAIMPORT']._serialized_end=27838 + _globals['_IMPORTDATARESPONSE']._serialized_start=27841 + _globals['_IMPORTDATARESPONSE']._serialized_end=28031 + _globals['_IMPORTEDFILE']._serialized_start=28033 + _globals['_IMPORTEDFILE']._serialized_end=28138 + _globals['_IMPORTEDVALUE']._serialized_start=28140 + _globals['_IMPORTEDVALUE']._serialized_end=28259 + _globals['_COMPARERESULTSREQUEST']._serialized_start=28262 + _globals['_COMPARERESULTSREQUEST']._serialized_end=28492 + _globals['_OBSERVABLEPAIR']._serialized_start=28494 + _globals['_OBSERVABLEPAIR']._serialized_end=28543 + _globals['_COMPARERESULTSRESPONSE']._serialized_start=28546 + _globals['_COMPARERESULTSRESPONSE']._serialized_end=28807 + _globals['_CONFIGURATIONCOMPARISON']._serialized_start=28810 + _globals['_CONFIGURATIONCOMPARISON']._serialized_end=29262 + _globals['_OBSERVABLECOMPARISON']._serialized_start=29265 + _globals['_OBSERVABLECOMPARISON']._serialized_end=29593 + _globals['_COMPAREDDISTRIBUTION']._serialized_start=29595 + _globals['_COMPAREDDISTRIBUTION']._serialized_end=29717 + _globals['_STATISTICDIFFERENCE']._serialized_start=29719 + _globals['_STATISTICDIFFERENCE']._serialized_end=29806 + _globals['_CASESTATISTICS']._serialized_start=29808 + _globals['_CASESTATISTICS']._serialized_end=29893 + _globals['_CASESTATISTIC']._serialized_start=29895 + _globals['_CASESTATISTIC']._serialized_end=29988 + _globals['_SYSMLSERVICE']._serialized_start=31223 + _globals['_SYSMLSERVICE']._serialized_end=33428 # @@protoc_insertion_point(module_scope) diff --git a/client/python/opensysml/proto/sysml_pb2.pyi b/client/python/opensysml/proto/sysml_pb2.pyi index d597c973ff..92a189042e 100644 --- a/client/python/opensysml/proto/sysml_pb2.pyi +++ b/client/python/opensysml/proto/sysml_pb2.pyi @@ -937,7 +937,7 @@ class InstantiateResponse(_message.Message): def __init__(self, instance: _Optional[_Union[Instance, _Mapping]] = ..., error: _Optional[str] = ..., diagnostics: _Optional[_Iterable[_Union[Diagnostic, _Mapping]]] = ..., instances: _Optional[_Iterable[_Union[Instance, _Mapping]]] = ...) -> None: ... class ExecuteActionRequest(_message.Message): - __slots__ = ("model_hash", "action_symbol_id", "inputs", "schedule", "performer_symbol_id", "advance", "seed", "draws", "clock_step") + __slots__ = ("model_hash", "action_symbol_id", "inputs", "schedule", "performer_symbol_id", "advance", "seed", "draws", "clock_step", "trace", "events") class InputsEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] @@ -954,6 +954,8 @@ class ExecuteActionRequest(_message.Message): SEED_FIELD_NUMBER: _ClassVar[int] DRAWS_FIELD_NUMBER: _ClassVar[int] CLOCK_STEP_FIELD_NUMBER: _ClassVar[int] + TRACE_FIELD_NUMBER: _ClassVar[int] + EVENTS_FIELD_NUMBER: _ClassVar[int] model_hash: str action_symbol_id: str inputs: _containers.MessageMap[str, Value] @@ -963,10 +965,12 @@ class ExecuteActionRequest(_message.Message): seed: int draws: str clock_step: float - def __init__(self, model_hash: _Optional[str] = ..., action_symbol_id: _Optional[str] = ..., inputs: _Optional[_Mapping[str, Value]] = ..., schedule: _Optional[str] = ..., performer_symbol_id: _Optional[str] = ..., advance: _Optional[float] = ..., seed: _Optional[int] = ..., draws: _Optional[str] = ..., clock_step: _Optional[float] = ...) -> None: ... + trace: bool + events: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, model_hash: _Optional[str] = ..., action_symbol_id: _Optional[str] = ..., inputs: _Optional[_Mapping[str, Value]] = ..., schedule: _Optional[str] = ..., performer_symbol_id: _Optional[str] = ..., advance: _Optional[float] = ..., seed: _Optional[int] = ..., draws: _Optional[str] = ..., clock_step: _Optional[float] = ..., trace: _Optional[bool] = ..., events: _Optional[_Iterable[str]] = ...) -> None: ... class ExecuteActionResponse(_message.Message): - __slots__ = ("outputs", "error", "diagnostics", "outcomes", "exploration", "final_time", "performer_attributes", "order_dependent") + __slots__ = ("outputs", "error", "diagnostics", "outcomes", "exploration", "final_time", "performer_attributes", "order_dependent", "trace", "trace_dropped") class OutputsEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] @@ -996,6 +1000,8 @@ class ExecuteActionResponse(_message.Message): FINAL_TIME_FIELD_NUMBER: _ClassVar[int] PERFORMER_ATTRIBUTES_FIELD_NUMBER: _ClassVar[int] ORDER_DEPENDENT_FIELD_NUMBER: _ClassVar[int] + TRACE_FIELD_NUMBER: _ClassVar[int] + TRACE_DROPPED_FIELD_NUMBER: _ClassVar[int] outputs: _containers.MessageMap[str, Value] error: str diagnostics: _containers.RepeatedCompositeFieldContainer[Diagnostic] @@ -1004,7 +1010,9 @@ class ExecuteActionResponse(_message.Message): final_time: float performer_attributes: _containers.MessageMap[str, Value] order_dependent: _containers.ScalarMap[str, int] - def __init__(self, outputs: _Optional[_Mapping[str, Value]] = ..., error: _Optional[str] = ..., diagnostics: _Optional[_Iterable[_Union[Diagnostic, _Mapping]]] = ..., outcomes: _Optional[_Iterable[_Union[Outcome, _Mapping]]] = ..., exploration: _Optional[_Union[ExplorationStatus, _Mapping]] = ..., final_time: _Optional[float] = ..., performer_attributes: _Optional[_Mapping[str, Value]] = ..., order_dependent: _Optional[_Mapping[str, int]] = ...) -> None: ... + trace: _containers.RepeatedCompositeFieldContainer[DocumentEvent] + trace_dropped: int + def __init__(self, outputs: _Optional[_Mapping[str, Value]] = ..., error: _Optional[str] = ..., diagnostics: _Optional[_Iterable[_Union[Diagnostic, _Mapping]]] = ..., outcomes: _Optional[_Iterable[_Union[Outcome, _Mapping]]] = ..., exploration: _Optional[_Union[ExplorationStatus, _Mapping]] = ..., final_time: _Optional[float] = ..., performer_attributes: _Optional[_Mapping[str, Value]] = ..., order_dependent: _Optional[_Mapping[str, int]] = ..., trace: _Optional[_Iterable[_Union[DocumentEvent, _Mapping]]] = ..., trace_dropped: _Optional[int] = ...) -> None: ... class ExecuteStateRequest(_message.Message): __slots__ = ("model_hash", "state_machine_symbol_id", "events", "schedule", "performer_symbol_id", "trace", "advance", "seed", "draws", "clock_step") @@ -2403,7 +2411,7 @@ class DocumentState(_message.Message): def __init__(self, object: _Optional[_Union[DocumentObject, _Mapping]] = ..., machine: _Optional[str] = ..., name: _Optional[str] = ..., state_path: _Optional[str] = ..., state: _Optional[_Union[DocumentValue, _Mapping]] = ..., region: _Optional[str] = ..., enclosing: _Optional[_Iterable[str]] = ...) -> None: ... class DocumentEvent(_message.Message): - __slots__ = ("kind", "time", "object", "machine", "state", "to", "target", "event", "payload", "alternatives", "taken", "text") + __slots__ = ("kind", "time", "object", "machine", "state", "to", "target", "event", "payload", "alternatives", "taken", "text", "token", "step", "feature", "value") KIND_FIELD_NUMBER: _ClassVar[int] TIME_FIELD_NUMBER: _ClassVar[int] OBJECT_FIELD_NUMBER: _ClassVar[int] @@ -2417,6 +2425,10 @@ class DocumentEvent(_message.Message): ALTERNATIVES_FIELD_NUMBER: _ClassVar[int] TAKEN_FIELD_NUMBER: _ClassVar[int] TEXT_FIELD_NUMBER: _ClassVar[int] + TOKEN_FIELD_NUMBER: _ClassVar[int] + STEP_FIELD_NUMBER: _ClassVar[int] + FEATURE_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] kind: str time: DocumentValue object: DocumentObject @@ -2429,7 +2441,11 @@ class DocumentEvent(_message.Message): alternatives: _containers.RepeatedScalarFieldContainer[str] taken: str text: str - def __init__(self, kind: _Optional[str] = ..., time: _Optional[_Union[DocumentValue, _Mapping]] = ..., object: _Optional[_Union[DocumentObject, _Mapping]] = ..., machine: _Optional[str] = ..., state: _Optional[str] = ..., to: _Optional[str] = ..., target: _Optional[_Union[DocumentObject, _Mapping]] = ..., event: _Optional[str] = ..., payload: _Optional[_Iterable[str]] = ..., alternatives: _Optional[_Iterable[str]] = ..., taken: _Optional[str] = ..., text: _Optional[str] = ..., **kwargs) -> None: ... + token: int + step: int + feature: str + value: Value + def __init__(self, kind: _Optional[str] = ..., time: _Optional[_Union[DocumentValue, _Mapping]] = ..., object: _Optional[_Union[DocumentObject, _Mapping]] = ..., machine: _Optional[str] = ..., state: _Optional[str] = ..., to: _Optional[str] = ..., target: _Optional[_Union[DocumentObject, _Mapping]] = ..., event: _Optional[str] = ..., payload: _Optional[_Iterable[str]] = ..., alternatives: _Optional[_Iterable[str]] = ..., taken: _Optional[str] = ..., text: _Optional[str] = ..., token: _Optional[int] = ..., step: _Optional[int] = ..., feature: _Optional[str] = ..., value: _Optional[_Union[Value, _Mapping]] = ..., **kwargs) -> None: ... class DocumentQueryColumn(_message.Message): __slots__ = ("name",) diff --git a/client/python/tests/test_model.py b/client/python/tests/test_model.py index 606d285271..0be1d19cec 100644 --- a/client/python/tests/test_model.py +++ b/client/python/tests/test_model.py @@ -648,7 +648,7 @@ def test_execute_action_passes_the_models_hash_and_inputs(self): assert model.execute_action("Demo::add", inputs={"result": 10}) == {"result": 15} client.execute_action.assert_called_once_with( "Demo::add", "hash1", inputs={"result": 10}, schedule=None, performer=None, - advance=None, seed=None, draws=None, clock_step=0.0 + advance=None, seed=None, draws=None, clock_step=0.0, trace=False, events=None ) def test_execute_state_passes_the_models_hash_and_events(self): diff --git a/client/python/tests/test_performer.py b/client/python/tests/test_performer.py index 7c6a7eae38..10f040e4ce 100644 --- a/client/python/tests/test_performer.py +++ b/client/python/tests/test_performer.py @@ -18,6 +18,7 @@ CAPABILITY_SCHEDULE, CAPABILITY_SCHEDULE_EXPLORE, CAPABILITY_STATE_TRACE, + CAPABILITY_ACTION_TRACE, CAPABILITY_VERIFICATION, MissingCapabilityError, ) @@ -47,6 +48,7 @@ def make_connection(stub, capabilities): ) CURRENT = EXPLORING + (CAPABILITY_PERFORMER,) CURRENT_TRACE = CURRENT + (CAPABILITY_STATE_TRACE,) +CURRENT_ACTION_TRACE = CURRENT + (CAPABILITY_ACTION_TRACE,) def test_a_performer_is_carried_on_every_run_request(): @@ -298,3 +300,62 @@ def test_an_explored_outcome_reports_the_performer_as_the_run_does(self): (outcome,) = road.explore_state("Road::Car::gear", performer="Road::fastCar") assert outcome.final_state == "fast" assert outcome.outputs == run["final_context"] + + +def test_action_trace_and_events_are_requested_and_decoded(): + stub = Mock() + stub.ExecuteAction.return_value = sysml_pb2.ExecuteActionResponse( + trace=[ + sysml_pb2.DocumentEvent(kind="step", time=sysml_pb2.DocumentValue(real_value=0), to="burn", token=1, step=1, text="step start -> burn"), + sysml_pb2.DocumentEvent(kind="assign", time=sysml_pb2.DocumentValue(real_value=0), state="burn", token=1, step=2, + feature="remaining", value=sysml_pb2.Value(int_value=7), text="assign remaining = 7"), + ], + trace_dropped=1, + ) + conn = make_connection(stub, CURRENT_ACTION_TRACE) + + result = conn.execute_action("Wire::Flow", "hash", performer="Wire::craft", trace=True, events=["Go"]) + + request = stub.ExecuteAction.call_args.args[0] + assert request.trace + assert list(request.events) == ["Go"] + assert [event.kind for event in result.trace] == ["step", "assign"] + assert (result.trace[0].token, result.trace[0].step, result.trace[0].to_state) == (1, 1, "burn") + assert (result.trace[1].feature, result.trace[1].value) == ("remaining", 7) + assert result.trace[0].value is None + assert result.trace_dropped == 1 + + +def test_failed_action_trace_is_attached_to_execution_error(): + stub = Mock() + stub.ExecuteAction.return_value = sysml_pb2.ExecuteActionResponse( + error="accept deadlock", + trace=[sysml_pb2.DocumentEvent(kind="wait", time=sysml_pb2.DocumentValue(real_value=0), state="waiting", event="Go", text="wait Go")], + ) + conn = make_connection(stub, CURRENT_ACTION_TRACE) + + with pytest.raises(ExecutionError, match="accept deadlock") as excinfo: + conn.execute_action("Wire::Flow", "hash", performer="Wire::craft", trace=True) + + assert [record.kind for record in excinfo.value.trace] == ["wait"] + assert excinfo.value.trace[0].event == "Go" + + +def test_action_trace_is_not_sent_without_its_capability(): + stub = Mock() + conn = make_connection(stub, CURRENT) + + with pytest.raises(MissingCapabilityError) as excinfo: + conn.execute_action("Wire::Flow", "hash", trace=True) + + assert excinfo.value.capability == CAPABILITY_ACTION_TRACE + stub.ExecuteAction.assert_not_called() + + +def test_action_events_need_a_performer(): + stub = Mock() + conn = make_connection(stub, CURRENT) + + with pytest.raises(ValueError, match="performer"): + conn.execute_action("Wire::Flow", "hash", events=["Go"]) + stub.ExecuteAction.assert_not_called() diff --git a/client/rust/conformance/sysml.descriptor.binpb b/client/rust/conformance/sysml.descriptor.binpb index 8cb9b2276b..05cee7004e 100644 --- a/client/rust/conformance/sysml.descriptor.binpb +++ b/client/rust/conformance/sysml.descriptor.binpb @@ -1,5 +1,5 @@ -½© +ºÂ sysml.protosysml"à Verdict kind ( Rkind @@ -418,7 +418,7 @@ model_hash ( R modelHash instance ( 2.sysml.InstanceRinstance error ( Rerror3 diagnostics ( 2.sysml.DiagnosticR diagnostics- - instances ( 2.sysml.InstanceR instances"· + instances ( 2.sysml.InstanceR instances"å ExecuteActionRequest model_hash ( R modelHash( @@ -430,13 +430,16 @@ model_hash ( R modelHash( seed (HRseedˆ draws ( Rdraws -clock_step (R clockStepG +clock_step (R clockStep +trace + (Rtrace +events ( ReventsG InputsEntry key ( Rkey" value ( 2 .sysml.ValueRvalue:8B _advanceB -_seed"Ö +_seed"§ ExecuteActionResponseC outputs ( 2).sysml.ExecuteActionResponse.OutputsEntryRoutputs error ( Rerror3 @@ -446,7 +449,10 @@ clock_step (R clockStepG final_time (R finalTimeh performer_attributes ( 25.sysml.ExecuteActionResponse.PerformerAttributesEntryRperformerAttributesY -order_dependent ( 20.sysml.ExecuteActionResponse.OrderDependentEntryRorderDependentH +order_dependent ( 20.sysml.ExecuteActionResponse.OrderDependentEntryRorderDependent* +trace ( 2.sysml.DocumentEventRtrace# + trace_dropped + (R traceDroppedH OutputsEntry key ( Rkey" value ( 2 .sysml.ValueRvalue:8T @@ -1180,7 +1186,7 @@ instanceId state_path ( R statePath* state ( 2.sysml.DocumentValueRstate region ( Rregion - enclosing ( R enclosing"ý + enclosing ( R enclosing"å DocumentEvent kind ( Rkind( time ( 2.sysml.DocumentValueRtime- @@ -1195,7 +1201,11 @@ state_path ( R statePath* ( Rpayload" alternatives ( R alternatives taken ( Rtaken -text ( Rtext") +text ( Rtext +token (Rtoken +step (Rstep +feature ( Rfeature" +value ( 2 .sysml.ValueRvalue") DocumentQueryColumn name ( Rname"A DocumentQueryCell, @@ -1556,8 +1566,8 @@ RenderView.sysml.RenderViewRequest.sysml.RenderViewResponseG ExportGraphs.sysml.ExportGraphsRequest.sysml.ExportGraphsResponseA ImportData.sysml.ImportDataRequest.sysml.ImportDataResponseM -CompareResults.sysml.CompareResultsRequest.sysml.CompareResultsResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protoJ¸Ô -¶ +CompareResults.sysml.CompareResultsRequest.sysml.CompareResultsResponseB*Z(github.com/Open-MBEE/OpenSysML/api/protoJÎë +á     @@ -5316,7 +5326,7 @@ I 3¶ ! > -4ºà0 ExecuteActionRequest requests action execution +4ºñ0 ExecuteActionRequest requests action execution 4º @@ -5428,358 +5438,422 @@ I 4ß  4ß +ä +4 ãÕ Ask for the run's trace in ExecuteActionResponse.trace. Advertised as the + "action_trace" capability; a service withholding it refuses true with + UNIMPLEMENTED, as does an explore schedule with INVALID_ARGUMENT. + + +4 ã + +4 ã + +4 ã +â +4 +ðÓ Signals or items to post to the performing object, in this order, as the + REPL's `%send` does: the run goes until it completes or every token waits, + the next event is then posted to the object's queue and the run goes on, + an accept node waiting for it taking it on the next step. An event of a + type no accept node of the performance names is refused, with the accepts + still waiting. The events exhausted, the run goes on to completion (or for + `advance`); a token still waiting at the end is an accept deadlock, + reported in `error` with the message it waits for. Each names a signal or + item definition, qualified or as the action's namespace sees it; a name no + definition answers to is matched by name alone, as ExecuteState's events + are. Posted to the object performer_symbol_id names, as `%send` posts to + one: INVALID_ARGUMENT without it. + + +4 +ð + + +4 +ð  + +4 +ð + +4 +ð G -5ãú9 ExecuteActionResponse contains action execution results +5ô’ 9 ExecuteActionResponse contains action execution results -5ã +5ô / -5ä!"! output parameter name → value +5õ!"! output parameter name → value -5ä +5õ -5ä +5õ -5ä +5õ -5å +5ö -5å +5ö -5å  +5ö  -5å +5ö -5æ& +5÷& -5æ +5÷ -5æ  +5÷  -5æ! +5÷! -5æ$% +5÷$% ž -5ë � Set only under an explore schedule: every distinct outcome reached, in +5ü � Set only under an explore schedule: every distinct outcome reached, in canonical order, and how the exploration ended. `outputs`, `error` and `diagnostics` are then empty: a failed run is an outcome of its own, and each outcome carries its witness run's diagnostics. -5ë +5ü -5ë  +5ü  -5ë +5ü -5ë +5ü -5ì$ +5ý$ -5ì +5ý -5ì +5ý -5ì"# +5ý"# è -5ðÙ The run's simulation clock when it ended, in seconds (SI::s) from the 0 +5� Ù The run's simulation clock when it ended, in seconds (SI::s) from the 0 it started at: the clock advances through every `accept after`/`accept at` the action waited on. Populated under the "final_time" capability. -5ð +5�  -5ð  +5�  -5ð +5�  ¦ -5õ.— The attributes the object named by performer_symbol_id holds when the run +5† .— The attributes the object named by performer_symbol_id holds when the run ends, keyed as an explored outcome's `outputs` key them (`this.level`); `outputs` stays the output parameters alone. Empty without a performer and under an explore schedule, whose outcomes carry them. -5õ +5†  -5õ) +5† ) -5õ,- +5† ,- â -5ù)Ó Output name → how many of the run's unresolved choice points touch it; an +5Š )Ó Output name → how many of the run's unresolved choice points touch it; an output nothing order-dependent wrote is absent. Populated under the "order_dependence" capability; empty under an explore schedule. -5ù +5Š  -5ù$ +5Š $ -5ù'( +5Š '( +³ +5� #¤ The run's trace in the order the run made it, when the request asked for + it: the token steps, waits, accepts, sends, decisions, assignments and + completion of the action, each a DocumentEvent (see its `kind`), also on a + run that failed, up to the failure. Empty under an explore schedule. + + +5�  + + +5�  + +5�  + +5� !" +Y +5 ‘ K How many of the oldest records the service's held-events bound discarded. + + +5 ‘  + +5 ‘  + +5 ‘  D -6ý˜ 6 ExecuteStateRequest requests state machine execution +6• ° 6 ExecuteStateRequest requests state machine execution -6ý +6•  -6þ +6–  -6þ +6–  -6þ  +6–  -6þ +6–  -6ÿ% +6— % -6ÿ +6—  -6ÿ +6— -6ÿ#$ +6— #$ 2 -6€ "$ sequence of event names to process +6˜ "$ sequence of event names to process -6€  +6˜  -6€  +6˜  -6€  +6˜  -6€  +6˜  þ -6† ï Scheduling policy the run resolves its choice points under: "declared", +6ž ï Scheduling policy the run resolves its choice points under: "declared", "reverse", "seed:" or "explore[:runs=,depth=]". Empty is the default, "reverse"; any other spelling is INVALID_ARGUMENT. Under explore the response answers with `outcomes` and `exploration` in place of one run's states_visited, final_context and error (see ExecuteActionResponse). -6†  +6ž  -6†  +6ž  -6†  +6ž  í -6Œ !Þ Optional FQN of a part/usage to run the machine on, or a path from one to a +6¤ !Þ Optional FQN of a part/usage to run the machine on, or a path from one to a nested object (see ExecuteActionRequest.performer_symbol_id). An object exhibiting the machine runs the one it exhibits, so what its assembly connects to it reaches the run; one exhibiting it under several usages is an error. Empty runs the machine outside any object. -6Œ  +6¤  -6Œ  +6¤  -6Œ  +6¤  ® -6� Ÿ Ask for the run's trace in ExecuteStateResponse.trace. Advertised as the +6§ Ÿ Ask for the run's trace in ExecuteStateResponse.trace. Advertised as the "state_trace" capability; a service withholding it refuses true with UNIMPLEMENTED. -6�  +6§  -6�  +6§  -6�  +6§  Ý -6“ Î Simulated time, in seconds, to run the machine for after the events are +6« Î Simulated time, in seconds, to run the machine for after the events are sent (`sysml -advance`); see ExecuteActionRequest.advance. Unset runs the machine to quiescence and advances the clock no further. -6“  +6«  -6“  +6«  -6“  +6«  -6“  +6«  F -6• 8 See ExecuteActionRequest.seed, .draws and .clock_step. +6­ 8 See ExecuteActionRequest.seed, .draws and .clock_step. -6•  +6­  -6•  +6­  -6•  +6­  -6•  +6­  -6–  +6®  -6–  +6®  -6–  +6®  -6–  +6®  -6 —  +6 ¯  -6 —  +6 ¯  -6 —  +6 ¯  -6 —  +6 ¯  K -7› ³ = ExecuteStateResponse contains state machine execution trace +7³ Ë = ExecuteStateResponse contains state machine execution trace -7›  +7³  $ -7œ %" trace of state names +7´ %" trace of state names -7œ  +7´  -7œ  +7´  -7œ  +7´  -7œ #$ +7´ #$ -7� ' +7µ ' -7�  +7µ  -7� " +7µ " -7� %& +7µ %& -7ž  +7¶  -7ž  +7¶  -7ž  +7¶  -7ž  +7¶  -7Ÿ & +7· & -7Ÿ  +7·  -7Ÿ  +7·  -7Ÿ ! +7· ! -7Ÿ $% +7· $% ƒ -7¤  ô Set only under an explore schedule: every distinct outcome reached, in +7¼  ô Set only under an explore schedule: every distinct outcome reached, in canonical order, and how the exploration ended. An outcome's outputs are the final context; `states_visited`, `final_context`, `error` and `diagnostics` are then empty. -7¤  +7¼  -7¤  +7¼  -7¤  +7¼  -7¤  +7¼  -7¥ $ +7½ $ -7¥  +7½  -7¥  +7½  -7¥ "# +7½ "# ã -7© Ô The run's simulation clock when it ended, in seconds (SI::s) from the 0 +7Á Ô The run's simulation clock when it ended, in seconds (SI::s) from the 0 it started at: the clock advances through every time-triggered transition the machine took. Populated under the "final_time" capability. -7©  +7Á  -7©  +7Á  -7©  +7Á  ­ -7¬ #ž The run's trace in the order the run made it, when the request asked for it: +7Ä #ž The run's trace in the order the run made it, when the request asked for it: also on a run that failed, up to the failure. Empty under an explore schedule. -7¬  +7Ä  -7¬  +7Ä  -7¬  +7Ä  -7¬ !" +7Ä !" Y -7® K How many of the oldest records the service's held-events bound discarded. +7Æ K How many of the oldest records the service's held-events bound discarded. -7®  +7Æ  -7®  +7Æ  -7®  +7Æ  æ -7 ² *× Final-context key → how many of the run's unresolved choice points touch +7 Ê *× Final-context key → how many of the run's unresolved choice points touch it; a value nothing order-dependent wrote is absent. Populated under the "order_dependence" capability; empty under an explore schedule. -7 ²  +7 Ê  -7 ² $ +7 Ê $ -7 ² ') +7 Ê ') ñ -8¸ ù â ConvertRequest asks for a model in another representation. A model_hash +8Ð ‘ +â ConvertRequest asks for a model in another representation. A model_hash converts the source that parse read, so a file edited since then does not change the answer; a file_path is read afresh and content is carried inline. -8¸  +8Ð   -8¹ ½  +8Ñ Õ  -8¹  +8Ñ  -8º  +8Ò  -8º  +8Ò  -8º  +8Ò  -8º  +8Ò  -8»  +8Ó  -8»  +8Ó  -8»  +8Ó  -8»  +8Ó  -8¼  +8Ô  -8¼  +8Ô  -8¼  +8Ô  -8¼  +8Ô  · -8Ä ¨ "sysml", "kerml", "text", "ttl", "turtle", "rdf", "api-json" or "json". +8Ü ¨ "sysml", "kerml", "text", "ttl", "turtle", "rdf", "api-json" or "json". Empty infers from file_path's extension, and is notation for a model_hash, since that is what parse reads; inline content has neither, so it must say. A SysML v1 model ("xmi", "uml" or "mdzip", named or inferred from the @@ -5787,35 +5861,35 @@ Y migrated, element by element and reported, not converted. -8Ä  +8Ü  -8Ä  +8Ü  -8Ä  +8Ü  ˆ -8Ç z Format to write, named as in from_format; the v1 names are refused, since +8ß z Format to write, named as in from_format; the v1 names are refused, since a v2 model has no v1 form. Empty is rejected. -8Ç  +8ß  -8Ç  +8ß  -8Ç  +8ß  € -8Ì "ñ Write notation back out even when the parser could not read all of it, +8ä "ñ Write notation back out even when the parser could not read all of it, reporting its syntax errors as diagnostics. Notation to notation only: every other direction builds a graph, where unreadable declarations would go missing silently. -8Ì  +8ä  -8Ì  +8ä  -8Ì ! +8ä ! ¡ -8Ó ’ How derived element ids are spelled when notation is written as a graph +8ë ’ How derived element ids are spelled when notation is written as a graph ("ttl" or "api-json"), as `sysml -id` does: "qualified" (the default, each derived from its qualified name) or "uuid" (name-based uuids under each root package, the library convention). Declared and normative ids are unchanged. @@ -5823,13 +5897,13 @@ Y is INVALID_ARGUMENT. -8Ó  +8ë  -8Ó  +8ë  -8Ó  +8ë  º -8Ú  « For a model_hash, the documents whose elements are written, named as the +8ò  « For a model_hash, the documents whose elements are written, named as the parse named them; the model's other documents are read for the references into them, which keep the ids those elements are written under when their own documents are converted. Empty writes every document. A name the model @@ -5837,16 +5911,16 @@ Y INVALID_ARGUMENT. Reported as the "convert_documents" capability. -8Ú  +8ò  -8Ú  +8ò  -8Ú  +8ò  -8Ú  +8ò  Ÿ -8á � For api-json from notation: write the compact document +8ù � For api-json from notation: write the compact document (api-json-compact/1) in place of the standard element array. It is one object holding a table of element ids, written once, and the elements with every reference spelled as an index into it, without indentation; see @@ -5854,43 +5928,49 @@ Y target. Reported as the "convert_compact" capability. -8á  +8ù  -8á  +8ù  -8á  +8ù  ¾ -8 å ¯ With compact: leave out every derived property of the metamodel (the +8 ý ¯ With compact: leave out every derived property of the metamodel (the ones the owned properties already state), except those named in keep_derived. Refused without compact. -8 å  +8 ý  -8 å  +8 ý  -8 å  +8 ý  î 8 -é $ß With omit_derived: the derived properties still written, named as in the +� +$ß With omit_derived: the derived properties still written, named as in the element form ("owner", "qualifiedName"). A name that is not a derived property of the metamodel is INVALID_ARGUMENT. Refused without omit_derived. 8 -é  +� + 8 -é  +� +  8 -é  +� + 8 -é !# +� +!# ‡ -8 õ &ø Report the semantic check's diagnostics alongside the output, each with its +8 � +&ø Report the semantic check's diagnostics alongside the output, each with its own severity ("error", "warning" or "info") and code, as ParseFile and GetDiagnostics report them: the source is analyzed as a parse analyzes it, so an unresolved type is an error here while the conversion itself stands @@ -5903,95 +5983,108 @@ Y capability. -8 õ  +8 � + -8 õ  +8 � + -8 õ #% +8 � +#% � -8 ø "Ž For api-json, restore the ownerless library stubs written before 0.11.0. +8 � +"Ž For api-json, restore the ownerless library stubs written before 0.11.0. Default false: library elements remain bare references, not roots. -8 ø  +8 � + -8 ø  +8 � + -8 ø ! +8 � +! = -9ü “ +9” +« / ConvertResponse contains the converted model. -9ü  +9” + -9ý  +9• + -9ý  +9• + -9ý  +9• +  -9ý  +9• + k -9€ +9˜ ] Formats used, so a caller that let from_format be inferred learns what it was inferred as. -9€ +9˜  -9€ +9˜  -9€ +9˜  -9� +9™  -9� +9™  -9� +9™  -9� +9™  D -9‚ +9š "6 non-empty if the conversion failed; content is unset -9‚ +9š  -9‚ +9š  -9‚ +9š  Ó -9† +9ž &Ä Syntax errors tolerated under tolerate_syntax_errors, or those that failed the conversion; with include_check_diagnostics, the semantic check's diagnostics as well, each with its own severity. -9† +9ž  -9† +9ž  -9† +9ž ! -9† +9ž $% à -9Œ +9¤ ´ Set when either format is RDF or the API's JSON element form, whose mapping is experimental: it covers model structure and the behavior its bodies state, refuses what it cannot write back, and its vocabulary may @@ -5999,623 +6092,575 @@ $% leaves this unset. -9Œ +9¤  -9Œ +9¤  -9Œ +9¤  ‰ -9� +9§ !{ What is experimental about the conversion, in the wording every surface reports it in. Empty when experimental is false. -9� +9§  -9� +9§  -9� +9§  ˜ -9’ +9ª 3‰ Referenced standard-library names, outside the element array. Populated for successful api-json conversions, including compact output. -9’ +9ª  -9’ +9ª  -9’ +9ª . -9’ +9ª 12 _ -:– -š +:® +² Q LibraryReference names a referenced standard-library element, not a model root. -:– +:®  -:— +:¯  -:— +:¯  -:— +:¯ -:— +:¯  -:˜ +:°  -:˜ +:°  -:˜ +:°  -:˜ +:°  9 -:™ +:± "+ Metaclass, as API JSON's @type spells it. -:™ +:±  -:™ +:± -:™ +:±  ¦ -;  -Ä +;¸ +Ü — MigrateRequest asks for a SysML v1 model migrated to v2. The source is a file_path the service reads, or the document carried inline as content — bytes, since a .mdzip archive is binary. There is no model_hash form: parse reads v2 notation, and a v1 model is never parsed. -;  +;¸   -;¡ -¤ +;¹ +¼  -;¡ +;¹  -;¢ +;º  -;¢ +;º  -;¢ +;º  -;¢ +;º  -;£ +;»  -;£ +;»  -;£ +;»  -;£ +;»  – -;© +;Á ‡ "xmi" (UML XMI 2.5.1 with the SysML profile applied), "uml" (an Eclipse UML2 file) or "mdzip" (a Cameo/MagicDraw archive). Empty infers from file_path's extension; inline content has none, so it must say. A v2 format is INVALID_ARGUMENT, pointing at Convert. -;© +;Á  -;© +;Á  -;© +;Á  Ð -;­ +;Å Á Format to write: "sysml", "kerml", "text", "ttl", "turtle", "rdf", "api-json" or "json", as Convert names them. The v1 names are refused, since a v2 model has no v1 form. Empty is rejected. -;­ +;Å  -;­ +;Å  -;­ +;Å  À -;± +;É ± Carry every element's verdict in the response's report, as the command's -migration-report writes it. The report's summary and counts are carried whether or not this is set. -;± +;É  -;± +;É  -;± +;É  Ú -;µ +;Í Ë Carry the result snapshots the v1 tool stored with the model, indexed as the command's -migration-results writes them, so the migrated runs can be compared with the tool's (`sysml -compare-results`). -;µ +;Í  -;µ +;Í  -;µ +;Í  · -;¹ -¼ +;Ñ +Ô ¦ An MTIP export of the model's diagrams (Model_mtip.xml), laying the migrated views out as the v1 tool drew them: a path the service reads, or the document itself. -;¹ +;Ñ  -;º +;Ò  -;º +;Ò  -;º +;Ò  -;º +;Ò  -;» +;Ó  -;» +;Ó  -;» +;Ó  -;» +;Ó  � -;¿ +;×  Absolute http(s) URL that a server-relative image reference in a v1 comment () is resolved against. -;¿ +;×  -;¿ +;×  -;¿ +;×  ë -; à +; Û Ü Write only notation a pinned SysML v2 production admits: a construct whose only v2 form is an OpenSysML extension (a deferred event, a choice, junction or history pseudostate) is reported unmapped instead of written. -; à +; Û  -; à +; Û  -; à +; Û  | -<È -Þ +<à +ö n MigrateResponse carries the migrated model and the account of what the migration did with every v1 element. -<È +<à  -<É +<á  -<É +<á  -<É +<á  -<É +<á  ‘ -<Ì +<ä ‚ Formats used, canonical ("xmi" for every v1 form), so a caller that let from_format be inferred learns what it was inferred as. -<Ì +<ä  -<Ì +<ä  -<Ì +<ä  -<Í +<å  -<Í +<å  -<Í +<å  -<Í +<å  C -<Î +<æ "5 non-empty if the migration failed; content is unset -<Î +<æ  -<Î +<æ  -<Î +<æ  ¯ -<Ò +<ê   Always set: migration is experimental, in the sense Convert's experimental says, and experimental_notice says so in the wording every surface reports it in. -<Ò +<ê  -<Ò +<ê  -<Ò +<ê  -<Ó +<ë ! -<Ó +<ë  -<Ó +<ë  -<Ó +<ë  ‘ -<Ö +<î ‚ What the migration did, element by element. Its entries are carried when the request set report; its summary and counts always. -<Ö +<î  -<Ö +<î  -<Ö +<î  � -<Ú +<ò Ž The result snapshots the v1 tool stored, as the JSON `sysml -compare-results` reads, when the request set results and the model holds any. -<Ú +<ò  -<Ú +<ò  -<Ú +<ò  „ -<Ý +<õ #v Image files the migrated model refers to by relative path (a picture a v1 comment embeds), to be written beside it. -<Ý +<õ  -<Ý +<õ  -<Ý +<õ  -<Ý +<õ !" ä -=å -ö -Õ MigrationReport accounts for every element of a SysML v1 model: mapped to a +=ý +Ž Õ MigrationReport accounts for every element of a SysML v1 model: mapped to a v2 counterpart that states the same thing, approximated by a v2 form that loses or restates part of what v1 said, left unmapped and recorded as a comment where it stood, or skipped as a profile, library or notation-only element nothing in the model refers to. -=å +=ý  U -=ç +=ÿ G The v1 document migrated, and the tool that exported it when it said. -=ç +=ÿ  -=ç +=ÿ  -=ç +=ÿ  -=è - +=€  -=è - +=€  -=è -  +=€  -=è - +=€  H -=ê -: The one-line account the command prints after migrating. +=‚ : The one-line account the command prints after migrating. -=ê - +=‚  -=ê -  +=‚  -=ê - +=‚  -=ë - +=ƒ  -=ë - +=ƒ  -=ë - +=ƒ  -=ë - +=ƒ  -=ì - +=„  -=ì - +=„  -=ì - +=„  -=ì - +=„  -=í - +=…  -=í - +=…  -=í - +=…  -=í - +=…  -=î - +=†  -=î - +=†  -=î - +=†  -=î - +=†   -=ñ -&q Every element's verdict, when the request asked for the report; empty +=‰ &q Every element's verdict, when the request asked for the report; empty otherwise, the counts above standing in. -=ñ - +=‰  -=ñ -  +=‰  -=ñ -! +=‰ ! -=ñ -$% +=‰ $% â -=õ -Ó The report as the command's -migration-report writes it to a text file, +=� Ó The report as the command's -migration-report writes it to a text file, when the request asked for the report: the entries grouped by verdict, the elements that need attention first, with the layout account. -=õ - +=�  -=õ - +=� -=õ - +=�  F ->ù -‡ 8 MigrationEntry is the verdict on one SysML v1 element. +>‘ Ÿ 8 MigrationEntry is the verdict on one SysML v1 element. ->ù - +>‘  K ->û -= The element's xmi:id, the handle a v1 tool addresses it by. +>“ = The element's xmi:id, the handle a v1 tool addresses it by. ->û - +>“  ->û - +>“ ->û - +>“  £ ->þ -” The element as modeled: its stereotype when one classifies it («Block», +>– ” The element as modeled: its stereotype when one classifies it («Block», «Requirement»), else its UML metaclass; and its qualified name in v1. ->þ - +>–  ->þ - +>– ->þ - +>–  ->ÿ - +>—  ->ÿ - +>—  ->ÿ - +>— ->ÿ - +>—  q ->‚ c The v2 declaration written for it, a qualified name with its keyword, or +>š c The v2 declaration written for it, a qualified name with its keyword, or empty when nothing was. ->‚  +>š  ->‚  +>š  ->‚  +>š  B ->„ 4 "mapped", "approximated", "unmapped" or "skipped". +>œ 4 "mapped", "approximated", "unmapped" or "skipped". ->„  +>œ  ->„  +>œ  ->„  +>œ  B ->† 4 Why it was approximated, left unmapped or skipped. +>ž 4 Why it was approximated, left unmapped or skipped. ->†  +>ž  ->† +>ž ->†  +>ž  [ -?Š � M MigrationFile is a file the migrated model refers to, named relative to it. +?¢ ¥ M MigrationFile is a file the migrated model refers to, named relative to it. -?Š  +?¢  -?‹  +?£  -?‹  +?£  -?‹ +?£ -?‹  +?£  -?Œ  +?¤  -?Œ  +?¤  -?Œ  +?¤  -?Œ  +?¤  â -@™ § Ó ApplyEditsRequest asks for a model's source with edits applied to it. The +@± ¿ Ó ApplyEditsRequest asks for a model's source with edits applied to it. The source edited is the one parse read, named by its hash, so an edit is applied to the model that was inspected. A model of several documents (ParseSources) is edited as one when the request sets `accept_documents`: the operations @@ -6627,1178 +6672,1178 @@ B naming a document or reading `documents`. -@™  +@±  9 -@š "+ from a ParseFile or ParseSources response +@² "+ from a ParseFile or ParseSources response -@š  +@²  -@š  +@²  -@š  +@²    -@� (‘ Edits to apply, all of them or none. Empty is rejected: it names no edit, +@µ (‘ Edits to apply, all of them or none. Empty is rejected: it names no edit, and answering with the unedited source would look like one was made. -@�  +@µ  -@�  +@µ  -@� # +@µ # -@� &' +@µ &' ÿ -@£ ð The document whose declarations the operations target, named as the parse +@» ð The document whose declarations the operations target, named as the parse request named it; empty names the model's first document, which is the only one of a ParseFile model. An operation targeting a declaration of another document is refused as an unknown target, naming that document. A name no document of the model has fails the call as an invalid argument. -@£  +@»  -@£  +@»  -@£  +@»  À -@¦ ± Whether the client reads the response's `documents`. A model of several documents is +@¾ ± Whether the client reads the response's `documents`. A model of several documents is edited only when set; unset, such a model is refused as a failed precondition, as before. -@¦  +@¾  -@¦  +@¾  -@¦  +@¾  F -Aª ¾ 8 EditOperation is one source-preserving change to make. +AÂ Ö 8 EditOperation is one source-preserving change to make. -Aª  +A   -A« ½  +Aà Õ  -A«  +Aà  -A¬  +AÄ  -A¬  +AÄ  -A¬  +AÄ  -A¬  +AÄ  -A­  +AÅ  -A­  +AÅ  -A­  +AÅ  -A­  +AÅ  -A® ! +AÆ ! -A®  +AÆ  -A®  +AÆ  -A®  +AÆ  -A¯  +AÇ  -A¯  +AÇ  -A¯  +AÇ  -A¯  +AÇ  -A°  +AÈ  -A°  +AÈ  -A°  +AÈ  -A°  +AÈ  -A± ) +AÉ ) -A±  +AÉ  -A± $ +AÉ $ -A± '( +AÉ '( -A² # +AÊ # -A²  +AÊ  -A²  +AÊ  -A² !" +AÊ !" -A³ @ +AË @ -A³  +AË  -A³ !; +AË !; -A³ >? +AË >? -A´ ) +AÌ ) -A´  +AÌ  -A´ $ +AÌ $ -A´ '( +AÌ '( -A µ " +A Í " -A µ  +A Í  -A µ  +A Í  -A µ ! +A Í ! A -¶ 0 +Î 0 A -¶  +Î  A -¶ * +Î * A -¶ -/ +Î -/ -A · " +A Ï " -A ·  +A Ï  -A ·  +A Ï  -A · ! +A Ï ! -A ¸ & +A Ð & -A ¸  +A Ð  -A ¸  +A Ð  -A ¸ #% +A Ð #% -A ¹ & +A Ñ & -A ¹  +A Ñ  -A ¹  +A Ñ  -A ¹ #% +A Ñ #% -Aº 3 +AÒ 3 -Aº  +AÒ  -Aº - +AÒ - -Aº 02 +AÒ 02 -A» $ +AÓ $ -A»  +AÓ  -A»  +AÓ  -A» !# +AÓ !# -A¼  +AÔ  -A¼  +AÔ  -A¼  +AÔ  -A¼  +AÔ  Z -BÁ â L AddMemberEdit inserts a declaration into a namespace or the document root. +BÙ ú L AddMemberEdit inserts a declaration into a namespace or the document root. -BÁ  +BÙ  X -Bà J Namespace FQN to receive the declaration; empty means the document root. +BÛ J Namespace FQN to receive the declaration; empty means the document root. -Bà  +BÛ  -Bà  +BÛ  -Bà  +BÛ  H -BÅ : Written declaration kind, such as "part def" or "class". +BÝ : Written declaration kind, such as "part def" or "class". -BÅ  +BÝ  -BÅ +BÝ -BÅ  +BÝ  $ -BÇ  Declared identifier. +Bß  Declared identifier. -BÇ  +Bß  -BÇ +Bß -BÇ  +Bß  F -BÉ 8 Optional type target for a usage, written as notation. +Bá 8 Optional type target for a usage, written as notation. -BÉ  +Bá  -BÉ +Bá -BÉ  +Bá  L -BË > Optional multiplicity, including brackets, such as "[0..*]". +Bã > Optional multiplicity, including brackets, such as "[0..*]". -BË  +Bã  -BË  +Bã  -BË  +Bã  ? -BÍ 1 Optional value expression, written as notation. +Bå 1 Optional value expression, written as notation. -BÍ  +Bå  -BÍ  +Bå  -BÍ  +Bå  A -BÏ "3 Optional specialization targets for a definition. +Bç "3 Optional specialization targets for a definition. -BÏ  +Bç  -BÏ  +Bç  -BÏ  +Bç  -BÏ ! +Bç ! 4 -BÑ & Whether the declaration is abstract. +Bé & Whether the declaration is abstract. -BÑ  +Bé  -BÑ  +Bé  -BÑ  +Bé  : -BÓ  , Optional redefinition targets for a usage. +Bë  , Optional redefinition targets for a usage. -BÓ  +Bë  -BÓ  +Bë  -BÓ  +Bë  -BÓ  +Bë  F -B Õ 8 Whether the value uses the default assignment keyword. +B í 8 Whether the value uses the default assignment keyword. -B Õ  +B í  -B Õ  +B í  -B Õ  +B í  A B -× 3 Optional usage direction: "in", "out" or "inout". +ï 3 Optional usage direction: "in", "out" or "inout". B -×  +ï  B -×  +ï  B -×  +ï  9 -B Ù )+ Metadata types annotating the new member. +B ñ )+ Metadata types annotating the new member. -B Ù  +B ñ  -B Ù  +B ñ  -B Ù # +B ñ # -B Ù &( +B ñ &( ¢ -B Ü “ Optional documentation body, as plain text, written as the declaration's +B ô “ Optional documentation body, as plain text, written as the declaration's first body member `doc /* ... */` that reads back as exactly this text. -B Ü  +B ô  -B Ü +B ô -B Ü  +B ô  ÷ -B á è Optional body expression. For constraints, it is the condition; for calc, +B ù è Optional body expression. For constraints, it is the condition; for calc, case, analysis, verification, and use-case kinds, it is the result expression. It is written inside `{ ... }`, distinct from value, which writes `= ...`. -B á  +B ù  -B á  +B ù  -B á  +B ù  l -Cå ð ^ AddSatisfyEdit inserts a satisfy usage into any package or body that admits behavior usages. +Cý ˆ ^ AddSatisfyEdit inserts a satisfy usage into any package or body that admits behavior usages. -Cå  +Cý  ) -Cç  Body receiving the usage. +Cÿ  Body receiving the usage. -Cç  +Cÿ  -Cç  +Cÿ  -Cç  +Cÿ  . -Cé  Requirement feature reference. +C�  Requirement feature reference. -Cé  +C�  -Cé  +C�  -Cé  +C�  6 -Cë  ( Optional satisfying feature reference. +Cƒ  ( Optional satisfying feature reference. -Cë  +Cƒ  -Cë  +Cƒ  -Cë  +Cƒ  . -Cí  Whether the usage is asserted. +C…  Whether the usage is asserted. -Cí  +C…  -Cí  +C…  -Cí  +C…  - -Cï  Whether the usage is negated. +C‡  Whether the usage is negated. -Cï  +C‡  -Cï  +C‡  -Cï  +C‡  T -Dó ü F AddRequirementConstraintEdit inserts a require or assume constraint. +D‹ ” F AddRequirementConstraintEdit inserts a require or assume constraint. -Dó $ +D‹ $ D -Dõ 6 Requirement-like namespace receiving the constraint. +D� 6 Requirement-like namespace receiving the constraint. -Dõ  +D�  -Dõ  +D�  -Dõ  +D�  7 -D÷ ) Constraint kind: "require" or "assume". +D� ) Constraint kind: "require" or "assume". -D÷  +D�  -D÷ +D� -D÷  +D�  ; -Dù - Constraint expression, written as notation. +D‘ - Constraint expression, written as notation. -Dù  +D‘  -Dù  +D‘  -Dù  +D‘  ' -Dû  Optional declared name. +D“  Optional declared name. -Dû  +D“  -Dû +D“ -Dû  +D“  h -Eÿ � Z AddTransitionEdit inserts a transition usage, or an entry transition, into a state body. +E— ¨ Z AddTransitionEdit inserts a transition usage, or an entry transition, into a state body. -Eÿ  +E—  4 -E� & State body receiving the transition. +E™ & State body receiving the transition. -E�  +E™  -E�  +E™  -E�  +E™  ) -Eƒ  Optional transition name. +E›  Optional transition name. -Eƒ  +E›  -Eƒ +E› -Eƒ  +E›  M -E… ? Source feature reference; empty only for an entry transition. +E� ? Source feature reference; empty only for an entry transition. -E…  +E�  -E…  +E�  -E…  +E�  ) -E‡  Target feature reference. +EŸ  Target feature reference. -E‡  +EŸ  -E‡  +EŸ  -E‡  +EŸ  - -E‰  Optional text after `accept`. +E¡  Optional text after `accept`. -E‰  +E¡  -E‰  +E¡  -E‰  +E¡  7 -E‹ ) Optional boolean expression after `if`. +E£ ) Optional boolean expression after `if`. -E‹  +E£  -E‹  +E£  -E‹  +E£  0 -E� " Optional effect text after `do`. +E¥ " Optional effect text after `do`. -E�  +E¥  -E�  +E¥  -E�  +E¥  N -E� @ Write `entry; then ;` instead of a regular transition. +E§ @ Write `entry; then ;` instead of a regular transition. -E�  +E§  -E�  +E§  -E�  +E§  Z -F“ ˜ L AddVerifyEdit inserts a requirement verification into a verification case. +F« ° L AddVerifyEdit inserts a requirement verification into a verification case. -F“  +F«  J -F• < Verification case or objective receiving the verification. +F­ < Verification case or objective receiving the verification. -F•  +F­  -F•  +F­  -F•  +F­  . -F—  Requirement feature reference. +F¯  Requirement feature reference. -F—  +F¯  -F—  +F¯  -F—  +F¯  V -G›   H MetadataFeatureValue binds one metadata feature to a value expression. +G³ ¸ H MetadataFeatureValue binds one metadata feature to a value expression. -G›  +G³  * -G�  Feature reference to bind. +Gµ  Feature reference to bind. -G�  +Gµ  -G�  +Gµ  -G�  +Gµ  6 -GŸ ( Value expression, written as notation. +G· ( Value expression, written as notation. -GŸ  +G·  -GŸ  +G·  -GŸ  +G·  9 -H£ ° + AddMetadataEdit inserts a metadata usage. +H» È + AddMetadataEdit inserts a metadata usage. -H£  +H»  ? -H¥ 1 Namespace or body receiving the metadata usage. +H½ 1 Namespace or body receiving the metadata usage. -H¥  +H½  -H¥  +H½  -H¥  +H½  . -H§  Metadata definition reference. +H¿  Metadata definition reference. -H§  +H¿  -H§  +H¿  -H§  +H¿  5 -H© ' Optional declared name for the usage. +HÁ ' Optional declared name for the usage. -H©  +HÁ  -H© +HÁ -H©  +HÁ  @ -H« 2 Optional references the metadata usage is about. +Hà 2 Optional references the metadata usage is about. -H«  +Hà  -H«  +Hà  -H«  +Hà  -H«  +Hà  0 -H­ +" Feature values in written order. +HÅ +" Feature values in written order. -H­  +HÅ  -H­  +HÅ  -H­ & +HÅ & -H­ )* +HÅ )* C -H¯ 5 Write shorthand `@` notation instead of `metadata`. +HÇ 5 Write shorthand `@` notation instead of `metadata`. -H¯  +HÇ  -H¯  +HÇ  -H¯  +HÇ  ] -I³ ¸ O AddMetadataPrefixEdit annotates an existing declaration with prefix metadata. +IË Ð O AddMetadataPrefixEdit annotates an existing declaration with prefix metadata. -I³  +IË  ? -Iµ 1 Declaration to annotate, by its qualified name. +IÍ 1 Declaration to annotate, by its qualified name. -Iµ  +IÍ  -Iµ  +IÍ  -Iµ  +IÍ  A -I· 3 Metadata definition reference to add as a prefix. +IÏ 3 Metadata definition reference to add as a prefix. -I·  +IÏ  -I·  +IÏ  -I·  +IÏ  g -J» È Y AddImportEdit inserts an import declaration into a namespace body or the document root. +JÓ à Y AddImportEdit inserts an import declaration into a namespace body or the document root. -J»  +JÓ  R -J½ D Namespace FQN receiving the import; empty means the document root. +JÕ D Namespace FQN receiving the import; empty means the document root. -J½  +JÕ  -J½  +JÕ  -J½  +JÕ  K -J¿ = "private", "public" or "protected"; empty writes "private". +J× = "private", "public" or "protected"; empty writes "private". -J¿  +J×  -J¿  +J×  -J¿  +J×  h -JÁ Z Imported qualified name, optionally rooted "$::", suffixed "::*" for a namespace import. +JÙ Z Imported qualified name, optionally rooted "$::", suffixed "::*" for a namespace import. -JÁ  +JÙ  -JÁ  +JÙ  -JÁ  +JÙ  3 -Jà % Write "::**" to import recursively. +JÛ % Write "::**" to import recursively. -Jà  +JÛ  -Jà  +JÛ  -Jà  +JÛ  D -JÅ 6 Write "import all" to import non-public members too. +JÝ 6 Write "import all" to import non-public members too. -JÅ  +JÝ  -JÅ  +JÝ  -JÅ  +JÝ  D -JÇ 6 Filter conditions, each written as "[]". +Jß 6 Filter conditions, each written as "[]". -JÇ  +Jß  -JÇ  +Jß  -JÇ  +Jß  -JÇ  +Jß  — -KÌ Ø ˆ AddDocumentationEdit adds a `doc /* ... */` as the first body member of an +Kä ð ˆ AddDocumentationEdit adds a `doc /* ... */` as the first body member of an existing declaration, opening a body for one ended by `;`. -KÌ  +Kä  C -KÎ 5 Fully qualified name of the documented declaration. +Kæ 5 Fully qualified name of the documented declaration. -KÎ  +Kæ  -KÎ  +Kæ  -KÎ  +Kæ  £ -KÑ ” Documentation body, as plain text that Documentation::body reads back +Ké ” Documentation body, as plain text that Documentation::body reads back exactly, whitespace included; it may not contain `*/` or a carriage return. -KÑ  +Ké  -KÑ +Ké -KÑ  +Ké  < -KÓ . Optional declared name of the documentation. +Kë . Optional declared name of the documentation. -KÓ  +Kë  -KÓ +Kë -KÓ  +Kë  ; -KÕ - Optional locale, written as `locale "..."`. +Kí - Optional locale, written as `locale "..."`. -KÕ  +Kí  -KÕ  +Kí  -KÕ  +Kí  V -K× H Rewrite the one documentation target already owns instead of refusing. +Kï H Rewrite the one documentation target already owns instead of refusing. -K×  +Kï  -K×  +Kï  -K×  +Kï  € -LÝ é r AddCommentEdit inserts `comment [name] [about a, b] [locale "..."] /* ... */` +Lõ � r AddCommentEdit inserts `comment [name] [about a, b] [locale "..."] /* ... */` where a new member of owner goes. -LÝ  +Lõ  S -Lß E Namespace FQN receiving the comment; empty means the document root. +L÷ E Namespace FQN receiving the comment; empty means the document root. -Lß  +L÷  -Lß  +L÷  -Lß  +L÷  � -Lâ s Comment body, as plain text that Comment::body reads back exactly; it may +Lú s Comment body, as plain text that Comment::body reads back exactly; it may not contain `*/` or a carriage return. -Lâ  +Lú  -Lâ +Lú -Lâ  +Lú  6 -Lä ( Optional declared name of the comment. +Lü ( Optional declared name of the comment. -Lä  +Lü  -Lä +Lü -Lä  +Lü  Y -Læ K Optional annotated elements, each a qualified name written after `about`. +Lþ K Optional annotated elements, each a qualified name written after `about`. -Læ  +Lþ  -Læ  +Lþ  -Læ  +Lþ  -Læ  +Lþ  ; -Lè - Optional locale, written as `locale "..."`. +L€ - Optional locale, written as `locale "..."`. -Lè  +L€  -Lè  +L€  -Lè  +L€  � -Mí ò � AddNoteEdit writes the line note `// text` on its own line above a declaration. +M… Š � AddNoteEdit writes the line note `// text` on its own line above a declaration. A note is lexical trivia, not a model element. -Mí  +M…  J -Mï < Fully qualified name of the declaration the note precedes. +M‡ < Fully qualified name of the declaration the note precedes. -Mï  +M‡  -Mï  +M‡  -Mï  +M‡  E -Mñ 7 Note text, one line: it may not contain a line break. +M‰ 7 Note text, one line: it may not contain a line break. -Mñ  +M‰  -Mñ +M‰ -Mñ  +M‰  b -Nõ œ T AddSequenceEdit inserts a `first` or `then` sequencing member into an action body. +N� ´ T AddSequenceEdit inserts a `first` or `then` sequencing member into an action body. -Nõ  +N�  1 -N÷ # Action body receiving the member. +N� # Action body receiving the member. -N÷  +N�  -N÷  +N�  -N÷  +N�  ´ -Nû ¥ Sequence keyword: "first", "then", "if", "else", or empty for a plain member. +N“ ¥ Sequence keyword: "first", "then", "if", "else", or empty for a plain member. These action-body forms follow SysML.xtext:1607 ActionBodyParameter, 1442 AcceptNode, 1499 SendNode, 1535 AssignmentNode, 1596 IfNode, 1615 WhileLoopNode, 1624 ForLoopNode, 1641 TerminateNode; formal/2026-03-02. -Nû  +N“  -Nû  +N“  -Nû  +N“  q -Nþ c Node a bare `first ;`/`then ;` names; empty when the `then` +N– c Node a bare `first ;`/`then ;` names; empty when the `then` declares a member instead. -Nþ  +N–  -Nþ +N– -Nþ  +N–  ž -N� � Body item kind, including action, perform action, state, merge, decide, +N™ � Body item kind, including action, perform action, state, merge, decide, join, fork, accept, send, assign, if, while, loop, for or terminate. -N�  +N™  -N�  +N™  -N�  +N™  E -Nƒ 7 Optional declared name of the `then`-declared member. +N› 7 Optional declared name of the `then`-declared member. -Nƒ  +N›  -Nƒ  +N›  -Nƒ  +N›  E -N… 7 Optional typing target of the `then`-declared member. +N� 7 Optional typing target of the `then`-declared member. -N…  +N�  -N… +N� -N…  +N�  H -N‡ : Optional name of the body member the new member follows. +NŸ : Optional name of the body member the new member follows. -N‡  +NŸ  -N‡  +NŸ  -N‡  +NŸ  ? -N‰ 1 Condition or guard expression for if and while. +N¡ 1 Condition or guard expression for if and while. -N‰  +N¡  -N‰  +N¡  -N‰  +N¡  M -N‹ ? Payload, assigned value, collection or terminated occurrence. +N£ ? Payload, assigned value, collection or terminated occurrence. -N‹  +N£  -N‹  +N£  -N‹  +N£  2 -N � $ Assigned feature or send receiver. +N ¥ $ Assigned feature or send receiver. -N �  +N ¥  -N �  +N ¥  -N �  +N ¥  3 N -� % Port expression for accept or send. +§ % Port expression for accept or send. N -�  +§  N -� +§ N -�  +§  4 -N ‘ & Optional loop termination condition. +N © & Optional loop termination condition. -N ‘  +N ©  -N ‘  +N ©  -N ‘  +N ©  ) -N “ % Nested action-body items. +N « % Nested action-body items. -N “  +N «  -N “  +N «  -N “  +N «  -N “ "$ +N « "$ Á -N – *² Nested items of the if's else branch; an empty list means no else branch. +N ® *² Nested items of the if's else branch; an empty list means no else branch. An explicit empty `else { }` is not authorable; it performs nothing and is equivalent to omitting it. -N –  +N ®  -N –  +N ®  -N – $ +N ® $ -N – ') +N ® ') × -N™ È Source-end multiplicity, written as bracketed notation, only with "then". +N± È Source-end multiplicity, written as bracketed notation, only with "then". SysML.xtext:878, 887, 1703 TargetSuccession, 1708 GuardedTargetSuccession, 1714 DefaultTargetSuccession; formal/2026-03-02. -N™  +N±  -N™  +N±  -N™  +N±  A -N› 3 Payload name for accept or loop variable for for. +N³ 3 Payload name for accept or loop variable for for. -N›  +N³  -N›  +N³  -N›  +N³  R -Ož ¬ D AddConnectionEdit inserts a usage whose ends connect two features. +O¶ Ä D AddConnectionEdit inserts a usage whose ends connect two features. -Ož  +O¶  Q -O  C Namespace FQN receiving the usage; empty means the document root. +O¸ C Namespace FQN receiving the usage; empty means the document root. -O   +O¸  -O   +O¸  -O   +O¸  � -O£ Ž Usage kind: SysML connection, interface, allocation, binding, flow, +O» Ž Usage kind: SysML connection, interface, allocation, binding, flow, succession or transition; KerML connector, binding, flow or succession. -O£  +O»  -O£ +O» -O£  +O»  @ -O¥ 2 First feature reference resolved from the owner. +O½ 2 First feature reference resolved from the owner. -O¥  +O½  -O¥  +O½  -O¥  +O½  A -O§ 3 Second feature reference resolved from the owner. +O¿ 3 Second feature reference resolved from the owner. -O§  +O¿  -O§  +O¿  -O§  +O¿  ' -O©  Optional declared name. +OÁ  Optional declared name. -O©  +OÁ  -O© +OÁ -O©  +OÁ  N -O« @ Optional typing target, legal only for typed connection kinds. +Oà @ Optional typing target, legal only for typed connection kinds. -O«  +Oà  -O« +Oà -O«  +Oà  F -P¯ ´ 8 DeleteEdit removes a declaration and its owned trivia. +PÇ Ì 8 DeleteEdit removes a declaration and its owned trivia. -P¯  +PÇ  B -P± 4 Fully qualified name of the declaration to remove. +PÉ 4 Fully qualified name of the declaration to remove. -P±  +PÉ  -P±  +PÉ  -P±  +PÉ  > -P³ 0 Also remove declarations that refer to target. +PË 0 Also remove declarations that refer to target. -P³  +PË  -P³  +PË  -P³  +PË  º -Qº ¿ « MoveEdit re-parents a declaration: the span DeleteEdit would remove is +QÒ × « MoveEdit re-parents a declaration: the span DeleteEdit would remove is written where AddMemberEdit would insert it, and the references the move breaks are respelled so the model stays valid. A move whose references cannot be respelled is refused, naming them, rather than leaving them dangling. -Qº  +QÒ  @ -Q¼ 2 Fully qualified name of the declaration to move. +QÔ 2 Fully qualified name of the declaration to move. -Q¼  +QÔ  -Q¼  +QÔ  -Q¼  +QÔ  X -Q¾ J Namespace FQN to receive the declaration; empty means the document root. +QÖ J Namespace FQN to receive the declaration; empty means the document root. -Q¾  +QÖ  -Q¾  +QÖ  -Q¾  +QÖ  ¦ -RÃ É — SetValueEdit sets the value of a feature that already exists, replacing the +RÛ á — SetValueEdit sets the value of a feature that already exists, replacing the expression of its `= ` or adding one before the declaration's `;`. -Rà  +RÛ  X -RÅ J Element to edit, named as SymbolInfo.id names it ("Demo::sc::unitMass"). +RÝ J Element to edit, named as SymbolInfo.id names it ("Demo::sc::unitMass"). -RÅ  +RÝ  -RÅ  +RÝ  -RÅ  +RÝ  ¦ -RÈ — New value in SysML notation ("1050.0[SI::kg]", "\"m1\"", "true", "mass * 2"). +Rà — New value in SysML notation ("1050.0[SI::kg]", "\"m1\"", "true", "mass * 2"). It must parse as an expression and resolve in the feature's own scope. -RÈ  +Rà  -RÈ  +Rà  -RÈ  +Rà  ’ -SÏ Ò ƒ RenameEdit rewrites the name token of a declaration and every reference to +Sç ê ƒ RenameEdit rewrites the name token of a declaration and every reference to it in the model's documents. A rename that reaches a reference in a document the edit cannot rewrite is refused, naming the referring elements, rather than leaving a broken model. -SÏ  +Sç  < -SÐ ". element to rename, as SymbolInfo.id names it +Sè ". element to rename, as SymbolInfo.id names it -SÐ  +Sè  -SÐ  +Sè  -SÐ  +Sè  < -SÑ ". new declared name; must lex as an identifier +Sé ". new declared name; must lex as an identifier -SÑ  +Sé  -SÑ  +Sé  -SÑ  +Sé  è -T× ú Ù ApplyEditsResponse carries the edited source, or says why nothing was edited. +Tï ’Ù ApplyEditsResponse carries the edited source, or says why nothing was edited. The edited notation is in `documents`, one entry per document the edits rewrote; `content` repeats it for a single-document model only. -T×  +Tï  ý -Tß î The edited notation of a single-document model, byte-identical to the +T÷ î The edited notation of a single-document model, byte-identical to the source outside the edited spans. Empty when the edits were refused, so a refusal never writes a file, and empty for a model of several documents, whose edited notation is in `documents` alone: a client that reads @@ -7807,898 +7852,898 @@ X for a single-document model, so a client needs one code path. -Tß  +T÷  -Tß  +T÷  -Tß  +T÷  � -Tâ # What each operation changed, grouped by document in the order `documents` +Tú # What each operation changed, grouped by document in the order `documents` lists them and in request order within a document. -Tâ  +Tú  -Tâ  +Tú  -Tâ  +Tú  -Tâ !" +Tú !" T -Tã "F non-empty if the edits were refused; content and documents are unset +Tû "F non-empty if the edits were refused; content and documents are unset -Tã  +Tû  -Tã  +Tû  -Tã  +Tû  u -Tæ g Which kind of refusal `error` reports, so a client acts on the kind rather +Tþ g Which kind of refusal `error` reports, so a client acts on the kind rather than on the message text. -Tæ  +Tþ  -Tæ  +Tþ  -Tæ  +Tþ  Á -Tê &² Diagnostics behind a refusal: the parse errors of an unreadable new value, +T‚&² Diagnostics behind a refusal: the parse errors of an unreadable new value, or the errors the edited source was found to have. A diagnostic's span names the document it is in. -Tê  +T‚ -Tê  +T‚  -Tê ! +T‚! -Tê $% +T‚$% ² -Tï )£ Where the references to a declaration whose rename, delete or move was +T‡)£ Where the references to a declaration whose rename, delete or move was refused are made: the FQN of each referring namespace, suffixed with its document in parentheses when that is not the document being edited. `referrers` carries the same list with the document as a field of its own. -Tï  +T‡ -Tï  +T‡  -Tï $ +T‡$ -Tï '( +T‡'( Ê -Tõ (» The edited notation of every document the edits rewrote, named as the +T�(» The edited notation of every document the edits rewrote, named as the parse request named it: the document being edited first, then the others in name order. A document of several the edits left as parsed is not listed; the one document of a single-document model always is. Empty when the edits were refused. -Tõ  +T� -Tõ  +T�  -Tõ # +T�# -Tõ &' +T�&' Æ -Tù "· The declarations referring to the target of a refused rename, delete or +T‘"· The declarations referring to the target of a refused rename, delete or move, each with the document declaring it, in document then name order. Empty when `referring_elements` is. -Tù  +T‘ -Tù  +T‘  -Tù  +T‘ -Tù ! +T‘ ! S -Uý „E EditedDocument is the edited notation of one document of the model. +U•œE EditedDocument is the edited notation of one document of the model. -Uý  +U• ¾ -U�¯ The document's name as the parse request gave it: the file path of a +U™¯ The document's name as the parse request gave it: the file path of a file_path document, the name of an inline one, or the position it was given when it was named neither. -U� +U™ -U� +U™ -U� +U™ [ -UƒM The edited notation, byte-identical to the source outside the edited spans. +U›M The edited notation, byte-identical to the source outside the edited spans. -Uƒ +U› -Uƒ  +U›  -Uƒ +U› V -V‡�H Referrer is one declaration referring to the target of a refused edit. +VŸ¥H Referrer is one declaration referring to the target of a refused edit. -V‡ +VŸ ‹ -VŠ} The declaration as the notation names it: the FQN of a named one, or the +V¢} The declaration as the notation names it: the FQN of a named one, or the heading of an anonymous one within its namespace. -VŠ +V¢ -VŠ +V¢ -VŠ +V¢ O -VŒA The document declaring it, named as the parse request named it. +V¤A The document declaring it, named as the parse request named it. -VŒ +V¤ -VŒ  +V¤  -VŒ +V¤ ‘ -W‘ž‚ AppliedEdit is one byte range of the original source that an operation +W©¶‚ AppliedEdit is one byte range of the original source that an operation replaced, so a client can report or locate what changed. -W‘ +W© Y -W“K Index of the operation in the request, so an answer maps back to its ask. +W«K Index of the operation in the request, so an answer maps back to its ask. -W“ +W« -W“ +W« -W“ +W« 7 -W”") element edited, as the request named it +W¬") element edited, as the request named it -W” +W¬ -W”  +W¬  -W” +W¬ ~ -W—p Batch offsets use the original source; sequential offsets use the +W¯p Batch offsets use the original source; sequential offsets use the intermediate source seen by that operation. -W— +W¯ -W— +W¯ -W— +W¯ 6 -W˜"( bytes replaced; zero for text inserted +W°"( bytes replaced; zero for text inserted -W˜ +W° -W˜ +W° -W˜ +W° 6 -W™"( what was there, empty for an insertion +W±"( what was there, empty for an insertion -W™ +W± -W™  +W±  -W™ +W± -Wš" what was written +W²" what was written -Wš +W² -Wš  +W²  -Wš +W² § -W�˜ The document the bytes are in, named as the parse request named it and as +Wµ˜ The document the bytes are in, named as the parse request named it and as ApplyEditsResponse.documents lists it. Set for a single-document model too. -W� +Wµ -W�  +Wµ  -W� +Wµ { -¢¹m EditFailure says why edits were refused. Every refusal is one of these: an +ºÑm EditFailure says why edits were refused. Every refusal is one of these: an edit is never silently dropped. -¢ +º  -£" no failure +»" no failure -£ +» -£ +» ) -¤!" the request named no edit +¼!" the request named no edit -¤ +¼ -¤ +¼ 4 -¥""& no element of that name in the model +½""& no element of that name in the model -¥ +½ -¥ ! +½ ! 5 -¦$"' the name denotes several declarations +¾$"' the name denotes several declarations -¦ +¾ -¦"# +¾"# . -§" the element can carry no value +¿" the element can carry no value -§ +¿ -§ +¿ = -¨!"/ the new value does not parse as an expression +À!"/ the new value does not parse as an expression -¨ +À -¨ +À : -© ", the new name does not lex as an identifier +Á ", the new name does not lex as an identifier -© +Á -© +Á 7 -ª") the element declares no name to rewrite +Â") the element declares no name to rewrite -ª + -ª + 5 -«%"' references to the element would break +Ã%"' references to the element would break -« +à -«#$ +Ã#$ . - ¬%" two edits cover the same bytes + Ä%" two edits cover the same bytes - ¬ + Ä - ¬#$ + Ä#$ A  -­#"3 the edited source has errors the original had not +Å#"3 the edited source has errors the original had not  -­ +Å  -­ " +Å " / - ®""! add-member owner does not exist + Æ""! add-member owner does not exist - ® + Æ - ®! + Æ! , - ¯(" owner cannot contain members + Ç(" owner cannot contain members - ¯" + Ç" - ¯%' + Ç%' 5 - °!"' kind is invalid for document language + È!"' kind is invalid for document language - ° + È - ° + È / -±&"! owner already declares the name +É&"! owner already declares the name -± +É -±#% +É#% - -²&" delete would leave references +Ê&" delete would leave references -² +Ê -²#% +Ê#% 5 -³("' move owner is the target or inside it +Ë("' move owner is the target or inside it -³" +Ë" -³%' +Ë%' A -´$"3 move would leave a reference no spelling restores +Ì$"3 move would leave a reference no spelling restores -´ +Ì -´!# +Ì!# Ç -¸)¸ the target is referred to from a document the edit cannot rewrite: a +Ð)¸ the target is referred to from a document the edit cannot rewrite: a library document, or any other document for a move, which respells references in the target's own document only -¸# +Ð# -¸&( +Ð&( 7 -X¼Í) SymbolInfo represents any SysML element +XÔå) SymbolInfo represents any SysML element -X¼ +XÔ 8 -X½"* Unique identifier (fully qualified name) +XÕ"* Unique identifier (fully qualified name) -X½ +XÕ -X½ +XÕ -X½ +XÕ -X¾ +XÖ -X¾ +XÖ -X¾ +XÖ -X¾ +XÖ 7 -X¿") "PartDefinition", "AttributeUsage", etc +X×") "PartDefinition", "AttributeUsage", etc -X¿ +X× -X¿ +X× -X¿ +X× ' -XÀ#" multiplicity, type, etc +XØ#" multiplicity, type, etc -XÀ +XØ -XÀ +XØ -XÀ!" +XØ!" & -XÁ " References to children +XÙ " References to children -XÁ +XÙ -XÁ  +XÙ  -XÁ +XÙ -XÁ +XÙ -XÂ( +XÚ( -X +XÚ -X  +XÚ  -XÂ# +XÚ# -XÂ&' +XÚ&' M -XÄ? Static type facts; unset when the element is not a def/usage. +XÜ? Static type facts; unset when the element is not a def/usage. -XÄ +XÜ -XÄ  +XÜ  -XÄ +XÜ C -XÆ$5 Declared multiplicity; unset when none is declared. +XÞ$5 Declared multiplicity; unset when none is declared. -XÆ +XÞ -XÆ +XÞ -XÆ"# +XÞ"# § -XÉ.˜ Every generalization edge declared, in declaration order. metadata["type"] +Xá.˜ Every generalization edge declared, in declaration order. metadata["type"] and metadata["specializes"] report only the first, kept for compatibility. -XÉ +Xá -XÉ  +Xá  -XÉ) +Xá) -XÉ,- +Xá,- • -X Ì)† Attributes inherited from standard-library content, which `attributes` +X ä)† Attributes inherited from standard-library content, which `attributes` leaves out. Their absence is stated here rather than silent. -X Ì +X ä -X Ì# +X ä# -X Ì&( +X ä&( N -YÐÙ@ Specialization is one generalization edge an element declares. +Yèñ@ Specialization is one generalization edge an element declares. -YÐ +Yè U -YÒG Relationship kind: "specializes", "subsets", "redefines" or "typing". +YêG Relationship kind: "specializes", "subsets", "redefines" or "typing". -YÒ +Yê -YÒ +Yê -YÒ +Yê O -YÔA The target as written in the source ("Engine", "Demo::Engine"). +YìA The target as written in the source ("Engine", "Demo::Engine"). -YÔ +Yì -YÔ  +Yì  -YÔ +Yì Q -YÖC FQN of the resolved target; empty when the name does not resolve. +YîC FQN of the resolved target; empty when the name does not resolve. -YÖ +Yî -YÖ  +Yî  -YÖ +Yî [ -YØM Symbol kind of the resolved target ("partDef", ...); empty when unresolved. +YðM Symbol kind of the resolved target ("partDef", ...); empty when unresolved. -YØ +Yð -YØ  +Yð  -YØ +Yð œ -ZÝî� TypeInfo is the static type of a usage, or the classification of a +Zõ†� TypeInfo is the static type of a usage, or the classification of a definition, as far as the service derives it without running the model. -ZÝ +Zõ B -Zß4 Type name as written; empty when none is declared. +Z÷4 Type name as written; empty when none is declared. -Zß +Z÷ -Zß  +Z÷  -Zß +Z÷ N -Zá@ FQN of the resolved type; empty when unresolved or undeclared. +Zù@ FQN of the resolved type; empty when unresolved or undeclared. -Zá +Zù -Zá  +Zù  -Zá +Zù R -ZãD Symbol kind of the resolved type ("partDef", "attributeDef", ...). +ZûD Symbol kind of the resolved type ("partDef", "attributeDef", ...). -Zã +Zû -Zã  +Zû  -Zã +Zû ‚ -Zæt Library scalar the type reduces to ("Boolean", "Integer", "Real", ...); +Zþt Library scalar the type reduces to ("Boolean", "Integer", "Real", ...); empty when it is not a scalar value type. -Zæ +Zþ -Zæ  +Zþ  -Zæ +Zþ � -Zé€ Origin of `primitive`: "declared" (from the declared or inherited type), +Z�€ Origin of `primitive`: "declared" (from the declared or inherited type), "value" (inferred from the default value), or empty. -Zé +Z� -Zé  +Z�  -Zé +Z� Z -ZëL Values carry a measurement unit, so such a feature value holds a Quantity. +ZƒL Values carry a measurement unit, so such a feature value holds a Quantity. -Zë +Zƒ -Zë +Zƒ -Zë +Zƒ U -ZíG Unit as written when the default value names one ("m/s"), else empty. +Z…G Unit as written when the default value names one ("m/s"), else empty. -Zí +Z… -Zí +Z… -Zí +Z… | -[òõn MultiplicityInfo is a declared multiplicity range. A bound the service cannot +[Š�n MultiplicityInfo is a declared multiplicity range. A bound the service cannot evaluate statically is empty. -[ò +[Š $ -[ó" "0", "1", … or "*" +[‹" "0", "1", … or "*" -[ó +[‹ -[ó  +[‹  -[ó +[‹  -[ô" "1", "*", … +[Œ" "1", "*", … -[ô +[Œ -[ô  +[Œ  -[ô +[Œ D -\øý6 AttributeInfo represents an attribute with its value +\�•6 AttributeInfo represents an attribute with its value -\ø +\� -\ù +\‘ -\ù +\‘ -\ù +\‘ -\ù +\‘ -\ú +\’ -\ú +\’ -\ú +\’ -\ú +\’ -\û +\“ -\û +\“ -\û +\“ -\û +\“ -\ü +\” -\ü +\” -\ü +\” -\ü +\” : -]€¦, Value represents a runtime-evaluable value +]˜¾, Value represents a runtime-evaluable value -]€ +]˜  -]�¥ +]™½ -]� +]™ -]‚ +]š -]‚ +]š -]‚ +]š  -]‚ +]š -]ƒ +]› -]ƒ +]› -]ƒ  +]›  -]ƒ +]› -]„ +]œ -]„ +]œ -]„  +]œ  -]„ +]œ -]… +]� -]… +]� -]…  +]�  -]… +]� % -]†" reference to Instance +]ž" reference to Instance -]† +]ž -]† +]ž  -]† +]ž -]‡ +]Ÿ -]‡ +]Ÿ -]‡ +]Ÿ -]‡ +]Ÿ . -]ˆ" marker for null (empty string) +] " marker for null (empty string) -]ˆ +]  -]ˆ  +]   -]ˆ +]  9 -]‰"+ magnitude and the unit it is expressed in +]¡"+ magnitude and the unit it is expressed in -]‰ +]¡ -]‰  +]¡  -]‰ +]¡ -]Š! +]¢! -]Š +]¢ -]Š +]¢ -]Š +]¢ œ -] �� A valueless feature of a value type: materialized, holding no value. +] ¥� A valueless feature of a value type: materialized, holding no value. Always true when set; a value the server sends, never one it accepts. -] � +] ¥ -] �  +] ¥  -] � +] ¥ 3 ] -Ž"% one complex number, never two Reals +¦"% one complex number, never two Reals ] -Ž +¦ ] -Ž  +¦  ] -Ž +¦ 9 -] �"+ shape and elements, never a flat sequence +] §"+ shape and elements, never a flat sequence -] � +] § -] � +] §  -] � +] § 4 -] �"& numeric components, never a sequence +] ¨"& numeric components, never a sequence -] � +] ¨ -] �  +] ¨  -] � +] ¨ / -] ‘("! components each with their unit +] ©("! components each with their unit -] ‘ +] © -] ‘" +] ©" -] ‘%' +] ©%' . -]’(" a unit by itself, no magnitude +]ª(" a unit by itself, no magnitude -]’ +]ª -]’" +]ª" -]’%' +]ª%' Á -]–² The unbounded value `*`, which is no number and no string: ordered above +]®² The unbounded value `*`, which is no number and no string: ordered above every finite magnitude and refused by arithmetic. Always true when set, as DocumentValue.infinity is. -]– +]® -]–  +]®  -]– +]® ; -]—"- a calc as a value, named by its declaration +]¯"- a calc as a value, named by its declaration -]— +]¯ -]—  +]¯  -]— +]¯ < -]˜". distinct elements with no order of their own +]°". distinct elements with no order of their own -]˜ +]° -]˜  +]°  -]˜ +]° 4 -]™("& shape and one Quantity per component +]±("& shape and one Quantity per component -]™ +]± -]™" +]±" -]™%' +]±%' 8 -]š"* an element reflected on as its metaclass +]²"* an element reflected on as its metaclass -]š +]² -]š +]² -]š +]² † -]�#x A result the model leaves open: not an error, but no definite answer. +]µ#x A result the model leaves open: not an error, but no definite answer. A value the server sends, never one it accepts. -]� +]µ -]� +]µ -]� " +]µ " ™ -] Š An Integer beyond int64, in decimal (`-` signed, no `+`, no leading +]¸Š An Integer beyond int64, in decimal (`-` signed, no `+`, no leading zeros). An Integer that fits int64 is always int_value, never this. -]  +]¸ -]   +]¸  -]  +]¸ ç -]¤!Ø An exact Rational (KerML 9.3.2.2.8), as `0.1` or `1 / 3` evaluates. The +]¼!Ø An exact Rational (KerML 9.3.2.2.8), as `0.1` or `1 / 3` evaluates. The server answers one a double holds exactly as real_value; a client sends any exact Rational here, and an inbound real_value is always a Real. -]¤ +]¼ -]¤  +]¼  -]¤ +]¼ û -^«®ì Rational is an exact rational number in lowest terms: numerator over a +^ÃÆì Rational is an exact rational number in lowest terms: numerator over a positive denominator, each written as big_int_value is. The server rejects one not in lowest terms; a client also rejects an answered one a double holds exactly. -^« +^à -^¬ +^Ä -^¬ +^Ä -^¬  +^Ä  -^¬ +^Ä -^­ +^Å -^­ +^Å -^­  +^Å  -^­ +^Å Ç -_¶¿¸ Metaobject is an element of the model held as an instance of its reflective +_Î׸ Metaobject is an element of the model held as an instance of its reflective metaclass: what `x meta KerML::Feature`, or the last element of `x.metadata`, evaluates to (KerML 7.4.9.2, 8.3.4.8.15). It crosses as the element it reflects, which is its identity: two metaobjects are the same @@ -8706,61 +8751,61 @@ D (`declaredName`, `ownedFeature`, ...) are read in the model, not carried. -_¶ +_Î T -_¸F FQN of the element reflected on ("Vehicle::seatBelt"). Its identity. +_ÐF FQN of the element reflected on ("Vehicle::seatBelt"). Its identity. -_¸ +_Ð -_¸  +_Ð  -_¸ +_Ð Ù -_¾Ê FQN of the element's own reflective metaclass ("SysML::Systems::PartUsage"), +_ÖÊ FQN of the element's own reflective metaclass ("SysML::Systems::PartUsage"), the most specific metaclass of the KerML or SysML library classifying it; not the type it was cast to. The service always sends it; a client may omit it, in which case the model's is used, but one sent must be the model's or the value is rejected. -_¾ +_Ö -_¾  +_Ö  -_¾ +_Ö ä -`ÆÎÕ Undetermined is the model-level result of an expression the model does not +`ÞæÕ Undetermined is the model-level result of an expression the model does not decide: it reads a feature no value is given (`attribute u;`) or counts a feature whose multiplicity fixes no count (`part gear[1..*]`). The expression is well-formed and evaluation succeeded; the answer is open. Every other surface spells it ``. -`Æ +`Þ c -`ÉU Why the model leaves the result open, for a reader: +`áU Why the model leaves the result open, for a reader: "u has no value in the model". -`É +`á -`É  +`á  -`É +`á Ý -`ÍÎ How many values the result would hold, as far as the model fixes it: +`åÎ How many values the result would hold, as far as the model fixes it: `1..1` for an arithmetic result over an unbound scalar, `1..*` for the elements of a `[1..*]` feature, `0..*` where nothing is known. -`Í +`å -`Í +`å -`Í +`å ¼ -aÖß­ Function is a calc held as a value: a calc definition, or a calc usage with +aî÷­ Function is a calc held as a value: a calc definition, or a calc usage with an input no read could supply, as `Sq` in `Fn(Sq, 3.0)` or the `f` of `in calc f {...}`. It crosses as the declaration it is a value of, which is its identity: two functions are the same exactly when calc_id and self_id @@ -8768,31 +8813,31 @@ c declared in has no wire form and crosses as the null arm. -aÖ +aî K -aØ= FQN of the calc declaration ("Analysis::Sq"). Its identity. +að= FQN of the calc declaration ("Analysis::Sq"). Its identity. -aØ +að -aØ  +að  -aØ +að È -aÞ¹ ID of the object the calc's feature names resolve against, for a calc +aö¹ ID of the object the calc's feature names resolve against, for a calc usage read off a part (`holder.scale`); 0 for a function closing over no object. An instance id, living only within the response that sent it: a request function with a non-zero self_id is rejected, since no later call holds that object. -aÞ +aö -aÞ +aö -aÞ +aö Ë -béë¼ ValueSet is a unique, unordered collection — a Collections::Set's elements — +b�ƒ¼ ValueSet is a unique, unordered collection — a Collections::Set's elements — as distinct from a ValueSequence, whose order is part of its value. Two sets are equal when they hold the same elements in any order. The service sends the elements in the runtime's canonical order (Booleans, numbers, strings, @@ -8802,304 +8847,304 @@ K is what a sequence carries. -bé +b� -bê +b‚ -bê +b‚ -bê  +b‚  -bê +b‚ -bê +b‚ ¾ -cñ÷¯ TensorQuantity is a Quantities::TensorQuantityValue of any rank: its +c‰�¯ TensorQuantity is a Quantities::TensorQuantityValue of any rank: its dimensions and, flattened in row-major order under them, one Quantity per component, each with its unit and reduction as a scalar Quantity carries them. A tensor of rank one is not a VectorQuantity, on the wire as in the runtime. -cñ +c‰ � -cô Ž Positive extents, one per rank; their product (one for rank 0) is how many +cŒ Ž Positive extents, one per rank; their product (one for rank 0) is how many components there are, and a tensor not filling them is rejected. -cô +cŒ -cô  +cŒ  -cô +cŒ -cô +cŒ W -cö#I A named unit sent without its unit_term is rejected as a Quantity's is. +cŽ#I A named unit sent without its unit_term is rejected as a Quantity's is. -cö +cŽ -cö  +cŽ  -cö +cŽ -cö!" +cŽ!" ¤ -dû�• Array is a Collections::Array: its elements flattened in row-major order +d“™• Array is a Collections::Array: its elements flattened in row-major order under its dimensions, compared by content rather than by the object read. -dû +d“ › -dþ Œ Positive extents, one per rank; their product (one for rank 0) is how many +d– Œ Positive extents, one per rank; their product (one for rank 0) is how many elements there are, and an array not filling them is rejected. -dþ +d– -dþ  +d–  -dþ +d– -dþ +d– W -d€I Any Value each, so an array of quantities or of arrays crosses as such. +d˜I Any Value each, so an array of quantities or of arrays crosses as such. -d€ +d˜ -d€  +d˜  -d€ +d˜ -d€ +d˜ u -e…‰g Vector is a VectorValues::NumericalVectorValue: its components in order, +e�¡g Vector is a VectorValues::NumericalVectorValue: its components in order, its dimension their number. -e… +e� ¡ -eˆ ’ Each an int_value or a real_value, kept apart as the rest of Value does; +e  ’ Each an int_value or a real_value, kept apart as the rest of Value does; a component of any other arm is rejected rather than read as a number. -eˆ +e  -eˆ  +e   -eˆ +e  -eˆ +e    -f�‘‘ VectorQuantity is a Quantities::VectorQuantityValue: one Quantity per axis, +f¥©‘ VectorQuantity is a Quantities::VectorQuantityValue: one Quantity per axis, unit and reduction included, since the axes need not share a unit. -f� +f¥ | -f�#n At least one (num is Number[1..*]); a named unit sent without its +f¨#n At least one (num is Number[1..*]); a named unit sent without its unit_term is rejected as a Quantity's is. -f� +f¨ -f�  +f¨  -f� +f¨ -f�!" +f¨!" œ -g•˜� Complex is one complex number in rectangular form. It crosses as one value +g­°� Complex is one complex number in rectangular form. It crosses as one value so `1.0 + 2.0i` cannot be mistaken for a sequence of two Reals. -g• +g­ -g– +g® -g– +g® -g– +g® -g– +g® -g— +g¯ -g— +g¯ -g—  +g¯  -g— +g¯ ÷ -h�§è EnumLiteral is one literal of an enumeration definition. A literal is its own +hµ¿è EnumLiteral is one literal of an enumeration definition. A literal is its own identity, so it travels as the declaration it names rather than as a number or a string: two values are the same literal exactly when `literal_id` is. -h� +hµ Q -hŸC FQN of the literal's declaration ("D::Color::red"). Its identity. +h·C FQN of the literal's declaration ("D::Color::red"). Its identity. -hŸ +h· -hŸ  +h·  -hŸ +h· L -h¡> FQN of the enumeration definition declaring it ("D::Color"). +h¹> FQN of the enumeration definition declaring it ("D::Color"). -h¡ +h¹ -h¡  +h¹  -h¡ +h¹ A -h£3 The literal as a reader writes it ("Color::red"). +h»3 The literal as a reader writes it ("Color::red"). -h£ +h» -h£ +h» -h£ +h» � -h¦Ž The scalar the literal equals (`high = 3` carries int_value 3); unset for a +h¾Ž The scalar the literal equals (`high = 3` carries int_value 3); unset for a literal that is only its identity. Identity stays `literal_id`. -h¦ +h¾ -h¦ +h¾ -h¦ +h¾ -i©« +iÁà -i© +iÁ -iª +i -iª +i -iª  +i  -iª +i -iª +i « -j¯Àœ Quantity is a magnitude and the measurement reference it is expressed in, sent +jÇØœ Quantity is a magnitude and the measurement reference it is expressed in, sent in the unit written: `5.4 [km/h]` crosses as 5.4 `km/h`, not as 1.5 `m/s`. -j¯ +jÇ V -j±¸F Magnitude, keeping Integer and Real apart as the rest of Value does. +jÉÐF Magnitude, keeping Integer and Real apart as the rest of Value does. -j± +jÉ -j² +jÊ -j² +jÊ -j² +jÊ  -j² +jÊ -j³ +jË -j³ +jË -j³  +jË  -j³ +jË V -jµ!H An Integer magnitude beyond int64, in decimal, as Value.big_int_value. +jÍ!H An Integer magnitude beyond int64, in decimal, as Value.big_int_value. -jµ +jÍ -jµ  +jÍ  -jµ +jÍ E -j·$7 An exact Rational magnitude, as Value.rational_value. +jÏ$7 An exact Rational magnitude, as Value.rational_value. -j· +jÏ -j·  +jÏ  -j·"# +jÏ"# ’ -j»ƒ Unit as written ("km/h") or as an operation composed it ("m/s"); empty for +jÓƒ Unit as written ("km/h") or as an operation composed it ("m/s"); empty for one never written down, described by unit_term alone. -j» +jÓ -j» +jÓ -j» +jÓ Ö -j¿Ç What the unit reduces to, which decides commensurability and conversion. +j×Ç What the unit reduces to, which decides commensurability and conversion. Required wherever `unit` names one: a named unit sent without its reduction is rejected rather than read as dimension one. -j¿ +j× -j¿  +j×  -j¿ +j× ô -kÇ×å MeasurementRef is a MeasurementReferences::ScalarMeasurementReference held as +kßïå MeasurementRef is a MeasurementReferences::ScalarMeasurementReference held as a value: a unit by itself — `SI::m`, `km`, or `m / s` as an operation composed it — as distinct from a Quantity expressed in one. It carries what the runtime value carries: the unit as written and what it reduces to, plus the one declaration it names when it names one. -kÇ +kß � -kÊ� Unit as written ("km") or as an operation composed it ("m/s"); empty for +kâ� Unit as written ("km") or as an operation composed it ("m/s"); empty for one never written down, described by unit_term alone. -kÊ +kâ -kÊ +kâ -kÊ +kâ » -kά What the unit reduces to. Required wherever `unit` names one, as a +kæ¬ What the unit reduces to. Required wherever `unit` names one, as a Quantity's is: a named unit sent without its reduction is rejected rather than read as dimension one. -kÎ +kæ -kÎ  +kæ  -kÎ +kæ î -kÖß FQN of the one unit declaration the reference names ("SI::kilometre"), which +kîß FQN of the one unit declaration the reference names ("SI::kilometre"), which is what tells the declared unit `km` from any other spelling of 1000 metres; empty for a unit composed of several ("m/s"), which names no declaration. The service always sends it for a named unit. A client may omit it, in @@ -9108,201 +9153,201 @@ E spells, or the value is rejected. -kÖ +kî -kÖ  +kî  -kÖ +kî ‡ -lÛáy UnitTerm is a unit reduced to a scale factor over base units: `km/h` reduces +lóùy UnitTerm is a unit reduced to a scale factor over base units: `km/h` reduces to 1000/3600 over `SI::m` and `SI::s^-1`. -lÛ +ló R -lÝD Scale as an unevaluated ratio, so an exact conversion stays exact. +lõD Scale as an unevaluated ratio, so an exact conversion stays exact. -lÝ +lõ -lÝ  +lõ  -lÝ +lõ -lÞ +lö -lÞ +lö -lÞ  +lö  -lÞ +lö H -là": Base units of the reduction, carrying no zero exponents. +lø": Base units of the reduction, carrying no zero exponents. -là +lø -là  +lø  -là +lø -là ! +lø ! B -mäè4 UnitFactor is one base unit raised to an exponent. +mü€4 UnitFactor is one base unit raised to an exponent. -mä +mü K -mæ= FQN of the base unit ("SI::m"), naming it across processes. +mþ= FQN of the base unit ("SI::m"), naming it across processes. -mæ +mþ -mæ  +mþ  -mæ +mþ -mç +mÿ -mç +mÿ -mç  +mÿ  -mç +mÿ G -nëù9 Diagnostic represents a parse/semantic error or warning +nƒ‘9 Diagnostic represents a parse/semantic error or warning -në +nƒ * -nì" "error", "warning", "info" +n„" "error", "warning", "info" -nì +n„ -nì  +n„  -nì +n„ -ní +n… -ní +n… -ní  +n…  -ní +n… -nî +n† -nî +n† -nî +n† -nî +n† ª -nñ› Stable identifier to branch on instead of the message: a pass or rule code, +n‰› Stable identifier to branch on instead of the message: a pass or rule code, "syntax", "choice-point", "guard-unevaluable"; empty when none was assigned. -nñ +n‰ -nñ +n‰ -nñ +n‰ ë -nõ&Ü On a "choice-point": the features the conflicting alternatives wrote, whose +n�&Ü On a "choice-point": the features the conflicting alternatives wrote, whose values the run holds only up to the order it took; empty when the alternatives commute (`independent`) or conflict on nothing a value names. -nõ +n� -nõ  +n�  -nõ! +n�! -nõ$% +n�$% ‚ -nøt On a "choice-point": the alternatives commute by their footprints, so the +n�t On a "choice-point": the alternatives commute by their footprints, so the run's values stand whichever was taken. -nø +n� -nø +n� -nø +n� 1 -oü‚# Span represents a source location +o”š# Span represents a source location -oü +o” -oý +o• -oý +o• -oý +o• -oý +o• -oþ +o– -oþ +o– -oþ +o– -oþ +o– -oÿ +o— -oÿ +o— -oÿ +o— -oÿ +o— -o€ +o˜ -o€ +o˜ -o€ +o˜ -o€ +o˜ -o� +o™ -o� +o™ -o� +o™ -o� +o™ … -p†y ServerInfoRequest asks the service to describe itself. It carries no fields; +pžy ServerInfoRequest asks the service to describe itself. It carries no fields; the answer does not depend on the caller. -p† +pž A -q‰Œ3 ServerInfoResponse describes the running service. +q¡¤3 ServerInfoResponse describes the running service. -q‰ +q¡ Ò -q�à Build version of the service binary, informational only: it is "dev" for a +q¥Ã Build version of the service binary, informational only: it is "dev" for a build without release ldflags, and versions of forks are not comparable. Feature decisions belong in `capabilities`. -q� +q¥ -q�  +q¥  -q� +q¥ ™C -q‹#ŠC Named capabilities this build supports, each an exact string a client can +q£#ŠC Named capabilities this build supports, each an exact string a client can require. Capabilities are only ever added, never renamed or removed with their behaviour intact, so requiring one is stable across releases. Currently defined: @@ -9429,1463 +9474,1463 @@ A refused with FAILED_PRECONDITION. -q‹ +q£ -q‹  +q£  -q‹ +q£ -q‹!" +q£!" U -r�”G QueryRequest runs a Query against a model the service already parsed. +r§¬G QueryRequest runs a Query against a model the service already parsed. -r� +r§ ' -r�" from ParseFile response +r¨" from ParseFile response -r� +r¨ -r�  +r¨  -r� +r¨ -r‘ +r© -r‘ +r© -r‘ +r© -r‘ +r© M -r“? OSLC Query 3.0 parameter text, mutually exclusive with query. +r«? OSLC Query 3.0 parameter text, mutually exclusive with query. -r“ +r« -r“  +r«  -r“ +r« • -sšœ† QueryResponse contains the elements the query selected, in the order they are +s²´† QueryResponse contains the elements the query selected, in the order they are declared in the model. A query that matches nothing answers with no elements; a query the service cannot evaluate fails the call with INVALID_ARGUMENT rather than answering empty. -sš +s² -s›+ +s³+ -s› +s³ -s›  +s³  -s›& +s³& -s›)* +s³)* · -t¢¯¨ Query is the standard's Query resource (SysML v2 API & Services). Its `@type` +tºÇ¨ Query is the standard's Query resource (SysML v2 API & Services). Its `@type` is fixed and carries no information on the wire, and its identity fields (`@id`, `owningProject`) belong to a repository that stores queries, which this service is not: it evaluates a query against a parsed model. -t¢ +tº è -t¦Ù Elements the query considers, each named by qualified name, together with +t¾Ù Elements the query considers, each named by qualified name, together with every element nested inside them. Empty considers the whole loaded model. Corresponds to the standard's `scope` of DataIdentity references. -t¦ +t¾ -t¦  +t¾  -t¦ +t¾ -t¦ +t¾ Y -t¨K Properties to report for each matched element. Empty reports all of them. +tÀK Properties to report for each matched element. Empty reports all of them. -t¨ +tÀ -t¨  +tÀ  -t¨ +tÀ -t¨ +tÀ X -tªJ Filter every considered element must satisfy. Unset matches all of them. +tÂJ Filter every considered element must satisfy. Unset matches all of them. -tª +t -tª  +t  -tª +t è -t®Ù Properties the matched elements are sorted by, in order of precedence, +tÆÙ Properties the matched elements are sorted by, in order of precedence, each ascending; elements equal under every one keep declaration order. Corresponds to the standard's `orderBy`. An unknown one fails the call. -t® +tÆ -t®  +tÆ  -t® +tÆ -t® +tÆ ¤ -u³¸• Constraint is the standard's Constraint, whose `@type` discriminates between +uËЕ Constraint is the standard's Constraint, whose `@type` discriminates between its two forms. On the wire the form is the oneof arm, not a type tag. -u³ +uË  -u´· +uÌÏ -u´ +uÌ -uµ& +uÍ& -uµ +uÍ -uµ! +uÍ! -uµ$% +uÍ$% -u¶& +uÎ& -u¶ +uÎ -u¶! +uÎ! -u¶$% +uÎ$% X -v»ÆJ PrimitiveConstraint compares one property of an element against a value. +vÓÞJ PrimitiveConstraint compares one property of an element against a value. -v» +vÓ 1 -v½# Negates the comparison's verdict. +vÕ# Negates the comparison's verdict. -v½ +vÕ -v½ +vÕ -v½ +vÕ § -vÀ˜ Property to compare, as named in docs/reference/api.md's query property table +vؘ Property to compare, as named in docs/reference/api.md's query property table ("@type", "name", "qualifiedName", ...). An unknown one fails the call. -vÀ +vØ -vÀ  +vØ  -vÀ +vØ -vÁ! +vÙ! -vÁ +vÙ -vÁ +vÙ -vÁ +vÙ ï -vÅà Values to compare against. The standard writes one value, and its clients +vÝà Values to compare against. The standard writes one value, and its clients also write a list for `@type`; with `=`, `in` and `instanceOf` the element matches any of them, while `<`, `<=`, `>` and `>=` require exactly one. -vÅ +vÝ -vÅ  +vÝ  -vÅ +vÝ -vÅ +vÝ € -Ê×r PrimitiveOperator is the standard's PrimitiveConstraint.operator, the seven +âïr PrimitiveOperator is the standard's PrimitiveConstraint.operator, the seven literals of API & Services §7.1.4. -Ê +â % -Ë%" unset; fails the call +ã%" unset; fails the call -Ë +ã -Ë#$ +ã#$  -Ì" "=" +ä" "=" -Ì +ä -Ì +ä  -Í!" ">" +å!" ">" -Í +å -Í +å  -Î" "<" +æ" "<" -Î +æ -Î +æ  -Ï$" "<=" +ç$" "<=" -Ï +ç -Ï"# +ç"#  -Ð'" ">=" +è'" ">=" -Ð" +è" -Ð%& +è%& G -Ò9 "in": the property's value is one of the listed values. +ê9 "in": the property's value is one of the listed values. -Ò +ê -Ò +ê ½ -Ö%® "instanceOf": the element's metaclass (`property` must be "@type") +î%® "instanceOf": the element's metaclass (`property` must be "@type") conforms to one of the listed metaclasses, so a PartUsage is an instance of Usage, Feature and Element. -Ö +î -Ö#$ +î#$ ì -wÜßÝ CompositeConstraint combines constraints. The standard combines at least two +wô÷Ý CompositeConstraint combines constraints. The standard combines at least two (`constraint : Constraint [2..*]`): an empty list has no defensible verdict, and a one-member list is that member, so either fails the call. -wÜ +wô -wÝ! +wõ! -wÝ +wõ -wÝ +wõ -wÝ +wõ -wÞ% +wö% -wÞ +wö -wÞ  +wö  -wÞ +wö -wÞ#$ +wö#$ Q -âæC CompositeOperator is the standard's CompositeConstraint.operator. +úþC CompositeOperator is the standard's CompositeConstraint.operator. -â +ú % -ã%" unset; fails the call +û%" unset; fails the call -ã +û -ã#$ +û#$  -ä" "and" +ü" "and" -ä +ü -ä +ü  -å" "or" +ý" "or" -å +ý -å +ý ô -xìðå QueryResultElement is one matched element. `id` and `type` are always +x„ˆå QueryResultElement is one matched element. `id` and `type` are always reported, since an element record is not usable without them; `properties` carries what `select` asked for, omitting a property the element does not have. -xì +x„ A -xí"3 qualified name, the identity this service reports +x…"3 qualified name, the identity this service reports -xí +x… -xí +x… -xí +x… H -xî": metamodel type name ("PartUsage", "PartDefinition", ...) +x†": metamodel type name ("PartUsage", "PartDefinition", ...) -xî +x† -xî +x† -xî +x† -xï% +x‡% -xï +x‡ -xï +x‡ -xï#$ +x‡#$ à -y÷€Ñ SweepRange is one parameter's range: the endpoints a swept run advances +y�˜Ñ SweepRange is one parameter's range: the endpoints a swept run advances between and the step it advances by, typed by the parameter it binds rather than by how they are written. A sampled range states no step; a swept range between whole numbers steps by one where it states none, and one with a fractional endpoint must state one. -y÷ +y� Š -yú| Name of the input parameter the range binds, which the target must declare +y’| Name of the input parameter the range binds, which the target must declare and the request's own arguments must not bind. -yú +y’ -yú  +y’  -yú +y’ ” -yý… The endpoint the range's runs start at, and the one they run to, which is +y•… The endpoint the range's runs start at, and the one they run to, which is inclusive where the step lands on it. Both are required. -yý +y• -yý +y• -yý +y• -yþ +y– -yþ +y– -yþ +y– -yþ +y– -yÿ +y— -yÿ +y— -yÿ +y— -yÿ +y— ¹ -z†�ª RunSweepRequest runs one analysis case or calc once per row of a sweep. Every +zžµª RunSweepRequest runs one analysis case or calc once per row of a sweep. Every row is an ordinary run of that target with the swept parameters bound to the row's values and the request's other arguments as given: this is tool-defined orchestration, and changes nothing about how a run executes. -z† +zž -z‡ +zŸ -z‡ +zŸ -z‡  +zŸ  -z‡ +zŸ F -z‰8 FQN of the analysis case or calc, definition or usage. +z¡8 FQN of the analysis case or calc, definition or usage. -z‰ +z¡ -z‰  +z¡  -z‰ +z¡ ­ -zŒž Optional FQN of a part/usage to instantiate as an analysis case's subject, +z¤ž Optional FQN of a part/usage to instantiate as an analysis case's subject, or a path from one to a nested object; see RunAnalysisRequest.subject_symbol_id. -zŒ +z¤ -zŒ  +z¤  -zŒ +z¤ w -z�i Positional arguments for the target's input parameters, in declaration +z§i Positional arguments for the target's input parameters, in declaration order, as every row binds them. -z� +z§ -z�  +z§  -z� +z§ -z� +z§ U -z‘)G Arguments bound to input parameters by name, as every row binds them. +z©)G Arguments bound to input parameters by name, as every row binds them. -z‘ +z© -z‘$ +z©$ -z‘'( +z©'( � -z”!s The ranges swept, which several of make one row per point of their +z¬!s The ranges swept, which several of make one row per point of their cartesian product, the first varying slowest. -z” +z¬ -z”  +z¬  -z” +z¬ -z” +z¬ ¤ -z—• Rows to draw uniformly from each range instead of stepping through it. 0 +z¯• Rows to draw uniformly from each range instead of stepping through it. 0 steps through them; above 0 needs a seed and refuses a range with a step. -z— +z¯ -z— +z¯ -z— +z¯ “ -zš„ Seed the draws are taken from: the same seed draws the same table on every +z²„ Seed the draws are taken from: the same seed draws the same table on every platform. Required with `samples`, ignored without it. -zš +z² -zš +z² -zš +z² S -zœE The engine the sweep is put to; see VerifyConstraintRequest.engine. +z´E The engine the sweep is put to; see VerifyConstraintRequest.engine. -zœ +z´ -zœ  +z´  -zœ +z´ Ô -{¢´Å SweepRow is one run of a sweep: what it bound, what it produced, how long it +{ºÌÅ SweepRow is one run of a sweep: what it bound, what it produced, how long it took, and what stopped it where it failed. A failed row is reported as a row, so one failure does not end the table. -{¢ +{º T -{¤!F The parameters this row bound, in the order their ranges were given. +{¼!F The parameters this row bound, in the order their ranges were given. -{¤ +{¼ -{¤  +{¼  -{¤ +{¼ -{¤ +{¼ n -{§"` What the run produced: an analysis case's outputs, or a calc's returned +{¿"` What the run produced: an analysis case's outputs, or a calc's returned value named "result". -{§ +{¿ -{§  +{¿  -{§ +{¿ -{§ ! +{¿ ! S -{© E What the case's objective and assertions decided; empty for a calc. +{Á E What the case's objective and assertions decided; empty for a calc. -{© +{Á -{©  +{Á  -{© +{Á -{© +{Á 7 -{«) Wall time of this run, in microseconds. +{Ã) Wall time of this run, in microseconds. -{« +{à -{« +{à -{« +{à Ÿ -{®� Set when this run failed rather than the table failing. The outputs and +{Æ� Set when this run failed rather than the table failing. The outputs and evaluations the run made before failing are still reported beside it. -{® +{Æ -{®  +{Æ  -{® +{Æ 5 -{°#' What kind of failure `error` reports. +{È#' What kind of failure `error` reports. -{° +{È -{° +{È -{°!" +{È!" • -{³*† Each application this run made of one of the case's own calcs as a +{Ë*† Each application this run made of one of the case's own calcs as a function value, as RunAnalysisResponse.evaluations reports them. -{³ +{Ë -{³  +{Ë  -{³% +{Ë% -{³() +{Ë() Ë -|¹Ñ¼ RunSweepResponse carries the table, one row per run, in the order the runs +|Ñé¼ RunSweepResponse carries the table, one row per run, in the order the runs were made: lexicographically over the ranges as given for a swept table, and in draw order for a sampled one. -|¹ +|Ñ -|º +|Ò -|º +|Ò -|º  +|Ò  -|º +|Ò -|º +|Ò y -|½!k The swept parameters, in the order their ranges were given, which is the +|Õ!k The swept parameters, in the order their ranges were given, which is the order each row's inputs are in. -|½ +|Õ -|½  +|Õ  -|½ +|Õ -|½ +|Õ H -|¿: Whether the rows were drawn rather than stepped through. +|×: Whether the rows were drawn rather than stepped through. -|¿ +|× -|¿ +|× -|¿ +|× W -|ÁI The seed the rows were drawn from, echoed so a table can be reproduced. +|ÙI The seed the rows were drawn from, echoed so a table can be reproduced. -|Á +|Ù -|Á +|Ù -|Á +|Ù ¢ -|Ä“ Set when no run was made at all — an unknown symbol, a parameter the target +|Ü“ Set when no run was made at all — an unknown symbol, a parameter the target does not declare, a range no values follow from, a budget refusal. -|Ä +|Ü -|Ä  +|Ü  -|Ä +|Ü -|Å& +|Ý& -|Å +|Ý -|Å  +|Ý  -|Å! +|Ý! -|Å$% +|Ý$% 5 -|Ç#' What kind of failure `error` reports. +|ß#' What kind of failure `error` reports. -|Ç +|ß -|Ç +|ß -|Ç!" +|ß!" ƒ -|Ê"u Every object a row's verdict is about, from every run of the table, so each +|â"u Every object a row's verdict is about, from every run of the table, so each verdict's `instance_id` resolves here. -|Ê +|â -|Ê  +|â  -|Ê +|â -|Ê ! +|â ! ê -|ÎÛ The engine that ran the table, the strength of its evidence and the bounds +|æÛ The engine that ran the table, the strength of its evidence and the bounds it ran under, as Verdict carries them; each row's verdicts carry the same. Empty when no run was made. Reported as the "engines" capability. -|Î +|æ -|Î  +|æ  -|Î +|æ -| Ï +| ç -| Ï +| ç -| Ï  +| ç  -| Ï +| ç | -Ð +è | -Ð +è | -Ð  +è  | -Ð +è | -Ð +è ó -}Öøä RunRunsRequest runs one behavior repeatedly: an action, whose features and +}î�ä RunRunsRequest runs one behavior repeatedly: an action, whose features and clock the runs observe, or a Simulation::MonteCarlo analysis case, whose declared observable each run reports and which is concluded over the sample. -}Ö +}î -}× +}ï -}× +}ï -}×  +}ï  -}× +}ï i -}Ú[ FQN of the action to run; exactly one of action_symbol_id and +}ò[ FQN of the action to run; exactly one of action_symbol_id and analysis_symbol_id is set. -}Ú +}ò -}Ú  +}ò  -}Ú +}ò U -}Ü G FQN of the Simulation::MonteCarlo analysis case, definition or usage. +}ô G FQN of the Simulation::MonteCarlo analysis case, definition or usage. -}Ü +}ô -}Ü  +}ô  -}Ü +}ô 7 -}Þ ) The action's input parameters, by name. +}ö ) The action's input parameters, by name. -}Þ +}ö -}Þ +}ö -}Þ +}ö � -}á!Ž Optional FQN of a part/usage to perform the action on, or a path from one +}ù!Ž Optional FQN of a part/usage to perform the action on, or a path from one to a nested object; see ExecuteActionRequest.performer_symbol_id. -}á +}ù -}á  +}ù  -}á +}ù ] -}ãO Optional FQN of the case's subject; see RunAnalysisRequest.subject_symbol_id. +}ûO Optional FQN of the case's subject; see RunAnalysisRequest.subject_symbol_id. -}ã +}û -}ã  +}û  -}ã +}û S -}åE The case's positional and named arguments, as every run binds them. +}ýE The case's positional and named arguments, as every run binds them. -}å +}ý -}å  +}ý  -}å +}ý -}å +}ý -}æ) +}þ) -}æ +}þ -}æ$ +}þ$ -}æ'( +}þ'( 8 -}è* How many runs to make; must be positive. +}€* How many runs to make; must be positive. -}è +}€ -}è +}€ -}è +}€ à -} ì´ Seed the runs draw their modeled randomness from, one derived seed per run: +} „´ Seed the runs draw their modeled randomness from, one derived seed per run: the same seed makes the same runs on every platform. Required unless the draws are fixed by `draws`. -} ì +} „ -} ì  +} „  -} ì +} „ -} ì +} „  } -ïq Draw policy for the model's distributions, as the CLI's -draws: "random" +‡q Draw policy for the model's distributions, as the CLI's -draws: "random" (default), "min", "max" or "average". } -ï +‡ } -ï  +‡  } -ï +‡ V -} ñH Clock step of each run, as the CLI's -clock-step; 0 keeps the default. +} ‰H Clock step of each run, as the CLI's -clock-step; 0 keeps the default. -} ñ +} ‰ -} ñ  +} ‰  -} ñ +} ‰ Ò -} õà Features of the action each run reports, "clock" for the time it completed +} �à Features of the action each run reports, "clock" for the time it completed at; empty reports every feature the action holds and the clock. Refused for a case, which observes what it declares. -} õ +} � -} õ  +} �  -} õ +} � -} õ +} � S -} ÷E The engine the runs are put to; see VerifyConstraintRequest.engine. +} �E The engine the runs are put to; see VerifyConstraintRequest.engine. -} ÷ +} � -} ÷  +} �  -} ÷ +} � R -~ûŒD RunDistribution summarises one observable over the completed runs. +~“¤D RunDistribution summarises one observable over the completed runs. -~û +~“ -~ü +~” -~ü +~” -~ü +~” -~ü +~” Z -~þL The unit the numbers carry, empty when none or the values are not numbers. +~–L The unit the numbers carry, empty when none or the values are not numbers. -~þ +~– -~þ +~– -~þ +~– < -~€. Completed runs that produced the observable. +~˜. Completed runs that produced the observable. -~€ +~˜ -~€ +~˜ -~€ +~˜ ¡ -~ƒ’ Whether the values are numbers, so min/max/mean/deviation/percentiles and +~›’ Whether the values are numbers, so min/max/mean/deviation/percentiles and the histogram are set; otherwise `values` counts each distinct value. -~ƒ +~› -~ƒ +~› -~ƒ +~› -~„ +~œ -~„ +~œ -~„ +~œ -~„ +~œ -~… +~� -~… +~� -~… +~� -~… +~� -~† +~ž -~† +~ž -~† +~ž -~† +~ž 9 -~ˆ+ Sample standard deviation of the numbers. +~ + Sample standard deviation of the numbers. -~ˆ +~  -~ˆ  +~   -~ˆ +~  -~‰) +~¡) -~‰ +~¡ -~‰  +~¡  -~‰$ +~¡$ -~‰'( +~¡'( -~ Š* +~ ¢* -~ Š +~ ¢ -~ Š  +~ ¢  -~ Š$ +~ ¢$ -~ Š') +~ ¢') ~ -‹' +£' ~ -‹ +£ ~ -‹  +£  ~ -‹! +£! ~ -‹$& +£$& Q -�’C RunPercentile is the value at a percentile of the completed runs. +§ªC RunPercentile is the value at a percentile of the completed runs. -� +§ -� +¨ -� +¨ -�  +¨  -� +¨ -‘ +© -‘ +© -‘ +© -‘ +© | -€–šm RunHistogramBin counts the runs whose number fell in [low, high]; a single +€®²m RunHistogramBin counts the runs whose number fell in [low, high]; a single distinct value has low == high. -€– +€® -€— +€¯  -€— +€¯  -€— +€¯  -€— +€¯ -€˜ +€°  -€˜ +€°  -€˜ +€°  -€˜ +€° -€™ +€±  -€™ +€±  -€™ +€±  -€™ +€± R -�� C RunCountedValue counts the runs that produced one distinct value. +�µ¸C RunCountedValue counts the runs that produced one distinct value. -�� +�µ -�ž +�¶  -�ž +�¶  -�ž +�¶  -�ž +�¶ -�Ÿ +�·  -�Ÿ +�·  -�Ÿ +�·  -�Ÿ +�· R -‚£©C SelfCheckRequest asks for the reflective check of a parsed model. +‚»ÁC SelfCheckRequest asks for the reflective check of a parsed model. -‚£ +‚» -‚¤ +‚¼  -‚¤ +‚¼  -‚¤  +‚¼   -‚¤ +‚¼ õ -‚¨)å Qualified names of packages whose constraint definitions apply after the +‚À)å Qualified names of packages whose constraint definitions apply after the bundled SysMLValidation ones (-self-check-package). Each must resolve to a package the model or its libraries declare; its own elements are not checked.  -‚¨ +‚À  -‚¨  +‚À   -‚¨$ +‚À$  -‚¨'( +‚À'( “ -ƒ­¸ƒ SelfCheckFinding is one thing the check reports about a constraint applied +ƒÅЃ SelfCheckFinding is one thing the check reports about a constraint applied to an element, or a constraint or package it skipped. -ƒ­ +ƒÅ ò -ƒ±â fails: the element answered the constraint false; unevaluated: the runtime +ƒÉâ fails: the element answered the constraint false; unevaluated: the runtime cannot yet apply the constraint reflectively; error: the evaluation failed; warning: a rule constraint was skipped, or a rule package yielded none.  -ƒ± +ƒÉ  -ƒ±  +ƒÉ   -ƒ± +ƒÉ Q -ƒ²"B " for ", or the constraint or package alone +ƒÊ"B " for ", or the constraint or package alone  -ƒ² +ƒÊ  -ƒ²  +ƒÊ   -ƒ² +ƒÊ I -ƒ³": document:line:col of the element, empty when it has none +ƒË": document:line:col of the element, empty when it has none  -ƒ³ +ƒË  -ƒ³  +ƒË   -ƒ³ +ƒË 9 -ƒ´"* qualified name of the constraint applied +ƒÌ"* qualified name of the constraint applied  -ƒ´ +ƒÌ  -ƒ´  +ƒÌ   -ƒ´ +ƒÌ 6 -ƒµ"' name of the element it was applied to +ƒÍ"' name of the element it was applied to  -ƒµ +ƒÍ  -ƒµ  +ƒÍ   -ƒµ +ƒÍ 6 -ƒ¶"' the reason, for a warning or an error +ƒÎ"' the reason, for a warning or an error  -ƒ¶ +ƒÎ  -ƒ¶  +ƒÎ   -ƒ¶ +ƒÎ = -ƒ·". the finding as `sysml -self-check` prints it +ƒÏ". the finding as `sysml -self-check` prints it  -ƒ· +ƒÏ  -ƒ· +ƒÏ  -ƒ· +ƒÏ X -„»¾I SelfCheckApplication counts the elements one constraint was applied to. +„ÓÖI SelfCheckApplication counts the elements one constraint was applied to. -„» +„Ó -„¼ +„Ô  -„¼ +„Ô  -„¼  +„Ô   -„¼ +„Ô -„½ +„Õ  -„½ +„Õ  -„½ +„Õ  -„½ +„Õ r -…ÂÐc SelfCheckResponse is what the check found: every finding, the counts, and +…Úèc SelfCheckResponse is what the check found: every finding, the counts, and the verdict over them. -… +…Ú Œ -…Å} holds: no violation and no evaluation error; fails: a violation; +…Ý} holds: no violation and no evaluation error; fails: a violation; unresolved: no violation, but an evaluation that errored.  -…Å +…Ý  -…Å  +…Ý   -…Å +…Ý -…Æ) +…Þ)  -…Æ +…Þ  -…Æ  +…Þ   -…Æ$ +…Þ$  -…Æ'( +…Þ'( + -…Ç" elements the check visited +…ß" elements the check visited  -…Ç +…ß  -…Ç +…ß  -…Ç +…ß - -…È" constraint applications made +…à" constraint applications made  -…È +…à  -…È +…à  -…È +…à , -…É" applications answered false +…á" applications answered false  -…É +…á  -…É +…á  -…É +…á 8 -…Ê") applications the runtime could not make +…â") applications the runtime could not make  -…Ê +…â  -…Ê +…â  -…Ê +…â : -…Ë"+ applications and collections that errored +…ã"+ applications and collections that errored  -…Ë +…ã  -…Ë +…ã  -…Ë +…ã - -…Ì1" by constraint, in name order +…ä1" by constraint, in name order  -…Ì +…ä  -…Ì  +…ä   -…Ì , +…ä ,  -…Ì/0 +…ä/0 C -…Í"4 the one-line total `sysml -self-check` prints last +…å"4 the one-line total `sysml -self-check` prints last  -…Í +…å  -…Í  +…å   -…Í +…å ] -… Î"N non-empty if the check could not start: a rule package named is not declared +… æ"N non-empty if the check could not start: a rule package named is not declared  -… Î +… æ  -… Î  +… æ   -… Î +… æ … -Ï' +ç'  … -Ï +ç  … -Ï  +ç   … -Ï! +ç!  … -Ï$& +ç$& ‚ -†×çò RecordRunRequest asks for runs of an analysis case to be recorded into the +†ïÿò RecordRunRequest asks for runs of an analysis case to be recorded into the model. With neither `ranges` nor `runs` the case runs once; `ranges` runs it once per row of the ranges as RunSweep does and records each completed row; `runs` runs it that many times as RunRuns does a Simulation::MonteCarlo case and records each completed run and the sample's conclusion. -†× +†ï -†Ø +†ð  -†Ø +†ð  -†Ø  +†ð   -†Ø +†ð H -†Ù "9 qualified name of the analysis case definition or usage +†ñ "9 qualified name of the analysis case definition or usage  -†Ù +†ñ  -†Ù  +†ñ   -†Ù +†ñ M -†Ú"> part/usage to instantiate as the subject, or a path from one +†ò"> part/usage to instantiate as the subject, or a path from one  -†Ú +†ò  -†Ú  +†ò   -†Ú +†ò -†Û +†ó  -†Û +†ó  -†Û  +†ó   -†Û +†ó  -†Û +†ó -†Ü) +†ô)  -†Ü +†ô  -†Ü$ +†ô$  -†Ü'( +†ô'( -†Ý +†õ  -†Ý +†õ  -†Ý  +†õ   -†Ý +†õ … -†àv Package the records go into (-record-into); empty is a Records package +†øv Package the records go into (-record-into); empty is a Records package beside the package enclosing the case's own.  -†à +†ø  -†à  +†ø   -†à +†ø 0 -†á!"! records a sweep's rows (-sweep) +†ù!"! records a sweep's rows (-sweep)  -†á +†ù  -†á  +†ù   -†á +†ù  -†á +†ù G -†â"8 records a Monte Carlo sample of this many runs (-runs) +†ú"8 records a Monte Carlo sample of this many runs (-runs)  -†â +†ú  -†â +†ú  -†â +†ú ? -† ã"0 seed of the sample's draws; required with runs +† û"0 seed of the sample's draws; required with runs  -† ã +† û  -† ã  +† û   -† ã +† û  -† ã +† û � † -æ€ As in ApplyEditsRequest: a model of several documents is refused unless the +þ€ As in ApplyEditsRequest: a model of several documents is refused unless the request says it reads the response's `documents`.  † -æ +þ  † -æ +þ  † -æ +þ ƒ -‡ëŠt RecordRunResponse is the runs' own report, what the model gained, and the +‡ƒ¢t RecordRunResponse is the runs' own report, what the model gained, and the notation the records were written into. -‡ë +‡ƒ T -‡íE The runs' own result, one of these by how the request ran the case. +‡…E The runs' own result, one of these by how the request ran the case.  -‡í +‡…  -‡í +‡…  -‡í +‡… -‡î +‡†  -‡î +‡†  -‡î +‡†  -‡î +‡† -‡ï +‡‡  -‡ï +‡‡  -‡ï +‡‡  -‡ï +‡‡ D -‡ð"5 qualified name of the package the records went into +‡ˆ"5 qualified name of the package the records went into  -‡ð +‡ˆ  -‡ð  +‡ˆ   -‡ð +‡ˆ A -‡ñ"2 qualified name of the per-case record definition +‡‰"2 qualified name of the per-case record definition  -‡ñ +‡‰  -‡ñ  +‡‰   -‡ñ +‡‰ > -‡ò"/ qualified names of the records made, in order +‡Š"/ qualified names of the records made, in order  -‡ò +‡Š  -‡ò  +‡Š   -‡ò +‡Š  -‡ò +‡Š ¢ -‡õ’ The record declarations generated: the target package's full nesting down +‡�’ The record declarations generated: the target package's full nesting down to it, holding the record definition when new and every record usage.  -‡õ +‡�  -‡õ  +‡�   -‡õ +‡� ‡ -‡ý÷ The notation of the document the records merged into, byte-identical to +‡•÷ The notation of the document the records merged into, byte-identical to the source outside the package they joined, or the records as a document of their own when no document holds the package's nesting. As in ApplyEditsResponse, `content` is set for a single-document model alone and @@ -10894,263 +10939,263 @@ A their package with the notation's extension (`Records.sysml`).  -‡ý +‡•  -‡ý  +‡•   -‡ý +‡• -‡þ( +‡–(  -‡þ +‡–  -‡þ  +‡–   -‡þ# +‡–#  -‡þ&' +‡–&' ? -‡ ÿ"0 rows or runs that failed and were not recorded +‡ —"0 rows or runs that failed and were not recorded  -‡ ÿ +‡ —  -‡ ÿ +‡ —  -‡ ÿ +‡ — P ‡ -€"A why runs were not recorded, as `sysml -record-run` reports them +˜"A why runs were not recorded, as `sysml -record-run` reports them  ‡ -€ +˜  ‡ -€  +˜   ‡ -€ +˜  ‡ -€ +˜ ­ -‡ ƒ� Non-empty when nothing was recorded: the case could not run, no run +‡ ›� Non-empty when nothing was recorded: the case could not run, no run completed, or the records would not analyze cleanly, which leaves the model unchanged.  -‡ ƒ +‡ ›  -‡ ƒ  +‡ ›   -‡ ƒ +‡ › -‡ „$ +‡ œ$  -‡ „ +‡ œ  -‡ „ +‡ œ  -‡ „!# +‡ œ!# -‡ …' +‡ �'  -‡ … +‡ �  -‡ …  +‡ �   -‡ …! +‡ �!  -‡ …$& +‡ �$& Õ -‡‰Å Hash of the model with the records in it, cached as a parse request's +‡¡Å Hash of the model with the records in it, cached as a parse request's would be, so the next request can run against the recorded model without parsing it again. Empty when nothing was recorded.  -‡‰ +‡¡  -‡‰  +‡¡   -‡‰ +‡¡ © -ˆŽª™ RunRunsResponse is the table of the runs, one row per run in run order, each +ˆ¦Â™ RunRunsResponse is the table of the runs, one row per run in run order, each observable's distribution, and for a case its conclusion over the sample. -ˆŽ +ˆ¦ • -ˆ‘… One row per run: `inputs` carries the run number as `run`, `outputs` what +ˆ©… One row per run: `inputs` carries the run number as `run`, `outputs` what the run observed, `verdicts` the case's in-run verdicts.  -ˆ‘ +ˆ©  -ˆ‘  +ˆ©   -ˆ‘ +ˆ©  -ˆ‘ +ˆ© ” -ˆ”"„ The observables tabled, in column order: those asked for, else every +ˆ¬"„ The observables tabled, in column order: those asked for, else every feature the action holds and "clock"; "observed" for a case.  -ˆ” +ˆ¬  -ˆ”  +ˆ¬   -ˆ” +ˆ¬  -ˆ” ! +ˆ¬ ! -ˆ•- +ˆ­-  -ˆ• +ˆ­  -ˆ•  +ˆ­   -ˆ•( +ˆ­(  -ˆ•+, +ˆ­+, ‡ -ˆ˜x Each distribution and, for a case, its conclusion as the CLI prints them +ˆ°x Each distribution and, for a case, its conclusion as the CLI prints them under the table; the table itself is `rows`.  -ˆ˜ +ˆ°  -ˆ˜  +ˆ°   -ˆ˜ +ˆ°  -ˆ˜ +ˆ° š -ˆ›"Š A case's conclusion over the completed runs: its outputs and verdicts, +ˆ³"Š A case's conclusion over the completed runs: its outputs and verdicts, which every row's verdicts were settled by. Empty for an action.  -ˆ› +ˆ³  -ˆ›  +ˆ³   -ˆ› +ˆ³  -ˆ› ! +ˆ³ ! -ˆœ +ˆ´  -ˆœ +ˆ´  -ˆœ  +ˆ´   -ˆœ +ˆ´  -ˆœ +ˆ´ ] -ˆžN Why the case has no conclusion: no run completed, or the sample was refused. +ˆ¶N Why the case has no conclusion: no run completed, or the sample was refused.  -ˆž +ˆ¶  -ˆž  +ˆ¶   -ˆž +ˆ¶ [ -ˆ L Set when no run was made at all; a failed run is a row carrying its error. +ˆ¸L Set when no run was made at all; a failed run is a row carrying its error.  -ˆ  +ˆ¸  -ˆ   +ˆ¸   -ˆ  +ˆ¸ -ˆ¡& +ˆ¹&  -ˆ¡ +ˆ¹  -ˆ¡  +ˆ¹   -ˆ¡! +ˆ¹!  -ˆ¡$% +ˆ¹$% -ˆ ¢$ +ˆ º$  -ˆ ¢ +ˆ º  -ˆ ¢ +ˆ º  -ˆ ¢!# +ˆ º!# \ ˆ -¤#M Every object a row's verdict is about, so each `instance_id` resolves here. +¼#M Every object a row's verdict is about, so each `instance_id` resolves here.  ˆ -¤ +¼  ˆ -¤  +¼   ˆ -¤ +¼  ˆ -¤ " +¼ " -ˆ ¥ +ˆ ½  -ˆ ¥ +ˆ ½  -ˆ ¥  +ˆ ½   -ˆ ¥ +ˆ ½ -ˆ ¦ +ˆ ¾  -ˆ ¦ +ˆ ¾  -ˆ ¦  +ˆ ¾   -ˆ ¦ +ˆ ¾ -ˆ § +ˆ ¿  -ˆ § +ˆ ¿  -ˆ §  +ˆ ¿   -ˆ § +ˆ ¿  -ˆ § +ˆ ¿ = -ˆ©. The seed the runs drew from, when they drew. +ˆÁ. The seed the runs drew from, when they drew.  -ˆ© +ˆÁ  -ˆ©  +ˆÁ   -ˆ© +ˆÁ  -ˆ© +ˆÁ ½ -‰³»­ RunDocumentQueryRequest runs a named document query — a calc def +‰ËÓ­ RunDocumentQueryRequest runs a named document query — a calc def specializing DocumentQueries::Query — against a model the service already parsed, binding its entry parameters. It answers as %run-query does, but with typed rows rather than formatted lines. The query runs over the objects @@ -11158,226 +11203,226 @@ P and `DocumentQueries::Objects` and `Verdicts` reach. -‰³ +‰Ë ( -‰´" from ParseFile response +‰Ì" from ParseFile response  -‰´ +‰Ì  -‰´  +‰Ì   -‰´ +‰Ì £ -‰·“ FQN of the document query to run. Fails with NOT_FOUND when the model does +‰Ï“ FQN of the document query to run. Fails with NOT_FOUND when the model does not declare it, and INVALID_ARGUMENT when it declares something else.  -‰· +‰Ï  -‰·  +‰Ï   -‰· +‰Ï � -‰º-€ Entry-parameter bindings. Repeating a parameter appends to its binding, so +‰Ò-€ Entry-parameter bindings. Repeating a parameter appends to its binding, so a nonscalar parameter can be given several values.  -‰º +‰Ò  -‰º  +‰Ò   -‰º ( +‰Ò (  -‰º+, +‰Ò+, T -оÁE DocumentQueryBinding binds one entry parameter of a document query. +ŠÖÙE DocumentQueryBinding binds one entry parameter of a document query. -о +ŠÖ -Š¿ +Š×  -Š¿ +Š×  -Š¿  +Š×   -Š¿ +Š× -ŠÀ$ +ŠØ$  -ŠÀ +ŠØ  -ŠÀ  +ŠØ   -ŠÀ +ŠØ  -ŠÀ"# +ŠØ"# ¿ -‹ÇÛ¯ DocumentValue is one typed document-query value. A request binds a model +‹ßó¯ DocumentValue is one typed document-query value. A request binds a model element by qualified name in element_id, or an object the service holds in object; a response also says what the element is in element_type. `infinity` denotes an unbounded multiplicity and is only ever answered, never bound. -‹Ç +‹ß  -‹ÈØ +‹àð  -‹È +‹à 2 -‹É"# qualified name of a model element +‹á"# qualified name of a model element  -‹É +‹á  -‹É  +‹á   -‹É +‹á -‹Ê +‹â  -‹Ê +‹â  -‹Ê  +‹â   -‹Ê +‹â -‹Ë +‹ã  -‹Ë +‹ã  -‹Ë +‹ã   -‹Ë +‹ã -‹Ì +‹ä  -‹Ì +‹ä  -‹Ì  +‹ä   -‹Ì +‹ä -‹Í +‹å  -‹Í +‹å  -‹Í  +‹å   -‹Í +‹å -‹Î +‹æ  -‹Î +‹æ  -‹Î  +‹æ   -‹Î +‹æ 4 -‹Ï"% magnitude in a unit, `2290000 [kg]` +‹ç"% magnitude in a unit, `2290000 [kg]`  -‹Ï +‹ç  -‹Ï  +‹ç   -‹Ï +‹ç ? -‹Ð "0 a row Verdicts answered; answered, never bound +‹è "0 a row Verdicts answered; answered, never bound  -‹Ð +‹è  -‹Ð +‹è  -‹Ð +‹è B -‹Ñ"3 an object Instantiate created; bound and answered +‹é"3 an object Instantiate created; bound and answered  -‹Ñ +‹é  -‹Ñ +‹é  -‹Ñ +‹é = -‹ Ò". a row States answered; answered, never bound +‹ ê". a row States answered; answered, never bound  -‹ Ò +‹ ê  -‹ Ò +‹ ê  -‹ Ò +‹ ê = ‹ -Ó". a row Events answered; answered, never bound +ë". a row Events answered; answered, never bound  ‹ -Ó +ë  ‹ -Ó +ë  ‹ -Ó +ë M -‹ Õ> An Integer beyond int64, in decimal, as Value.big_int_value. +‹ í> An Integer beyond int64, in decimal, as Value.big_int_value.  -‹ Õ +‹ í  -‹ Õ  +‹ í   -‹ Õ +‹ í < -‹ ×!- An exact Rational, as Value.rational_value. +‹ ï!- An exact Rational, as Value.rational_value.  -‹ × +‹ ï  -‹ ×  +‹ ï   -‹ × +‹ ï _ -‹ ÚP Metamodel type of element_id ("PartUsage", ...); answered, ignored when bound. +‹ òP Metamodel type of element_id ("PartUsage", ...); answered, ignored when bound.  -‹ Ú +‹ ò  -‹ Ú  +‹ ò   -‹ Ú +‹ ò Ë -Œâñ» DocumentObject is an object the service holds for the model, created by +Œú‰» DocumentObject is an object the service holds for the model, created by Instantiate, as a query binds and answers it. A request names it by path when path is set, and by instance_id otherwise; a request setting both must name one object by both. A response answers both, and the element the object stands for. -Œâ +Œú w -Œåh The object's id, as Instantiate answered it. Fails with NOT_FOUND when no +Œýh The object's id, as Instantiate answered it. Fails with NOT_FOUND when no object of the model has it.  -Œå +Œý  -Œå +Œý  -Œå +Œý ˜ -Œìˆ The object by the label a session reaches it under: the qualified name it +Œ„ˆ The object by the label a session reaches it under: the qualified name it was instantiated as (`Garage::car`), its id (`#2`), or a path through the feature values of either (`Garage::car.wheels[2]`, `#2.wheels[2]`; indexes count from 1). Fails with INVALID_ARGUMENT when the text is no reference or @@ -11385,664 +11430,711 @@ w no object.  -Œì +Œ„  -Œì +Œ„  -Œì +Œ„ Ú -ŒðÊ The usage the object is held under — its own definition or usage for an +ŒˆÊ The usage the object is held under — its own definition or usage for an object Instantiate created — as an element value with its qualified name and metamodel type. Answered, ignored when bound.  -Œð +Œˆ  -Œð +Œˆ  -Œð +Œˆ £ -�õ‹“ DocumentVerdict is one row a `Verdicts` query answered: an assertion checked +��£“ DocumentVerdict is one row a `Verdicts` query answered: an assertion checked on the object at `path`, which the row stands for as its `element`. -�õ +�� ¤ -�ø” The assertion checked, as an element value: the constraint, requirement, +��” The assertion checked, as an element value: the constraint, requirement, satisfy usage or verification case, its element_id empty when anonymous.  -�ø +��  -�ø +��  -�ø +�� O -�ú@ "constraint", "requirement", "satisfaction" or "verification". +�’@ "constraint", "requirement", "satisfaction" or "verification".  -�ú +�’  -�ú +�’  -�ú +�’   -�ý� The assertion as written ("assert constraint massKnown", "satisfy Range by +�•� The assertion as written ("assert constraint massKnown", "satisfy Range by cruise", "verification Tests::massTest"), naming an anonymous one.  -�ý +�•  -�ý +�•  -�ý +�• ž -�€Ž The object checked, by path from the element the query was bound to +�˜Ž The object checked, by path from the element the query was bound to ("Garage::car.wheels[2]"); the element's own qualified name for itself.  -�€ +�˜  -�€ +�˜  -�€ +�˜ 4 -�‚% "holds", "violated" or "undecided". +�š% "holds", "violated" or "undecided".  -�‚ +�š  -�‚  +�š   -�‚ +�š T -�„E The condition that evaluated to false, as written; empty otherwise. +�œE The condition that evaluated to false, as written; empty otherwise.  -�„ +�œ  -�„  +�œ   -�„ +�œ Q -�†B Why the assertion is violated or undecided; empty when it holds. +�žB Why the assertion is violated or undecided; empty when it holds.  -�† +�ž  -�†  +�ž   -�† +�ž Ì -�Š#¼ The verdict kinds ("pass", "fail", "inconclusive", "error") of the +�¢#¼ The verdict kinds ("pass", "fail", "inconclusive", "error") of the verification cases verifying the requirement the row is about; a verification row's own kind. Empty for a constraint.  -�Š +�¢  -�Š  +�¢   -�Š +�¢  -�Š!" +�¢!" Ê -Ž�¡º DocumentState is one row a `States` query answered: an active leaf state of +ލ¹º DocumentState is one row a `States` query answered: an active leaf state of the state machine `object` exhibits, which the row stands for as its `element` when the model declares it. -Ž� +ލ R -Ž’C The object in the state, with the path the session reaches it by. +ŽªC The object in the state, with the path the session reaches it by.  -Ž’ +Žª  -Ž’ +Žª  -Ž’ +Žª m -Ž•^ The state machine, by the name the object exhibits it under (`lp`), else +Ž­^ The state machine, by the name the object exhibits it under (`lp`), else its declared name.  -Ž• +Ž­  -Ž•  +Ž­   -Ž• +Ž­ ' -Ž— The leaf state's name. +ޝ The leaf state's name.  -Ž— +ޝ  -Ž— +ޝ  -Ž— +ޝ Y -Ž™J The leaf state's path in its machine, composite states first (`on.dim`). +ޱJ The leaf state's path in its machine, composite states first (`on.dim`).  -Ž™ +ޱ  -Ž™  +ޱ   -Ž™ +ޱ v -Žœg The leaf state's declaration as an element value; empty when the machine +Ž´g The leaf state's declaration as an element value; empty when the machine declares no element for it.  -Žœ +Ž´  -Žœ +Ž´  -Žœ +Ž´ R -ŽžC The orthogonal region the leaf is declared in; empty outside one. +޶C The orthogonal region the leaf is declared in; empty outside one.  -Žž +޶  -Žž  +޶   -Žž +޶ Z -Ž  K The composite states enclosing the leaf, outermost first; each is active. +ޏ K The composite states enclosing the leaf, outermost first; each is active.  -Ž  +ޏ  -Ž   +ޏ   -Ž  +ޏ  -Ž  +ޏ ‡ -�¥Âx DocumentEvent is one row an `Events` query answered: one record of the +�½íx DocumentEvent is one row an `Events` query answered: one record of the session's trace, in the order the run made it. -�¥ -i -�§Z "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". +�½ +¼ +�Ĭ "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or + "terminate" for a state machine's records; an action's run adds "step" (a + token arriving at a node), "wait" (a token parking at an accept node), + "assign" (a feature written), "decide" (a decision node resolved) and + "complete" (the action's performance completed); its "accept" is the accept + node taking a message and its "send" a message posted.  -�§ +�Ä  -�§ +�Ä  -�§ +�Ä ž -�ªŽ The clock's instant when the record was made: a quantity in the clock's +�ÇŽ The clock's instant when the record was made: a quantity in the clock's unit when the library reduces one, else a bare real of clock units.  -�ª +�Ç  -�ª +�Ç  -�ª +�Ç œ -�­Œ The object whose behavior made the record; unset for the run's own +�ÊŒ The object whose behavior made the record; unset for the run's own records (a due-order choice, a message posted from outside the model).  -�­ +�Ê  -�­ +�Ê  -�­ +�Ê — -�°‡ The behavior the record is about, by the name the object exhibits it +�͇ The behavior the record is about, by the name the object exhibits it under, else its declared name; empty for the run's own records.  -�° +�Í  -�°  +�Í   -�° -U -�²F The state entered, exited or stepped by an entry, exit or do record. +�Í +� +�Ð� The state entered, exited or stepped by an entry, exit or do record; the + action node a wait, assign, decide or action accept record is at.  -�² +�Ð  -�²  +�Ð   -�² -? -�´0 A fired transition's source and target states. +�Ð +Ç +�Ô· A fired transition's source and target states; a step's source node (empty + where the token's flow starts) and the node it arrived at; a decide's + branch taken, as `taken` names it.  -�´ +�Ô  -�´ +�Ô  -�´ +�Ô -�µ +�Õ  -�µ +�Õ  -�µ +�Õ  -�µ +�Õ s -�¸d The object a send was addressed to; unset for every other kind and a +�Ød The object a send was addressed to; unset for every other kind and a send addressed to no object.  -�¸ +�Ø  -�¸ +�Ø  -�¸ -\ -�ºM The signal or event accepted or sent, or the trigger a transition fired on. +�Ø +“ +�Ûƒ The signal or event accepted or sent, the trigger a transition fired on, or + the message type or trigger a wait record waits for.  -�º +�Û  -�º  +�Û   -�º +�Û [ -� ¼L An accept's payload, one `name = value` entry per parameter in name order. +� ÝL An accept's payload, one `name = value` entry per parameter in name order.  -� ¼ +� Ý  -� ¼  +� Ý   -� ¼ +� Ý  -� ¼ -\ +� Ý +¥ � -¾$M A choice's alternatives, in the order they were offered, and the one taken. +à$• A choice's alternatives, in the order they were offered, and the one taken; + a decide's branches as `->`, and the one taken.  � -¾ +à  � -¾  +à   � -¾ +à  � -¾!# +à!# -� ¿ +� á  -� ¿ +� á  -� ¿  +� á   -� ¿ +� á : -� Á+ The line the trace prints for the record. +� ã+ The line the trace prints for the record. + + +� ã + +� ã + +� ã +ç +� ç× The action token a step, wait, assign, decide or action accept record is + about, and the executor step (1-based) that made the record; 0 for a record + of neither (a state machine's, a send from outside the model). + + +� ç + +� ç + +� ç + +�è + +�è + +�è + +�è +u +�ëf The feature an assign record wrote and the value it holds since, as the + run's outputs carry values.  -� Á +�ë + +�ë  + +�ë + +�ì + +�ì  -� Á +�ì  -� Á +�ì T -�ÅÇE DocumentQueryColumn is one projected property, in projection order. +�ðòE DocumentQueryColumn is one projected property, in projection order. -�Å +�ð -�Æ +�ñ  -�Æ +�ñ  -�Æ +�ñ  -�Æ +�ñ \ -‘ÊÌM DocumentQueryCell is one row's values for one column, in the query's order. +‘õ÷M DocumentQueryCell is one row's values for one column, in the query's order. -‘Ê +‘õ -‘Ë$ +‘ö$  -‘Ë +‘ö  -‘Ë  +‘ö   -‘Ë +‘ö  -‘Ë"# +‘ö"# s -’Ð×d DocumentQueryRow is one selected element and its projected cells, one per +’û‚d DocumentQueryRow is one selected element and its projected cells, one per column in column order. -’Ð +’û � -’Õ� The selected element itself, an element value with its qualified name; an +’€� The selected element itself, an element value with its qualified name; an object value for a row over an object the service holds; a verdict value for a row `Verdicts` answered; a state value for a row `States` answered; an event value for a row `Events` answered.  -’Õ +’€  -’Õ +’€  -’Õ +’€ -’Ö' +’�'  -’Ö +’�  -’Ö  +’�   -’Ö" +’�"  -’Ö%& +’�%& ¡ -“Ýà‘ RunDocumentQueryResponse is the query's answer: its projected columns and its +“ˆ‹‘ RunDocumentQueryResponse is the query's answer: its projected columns and its rows, both in the deterministic order the engine reports. A query that selects nothing answers with no rows; a query that could not be run fails the call with the status its failure maps to. -“Ý +“ˆ -“Þ+ +“‰+  -“Þ +“‰  -“Þ  +“‰   -“Þ& +“‰&  -“Þ)* +“‰)* -“ß% +“Š%  -“ß +“Š  -“ß  +“Š   -“ß +“Š  -“ß#$ +“Š#$ Ä -”äê´ QueryOutcome is the record behind a document query that could not be run, an error +”�•´ QueryOutcome is the record behind a document query that could not be run, an error detail of the failed call: a pathError or modelError at its step, as -json's checks[].outcome. -”ä +”� , -”å" "pathError" or "modelError" +”�" "pathError" or "modelError"  -”å +”�  -”å +”�  -”å +”� P -”æ"A the step the outcome is reported at, as "Named(Observatory::x)" +”‘"A the step the outcome is reported at, as "Named(Observatory::x)"  -”æ +”‘  -”æ +”‘  -”æ +”‘ @ -”ç%"1 a pathError's failures, one per failing element +”’%"1 a pathError's failures, one per failing element  -”ç +”’  -”ç  +”’   -”ç +”’  -”ç#$ +”’#$ ( -”è%" a modelError's findings +”“%" a modelError's findings  -”è +”“  -”è  +”“   -”è +”“  -”è#$ +”“#$ C -”é*"4 a modelError's path failures from the same fan-out +””*"4 a modelError's path failures from the same fan-out  -”é +””  -”é  +””   -”é% +””%  -”é() +””() � -•îò� QueryFailure is one failure of one step on one element: what the step +•™�� QueryFailure is one failure of one step on one element: what the step expected, and what the model holds where the path stopped resolving. -•î +•™ -•ï +•š  -•ï +•š  -•ï +•š  -•ï +•š -•ð +•›  -•ð +•›  -•ð  +•›   -•ð +•› -•ñ +•œ  -•ñ +•œ  -•ñ +•œ  -•ñ +•œ ž -–öüŽ QueryFrontier is what the model holds where the path stopped: the last +–¡§Ž QueryFrontier is what the model holds where the path stopped: the last element that resolved and what it offers in place of what was asked. -–ö +–¡ 8 -–÷") empty when nothing on the path resolved +–¢") empty when nothing on the path resolved  -–÷ +–¢  -–÷ +–¢  -–÷ +–¢ 6 -–ø+"' its members, when a name was expected +–£+"' its members, when a name was expected  -–ø +–£  -–ø  +–£   -–ø& +–£&  -–ø)* +–£)* : -–ù-"+ its features, when a feature was expected +–¤-"+ its features, when a feature was expected  -–ù +–¤  -–ù  +–¤   -–ù ( +–¤ (  -–ù+, +–¤+, K -–ú"< the relationship kinds there are, when a kind was expected +–¥"< the relationship kinds there are, when a kind was expected  -–ú +–¥  -–ú  +–¥   -–ú +–¥  -–ú +–¥ ? -–û"0 the closest spelling, when a name was expected +–¦"0 the closest spelling, when a name was expected  -–û +–¦  -–û  +–¦   -–û +–¦ -—þ� +—©¬ -—þ +—© -—ÿ +—ª  -—ÿ +—ª  -—ÿ +—ª  -—ÿ +—ª -—€ +—«  -—€ +—«  -—€  +—«   -—€ +—« -˜ƒ† +˜®± -˜ƒ +˜® -˜„ +˜¯  -˜„ +˜¯  -˜„ +˜¯  -˜„ +˜¯ - -˜…" empty for an untyped feature +˜°" empty for an untyped feature  -˜… +˜°  -˜… +˜°  -˜… +˜° ­ -™Š�� QueryFinding is one finding about an element at a step: a constraint the +™µº� QueryFinding is one finding about an element at a step: a constraint the model violates (ambiguousName, multiplicity, typing, unit) and what was observed. -™Š +™µ -™‹ +™¶  -™‹ +™¶  -™‹ +™¶  -™‹ +™¶ -™Œ +™·  -™Œ +™·  -™Œ  +™·   -™Œ +™· -™� +™¸  -™� +™¸  -™�  +™¸   -™� +™¸ -™Ž +™¹  -™Ž +™¹  -™Ž  +™¹   -™Ž +™¹ å -š” Õ RenderDocumentRequest renders a named document — a part def specializing +š¿ËÕ RenderDocumentRequest renders a named document — a part def specializing DocumentQueries::Document — to Markdown or HTML. A document binds its queries' parameters in the model, so the request carries none. -š” +š¿ ( -š•" from ParseFile response +šÀ" from ParseFile response  -š• +šÀ  -š•  +šÀ   -š• +šÀ   -š˜� FQN of the document to render. Fails with NOT_FOUND when the model does +šÃ� FQN of the document to render. Fails with NOT_FOUND when the model does not declare it, and INVALID_ARGUMENT when it declares something else.  -š˜ +šÃ  -š˜  +šÃ   -š˜ +šÃ ‡ -šŸ÷ Form to render: "markdown" (the default when empty), "html", the +šÊ÷ Form to render: "markdown" (the default when empty), "html", the standalone page with the default stylesheet that the CLI's -doc-form html writes, or "asciidoc", the document the CLI's -doc-form asciidoc writes (under the render_document_asciidoc capability). Any other form fails @@ -12050,1852 +12142,1852 @@ K offered here.  -šŸ +šÊ  -šŸ +šÊ  -šŸ +šÊ … -›¦®õ RenderDocumentResponse carries the rendered document in the form requested, +›ÑÙõ RenderDocumentResponse carries the rendered document in the form requested, byte-for-byte what the CLI's -render-document writes: markdown for the Markdown form, html for the HTML form, asciidoc for the AsciiDoc form, the others left empty. -›¦ +›Ñ -›§ +›Ò  -›§ +›Ò  -›§  +›Ò   -›§ +›Ò -›¨ +›Ó  -›¨ +›Ó  -›¨ +›Ó  -›¨ +›Ó -›© +›Ô  -›© +›Ô  -›©  +›Ô   -›© +›Ô Õ -›­Å The file a rendered set writes this document to in the requested form +›ØÅ The file a rendered set writes this document to in the requested form (-render-documents), which the other documents' links to it name. Populated under the render_document_file_name capability.  -›­ +›Ø  -›­  +›Ø   -›­ +›Ø [ -œ±ÅL RenderViewRequest names a declared view or targeted pseudo-view to render. +œÜðL RenderViewRequest names a declared view or targeted pseudo-view to render. -œ± +œÜ -œ² +œÝ  -œ² +œÝ  -œ²  +œÝ   -œ² +œÝ Q -œ´B A qualified view name or "#:" pseudo-view. +œßB A qualified view name or "#:" pseudo-view.  -œ´ +œß  -œ´ +œß  -œ´ +œß W -œ¶H "" or "minimal" (the default), or "full", as view.ParsePorts reads it. +œáH "" or "minimal" (the default), or "full", as view.ParsePorts reads it.  -œ¶ +œá  -œ¶  +œá   -œ¶ +œá ‚ -œ»ò Optional notation elements to draw besides those the view's rendering +œæò Optional notation elements to draw besides those the view's rendering shows, as view.ShownOf reads them: "parameter-symbols", "port-symbols", "compartments", "edge-labels", "keywords", "multiplicities", "typings", "qualifiers", or "all".  -œ» +œæ  -œ»  +œæ   -œ» +œæ  -œ» +œæ ” -œ¾„ How many levels of nested elements to draw below each exposed element, +œé„ How many levels of nested elements to draw below each exposed element, overriding the depth the view states; 0 draws every level.  -œ¾ +œé  -œ¾ +œé  -œ¾ +œé ñ -œÄá How a tree rendering folds a node's owned members into compartment rows, +œïá How a tree rendering folds a node's owned members into compartment rows, as view.ParseCompartments reads it: "" or "positioned" (the default, only the layout-less members of a tree some Layout positions), "most" (every owned usage no Layout, nested definition or package keeps a node) or "ports" (the port usages with the ports nested under them).  -œÄ +œï  -œÄ  +œï   -œÄ +œï Y -�È×J RenderViewResponse carries all machine-readable fields of the rendering. +�ó‚J RenderViewResponse carries all machine-readable fields of the rendering. -�È +�ó -�É +�ô  -�É +�ô  -�É +�ô  -�É +�ô -�Ê +�õ  -�Ê +�õ  -�Ê +�õ  -�Ê +�õ -�Ë +�ö  -�Ë +�ö  -�Ë  +�ö   -�Ë +�ö B -�Í 3 Nodes are flattened with parents before children. +�ø 3 Nodes are flattened with parents before children.  -�Í +�ø  -�Í  +�ø   -�Í +�ø  -�Í +�ø -�Î +�ù  -�Î +�ù  -�Î  +�ù   -�Î +�ù  -�Î +�ù -�Ï +�ú  -�Ï +�ú  -�Ï  +�ú   -�Ï +�ú  -�Ï +�ú -�Ð +�û  -�Ð +�û  -�Ð  +�û   -�Ð +�û  -�Ð +�û 6 -�Ò' Unset when the view states no canvas. +�ý' Unset when the view states no canvas.  -�Ò +�ý  -�Ò +�ý  -�Ò +�ý -�Ó +�þ  -�Ó +�þ  -�Ó  +�þ   -�Ó +�þ  -�Ó +�þ -� Ô +� ÿ  -� Ô +� ÿ  -� Ô  +� ÿ   -� Ô +� ÿ  -� Ô +� ÿ I � -Ö: The optional notation elements drawn, in registry order. +�: The optional notation elements drawn, in registry order.  � -Ö +�  � -Ö  +�   � -Ö +�  � -Ö +� C -žÚð4 RenderNode is one flattened node of the rendering. +ž…›4 RenderNode is one flattened node of the rendering. -žÚ +ž… -žÛ +ž†  -žÛ +ž†  -žÛ +ž†  -žÛ +ž† -žÜ +ž‡  -žÜ +ž‡  -žÜ +ž‡  -žÜ +ž‡ -žÝ +žˆ  -žÝ +žˆ  -žÝ +žˆ  -žÝ +žˆ -žÞ +ž‰  -žÞ +ž‰  -žÞ +ž‰  -žÞ +ž‰ -žß +žŠ  -žß +žŠ  -žß +žŠ  -žß +žŠ -žà +ž‹  -žà +ž‹  -žà  +ž‹   -žà +ž‹ -žá +žŒ  -žá +žŒ  -žá +žŒ  -žá +žŒ -žâ +ž�  -žâ +ž�  -žâ +ž�  -žâ +ž� -žã +žŽ  -žã +žŽ  -žã  +žŽ   -žã +žŽ -ž ä! +ž �!  -ž ä +ž �  -ž ä  +ž �   -ž ä +ž �  -ž ä +ž � ž -å +�  ž -å +�  ž -å +�  ž -å +� j -ž ç[ Unset when no layout annotates the node; unplaced when the layout only folds or hides it. +ž ’[ Unset when no layout annotates the node; unplaced when the layout only folds or hides it.  -ž ç +ž ’  -ž ç +ž ’  -ž ç +ž ’ -ž è +ž “  -ž è +ž “  -ž è +ž “  -ž è +ž “ œ -ž ëŒ The compartment of the parent node this node is drawn as a row of +ž –Œ The compartment of the parent node this node is drawn as a row of ("attributes", "parts", "ports", ...); unset for a node drawn as a box.  -ž ë +ž –  -ž ë  +ž –   -ž ë +ž – Û -žïË The owner the node is drawn or listed under has the usage through typing, +žšË The owner the node is drawn or listed under has the usage through typing, subclassification or subsetting rather than declares it; the notation prefixes its name with `^`. `name` stays the bare name.  -žï +žš  -žï +žš  -žï +žš B -Ÿóú3 RenderPort is a feature drawn on a node's border. +Ÿž¥3 RenderPort is a feature drawn on a node's border. -Ÿó +Ÿž -Ÿô +ŸŸ  -Ÿô +ŸŸ  -Ÿô +ŸŸ  -Ÿô +ŸŸ -Ÿõ +Ÿ   -Ÿõ +Ÿ   -Ÿõ +Ÿ   -Ÿõ +Ÿ  -Ÿö +Ÿ¡  -Ÿö +Ÿ¡  -Ÿö +Ÿ¡  -Ÿö +Ÿ¡ -Ÿ÷ +Ÿ¢  -Ÿ÷ +Ÿ¢  -Ÿ÷  +Ÿ¢   -Ÿ÷ +Ÿ¢ u -Ÿùf The node's owner has the port from its type rather than declares it; drawn with a `^` before `name`. +Ÿ¤f The node's owner has the port from its type rather than declares it; drawn with a `^` before `name`.  -Ÿù +Ÿ¤  -Ÿù +Ÿ¤  -Ÿù +Ÿ¤ Q - ýˆB RenderEdge joins two rendered nodes and may connect their ports. + ¨³B RenderEdge joins two rendered nodes and may connect their ports. - ý + ¨ - þ + ©  - þ + ©  - þ + ©  - þ + © - ÿ + ª  - ÿ + ª  - ÿ + ª  - ÿ + ª - € + «  - € + «  - €  + «   - € + « - � + ¬  - � + ¬  - �  + ¬   - � + ¬ - ‚ + ­  - ‚ + ­  - ‚  + ­   - ‚ + ­ - ƒ + ®  - ƒ + ®  - ƒ + ®  - ƒ + ® - „ + ¯  - „ + ¯  - „ + ¯  - „ + ¯ - … + °  - … + °  - … + °  - … + ° - †! + ±!  - † + ±  - †  + ±   - † + ±  - † + ± -  ‡ +  ²  -  ‡ +  ²  -  ‡ +  ²  -  ‡ +  ² I -¡‹”: RenderGeometry locates a node on the rendering's canvas. +¡¶¿: RenderGeometry locates a node on the rendering's canvas. -¡‹ +¡¶ -¡Œ +¡·  -¡Œ +¡·  -¡Œ +¡·  -¡Œ  +¡·  -¡� +¡¸  -¡� +¡¸  -¡� +¡¸  -¡�  +¡¸  -¡Ž +¡¹  -¡Ž +¡¹  -¡Ž  +¡¹   -¡Ž +¡¹ -¡� +¡º  -¡� +¡º  -¡�  +¡º   -¡� +¡º -¡� +¡»  -¡� +¡»  -¡� +¡»  -¡� +¡» -¡‘ +¡¼  -¡‘ +¡¼  -¡‘ +¡¼  -¡‘ +¡¼ _ -¡“P The layout places nothing (it only folds or hides): x and y carry no position. +¡¾P The layout places nothing (it only folds or hides): x and y carry no position.  -¡“ +¡¾  -¡“ +¡¾  -¡“ +¡¾ A -¢—œ2 RenderCanvas is the rendering's drawing surface. +¢ÂÇ2 RenderCanvas is the rendering's drawing surface. -¢— +¢Â -¢˜ +¢Ã  -¢˜ +¢Ã  -¢˜ +¢Ã  -¢˜ +¢Ã -¢™ +¢Ä  -¢™ +¢Ä  -¢™  +¢Ä   -¢™ +¢Ä -¢š +¢Å  -¢š +¢Å  -¢š  +¢Å   -¢š +¢Å -¢› +¢Æ  -¢› +¢Æ  -¢› +¢Æ  -¢› +¢Æ G -£Ÿ§8 RenderStyle is the optional styling of a node or edge. +£ÊÒ8 RenderStyle is the optional styling of a node or edge. -£Ÿ +£Ê -£  +£Ë  -£  +£Ë  -£  +£Ë  -£  +£Ë -£¡ +£Ì  -£¡ +£Ì  -£¡ +£Ì  -£¡ +£Ì -£¢ +£Í  -£¢ +£Í  -£¢ +£Í  -£¢ +£Í -££ +£Î  -££ +£Î  -££ +£Î  -££ +£Î -£¤ +£Ï  -£¤ +£Ï  -£¤  +£Ï   -£¤ +£Ï -£¥ +£Ð  -£¥ +£Ð  -£¥ +£Ð  -£¥ +£Ð -£¦ +£Ñ  -£¦ +£Ñ  -£¦ +£Ñ  -£¦ +£Ñ K -¤ª­< RenderPoint is a route waypoint on the rendering's canvas. +¤ÕØ< RenderPoint is a route waypoint on the rendering's canvas. -¤ª +¤Õ -¤« +¤Ö  -¤« +¤Ö  -¤« +¤Ö  -¤«  +¤Ö  -¤¬ +¤×  -¤¬ +¤×  -¤¬ +¤×  -¤¬  +¤×  = -¥°³. RenderRow is one row of a tabular rendering. +¥ÛÞ. RenderRow is one row of a tabular rendering. -¥° +¥Û -¥± +¥Ü  -¥± +¥Ü  -¥±  +¥Ü   -¥± +¥Ü  -¥± +¥Ü -¥² +¥Ý  -¥² +¥Ý  -¥² +¥Ý  -¥² +¥Ý J -¦¶Á; RenderNote is a note box drawn on the rendering's canvas. +¦áì; RenderNote is a note box drawn on the rendering's canvas. -¦¶ +¦á -¦· +¦â  -¦· +¦â  -¦· +¦â  -¦· +¦â -¦¸ +¦ã  -¦¸ +¦ã  -¦¸  +¦ã   -¦¸ +¦ã -¦¹ +¦ä  -¦¹ +¦ä  -¦¹  +¦ä   -¦¹ +¦ä -¦º +¦å  -¦º +¦å  -¦º  +¦å   -¦º +¦å -¦» +¦æ  -¦» +¦æ  -¦» +¦æ  -¦»  +¦æ  -¦¼ +¦ç  -¦¼ +¦ç  -¦¼ +¦ç  -¦¼  +¦ç  -¦½ +¦è  -¦½ +¦è  -¦½  +¦è   -¦½ +¦è -¦¾ +¦é  -¦¾ +¦é  -¦¾  +¦é   -¦¾ +¦é -¦¿ +¦ê  -¦¿ +¦ê  -¦¿ +¦ê  -¦¿ +¦ê -¦ À +¦ ë  -¦ À +¦ ë  -¦ À +¦ ë  -¦ À +¦ ë X -§ÄÈI ExportGraphsRequest names the behavior whose lowered graph is exported. +§ïóI ExportGraphsRequest names the behavior whose lowered graph is exported. -§Ä +§ï -§Å +§ð  -§Å +§ð  -§Å  +§ð   -§Å +§ð S -§ÇD Qualified name of an action or state machine, definition or usage. +§òD Qualified name of an action or state machine, definition or usage.  -§Ç +§ò  -§Ç  +§ò   -§Ç +§ò æ -¨ÍÔÖ ExportGraphsResponse carries the `graphs:` form: the lowered +¨øÿÖ ExportGraphsResponse carries the `graphs:` form: the lowered ActionGraph/StateGraph IR of the subject and of every behavior it performs, as canonical JSON — the same bytes an external engine is sent. -¨Í +¨ø G -¨Ï8 The form, as canonical JSON with one trailing newline. +¨ú8 The form, as canonical JSON with one trailing newline.  -¨Ï +¨ú  -¨Ï  +¨ú   -¨Ï +¨ú J -¨Ñ; The version of the form, the `version` field of the JSON. +¨ü; The version of the form, the `version` field of the JSON.  -¨Ñ +¨ü  -¨Ñ +¨ü  -¨Ñ +¨ü : -¨Ó+ The subject's qualified name as resolved. +¨þ+ The subject's qualified name as resolved.  -¨Ó +¨þ  -¨Ó  +¨þ   -¨Ó +¨þ • -©Øæ… ImportDataRequest is the data `sysml -import` sets the feature values of, one +©ƒ‘… ImportDataRequest is the data `sysml -import` sets the feature values of, one file per -import, applied in order as one edit each. -©Ø +©ƒ -©Ù +©„  -©Ù +©„  -©Ù  +©„   -©Ù +©„ k -©Ü"\ The files, in the order they are applied; each is read as its own format +©‡"\ The files, in the order they are applied; each is read as its own format and mapping say.  -©Ü +©‡  -©Ü  +©‡   -©Ü +©‡  -©Ü ! +©‡ ! Ÿ -©ß� What each row is made into, as -import-as: "values", the default, sets the +©Š� What each row is made into, as -import-as: "values", the default, sets the features of the element the row names; nothing else is supported.  -©ß +©Š  -©ß  +©Š   -©ß +©Š y -©âj Report the values the imports would set, changing nothing; the documents +©�j Report the values the imports would set, changing nothing; the documents and model hash are then unset.  -©â +©�  -©â +©�  -©â +©� ¦ -©å– Accept every edited document in documents when the model has several; +©�– Accept every edited document in documents when the model has several; without it, a model of several documents is refused as ApplyEdits refuses it.  -©å +©�  -©å +©�  -©å +©� Ž -ªêó DataImport is one data file: its name, which names the format by extension +ª•ž DataImport is one data file: its name, which names the format by extension and the file in what goes wrong, and its content. -ªê +ª• -ªë +ª–  -ªë +ª–  -ªë +ª–  -ªë +ª– -ªì +ª—  -ªì +ª—  -ªì  +ª—   -ªì +ª— z -ªïk Read the content as csv, tsv, json or jsonl rather than as the name's +ªšk Read the content as csv, tsv, json or jsonl rather than as the name's extension says, as -import-format.  -ªï +ªš  -ªï  +ªš   -ªï +ªš ™ -ªò‰ The JSON mapping onto elements and features the content is read by, as the +ª�‰ The JSON mapping onto elements and features the content is read by, as the file -import-map names; empty for the content's own header.  -ªò +ª�  -ªò  +ª�   -ªò +ª� U -«öƒF ImportDataResponse is what the imports set, and the model they made. +«¡®F ImportDataResponse is what the imports set, and the model they made. -«ö +«¡ w -«ù"h One per import, in order; unset when the model refuses an import, with +«¤"h One per import, in order; unset when the model refuses an import, with error set and nothing changed.  -«ù +«¤  -«ù  +«¤   -«ù +«¤  -«ù ! +«¤ ! V -«û(G The edited documents, as ApplyEdits answers them; unset on a dry run. +«¦(G The edited documents, as ApplyEdits answers them; unset on a dry run.  -«û +«¦  -«û  +«¦   -«û# +«¦#  -«û&' +«¦&' P -«ýA The edited content of a one-document model; unset on a dry run. +«¨A The edited content of a one-document model; unset on a dry run.  -«ý +«¨  -«ý  +«¨   -«ý +«¨ W -«ÿH The hash of the imported model, parsed and cached; unset on a dry run. +«ªH The hash of the imported model, parsed and cached; unset on a dry run.  -«ÿ +«ª  -«ÿ  +«ª   -«ÿ +«ª ^ -«�O Why the import was refused, "" when it was made; the model is then unchanged. +«¬O Why the import was refused, "" when it was made; the model is then unchanged.  -«� +«¬  -«�  +«¬   -«� +«¬ -«‚& +«­&  -«‚ +«­  -«‚  +«­   -«‚! +«­!  -«‚$% +«­$% – -¬‡Œ† ImportedFile is what one data file set: the values, the elements they were +¬²·† ImportedFile is what one data file set: the values, the elements they were set on, and each assignment as `sysml -import` lists it. -¬‡ +¬² -¬ˆ +¬³  -¬ˆ +¬³  -¬ˆ +¬³  -¬ˆ +¬³ -¬‰ +¬´  -¬‰ +¬´  -¬‰ +¬´  -¬‰ +¬´ -¬Š +¬µ  -¬Š +¬µ  -¬Š +¬µ  -¬Š +¬µ -¬‹) +¬¶)  -¬‹ +¬¶  -¬‹  +¬¶   -¬‹$ +¬¶$  -¬‹'( +¬¶'( ˆ -­“šø ImportedValue is one assignment: the qualified name of the element, the +­¾Åø ImportedValue is one assignment: the qualified name of the element, the feature set, the literal it is set to, the qualified name of the inherited feature redefined to set it ("" when the element declares the feature), where in the data it came from, and the line `sysml -import` reports it as. A redefinition made only to reach a nested inherited feature sets no value. -­“ +­¾ -­” +­¿  -­” +­¿  -­”  +­¿   -­” +­¿ -­• +­À  -­• +­À  -­•  +­À   -­• +­À -­– +­Á  -­– +­Á  -­–  +­Á   -­– +­Á -­— +­Â  -­— +­Â  -­—  +­Â   -­— +­Â -­˜ +­Ã  -­˜ +­Ã  -­˜  +­Ã   -­˜ +­Ã -­™ +­Ä  -­™ +­Ä  -­™  +­Ä   -­™ +­Ä ° -®ž¶  CompareResultsRequest runs the configurations a tool's results sidecar indexes +®Éá  CompareResultsRequest runs the configurations a tool's results sidecar indexes — the JSON `sysml -migration-results` writes — against the migrated model. -®ž +®É -®Ÿ +®Ê  -®Ÿ +®Ê  -®Ÿ  +®Ê   -®Ÿ +®Ê . -®¡ The results sidecar, as JSON. +®Ì The results sidecar, as JSON.  -®¡ +®Ì  -®¡  +®Ì   -®¡ +®Ì Š -®¤{ The configurations compared, by qualified or simple name, as -action names +®Ï{ The configurations compared, by qualified or simple name, as -action names them; every indexed configuration when empty.  -®¤ +®Ï  -®¤  +®Ï   -®¤ +®Ï  -®¤ +®Ï ƒ -®§t The runs made of every configuration when positive, as -runs; else each +®Òt The runs made of every configuration when positive, as -runs; else each configuration's own numberOfRuns, or one.  -®§ +®Ò  -®§ +®Ò  -®§ +®Ò Œ -®ª} The seed the runs derive theirs from, as -seed; without one, runs that draw +®Õ} The seed the runs derive theirs from, as -seed; without one, runs that draw at random are refused unless draws fixes them.  -®ª +®Õ  -®ª  +®Õ   -®ª +®Õ  -®ª +®Õ Š -®­{ The draw policy replacing every configuration's durationSimulationMode when +®Ø{ The draw policy replacing every configuration's durationSimulationMode when set, as -draws: random, min, max or average.  -®­ +®Ø  -®­  +®Ø   -®­ +®Ø s -®°!d The clock step replacing every configuration's when set, as -clock-step; +®Û!d The clock step replacing every configuration's when set, as -clock-step; 0 is a continuous clock.  -®° +®Û  -®°  +®Û   -®° +®Û  -®° +®Û Ë -®´&» The stored observables compared, each with the feature of the run that +®ß&» The stored observables compared, each with the feature of the run that answers it, as -observe; without any, every stored observable is read from the target's feature of its own name.  -®´ +®ß  -®´  +®ß   -®´! +®ß!  -®´$% +®ß$% -®µ +®à  -®µ +®à  -®µ  +®à   -®µ +®à « -¯º½› ObservablePair is a stored observable and the feature of the run that answers +¯åè› ObservablePair is a stored observable and the feature of the run that answers it; an empty feature is the target's feature of the observable's own name. -¯º +¯å -¯» +¯æ  -¯» +¯æ  -¯»  +¯æ   -¯» +¯æ -¯¼ +¯ç  -¯¼ +¯ç  -¯¼  +¯ç   -¯¼ +¯ç t -°ÁÌe CompareResultsResponse is one comparison per configuration, in the order the +°ì÷e CompareResultsResponse is one comparison per configuration, in the order the sidecar indexes them. -°Á +°ì -°Â6 +°í6  -°Â +°í  -°Â " +°í "  -°Â#1 +°í#1  -°Â45 +°í45 K -°Ä< The tool the sidecar records as the source of the results. +°ï< The tool the sidecar records as the source of the results.  -°Ä +°ï  -°Ä  +°ï   -°Ä +°ï O -°Æ@ Why nothing was compared, "" when the configurations were run. +°ñ@ Why nothing was compared, "" when the configurations were run.  -°Æ +°ñ  -°Æ  +°ñ   -°Æ +°ñ -°Ç& +°ò&  -°Ç +°ò  -°Ç  +°ò   -°Ç! +°ò!  -°Ç$% +°ò$% -°È# +°ó#  -°È +°ó  -°È +°ó  -°È!" +°ó!" -°É +°ô  -°É +°ô  -°É  +°ô   -°É +°ô -°Ê +°õ  -°Ê +°õ  -°Ê  +°õ   -°Ê +°õ -°Ë +°ö  -°Ë +°ö  -°Ë  +°ö   -°Ë +°ö  -°Ë +°ö _ -±ÏðP ConfigurationComparison is one configuration's runs beside the tool's results. +±ú›P ConfigurationComparison is one configuration's runs beside the tool's results. -±Ï +±ú -±Ð +±û  -±Ð +±û  -±Ð +±û  -±Ð +±û -±Ñ +±ü  -±Ñ +±ü  -±Ñ +±ü  -±Ñ +±ü \ -±ÓM The migrated behavior the configuration performs, "" when it performs none. +±þM The migrated behavior the configuration performs, "" when it performs none.  -±Ó +±þ  -±Ó  +±þ   -±Ó +±þ P -±ÕA The feature of the configuration the observables are read from. +±€A The feature of the configuration the observables are read from.  -±Õ +±€  -±Õ  +±€   -±Õ +±€ -±Ö +±�  -±Ö +±�  -±Ö  +±�   -±Ö +±� ¦ -±Ù– holds when runs complete and observables compare; undecided when some do not; +±„– holds when runs complete and observables compare; undecided when some do not; fails when a run fails; unresolved when the configuration cannot run.  -±Ù +±„  -±Ù  +±„   -±Ù +±„ S -±ÛD Why the configuration could not be run, when status is unresolved. +±†D Why the configuration could not be run, when status is unresolved.  -±Û +±†  -±Û  +±†   -±Û +±† G -±Ý8 The runs the tool stored, and over how many snapshots. +±ˆ8 The runs the tool stored, and over how many snapshots.  -±Ý +±ˆ  -±Ý +±ˆ  -±Ý +±ˆ -±Þ +±‰  -±Þ +±‰  -±Þ +±‰  -±Þ +±‰ @ -± à1 The runs OpenSysML made and how many completed. +± ‹1 The runs OpenSysML made and how many completed.  -± à +± ‹  -± à +± ‹  -± à +± ‹ ± -á +Œ  ± -á +Œ  ± -á +Œ  ± -á +Œ -± â +± �  -± â +± �  -± â  +± �   -± â +± � Y -± äJ The seed the runs derived theirs from; unset when the runs drew nothing. +± �J The seed the runs derived theirs from; unset when the runs drew nothing.  -± ä +± �  -± ä  +± �   -± ä +± �  -± ä +± � -± å +± �  -± å +± �  -± å  +± �   -± å +± � : -±ç+ One row per run, as RunSweep tables them. +±’+ One row per run, as RunSweep tables them.  -±ç +±’  -±ç  +±’   -±ç +±’  -±ç +±’ -±è# +±“#  -±è +±“  -±è  +±“   -±è +±“  -±è " +±“ " -±é1 +±”1  -±é +±”  -±é  +±”   -±é + +±” +  -±é.0 +±”.0 q -±ìb The errors failed runs ended in, deduplicated, and the notes on the +±—b The errors failed runs ended in, deduplicated, and the notes on the configuration and its runs.  -±ì +±—  -±ì  +±—   -±ì +±—  -±ì +±— -±í +±˜  -±í +±˜  -±í  +±˜   -±í +±˜  -±í +±˜ F -±ï7 The comparison as `sysml -compare-results` prints it. +±š7 The comparison as `sysml -compare-results` prints it.  -±ï +±š  -±ï  +±š   -±ï +±š  -±ï +±š ² -²õŽ¢ ObservableComparison is one observable: the tool's distribution beside the +² ¹¢ ObservableComparison is one observable: the tool's distribution beside the runs' with the relative difference of each statistic, or why they are not compared. -²õ +²  -²ö +²¡  -²ö +²¡  -²ö  +²¡   -²ö +²¡ -²÷ +²¢  -²÷ +²¢  -²÷  +²¢   -²÷ +²¢ A -²ù2 The unit the runs' numbers came in, "" for none. +²¤2 The unit the runs' numbers came in, "" for none.  -²ù +²¤  -²ù +²¤  -²ù +²¤ Û -²ý Ë The tool's distribution, unset when it stored no number; pooled when it +²¨ Ë The tool's distribution, unset when it stored no number; pooled when it was pooled from summaries, so only count and mean are known; unstored when the tool stored no result at all to compare against.  -²ý +²¨  -²ý +²¨  -²ý +²¨ -²þ +²©  -²þ +²©  -²þ +²©  -²þ +²© -²ÿ +²ª  -²ÿ +²ª  -²ÿ +²ª  -²ÿ +²ª ™ -²‚‰ The distribution of the completed runs, unset when they are not compared; +²­‰ The distribution of the completed runs, unset when they are not compared; produced is how many runs produced a number for the feature.  -²‚ +²­  -²‚ +²­  -²‚ +²­ -²ƒ +²®  -²ƒ +²®  -²ƒ +²®  -²ƒ +²® ˆ -²†y Whether the runs were made and are reported, false when the tool stored no +²±y Whether the runs were made and are reported, false when the tool stored no observable of the name or no number for it.  -²† +²±  -²† +²±  -²† +²± “ -² ‰&ƒ The relative difference of each statistic, unset without both +² ´&ƒ The relative difference of each statistic, unset without both distributions; a pooled tool distribution compares the mean alone.  -² ‰ +² ´  -² ‰ +² ´  -² ‰#% +² ´#% „ ² -Œu The per-statistic comparison of the Simulation::MonteCarlo case the +·u The per-statistic comparison of the Simulation::MonteCarlo case the observable is analysed by, unset when none is.  ² -Œ +·  ² -Œ +·  ² -Œ +· -² � +² ¸  -² � +² ¸  -² �  +² ¸   -² � +² ¸  -² � +² ¸ ~ -³’šo ComparedDistribution is a distribution of numbers by its statistics; a pooled +³½Åo ComparedDistribution is a distribution of numbers by its statistics; a pooled one sets count and mean alone. -³’ +³½ -³“ +³¾  -³“ +³¾  -³“ +³¾  -³“ +³¾ -³” +³¿  -³” +³¿  -³” +³¿  -³” +³¿ -³• +³À  -³• +³À  -³• +³À  -³• +³À -³– +³Á  -³– +³Á  -³– +³Á  -³– +³Á -³— +³Â  -³— +³Â  -³— +³Â  -³— +³Â -³˜ +³Ã  -³˜ +³Ã  -³˜ +³Ã  -³˜ +³Ã -³™ +³Ä  -³™ +³Ä  -³™  +³Ä   -³™ +³Ä ‡ -´ž¤x StatisticDifference is the relative difference of each statistic as a signed +´ÉÏx StatisticDifference is the relative difference of each statistic as a signed percentage, "" where it is not compared. -´ž +´É -´Ÿ +´Ê  -´Ÿ +´Ê  -´Ÿ +´Ê  -´Ÿ +´Ê -´  +´Ë  -´  +´Ë  -´  +´Ë  -´  +´Ë -´¡ +´Ì  -´¡ +´Ì  -´¡ +´Ì  -´¡ +´Ì -´¢ +´Í  -´¢ +´Í  -´¢ +´Í  -´¢ +´Í -´£ +´Î  -´£ +´Î  -´£ +´Î  -´£ +´Î § -µ¨¬— CaseStatistics compares the statistics a Simulation::MonteCarlo case declares +µÓ×— CaseStatistics compares the statistics a Simulation::MonteCarlo case declares of an observable with the tool's pooled values, one row per statistic. -µ¨ +µÓ -µ© +µÔ  -µ© +µÔ  -µ©  +µÔ   -µ© +µÔ -µª" +µÕ"  -µª +µÕ  -µª  +µÕ   -µª +µÕ  -µª ! +µÕ ! -µ« +µÖ  -µ« +µÖ  -µ«  +µÖ   -µ« +µÖ  -µ« +µÖ ¢ -¶°¶’ CaseStatistic is one statistic of the case: which, where the case declares +¶Ûá’ CaseStatistic is one statistic of the case: which, where the case declares it, the tool's value, the runs' value and their relative difference. -¶° +¶Û -¶± +¶Ü  -¶± +¶Ü  -¶±  +¶Ü   -¶± +¶Ü -¶² +¶Ý  -¶² +¶Ý  -¶² +¶Ý  -¶² +¶Ý -¶³ +¶Þ  -¶³ +¶Þ  -¶³ +¶Þ  -¶³ +¶Þ -¶´ +¶ß  -¶´ +¶ß  -¶´ +¶ß  -¶´ +¶ß -¶µ +¶à  -¶µ +¶à  -¶µ  +¶à   -¶µbproto3Òö \ No newline at end of file +¶àbproto3Òö \ No newline at end of file diff --git a/client/rust/opensysml/src/proto/sysml/sysml.rs b/client/rust/opensysml/src/proto/sysml/sysml.rs index cd023d89a7..515fab6550 100644 --- a/client/rust/opensysml/src/proto/sysml/sysml.rs +++ b/client/rust/opensysml/src/proto/sysml/sysml.rs @@ -1298,6 +1298,25 @@ pub struct ExecuteActionRequest { /// INVALID_ARGUMENT. #[prost(double, tag="9")] pub clock_step: f64, + /// Ask for the run's trace in ExecuteActionResponse.trace. Advertised as the + /// "action_trace" capability; a service withholding it refuses true with + /// UNIMPLEMENTED, as does an explore schedule with INVALID_ARGUMENT. + #[prost(bool, tag="10")] + pub trace: bool, + /// Signals or items to post to the performing object, in this order, as the + /// REPL's `%send` does: the run goes until it completes or every token waits, + /// the next event is then posted to the object's queue and the run goes on, + /// an accept node waiting for it taking it on the next step. An event of a + /// type no accept node of the performance names is refused, with the accepts + /// still waiting. The events exhausted, the run goes on to completion (or for + /// `advance`); a token still waiting at the end is an accept deadlock, + /// reported in `error` with the message it waits for. Each names a signal or + /// item definition, qualified or as the action's namespace sees it; a name no + /// definition answers to is matched by name alone, as ExecuteState's events + /// are. Posted to the object performer_symbol_id names, as `%send` posts to + /// one: INVALID_ARGUMENT without it. + #[prost(string, repeated, tag="11")] + pub events: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// ExecuteActionResponse contains action execution results #[derive(Clone, PartialEq, ::prost::Message)] @@ -1333,6 +1352,15 @@ pub struct ExecuteActionResponse { /// "order_dependence" capability; empty under an explore schedule. #[prost(map="string, int32", tag="8")] pub order_dependent: ::std::collections::HashMap<::prost::alloc::string::String, i32>, + /// The run's trace in the order the run made it, when the request asked for + /// it: the token steps, waits, accepts, sends, decisions, assignments and + /// completion of the action, each a DocumentEvent (see its `kind`), also on a + /// run that failed, up to the failure. Empty under an explore schedule. + #[prost(message, repeated, tag="9")] + pub trace: ::prost::alloc::vec::Vec, + /// How many of the oldest records the service's held-events bound discarded. + #[prost(int32, tag="10")] + pub trace_dropped: i32, } /// ExecuteStateRequest requests state machine execution #[derive(Clone, PartialEq, ::prost::Message)] @@ -3597,7 +3625,12 @@ pub struct DocumentState { /// session's trace, in the order the run made it. #[derive(Clone, PartialEq, ::prost::Message)] pub struct DocumentEvent { - /// "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". + /// "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or + /// "terminate" for a state machine's records; an action's run adds "step" (a + /// token arriving at a node), "wait" (a token parking at an accept node), + /// "assign" (a feature written), "decide" (a decision node resolved) and + /// "complete" (the action's performance completed); its "accept" is the accept + /// node taking a message and its "send" a message posted. #[prost(string, tag="1")] pub kind: ::prost::alloc::string::String, /// The clock's instant when the record was made: a quantity in the clock's @@ -3612,10 +3645,13 @@ pub struct DocumentEvent { /// under, else its declared name; empty for the run's own records. #[prost(string, tag="4")] pub machine: ::prost::alloc::string::String, - /// The state entered, exited or stepped by an entry, exit or do record. + /// The state entered, exited or stepped by an entry, exit or do record; the + /// action node a wait, assign, decide or action accept record is at. #[prost(string, tag="5")] pub state: ::prost::alloc::string::String, - /// A fired transition's source and target states. + /// A fired transition's source and target states; a step's source node (empty + /// where the token's flow starts) and the node it arrived at; a decide's + /// branch taken, as `taken` names it. #[prost(string, tag="6")] pub from: ::prost::alloc::string::String, #[prost(string, tag="7")] @@ -3624,13 +3660,15 @@ pub struct DocumentEvent { /// send addressed to no object. #[prost(message, optional, boxed, tag="8")] pub target: ::core::option::Option<::prost::alloc::boxed::Box>, - /// The signal or event accepted or sent, or the trigger a transition fired on. + /// The signal or event accepted or sent, the trigger a transition fired on, or + /// the message type or trigger a wait record waits for. #[prost(string, tag="9")] pub event: ::prost::alloc::string::String, /// An accept's payload, one `name = value` entry per parameter in name order. #[prost(string, repeated, tag="10")] pub payload: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - /// A choice's alternatives, in the order they were offered, and the one taken. + /// A choice's alternatives, in the order they were offered, and the one taken; + /// a decide's branches as `->`, and the one taken. #[prost(string, repeated, tag="11")] pub alternatives: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, #[prost(string, tag="12")] @@ -3638,6 +3676,19 @@ pub struct DocumentEvent { /// The line the trace prints for the record. #[prost(string, tag="13")] pub text: ::prost::alloc::string::String, + /// The action token a step, wait, assign, decide or action accept record is + /// about, and the executor step (1-based) that made the record; 0 for a record + /// of neither (a state machine's, a send from outside the model). + #[prost(int64, tag="14")] + pub token: i64, + #[prost(int32, tag="15")] + pub step: i32, + /// The feature an assign record wrote and the value it holds since, as the + /// run's outputs carry values. + #[prost(string, tag="16")] + pub feature: ::prost::alloc::string::String, + #[prost(message, optional, tag="17")] + pub value: ::core::option::Option, } /// DocumentQueryColumn is one projected property, in projection order. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] From 5d66d4fdcd8ed6c7b8efc708577f52d45226a442 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:28:26 +0000 Subject: [PATCH 03/12] feat(client): trace and events options for ExecuteAction in the Node and Java clients Co-Authored-By: jason.han --- .../org/openmbee/opensysml/ActionRun.java | 23 ++++- .../org/openmbee/opensysml/Capabilities.java | 3 + .../org/openmbee/opensysml/DocumentValue.java | 23 ++++- .../openmbee/opensysml/ExecutionOptions.java | 40 ++++++--- .../java/org/openmbee/opensysml/Model.java | 28 +++++-- .../openmbee/opensysml/internal/Protos.java | 10 ++- .../opensysml/ApiIntegrationTest.java | 44 +++++++++- .../openmbee/opensysml/PublicTypesTest.java | 6 +- client/node/src/core/capabilities.ts | 2 + client/node/src/core/connection.ts | 26 +++++- client/node/src/core/document.ts | 25 +++++- client/node/src/core/index.ts | 1 + client/node/src/core/model.ts | 4 + client/node/test/execute.test.ts | 84 ++++++++++++++++++- client/node/test/wasm.test.ts | 1 + 15 files changed, 289 insertions(+), 31 deletions(-) diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ActionRun.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ActionRun.java index 20b44148cb..2797c6060f 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ActionRun.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ActionRun.java @@ -19,7 +19,9 @@ public record ActionRun( Map outputs, OptionalDouble finalTime, List diagnostics, - Map performer) { + Map performer, + List trace, + int traceDropped) { /** * Creates an action run, copying its collections. @@ -28,12 +30,31 @@ public record ActionRun( * @param finalTime the final time, when reported * @param diagnostics the diagnostics * @param performer the performer's attributes by outcome key + * @param trace the run's records when a trace was asked for, in order + * @param traceDropped oldest trace records the service discarded */ public ActionRun { outputs = Map.copyOf(outputs); Objects.requireNonNull(finalTime, "finalTime"); diagnostics = List.copyOf(diagnostics); performer = Map.copyOf(performer); + trace = List.copyOf(trace); + } + + /** + * Creates an untraced action run. + * + * @param outputs the outputs by name + * @param finalTime the final time, when reported + * @param diagnostics the diagnostics + * @param performer the performer's attributes by outcome key + */ + public ActionRun( + Map outputs, + OptionalDouble finalTime, + List diagnostics, + Map performer) { + this(outputs, finalTime, diagnostics, performer, List.of(), 0); } /** diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Capabilities.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Capabilities.java index 8b6d0a3239..808373916d 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Capabilities.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Capabilities.java @@ -238,6 +238,9 @@ public final class Capabilities { /** The {@code trace} field on {@code ExecuteStateRequest}. */ public static final String STATE_TRACE = "state_trace"; + /** The {@code trace} field on {@code ExecuteActionRequest}: the run's token steps, waits, accepts, decisions and assignments. */ + public static final String ACTION_TRACE = "action_trace"; + /** The execution responses report {@code final_time}, the run's simulation clock when it ended, in seconds. */ public static final String FINAL_TIME = "final_time"; diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentValue.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentValue.java index 79868c4593..89c05c0722 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentValue.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentValue.java @@ -264,7 +264,9 @@ record DocumentState( * binding one is refused. * * @param kind {@code "accept"}, {@code "send"}, {@code "transition"}, {@code "entry"}, {@code - * "exit"}, {@code "do"}, {@code "choice"}, {@code "guard"} or {@code "terminate"} + * "exit"}, {@code "do"}, {@code "choice"}, {@code "guard"} or {@code "terminate"}; an action's + * run adds {@code "step"}, {@code "wait"}, {@code "assign"}, {@code "decide"} and {@code + * "complete"} * @param time the instant the record was written at, in the runtime clock's unit — a {@link * QuantityValue} when the clock carries a unit, a plain number otherwise * @param text the record as the trace prints it @@ -278,7 +280,12 @@ record DocumentState( * @param event the accepted or sent event's type name * @param payload the accept's payload, one {@code name = value} text per attribute * @param alternatives what a choice drew from, in order - * @param taken the alternative the choice took + * @param taken the alternative the choice took, or the branch a decide took + * @param token the action token a step, wait, assign, decide or accept record is about; 0 for a + * record of none + * @param step the executor step that made the record; 0 for none + * @param feature the feature an assign record wrote + * @param value what that feature holds since; absent for every other kind */ record DocumentEvent( String kind, @@ -293,7 +300,11 @@ record DocumentEvent( String event, List payload, List alternatives, - String taken) + String taken, + long token, + int step, + String feature, + Optional value) implements DocumentValue { /** @@ -312,6 +323,10 @@ record DocumentEvent( * @param payload the payload entries * @param alternatives the alternatives * @param taken the one taken, never {@code null} + * @param token the token, 0 for none + * @param step the executor step, 0 for none + * @param feature the assigned feature, never {@code null} + * @param value the assigned value, when there is one */ public DocumentEvent { Objects.requireNonNull(kind, "kind"); @@ -327,6 +342,8 @@ record DocumentEvent( payload = List.copyOf(payload); alternatives = List.copyOf(alternatives); Objects.requireNonNull(taken, "taken"); + Objects.requireNonNull(feature, "feature"); + Objects.requireNonNull(value, "value"); } } } diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ExecutionOptions.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ExecutionOptions.java index 7fc2df4e3d..48a84b8c64 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ExecutionOptions.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/ExecutionOptions.java @@ -1,5 +1,6 @@ package org.openmbee.opensysml; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.OptionalDouble; @@ -15,7 +16,7 @@ * @param performer the object the behavior runs on, as {@code sysml -action " "} * names it: a part definition or usage to make an object of, or a path from one into its parts * ({@code "Mission::mission.vehicle"}), made for the run. Absent runs outside any object. - * @param trace whether a state run returns its documented execution trace + * @param trace whether a state or action run returns its documented execution trace * @param advance simulated time, in seconds, to run for ({@code sysml -advance}): the behavior is * started and its clock moved by this much; an action not completed by then fails with the * instant it waits for. Absent runs to completion. @@ -25,6 +26,9 @@ * default), {@code "min"}, {@code "max"} or {@code "average"} * @param clockStep the step, in seconds, the run's clock ticks by ({@code sysml -clock-step}); 0 * is a continuous clock + * @param events signals to post to an action's performer in order, each once every token of the + * run waits, as the REPL's {@code %send} does; the accept waiting for one takes it on the next + * step. Needs a performer. (A state run's events are an argument of its own.) */ public record ExecutionOptions( Optional schedule, @@ -33,7 +37,8 @@ public record ExecutionOptions( OptionalDouble advance, OptionalLong seed, Optional draws, - double clockStep) { + double clockStep, + List events) { private static final String EXPLORE = "explore"; @@ -49,6 +54,7 @@ public record ExecutionOptions( Objects.requireNonNull(advance, "advance"); Objects.requireNonNull(seed, "seed"); Objects.requireNonNull(draws, "draws"); + events = List.copyOf(events); } /** @@ -64,7 +70,8 @@ public static ExecutionOptions defaults() { OptionalDouble.empty(), OptionalLong.empty(), Optional.empty(), - 0); + 0, + List.of()); } /** @@ -75,7 +82,7 @@ public static ExecutionOptions defaults() { */ public ExecutionOptions withSchedule(String schedule) { return new ExecutionOptions( - Optional.of(schedule), performer, trace, advance, seed, draws, clockStep); + Optional.of(schedule), performer, trace, advance, seed, draws, clockStep, events); } /** @@ -86,12 +93,13 @@ public ExecutionOptions withSchedule(String schedule) { */ public ExecutionOptions withPerformer(String performer) { return new ExecutionOptions( - schedule, Optional.of(performer), trace, advance, seed, draws, clockStep); + schedule, Optional.of(performer), trace, advance, seed, draws, clockStep, events); } /** The same options with a state-run trace requested. */ public ExecutionOptions withTrace() { - return new ExecutionOptions(schedule, performer, true, advance, seed, draws, clockStep); + return new ExecutionOptions( + schedule, performer, true, advance, seed, draws, clockStep, events); } /** @@ -102,7 +110,7 @@ public ExecutionOptions withTrace() { */ public ExecutionOptions withAdvance(double seconds) { return new ExecutionOptions( - schedule, performer, trace, OptionalDouble.of(seconds), seed, draws, clockStep); + schedule, performer, trace, OptionalDouble.of(seconds), seed, draws, clockStep, events); } /** @@ -113,7 +121,7 @@ public ExecutionOptions withAdvance(double seconds) { */ public ExecutionOptions withSeed(long seed) { return new ExecutionOptions( - schedule, performer, trace, advance, OptionalLong.of(seed), draws, clockStep); + schedule, performer, trace, advance, OptionalLong.of(seed), draws, clockStep, events); } /** @@ -124,7 +132,7 @@ public ExecutionOptions withSeed(long seed) { */ public ExecutionOptions withDraws(String draws) { return new ExecutionOptions( - schedule, performer, trace, advance, seed, Optional.of(draws), clockStep); + schedule, performer, trace, advance, seed, Optional.of(draws), clockStep, events); } /** @@ -134,7 +142,19 @@ public ExecutionOptions withDraws(String draws) { * @return options ticking by it */ public ExecutionOptions withClockStep(double seconds) { - return new ExecutionOptions(schedule, performer, trace, advance, seed, draws, seconds); + return new ExecutionOptions( + schedule, performer, trace, advance, seed, draws, seconds, events); + } + + /** + * Posts these signals to the action's performer, in order, as the run waits. + * + * @param events the signal or item definitions to post, qualified or as the action sees them + * @return these options with the events + */ + public ExecutionOptions withEvents(String... events) { + return new ExecutionOptions( + schedule, performer, trace, advance, seed, draws, clockStep, List.of(events)); } /** diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java index 25dc413dbc..970253bf52 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java @@ -667,13 +667,16 @@ public ActionRun executeAction(String actionSymbolId, Map inputs) * @param inputs values for its input parameters, by name * @param options the schedule the run resolves its choice points under and the object performing * it; an exploring schedule belongs to {@link #exploreAction} - * @return the outputs it produced - * @throws IllegalArgumentException if the schedule explores or a state trace is requested - * @throws ModelException if the action could not be executed + * @return the outputs it produced, with its trace when one was asked for + * @throws IllegalArgumentException if the schedule explores, or events are given without a + * performer + * @throws ModelException if the action could not be executed; a traced failure carries its + * partial trace * @throws ServiceException if the service does not hold this model, or the schedule names no * policy * @throws CapabilityException if a schedule is named and the service does not advertise {@code - * schedule}, or a performer and it does not advertise {@code performer} + * schedule}, a performer and it does not advertise {@code performer}, or a trace and it does + * not advertise {@code action_trace} */ public ActionRun executeAction( String actionSymbolId, Map inputs, ExecutionOptions options) { @@ -723,15 +726,24 @@ private ExecuteActionResponse executeAction( Objects.requireNonNull(actionSymbolId, "actionSymbolId"); Objects.requireNonNull(inputs, "inputs"); Objects.requireNonNull(options, NAME_OPTIONS); + if (explore && (options.trace() || !options.events().isEmpty())) { + throw new IllegalArgumentException("a trace or events describe one run, not an exploration"); + } + if (!options.events().isEmpty() && options.performer().isEmpty()) { + throw new IllegalArgumentException( + "events are posted to the object performing the action: name one with withPerformer"); + } if (options.trace()) { - throw new IllegalArgumentException("a state trace is only valid for a state run"); + connection.capabilities().require(Capabilities.ACTION_TRACE); } ExecuteActionRequest.Builder request = ExecuteActionRequest.newBuilder() .setModelHash(hash) .setActionSymbolId(actionSymbolId) .putAllInputs(Protos.protos(inputs, connection.capabilities())) - .setSchedule(schedule(options, explore)); + .setSchedule(schedule(options, explore)) + .setTrace(options.trace()) + .addAllEvents(options.events()); options.performer().ifPresent(request::setPerformerSymbolId); options.advance().ifPresent(request::setAdvance); options.seed().ifPresent(request::setSeed); @@ -744,8 +756,8 @@ private ExecuteActionResponse executeAction( response.getError(), FailureReason.UNSPECIFIED, Protos.diagnostics(response.getDiagnosticsList()), - List.of(), - 0, + Protos.documentEvents(response.getTraceList()), + response.getTraceDropped(), response.getFinalTime()); } return response; diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java index 4ab6f0e14e..25d76aa9fd 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/Protos.java @@ -1329,7 +1329,9 @@ public static ActionRun actionRun(ExecuteActionResponse response, boolean finalT values(response.getOutputsMap()), finalTimeReported ? OptionalDouble.of(response.getFinalTime()) : OptionalDouble.empty(), diagnostics(response.getDiagnosticsList()), - values(response.getPerformerAttributesMap())); + values(response.getPerformerAttributesMap()), + documentEvents(response.getTraceList()), + response.getTraceDropped()); } /** @@ -2186,7 +2188,11 @@ private static DocumentValue.DocumentEvent documentEvent( event.getEvent(), event.getPayloadList(), event.getAlternativesList(), - event.getTaken()); + event.getTaken(), + event.getToken(), + event.getStep(), + event.getFeature(), + event.hasValue() ? Optional.of(readable(event.getValue())) : Optional.empty()); } /** diff --git a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java index 0c2b9ed0ea..073031b4a0 100644 --- a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java +++ b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java @@ -685,6 +685,14 @@ void aClosedConnectionRefusesCalls() { succession first init then Running; succession first Running then done; } + item def Go; + part def Craft; + part craft : Craft; + action waits { + first start; + then action hold accept go : Go; + then done; + } } """; @@ -705,12 +713,44 @@ void anActionRunsWithItsInputsAndReportsItsAttributes() { "Test::race", Map.of(), ExecutionOptions.defaults().withSchedule("declared")); assertEquals(new Value.IntegerValue(3), declared.outputs().get("x")); ExecutionOptions traced = ExecutionOptions.defaults().withTrace(); - assertThrows( - IllegalArgumentException.class, () -> model.executeAction("Test::addFive", Map.of(), traced)); assertThrows( IllegalArgumentException.class, () -> model.exploreAction("Test::race", Map.of(), traced)); } + @Test + void aTracedActionRunReportsItsStepsAndTakesPostedEvents() { + Model model = connection.parse(BEHAVIOR); + ExecutionOptions traced = ExecutionOptions.defaults().withTrace(); + ActionRun run = model.executeAction("Test::addFive", Map.of(), traced); + assertEquals(new Value.IntegerValue(5), run.outputs().get("result")); + List kinds = run.trace().stream().map(DocumentValue.DocumentEvent::kind).toList(); + assertTrue(kinds.containsAll(List.of("step", "assign", "complete")), kinds.toString()); + DocumentValue.DocumentEvent assign = + run.trace().stream().filter(e -> e.kind().equals("assign")).findFirst().orElseThrow(); + assertEquals("result", assign.feature()); + assertEquals(Optional.of(new Value.IntegerValue(5)), assign.value()); + assertEquals(1L, assign.token()); + assertEquals(0, run.traceDropped()); + + ExecutionOptions performed = traced.withPerformer("Test::craft"); + ModelException waiting = + assertThrows( + ModelException.class, () -> model.executeAction("Test::waits", Map.of(), performed)); + assertEquals("wait", waiting.trace().get(waiting.trace().size() - 1).kind()); + assertEquals("Go", waiting.trace().get(waiting.trace().size() - 1).event()); + + ActionRun sent = model.executeAction("Test::waits", Map.of(), performed.withEvents("Go")); + List sentKinds = sent.trace().stream().map(DocumentValue.DocumentEvent::kind).toList(); + assertTrue(sentKinds.containsAll(List.of("wait", "accept", "complete")), sentKinds.toString()); + + assertThrows( + IllegalArgumentException.class, + () -> model.executeAction("Test::waits", Map.of(), traced.withEvents("Go"))); + assertThrows( + IllegalArgumentException.class, + () -> model.exploreAction("Test::race", Map.of(), performed.withEvents("Go"))); + } + @Test void anActionThatCannotStartIsAModelFailureAndABadScheduleIsRefused() { Model model = connection.parse(BEHAVIOR); diff --git a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/PublicTypesTest.java b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/PublicTypesTest.java index f089978e0d..f72d7f6a34 100644 --- a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/PublicTypesTest.java +++ b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/PublicTypesTest.java @@ -612,7 +612,11 @@ void aModelExceptionPreservesDiagnosticsWhenSerialized() throws Exception { "", List.of(), List.of(), - ""); + "", + 0, + 0, + "", + Optional.empty()); ModelException original = new ModelException( "rejected", FailureReason.UNSPECIFIED, diagnostics, List.of(event), 2); diff --git a/client/node/src/core/capabilities.ts b/client/node/src/core/capabilities.ts index 9f223b5988..19d9a6d6e7 100644 --- a/client/node/src/core/capabilities.ts +++ b/client/node/src/core/capabilities.ts @@ -131,6 +131,8 @@ export const CAPABILITY_SCHEDULE_EXPLORE = "schedule_explore"; export const CAPABILITY_PERFORMER = "performer"; /** `trace` on `ExecuteStateRequest`, returning documented events from one run. */ export const CAPABILITY_STATE_TRACE = "state_trace"; +/** `trace` on `ExecuteActionRequest`, returning the run's token steps, waits, accepts, decisions and assignments. */ +export const CAPABILITY_ACTION_TRACE = "action_trace"; /** The `ListEngines` RPC, the `engine` field selecting an analysis engine, and `engine`, `strength` and `bounds` on the answers. */ export const CAPABILITY_ENGINES = "engines"; /** A model-level result the model leaves open as `Value.undetermined`, read as an `undetermined` value. */ diff --git a/client/node/src/core/connection.ts b/client/node/src/core/connection.ts index f57ee47f3c..e767e8d9ce 100644 --- a/client/node/src/core/connection.ts +++ b/client/node/src/core/connection.ts @@ -26,6 +26,7 @@ import { CAPABILITY_PARSE_SOURCES_AFFECTED, CAPABILITY_PERFORMER, CAPABILITY_STATE_TRACE, + CAPABILITY_ACTION_TRACE, CAPABILITY_QUERY, CAPABILITY_QUERY_ORDER_BY, CAPABILITY_OSLC_QUERY, @@ -918,17 +919,29 @@ export class Connection { draws?: string; /** Seconds the run's clock ticks by (`sysml -clock-step`); 0 is continuous. */ clockStep?: number; + /** Return the run's typed trace (token steps, waits, accepts, decisions, assignments, completion); needs `action_trace`. */ + trace?: boolean; + /** Signals to post to the performer in order, each once every token of the run waits, as the REPL's `%send` does; needs `performer`. */ + events?: readonly string[]; } = {}, ): Promise<{ outputs: ReadonlyMap; performer: ReadonlyMap; finalTime: number; + /** The run's records when `trace` was asked for, in order. */ + trace: DocumentEvent[]; + traceDropped: number; /** Output name → how many of the run's unresolved choice points touch it; the * value then stands only up to the order the run took, and `exploreAction` * shows the set. Absent for an output nothing order-dependent wrote. */ orderDependent: ReadonlyMap; }> { refuseExploring(options.schedule, "exploreAction"); + if ((options.events?.length ?? 0) > 0 && !options.performer) { + throw new InvalidRequestError( + "events are posted to the object performing the action: name one with performer", + ); + } const response = await this.sendExecuteAction( modelHash, actionSymbolId, @@ -939,12 +952,16 @@ export class Connection { response.error, "unspecified", response.diagnostics.map(decodeDiagnostic), + response.trace.map(documentEventOf), + response.traceDropped, ); } return { outputs: valuesMap(Object.entries(response.outputs)), performer: valuesMap(Object.entries(response.performerAttributes)), finalTime: response.finalTime, + trace: response.trace.map(documentEventOf), + traceDropped: response.traceDropped, orderDependent: new Map(Object.entries(response.orderDependent)), }; } @@ -978,6 +995,8 @@ export class Connection { seed?: bigint; draws?: string; clockStep?: number; + trace?: boolean; + events?: readonly string[]; }, ): Promise { const inputs: Record> = {}; @@ -987,6 +1006,8 @@ export class Connection { const capabilities = this.runCapabilities( options.schedule, options.performer, + options.trace, + CAPABILITY_ACTION_TRACE, ); const response = await callRpc( this.rpc.executeAction( @@ -1000,6 +1021,8 @@ export class Connection { seed: options.seed, draws: options.draws ?? "", clockStep: options.clockStep ?? 0, + trace: options.trace ?? false, + events: [...(options.events ?? [])], }), this.callOptions(), ), @@ -1868,13 +1891,14 @@ export class Connection { schedule: string | undefined, performer: string | undefined, trace = false, + traceCapability = CAPABILITY_STATE_TRACE, ): string[] { const capabilities = scheduleCapabilities(schedule); if (performer !== undefined && performer !== "") { capabilities.push(CAPABILITY_PERFORMER); } if (trace) { - capabilities.push(CAPABILITY_STATE_TRACE); + capabilities.push(traceCapability); } for (const capability of capabilities) { requireCapability(this.info, capability, upgradeRemedy(capability)); diff --git a/client/node/src/core/document.ts b/client/node/src/core/document.ts index 35f69a3c90..c570daa078 100644 --- a/client/node/src/core/document.ts +++ b/client/node/src/core/document.ts @@ -23,6 +23,7 @@ import { import { DocumentQueryError, UnsupportedValueError } from "./errors.js"; import { decodeBigInteger, + decodeValue, decodeRational, encodeQuantityMagnitude, encodeRational, @@ -190,7 +191,7 @@ export class DocumentState { /** A row an `Events` query answered: one record of a session's trace. Answered only. */ export class DocumentEvent { - /** "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate". */ + /** "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or "terminate"; an action's run adds "step", "wait", "assign", "decide" and "complete". */ readonly kind: string; /** The instant the record was written at: a quantity, an int or a real. */ readonly time: DocumentValue; @@ -212,10 +213,18 @@ export class DocumentEvent { readonly payload: readonly string[]; /** What a choice drew from, in order. */ readonly alternatives: readonly string[]; - /** The alternative the choice took. */ + /** The alternative the choice took, or the branch a decide took. */ readonly taken: string; /** The record as the trace prints it. */ readonly text: string; + /** The action token a step, wait, assign, decide or accept record is about; 0n for a record of none. */ + readonly token: bigint; + /** The executor step that made the record; 0 for none. */ + readonly step: number; + /** The feature an assign record wrote. */ + readonly feature: string; + /** What that feature holds since; undefined for any other record. */ + readonly value: SysMLValue | undefined; constructor(init: { kind: string; @@ -231,6 +240,10 @@ export class DocumentEvent { payload?: readonly string[]; alternatives?: readonly string[]; taken?: string; + token?: bigint; + step?: number; + feature?: string; + value?: SysMLValue; }) { this.kind = init.kind; this.time = init.time; @@ -245,6 +258,10 @@ export class DocumentEvent { this.payload = init.payload ?? []; this.alternatives = init.alternatives ?? []; this.taken = init.taken ?? ""; + this.token = init.token ?? 0n; + this.step = init.step ?? 0; + this.feature = init.feature ?? ""; + this.value = init.value; } toString(): string { @@ -539,6 +556,10 @@ function eventOf(event: NonNullable= 5 then waiting; + else finish; + action waiting accept go : Go; + then action land assign landed := true; + then finish; + action finish; + then done; + } +} +`; + +test("an action run returns its requested trace and takes posted events", async () => { + await using connection = await connect(); + const model = await connection.loads(ACTION_TRACE_MODEL); + const inputs = { budget: { kind: "int" as const, value: 10n } }; + + await assert.rejects( + () => model.executeAction("Trace::Flow", { inputs, performer: "Trace::craft", trace: true }), + (error: unknown) => { + assert.ok(error instanceof ExecutionError); + assert.match(error.message, /accept deadlock/); + const last = error.trace[error.trace.length - 1]; + assert.equal(last.kind, "wait"); + assert.equal(last.event, "Go"); + return true; + }, + ); + + const run = await model.executeAction("Trace::Flow", { + inputs, + performer: "Trace::craft", + trace: true, + events: ["Go"], + }); + assert.deepEqual(run.outputs.get("landed"), { kind: "sequence", elements: [{ kind: "boolean", value: true }] }); + const kinds = run.trace.map((event) => event.kind); + for (const kind of ["step", "assign", "decide", "wait", "accept", "complete"]) { + assert.ok(kinds.includes(kind), `trace lacks ${kind}: ${kinds.join(",")}`); + } + const assign = run.trace.find((event) => event.kind === "assign"); + assert.equal(assign?.feature, "remaining"); + assert.deepEqual(assign?.value, { kind: "int", value: 7n }); + assert.equal(assign?.token, 1n); + assert.equal(run.traceDropped, 0); + + await assert.rejects( + () => model.executeAction("Trace::Flow", { inputs, events: ["Go"] }), + InvalidRequestError, + ); +}); + +test("an action trace is not sent without its capability", async () => { + const connection = await fakeConnection(["performer"], () => { + assert.fail("ExecuteAction was sent without the capability"); + }); + try { + await assert.rejects( + () => connection.executeAction("model-hash", "Trace::Flow", { trace: true }), + (error: unknown) => { + assert.ok(error instanceof MissingCapabilityError); + assert.equal(error.capability, "action_trace"); + return true; + }, + ); + } finally { + await connection.close(); + } +}); + test("an analysis performs its actions under the policy", async () => { await using connection = await connect(); const model = await connection.loads(SCHEDULE_MODEL); diff --git a/client/node/test/wasm.test.ts b/client/node/test/wasm.test.ts index 51d0c00053..f939c75b30 100644 --- a/client/node/test/wasm.test.ts +++ b/client/node/test/wasm.test.ts @@ -546,6 +546,7 @@ for (const thread of ["worker", "inline"] as const) { "big_int_values", "render_view", "state_trace", + "action_trace", ]); const wasmModel = await wasm.loads(SAMPLE); From a0722203241c1b4b5f45d5be0587e90f936006da Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:39:38 +0000 Subject: [PATCH 04/12] feat(client): trace and events options for ExecuteAction in the Rust and MATLAB clients and the MCP tool Co-Authored-By: jason.han --- .../+internal/decodeDocumentValue.m | 8 +- .../+opensysml/+internal/runCapabilities.m | 6 +- client/matlab/+opensysml/capabilities.m | 1 + client/matlab/+opensysml/executeAction.m | 51 ++++++++-- client/matlab/tests/test_surface_offline.m | 2 + client/rust/conformance/src/main.rs | 99 ++++++++++--------- client/rust/opensysml/src/capabilities.rs | 2 + client/rust/opensysml/src/document.rs | 52 ++++++++-- client/rust/opensysml/src/operations.rs | 74 +++++++++----- client/rust/opensysml/src/results.rs | 4 + client/rust/opensysml/tests/surface.rs | 28 +++++- internal/frontend/mcp/runtimetools/runtime.go | 33 +++++-- .../mcp/runtimetools/runtimetools_test.go | 22 +++++ 13 files changed, 275 insertions(+), 107 deletions(-) diff --git a/client/matlab/+opensysml/+internal/decodeDocumentValue.m b/client/matlab/+opensysml/+internal/decodeDocumentValue.m index 953195e170..9835fb2109 100644 --- a/client/matlab/+opensysml/+internal/decodeDocumentValue.m +++ b/client/matlab/+opensysml/+internal/decodeDocumentValue.m @@ -84,6 +84,8 @@ target = opensysml.internal.decodeDocumentValue(struct('object', raw.target)); end time = opensysml.internal.decodeDocumentValue(raw.time); + assigned = []; + if isfield(raw, 'value'), assigned = opensysml.decodeValue(raw.value); end value = struct('type', 'event', 'kind', fieldOr(raw, 'kind', ''), ... 'time', time, 'text', fieldOr(raw, 'text', ''), 'object', object, ... 'machine', fieldOr(raw, 'machine', ''), 'state', fieldOr(raw, 'state', ''), ... @@ -91,7 +93,11 @@ 'target', target, 'event', fieldOr(raw, 'event', ''), ... 'payload', {toCells(fieldOr(raw, 'payload', {}))}, ... 'alternatives', {toCells(fieldOr(raw, 'alternatives', {}))}, ... - 'taken', fieldOr(raw, 'taken', '')); + 'taken', fieldOr(raw, 'taken', ''), ... + 'token', int64(str2double(string(fieldOr(raw, 'token', '0')))), ... + 'step', double(fieldOr(raw, 'step', 0)), ... + 'feature', fieldOr(raw, 'feature', ''), ... + 'value', assigned); end function value = parseId(raw) diff --git a/client/matlab/+opensysml/+internal/runCapabilities.m b/client/matlab/+opensysml/+internal/runCapabilities.m index 5553320cc2..55ed7aabb2 100644 --- a/client/matlab/+opensysml/+internal/runCapabilities.m +++ b/client/matlab/+opensysml/+internal/runCapabilities.m @@ -1,14 +1,16 @@ -function values = runCapabilities(conn, schedule, performer, trace) +function values = runCapabilities(conn, schedule, performer, trace, traceCapability) %RUNCAPABILITIES Require the capabilities named by a run's options. +% traceCapability names what trace asks for: 'state_trace' (default) or 'action_trace'. if nargin < 4, trace = false; end + if nargin < 5, traceCapability = 'state_trace'; end values = {}; if ~isempty(schedule) values{end+1} = 'schedule'; if explores(schedule), values{end+1} = 'schedule_explore'; end end if ~isempty(performer), values{end+1} = 'performer'; end - if trace, values{end+1} = 'state_trace'; end + if trace, values{end+1} = traceCapability; end for i = 1:numel(values), conn.require(values{i}); end end diff --git a/client/matlab/+opensysml/capabilities.m b/client/matlab/+opensysml/capabilities.m index efa72a34e2..311827681d 100644 --- a/client/matlab/+opensysml/capabilities.m +++ b/client/matlab/+opensysml/capabilities.m @@ -63,6 +63,7 @@ 'self_check', 'self_check', ... 'record_run', 'record_run', ... 'stateTrace', 'state_trace', ... + 'actionTrace', 'action_trace', ... 'finalTime', 'final_time', ... 'engines', 'engines', ... 'undeterminedValue', 'undetermined_value', ... diff --git a/client/matlab/+opensysml/executeAction.m b/client/matlab/+opensysml/executeAction.m index de6f185ead..ee671032db 100644 --- a/client/matlab/+opensysml/executeAction.m +++ b/client/matlab/+opensysml/executeAction.m @@ -1,26 +1,46 @@ function answer = executeAction(model, actionId, varargin) %EXECUTEACTION Run one action outcome. -% Options: inputs, schedule, performer, and the run options of the sysml -% command: advance (simulated seconds to run for, reported back in -% finalTime), seed (the model's own draws), draws ('random', 'min', 'max' -% or 'average') and clockStep. +% Options: inputs, schedule, performer, trace (the run's token steps, waits, +% accepts, decisions and assignments as answer.trace), events (signals posted +% to the performer in order, each once every token waits), and the run +% options of the sysml command: advance (simulated seconds to run for, +% reported back in finalTime), seed (the model's own draws), draws +% ('random', 'min', 'max' or 'average') and clockStep. options = opensysml.internal.nameValueOptions(struct( ... - 'inputs', struct(), 'schedule', '', 'performer', '', ... + 'inputs', struct(), 'schedule', '', 'performer', '', 'trace', false, 'events', {{}}, ... 'advance', [], 'seed', [], 'draws', '', 'clockStep', 0), varargin, 'executeAction'); schedule = char(options.schedule); rejectExplore(schedule, 'opensysml.exploreAction'); - capabilities = opensysml.internal.runCapabilities(model.connection, schedule, options.performer); + events = toTextCells(options.events); + if ~isempty(events) && isempty(options.performer) + opensysml.internal.raise('opensysml:argument', ... + 'executeAction events are posted to the object performing the action: name a performer'); + end + capabilities = opensysml.internal.runCapabilities(model.connection, schedule, ... + options.performer, options.trace, 'action_trace'); request = struct('modelHash', model.hash, 'actionSymbolId', char(actionId), ... 'inputs', encodeInputs(options.inputs, model.connection)); if ~isempty(schedule), request.schedule = schedule; end if ~isempty(options.performer), request.performerSymbolId = char(options.performer); end + if options.trace, request.trace = true; end + if ~isempty(events), request.events = events; end request = opensysml.internal.runOptions(request, options, 'executeAction'); - raw = opensysml.internal.checkError(opensysml.call(model.connection, ... - 'ExecuteAction', request, capabilities), 'ExecuteAction'); + raw = opensysml.call(model.connection, 'ExecuteAction', request, capabilities); + traceRaw = fieldOr(raw, 'trace', {}); + if iscell(traceRaw) + trace = cellfun(@decodeTraceEvent, traceRaw(:), 'UniformOutput', false); + elseif isstruct(traceRaw) + trace = arrayfun(@decodeTraceEvent, traceRaw(:), 'UniformOutput', false); + else + trace = {}; + end + details = struct('trace', {trace}, 'traceDropped', fieldOr(raw, 'traceDropped', 0)); + raw = opensysml.internal.checkError(raw, 'ExecuteAction', details); answer = struct('outputs', struct(), ... 'performerAttributes', containers.Map('KeyType', 'char', 'ValueType', 'any'), ... - 'finalTime', fieldOr(raw, 'finalTime', 0)); + 'finalTime', fieldOr(raw, 'finalTime', 0), ... + 'trace', {trace}, 'traceDropped', fieldOr(raw, 'traceDropped', 0)); if isfield(raw, 'outputs') answer.outputs = opensysml.internal.decodeNamedValues(raw.outputs, model.connection, false); end @@ -30,6 +50,19 @@ end end +function event = decodeTraceEvent(raw) + event = opensysml.internal.decodeDocumentValue(struct('event', raw)); +end + +function values = toTextCells(raw) + if isempty(raw), values = {}; + elseif ischar(raw), values = {raw}; + elseif iscell(raw), values = cellfun(@char, raw(:)', 'UniformOutput', false); + elseif isstruct(raw), values = cellfun(@char, num2cell(raw(:)'), 'UniformOutput', false); + else, values = {char(raw)}; + end +end + function encoded = encodeInputs(inputs, conn) encoded = opensysml.internal.encodeNamedArguments(inputs, conn, 'executeAction inputs'); end diff --git a/client/matlab/tests/test_surface_offline.m b/client/matlab/tests/test_surface_offline.m index c1ef2ea955..045dbee4bc 100644 --- a/client/matlab/tests/test_surface_offline.m +++ b/client/matlab/tests/test_surface_offline.m @@ -640,6 +640,8 @@ function test_surface_offline() assert_error(@() opensysml.executeState(model, 'Demo::Machine', ... 'schedule', 'explore', 'trace', true), ... 'opensysml:argument', 'executeState trace exploration is invalid'); + assert_error(@() opensysml.executeAction(model, 'Demo::action', 'events', {'Go'}), ... + 'opensysml:argument', 'executeAction events without a performer'); assert_error(@() opensysml.exploreAction(model, 'Demo::action', ... 'schedule', 'declared'), 'opensysml:argument', 'exploreAction schedule'); assert_error(@() opensysml.exploreState(model, 'Demo::Machine', ... diff --git a/client/rust/conformance/src/main.rs b/client/rust/conformance/src/main.rs index d26fafb46b..0cea498374 100644 --- a/client/rust/conformance/src/main.rs +++ b/client/rust/conformance/src/main.rs @@ -615,7 +615,7 @@ impl Runner { }; match self.connection.parse_sources(&documents, &options) { Ok(model) => self.model_json(&model), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.ParseSourcesResponse", &wire::ParseSourcesResponse { @@ -661,7 +661,7 @@ impl Runner { Ok(conversion) => { Answer::Response(self.wire_json("sysml.ConvertResponse", conversion.wire())) } - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.ConvertResponse", &wire::ConvertResponse { @@ -909,7 +909,7 @@ impl Runner { Ok(result) => { Answer::Response(self.wire_json("sysml.ImportDataResponse", result.wire())) } - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => Answer::Response(self.wire_json( "sysml.ImportDataResponse", &wire::ImportDataResponse { @@ -948,7 +948,7 @@ impl Runner { Ok(result) => { Answer::Response(self.wire_json("sysml.CompareResultsResponse", result.wire())) } - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => Answer::Response(self.wire_json( "sysml.CompareResultsResponse", &wire::CompareResultsResponse { @@ -995,7 +995,7 @@ impl Runner { }; let response = match checked { Ok(result) => result.wire().clone(), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => wire::CheckBehaviorResponse { verdict: "undecided".to_owned(), error: failure.error, @@ -1054,6 +1054,7 @@ impl Runner { seed: request.seed, draws: optional(request.draws), clock_step: request.clock_step, + events: Vec::new(), }; let hash = &request.model_hash; let action = &request.action_symbol_id; @@ -1068,18 +1069,20 @@ impl Runner { Answer::Response(self.wire_json("sysml.ExecuteActionResponse", run.wire())) }) }; - answer.unwrap_or_else(|error| match Failure::of(error) { - Ok(failure) => self.in_band( - "sysml.ExecuteActionResponse", - &wire::ExecuteActionResponse { - error: failure.error, - diagnostics: failure.diagnostics, - final_time: failure.final_time, - ..Default::default() - }, - ), - Err(answer) => answer, - }) + answer.unwrap_or_else( + |error| match Failure::of(error, self.connection.capabilities()) { + Ok(failure) => self.in_band( + "sysml.ExecuteActionResponse", + &wire::ExecuteActionResponse { + error: failure.error, + diagnostics: failure.diagnostics, + final_time: failure.final_time, + ..Default::default() + }, + ), + Err(answer) => answer, + }, + ) } fn execute_state(&self, request: &DynamicMessage) -> Answer { @@ -1095,6 +1098,7 @@ impl Runner { seed: request.seed, draws: optional(request.draws), clock_step: request.clock_step, + events: Vec::new(), }; let hash = &request.model_hash; let machine = &request.state_machine_symbol_id; @@ -1109,20 +1113,22 @@ impl Runner { Answer::Response(self.wire_json("sysml.ExecuteStateResponse", run.wire())) }) }; - answer.unwrap_or_else(|error| match Failure::of(error) { - Ok(failure) => self.in_band( - "sysml.ExecuteStateResponse", - &wire::ExecuteStateResponse { - error: failure.error, - diagnostics: failure.diagnostics, - trace: failure.trace, - trace_dropped: failure.trace_dropped, - final_time: failure.final_time, - ..Default::default() - }, - ), - Err(answer) => answer, - }) + answer.unwrap_or_else( + |error| match Failure::of(error, self.connection.capabilities()) { + Ok(failure) => self.in_band( + "sysml.ExecuteStateResponse", + &wire::ExecuteStateResponse { + error: failure.error, + diagnostics: failure.diagnostics, + trace: failure.trace, + trace_dropped: failure.trace_dropped, + final_time: failure.final_time, + ..Default::default() + }, + ), + Err(answer) => answer, + }, + ) } fn list_engines(&self, request: &DynamicMessage) -> Answer { @@ -1175,8 +1181,11 @@ impl Runner { } /// A refused verification: a wrong kind answers in the verdict, anything else beside it. - fn refused_verdict(error: Error) -> Result<(Option, Failure), Answer> { - let failure = Failure::of(error)?; + fn refused_verdict( + error: Error, + capabilities: &opensysml::Capabilities, + ) -> Result<(Option, Failure), Answer> { + let failure = Failure::of(error, capabilities)?; if failure.reason == FailureReason::WrongKind { let verdict = wire::Verdict { failure_reason: failure.reason(), @@ -1219,7 +1228,7 @@ impl Runner { ..Default::default() } } - Err(error) => match Self::refused_verdict(error) { + Err(error) => match Self::refused_verdict(error, self.connection.capabilities()) { Ok((verdict, failure)) => wire::VerifyConstraintResponse { verdict, error: failure.error, @@ -1260,7 +1269,7 @@ impl Runner { ..Default::default() } } - Err(error) => match Self::refused_verdict(error) { + Err(error) => match Self::refused_verdict(error, self.connection.capabilities()) { Ok((verdict, failure)) => wire::VerifyRequirementResponse { verdict, error: failure.error, @@ -1287,7 +1296,7 @@ impl Runner { Ok(satisfaction) => Answer::Response( self.wire_json("sysml.VerifySatisfactionResponse", satisfaction.wire()), ), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.VerifySatisfactionResponse", &wire::VerifySatisfactionResponse { @@ -1316,7 +1325,7 @@ impl Runner { Ok(validation) => Answer::Response( self.wire_json("sysml.ValidateInstanceResponse", validation.wire()), ), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.ValidateInstanceResponse", &wire::ValidateInstanceResponse { @@ -1350,7 +1359,7 @@ impl Runner { Ok(result) => { Answer::Response(self.wire_json("sysml.EvaluateCalcResponse", result.wire())) } - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.EvaluateCalcResponse", &wire::EvaluateCalcResponse { @@ -1401,7 +1410,7 @@ impl Runner { Error::AnalysisRun { result, .. } => { self.in_band("sysml.RunAnalysisResponse", result.wire()) } - error => match Failure::of(error) { + error => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.RunAnalysisResponse", &wire::RunAnalysisResponse { @@ -1446,7 +1455,7 @@ impl Runner { }; match self.connection.run_runs(&request.model_hash, &options) { Ok(runs) => Answer::Response(self.wire_json("sysml.RunRunsResponse", runs.wire())), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.RunRunsResponse", &wire::RunRunsResponse { @@ -1471,7 +1480,7 @@ impl Runner { .self_check(&request.model_hash, &request.self_check_package) { Ok(check) => Answer::Response(self.wire_json("sysml.SelfCheckResponse", check.wire())), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.SelfCheckResponse", &wire::SelfCheckResponse { @@ -1533,7 +1542,7 @@ impl Runner { Ok(recording) => { Answer::Response(self.wire_json("sysml.RecordRunResponse", recording.wire())) } - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.RecordRunResponse", &wire::RecordRunResponse { @@ -1589,7 +1598,7 @@ impl Runner { .run_sweep(&request.model_hash, &request.symbol_id, &ranges, &options) { Ok(table) => Answer::Response(self.wire_json("sysml.RunSweepResponse", table.wire())), - Err(error) => match Failure::of(error) { + Err(error) => match Failure::of(error, self.connection.capabilities()) { Ok(failure) => self.in_band( "sysml.RunSweepResponse", &wire::RunSweepResponse { @@ -1683,7 +1692,7 @@ struct Failure { } impl Failure { - fn of(error: Error) -> Result { + fn of(error: Error, capabilities: &opensysml::Capabilities) -> Result { match error { Error::Execution { message, @@ -1698,7 +1707,7 @@ impl Failure { diagnostics: diagnostics_wire(&diagnostics), trace: trace .iter() - .map(opensysml::document_event_to_wire) + .map(|event| opensysml::document_event_to_wire(event, capabilities)) .collect::>() .map_err(classify_error)?, trace_dropped, diff --git a/client/rust/opensysml/src/capabilities.rs b/client/rust/opensysml/src/capabilities.rs index 50c98972cf..fed85197dc 100644 --- a/client/rust/opensysml/src/capabilities.rs +++ b/client/rust/opensysml/src/capabilities.rs @@ -125,6 +125,8 @@ pub const CAPABILITY_SCHEDULE_EXPLORE: &str = "schedule_explore"; pub const CAPABILITY_PERFORMER: &str = "performer"; /// The `trace` field of an `ExecuteStateRequest`. pub const CAPABILITY_STATE_TRACE: &str = "state_trace"; +/// The `trace` field of an `ExecuteActionRequest`: the run's token steps, waits, accepts, decisions and assignments. +pub const CAPABILITY_ACTION_TRACE: &str = "action_trace"; /// `final_time` populated on an action or state run's response. pub const CAPABILITY_FINAL_TIME: &str = "final_time"; /// `ListEngines`, the `engine` selection and the standing reported on responses. diff --git a/client/rust/opensysml/src/document.rs b/client/rust/opensysml/src/document.rs index 72725b6695..5319fd1393 100644 --- a/client/rust/opensysml/src/document.rs +++ b/client/rust/opensysml/src/document.rs @@ -3,9 +3,10 @@ use std::fmt; use crate::domain::{ - quantity_from_wire, rational_from_wire, rational_to_wire, BigInteger, Quantity, + quantity_from_wire, rational_from_wire, rational_to_wire, value_from_wire, BigInteger, + Capabilities, Quantity, Value, }; -use crate::encode::{quantity_rational_as_real, quantity_to_wire, wire_exact_f64}; +use crate::encode::{quantity_rational_as_real, quantity_to_wire, value_to_wire, wire_exact_f64}; use crate::error::Error; use crate::rational::Rational; use crate::wire; @@ -153,8 +154,16 @@ pub struct DocumentEvent { pub payload: Vec, /// The choices a choice point offered. pub alternatives: Vec, - /// The choice it took. + /// The choice it took, or the branch a decide took. pub taken: String, + /// The action token a step, wait, assign, decide or accept record is about; 0 for none. + pub token: i64, + /// The executor step that made the record; 0 for none. + pub step: i32, + /// The feature an assign record wrote. + pub feature: String, + /// What that feature holds since; `None` for every other kind. + pub value: Option>, } pub(crate) fn document_event_from_wire(event: wire::DocumentEvent) -> Result { @@ -176,11 +185,21 @@ pub(crate) fn document_event_from_wire(event: wire::DocumentEvent) -> Result Result { +/// Encode a typed run event for a service response, its assigned value as `capabilities` allow. +pub fn document_event_to_wire( + event: &DocumentEvent, + capabilities: &Capabilities, +) -> Result { Ok(wire::DocumentEvent { kind: event.kind.clone(), time: Some(Box::new(bound_value("trace time", &event.time)?)), @@ -201,6 +220,14 @@ pub fn document_event_to_wire(event: &DocumentEvent) -> Result), } impl fmt::Display for DocumentValue { @@ -988,7 +1015,7 @@ fn row_of(row: wire::DocumentQueryRow) -> Result { .and_then(|object| object.element.clone()) .unwrap_or_default(); out.object = event.object.clone(); - out.event = Some(event); + out.event = Some(*event); } _ => unreachable!("the arms matched above decode to themselves"), }, @@ -1080,7 +1107,7 @@ fn value_of(value: wire::DocumentValue) -> Result { Some(time) => value_of(*time)?, None => return Err(Error::Decode("document event carries no time".to_owned())), }; - DocumentValue::Event(DocumentEvent { + DocumentValue::Event(Box::new(DocumentEvent { kind: event.kind, time: Box::new(time), text: event.text, @@ -1094,7 +1121,14 @@ fn value_of(value: wire::DocumentValue) -> Result { payload: event.payload, alternatives: event.alternatives, taken: event.taken, - }) + token: event.token, + step: event.step, + feature: event.feature, + value: event + .value + .map(|value| value_from_wire(value).map(Box::new)) + .transpose()?, + })) } None => { return Err(Error::Decode( diff --git a/client/rust/opensysml/src/operations.rs b/client/rust/opensysml/src/operations.rs index 5d68b34013..62552ea05e 100644 --- a/client/rust/opensysml/src/operations.rs +++ b/client/rust/opensysml/src/operations.rs @@ -3,14 +3,14 @@ use std::collections::{BTreeMap, HashMap}; use crate::capabilities::{ - upgrade_remedy, CAPABILITY_BIG_INT_VALUES, CAPABILITY_CHECK, CAPABILITY_COMPARE_RESULTS, - CAPABILITY_COMPLEX_VALUES, CAPABILITY_CONVERT, CAPABILITY_CONVERT_DOCUMENTS, - CAPABILITY_CONVERT_LIBRARY_STUBS, CAPABILITY_DOCUMENT_QUERY, CAPABILITY_ENGINES, - CAPABILITY_ENUM_VALUES, CAPABILITY_EXPORT_GRAPHS, CAPABILITY_FUNCTION_VALUES, - CAPABILITY_IMPORT_DATA, CAPABILITY_INFINITY_VALUE, CAPABILITY_INLINE_LANGUAGE, - CAPABILITY_MEASUREMENT_REFS, CAPABILITY_METAOBJECT_VALUES, CAPABILITY_MIGRATE, - CAPABILITY_OSLC_QUERY, CAPABILITY_PARSE_SOURCES, CAPABILITY_PERFORMER, CAPABILITY_QUERY, - CAPABILITY_QUERY_ORDER_BY, CAPABILITY_RATIONAL_VALUES, CAPABILITY_RECORD_RUN, + upgrade_remedy, CAPABILITY_ACTION_TRACE, CAPABILITY_BIG_INT_VALUES, CAPABILITY_CHECK, + CAPABILITY_COMPARE_RESULTS, CAPABILITY_COMPLEX_VALUES, CAPABILITY_CONVERT, + CAPABILITY_CONVERT_DOCUMENTS, CAPABILITY_CONVERT_LIBRARY_STUBS, CAPABILITY_DOCUMENT_QUERY, + CAPABILITY_ENGINES, CAPABILITY_ENUM_VALUES, CAPABILITY_EXPORT_GRAPHS, + CAPABILITY_FUNCTION_VALUES, CAPABILITY_IMPORT_DATA, CAPABILITY_INFINITY_VALUE, + CAPABILITY_INLINE_LANGUAGE, CAPABILITY_MEASUREMENT_REFS, CAPABILITY_METAOBJECT_VALUES, + CAPABILITY_MIGRATE, CAPABILITY_OSLC_QUERY, CAPABILITY_PARSE_SOURCES, CAPABILITY_PERFORMER, + CAPABILITY_QUERY, CAPABILITY_QUERY_ORDER_BY, CAPABILITY_RATIONAL_VALUES, CAPABILITY_RECORD_RUN, CAPABILITY_RENDER_DOCUMENT, CAPABILITY_RENDER_DOCUMENT_ASCIIDOC, CAPABILITY_RENDER_DOCUMENT_HTML, CAPABILITY_RUNS, CAPABILITY_SCHEDULE, CAPABILITY_SCHEDULE_EXPLORE, CAPABILITY_SELF_CHECK, CAPABILITY_SET_VALUES, @@ -80,7 +80,8 @@ pub struct RunOptions { pub schedule: Option, /// Qualified name of the part performing the behavior, whose attributes it reads and writes. pub performer: Option, - /// Return a state's documented execution records. + /// Return the run's documented execution records: a state's, or an action's token steps, + /// waits, accepts, decisions, assignments and completion. pub trace: bool, /// Simulated time, in seconds, to run for (`sysml -advance`); `None` runs to completion. pub advance: Option, @@ -91,6 +92,9 @@ pub struct RunOptions { pub draws: Option, /// The step, in seconds, the run's clock ticks by (`sysml -clock-step`); 0 is continuous. pub clock_step: f64, + /// Signals to post to an action's performer in order, each once every token of the run + /// waits, as the REPL's `%send` does; needs a performer. (A state run's events are an argument.) + pub events: Vec, } /// What to ask a verification and of whom. @@ -688,11 +692,13 @@ impl Connection { &self, schedule: Option<&str>, performer: Option<&str>, + trace: Option<&'static str>, ) -> Result, Error> { let mut capabilities = schedule_capabilities(schedule); if performer.is_some_and(|p| !p.is_empty()) { capabilities.push(CAPABILITY_PERFORMER); } + capabilities.extend(trace); self.require_all(&capabilities)?; Ok(capabilities) } @@ -706,7 +712,11 @@ impl Connection { schedule: Option<&str>, ) -> Result { let inputs = self.named_to_wire(inputs)?; - let capabilities = self.run_capabilities(schedule, options.performer.as_deref())?; + let capabilities = self.run_capabilities( + schedule, + options.performer.as_deref(), + options.trace.then_some(CAPABILITY_ACTION_TRACE), + )?; self.gated_rpc( "ExecuteAction", wire::ExecuteActionRequest { @@ -719,6 +729,8 @@ impl Connection { seed: options.seed, draws: options.draws.clone().unwrap_or_default(), clock_step: options.clock_step, + trace: options.trace, + events: options.events.clone(), }, &capabilities, ) @@ -733,10 +745,11 @@ impl Connection { schedule: Option<&str>, trace: bool, ) -> Result { - let mut capabilities = self.run_capabilities(schedule, options.performer.as_deref())?; - if trace { - capabilities.push(CAPABILITY_STATE_TRACE); - } + let capabilities = self.run_capabilities( + schedule, + options.performer.as_deref(), + trace.then_some(CAPABILITY_STATE_TRACE), + )?; self.gated_rpc( "ExecuteState", wire::ExecuteStateRequest { @@ -763,8 +776,13 @@ impl Connection { inputs: &BTreeMap, options: &RunOptions, ) -> Result { - Self::refuse_action_trace(options)?; refuse_exploring(options.schedule.as_deref(), "explore_action")?; + if !options.events.is_empty() && options.performer.as_deref().is_none_or(str::is_empty) { + return Err(Error::InvalidRequest( + "events are posted to the object performing the action: name one as performer" + .to_owned(), + )); + } let response = self.run_action( model_hash, action_id, @@ -774,13 +792,18 @@ impl Connection { )?; let wire = response.clone(); let diagnostics = diagnostics_of(&response.diagnostics); + let trace = response + .trace + .into_iter() + .map(document_event_from_wire) + .collect::, _>>()?; if !response.error.is_empty() { return Err(Error::Execution { message: response.error, reason: FailureReason::Unspecified, diagnostics, - trace: Vec::new(), - trace_dropped: 0, + trace, + trace_dropped: response.trace_dropped, final_time: response.final_time, }); } @@ -789,6 +812,8 @@ impl Connection { performer: value_map(&response.performer_attributes)?, final_time: response.final_time, diagnostics, + trace, + trace_dropped: response.trace_dropped, wire, }) } @@ -802,22 +827,17 @@ impl Connection { inputs: &BTreeMap, options: &RunOptions, ) -> Result { - Self::refuse_action_trace(options)?; + if options.trace || !options.events.is_empty() { + return Err(Error::InvalidRequest( + "a trace or events describe one run, not an exploration".to_owned(), + )); + } let schedule = options.schedule.as_deref().unwrap_or(SCHEDULE_EXPLORE); require_exploring(schedule)?; let response = self.run_action(model_hash, action_id, inputs, options, Some(schedule))?; exploration_of(ExploredResponse::Action(Box::new(response))) } - fn refuse_action_trace(options: &RunOptions) -> Result<(), Error> { - if options.trace { - return Err(Error::InvalidRequest( - "a state trace is only valid for a state run".to_owned(), - )); - } - Ok(()) - } - /// Run a state machine once, dispatching `events` in order. pub fn execute_state>( &self, diff --git a/client/rust/opensysml/src/results.rs b/client/rust/opensysml/src/results.rs index 20f0416003..bf0ecc68ef 100644 --- a/client/rust/opensysml/src/results.rs +++ b/client/rust/opensysml/src/results.rs @@ -1178,6 +1178,10 @@ pub struct ActionRun { pub final_time: f64, /// Diagnostics the service reported. pub diagnostics: Vec, + /// The run's records when `trace` was asked for, in order. + pub trace: Vec, + /// Oldest trace records the service discarded. + pub trace_dropped: i32, pub(crate) wire: wire::ExecuteActionResponse, } diff --git a/client/rust/opensysml/tests/surface.rs b/client/rust/opensysml/tests/surface.rs index 1cf3955f7e..cd1e941893 100644 --- a/client/rust/opensysml/tests/surface.rs +++ b/client/rust/opensysml/tests/surface.rs @@ -687,13 +687,33 @@ fn an_action_runs_explores_and_a_state_machine_steps() { trace: true, ..Default::default() }; + let traced = model + .execute_action("Demo::addFive", &BTreeMap::new(), &trace_for_action) + .expect("traced action run"); + let kinds: Vec<&str> = traced.trace.iter().map(|e| e.kind.as_str()).collect(); + assert!( + kinds.contains(&"step") && kinds.contains(&"complete"), + "{kinds:?}" + ); + let assign = traced + .trace + .iter() + .find(|e| e.kind == "assign") + .expect("assign record"); + assert_eq!(assign.feature, "result"); + assert_eq!(assign.value.as_deref(), Some(&Value::Integer(5.into()))); + assert_eq!(traced.trace_dropped, 0); assert!(matches!( - model.execute_action("Demo::addFive", &BTreeMap::new(), &trace_for_action), - Err(Error::InvalidRequest(message)) if message.contains("state run") + model.explore_action("Demo::race", &BTreeMap::new(), &trace_for_action), + Err(Error::InvalidRequest(message)) if message.contains("one run") )); + let events_without_performer = RunOptions { + events: vec!["Go".to_owned()], + ..Default::default() + }; assert!(matches!( - model.explore_action("Demo::race", &BTreeMap::new(), &trace_for_action), - Err(Error::InvalidRequest(message)) if message.contains("state run") + model.execute_action("Demo::addFive", &BTreeMap::new(), &events_without_performer), + Err(Error::InvalidRequest(message)) if message.contains("performer") )); assert!(matches!( model.explore_state::<&str>("Demo::Machine", &[], &trace_for_action), diff --git a/internal/frontend/mcp/runtimetools/runtime.go b/internal/frontend/mcp/runtimetools/runtime.go index d8d626c93e..3c66f3cfb9 100644 --- a/internal/frontend/mcp/runtimetools/runtime.go +++ b/internal/frontend/mcp/runtimetools/runtime.go @@ -36,6 +36,8 @@ type ExecuteActionInput struct { Seed *uint64 `json:"seed,omitempty" jsonschema:"seed the model's own draws (weighted decisions, random functions) are taken from (sysml -seed); the same seed draws the same run"` Draws string `json:"draws,omitempty" jsonschema:"how the run resolves RandomFunctions draws (sysml -draws): random (default, from seed), min, max or average"` ClockStep float64 `json:"clockStep,omitempty" jsonschema:"the step in seconds the run's clock ticks by (sysml -clock-step); 0 is a continuous clock"` + Trace bool `json:"trace,omitempty" jsonschema:"also answer the run's typed trace (token steps, waits, accepts, decisions, assignments, completion), up to a failure; unavailable under explore"` + Events []string `json:"events,omitempty" jsonschema:"signals or items to post to the performer in order, each once every token of the run waits (the REPL's %send); needs performerSymbolId"` } // ExecuteStateInput runs a state machine. @@ -114,7 +116,9 @@ func (g *group) registerRuntime(s *mcp.Server) { "REPL's %run). Inputs are bound by parameter name. Under an explore schedule every linearization the model admits is run " + "and the answer is the set of distinct `outcomes` with how the exploration ended, instead of one run's outputs. The run is " + "bounded by the service's OPENSYSML_MAX_* budgets; a budget hit is reported in `error`. `advance`, `seed`, `draws` and " + - "`clockStep` are the run options of `sysml -advance`, `-seed`, `-draws` and `-clock-step`. The result is the " + + "`clockStep` are the run options of `sysml -advance`, `-seed`, `-draws` and `-clock-step`. With `trace` the answer also " + + "carries every record the run made (token steps, waits, accepts, decisions, assignments, completion), up to a failure; " + + "`events` are posted to the performer in order, each once every token waits. The result is the " + "ExecuteActionResponse as protojson writes it.", Annotations: toolkit.ReadOnly("Execute action"), }, func(ctx context.Context, req *mcp.CallToolRequest, in ExecuteActionInput) (*mcp.CallToolResult, Result, error) { @@ -148,6 +152,7 @@ func (g *group) registerRuntime(s *mcp.Server) { fmt.Fprintf(&b, "final time %g s\n", resp.GetFinalTime()) } b.WriteString(explorationText(resp.GetOutcomes(), resp.GetExploration())) + b.WriteString(traceText(resp.GetTrace(), resp.GetTraceDropped())) b.WriteString(diagnosticsText(resp.GetDiagnostics())) return answer(resp, m, b.String()) }) @@ -189,15 +194,7 @@ func (g *group) registerRuntime(s *mcp.Server) { if resp.GetFinalTime() != 0 { fmt.Fprintf(&b, "final time %g s\n", resp.GetFinalTime()) } - if len(resp.GetTrace()) > 0 { - b.WriteString("trace:\n") - for _, ev := range resp.GetTrace() { - fmt.Fprintf(&b, " %s\n", ev.GetText()) - } - if resp.GetTraceDropped() > 0 { - fmt.Fprintf(&b, " (%d oldest records dropped)\n", resp.GetTraceDropped()) - } - } + b.WriteString(traceText(resp.GetTrace(), resp.GetTraceDropped())) b.WriteString(explorationText(resp.GetOutcomes(), resp.GetExploration())) b.WriteString(diagnosticsText(resp.GetDiagnostics())) return answer(resp, m, b.String()) @@ -275,3 +272,19 @@ func instantiateAnnotations() *mcp.ToolAnnotations { closed, destructive := false, false return &mcp.ToolAnnotations{Title: "Instantiate", DestructiveHint: &destructive, OpenWorldHint: &closed} } + +// traceText lists a run's trace records, one per line, and how many oldest ones were dropped. +func traceText(trace []*pb.DocumentEvent, dropped int32) string { + if len(trace) == 0 { + return "" + } + var b strings.Builder + b.WriteString("trace:\n") + for _, ev := range trace { + fmt.Fprintf(&b, " %s\n", ev.GetText()) + } + if dropped > 0 { + fmt.Fprintf(&b, " (%d oldest records dropped)\n", dropped) + } + return b.String() +} diff --git a/internal/frontend/mcp/runtimetools/runtimetools_test.go b/internal/frontend/mcp/runtimetools/runtimetools_test.go index d430903262..58fe87649e 100644 --- a/internal/frontend/mcp/runtimetools/runtimetools_test.go +++ b/internal/frontend/mcp/runtimetools/runtimetools_test.go @@ -424,6 +424,28 @@ func TestInstantiateReportsTheObject(t *testing.T) { } } +func TestExecuteActionTraceReportsTheRunsRecords(t *testing.T) { + h := attach(t, newService(t)) + hash := h.parse() + var resp pb.ExecuteActionResponse + _, out := h.ok("execute_action", map[string]any{ + "modelHash": hash, "actionSymbolId": "Demo::Count", "inputs": map[string]any{"lo": value("intValue", "41")}, "trace": true, + }, &resp) + kinds := make([]string, 0, len(resp.GetTrace())) + for _, ev := range resp.GetTrace() { + kinds = append(kinds, ev.GetKind()) + } + if resp.GetError() != "" || !slices.Contains(kinds, "step") || !slices.Contains(kinds, "complete") { + t.Errorf("traced Count(41): kinds %v, error %q\n%s", kinds, resp.GetError(), out) + } + if !strings.Contains(out, "trace:\n") { + t.Errorf("text lacks the trace:\n%s", out) + } + if msg := h.fails("execute_action", map[string]any{"modelHash": hash, "actionSymbolId": "Demo::Count", "events": []string{"Go"}}); !strings.Contains(msg, "INVALID_ARGUMENT") { + t.Errorf("events without a performer: %s", msg) + } +} + func TestExecuteActionBindsInputsAndReportsOutputs(t *testing.T) { h := attach(t, newService(t)) hash := h.parse() From 031ab540bd8974d4e9dea4518f96c5ed28778204 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:41:08 +0000 Subject: [PATCH 05/12] feat(client): trace and events options for ExecuteAction in the Julia client and the reference docs Co-Authored-By: jason.han --- client/julia/OpenSysML/src/OpenSysML.jl | 2 +- client/julia/OpenSysML/src/capabilities.jl | 2 ++ client/julia/OpenSysML/src/document.jl | 5 ++- client/julia/OpenSysML/src/document_types.jl | 8 +++++ client/julia/OpenSysML/src/model.jl | 32 +++++++++++++++++--- client/julia/OpenSysML/test/runtests.jl | 13 ++++++++ docs/reference/api.md | 6 ++++ docs/reference/java-api.md | 13 +++++--- docs/reference/julia-api.md | 3 ++ docs/reference/matlab-api.md | 3 ++ docs/reference/node-api.md | 5 ++- docs/reference/python-api.md | 4 +++ docs/reference/rust-api.md | 3 ++ docs/reference/service-transports.md | 2 +- docs/reference/wasm.md | 3 +- docs/reference/wire-contract.md | 10 ++++-- 16 files changed, 97 insertions(+), 17 deletions(-) diff --git a/client/julia/OpenSysML/src/OpenSysML.jl b/client/julia/OpenSysML/src/OpenSysML.jl index 2b62eec1da..87514f9018 100644 --- a/client/julia/OpenSysML/src/OpenSysML.jl +++ b/client/julia/OpenSysML/src/OpenSysML.jl @@ -133,7 +133,7 @@ for capability in ( :CAPABILITY_TENSOR_VALUES, :CAPABILITY_METAOBJECT_VALUES, :CAPABILITY_VERIFICATION_VERDICTS, :CAPABILITY_INFINITY_VALUE, :CAPABILITY_DIAGNOSTIC_CODES, :CAPABILITY_SCHEDULE, :CAPABILITY_CASE_EVALUATIONS, - :CAPABILITY_SCHEDULE_EXPLORE, :CAPABILITY_PERFORMER, :CAPABILITY_STATE_TRACE, + :CAPABILITY_SCHEDULE_EXPLORE, :CAPABILITY_PERFORMER, :CAPABILITY_STATE_TRACE, :CAPABILITY_ACTION_TRACE, :CAPABILITY_FINAL_TIME, :CAPABILITY_ENGINES, :CAPABILITY_UNDETERMINED_VALUE, :CAPABILITY_BIG_INT_VALUES, :CAPABILITY_RATIONAL_VALUES, :CAPABILITY_CONVERT_DOCUMENTS, :CAPABILITY_CONVERT_COMPACT, diff --git a/client/julia/OpenSysML/src/capabilities.jl b/client/julia/OpenSysML/src/capabilities.jl index d49fee87f0..63310a227a 100644 --- a/client/julia/OpenSysML/src/capabilities.jl +++ b/client/julia/OpenSysML/src/capabilities.jl @@ -62,6 +62,8 @@ const CAPABILITY_RUNS = "runs" const CAPABILITY_SELF_CHECK = "self_check" const CAPABILITY_RECORD_RUN = "record_run" const CAPABILITY_STATE_TRACE = "state_trace" +"The `trace` field of `ExecuteActionRequest`: the run's token steps, waits, accepts, decisions and assignments." +const CAPABILITY_ACTION_TRACE = "action_trace" const CAPABILITY_FINAL_TIME = "final_time" const CAPABILITY_ENGINES = "engines" const CAPABILITY_UNDETERMINED_VALUE = "undetermined_value" diff --git a/client/julia/OpenSysML/src/document.jl b/client/julia/OpenSysML/src/document.jl index fb1d2d9c01..c8bfa5c60d 100644 --- a/client/julia/OpenSysML/src/document.jl +++ b/client/julia/OpenSysML/src/document.jl @@ -212,7 +212,10 @@ function _document_value(raw) String(get(v, "from", "")), String(get(v, "to", "")), target_raw isa AbstractDict ? _document_object(target_raw) : nothing, String(get(v, "event", "")), String[String(x) for x in get(v, "payload", Any[])], - String[String(x) for x in get(v, "alternatives", Any[])], String(get(v, "taken", ""))) + String[String(x) for x in get(v, "alternatives", Any[])], String(get(v, "taken", "")), + parse(Int64, string(get(v, "token", 0))), Int(get(v, "step", 0)), + String(get(v, "feature", "")), + haskey(v, "value") ? decode_value(v["value"]) : nothing) end throw(UnsupportedValueError("unknown document value arm")) end diff --git a/client/julia/OpenSysML/src/document_types.jl b/client/julia/OpenSysML/src/document_types.jl index 32e344ffd4..2bc2230972 100644 --- a/client/julia/OpenSysML/src/document_types.jl +++ b/client/julia/OpenSysML/src/document_types.jl @@ -29,5 +29,13 @@ struct DocumentEvent payload::Vector{String} alternatives::Vector{String} taken::String + token::Int64 + step::Int + feature::String + value::Any end +DocumentEvent(kind, time, text, object, machine, state, from_state, to_state, target, event, + payload, alternatives, taken) = + DocumentEvent(kind, time, text, object, machine, state, from_state, to_state, target, event, + payload, alternatives, taken, 0, 0, "", nothing) Base.show(io::IO, event::DocumentEvent) = print(io, "$(event.time): $(event.text)") diff --git a/client/julia/OpenSysML/src/model.jl b/client/julia/OpenSysML/src/model.jl index 1f11244332..86c65e9de0 100644 --- a/client/julia/OpenSysML/src/model.jl +++ b/client/julia/OpenSysML/src/model.jl @@ -76,10 +76,14 @@ Model(conn::Connection, hash, diagnostics, documents, roots, source_path=nothing struct ActionOutputs <: AbstractDict{String,Any} outputs::Dict{String,Any} performer::Dict{String,Any} + trace::Vector{DocumentEvent} + trace_dropped::Int end -ActionOutputs(outputs::AbstractDict, performer::AbstractDict=Dict{String,Any}()) = +ActionOutputs(outputs::AbstractDict, performer::AbstractDict=Dict{String,Any}(), + trace::Vector{DocumentEvent}=DocumentEvent[], trace_dropped::Integer=0) = ActionOutputs(Dict{String,Any}(String(k) => v for (k, v) in outputs), - Dict{String,Any}(String(k) => v for (k, v) in performer)) + Dict{String,Any}(String(k) => v for (k, v) in performer), trace, + Int(trace_dropped)) Base.length(outputs::ActionOutputs) = length(outputs.outputs) Base.iterate(outputs::ActionOutputs, state...) = iterate(outputs.outputs, state...) Base.getindex(outputs::ActionOutputs, key::String) = outputs.outputs[key] @@ -440,15 +444,25 @@ function refresh_diagnostics(model::Model; disable_lint=(), enable_lint=()) Diagnostic[Diagnostic(d) for d in get(answer, "diagnostics", Any[])] end +""" +Execute an action once. `trace` answers its token steps, waits, accepts, decisions and +assignments; `events` are signals posted to `performer` in order, each once every token waits. +""" function execute_action(model::Model, action_id::AbstractString; inputs=Dict(), schedule::AbstractString="", performer=nothing, advance=nothing, - seed=nothing, draws=nothing, clock_step::Real=0.0) + seed=nothing, draws=nothing, clock_step::Real=0.0, trace::Bool=false, + events=()) _check_schedule(schedule) + events = String[string(e) for e in events] + isempty(events) || performer !== nothing || + throw(ArgumentError("events are posted to the object performing the action: name a performer")) encoded = _encoded_inputs(model, inputs) _schedule_preflight(model.connection, schedule) performer !== nothing && require_capability(model.connection, CAPABILITY_PERFORMER) + trace && require_capability(model.connection, CAPABILITY_ACTION_TRACE) needed = String[_schedule_capabilities(schedule)...] performer !== nothing && push!(needed, CAPABILITY_PERFORMER) + trace && push!(needed, CAPABILITY_ACTION_TRACE) request = Dict{String,Any}("modelHash" => model.hash, "actionSymbolId" => String(action_id), "inputs" => encoded) _run_options!(request; advance=advance, seed=seed, draws=draws, clock_step=clock_step) @@ -458,13 +472,21 @@ function execute_action(model::Model, action_id::AbstractString; inputs=Dict(), if performer !== nothing request["performerSymbolId"] = String(performer) end + trace && (request["trace"] = true) + isempty(events) || (request["events"] = events) answer = _translate(; capabilities=Tuple(unique(needed)), connection=model.connection) do call(model.connection, "ExecuteAction", request) end - _check_error(answer, "ExecuteAction") + trace_events = DocumentEvent[ + _document_value(Dict{String,Any}("event" => event)) + for event in get(answer, "trace", Any[]) + ] + trace_dropped = Int(get(answer, "traceDropped", 0)) + _check_error(answer, "ExecuteAction"; trace=trace_events, trace_dropped=trace_dropped) decoded = decode_values(answer) return ActionOutputs(get(decoded, "outputs", Dict{String,Any}()), - get(decoded, "performerAttributes", Dict{String,Any}())) + get(decoded, "performerAttributes", Dict{String,Any}()), + trace_events, trace_dropped) end """Execute a state machine with optional events, scheduling, performer, or trace.""" diff --git a/client/julia/OpenSysML/test/runtests.jl b/client/julia/OpenSysML/test/runtests.jl index 8461a2e7fe..c6dfe6c3f0 100644 --- a/client/julia/OpenSysML/test/runtests.jl +++ b/client/julia/OpenSysML/test/runtests.jl @@ -419,6 +419,19 @@ end @test action["intValue"] == 7 @test action["bad"] isa UnsupportedValueError @test action.performer == Dict{String,Any}("this.speed" => 3.0) + @test action.trace == DocumentEvent[] && action.trace_dropped == 0 + @test_throws ArgumentError execute_action(model, "A"; events=["Go"]) + @test_throws MissingCapabilityError execute_action(model, "A"; trace=true) + conn.info = ServerInfo("", [CAPABILITY_ACTION_TRACE, CAPABILITY_PERFORMER], true, conn.origin) + canned[] = """{"outputs":{"landed":{"boolValue":true}},"trace":[{"kind":"wait","time":{"realValue":0},"text":"wait Go","token":"1","step":3,"event":"Go"},{"kind":"assign","time":{"realValue":0},"text":"assign remaining = 7","token":"1","step":5,"feature":"remaining","value":{"intValue":"7"}}],"traceDropped":1}""" + traced = execute_action(model, "A"; trace=true, events=["Go"], performer="P::p") + @test traced["landed"] == true + @test [e.kind for e in traced.trace] == ["wait", "assign"] + @test traced.trace[1].token == 1 && traced.trace[1].step == 3 && traced.trace[1].event == "Go" + @test traced.trace[2].feature == "remaining" && traced.trace[2].value == 7 + @test traced.trace_dropped == 1 + @test occursin("\"trace\":true", requested[]) && occursin("\"events\":[\"Go\"]", requested[]) + conn.info = ServerInfo("", String[], true, conn.origin) canned[] = """{"finalContext":{"intValue":{"intValue":"3"}},"statesVisited":["s"]}""" state_run = execute_state(model, "S") @test state_run isa StateRun diff --git a/docs/reference/api.md b/docs/reference/api.md index fda1509f2d..5610c9ba8b 100644 --- a/docs/reference/api.md +++ b/docs/reference/api.md @@ -63,6 +63,12 @@ discarded older records in `StateRun.Trace` and `StateRun.TraceDropped`. It requ When a traced run fails, the existing `FailureError` carries its partial records in `Trace` and the discarded count in `TraceDropped`. +The same `WithTrace()` on `ExecuteAction` returns the run's token steps, waits, accepts, +decisions, assignments (`Feature` and `Value`) and completion in `ActionRun.Trace` and +`ActionRun.TraceDropped`; it requires the `action_trace` capability. `WithEvents(names...)` +posts signals or items to the performer in order, each once every token of the run waits — +the waiting `accept` takes it on the next step — and needs `WithPerformer`. + A `Session` (`opensysml.OpenSession(client, model)`) is the interactive counterpart of those one-run calls: it keeps its clock, its schedule (`SetSchedule`) and the objects it instantiated between calls, so `Instantiate`, `ActiveStates`, `Transitions`, `Accepts`, `Send`, `Advance`, diff --git a/docs/reference/java-api.md b/docs/reference/java-api.md index 677dfc155d..dd680dcce8 100644 --- a/docs/reference/java-api.md +++ b/docs/reference/java-api.md @@ -129,12 +129,15 @@ for (Outcome outcome : all.outcomes()) { `executeAction`/`executeState` run once and answer an `ActionRun` (`outputs`, `finalTime`, `diagnostics`) or a `StateRun` (`statesVisited`, `finalContext`, `finalTime`, `diagnostics`). `finalTime` is filled only by a service advertising -`final_time`. `ExecutionOptions` carries a `schedule`, a `performer`, and the -state-run-only `withTrace()` option. The client checks their respective -capabilities (`schedule`, `performer`, `state_trace`) before the call; an unknown +`final_time`. `ExecutionOptions` carries a `schedule`, a `performer`, `withTrace()` and, for an +action, `withEvents(...)` — signals posted to the performer in order, each once +every token waits. The client checks their respective capabilities (`schedule`, +`performer`, `state_trace` or `action_trace`) before the call; an unknown schedule or trace with exploration is refused as `INVALID_ARGUMENT`. A requested -trace is returned as typed `DocumentEvent` values in `StateRun.trace()` with -`traceDropped()` reporting records discarded by the service's bound. +trace is returned as typed `DocumentEvent` values in `StateRun.trace()` or +`ActionRun.trace()` (token steps, waits, accepts, decisions, assignments with +`feature()` and `value()`) with `traceDropped()` reporting records discarded by +the service's bound. `ExecutionOptions` also carries the run options of the `sysml` command: `withAdvance(seconds)` runs for a simulated duration and reports the clock in `finalTime`, `withSeed(n)` seeds the model's own draws, `withDraws("min")` (or `"max"`, `"average"`, `"random"`) chooses how they diff --git a/docs/reference/julia-api.md b/docs/reference/julia-api.md index 6c5086a4cc..788ff8e166 100644 --- a/docs/reference/julia-api.md +++ b/docs/reference/julia-api.md @@ -109,6 +109,9 @@ performer attributes are available separately as `performer`. `execute_state` returns a `StateRun` with `states_visited`, `final_context`, `final_time`, `trace::Vector{DocumentEvent}`, and `trace_dropped`. Requesting a trace checks the `state_trace` capability locally and cannot be combined with exploration. +`execute_action(...; trace=true, events=["Go"], performer=...)` does the same for an +action under `action_trace`, filling `ActionOutputs.trace` and `trace_dropped`; each +event is posted to the performer once every token waits. A failed traced run keeps its existing `ExecutionFailure` or `WrongKindError` classification, with partial records on `trace` and the discarded count on `trace_dropped`. diff --git a/docs/reference/matlab-api.md b/docs/reference/matlab-api.md index 81d31c0726..372736ca74 100644 --- a/docs/reference/matlab-api.md +++ b/docs/reference/matlab-api.md @@ -139,6 +139,9 @@ points are `opensysml.exploreAction`, `opensysml.exploreState`, and `executeState(..., 'trace', true)` returns typed `DocumentEvent` entries in `trace` and the discarded-record count in `traceDropped`; it checks the `state_trace` capability before sending the request. +`executeAction(..., 'trace', true, 'events', {'Go'}, 'performer', ...)` does the same +for an action under `action_trace`; each event is posted to the performer once +every token waits. A failed traced run keeps its existing error identifier; `lastError().details` includes its partial `trace` and `traceDropped`. diff --git a/docs/reference/node-api.md b/docs/reference/node-api.md index 2181108e8b..b1ea08b96b 100644 --- a/docs/reference/node-api.md +++ b/docs/reference/node-api.md @@ -269,7 +269,10 @@ Beside the model reads above, the client covers every RPC the service offers: schedule — the two families refuse each other's `schedule`, as the wire does. `model.executeState(symbolId, { trace: true })` requests typed `DocumentEvent` records in `trace` and reports discarded records in `traceDropped`; it requires - `state_trace` and cannot be combined with an explore schedule; both calls take + `state_trace` and cannot be combined with an explore schedule; + `model.executeAction(symbolId, {}, { trace: true, events: ["Go"], performer })` does the + same for an action under `action_trace` — token steps, waits, accepts, decisions and + assignments (`feature`, `value`) — posting each event once every token waits; both calls take the run options of the `sysml` command — `advance` (simulated seconds, reported back in `finalTime`), `seed`, `draws` (`"random"`, `"min"`, `"max"` or `"average"`) and `clockStep` — and `runAnalysis` takes `toolDryRun` to preview diff --git a/docs/reference/python-api.md b/docs/reference/python-api.md index 4c0b79340d..82132bd35f 100644 --- a/docs/reference/python-api.md +++ b/docs/reference/python-api.md @@ -240,6 +240,10 @@ explore schedule; the same option and result fields are available on `Connection.execute_state`. A failed traced run raises the existing `ExecutionError`, with its partial records on `trace` and discarded count on `trace_dropped`. +`Model.execute_action(..., trace=True, events=["Go"], performer=...)` does the +same for an action under the `action_trace` capability: the result's `trace` +holds its token steps, waits, accepts, decisions and assignments (`feature`, +`value`), and each event is posted to the performer once every token waits. `execute_action` and `execute_state` take the run options of the `sysml` command: `advance` (simulated seconds to run for, reported back in diff --git a/docs/reference/rust-api.md b/docs/reference/rust-api.md index 3f6b00d524..8c282d037a 100644 --- a/docs/reference/rust-api.md +++ b/docs/reference/rust-api.md @@ -156,6 +156,9 @@ answer. `RunOptions.trace` opts a state run into typed `DocumentEvent` records in `StateRun.trace`, with `StateRun.trace_dropped` reporting records the service discarded. The option requires `state_trace` and is refused with exploration. +On an action it fills `ActionRun.trace` under `action_trace` — token steps, waits, +accepts, decisions and assignments (`feature`, `value`) — and `RunOptions.events` +posts signals to the performer in order, each once every token waits. ## Editing diff --git a/docs/reference/service-transports.md b/docs/reference/service-transports.md index 2d502bbb61..fecf8f75b1 100644 --- a/docs/reference/service-transports.md +++ b/docs/reference/service-transports.md @@ -56,7 +56,7 @@ capability's definition rather than something a client has to guess: | The capability describes | A request that needs it | What a client should do | |---|---|---| -| what the service can be *asked*: `strict_conformance`, `inline_language`, `parse_sources`, `evaluate_subject`, `verification`, `convert`, `convert_library_stubs`, `apply_edits`, `authoring`, `connection_authoring`, `edit_documents`, `query`, `query_order_by`, `runs`, `self_check`, `record_run`, `oslc_query`, `document_query`, `render_document`, `render_document_html`, `render_document_asciidoc`, `render_view`, `export_graphs`, `import_data`, `compare_results`, `schedule`, `performer`, `state_trace`, `satisfy_authoring`, `requirement_constraint_authoring`, `member_modifiers`, `transition_authoring`, `verification_objective_authoring`, `metadata_authoring`, `metadata_prefix_authoring`, `sequence_authoring`, `implicit_parameters`, `action_body_statement_authoring`, `constraint_body_authoring`, `state_action_authoring`, `import_authoring`, `documentation_authoring`, `comment_authoring`, `migrate`, `convert_documents`, `convert_compact`, `convert_check_diagnostics`, `parse_sources_affected`, `schedule_explore`, `verification_questions`, `verification_arguments`, `engines_external`, `check`, `set_values`, `tensor_values` | is **refused** with `UNIMPLEMENTED`, naming the capability | check the advertised list first, and report the missing capability locally rather than spending a round trip | +| what the service can be *asked*: `strict_conformance`, `inline_language`, `parse_sources`, `evaluate_subject`, `verification`, `convert`, `convert_library_stubs`, `apply_edits`, `authoring`, `connection_authoring`, `edit_documents`, `query`, `query_order_by`, `runs`, `self_check`, `record_run`, `oslc_query`, `document_query`, `render_document`, `render_document_html`, `render_document_asciidoc`, `render_view`, `export_graphs`, `import_data`, `compare_results`, `schedule`, `performer`, `state_trace`, `action_trace`, `satisfy_authoring`, `requirement_constraint_authoring`, `member_modifiers`, `transition_authoring`, `verification_objective_authoring`, `metadata_authoring`, `metadata_prefix_authoring`, `sequence_authoring`, `implicit_parameters`, `action_body_statement_authoring`, `constraint_body_authoring`, `state_action_authoring`, `import_authoring`, `documentation_authoring`, `comment_authoring`, `migrate`, `convert_documents`, `convert_compact`, `convert_check_diagnostics`, `parse_sources_affected`, `schedule_explore`, `verification_questions`, `verification_arguments`, `engines_external`, `check`, `set_values`, `tensor_values` | is **refused** with `UNIMPLEMENTED`, naming the capability | check the advertised list first, and report the missing capability locally rather than spending a round trip | | how a response is *populated*: `type_facts`, `convert_library_references`, `symbol_attributes`, `feature_values`, `enum_values`, `unset_value`, `undetermined_value`, `complex_values`, `structured_values`, `measurement_refs`, `function_values`, `metaobject_values`, `set_values`, `tensor_values`, `big_int_values`, `rational_values`, `verification_verdicts`, `case_evaluations`, `infinity_value`, `diagnostic_codes`, `final_time`, `order_dependence`, `engines`, `edit_documents`, `render_document_file_name`, `verdict_notes` | is answered with those fields **omitted** | check before reading the fields; an omitted field is not an error | `edit_documents` sits in both rows: without it `ApplyEdits` still edits a model of one document diff --git a/docs/reference/wasm.md b/docs/reference/wasm.md index 85c032bd2e..b7624e206f 100644 --- a/docs/reference/wasm.md +++ b/docs/reference/wasm.md @@ -287,7 +287,8 @@ The module retains the 16 most recently used models; an evicted hash is evicted `feature_values`, `inline_language`, `strict_conformance`, `parse_sources`, `complex_values`, `structured_values`, `measurement_refs`, `function_values`, `set_values`, `tensor_values`, `infinity_value`, `diagnostic_codes`, `schedule`, `final_time`, `metaobject_values`, -`undetermined_value`, `performer`, `big_int_values`, `render_view`, `state_trace`. +`undetermined_value`, `performer`, `big_int_values`, `render_view`, `state_trace`, +`action_trace`. The `js` build installs one synchronous host surface, `globalThis.sysmlWasm`, with `version` and `call(method, paramsJSON)`. The call returns a JSON-RPC envelope string. diff --git a/docs/reference/wire-contract.md b/docs/reference/wire-contract.md index d18179a19d..32b3c0deab 100644 --- a/docs/reference/wire-contract.md +++ b/docs/reference/wire-contract.md @@ -1364,8 +1364,14 @@ trace prints. This transition record was captured from a traced `ExecuteState` c {"kind":"transition", "time":{"quantity":{"realMagnitude":0, "unit":"s", "unitTerm":{"scaleNum":1, "scaleDen":1, "factors":[{"unitId":"SI::second", "exponent":1}]}}}, "machine":"Machine", "from":"init", "to":"Running", "text":"transition: init -> Running"} ``` -The `state_trace` capability is checked before sending the option; a service that withholds it -refuses the request with `UNIMPLEMENTED`. Tracing an explore schedule is `INVALID_ARGUMENT`, +`ExecuteActionRequest.trace` (capability `action_trace`) answers the same `DocumentEvent` +records for an action: `step` (a token entering a node, `token` and `step` numbering it), `wait` +(an accept parked on `event`), `accept`, `send`, `decide` (`alternatives` and `taken`), `assign` +(`feature` and `value` as the engine wrote them) and `complete`. `ExecuteActionRequest.events` +posts signals or items to the performer in order, each once every token waits, so the accept +takes it on the next step; it needs `performer_symbol_id`, and a run whose tokens wait with no +event left fails with its partial trace. The `state_trace` capability is checked before sending +the option; a service that withholds it refuses the request with `UNIMPLEMENTED`. Tracing an explore schedule is `INVALID_ARGUMENT`, because one trace describes one run, not the outcomes of several runs. A failed run still returns the records made before failure. The response retains the newest records up to the service's held-event limit and reports discarded older records as `traceDropped`; without the option, From ef2763dab2ebbb72e4db55d7ef16732c23097478 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:42:02 +0000 Subject: [PATCH 06/12] test: traced ExecuteAction over the wasm engine and the mission-sequence example Co-Authored-By: jason.han --- .../frontend/grpc/mission_sequence_test.go | 82 +++++++++++++++++++ tests/wasm/engine_test.go | 10 +++ 2 files changed, 92 insertions(+) create mode 100644 internal/frontend/grpc/mission_sequence_test.go diff --git a/internal/frontend/grpc/mission_sequence_test.go b/internal/frontend/grpc/mission_sequence_test.go new file mode 100644 index 0000000000..ba4d7588c3 --- /dev/null +++ b/internal/frontend/grpc/mission_sequence_test.go @@ -0,0 +1,82 @@ +package grpc + +import ( + "context" + "os" + "strings" + "testing" + + pb "github.com/Open-MBEE/OpenSysML/api/proto" +) + +func missionSequenceRequest(t *testing.T, service *Service, performer string, events ...string) *pb.ExecuteActionResponse { + t.Helper() + source, err := os.ReadFile("../../../examples/runtime-showcase/mission-sequence.sysml") + if err != nil { + t.Fatalf("reading the mission example: %v", err) + } + modelHash := parseStateTraceModel(t, service, string(source)) + response, err := service.ExecuteAction(context.Background(), &pb.ExecuteActionRequest{ + ModelHash: modelHash, + ActionSymbolId: "MissionSequence::LunarMission", + PerformerSymbolId: performer, + Trace: true, + Events: events, + }) + if err != nil { + t.Fatalf("ExecuteAction: %v", err) + } + return response +} + +func TestMissionSequenceApollo11WaitsForGoThenLands(t *testing.T) { + service := mustNewService(t, 10) + waiting := missionSequenceRequest(t, service, "MissionSequence::apollo11") + if waiting.Error == "" || !strings.Contains(waiting.Error, "GoForDescent") { + t.Fatalf("apollo11 without events: error %q, want the wait on GoForDescent", waiting.Error) + } + last := waiting.Trace[len(waiting.Trace)-1] + if last.Kind != "wait" || last.Event != "GoForDescent" { + t.Fatalf("last record %s %q, want wait GoForDescent", last.Kind, last.Event) + } + + landed := missionSequenceRequest(t, service, "MissionSequence::apollo11", "GoForDescent") + if landed.Error != "" { + t.Fatalf("apollo11 with GoForDescent: %s", landed.Error) + } + texts := traceTexts(landed.Trace) + for _, want := range []string{"accept GoForDescent", "step awaitGo -> descent", "step transEarthInjection -> splashdown", "complete"} { + if !containsText(texts, want) { + t.Errorf("trace lacks %q:\n%s", want, strings.Join(texts, "\n")) + } + } + for _, out := range []string{"landed", "returned"} { + if got := landed.Outputs[out]; got == nil || !got.GetSequence().GetElements()[0].GetBoolValue() { + t.Errorf("%s = %v, want true", out, got) + } + } +} + +func TestMissionSequenceApollo8SkipsTheLanding(t *testing.T) { + service := mustNewService(t, 10) + flown := missionSequenceRequest(t, service, "MissionSequence::apollo8") + if flown.Error != "" { + t.Fatalf("apollo8: %s", flown.Error) + } + texts := traceTexts(flown.Trace) + if !containsText(texts, "transEarthInjection") || containsText(texts, "step awaitGo") { + t.Fatalf("apollo8 trace, want the trans-Earth branch and no awaitGo:\n%s", strings.Join(texts, "\n")) + } + if got := flown.Outputs["landed"]; got == nil || got.GetSequence().GetElements()[0].GetBoolValue() { + t.Errorf("landed = %v, want false", got) + } +} + +func containsText(texts []string, want string) bool { + for _, text := range texts { + if strings.Contains(text, want) { + return true + } + } + return false +} diff --git a/tests/wasm/engine_test.go b/tests/wasm/engine_test.go index 6ab0f006cc..85254b79c5 100644 --- a/tests/wasm/engine_test.go +++ b/tests/wasm/engine_test.go @@ -387,6 +387,16 @@ func TestEngineWireParity(t *testing.T) { } equal("ExecuteAction", actionParams, mustMarshal(t, actionRes)) + tracedParams := fmt.Sprintf(`{"modelHash":%q,"actionSymbolId":"enginedemo::Double","inputs":{"x":{"intValue":"6"}},"trace":true}`, hash) + tracedRes, err := svc.ExecuteAction(ctx, mustUnmarshal[pb.ExecuteActionRequest](t, tracedParams)) + if err != nil { + t.Fatalf("grpc ExecuteAction with trace: %v", err) + } + if len(tracedRes.GetTrace()) == 0 { + t.Fatalf("a traced ExecuteAction reported no records: %v", tracedRes) + } + equal("ExecuteAction", tracedParams, mustMarshal(t, tracedRes)) + // An Integer beyond int64 crosses as bigIntValue both ways, as it does // through the service. wideParams := fmt.Sprintf(`{"modelHash":%q,"actionSymbolId":"enginedemo::Double","inputs":{"x":{"bigIntValue":"590295810358705651712"}}}`, hash) From c2367cd08fd8c8d67829b9ad1cc5160da423c813 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:44:17 +0000 Subject: [PATCH 07/12] test(runtime): robustness of traced action runs and undelivered events Co-Authored-By: jason.han --- docs/project/spec-compliance.md | 1 + .../runtime/robustness_action_trace_test.go | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 internal/exec/runtime/robustness_action_trace_test.go diff --git a/docs/project/spec-compliance.md b/docs/project/spec-compliance.md index 59ff924833..4f4746168c 100644 --- a/docs/project/spec-compliance.md +++ b/docs/project/spec-compliance.md @@ -787,6 +787,7 @@ remain one-shot. | Semantic Rule | Implementation | Test Case | Status | |--------------|----------------|-----------|--------| +| A traced action run records each token's real steps as the executor takes them (node entered, token id, step number, clock), the accept it parks on and the one that takes a message, sends, the alternatives and taken branch of a decide/fork/join, the value an assignment wrote and completion; mid-run events are posted to the performer's queue once every token waits, as the REPL's `%send`, so the waiting accept takes the next one | `runtime/trace.go` `TraceStep`/`TraceWait`/`TraceAssign`/`TraceDecide`/`TraceComplete`, `action_executor.go` `stepTokens`/`waitingTokens`, `context.go` `ExecuteActionWithEvents`/`DeliverEvents`, `queryexec/events.go` `EventsFromTrace` | `action_trace_records_test.go:TestActionTraceRecordsFollowTheTokens`, `robustness_action_trace_test.go:TestRuntimeRobustnessActionTrace`, `grpc/action_trace_test.go`, `grpc/mission_sequence_test.go`, `tests/grpc/testdata/conformance/execute_action_trace*` | ✅ Faithful | | SysML v1 structural-feature add, remove, optional clear and destroy actions migrate to assignments or standard sequence/occurrence-library calls; flow-fed object pins retain their own name and classifier, result pins bind to the affected object, and a required-feature clear passes through only when the next replace-all write preserves its value. Unsupported or UML-only differences remain explicit migration verdicts; create and reclassify actions remain placeholders | `internal/translate/migrate/activity.go` `writeFeature`, `removeFeature`, `clearFeature`, `destroyObject`, `declarePinsWithValues` | `tests/migrate/object_writes_test.go`; conformance `object_write_collection_actions`, `object_write_destroy_result`; `robustness_object_writes_test.go:TestRuntimeRobustnessObjectWrites`; `TestPSSMSuiteMigration` | âš ï¸� Approximate (nonunique value removal may remove every equal occurrence, destroy does not remove links and may end composite parts, and mandatory clear is not directly expressible) | | Initial node token placement | `action_executor.go` `initialize` | `action_control_flow.sysml` | ✅ Faithful | | Subactions no succession orders are performed during the owner, unordered: every composite action usage of an action is one of its `subactions` (Systems Library `Actions.sysml`: `action subactions: Action[0..*] :> actions, subperformances`, "The subperformances of this Action that are Actions"), and a subperformance is an enclosed performance (Kernel Semantic Library `Performances.kerml`: `composite step subperformances … subsets enclosedPerformances`; `enclosedPerformances … subsets timeEnclosedOccurrences`), which `Occurrences.kerml` defines as "Occurrences that start no earlier than and end no later than this occurrence". So each subaction no succession reaches — an action node, and a `send`, `accept`, `assign`, `if`, `while`, `for` or `terminate` written among the members — starts as the owner's performance starts, beside the `first`-rooted flow when there is one, with nothing ordering it against the others; the owner ends, and its successors, `done` and output reads follow, only after every one has. A `ref` (referential), abstract, performed (`perform`, an event occurrence usage, which is referential: `validateEventOccurrenceUsageIsReference` (census unknown; unobservable in text)) or body-parameter usage, and one only typing, subsetting or redefined by a sibling, is no composite subaction and is not performed. The same holds for a nested action node and for a loop or branch body stating a flow, the do body of a state included | `lower/action_starts.go` `ActionGraph.Starts`, `unorderedSubactions`, `startsConcurrently`, `specializedSiblings`, `FlowStartError`; `lower/case_body.go` `StartFlow` (`lower/action_graph.go` `ActionGraph.Concurrent`), `lower/case_body.go` `CaseFlowStart` (a sole unpreceded `ref` or abstract usage is no start, `performedStep`), `caseSteps` (a case body's statements in its stated flow are nodes of it, not locals as well; a trailing result no succession sequences is the body's result, not a node); `lower/action_subflow.go` `runsOwnFlow`; `lower/action_nodes.go` (statements among the members are nodes of the flow); `runtime/action_executor.go` `initialize` (one token per start); `runtime/action_subflow.go` `seedTokens` (a nested performance retires once every start's token has) | conformance `action_unordered_subactions` (+ trace), `action_unordered_join_once`, `action_unordered_join_once_nested`, `state_do_body_unordered_join_once` (two unordered starts `a`, `b` succeeding into `c`: `c` performed once, after both, `total = 111` on every schedule; trace + `.trace.order` + `.check.expected.json`), `action_unordered_subactions_write_conflict` (`outcomes` + `.check.expected.json` + per-policy traces), `action_unordered_beside_first`, `action_unordered_nested_subactions`, `action_unordered_statements`, `action_unordered_send_accept`, `action_unordered_send_to_receiver`, `action_unordered_reference_not_performed`, `action_unordered_accept_holds_owner`, `action_body_flow_unordered_statement`, `state_do_body_unordered_statement`; `robustness_unordered_subactions_test.go:TestRuntimeRobustnessUnorderedSubactions` (successions cycling over every step: `errInvalidActionFlow`; an unordered accept never satisfied, also nested: `ErrAcceptDeadlock`, the successor not performed; two unpreceded steps joined into a third, at the root, in a nested node and in a state's do body; a `while`, `if` and `assign` among the members beside `first start; … done;`), `internal/frontend/grpc/runtime_test.go:TestExecuteAction_EmptyAction` (an action with no subaction completes), `:TestExecuteAction_NoStart`, gRPC conformance `execute_action_empty`, `execute_action_no_initial` (a cycle); `smt/support_test.go:TestAnalyzeRefusesUnorderedSubactions` | ✅ Faithful (the order among them is open and is the scheduler's choice point, enumerated by `-schedule explore`; the bounded model checker refuses such a flow as not encoded, `UnsupportedError` "unordered subaction". A nested node whose members are only statements, and a loop, branch or behavior body stating no flow, keep running them in declaration order — one linearization of what the library leaves open) | diff --git a/internal/exec/runtime/robustness_action_trace_test.go b/internal/exec/runtime/robustness_action_trace_test.go new file mode 100644 index 0000000000..ffc6324993 --- /dev/null +++ b/internal/exec/runtime/robustness_action_trace_test.go @@ -0,0 +1,126 @@ +package runtime + +import ( + "errors" + "strings" + "testing" +) + +// TestRuntimeRobustnessActionTrace covers traced runs that cannot finish and events no accept takes. +func TestRuntimeRobustnessActionTrace(t *testing.T) { + t.Run("deadlocked_run_keeps_its_records", testActionTraceDeadlockKeepsRecords) + t.Run("event_no_accept_waits_for", testActionTraceEventNoAcceptWaitsFor) + t.Run("event_after_completion", testActionTraceEventAfterCompletion) +} + +const actionTraceRobustnessSource = ` + package test { + private import ScalarValues::*; + item def Go; + item def Abort; + part def Craft; + part craft : Craft; + action def Wait { + attribute count : Integer = 0; + first start; + then action tick assign count := count + 1; + then action hold accept go : Go; + then done; + } + }` + +func startTracedWait(t *testing.T) (*Context, *ActionExecutor, *TraceRecorder, *Instance, func(string) Message) { + t.Helper() + idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, actionTraceRobustnessSource)) + trace := NewTraceRecorder() + ctx.SetTrace(trace) + craft, err := ctx.Instantiate(oneSymbol(t, idx, "test::craft")) + if err != nil { + t.Fatalf("instantiate: %v", err) + } + exec, _, err := ctx.StartActionPerformedBy(oneSymbol(t, idx, "test::Wait"), craft, map[string]Value{}) + if err != nil { + t.Fatalf("start: %v", err) + } + message := func(name string) Message { + msg, err := ctx.SignalMessage(oneSymbol(t, idx, "test::"+name), nil, craft) + if err != nil { + t.Fatalf("message %s: %v", name, err) + } + return msg + } + return ctx, exec, trace, craft, message +} + +// testActionTraceDeadlockKeepsRecords: a traced action nothing wakes reports the typed +// deadlock, and the recorder still holds every record made up to the wait. +func testActionTraceDeadlockKeepsRecords(t *testing.T) { + _, exec, trace, _, _ := startTracedWait(t) + err := runWithWatchdog(t, exec.RunToCompletion) + if !errors.Is(err, ErrAcceptDeadlock) { + t.Fatalf("expected ErrAcceptDeadlock, got: %v", err) + } + var texts []string + for _, r := range trace.Records() { + if r.Kind == TraceStep || r.Kind == TraceAssign || r.Kind == TraceWait || r.Kind == TraceComplete { + texts = append(texts, r.Text()) + } + } + want := []string{"step start", "step start -> tick", "assign count = 1", "step tick -> hold", "wait Go"} + if strings.Join(texts, "\n") != strings.Join(want, "\n") { + t.Errorf("partial trace:\n%s\nwant:\n%s", strings.Join(texts, "\n"), strings.Join(want, "\n")) + } +} + +// testActionTraceEventNoAcceptWaitsFor: an event no parked accept takes is a typed error +// naming the event and the accepts that do wait, not a hang and not a silent drop. +func testActionTraceEventNoAcceptWaitsFor(t *testing.T) { + ctx, exec, trace, _, message := startTracedWait(t) + err := runWithWatchdog(t, func() error { + return ctx.DeliverEvents(exec, []Message{message("Abort")}) + }) + if err == nil { + t.Fatal("expected an error for an event no accept waits for") + } + for _, want := range []string{"Abort", "accept go"} { + if !strings.Contains(err.Error(), want) { + t.Errorf("expected %q in the report, got: %v", want, err) + } + } + for _, r := range trace.Records() { + if r.Kind == TraceAccept { + t.Errorf("an unaccepted event was recorded as accepted: %s", r.Text()) + } + } + if err := ctx.DeliverEvents(exec, []Message{message("Go")}); err != nil { + t.Fatalf("the waiting accept still takes its event: %v", err) + } + if err := exec.RunToCompletion(); err != nil { + t.Fatalf("run after the event: %v", err) + } +} + +// testActionTraceEventAfterCompletion: an event left over once the action has completed is +// a typed error, since nothing of the run can ever take it. +func testActionTraceEventAfterCompletion(t *testing.T) { + ctx, exec, trace, _, message := startTracedWait(t) + if err := ctx.DeliverEvents(exec, []Message{message("Go")}); err != nil { + t.Fatalf("deliver: %v", err) + } + if err := exec.RunToCompletion(); err != nil { + t.Fatalf("run: %v", err) + } + completed := false + for _, r := range trace.Records() { + completed = completed || r.Kind == TraceComplete + } + if !completed { + t.Fatal("the completed run recorded no completion") + } + err := runWithWatchdog(t, func() error { + return ctx.DeliverEvents(exec, []Message{message("Go")}) + }) + if err == nil || !strings.Contains(err.Error(), "Go") { + t.Fatalf("expected a typed error naming the leftover event, got: %v", err) + } +} From d5dc48377415e95a66099d20e95ebfba91560b75 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 18:59:33 +0000 Subject: [PATCH 08/12] fix(client): action_trace served by the MCP execute_action tool; Octave-compatible token decoding; lint Co-Authored-By: jason.han --- client/matlab/+opensysml/+internal/decodeDocumentValue.m | 2 +- client/node/test/execute.test.ts | 4 ++-- internal/frontend/mcp/runtimetools/info.go | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/matlab/+opensysml/+internal/decodeDocumentValue.m b/client/matlab/+opensysml/+internal/decodeDocumentValue.m index 9835fb2109..59924601ba 100644 --- a/client/matlab/+opensysml/+internal/decodeDocumentValue.m +++ b/client/matlab/+opensysml/+internal/decodeDocumentValue.m @@ -94,7 +94,7 @@ 'payload', {toCells(fieldOr(raw, 'payload', {}))}, ... 'alternatives', {toCells(fieldOr(raw, 'alternatives', {}))}, ... 'taken', fieldOr(raw, 'taken', ''), ... - 'token', int64(str2double(string(fieldOr(raw, 'token', '0')))), ... + 'token', parseId(fieldOr(raw, 'token', '0')), ... 'step', double(fieldOr(raw, 'step', 0)), ... 'feature', fieldOr(raw, 'feature', ''), ... 'value', assigned); diff --git a/client/node/test/execute.test.ts b/client/node/test/execute.test.ts index 9cef5068e6..c81354fb65 100644 --- a/client/node/test/execute.test.ts +++ b/client/node/test/execute.test.ts @@ -302,8 +302,8 @@ test("an action run returns its requested trace and takes posted events", async } const assign = run.trace.find((event) => event.kind === "assign"); assert.equal(assign?.feature, "remaining"); - assert.deepEqual(assign?.value, { kind: "int", value: 7n }); - assert.equal(assign?.token, 1n); + assert.deepEqual(assign.value, { kind: "int", value: 7n }); + assert.equal(assign.token, 1n); assert.equal(run.traceDropped, 0); await assert.rejects( diff --git a/internal/frontend/mcp/runtimetools/info.go b/internal/frontend/mcp/runtimetools/info.go index 56b004c95a..0d65670cb0 100644 --- a/internal/frontend/mcp/runtimetools/info.go +++ b/internal/frontend/mcp/runtimetools/info.go @@ -54,6 +54,7 @@ var CapabilityTools = map[string]string{ sysmlgrpc.CapabilityOrderDependence: "execute_action", sysmlgrpc.CapabilityPerformer: "execute_action", sysmlgrpc.CapabilityStateTrace: "execute_state", + sysmlgrpc.CapabilityActionTrace: "execute_action", sysmlgrpc.CapabilityVerification: "verify_constraint", sysmlgrpc.CapabilityVerificationQuestions: "verify_constraint", sysmlgrpc.CapabilityVerificationArguments: "verify_constraint", From 53b4b7b4b3bc4c67e91fe8f3136faae4dafb828a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 20:22:32 +0000 Subject: [PATCH 09/12] fix(runtime,clients): release failed event runs, record held assign values, forward Rust/Java action options ExecuteActionWithEvents lets go of a performance it started when the run fails, as a plain run does; the assign record carries the value the target holds once written; the Rust conformance adapter forwards trace and events and keeps a failed run's partial trace; Rust and Java state runs refuse RunOptions/ExecutionOptions events, which are an action run's. Co-Authored-By: jason.han --- .../java/org/openmbee/opensysml/Model.java | 4 ++ .../opensysml/ApiIntegrationTest.java | 7 ++++ client/rust/conformance/src/main.rs | 6 ++- client/rust/opensysml/src/operations.rs | 18 +++++++++ .../exec/runtime/action_trace_records_test.go | 2 +- internal/exec/runtime/context.go | 14 ++++++- .../runtime/robustness_action_trace_test.go | 39 +++++++++++++++++++ internal/exec/runtime/statements.go | 14 ++++++- internal/frontend/grpc/action_trace_test.go | 2 +- ...execute_action_events_accept.expected.json | 2 +- 10 files changed, 100 insertions(+), 8 deletions(-) diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java index 970253bf52..87a72f7032 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/Model.java @@ -839,6 +839,10 @@ private ExecuteStateResponse executeState( Objects.requireNonNull(stateMachineSymbolId, "stateMachineSymbolId"); Objects.requireNonNull(events, "events"); Objects.requireNonNull(options, NAME_OPTIONS); + if (!options.events().isEmpty()) { + throw new IllegalArgumentException( + "a state run takes its events as an argument, not as ExecutionOptions.withEvents"); + } if (options.trace() && explore) { throw new IllegalArgumentException("a trace describes one run, not an exploration"); } diff --git a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java index 073031b4a0..b4627edb26 100644 --- a/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java +++ b/client/java/opensysml-client/src/test/java/org/openmbee/opensysml/ApiIntegrationTest.java @@ -818,6 +818,13 @@ void aStateMachineReportsTheStatesItVisitedAndExploresToItsFinalState() { () -> model.exploreState("Test::Machine", List.of(), tracedState)); assertThrows(ModelException.class, () -> model.executeState("Test::NoMachine", List.of())); + ExecutionOptions posted = ExecutionOptions.defaults().withEvents("Go"); + assertThrows( + IllegalArgumentException.class, + () -> model.executeState("Test::Machine", List.of(), posted)); + assertThrows( + IllegalArgumentException.class, + () -> model.exploreState("Test::Machine", List.of(), posted)); } @Test diff --git a/client/rust/conformance/src/main.rs b/client/rust/conformance/src/main.rs index c71cde397e..9d5cf5c43f 100644 --- a/client/rust/conformance/src/main.rs +++ b/client/rust/conformance/src/main.rs @@ -1054,12 +1054,12 @@ impl Runner { let options = RunOptions { schedule: optional(request.schedule), performer: optional(request.performer_symbol_id), - trace: false, + trace: request.trace, advance: request.advance, seed: request.seed, draws: optional(request.draws), clock_step: request.clock_step, - events: Vec::new(), + events: request.events, }; let hash = &request.model_hash; let action = &request.action_symbol_id; @@ -1082,6 +1082,8 @@ impl Runner { error: failure.error, diagnostics: failure.diagnostics, final_time: failure.final_time, + trace: failure.trace, + trace_dropped: failure.trace_dropped, ..Default::default() }, ), diff --git a/client/rust/opensysml/src/operations.rs b/client/rust/opensysml/src/operations.rs index b9634fa197..853498b063 100644 --- a/client/rust/opensysml/src/operations.rs +++ b/client/rust/opensysml/src/operations.rs @@ -209,6 +209,16 @@ fn explores(schedule: Option<&str>) -> bool { schedule.is_some_and(|s| s == SCHEDULE_EXPLORE || s.starts_with("explore:")) } +/// A state run takes its events as an argument: `RunOptions::events` is an action run's. +fn refuse_option_events(options: &RunOptions, method: &str) -> Result<(), Error> { + if options.events.is_empty() { + return Ok(()); + } + Err(Error::InvalidRequest(format!( + "{method} takes its events as an argument, not RunOptions::events" + ))) +} + fn refuse_exploring(schedule: Option<&str>, method: &str) -> Result<(), Error> { match schedule { Some(schedule) if explores(Some(schedule)) => Err(Error::InvalidRequest(format!( @@ -862,6 +872,7 @@ impl Connection { options: &RunOptions, ) -> Result { refuse_exploring(options.schedule.as_deref(), "explore_state")?; + refuse_option_events(options, "execute_state")?; let response = self.run_state( model_hash, machine_id, @@ -898,6 +909,7 @@ impl Connection { events: &[S], options: &RunOptions, ) -> Result { + refuse_option_events(options, "explore_state")?; let schedule = options.schedule.as_deref().unwrap_or(SCHEDULE_EXPLORE); require_exploring(schedule)?; if options.trace { @@ -1438,6 +1450,12 @@ mod tests { assert!(!explores(None)); assert!(refuse_exploring(Some("explore"), "explore_action").is_err()); assert!(refuse_exploring(Some("random:seed=1"), "explore_action").is_ok()); + let posted = RunOptions { + events: vec!["Go".to_owned()], + ..Default::default() + }; + assert!(refuse_option_events(&posted, "execute_state").is_err()); + assert!(refuse_option_events(&RunOptions::default(), "execute_state").is_ok()); assert!(require_exploring("first").is_err()); assert_eq!(engine_field(Some(ENGINE_AUTO)), ""); assert_eq!(engine_field(Some("smt")), "smt"); diff --git a/internal/exec/runtime/action_trace_records_test.go b/internal/exec/runtime/action_trace_records_test.go index 314291ceb8..5cbda91012 100644 --- a/internal/exec/runtime/action_trace_records_test.go +++ b/internal/exec/runtime/action_trace_records_test.go @@ -93,7 +93,7 @@ func TestActionTraceRecordsFollowTheTokens(t *testing.T) { "step split -> land", "step split -> survey", } - branches := []string{"assign landed = true", "step land -> meet", "step survey -> meet"} + branches := []string{"assign landed = [true]", "step land -> meet", "step survey -> meet"} tail := []string{"step meet", "step meet -> finish", "step finish -> done", "complete"} if len(got) != len(head)+len(branches)+len(tail) { t.Fatalf("records:\n%s", strings.Join(got, "\n")) diff --git a/internal/exec/runtime/context.go b/internal/exec/runtime/context.go index e0b534f707..ae1c4799ba 100644 --- a/internal/exec/runtime/context.go +++ b/internal/exec/runtime/context.go @@ -1823,20 +1823,30 @@ func (ctx *Context) ExecuteActionWithEvents(action *symbols.Symbol, self *Instan if len(events) == 0 { return ctx.ExecuteActionReportingPerformer(action, self, inputs) } - exec, _, err := ctx.StartActionPerformedBy(action, self, inputs) + exec, reused, err := ctx.StartActionPerformedBy(action, self, inputs) if err != nil { return nil, nil, err } + // A performance started for this call is let go of when it fails; a reused one stays its owner's. + release := exec.Release + if reused { + release = func() {} + } top := ctx.runDepth == 0 defer ctx.beginRun()() if err := ctx.DeliverEvents(exec, events); err != nil { + release() return nil, nil, err } - if err := ctx.runPerformance(exec, top); err != nil { + if err := ctx.runPerformed(exec, top); err != nil { + if !paused(err) { + release() + } return nil, nil, err } outputs, err = exec.ResultsWithError() if err != nil { + release() return nil, nil, err } return outputs, (&Invocation{Actions: []*ActionExecutor{exec}}).PerformerAttributes(), nil diff --git a/internal/exec/runtime/robustness_action_trace_test.go b/internal/exec/runtime/robustness_action_trace_test.go index ffc6324993..edaf8dd80b 100644 --- a/internal/exec/runtime/robustness_action_trace_test.go +++ b/internal/exec/runtime/robustness_action_trace_test.go @@ -11,6 +11,7 @@ func TestRuntimeRobustnessActionTrace(t *testing.T) { t.Run("deadlocked_run_keeps_its_records", testActionTraceDeadlockKeepsRecords) t.Run("event_no_accept_waits_for", testActionTraceEventNoAcceptWaitsFor) t.Run("event_after_completion", testActionTraceEventAfterCompletion) + t.Run("failed_event_run_releases_its_performance", testActionTraceFailedEventRunReleases) } const actionTraceRobustnessSource = ` @@ -124,3 +125,41 @@ func testActionTraceEventAfterCompletion(t *testing.T) { t.Fatalf("expected a typed error naming the leftover event, got: %v", err) } } + +// testActionTraceFailedEventRunReleases: a run with events that fails lets go of the +// performance it started, as a plain run does, so the context carries nothing of it on. +func testActionTraceFailedEventRunReleases(t *testing.T) { + idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, actionTraceRobustnessSource)) + craft, err := ctx.Instantiate(oneSymbol(t, idx, "test::craft")) + if err != nil { + t.Fatalf("instantiate: %v", err) + } + message := func(name string) Message { + msg, err := ctx.SignalMessage(oneSymbol(t, idx, "test::"+name), nil, craft) + if err != nil { + t.Fatalf("message %s: %v", name, err) + } + return msg + } + wait := oneSymbol(t, idx, "test::Wait") + err = runWithWatchdog(t, func() error { + _, _, err := ctx.ExecuteActionWithEvents(wait, craft, map[string]Value{}, []Message{message("Abort")}) + return err + }) + if err == nil || !strings.Contains(err.Error(), "Abort") { + t.Fatalf("expected the rejected event's error, got: %v", err) + } + if n := len(ctx.actionExecutors); n != 0 { + t.Fatalf("the failed run left %d performance(s) registered on the context", n) + } + outputs, _, err := ctx.ExecuteActionWithEvents(wait, craft, map[string]Value{}, []Message{message("Go")}) + if err != nil { + t.Fatalf("a fresh run with its event: %v", err) + } + if got, ok := outputs["count"]; !ok || FormatValue(got) != "1" { + t.Errorf("count = %s, want 1", FormatValue(got)) + } + if n := len(ctx.actionExecutors); n != 0 { + t.Fatalf("the completed run left %d performance(s) registered on the context", n) + } +} diff --git a/internal/exec/runtime/statements.go b/internal/exec/runtime/statements.go index 6e46186d24..1ce4bf529c 100644 --- a/internal/exec/runtime/statements.go +++ b/internal/exec/runtime/statements.go @@ -886,7 +886,7 @@ func (e *stmtEngine) execute(stmt lower.Statement) (stmtFlow, error) { case lower.Assign: value, err := e.assign(s) if err == nil { - e.noteAssign(s.Target, value) + e.noteAssign(s.Target, e.heldAfterAssign(s, value)) } return flowNext, err case lower.Declare: @@ -1751,6 +1751,18 @@ type actionStepHost interface { // noteAssign records in the trace the value an assignment wrote, under the // action token stepping the statement where one is. +// heldAfterAssign is what the target holds once written, as the write shaped it; a chained +// target is not read back, so its record keeps the value the statement gave. +func (e *stmtEngine) heldAfterAssign(s lower.Assign, written Value) Value { + if e.ctx.trace == nil || s.Chain != nil { + return written + } + if held, ok, err := e.evalIn(s.Scope).Lookup(s.Target); err == nil && ok { + return held + } + return written +} + func (e *stmtEngine) noteAssign(feature string, value Value) { if e.ctx.trace == nil { return diff --git a/internal/frontend/grpc/action_trace_test.go b/internal/frontend/grpc/action_trace_test.go index 8ae4d294f3..397fb17c93 100644 --- a/internal/frontend/grpc/action_trace_test.go +++ b/internal/frontend/grpc/action_trace_test.go @@ -136,7 +136,7 @@ func TestExecuteActionEventsReachAWaitingAccept(t *testing.T) { } texts = traceTexts(landed.Trace) joined := strings.Join(texts, "\n") - for _, want := range []string{"wait Go\n", "send Go\n", "accept Go\n", "step waiting -> land\n", "assign landed = true\n", "complete"} { + for _, want := range []string{"wait Go\n", "send Go\n", "accept Go\n", "step waiting -> land\n", "assign landed = [true]\n", "complete"} { if !strings.Contains(joined+"\n", want) { t.Errorf("trace lacks %q:\n%s", strings.TrimSpace(want), joined) } diff --git a/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json b/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json index 020ca9323d..79d61d8603 100644 --- a/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json +++ b/tests/grpc/testdata/conformance/execute_action_events_accept.expected.json @@ -23,7 +23,7 @@ "send Go", "accept Go", "step waiting -> land", - "assign landed = true", + "assign landed = [true]", "step land -> finish", "step finish -> done", "complete" From f4b00694510464c3b19ab133d12bf1637f181532 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 20:28:13 +0000 Subject: [PATCH 10/12] fix(runtime): keep a qualified target's written value in its assign record A qualified target is not read back, since a nearer local of the name would answer instead. Co-Authored-By: jason.han --- .../exec/runtime/action_trace_records_test.go | 44 +++++++++++++++++++ internal/exec/runtime/statements.go | 6 +-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/internal/exec/runtime/action_trace_records_test.go b/internal/exec/runtime/action_trace_records_test.go index 5cbda91012..2fd0ac17cb 100644 --- a/internal/exec/runtime/action_trace_records_test.go +++ b/internal/exec/runtime/action_trace_records_test.go @@ -136,3 +136,47 @@ func TestActionTraceKindsPrintNoLine(t *testing.T) { t.Errorf("decide text = %q", got) } } + +// A qualified target under a shadowing local is recorded with the value written to it, +// not with the local's. +func TestActionTraceQualifiedAssignUnderShadowingLocal(t *testing.T) { + src := ` + package test { + private import ScalarValues::*; + part def Craft; + part craft : Craft; + action def Act { + attribute a : Integer := 1; + out attribute r : Integer; + if true { + attribute a : Integer := 9; + assign r := Act::a; + assign Act::a := 4; + } + } + }` + idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, src)) + trace := NewTraceRecorder() + ctx.SetTrace(trace) + craft, err := ctx.Instantiate(oneSymbol(t, idx, "test::craft")) + if err != nil { + t.Fatalf("instantiate: %v", err) + } + outputs, _, err := ctx.ExecuteActionWithEvents(oneSymbol(t, idx, "test::Act"), craft, map[string]Value{}, nil) + if err != nil { + t.Fatalf("run: %v", err) + } + if got := FormatValue(outputs["r"]); got != "1" && got != "[1]" { + t.Errorf("r = %s, want Act::a's 1", got) + } + var assigns []string + for _, r := range trace.Records() { + if r.Kind == TraceAssign { + assigns = append(assigns, r.Text()) + } + } + joined := strings.Join(assigns, "\n") + if !strings.Contains(joined, "assign a = 4") || strings.Contains(joined, "assign a = 9") { + t.Errorf("assign records:\n%s\nwant Act::a recorded as 4, never as the local's 9", joined) + } +} diff --git a/internal/exec/runtime/statements.go b/internal/exec/runtime/statements.go index 1ce4bf529c..265c8975c4 100644 --- a/internal/exec/runtime/statements.go +++ b/internal/exec/runtime/statements.go @@ -1751,10 +1751,10 @@ type actionStepHost interface { // noteAssign records in the trace the value an assignment wrote, under the // action token stepping the statement where one is. -// heldAfterAssign is what the target holds once written, as the write shaped it; a chained -// target is not read back, so its record keeps the value the statement gave. +// heldAfterAssign is what the target holds once written, as the write shaped it; a chained or +// qualified target, which a nearer name can shadow, is not read back and keeps the value written. func (e *stmtEngine) heldAfterAssign(s lower.Assign, written Value) Value { - if e.ctx.trace == nil || s.Chain != nil { + if e.ctx.trace == nil || s.Chain != nil || s.Qualified { return written } if held, ok, err := e.evalIn(s.Scope).Lookup(s.Target); err == nil && ok { From b331451c8bfc910a65ca02150facb9c35f3728b8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 20:36:59 +0000 Subject: [PATCH 11/12] fix(runtime): read a qualified assign target back through its owner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The assign record of a qualified target reads the feature as a reader of the qualifier would — the frame of a run of the owner, else the performing object — so a shaped write is recorded as held and a local sharing the name cannot answer for it. Co-Authored-By: jason.han --- .../exec/runtime/action_trace_records_test.go | 21 +++++++++++++++++++ internal/exec/runtime/statements.go | 20 ++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/internal/exec/runtime/action_trace_records_test.go b/internal/exec/runtime/action_trace_records_test.go index 2fd0ac17cb..5115c70272 100644 --- a/internal/exec/runtime/action_trace_records_test.go +++ b/internal/exec/runtime/action_trace_records_test.go @@ -154,6 +154,13 @@ func TestActionTraceQualifiedAssignUnderShadowingLocal(t *testing.T) { assign Act::a := 4; } } + action def Shaped { + attribute a : Integer[1..2] := 1; + if true { + attribute a : Integer := 9; + assign Shaped::a := 4; + } + } }` idx, _, ctx := buildRuntimeWithLibraries(t, "", parseAndBuild(t, src)) trace := NewTraceRecorder() @@ -179,4 +186,18 @@ func TestActionTraceQualifiedAssignUnderShadowingLocal(t *testing.T) { if !strings.Contains(joined, "assign a = 4") || strings.Contains(joined, "assign a = 9") { t.Errorf("assign records:\n%s\nwant Act::a recorded as 4, never as the local's 9", joined) } + trace = NewTraceRecorder() + ctx.SetTrace(trace) + if _, _, err := ctx.ExecuteActionWithEvents(oneSymbol(t, idx, "test::Shaped"), craft, map[string]Value{}, nil); err != nil { + t.Fatalf("run Shaped: %v", err) + } + assigns = assigns[:0] + for _, r := range trace.Records() { + if r.Kind == TraceAssign { + assigns = append(assigns, r.Text()) + } + } + if joined := strings.Join(assigns, "\n"); joined != "assign a = [4]" { + t.Errorf("assign records:\n%s\nwant Shaped::a recorded as its held [4]", joined) + } } diff --git a/internal/exec/runtime/statements.go b/internal/exec/runtime/statements.go index 265c8975c4..3bde30b3c4 100644 --- a/internal/exec/runtime/statements.go +++ b/internal/exec/runtime/statements.go @@ -1751,15 +1751,27 @@ type actionStepHost interface { // noteAssign records in the trace the value an assignment wrote, under the // action token stepping the statement where one is. -// heldAfterAssign is what the target holds once written, as the write shaped it; a chained or -// qualified target, which a nearer name can shadow, is not read back and keeps the value written. +// heldAfterAssign is what the target holds once written, as the write shaped it, read as a +// reader of the target would; a chained target is not read back and keeps the value written. func (e *stmtEngine) heldAfterAssign(s lower.Assign, written Value) Value { - if e.ctx.trace == nil || s.Chain != nil || s.Qualified { + if e.ctx.trace == nil || s.Chain != nil { return written } - if held, ok, err := e.evalIn(s.Scope).Lookup(s.Target); err == nil && ok { + ec := e.evalIn(s.Scope) + if !s.Qualified { + if held, ok, err := ec.Lookup(s.Target); err == nil && ok { + return held + } + return written + } + if held, ok, err := ec.frameFeatureValue(s.Owner, s.Feature); err == nil && ok { return held } + if self := ec.self; self != nil && ec.ctx.isOrSpecializes(self.Type, s.Owner) { + if held, ok, err := ec.selfFeatureValue(s.Target); err == nil && ok { + return held + } + } return written } From f1bab66a9071831fbfee3cec4e7d208d04b34bd6 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 23:09:53 +0000 Subject: [PATCH 12/12] test(syson): build DocumentEvent with its action trace components Co-Authored-By: jason.han --- .../java/org/openmbee/mdk/syson/DocumentValueTextTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/editors/syson/backend/src/test/java/org/openmbee/mdk/syson/DocumentValueTextTest.java b/editors/syson/backend/src/test/java/org/openmbee/mdk/syson/DocumentValueTextTest.java index 912d5e6b13..d186eafb73 100644 --- a/editors/syson/backend/src/test/java/org/openmbee/mdk/syson/DocumentValueTextTest.java +++ b/editors/syson/backend/src/test/java/org/openmbee/mdk/syson/DocumentValueTextTest.java @@ -42,7 +42,8 @@ void labelsRowsByWhatTheyStandFor() { Optional.empty()); DocumentRow event = new DocumentRow(type, List.of(), Optional.empty(), Optional.of(car), Optional.empty(), Optional.of(new DocumentValue.DocumentEvent("transition", new DocumentValue.RealValue(2), "car: off -> on", - Optional.of(car), "machine", "", "off", "on", Optional.empty(), "", List.of(), List.of(), ""))); + Optional.of(car), "machine", "", "off", "on", Optional.empty(), "", List.of(), List.of(), "", + 0L, 0, "", Optional.empty()))); assertThat(DocumentValueText.rowLabel(plain)).isEqualTo("Vehicles::Car"); assertThat(DocumentValueText.rowLabel(object)).isEqualTo("car (#7)"); assertThat(DocumentValueText.rowLabel(state)).isEqualTo("car (#7) in on.run");