From d716d7bac8a284adb22289a864f43c8fc8015283 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:04:36 +0000 Subject: [PATCH 01/14] build(libs): vendor the QVTS library from the extension libraries Co-Authored-By: jason.han --- .../libs/extensions-project/.meta.json | 7 ++++- .../libs/extensions-project/.project.json | 2 +- .../stdlib/OpenSysML Libraries/QVTS.sysml | 29 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 internal/workspace/libs/stdlib/OpenSysML Libraries/QVTS.sysml diff --git a/internal/workspace/libs/extensions-project/.meta.json b/internal/workspace/libs/extensions-project/.meta.json index e95aa0b7ce..807116c079 100644 --- a/internal/workspace/libs/extensions-project/.meta.json +++ b/internal/workspace/libs/extensions-project/.meta.json @@ -40,6 +40,10 @@ "algorithm": "SHA256", "value": "1dc65b8af7d997047557b3297b8ac1b7e095ef992084e108f35e220a67518825" }, + "libraries/QVTS.sysml": { + "algorithm": "SHA256", + "value": "2ca4bcb7419c1938eeb8cb475780890812ce96aa4a7c194b1475ce4a0e347bfe" + }, "libraries/RandomFunctions.kerml": { "algorithm": "SHA256", "value": "50793e1e940b377777a931d102f86770b02576b019e6bfb7b8c33384cd78fbc7" @@ -69,7 +73,7 @@ "value": "9e00f049209584092dc8bcb398b736c08e6a39b1db667a8a744de3df72a543bf" } }, - "created": "2026-11-03T17:53:51Z", + "created": "2026-11-10T17:33:38Z", "index": { "AnalysisRecords": "libraries/AnalysisRecords.sysml", "DiagramLayout": "libraries/DiagramLayout.sysml", @@ -80,6 +84,7 @@ "OOSEM": "libraries/OOSEM.sysml", "OpenSysMLMathFunctions": "libraries/OpenSysMLMathFunctions.kerml", "OpenSysMLRenderings": "libraries/OpenSysMLRenderings.sysml", + "QVTS": "libraries/QVTS.sysml", "RandomFunctions": "libraries/RandomFunctions.kerml", "Simulation": "libraries/Simulation.sysml", "StateActivity": "libraries/StateActivity.kerml", diff --git a/internal/workspace/libs/extensions-project/.project.json b/internal/workspace/libs/extensions-project/.project.json index a0ba82138a..c5c32355cd 100644 --- a/internal/workspace/libs/extensions-project/.project.json +++ b/internal/workspace/libs/extensions-project/.project.json @@ -1,7 +1,7 @@ { "name": "OpenSysML Extensions Library", "publisher": "Open-MBEE", - "description": "Community non-normative SysML v2 and KerML extension libraries: diagram layout, identity and migration metadata, MOSA and OOSEM vocabularies, document queries, renderings, simulation, state machines, stochastic and state-space extensions, math and random functions, and validation constraints.", + "description": "Community non-normative SysML v2 and KerML extension libraries: diagram layout, identity and migration metadata, MOSA and OOSEM vocabularies, document queries and query results, renderings, simulation, state machines, stochastic and state-space extensions, math and random functions, and validation constraints.", "version": "1.0.0", "license": "Apache-2.0", "website": "https://github.com/Open-MBEE/OpenSysML-Extensions-Library", diff --git a/internal/workspace/libs/stdlib/OpenSysML Libraries/QVTS.sysml b/internal/workspace/libs/stdlib/OpenSysML Libraries/QVTS.sysml new file mode 100644 index 0000000000..938b5717d9 --- /dev/null +++ b/internal/workspace/libs/stdlib/OpenSysML Libraries/QVTS.sysml @@ -0,0 +1,29 @@ +library package QVTS { + doc /* + * NON-NORMATIVE Query/View/Transformation vocabulary for SysML v2; not part + * of the OMG SysML or KerML standard library. + * The QVTS-R library, first cut: the shape of a query result. A query is a + * calc def specializing DocumentQueries::Query; its result is a view that + * exposes the selected elements and states how it was obtained. + */ + private import ScalarValues::*; + + enum def Outcome { + doc /* established: a value, possibly empty; pathError: the query path names + something the model does not have; modelError: the model violates a + constraint a step relied on. */ + established; + pathError; + modelError; + } + + view def QueryResult { + doc /* One query run. The exposed members are the elements the query selected; + the attributes say which query, over which source, with which outcome, + and where the PROV record of the run is. */ + attribute query : String; + attribute source : String; + attribute outcome : Outcome; + attribute provenance : String; + } +} From fa2ab10cafbed5be1436d532b42b79475be2f5da Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:04:36 +0000 Subject: [PATCH 02/14] feat(query): write a query's answer as a QVTS::QueryResult view Co-Authored-By: jason.han --- api/proto/sysml.pb.go | 872 ++-- api/proto/sysml.proto | 45 + client/node/src/generated/sysml_pb.ts | 194 +- client/python/opensysml/proto/sysml_pb2.py | 308 +- client/python/opensysml/proto/sysml_pb2.pyi | 56 +- .../rust/conformance/sysml.descriptor.binpb | 4210 +++++++++-------- .../rust/opensysml/src/proto/sysml/sysml.rs | 57 + cmd/sysml/check.go | 44 +- cmd/sysml/main.go | 5 + cmd/sysml/query.go | 20 +- cmd/sysml/report.go | 3 + cmd/sysml/usage.go | 2 + examples/qvts/README.md | 118 + examples/qvts/expected/view-cabin-mass.txt | 13 + .../qvts/expected/view-misspelled-name.txt | 16 + examples/qvts/expected/view-oslc-cabin.txt | 12 + .../expected/view-oslc-unknown-property.txt | 12 + .../qvts/expected/views/ambiguous-part.adoc | 12 + .../qvts/expected/views/ambiguous-part.html | 234 + .../qvts/expected/views/ambiguous-part.md | 13 + .../qvts/expected/views/ambiguous-part.sysml | 11 + .../qvts/expected/views/ambiguous-part.txt | 10 + .../expected/views/ambiguous-part.view.md | 10 + examples/qvts/expected/views/cabin-mass.adoc | 12 + examples/qvts/expected/views/cabin-mass.html | 234 + examples/qvts/expected/views/cabin-mass.md | 13 + examples/qvts/expected/views/cabin-mass.sysml | 11 + examples/qvts/expected/views/cabin-mass.txt | 10 + .../qvts/expected/views/cabin-mass.view.md | 10 + .../expected/views/double-mass-value.adoc | 12 + .../expected/views/double-mass-value.html | 234 + .../qvts/expected/views/double-mass-value.md | 13 + .../expected/views/double-mass-value.sysml | 11 + .../qvts/expected/views/double-mass-value.txt | 10 + .../expected/views/double-mass-value.view.md | 10 + .../qvts/expected/views/empty-selection.adoc | 8 + .../qvts/expected/views/empty-selection.html | 217 + .../qvts/expected/views/empty-selection.md | 11 + .../qvts/expected/views/empty-selection.sysml | 10 + .../qvts/expected/views/empty-selection.txt | 8 + .../expected/views/empty-selection.view.md | 8 + examples/qvts/expected/views/heavy-parts.adoc | 13 + examples/qvts/expected/views/heavy-parts.html | 240 + examples/qvts/expected/views/heavy-parts.md | 14 + examples/qvts/expected/views/heavy-parts.txt | 11 + .../qvts/expected/views/heavy-parts.view.md | 11 + examples/qvts/expected/views/inline-mass.adoc | 14 + examples/qvts/expected/views/inline-mass.html | 246 + examples/qvts/expected/views/inline-mass.md | 15 + .../qvts/expected/views/inline-mass.sysml | 13 + examples/qvts/expected/views/inline-mass.txt | 12 + .../qvts/expected/views/inline-mass.view.md | 12 + .../expected/views/missing-mass-project.adoc | 13 + .../expected/views/missing-mass-project.html | 240 + .../expected/views/missing-mass-project.md | 14 + .../expected/views/missing-mass-project.sysml | 12 + .../expected/views/missing-mass-project.txt | 11 + .../views/missing-mass-project.view.md | 11 + .../qvts/expected/views/misspelled-name.adoc | 12 + .../qvts/expected/views/misspelled-name.html | 234 + .../qvts/expected/views/misspelled-name.md | 13 + .../qvts/expected/views/misspelled-name.sysml | 11 + .../qvts/expected/views/misspelled-name.txt | 10 + .../expected/views/misspelled-name.view.md | 10 + examples/qvts/expected/views/oslc-cabin.adoc | 12 + examples/qvts/expected/views/oslc-cabin.html | 234 + examples/qvts/expected/views/oslc-cabin.md | 13 + examples/qvts/expected/views/oslc-cabin.sysml | 11 + examples/qvts/expected/views/oslc-cabin.txt | 10 + .../qvts/expected/views/oslc-cabin.view.md | 10 + .../expected/views/oslc-unknown-property.adoc | 8 + .../expected/views/oslc-unknown-property.html | 217 + .../expected/views/oslc-unknown-property.md | 11 + .../views/oslc-unknown-property.sysml | 10 + .../expected/views/oslc-unknown-property.txt | 8 + .../views/oslc-unknown-property.view.md | 8 + examples/qvts/observatory/observatory.sysml | 101 + examples/qvts/observatory/result.sysml | 14 + internal/doc/docir/queryresult.go | 36 + internal/doc/queryexec/resultview.go | 170 + internal/doc/queryexec/resultview_test.go | 70 + internal/doc/querytranslate/outcome.go | 29 + internal/frontend/grpc/capability_test.go | 6 +- internal/frontend/grpc/docquery.go | 31 +- internal/frontend/grpc/query.go | 59 +- internal/frontend/grpc/render_view.go | 24 +- internal/frontend/grpc/resultview.go | 201 + internal/frontend/grpc/service.go | 1 + internal/frontend/repl/docquery.go | 49 +- internal/frontend/repl/docquery_inline.go | 18 +- internal/frontend/repl/docrender.go | 23 + internal/frontend/repl/meta.go | 14 +- internal/frontend/repl/oslc_query.go | 30 +- internal/frontend/repl/query.go | 3 + internal/frontend/repl/resultview.go | 116 + internal/frontend/repl/session.go | 2 + internal/ir/view/clone.go | 1 + internal/ir/view/data.go | 3 + internal/ir/view/markdown.go | 9 + internal/ir/view/queryresult.go | 90 + internal/ir/view/text.go | 1 + internal/ir/view/view.go | 12 +- tests/grpc/conformance_docquery_test.go | 4 +- tests/grpc/conformance_test.go | 88 +- .../conformance/query_result_view.sysml | 55 + .../query_result_view_api.expected.json | 26 + .../query_result_view_empty.expected.json | 11 + .../query_result_view_inline.expected.json | 26 + ...uery_result_view_model_error.expected.json | 8 + .../query_result_view_named.expected.json | 37 + .../query_result_view_oslc.expected.json | 10 + ...t_view_oslc_unknown_property.expected.json | 8 + ...query_result_view_path_error.expected.json | 8 + .../query_result_view_unasked.expected.json | 9 + ...r_view_form_not_query_result.expected.json | 7 + .../render_view_query_result.expected.json | 14 + ...r_view_query_result_asciidoc.expected.json | 13 + ...ender_view_query_result_html.expected.json | 18 + ...r_view_query_result_markdown.expected.json | 13 + tests/qvts/examples_test.go | 20 +- tests/qvts/result_views_test.go | 134 + 121 files changed, 7828 insertions(+), 2657 deletions(-) create mode 100644 examples/qvts/expected/view-cabin-mass.txt create mode 100644 examples/qvts/expected/view-misspelled-name.txt create mode 100644 examples/qvts/expected/view-oslc-cabin.txt create mode 100644 examples/qvts/expected/view-oslc-unknown-property.txt create mode 100644 examples/qvts/expected/views/ambiguous-part.adoc create mode 100644 examples/qvts/expected/views/ambiguous-part.html create mode 100644 examples/qvts/expected/views/ambiguous-part.md create mode 100644 examples/qvts/expected/views/ambiguous-part.sysml create mode 100644 examples/qvts/expected/views/ambiguous-part.txt create mode 100644 examples/qvts/expected/views/ambiguous-part.view.md create mode 100644 examples/qvts/expected/views/cabin-mass.adoc create mode 100644 examples/qvts/expected/views/cabin-mass.html create mode 100644 examples/qvts/expected/views/cabin-mass.md create mode 100644 examples/qvts/expected/views/cabin-mass.sysml create mode 100644 examples/qvts/expected/views/cabin-mass.txt create mode 100644 examples/qvts/expected/views/cabin-mass.view.md create mode 100644 examples/qvts/expected/views/double-mass-value.adoc create mode 100644 examples/qvts/expected/views/double-mass-value.html create mode 100644 examples/qvts/expected/views/double-mass-value.md create mode 100644 examples/qvts/expected/views/double-mass-value.sysml create mode 100644 examples/qvts/expected/views/double-mass-value.txt create mode 100644 examples/qvts/expected/views/double-mass-value.view.md create mode 100644 examples/qvts/expected/views/empty-selection.adoc create mode 100644 examples/qvts/expected/views/empty-selection.html create mode 100644 examples/qvts/expected/views/empty-selection.md create mode 100644 examples/qvts/expected/views/empty-selection.sysml create mode 100644 examples/qvts/expected/views/empty-selection.txt create mode 100644 examples/qvts/expected/views/empty-selection.view.md create mode 100644 examples/qvts/expected/views/heavy-parts.adoc create mode 100644 examples/qvts/expected/views/heavy-parts.html create mode 100644 examples/qvts/expected/views/heavy-parts.md create mode 100644 examples/qvts/expected/views/heavy-parts.txt create mode 100644 examples/qvts/expected/views/heavy-parts.view.md create mode 100644 examples/qvts/expected/views/inline-mass.adoc create mode 100644 examples/qvts/expected/views/inline-mass.html create mode 100644 examples/qvts/expected/views/inline-mass.md create mode 100644 examples/qvts/expected/views/inline-mass.sysml create mode 100644 examples/qvts/expected/views/inline-mass.txt create mode 100644 examples/qvts/expected/views/inline-mass.view.md create mode 100644 examples/qvts/expected/views/missing-mass-project.adoc create mode 100644 examples/qvts/expected/views/missing-mass-project.html create mode 100644 examples/qvts/expected/views/missing-mass-project.md create mode 100644 examples/qvts/expected/views/missing-mass-project.sysml create mode 100644 examples/qvts/expected/views/missing-mass-project.txt create mode 100644 examples/qvts/expected/views/missing-mass-project.view.md create mode 100644 examples/qvts/expected/views/misspelled-name.adoc create mode 100644 examples/qvts/expected/views/misspelled-name.html create mode 100644 examples/qvts/expected/views/misspelled-name.md create mode 100644 examples/qvts/expected/views/misspelled-name.sysml create mode 100644 examples/qvts/expected/views/misspelled-name.txt create mode 100644 examples/qvts/expected/views/misspelled-name.view.md create mode 100644 examples/qvts/expected/views/oslc-cabin.adoc create mode 100644 examples/qvts/expected/views/oslc-cabin.html create mode 100644 examples/qvts/expected/views/oslc-cabin.md create mode 100644 examples/qvts/expected/views/oslc-cabin.sysml create mode 100644 examples/qvts/expected/views/oslc-cabin.txt create mode 100644 examples/qvts/expected/views/oslc-cabin.view.md create mode 100644 examples/qvts/expected/views/oslc-unknown-property.adoc create mode 100644 examples/qvts/expected/views/oslc-unknown-property.html create mode 100644 examples/qvts/expected/views/oslc-unknown-property.md create mode 100644 examples/qvts/expected/views/oslc-unknown-property.sysml create mode 100644 examples/qvts/expected/views/oslc-unknown-property.txt create mode 100644 examples/qvts/expected/views/oslc-unknown-property.view.md create mode 100644 examples/qvts/observatory/observatory.sysml create mode 100644 examples/qvts/observatory/result.sysml create mode 100644 internal/doc/docir/queryresult.go create mode 100644 internal/doc/queryexec/resultview.go create mode 100644 internal/doc/queryexec/resultview_test.go create mode 100644 internal/doc/querytranslate/outcome.go create mode 100644 internal/frontend/grpc/resultview.go create mode 100644 internal/frontend/repl/resultview.go create mode 100644 internal/ir/view/queryresult.go create mode 100644 tests/grpc/testdata/conformance/query_result_view.sysml create mode 100644 tests/grpc/testdata/conformance/query_result_view_api.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_empty.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_inline.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_model_error.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_named.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_oslc.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_oslc_unknown_property.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_path_error.expected.json create mode 100644 tests/grpc/testdata/conformance/query_result_view_unasked.expected.json create mode 100644 tests/grpc/testdata/conformance/render_view_form_not_query_result.expected.json create mode 100644 tests/grpc/testdata/conformance/render_view_query_result.expected.json create mode 100644 tests/grpc/testdata/conformance/render_view_query_result_asciidoc.expected.json create mode 100644 tests/grpc/testdata/conformance/render_view_query_result_html.expected.json create mode 100644 tests/grpc/testdata/conformance/render_view_query_result_markdown.expected.json create mode 100644 tests/qvts/result_views_test.go diff --git a/api/proto/sysml.pb.go b/api/proto/sysml.pb.go index ab0934f0a0..2ef9f8be33 100644 --- a/api/proto/sysml.pb.go +++ b/api/proto/sysml.pb.go @@ -12290,6 +12290,11 @@ type ServerInfoResponse struct { // and the response carries the document in `asciidoc`. // "render_view" - the RenderView RPC renders a declared view or targeted // pseudo-view as machine-readable diagram data. + // "query_result_view" - RunDocumentQueryRequest.as_view and + // QueryRequest.as_view write the answer as a + // QVTS::QueryResult view in result_view (a failed query's as + // a QueryResultView detail), and RenderView answers such a + // view's header and, for RenderViewRequest.form, a document. // "export_graphs" - the ExportGraphs RPC exports the lowered graph of an // action or state machine as canonical graphs:1 JSON. // "diagnostic_codes" - Diagnostic.code is populated, so an empty code is a @@ -12382,7 +12387,11 @@ type QueryRequest struct { ModelHash string `protobuf:"bytes,1,opt,name=model_hash,json=modelHash,proto3" json:"model_hash,omitempty"` // from ParseFile response Query *Query `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` // OSLC Query 3.0 parameter text, mutually exclusive with query. - OslcQuery string `protobuf:"bytes,3,opt,name=oslc_query,json=oslcQuery,proto3" json:"oslc_query,omitempty"` + OslcQuery string `protobuf:"bytes,3,opt,name=oslc_query,json=oslcQuery,proto3" json:"oslc_query,omitempty"` + // Also write the answer as a QVTS::QueryResult view, in result_view; a path or + // model error carries its view as a QueryResultView detail. Under the + // "query_result_view" capability. + AsView bool `protobuf:"varint,4,opt,name=as_view,json=asView,proto3" json:"as_view,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -12438,13 +12447,24 @@ func (x *QueryRequest) GetOslcQuery() string { return "" } +func (x *QueryRequest) GetAsView() bool { + if x != nil { + return x.AsView + } + return false +} + // 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. type QueryResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Elements []*QueryResultElement `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Elements []*QueryResultElement `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"` + // The answer as SysML text when the request set as_view, as + // RunDocumentQueryResponse.result_view; its query is the OSLC text, or the + // API query written as `scope=…; select=…; where=…; orderBy=…`. + ResultView string `protobuf:"bytes,2,opt,name=result_view,json=resultView,proto3" json:"result_view,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -12486,6 +12506,13 @@ func (x *QueryResponse) GetElements() []*QueryResultElement { return nil } +func (x *QueryResponse) GetResultView() string { + if x != nil { + return x.ResultView + } + return "" +} + // 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 @@ -14600,7 +14627,11 @@ type RunDocumentQueryRequest struct { // expression fails with INVALID_ARGUMENT positioned within it (`inline query // :`); a path or model error carries a QueryOutcome detail as a // named query's does. Reported as the "inline_document_query" capability. - InlineQuery string `protobuf:"bytes,4,opt,name=inline_query,json=inlineQuery,proto3" json:"inline_query,omitempty"` + InlineQuery string `protobuf:"bytes,4,opt,name=inline_query,json=inlineQuery,proto3" json:"inline_query,omitempty"` + // Also write the answer as a QVTS::QueryResult view, in result_view; a path or + // model error carries its view as a QueryResultView detail. Under the + // "query_result_view" capability. + AsView bool `protobuf:"varint,5,opt,name=as_view,json=asView,proto3" json:"as_view,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -14663,6 +14694,13 @@ func (x *RunDocumentQueryRequest) GetInlineQuery() string { return "" } +func (x *RunDocumentQueryRequest) GetAsView() bool { + if x != nil { + return x.AsView + } + return false +} + // DocumentQueryBinding binds one entry parameter of a document query. type DocumentQueryBinding struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -15641,9 +15679,13 @@ func (x *DocumentQueryRow) GetCells() []*DocumentQueryCell { // selects nothing answers with no rows; a query that could not be run fails the // call with the status its failure maps to. type RunDocumentQueryResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Columns []*DocumentQueryColumn `protobuf:"bytes,1,rep,name=columns,proto3" json:"columns,omitempty"` - Rows []*DocumentQueryRow `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Columns []*DocumentQueryColumn `protobuf:"bytes,1,rep,name=columns,proto3" json:"columns,omitempty"` + Rows []*DocumentQueryRow `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"` + // The answer as SysML text when the request set as_view: a package holding one + // `view : QVTS::QueryResult` that exposes each selected element and states the + // query with its bindings, the source, the outcome and the provenance. + ResultView string `protobuf:"bytes,3,opt,name=result_view,json=resultView,proto3" json:"result_view,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -15692,6 +15734,59 @@ func (x *RunDocumentQueryResponse) GetRows() []*DocumentQueryRow { return nil } +func (x *RunDocumentQueryResponse) GetResultView() string { + if x != nil { + return x.ResultView + } + return "" +} + +// QueryResultView is a failed query written as a QVTS::QueryResult view, an error +// detail beside QueryOutcome when the request set as_view: it exposes the frontier and finding elements. +type QueryResultView struct { + state protoimpl.MessageState `protogen:"open.v1"` + Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryResultView) Reset() { + *x = QueryResultView{} + mi := &file_sysml_proto_msgTypes[163] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryResultView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryResultView) ProtoMessage() {} + +func (x *QueryResultView) ProtoReflect() protoreflect.Message { + mi := &file_sysml_proto_msgTypes[163] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use QueryResultView.ProtoReflect.Descriptor instead. +func (*QueryResultView) Descriptor() ([]byte, []int) { + return file_sysml_proto_rawDescGZIP(), []int{163} +} + +func (x *QueryResultView) GetText() string { + if x != nil { + return x.Text + } + return "" +} + // 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. type QueryOutcome struct { @@ -15712,7 +15807,7 @@ type QueryOutcome struct { func (x *QueryOutcome) Reset() { *x = QueryOutcome{} - mi := &file_sysml_proto_msgTypes[163] + mi := &file_sysml_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15724,7 +15819,7 @@ func (x *QueryOutcome) String() string { func (*QueryOutcome) ProtoMessage() {} func (x *QueryOutcome) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[163] + mi := &file_sysml_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15737,7 +15832,7 @@ func (x *QueryOutcome) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryOutcome.ProtoReflect.Descriptor instead. func (*QueryOutcome) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{163} + return file_sysml_proto_rawDescGZIP(), []int{164} } func (x *QueryOutcome) GetKind() string { @@ -15809,7 +15904,7 @@ type QueryFailure struct { func (x *QueryFailure) Reset() { *x = QueryFailure{} - mi := &file_sysml_proto_msgTypes[164] + mi := &file_sysml_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15821,7 +15916,7 @@ func (x *QueryFailure) String() string { func (*QueryFailure) ProtoMessage() {} func (x *QueryFailure) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[164] + mi := &file_sysml_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15834,7 +15929,7 @@ func (x *QueryFailure) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFailure.ProtoReflect.Descriptor instead. func (*QueryFailure) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{164} + return file_sysml_proto_rawDescGZIP(), []int{165} } func (x *QueryFailure) GetStep() string { @@ -15878,7 +15973,7 @@ type QueryFrontier struct { func (x *QueryFrontier) Reset() { *x = QueryFrontier{} - mi := &file_sysml_proto_msgTypes[165] + mi := &file_sysml_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15890,7 +15985,7 @@ func (x *QueryFrontier) String() string { func (*QueryFrontier) ProtoMessage() {} func (x *QueryFrontier) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[165] + mi := &file_sysml_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15903,7 +15998,7 @@ func (x *QueryFrontier) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFrontier.ProtoReflect.Descriptor instead. func (*QueryFrontier) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{165} + return file_sysml_proto_rawDescGZIP(), []int{166} } func (x *QueryFrontier) GetAt() string { @@ -15972,7 +16067,7 @@ type QueryFrontierMember struct { func (x *QueryFrontierMember) Reset() { *x = QueryFrontierMember{} - mi := &file_sysml_proto_msgTypes[166] + mi := &file_sysml_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15984,7 +16079,7 @@ func (x *QueryFrontierMember) String() string { func (*QueryFrontierMember) ProtoMessage() {} func (x *QueryFrontierMember) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[166] + mi := &file_sysml_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15997,7 +16092,7 @@ func (x *QueryFrontierMember) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFrontierMember.ProtoReflect.Descriptor instead. func (*QueryFrontierMember) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{166} + return file_sysml_proto_rawDescGZIP(), []int{167} } func (x *QueryFrontierMember) GetName() string { @@ -16024,7 +16119,7 @@ type QueryFrontierFeature struct { func (x *QueryFrontierFeature) Reset() { *x = QueryFrontierFeature{} - mi := &file_sysml_proto_msgTypes[167] + mi := &file_sysml_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16036,7 +16131,7 @@ func (x *QueryFrontierFeature) String() string { func (*QueryFrontierFeature) ProtoMessage() {} func (x *QueryFrontierFeature) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[167] + mi := &file_sysml_proto_msgTypes[168] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16049,7 +16144,7 @@ func (x *QueryFrontierFeature) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFrontierFeature.ProtoReflect.Descriptor instead. func (*QueryFrontierFeature) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{167} + return file_sysml_proto_rawDescGZIP(), []int{168} } func (x *QueryFrontierFeature) GetName() string { @@ -16080,7 +16175,7 @@ type QueryFinding struct { func (x *QueryFinding) Reset() { *x = QueryFinding{} - mi := &file_sysml_proto_msgTypes[168] + mi := &file_sysml_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16092,7 +16187,7 @@ func (x *QueryFinding) String() string { func (*QueryFinding) ProtoMessage() {} func (x *QueryFinding) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[168] + mi := &file_sysml_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16105,7 +16200,7 @@ func (x *QueryFinding) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFinding.ProtoReflect.Descriptor instead. func (*QueryFinding) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{168} + return file_sysml_proto_rawDescGZIP(), []int{169} } func (x *QueryFinding) GetStep() string { @@ -16158,7 +16253,7 @@ type RenderDocumentRequest struct { func (x *RenderDocumentRequest) Reset() { *x = RenderDocumentRequest{} - mi := &file_sysml_proto_msgTypes[169] + mi := &file_sysml_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16170,7 +16265,7 @@ func (x *RenderDocumentRequest) String() string { func (*RenderDocumentRequest) ProtoMessage() {} func (x *RenderDocumentRequest) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[169] + mi := &file_sysml_proto_msgTypes[170] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16183,7 +16278,7 @@ func (x *RenderDocumentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderDocumentRequest.ProtoReflect.Descriptor instead. func (*RenderDocumentRequest) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{169} + return file_sysml_proto_rawDescGZIP(), []int{170} } func (x *RenderDocumentRequest) GetModelHash() string { @@ -16226,7 +16321,7 @@ type RenderDocumentResponse struct { func (x *RenderDocumentResponse) Reset() { *x = RenderDocumentResponse{} - mi := &file_sysml_proto_msgTypes[170] + mi := &file_sysml_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16238,7 +16333,7 @@ func (x *RenderDocumentResponse) String() string { func (*RenderDocumentResponse) ProtoMessage() {} func (x *RenderDocumentResponse) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[170] + mi := &file_sysml_proto_msgTypes[171] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16251,7 +16346,7 @@ func (x *RenderDocumentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderDocumentResponse.ProtoReflect.Descriptor instead. func (*RenderDocumentResponse) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{170} + return file_sysml_proto_rawDescGZIP(), []int{171} } func (x *RenderDocumentResponse) GetMarkdown() string { @@ -16303,14 +16398,19 @@ type RenderViewRequest struct { // 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). - Compartments string `protobuf:"bytes,6,opt,name=compartments,proto3" json:"compartments,omitempty"` + Compartments string `protobuf:"bytes,6,opt,name=compartments,proto3" json:"compartments,omitempty"` + // A document form to also render a QVTS::QueryResult view in — "markdown", + // "html" or "asciidoc", as RenderDocumentRequest.form — answered in the + // response's field of that name. Fails with INVALID_ARGUMENT for any other + // view. Under the "query_result_view" capability. + Form string `protobuf:"bytes,7,opt,name=form,proto3" json:"form,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *RenderViewRequest) Reset() { *x = RenderViewRequest{} - mi := &file_sysml_proto_msgTypes[171] + mi := &file_sysml_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16322,7 +16422,7 @@ func (x *RenderViewRequest) String() string { func (*RenderViewRequest) ProtoMessage() {} func (x *RenderViewRequest) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[171] + mi := &file_sysml_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16335,7 +16435,7 @@ func (x *RenderViewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderViewRequest.ProtoReflect.Descriptor instead. func (*RenderViewRequest) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{171} + return file_sysml_proto_rawDescGZIP(), []int{172} } func (x *RenderViewRequest) GetModelHash() string { @@ -16380,6 +16480,13 @@ func (x *RenderViewRequest) GetCompartments() string { return "" } +func (x *RenderViewRequest) GetForm() string { + if x != nil { + return x.Form + } + return "" +} + // RenderViewResponse carries all machine-readable fields of the rendering. type RenderViewResponse struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -16399,14 +16506,21 @@ type RenderViewResponse struct { // The optional notation elements drawn, in registry order. Shown []string `protobuf:"bytes,11,rep,name=shown,proto3" json:"shown,omitempty"` // The view frame round a graph-shaped rendering; unset for a frameless one. - Frame *RenderFrame `protobuf:"bytes,12,opt,name=frame,proto3" json:"frame,omitempty"` + Frame *RenderFrame `protobuf:"bytes,12,opt,name=frame,proto3" json:"frame,omitempty"` + // A QVTS::QueryResult view's query, source, outcome and provenance, in that + // order, above its rows; empty for any other view. + Header []*RenderHeaderField `protobuf:"bytes,13,rep,name=header,proto3" json:"header,omitempty"` + // The view as a document in the form the request asked for, the others empty. + Markdown string `protobuf:"bytes,14,opt,name=markdown,proto3" json:"markdown,omitempty"` + Html string `protobuf:"bytes,15,opt,name=html,proto3" json:"html,omitempty"` + Asciidoc string `protobuf:"bytes,16,opt,name=asciidoc,proto3" json:"asciidoc,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *RenderViewResponse) Reset() { *x = RenderViewResponse{} - mi := &file_sysml_proto_msgTypes[172] + mi := &file_sysml_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16418,7 +16532,7 @@ func (x *RenderViewResponse) String() string { func (*RenderViewResponse) ProtoMessage() {} func (x *RenderViewResponse) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[172] + mi := &file_sysml_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16431,7 +16545,7 @@ func (x *RenderViewResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderViewResponse.ProtoReflect.Descriptor instead. func (*RenderViewResponse) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{172} + return file_sysml_proto_rawDescGZIP(), []int{173} } func (x *RenderViewResponse) GetView() string { @@ -16518,6 +16632,87 @@ func (x *RenderViewResponse) GetFrame() *RenderFrame { return nil } +func (x *RenderViewResponse) GetHeader() []*RenderHeaderField { + if x != nil { + return x.Header + } + return nil +} + +func (x *RenderViewResponse) GetMarkdown() string { + if x != nil { + return x.Markdown + } + return "" +} + +func (x *RenderViewResponse) GetHtml() string { + if x != nil { + return x.Html + } + return "" +} + +func (x *RenderViewResponse) GetAsciidoc() string { + if x != nil { + return x.Asciidoc + } + return "" +} + +// RenderHeaderField is one stated attribute of a QVTS::QueryResult view. +type RenderHeaderField struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RenderHeaderField) Reset() { + *x = RenderHeaderField{} + mi := &file_sysml_proto_msgTypes[174] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RenderHeaderField) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenderHeaderField) ProtoMessage() {} + +func (x *RenderHeaderField) ProtoReflect() protoreflect.Message { + mi := &file_sysml_proto_msgTypes[174] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RenderHeaderField.ProtoReflect.Descriptor instead. +func (*RenderHeaderField) Descriptor() ([]byte, []int) { + return file_sysml_proto_rawDescGZIP(), []int{174} +} + +func (x *RenderHeaderField) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RenderHeaderField) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + // RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's // name and view definition, and the lines of the three information // compartments (exposes top right, filters bottom left, annotations bottom right). @@ -16534,7 +16729,7 @@ type RenderFrame struct { func (x *RenderFrame) Reset() { *x = RenderFrame{} - mi := &file_sysml_proto_msgTypes[173] + mi := &file_sysml_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16546,7 +16741,7 @@ func (x *RenderFrame) String() string { func (*RenderFrame) ProtoMessage() {} func (x *RenderFrame) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[173] + mi := &file_sysml_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16559,7 +16754,7 @@ func (x *RenderFrame) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderFrame.ProtoReflect.Descriptor instead. func (*RenderFrame) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{173} + return file_sysml_proto_rawDescGZIP(), []int{175} } func (x *RenderFrame) GetName() string { @@ -16633,7 +16828,7 @@ type RenderNode struct { func (x *RenderNode) Reset() { *x = RenderNode{} - mi := &file_sysml_proto_msgTypes[174] + mi := &file_sysml_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16645,7 +16840,7 @@ func (x *RenderNode) String() string { func (*RenderNode) ProtoMessage() {} func (x *RenderNode) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[174] + mi := &file_sysml_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16658,7 +16853,7 @@ func (x *RenderNode) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderNode.ProtoReflect.Descriptor instead. func (*RenderNode) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{174} + return file_sysml_proto_rawDescGZIP(), []int{176} } func (x *RenderNode) GetId() string { @@ -16795,7 +16990,7 @@ type RenderPort struct { func (x *RenderPort) Reset() { *x = RenderPort{} - mi := &file_sysml_proto_msgTypes[175] + mi := &file_sysml_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16807,7 +17002,7 @@ func (x *RenderPort) String() string { func (*RenderPort) ProtoMessage() {} func (x *RenderPort) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[175] + mi := &file_sysml_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16820,7 +17015,7 @@ func (x *RenderPort) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderPort.ProtoReflect.Descriptor instead. func (*RenderPort) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{175} + return file_sysml_proto_rawDescGZIP(), []int{177} } func (x *RenderPort) GetId() string { @@ -16877,7 +17072,7 @@ type RenderEdge struct { func (x *RenderEdge) Reset() { *x = RenderEdge{} - mi := &file_sysml_proto_msgTypes[176] + mi := &file_sysml_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16889,7 +17084,7 @@ func (x *RenderEdge) String() string { func (*RenderEdge) ProtoMessage() {} func (x *RenderEdge) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[176] + mi := &file_sysml_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16902,7 +17097,7 @@ func (x *RenderEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderEdge.ProtoReflect.Descriptor instead. func (*RenderEdge) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{176} + return file_sysml_proto_rawDescGZIP(), []int{178} } func (x *RenderEdge) GetFrom() string { @@ -16992,7 +17187,7 @@ type RenderGeometry struct { func (x *RenderGeometry) Reset() { *x = RenderGeometry{} - mi := &file_sysml_proto_msgTypes[177] + mi := &file_sysml_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17004,7 +17199,7 @@ func (x *RenderGeometry) String() string { func (*RenderGeometry) ProtoMessage() {} func (x *RenderGeometry) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[177] + mi := &file_sysml_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17017,7 +17212,7 @@ func (x *RenderGeometry) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderGeometry.ProtoReflect.Descriptor instead. func (*RenderGeometry) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{177} + return file_sysml_proto_rawDescGZIP(), []int{179} } func (x *RenderGeometry) GetX() float64 { @@ -17082,7 +17277,7 @@ type RenderCanvas struct { func (x *RenderCanvas) Reset() { *x = RenderCanvas{} - mi := &file_sysml_proto_msgTypes[178] + mi := &file_sysml_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17094,7 +17289,7 @@ func (x *RenderCanvas) String() string { func (*RenderCanvas) ProtoMessage() {} func (x *RenderCanvas) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[178] + mi := &file_sysml_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17107,7 +17302,7 @@ func (x *RenderCanvas) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderCanvas.ProtoReflect.Descriptor instead. func (*RenderCanvas) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{178} + return file_sysml_proto_rawDescGZIP(), []int{180} } func (x *RenderCanvas) GetUnit() string { @@ -17154,7 +17349,7 @@ type RenderStyle struct { func (x *RenderStyle) Reset() { *x = RenderStyle{} - mi := &file_sysml_proto_msgTypes[179] + mi := &file_sysml_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17166,7 +17361,7 @@ func (x *RenderStyle) String() string { func (*RenderStyle) ProtoMessage() {} func (x *RenderStyle) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[179] + mi := &file_sysml_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17179,7 +17374,7 @@ func (x *RenderStyle) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderStyle.ProtoReflect.Descriptor instead. func (*RenderStyle) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{179} + return file_sysml_proto_rawDescGZIP(), []int{181} } func (x *RenderStyle) GetFill() string { @@ -17242,7 +17437,7 @@ type RenderPoint struct { func (x *RenderPoint) Reset() { *x = RenderPoint{} - mi := &file_sysml_proto_msgTypes[180] + mi := &file_sysml_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17254,7 +17449,7 @@ func (x *RenderPoint) String() string { func (*RenderPoint) ProtoMessage() {} func (x *RenderPoint) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[180] + mi := &file_sysml_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17267,7 +17462,7 @@ func (x *RenderPoint) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderPoint.ProtoReflect.Descriptor instead. func (*RenderPoint) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{180} + return file_sysml_proto_rawDescGZIP(), []int{182} } func (x *RenderPoint) GetX() float64 { @@ -17295,7 +17490,7 @@ type RenderRow struct { func (x *RenderRow) Reset() { *x = RenderRow{} - mi := &file_sysml_proto_msgTypes[181] + mi := &file_sysml_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17307,7 +17502,7 @@ func (x *RenderRow) String() string { func (*RenderRow) ProtoMessage() {} func (x *RenderRow) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[181] + mi := &file_sysml_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17320,7 +17515,7 @@ func (x *RenderRow) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderRow.ProtoReflect.Descriptor instead. func (*RenderRow) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{181} + return file_sysml_proto_rawDescGZIP(), []int{183} } func (x *RenderRow) GetCells() []string { @@ -17356,7 +17551,7 @@ type RenderNote struct { func (x *RenderNote) Reset() { *x = RenderNote{} - mi := &file_sysml_proto_msgTypes[182] + mi := &file_sysml_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17368,7 +17563,7 @@ func (x *RenderNote) String() string { func (*RenderNote) ProtoMessage() {} func (x *RenderNote) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[182] + mi := &file_sysml_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17381,7 +17576,7 @@ func (x *RenderNote) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderNote.ProtoReflect.Descriptor instead. func (*RenderNote) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{182} + return file_sysml_proto_rawDescGZIP(), []int{184} } func (x *RenderNote) GetText() string { @@ -17466,7 +17661,7 @@ type ExportGraphsRequest struct { func (x *ExportGraphsRequest) Reset() { *x = ExportGraphsRequest{} - mi := &file_sysml_proto_msgTypes[183] + mi := &file_sysml_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17478,7 +17673,7 @@ func (x *ExportGraphsRequest) String() string { func (*ExportGraphsRequest) ProtoMessage() {} func (x *ExportGraphsRequest) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[183] + mi := &file_sysml_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17491,7 +17686,7 @@ func (x *ExportGraphsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportGraphsRequest.ProtoReflect.Descriptor instead. func (*ExportGraphsRequest) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{183} + return file_sysml_proto_rawDescGZIP(), []int{185} } func (x *ExportGraphsRequest) GetModelHash() string { @@ -17525,7 +17720,7 @@ type ExportGraphsResponse struct { func (x *ExportGraphsResponse) Reset() { *x = ExportGraphsResponse{} - mi := &file_sysml_proto_msgTypes[184] + mi := &file_sysml_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17537,7 +17732,7 @@ func (x *ExportGraphsResponse) String() string { func (*ExportGraphsResponse) ProtoMessage() {} func (x *ExportGraphsResponse) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[184] + mi := &file_sysml_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17550,7 +17745,7 @@ func (x *ExportGraphsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportGraphsResponse.ProtoReflect.Descriptor instead. func (*ExportGraphsResponse) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{184} + return file_sysml_proto_rawDescGZIP(), []int{186} } func (x *ExportGraphsResponse) GetContent() string { @@ -17597,7 +17792,7 @@ type ImportDataRequest struct { func (x *ImportDataRequest) Reset() { *x = ImportDataRequest{} - mi := &file_sysml_proto_msgTypes[185] + mi := &file_sysml_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17609,7 +17804,7 @@ func (x *ImportDataRequest) String() string { func (*ImportDataRequest) ProtoMessage() {} func (x *ImportDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[185] + mi := &file_sysml_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17622,7 +17817,7 @@ func (x *ImportDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportDataRequest.ProtoReflect.Descriptor instead. func (*ImportDataRequest) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{185} + return file_sysml_proto_rawDescGZIP(), []int{187} } func (x *ImportDataRequest) GetModelHash() string { @@ -17678,7 +17873,7 @@ type DataImport struct { func (x *DataImport) Reset() { *x = DataImport{} - mi := &file_sysml_proto_msgTypes[186] + mi := &file_sysml_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17690,7 +17885,7 @@ func (x *DataImport) String() string { func (*DataImport) ProtoMessage() {} func (x *DataImport) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[186] + mi := &file_sysml_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17703,7 +17898,7 @@ func (x *DataImport) ProtoReflect() protoreflect.Message { // Deprecated: Use DataImport.ProtoReflect.Descriptor instead. func (*DataImport) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{186} + return file_sysml_proto_rawDescGZIP(), []int{188} } func (x *DataImport) GetName() string { @@ -17755,7 +17950,7 @@ type ImportDataResponse struct { func (x *ImportDataResponse) Reset() { *x = ImportDataResponse{} - mi := &file_sysml_proto_msgTypes[187] + mi := &file_sysml_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17767,7 +17962,7 @@ func (x *ImportDataResponse) String() string { func (*ImportDataResponse) ProtoMessage() {} func (x *ImportDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[187] + mi := &file_sysml_proto_msgTypes[189] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17780,7 +17975,7 @@ func (x *ImportDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportDataResponse.ProtoReflect.Descriptor instead. func (*ImportDataResponse) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{187} + return file_sysml_proto_rawDescGZIP(), []int{189} } func (x *ImportDataResponse) GetFiles() []*ImportedFile { @@ -17839,7 +18034,7 @@ type ImportedFile struct { func (x *ImportedFile) Reset() { *x = ImportedFile{} - mi := &file_sysml_proto_msgTypes[188] + mi := &file_sysml_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17851,7 +18046,7 @@ func (x *ImportedFile) String() string { func (*ImportedFile) ProtoMessage() {} func (x *ImportedFile) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[188] + mi := &file_sysml_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17864,7 +18059,7 @@ func (x *ImportedFile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportedFile.ProtoReflect.Descriptor instead. func (*ImportedFile) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{188} + return file_sysml_proto_rawDescGZIP(), []int{190} } func (x *ImportedFile) GetName() string { @@ -17914,7 +18109,7 @@ type ImportedValue struct { func (x *ImportedValue) Reset() { *x = ImportedValue{} - mi := &file_sysml_proto_msgTypes[189] + mi := &file_sysml_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17926,7 +18121,7 @@ func (x *ImportedValue) String() string { func (*ImportedValue) ProtoMessage() {} func (x *ImportedValue) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[189] + mi := &file_sysml_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17939,7 +18134,7 @@ func (x *ImportedValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportedValue.ProtoReflect.Descriptor instead. func (*ImportedValue) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{189} + return file_sysml_proto_rawDescGZIP(), []int{191} } func (x *ImportedValue) GetElement() string { @@ -18017,7 +18212,7 @@ type CompareResultsRequest struct { func (x *CompareResultsRequest) Reset() { *x = CompareResultsRequest{} - mi := &file_sysml_proto_msgTypes[190] + mi := &file_sysml_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18029,7 +18224,7 @@ func (x *CompareResultsRequest) String() string { func (*CompareResultsRequest) ProtoMessage() {} func (x *CompareResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[190] + mi := &file_sysml_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18042,7 +18237,7 @@ func (x *CompareResultsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompareResultsRequest.ProtoReflect.Descriptor instead. func (*CompareResultsRequest) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{190} + return file_sysml_proto_rawDescGZIP(), []int{192} } func (x *CompareResultsRequest) GetModelHash() string { @@ -18120,7 +18315,7 @@ type ObservablePair struct { func (x *ObservablePair) Reset() { *x = ObservablePair{} - mi := &file_sysml_proto_msgTypes[191] + mi := &file_sysml_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18132,7 +18327,7 @@ func (x *ObservablePair) String() string { func (*ObservablePair) ProtoMessage() {} func (x *ObservablePair) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[191] + mi := &file_sysml_proto_msgTypes[193] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18145,7 +18340,7 @@ func (x *ObservablePair) ProtoReflect() protoreflect.Message { // Deprecated: Use ObservablePair.ProtoReflect.Descriptor instead. func (*ObservablePair) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{191} + return file_sysml_proto_rawDescGZIP(), []int{193} } func (x *ObservablePair) GetStored() string { @@ -18182,7 +18377,7 @@ type CompareResultsResponse struct { func (x *CompareResultsResponse) Reset() { *x = CompareResultsResponse{} - mi := &file_sysml_proto_msgTypes[192] + mi := &file_sysml_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18194,7 +18389,7 @@ func (x *CompareResultsResponse) String() string { func (*CompareResultsResponse) ProtoMessage() {} func (x *CompareResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[192] + mi := &file_sysml_proto_msgTypes[194] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18207,7 +18402,7 @@ func (x *CompareResultsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CompareResultsResponse.ProtoReflect.Descriptor instead. func (*CompareResultsResponse) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{192} + return file_sysml_proto_rawDescGZIP(), []int{194} } func (x *CompareResultsResponse) GetConfigurations() []*ConfigurationComparison { @@ -18307,7 +18502,7 @@ type ConfigurationComparison struct { func (x *ConfigurationComparison) Reset() { *x = ConfigurationComparison{} - mi := &file_sysml_proto_msgTypes[193] + mi := &file_sysml_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18319,7 +18514,7 @@ func (x *ConfigurationComparison) String() string { func (*ConfigurationComparison) ProtoMessage() {} func (x *ConfigurationComparison) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[193] + mi := &file_sysml_proto_msgTypes[195] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18332,7 +18527,7 @@ func (x *ConfigurationComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationComparison.ProtoReflect.Descriptor instead. func (*ConfigurationComparison) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{193} + return file_sysml_proto_rawDescGZIP(), []int{195} } func (x *ConfigurationComparison) GetId() string { @@ -18510,7 +18705,7 @@ type ObservableComparison struct { func (x *ObservableComparison) Reset() { *x = ObservableComparison{} - mi := &file_sysml_proto_msgTypes[194] + mi := &file_sysml_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18522,7 +18717,7 @@ func (x *ObservableComparison) String() string { func (*ObservableComparison) ProtoMessage() {} func (x *ObservableComparison) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[194] + mi := &file_sysml_proto_msgTypes[196] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18535,7 +18730,7 @@ func (x *ObservableComparison) ProtoReflect() protoreflect.Message { // Deprecated: Use ObservableComparison.ProtoReflect.Descriptor instead. func (*ObservableComparison) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{194} + return file_sysml_proto_rawDescGZIP(), []int{196} } func (x *ObservableComparison) GetStored() string { @@ -18639,7 +18834,7 @@ type ComparedDistribution struct { func (x *ComparedDistribution) Reset() { *x = ComparedDistribution{} - mi := &file_sysml_proto_msgTypes[195] + mi := &file_sysml_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18651,7 +18846,7 @@ func (x *ComparedDistribution) String() string { func (*ComparedDistribution) ProtoMessage() {} func (x *ComparedDistribution) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[195] + mi := &file_sysml_proto_msgTypes[197] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18664,7 +18859,7 @@ func (x *ComparedDistribution) ProtoReflect() protoreflect.Message { // Deprecated: Use ComparedDistribution.ProtoReflect.Descriptor instead. func (*ComparedDistribution) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{195} + return file_sysml_proto_rawDescGZIP(), []int{197} } func (x *ComparedDistribution) GetCount() int64 { @@ -18731,7 +18926,7 @@ type StatisticDifference struct { func (x *StatisticDifference) Reset() { *x = StatisticDifference{} - mi := &file_sysml_proto_msgTypes[196] + mi := &file_sysml_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18743,7 +18938,7 @@ func (x *StatisticDifference) String() string { func (*StatisticDifference) ProtoMessage() {} func (x *StatisticDifference) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[196] + mi := &file_sysml_proto_msgTypes[198] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18756,7 +18951,7 @@ func (x *StatisticDifference) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticDifference.ProtoReflect.Descriptor instead. func (*StatisticDifference) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{196} + return file_sysml_proto_rawDescGZIP(), []int{198} } func (x *StatisticDifference) GetMin() string { @@ -18807,7 +19002,7 @@ type CaseStatistics struct { func (x *CaseStatistics) Reset() { *x = CaseStatistics{} - mi := &file_sysml_proto_msgTypes[197] + mi := &file_sysml_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18819,7 +19014,7 @@ func (x *CaseStatistics) String() string { func (*CaseStatistics) ProtoMessage() {} func (x *CaseStatistics) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[197] + mi := &file_sysml_proto_msgTypes[199] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18832,7 +19027,7 @@ func (x *CaseStatistics) ProtoReflect() protoreflect.Message { // Deprecated: Use CaseStatistics.ProtoReflect.Descriptor instead. func (*CaseStatistics) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{197} + return file_sysml_proto_rawDescGZIP(), []int{199} } func (x *CaseStatistics) GetAnalysis() string { @@ -18871,7 +19066,7 @@ type CaseStatistic struct { func (x *CaseStatistic) Reset() { *x = CaseStatistic{} - mi := &file_sysml_proto_msgTypes[198] + mi := &file_sysml_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18883,7 +19078,7 @@ func (x *CaseStatistic) String() string { func (*CaseStatistic) ProtoMessage() {} func (x *CaseStatistic) ProtoReflect() protoreflect.Message { - mi := &file_sysml_proto_msgTypes[198] + mi := &file_sysml_proto_msgTypes[200] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18896,7 +19091,7 @@ func (x *CaseStatistic) ProtoReflect() protoreflect.Message { // Deprecated: Use CaseStatistic.ProtoReflect.Descriptor instead. func (*CaseStatistic) Descriptor() ([]byte, []int) { - return file_sysml_proto_rawDescGZIP(), []int{198} + return file_sysml_proto_rawDescGZIP(), []int{200} } func (x *CaseStatistic) GetStatistic() string { @@ -19944,15 +20139,18 @@ const file_sysml_proto_rawDesc = "" + "\x11ServerInfoRequest\"R\n" + "\x12ServerInfoResponse\x12\x18\n" + "\aversion\x18\x01 \x01(\tR\aversion\x12\"\n" + - "\fcapabilities\x18\x02 \x03(\tR\fcapabilities\"p\n" + + "\fcapabilities\x18\x02 \x03(\tR\fcapabilities\"\x89\x01\n" + "\fQueryRequest\x12\x1d\n" + "\n" + "model_hash\x18\x01 \x01(\tR\tmodelHash\x12\"\n" + "\x05query\x18\x02 \x01(\v2\f.sysml.QueryR\x05query\x12\x1d\n" + "\n" + - "oslc_query\x18\x03 \x01(\tR\toslcQuery\"F\n" + + "oslc_query\x18\x03 \x01(\tR\toslcQuery\x12\x17\n" + + "\aas_view\x18\x04 \x01(\bR\x06asView\"g\n" + "\rQueryResponse\x125\n" + - "\belements\x18\x01 \x03(\v2\x19.sysml.QueryResultElementR\belements\"y\n" + + "\belements\x18\x01 \x03(\v2\x19.sysml.QueryResultElementR\belements\x12\x1f\n" + + "\vresult_view\x18\x02 \x01(\tR\n" + + "resultView\"y\n" + "\x05Query\x12\x14\n" + "\x05scope\x18\x01 \x03(\tR\x05scope\x12\x16\n" + "\x06select\x18\x02 \x03(\tR\x06select\x12'\n" + @@ -20167,13 +20365,14 @@ const file_sysml_proto_rawDesc = "" + "\bstrength\x18\r \x01(\tR\bstrength\x12$\n" + "\x06bounds\x18\x0e \x03(\v2\f.sysml.BoundR\x06bounds\x12\x17\n" + "\x04seed\x18\x0f \x01(\x04H\x00R\x04seed\x88\x01\x01B\a\n" + - "\x05_seed\"\xaf\x01\n" + + "\x05_seed\"\xc8\x01\n" + "\x17RunDocumentQueryRequest\x12\x1d\n" + "\n" + "model_hash\x18\x01 \x01(\tR\tmodelHash\x12\x19\n" + "\bquery_id\x18\x02 \x01(\tR\aqueryId\x127\n" + "\bbindings\x18\x03 \x03(\v2\x1b.sysml.DocumentQueryBindingR\bbindings\x12!\n" + - "\finline_query\x18\x04 \x01(\tR\vinlineQuery\"b\n" + + "\finline_query\x18\x04 \x01(\tR\vinlineQuery\x12\x17\n" + + "\aas_view\x18\x05 \x01(\bR\x06asView\"b\n" + "\x14DocumentQueryBinding\x12\x1c\n" + "\tparameter\x18\x01 \x01(\tR\tparameter\x12,\n" + "\x06values\x18\x02 \x03(\v2\x14.sysml.DocumentValueR\x06values\"\xcf\x04\n" + @@ -20245,10 +20444,14 @@ const file_sysml_proto_rawDesc = "" + "\x06values\x18\x01 \x03(\v2\x14.sysml.DocumentValueR\x06values\"r\n" + "\x10DocumentQueryRow\x12.\n" + "\aelement\x18\x01 \x01(\v2\x14.sysml.DocumentValueR\aelement\x12.\n" + - "\x05cells\x18\x02 \x03(\v2\x18.sysml.DocumentQueryCellR\x05cells\"}\n" + + "\x05cells\x18\x02 \x03(\v2\x18.sysml.DocumentQueryCellR\x05cells\"\x9e\x01\n" + "\x18RunDocumentQueryResponse\x124\n" + "\acolumns\x18\x01 \x03(\v2\x1a.sysml.DocumentQueryColumnR\acolumns\x12+\n" + - "\x04rows\x18\x02 \x03(\v2\x17.sysml.DocumentQueryRowR\x04rows\"\xd0\x02\n" + + "\x04rows\x18\x02 \x03(\v2\x17.sysml.DocumentQueryRowR\x04rows\x12\x1f\n" + + "\vresult_view\x18\x03 \x01(\tR\n" + + "resultView\"%\n" + + "\x0fQueryResultView\x12\x12\n" + + "\x04text\x18\x01 \x01(\tR\x04text\"\xd0\x02\n" + "\fQueryOutcome\x12\x12\n" + "\x04kind\x18\x01 \x01(\tR\x04kind\x12\x12\n" + "\x04step\x18\x02 \x01(\tR\x04step\x12/\n" + @@ -20295,7 +20498,7 @@ const file_sysml_proto_rawDesc = "" + "\bmarkdown\x18\x01 \x01(\tR\bmarkdown\x12\x12\n" + "\x04html\x18\x02 \x01(\tR\x04html\x12\x1a\n" + "\basciidoc\x18\x04 \x01(\tR\basciidoc\x12\x1b\n" + - "\tfile_name\x18\x03 \x01(\tR\bfileName\"\xaa\x01\n" + + "\tfile_name\x18\x03 \x01(\tR\bfileName\"\xbe\x01\n" + "\x11RenderViewRequest\x12\x1d\n" + "\n" + "model_hash\x18\x01 \x01(\tR\tmodelHash\x12\x12\n" + @@ -20303,7 +20506,8 @@ const file_sysml_proto_rawDesc = "" + "\x05ports\x18\x03 \x01(\tR\x05ports\x12\x12\n" + "\x04show\x18\x04 \x03(\tR\x04show\x12\x14\n" + "\x05depth\x18\x05 \x01(\x05R\x05depth\x12\"\n" + - "\fcompartments\x18\x06 \x01(\tR\fcompartments\"\x96\x03\n" + + "\fcompartments\x18\x06 \x01(\tR\fcompartments\x12\x12\n" + + "\x04form\x18\a \x01(\tR\x04form\"\x94\x04\n" + "\x12RenderViewResponse\x12\x12\n" + "\x04view\x18\x01 \x01(\tR\x04view\x12\x12\n" + "\x04kind\x18\x02 \x01(\tR\x04kind\x12\x16\n" + @@ -20317,7 +20521,14 @@ const file_sysml_proto_rawDesc = "" + "\anotices\x18\n" + " \x03(\tR\anotices\x12\x14\n" + "\x05shown\x18\v \x03(\tR\x05shown\x12(\n" + - "\x05frame\x18\f \x01(\v2\x12.sysml.RenderFrameR\x05frame\"\x8b\x01\n" + + "\x05frame\x18\f \x01(\v2\x12.sysml.RenderFrameR\x05frame\x120\n" + + "\x06header\x18\r \x03(\v2\x18.sysml.RenderHeaderFieldR\x06header\x12\x1a\n" + + "\bmarkdown\x18\x0e \x01(\tR\bmarkdown\x12\x12\n" + + "\x04html\x18\x0f \x01(\tR\x04html\x12\x1a\n" + + "\basciidoc\x18\x10 \x01(\tR\basciidoc\"=\n" + + "\x11RenderHeaderField\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value\"\x8b\x01\n" + "\vRenderFrame\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + "\x04type\x18\x02 \x01(\tR\x04type\x12\x18\n" + @@ -20633,7 +20844,7 @@ func file_sysml_proto_rawDescGZIP() []byte { } var file_sysml_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_sysml_proto_msgTypes = make([]protoimpl.MessageInfo, 218) +var file_sysml_proto_msgTypes = make([]protoimpl.MessageInfo, 220) var file_sysml_proto_goTypes = []any{ (FailureReason)(0), // 0: sysml.FailureReason (EditFailure)(0), // 1: sysml.EditFailure @@ -20802,61 +21013,63 @@ var file_sysml_proto_goTypes = []any{ (*DocumentQueryCell)(nil), // 164: sysml.DocumentQueryCell (*DocumentQueryRow)(nil), // 165: sysml.DocumentQueryRow (*RunDocumentQueryResponse)(nil), // 166: sysml.RunDocumentQueryResponse - (*QueryOutcome)(nil), // 167: sysml.QueryOutcome - (*QueryFailure)(nil), // 168: sysml.QueryFailure - (*QueryFrontier)(nil), // 169: sysml.QueryFrontier - (*QueryFrontierMember)(nil), // 170: sysml.QueryFrontierMember - (*QueryFrontierFeature)(nil), // 171: sysml.QueryFrontierFeature - (*QueryFinding)(nil), // 172: sysml.QueryFinding - (*RenderDocumentRequest)(nil), // 173: sysml.RenderDocumentRequest - (*RenderDocumentResponse)(nil), // 174: sysml.RenderDocumentResponse - (*RenderViewRequest)(nil), // 175: sysml.RenderViewRequest - (*RenderViewResponse)(nil), // 176: sysml.RenderViewResponse - (*RenderFrame)(nil), // 177: sysml.RenderFrame - (*RenderNode)(nil), // 178: sysml.RenderNode - (*RenderPort)(nil), // 179: sysml.RenderPort - (*RenderEdge)(nil), // 180: sysml.RenderEdge - (*RenderGeometry)(nil), // 181: sysml.RenderGeometry - (*RenderCanvas)(nil), // 182: sysml.RenderCanvas - (*RenderStyle)(nil), // 183: sysml.RenderStyle - (*RenderPoint)(nil), // 184: sysml.RenderPoint - (*RenderRow)(nil), // 185: sysml.RenderRow - (*RenderNote)(nil), // 186: sysml.RenderNote - (*ExportGraphsRequest)(nil), // 187: sysml.ExportGraphsRequest - (*ExportGraphsResponse)(nil), // 188: sysml.ExportGraphsResponse - (*ImportDataRequest)(nil), // 189: sysml.ImportDataRequest - (*DataImport)(nil), // 190: sysml.DataImport - (*ImportDataResponse)(nil), // 191: sysml.ImportDataResponse - (*ImportedFile)(nil), // 192: sysml.ImportedFile - (*ImportedValue)(nil), // 193: sysml.ImportedValue - (*CompareResultsRequest)(nil), // 194: sysml.CompareResultsRequest - (*ObservablePair)(nil), // 195: sysml.ObservablePair - (*CompareResultsResponse)(nil), // 196: sysml.CompareResultsResponse - (*ConfigurationComparison)(nil), // 197: sysml.ConfigurationComparison - (*ObservableComparison)(nil), // 198: sysml.ObservableComparison - (*ComparedDistribution)(nil), // 199: sysml.ComparedDistribution - (*StatisticDifference)(nil), // 200: sysml.StatisticDifference - (*CaseStatistics)(nil), // 201: sysml.CaseStatistics - (*CaseStatistic)(nil), // 202: sysml.CaseStatistic - nil, // 203: sysml.VerifyConstraintRequest.NamedArgumentsEntry - nil, // 204: sysml.VerifyRequirementRequest.NamedArgumentsEntry - nil, // 205: sysml.RunAnalysisRequest.NamedArgumentsEntry - nil, // 206: sysml.Outcome.OutputsEntry - nil, // 207: sysml.CheckBehaviorRequest.InputsEntry - nil, // 208: sysml.CheckFinal.ValuesEntry - nil, // 209: sysml.Instance.FeatureValuesEntry - nil, // 210: sysml.ExecuteActionRequest.InputsEntry - nil, // 211: sysml.ExecuteActionResponse.OutputsEntry - nil, // 212: sysml.ExecuteActionResponse.PerformerAttributesEntry - nil, // 213: sysml.ExecuteActionResponse.OrderDependentEntry - nil, // 214: sysml.ExecuteStateResponse.FinalContextEntry - nil, // 215: sysml.ExecuteStateResponse.OrderDependentEntry - nil, // 216: sysml.SymbolInfo.MetadataEntry - nil, // 217: sysml.QueryResultElement.PropertiesEntry - nil, // 218: sysml.RunSweepRequest.NamedArgumentsEntry - nil, // 219: sysml.RunRunsRequest.InputsEntry - nil, // 220: sysml.RunRunsRequest.NamedArgumentsEntry - nil, // 221: sysml.RecordRunRequest.NamedArgumentsEntry + (*QueryResultView)(nil), // 167: sysml.QueryResultView + (*QueryOutcome)(nil), // 168: sysml.QueryOutcome + (*QueryFailure)(nil), // 169: sysml.QueryFailure + (*QueryFrontier)(nil), // 170: sysml.QueryFrontier + (*QueryFrontierMember)(nil), // 171: sysml.QueryFrontierMember + (*QueryFrontierFeature)(nil), // 172: sysml.QueryFrontierFeature + (*QueryFinding)(nil), // 173: sysml.QueryFinding + (*RenderDocumentRequest)(nil), // 174: sysml.RenderDocumentRequest + (*RenderDocumentResponse)(nil), // 175: sysml.RenderDocumentResponse + (*RenderViewRequest)(nil), // 176: sysml.RenderViewRequest + (*RenderViewResponse)(nil), // 177: sysml.RenderViewResponse + (*RenderHeaderField)(nil), // 178: sysml.RenderHeaderField + (*RenderFrame)(nil), // 179: sysml.RenderFrame + (*RenderNode)(nil), // 180: sysml.RenderNode + (*RenderPort)(nil), // 181: sysml.RenderPort + (*RenderEdge)(nil), // 182: sysml.RenderEdge + (*RenderGeometry)(nil), // 183: sysml.RenderGeometry + (*RenderCanvas)(nil), // 184: sysml.RenderCanvas + (*RenderStyle)(nil), // 185: sysml.RenderStyle + (*RenderPoint)(nil), // 186: sysml.RenderPoint + (*RenderRow)(nil), // 187: sysml.RenderRow + (*RenderNote)(nil), // 188: sysml.RenderNote + (*ExportGraphsRequest)(nil), // 189: sysml.ExportGraphsRequest + (*ExportGraphsResponse)(nil), // 190: sysml.ExportGraphsResponse + (*ImportDataRequest)(nil), // 191: sysml.ImportDataRequest + (*DataImport)(nil), // 192: sysml.DataImport + (*ImportDataResponse)(nil), // 193: sysml.ImportDataResponse + (*ImportedFile)(nil), // 194: sysml.ImportedFile + (*ImportedValue)(nil), // 195: sysml.ImportedValue + (*CompareResultsRequest)(nil), // 196: sysml.CompareResultsRequest + (*ObservablePair)(nil), // 197: sysml.ObservablePair + (*CompareResultsResponse)(nil), // 198: sysml.CompareResultsResponse + (*ConfigurationComparison)(nil), // 199: sysml.ConfigurationComparison + (*ObservableComparison)(nil), // 200: sysml.ObservableComparison + (*ComparedDistribution)(nil), // 201: sysml.ComparedDistribution + (*StatisticDifference)(nil), // 202: sysml.StatisticDifference + (*CaseStatistics)(nil), // 203: sysml.CaseStatistics + (*CaseStatistic)(nil), // 204: sysml.CaseStatistic + nil, // 205: sysml.VerifyConstraintRequest.NamedArgumentsEntry + nil, // 206: sysml.VerifyRequirementRequest.NamedArgumentsEntry + nil, // 207: sysml.RunAnalysisRequest.NamedArgumentsEntry + nil, // 208: sysml.Outcome.OutputsEntry + nil, // 209: sysml.CheckBehaviorRequest.InputsEntry + nil, // 210: sysml.CheckFinal.ValuesEntry + nil, // 211: sysml.Instance.FeatureValuesEntry + nil, // 212: sysml.ExecuteActionRequest.InputsEntry + nil, // 213: sysml.ExecuteActionResponse.OutputsEntry + nil, // 214: sysml.ExecuteActionResponse.PerformerAttributesEntry + nil, // 215: sysml.ExecuteActionResponse.OrderDependentEntry + nil, // 216: sysml.ExecuteStateResponse.FinalContextEntry + nil, // 217: sysml.ExecuteStateResponse.OrderDependentEntry + nil, // 218: sysml.SymbolInfo.MetadataEntry + nil, // 219: sysml.QueryResultElement.PropertiesEntry + nil, // 220: sysml.RunSweepRequest.NamedArgumentsEntry + nil, // 221: sysml.RunRunsRequest.InputsEntry + nil, // 222: sysml.RunRunsRequest.NamedArgumentsEntry + nil, // 223: sysml.RecordRunRequest.NamedArgumentsEntry } var file_sysml_proto_depIdxs = []int32{ 0, // 0: sysml.Verdict.failure_reason:type_name -> sysml.FailureReason @@ -20865,12 +21078,12 @@ var file_sysml_proto_depIdxs = []int32{ 5, // 3: sysml.Verdict.notes:type_name -> sysml.VerdictNote 112, // 4: sysml.WitnessAssignment.value:type_name -> sysml.Value 112, // 5: sysml.VerifyConstraintRequest.arguments:type_name -> sysml.Value - 203, // 6: sysml.VerifyConstraintRequest.named_arguments:type_name -> sysml.VerifyConstraintRequest.NamedArgumentsEntry + 205, // 6: sysml.VerifyConstraintRequest.named_arguments:type_name -> sysml.VerifyConstraintRequest.NamedArgumentsEntry 4, // 7: sysml.VerifyConstraintResponse.verdict:type_name -> sysml.Verdict 59, // 8: sysml.VerifyConstraintResponse.instances:type_name -> sysml.Instance 129, // 9: sysml.VerifyConstraintResponse.diagnostics:type_name -> sysml.Diagnostic 112, // 10: sysml.VerifyRequirementRequest.arguments:type_name -> sysml.Value - 204, // 11: sysml.VerifyRequirementRequest.named_arguments:type_name -> sysml.VerifyRequirementRequest.NamedArgumentsEntry + 206, // 11: sysml.VerifyRequirementRequest.named_arguments:type_name -> sysml.VerifyRequirementRequest.NamedArgumentsEntry 4, // 12: sysml.VerifyRequirementResponse.verdict:type_name -> sysml.Verdict 59, // 13: sysml.VerifyRequirementResponse.instances:type_name -> sysml.Instance 129, // 14: sysml.VerifyRequirementResponse.diagnostics:type_name -> sysml.Diagnostic @@ -20896,7 +21109,7 @@ var file_sysml_proto_depIdxs = []int32{ 112, // 34: sysml.CaseEvaluation.arguments:type_name -> sysml.Value 112, // 35: sysml.CaseEvaluation.result:type_name -> sysml.Value 112, // 36: sysml.RunAnalysisRequest.arguments:type_name -> sysml.Value - 205, // 37: sysml.RunAnalysisRequest.named_arguments:type_name -> sysml.RunAnalysisRequest.NamedArgumentsEntry + 207, // 37: sysml.RunAnalysisRequest.named_arguments:type_name -> sysml.RunAnalysisRequest.NamedArgumentsEntry 23, // 38: sysml.ToolDryRun.input_file:type_name -> sysml.ToolDryRunFile 24, // 39: sysml.ToolDryRun.inputs:type_name -> sysml.ToolDryRunInput 25, // 40: sysml.ToolDryRun.outputs:type_name -> sysml.ToolDryRunOutput @@ -20911,17 +21124,17 @@ var file_sysml_proto_depIdxs = []int32{ 20, // 49: sysml.RunAnalysisResponse.evaluations:type_name -> sysml.CaseEvaluation 7, // 50: sysml.RunAnalysisResponse.bounds:type_name -> sysml.Bound 22, // 51: sysml.RunAnalysisResponse.tool_dry_run:type_name -> sysml.ToolDryRun - 206, // 52: sysml.Outcome.outputs:type_name -> sysml.Outcome.OutputsEntry + 208, // 52: sysml.Outcome.outputs:type_name -> sysml.Outcome.OutputsEntry 129, // 53: sysml.Outcome.diagnostics:type_name -> sysml.Diagnostic 27, // 54: sysml.Outcome.probability_range:type_name -> sysml.ProbabilityRange 30, // 55: sysml.ExplorationStatus.coverage:type_name -> sysml.Coverage 31, // 56: sysml.Coverage.states:type_name -> sysml.CoverageEntry 31, // 57: sysml.Coverage.transitions:type_name -> sysml.CoverageEntry - 207, // 58: sysml.CheckBehaviorRequest.inputs:type_name -> sysml.CheckBehaviorRequest.InputsEntry + 209, // 58: sysml.CheckBehaviorRequest.inputs:type_name -> sysml.CheckBehaviorRequest.InputsEntry 33, // 59: sysml.CheckViolation.witness:type_name -> sysml.CheckWitness 33, // 60: sysml.CheckDivergentValue.witness:type_name -> sysml.CheckWitness 35, // 61: sysml.CheckDivergence.values:type_name -> sysml.CheckDivergentValue - 208, // 62: sysml.CheckFinal.values:type_name -> sysml.CheckFinal.ValuesEntry + 210, // 62: sysml.CheckFinal.values:type_name -> sysml.CheckFinal.ValuesEntry 33, // 63: sysml.CheckFinal.witness:type_name -> sysml.CheckWitness 30, // 64: sysml.CheckSearch.coverage:type_name -> sysml.Coverage 38, // 65: sysml.CheckBehaviorResponse.search:type_name -> sysml.CheckSearch @@ -20945,7 +21158,7 @@ var file_sysml_proto_depIdxs = []int32{ 129, // 83: sysml.DiagnosticsResponse.diagnostics:type_name -> sysml.Diagnostic 112, // 84: sysml.EvaluateResponse.result:type_name -> sysml.Value 129, // 85: sysml.EvaluateResponse.diagnostics:type_name -> sysml.Diagnostic - 209, // 86: sysml.Instance.feature_values:type_name -> sysml.Instance.FeatureValuesEntry + 211, // 86: sysml.Instance.feature_values:type_name -> sysml.Instance.FeatureValuesEntry 60, // 87: sysml.Instance.reached_by:type_name -> sysml.InstanceReach 112, // 88: sysml.FeatureValue.value:type_name -> sysml.Value 112, // 89: sysml.FeatureValue.values:type_name -> sysml.Value @@ -20957,20 +21170,20 @@ var file_sysml_proto_depIdxs = []int32{ 129, // 95: sysml.InstancePathsResponse.diagnostics:type_name -> sysml.Diagnostic 67, // 96: sysml.InstancePath.root:type_name -> sysml.InstanceRoot 68, // 97: sysml.InstancePath.steps:type_name -> sysml.InstancePathStep - 210, // 98: sysml.ExecuteActionRequest.inputs:type_name -> sysml.ExecuteActionRequest.InputsEntry - 211, // 99: sysml.ExecuteActionResponse.outputs:type_name -> sysml.ExecuteActionResponse.OutputsEntry + 212, // 98: sysml.ExecuteActionRequest.inputs:type_name -> sysml.ExecuteActionRequest.InputsEntry + 213, // 99: sysml.ExecuteActionResponse.outputs:type_name -> sysml.ExecuteActionResponse.OutputsEntry 129, // 100: sysml.ExecuteActionResponse.diagnostics:type_name -> sysml.Diagnostic 28, // 101: sysml.ExecuteActionResponse.outcomes:type_name -> sysml.Outcome 29, // 102: sysml.ExecuteActionResponse.exploration:type_name -> sysml.ExplorationStatus - 212, // 103: sysml.ExecuteActionResponse.performer_attributes:type_name -> sysml.ExecuteActionResponse.PerformerAttributesEntry - 213, // 104: sysml.ExecuteActionResponse.order_dependent:type_name -> sysml.ExecuteActionResponse.OrderDependentEntry + 214, // 103: sysml.ExecuteActionResponse.performer_attributes:type_name -> sysml.ExecuteActionResponse.PerformerAttributesEntry + 215, // 104: sysml.ExecuteActionResponse.order_dependent:type_name -> sysml.ExecuteActionResponse.OrderDependentEntry 162, // 105: sysml.ExecuteActionResponse.trace:type_name -> sysml.DocumentEvent - 214, // 106: sysml.ExecuteStateResponse.final_context:type_name -> sysml.ExecuteStateResponse.FinalContextEntry + 216, // 106: sysml.ExecuteStateResponse.final_context:type_name -> sysml.ExecuteStateResponse.FinalContextEntry 129, // 107: sysml.ExecuteStateResponse.diagnostics:type_name -> sysml.Diagnostic 28, // 108: sysml.ExecuteStateResponse.outcomes:type_name -> sysml.Outcome 29, // 109: sysml.ExecuteStateResponse.exploration:type_name -> sysml.ExplorationStatus 162, // 110: sysml.ExecuteStateResponse.trace:type_name -> sysml.DocumentEvent - 215, // 111: sysml.ExecuteStateResponse.order_dependent:type_name -> sysml.ExecuteStateResponse.OrderDependentEntry + 217, // 111: sysml.ExecuteStateResponse.order_dependent:type_name -> sysml.ExecuteStateResponse.OrderDependentEntry 129, // 112: sysml.ConvertResponse.diagnostics:type_name -> sysml.Diagnostic 75, // 113: sysml.ConvertResponse.library_references:type_name -> sysml.LibraryReference 78, // 114: sysml.MigrateResponse.report:type_name -> sysml.MigrationReport @@ -21002,7 +21215,7 @@ var file_sysml_proto_depIdxs = []int32{ 129, // 140: sysml.ApplyEditsResponse.diagnostics:type_name -> sysml.Diagnostic 102, // 141: sysml.ApplyEditsResponse.documents:type_name -> sysml.EditedDocument 103, // 142: sysml.ApplyEditsResponse.referrers:type_name -> sysml.Referrer - 216, // 143: sysml.SymbolInfo.metadata:type_name -> sysml.SymbolInfo.MetadataEntry + 218, // 143: sysml.SymbolInfo.metadata:type_name -> sysml.SymbolInfo.MetadataEntry 111, // 144: sysml.SymbolInfo.attributes:type_name -> sysml.AttributeInfo 108, // 145: sysml.SymbolInfo.type_info:type_name -> sysml.TypeInfo 110, // 146: sysml.SymbolInfo.multiplicity:type_name -> sysml.MultiplicityInfo @@ -21045,12 +21258,12 @@ var file_sysml_proto_depIdxs = []int32{ 2, // 183: sysml.PrimitiveConstraint.operator:type_name -> sysml.PrimitiveOperator 3, // 184: sysml.CompositeConstraint.operator:type_name -> sysml.CompositeOperator 136, // 185: sysml.CompositeConstraint.constraint:type_name -> sysml.Constraint - 217, // 186: sysml.QueryResultElement.properties:type_name -> sysml.QueryResultElement.PropertiesEntry + 219, // 186: sysml.QueryResultElement.properties:type_name -> sysml.QueryResultElement.PropertiesEntry 112, // 187: sysml.SweepRange.start:type_name -> sysml.Value 112, // 188: sysml.SweepRange.end:type_name -> sysml.Value 112, // 189: sysml.SweepRange.step:type_name -> sysml.Value 112, // 190: sysml.RunSweepRequest.arguments:type_name -> sysml.Value - 218, // 191: sysml.RunSweepRequest.named_arguments:type_name -> sysml.RunSweepRequest.NamedArgumentsEntry + 220, // 191: sysml.RunSweepRequest.named_arguments:type_name -> sysml.RunSweepRequest.NamedArgumentsEntry 140, // 192: sysml.RunSweepRequest.ranges:type_name -> sysml.SweepRange 19, // 193: sysml.SweepRow.inputs:type_name -> sysml.CalcOutput 19, // 194: sysml.SweepRow.outputs:type_name -> sysml.CalcOutput @@ -21062,9 +21275,9 @@ var file_sysml_proto_depIdxs = []int32{ 0, // 200: sysml.RunSweepResponse.failure_reason:type_name -> sysml.FailureReason 59, // 201: sysml.RunSweepResponse.instances:type_name -> sysml.Instance 7, // 202: sysml.RunSweepResponse.bounds:type_name -> sysml.Bound - 219, // 203: sysml.RunRunsRequest.inputs:type_name -> sysml.RunRunsRequest.InputsEntry + 221, // 203: sysml.RunRunsRequest.inputs:type_name -> sysml.RunRunsRequest.InputsEntry 112, // 204: sysml.RunRunsRequest.arguments:type_name -> sysml.Value - 220, // 205: sysml.RunRunsRequest.named_arguments:type_name -> sysml.RunRunsRequest.NamedArgumentsEntry + 222, // 205: sysml.RunRunsRequest.named_arguments:type_name -> sysml.RunRunsRequest.NamedArgumentsEntry 112, // 206: sysml.RunDistribution.min:type_name -> sysml.Value 112, // 207: sysml.RunDistribution.max:type_name -> sysml.Value 112, // 208: sysml.RunDistribution.mean:type_name -> sysml.Value @@ -21079,7 +21292,7 @@ var file_sysml_proto_depIdxs = []int32{ 151, // 217: sysml.SelfCheckResponse.applications:type_name -> sysml.SelfCheckApplication 129, // 218: sysml.SelfCheckResponse.diagnostics:type_name -> sysml.Diagnostic 112, // 219: sysml.RecordRunRequest.arguments:type_name -> sysml.Value - 221, // 220: sysml.RecordRunRequest.named_arguments:type_name -> sysml.RecordRunRequest.NamedArgumentsEntry + 223, // 220: sysml.RecordRunRequest.named_arguments:type_name -> sysml.RecordRunRequest.NamedArgumentsEntry 140, // 221: sysml.RecordRunRequest.ranges:type_name -> sysml.SweepRange 26, // 222: sysml.RecordRunResponse.run:type_name -> sysml.RunAnalysisResponse 143, // 223: sysml.RecordRunResponse.sweep:type_name -> sysml.RunSweepResponse @@ -21116,130 +21329,131 @@ var file_sysml_proto_depIdxs = []int32{ 164, // 254: sysml.DocumentQueryRow.cells:type_name -> sysml.DocumentQueryCell 163, // 255: sysml.RunDocumentQueryResponse.columns:type_name -> sysml.DocumentQueryColumn 165, // 256: sysml.RunDocumentQueryResponse.rows:type_name -> sysml.DocumentQueryRow - 168, // 257: sysml.QueryOutcome.failures:type_name -> sysml.QueryFailure - 172, // 258: sysml.QueryOutcome.findings:type_name -> sysml.QueryFinding - 168, // 259: sysml.QueryOutcome.path_failures:type_name -> sysml.QueryFailure - 169, // 260: sysml.QueryFailure.frontier:type_name -> sysml.QueryFrontier - 170, // 261: sysml.QueryFrontier.members:type_name -> sysml.QueryFrontierMember - 171, // 262: sysml.QueryFrontier.features:type_name -> sysml.QueryFrontierFeature - 178, // 263: sysml.RenderViewResponse.nodes:type_name -> sysml.RenderNode - 180, // 264: sysml.RenderViewResponse.edges:type_name -> sysml.RenderEdge - 185, // 265: sysml.RenderViewResponse.rows:type_name -> sysml.RenderRow - 182, // 266: sysml.RenderViewResponse.canvas:type_name -> sysml.RenderCanvas - 186, // 267: sysml.RenderViewResponse.notes:type_name -> sysml.RenderNote - 177, // 268: sysml.RenderViewResponse.frame:type_name -> sysml.RenderFrame - 179, // 269: sysml.RenderNode.ports:type_name -> sysml.RenderPort - 130, // 270: sysml.RenderNode.origin:type_name -> sysml.Span - 181, // 271: sysml.RenderNode.geometry:type_name -> sysml.RenderGeometry - 183, // 272: sysml.RenderNode.style:type_name -> sysml.RenderStyle - 130, // 273: sysml.RenderEdge.origin:type_name -> sysml.Span - 184, // 274: sysml.RenderEdge.route:type_name -> sysml.RenderPoint - 183, // 275: sysml.RenderEdge.style:type_name -> sysml.RenderStyle - 130, // 276: sysml.RenderRow.origin:type_name -> sysml.Span - 130, // 277: sysml.RenderNote.origin:type_name -> sysml.Span - 190, // 278: sysml.ImportDataRequest.imports:type_name -> sysml.DataImport - 192, // 279: sysml.ImportDataResponse.files:type_name -> sysml.ImportedFile - 102, // 280: sysml.ImportDataResponse.documents:type_name -> sysml.EditedDocument - 129, // 281: sysml.ImportDataResponse.diagnostics:type_name -> sysml.Diagnostic - 193, // 282: sysml.ImportedFile.assignments:type_name -> sysml.ImportedValue - 195, // 283: sysml.CompareResultsRequest.observe:type_name -> sysml.ObservablePair - 197, // 284: sysml.CompareResultsResponse.configurations:type_name -> sysml.ConfigurationComparison - 129, // 285: sysml.CompareResultsResponse.diagnostics:type_name -> sysml.Diagnostic - 0, // 286: sysml.CompareResultsResponse.failure_reason:type_name -> sysml.FailureReason - 7, // 287: sysml.CompareResultsResponse.bounds:type_name -> sysml.Bound - 142, // 288: sysml.ConfigurationComparison.rows:type_name -> sysml.SweepRow - 59, // 289: sysml.ConfigurationComparison.instances:type_name -> sysml.Instance - 198, // 290: sysml.ConfigurationComparison.observables:type_name -> sysml.ObservableComparison - 199, // 291: sysml.ObservableComparison.tool:type_name -> sysml.ComparedDistribution - 199, // 292: sysml.ObservableComparison.run:type_name -> sysml.ComparedDistribution - 200, // 293: sysml.ObservableComparison.difference:type_name -> sysml.StatisticDifference - 201, // 294: sysml.ObservableComparison.declared:type_name -> sysml.CaseStatistics - 202, // 295: sysml.CaseStatistics.rows:type_name -> sysml.CaseStatistic - 112, // 296: sysml.VerifyConstraintRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 112, // 297: sysml.VerifyRequirementRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 112, // 298: sysml.RunAnalysisRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 112, // 299: sysml.Outcome.OutputsEntry.value:type_name -> sysml.Value - 112, // 300: sysml.CheckBehaviorRequest.InputsEntry.value:type_name -> sysml.Value - 61, // 301: sysml.Instance.FeatureValuesEntry.value:type_name -> sysml.FeatureValue - 112, // 302: sysml.ExecuteActionRequest.InputsEntry.value:type_name -> sysml.Value - 112, // 303: sysml.ExecuteActionResponse.OutputsEntry.value:type_name -> sysml.Value - 112, // 304: sysml.ExecuteActionResponse.PerformerAttributesEntry.value:type_name -> sysml.Value - 112, // 305: sysml.ExecuteStateResponse.FinalContextEntry.value:type_name -> sysml.Value - 112, // 306: sysml.RunSweepRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 112, // 307: sysml.RunRunsRequest.InputsEntry.value:type_name -> sysml.Value - 112, // 308: sysml.RunRunsRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 112, // 309: sysml.RecordRunRequest.NamedArgumentsEntry.value:type_name -> sysml.Value - 131, // 310: sysml.SysMLService.GetServerInfo:input_type -> sysml.ServerInfoRequest - 43, // 311: sysml.SysMLService.ParseFile:input_type -> sysml.ParseFileRequest - 45, // 312: sysml.SysMLService.ParseSources:input_type -> sysml.ParseSourcesRequest - 48, // 313: sysml.SysMLService.GetSymbol:input_type -> sysml.GetSymbolRequest - 55, // 314: sysml.SysMLService.GetDiagnostics:input_type -> sysml.DiagnosticsRequest - 57, // 315: sysml.SysMLService.Evaluate:input_type -> sysml.EvaluateRequest - 62, // 316: sysml.SysMLService.Instantiate:input_type -> sysml.InstantiateRequest - 64, // 317: sysml.SysMLService.InstancePaths:input_type -> sysml.InstancePathsRequest - 69, // 318: sysml.SysMLService.ExecuteAction:input_type -> sysml.ExecuteActionRequest - 71, // 319: sysml.SysMLService.ExecuteState:input_type -> sysml.ExecuteStateRequest - 73, // 320: sysml.SysMLService.Convert:input_type -> sysml.ConvertRequest - 76, // 321: sysml.SysMLService.Migrate:input_type -> sysml.MigrateRequest - 81, // 322: sysml.SysMLService.ApplyEdits:input_type -> sysml.ApplyEditsRequest - 8, // 323: sysml.SysMLService.VerifyConstraint:input_type -> sysml.VerifyConstraintRequest - 10, // 324: sysml.SysMLService.VerifyRequirement:input_type -> sysml.VerifyRequirementRequest - 13, // 325: sysml.SysMLService.VerifySatisfaction:input_type -> sysml.VerifySatisfactionRequest - 15, // 326: sysml.SysMLService.ValidateInstance:input_type -> sysml.ValidateInstanceRequest - 17, // 327: sysml.SysMLService.EvaluateCalc:input_type -> sysml.EvaluateCalcRequest - 21, // 328: sysml.SysMLService.RunAnalysis:input_type -> sysml.RunAnalysisRequest - 32, // 329: sysml.SysMLService.CheckBehavior:input_type -> sysml.CheckBehaviorRequest - 141, // 330: sysml.SysMLService.RunSweep:input_type -> sysml.RunSweepRequest - 144, // 331: sysml.SysMLService.RunRuns:input_type -> sysml.RunRunsRequest - 149, // 332: sysml.SysMLService.SelfCheck:input_type -> sysml.SelfCheckRequest - 153, // 333: sysml.SysMLService.RecordRun:input_type -> sysml.RecordRunRequest - 40, // 334: sysml.SysMLService.ListEngines:input_type -> sysml.ListEnginesRequest - 133, // 335: sysml.SysMLService.Query:input_type -> sysml.QueryRequest - 50, // 336: sysml.SysMLService.GetElementProperties:input_type -> sysml.GetElementPropertiesRequest - 156, // 337: sysml.SysMLService.RunDocumentQuery:input_type -> sysml.RunDocumentQueryRequest - 173, // 338: sysml.SysMLService.RenderDocument:input_type -> sysml.RenderDocumentRequest - 175, // 339: sysml.SysMLService.RenderView:input_type -> sysml.RenderViewRequest - 187, // 340: sysml.SysMLService.ExportGraphs:input_type -> sysml.ExportGraphsRequest - 189, // 341: sysml.SysMLService.ImportData:input_type -> sysml.ImportDataRequest - 194, // 342: sysml.SysMLService.CompareResults:input_type -> sysml.CompareResultsRequest - 132, // 343: sysml.SysMLService.GetServerInfo:output_type -> sysml.ServerInfoResponse - 47, // 344: sysml.SysMLService.ParseFile:output_type -> sysml.ParseFileResponse - 46, // 345: sysml.SysMLService.ParseSources:output_type -> sysml.ParseSourcesResponse - 49, // 346: sysml.SysMLService.GetSymbol:output_type -> sysml.SymbolResponse - 56, // 347: sysml.SysMLService.GetDiagnostics:output_type -> sysml.DiagnosticsResponse - 58, // 348: sysml.SysMLService.Evaluate:output_type -> sysml.EvaluateResponse - 63, // 349: sysml.SysMLService.Instantiate:output_type -> sysml.InstantiateResponse - 65, // 350: sysml.SysMLService.InstancePaths:output_type -> sysml.InstancePathsResponse - 70, // 351: sysml.SysMLService.ExecuteAction:output_type -> sysml.ExecuteActionResponse - 72, // 352: sysml.SysMLService.ExecuteState:output_type -> sysml.ExecuteStateResponse - 74, // 353: sysml.SysMLService.Convert:output_type -> sysml.ConvertResponse - 77, // 354: sysml.SysMLService.Migrate:output_type -> sysml.MigrateResponse - 101, // 355: sysml.SysMLService.ApplyEdits:output_type -> sysml.ApplyEditsResponse - 9, // 356: sysml.SysMLService.VerifyConstraint:output_type -> sysml.VerifyConstraintResponse - 12, // 357: sysml.SysMLService.VerifyRequirement:output_type -> sysml.VerifyRequirementResponse - 14, // 358: sysml.SysMLService.VerifySatisfaction:output_type -> sysml.VerifySatisfactionResponse - 16, // 359: sysml.SysMLService.ValidateInstance:output_type -> sysml.ValidateInstanceResponse - 18, // 360: sysml.SysMLService.EvaluateCalc:output_type -> sysml.EvaluateCalcResponse - 26, // 361: sysml.SysMLService.RunAnalysis:output_type -> sysml.RunAnalysisResponse - 39, // 362: sysml.SysMLService.CheckBehavior:output_type -> sysml.CheckBehaviorResponse - 143, // 363: sysml.SysMLService.RunSweep:output_type -> sysml.RunSweepResponse - 155, // 364: sysml.SysMLService.RunRuns:output_type -> sysml.RunRunsResponse - 152, // 365: sysml.SysMLService.SelfCheck:output_type -> sysml.SelfCheckResponse - 154, // 366: sysml.SysMLService.RecordRun:output_type -> sysml.RecordRunResponse - 42, // 367: sysml.SysMLService.ListEngines:output_type -> sysml.ListEnginesResponse - 134, // 368: sysml.SysMLService.Query:output_type -> sysml.QueryResponse - 51, // 369: sysml.SysMLService.GetElementProperties:output_type -> sysml.GetElementPropertiesResponse - 166, // 370: sysml.SysMLService.RunDocumentQuery:output_type -> sysml.RunDocumentQueryResponse - 174, // 371: sysml.SysMLService.RenderDocument:output_type -> sysml.RenderDocumentResponse - 176, // 372: sysml.SysMLService.RenderView:output_type -> sysml.RenderViewResponse - 188, // 373: sysml.SysMLService.ExportGraphs:output_type -> sysml.ExportGraphsResponse - 191, // 374: sysml.SysMLService.ImportData:output_type -> sysml.ImportDataResponse - 196, // 375: sysml.SysMLService.CompareResults:output_type -> sysml.CompareResultsResponse - 343, // [343:376] is the sub-list for method output_type - 310, // [310:343] is the sub-list for method input_type - 310, // [310:310] is the sub-list for extension type_name - 310, // [310:310] is the sub-list for extension extendee - 0, // [0:310] is the sub-list for field type_name + 169, // 257: sysml.QueryOutcome.failures:type_name -> sysml.QueryFailure + 173, // 258: sysml.QueryOutcome.findings:type_name -> sysml.QueryFinding + 169, // 259: sysml.QueryOutcome.path_failures:type_name -> sysml.QueryFailure + 170, // 260: sysml.QueryFailure.frontier:type_name -> sysml.QueryFrontier + 171, // 261: sysml.QueryFrontier.members:type_name -> sysml.QueryFrontierMember + 172, // 262: sysml.QueryFrontier.features:type_name -> sysml.QueryFrontierFeature + 180, // 263: sysml.RenderViewResponse.nodes:type_name -> sysml.RenderNode + 182, // 264: sysml.RenderViewResponse.edges:type_name -> sysml.RenderEdge + 187, // 265: sysml.RenderViewResponse.rows:type_name -> sysml.RenderRow + 184, // 266: sysml.RenderViewResponse.canvas:type_name -> sysml.RenderCanvas + 188, // 267: sysml.RenderViewResponse.notes:type_name -> sysml.RenderNote + 179, // 268: sysml.RenderViewResponse.frame:type_name -> sysml.RenderFrame + 178, // 269: sysml.RenderViewResponse.header:type_name -> sysml.RenderHeaderField + 181, // 270: sysml.RenderNode.ports:type_name -> sysml.RenderPort + 130, // 271: sysml.RenderNode.origin:type_name -> sysml.Span + 183, // 272: sysml.RenderNode.geometry:type_name -> sysml.RenderGeometry + 185, // 273: sysml.RenderNode.style:type_name -> sysml.RenderStyle + 130, // 274: sysml.RenderEdge.origin:type_name -> sysml.Span + 186, // 275: sysml.RenderEdge.route:type_name -> sysml.RenderPoint + 185, // 276: sysml.RenderEdge.style:type_name -> sysml.RenderStyle + 130, // 277: sysml.RenderRow.origin:type_name -> sysml.Span + 130, // 278: sysml.RenderNote.origin:type_name -> sysml.Span + 192, // 279: sysml.ImportDataRequest.imports:type_name -> sysml.DataImport + 194, // 280: sysml.ImportDataResponse.files:type_name -> sysml.ImportedFile + 102, // 281: sysml.ImportDataResponse.documents:type_name -> sysml.EditedDocument + 129, // 282: sysml.ImportDataResponse.diagnostics:type_name -> sysml.Diagnostic + 195, // 283: sysml.ImportedFile.assignments:type_name -> sysml.ImportedValue + 197, // 284: sysml.CompareResultsRequest.observe:type_name -> sysml.ObservablePair + 199, // 285: sysml.CompareResultsResponse.configurations:type_name -> sysml.ConfigurationComparison + 129, // 286: sysml.CompareResultsResponse.diagnostics:type_name -> sysml.Diagnostic + 0, // 287: sysml.CompareResultsResponse.failure_reason:type_name -> sysml.FailureReason + 7, // 288: sysml.CompareResultsResponse.bounds:type_name -> sysml.Bound + 142, // 289: sysml.ConfigurationComparison.rows:type_name -> sysml.SweepRow + 59, // 290: sysml.ConfigurationComparison.instances:type_name -> sysml.Instance + 200, // 291: sysml.ConfigurationComparison.observables:type_name -> sysml.ObservableComparison + 201, // 292: sysml.ObservableComparison.tool:type_name -> sysml.ComparedDistribution + 201, // 293: sysml.ObservableComparison.run:type_name -> sysml.ComparedDistribution + 202, // 294: sysml.ObservableComparison.difference:type_name -> sysml.StatisticDifference + 203, // 295: sysml.ObservableComparison.declared:type_name -> sysml.CaseStatistics + 204, // 296: sysml.CaseStatistics.rows:type_name -> sysml.CaseStatistic + 112, // 297: sysml.VerifyConstraintRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 112, // 298: sysml.VerifyRequirementRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 112, // 299: sysml.RunAnalysisRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 112, // 300: sysml.Outcome.OutputsEntry.value:type_name -> sysml.Value + 112, // 301: sysml.CheckBehaviorRequest.InputsEntry.value:type_name -> sysml.Value + 61, // 302: sysml.Instance.FeatureValuesEntry.value:type_name -> sysml.FeatureValue + 112, // 303: sysml.ExecuteActionRequest.InputsEntry.value:type_name -> sysml.Value + 112, // 304: sysml.ExecuteActionResponse.OutputsEntry.value:type_name -> sysml.Value + 112, // 305: sysml.ExecuteActionResponse.PerformerAttributesEntry.value:type_name -> sysml.Value + 112, // 306: sysml.ExecuteStateResponse.FinalContextEntry.value:type_name -> sysml.Value + 112, // 307: sysml.RunSweepRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 112, // 308: sysml.RunRunsRequest.InputsEntry.value:type_name -> sysml.Value + 112, // 309: sysml.RunRunsRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 112, // 310: sysml.RecordRunRequest.NamedArgumentsEntry.value:type_name -> sysml.Value + 131, // 311: sysml.SysMLService.GetServerInfo:input_type -> sysml.ServerInfoRequest + 43, // 312: sysml.SysMLService.ParseFile:input_type -> sysml.ParseFileRequest + 45, // 313: sysml.SysMLService.ParseSources:input_type -> sysml.ParseSourcesRequest + 48, // 314: sysml.SysMLService.GetSymbol:input_type -> sysml.GetSymbolRequest + 55, // 315: sysml.SysMLService.GetDiagnostics:input_type -> sysml.DiagnosticsRequest + 57, // 316: sysml.SysMLService.Evaluate:input_type -> sysml.EvaluateRequest + 62, // 317: sysml.SysMLService.Instantiate:input_type -> sysml.InstantiateRequest + 64, // 318: sysml.SysMLService.InstancePaths:input_type -> sysml.InstancePathsRequest + 69, // 319: sysml.SysMLService.ExecuteAction:input_type -> sysml.ExecuteActionRequest + 71, // 320: sysml.SysMLService.ExecuteState:input_type -> sysml.ExecuteStateRequest + 73, // 321: sysml.SysMLService.Convert:input_type -> sysml.ConvertRequest + 76, // 322: sysml.SysMLService.Migrate:input_type -> sysml.MigrateRequest + 81, // 323: sysml.SysMLService.ApplyEdits:input_type -> sysml.ApplyEditsRequest + 8, // 324: sysml.SysMLService.VerifyConstraint:input_type -> sysml.VerifyConstraintRequest + 10, // 325: sysml.SysMLService.VerifyRequirement:input_type -> sysml.VerifyRequirementRequest + 13, // 326: sysml.SysMLService.VerifySatisfaction:input_type -> sysml.VerifySatisfactionRequest + 15, // 327: sysml.SysMLService.ValidateInstance:input_type -> sysml.ValidateInstanceRequest + 17, // 328: sysml.SysMLService.EvaluateCalc:input_type -> sysml.EvaluateCalcRequest + 21, // 329: sysml.SysMLService.RunAnalysis:input_type -> sysml.RunAnalysisRequest + 32, // 330: sysml.SysMLService.CheckBehavior:input_type -> sysml.CheckBehaviorRequest + 141, // 331: sysml.SysMLService.RunSweep:input_type -> sysml.RunSweepRequest + 144, // 332: sysml.SysMLService.RunRuns:input_type -> sysml.RunRunsRequest + 149, // 333: sysml.SysMLService.SelfCheck:input_type -> sysml.SelfCheckRequest + 153, // 334: sysml.SysMLService.RecordRun:input_type -> sysml.RecordRunRequest + 40, // 335: sysml.SysMLService.ListEngines:input_type -> sysml.ListEnginesRequest + 133, // 336: sysml.SysMLService.Query:input_type -> sysml.QueryRequest + 50, // 337: sysml.SysMLService.GetElementProperties:input_type -> sysml.GetElementPropertiesRequest + 156, // 338: sysml.SysMLService.RunDocumentQuery:input_type -> sysml.RunDocumentQueryRequest + 174, // 339: sysml.SysMLService.RenderDocument:input_type -> sysml.RenderDocumentRequest + 176, // 340: sysml.SysMLService.RenderView:input_type -> sysml.RenderViewRequest + 189, // 341: sysml.SysMLService.ExportGraphs:input_type -> sysml.ExportGraphsRequest + 191, // 342: sysml.SysMLService.ImportData:input_type -> sysml.ImportDataRequest + 196, // 343: sysml.SysMLService.CompareResults:input_type -> sysml.CompareResultsRequest + 132, // 344: sysml.SysMLService.GetServerInfo:output_type -> sysml.ServerInfoResponse + 47, // 345: sysml.SysMLService.ParseFile:output_type -> sysml.ParseFileResponse + 46, // 346: sysml.SysMLService.ParseSources:output_type -> sysml.ParseSourcesResponse + 49, // 347: sysml.SysMLService.GetSymbol:output_type -> sysml.SymbolResponse + 56, // 348: sysml.SysMLService.GetDiagnostics:output_type -> sysml.DiagnosticsResponse + 58, // 349: sysml.SysMLService.Evaluate:output_type -> sysml.EvaluateResponse + 63, // 350: sysml.SysMLService.Instantiate:output_type -> sysml.InstantiateResponse + 65, // 351: sysml.SysMLService.InstancePaths:output_type -> sysml.InstancePathsResponse + 70, // 352: sysml.SysMLService.ExecuteAction:output_type -> sysml.ExecuteActionResponse + 72, // 353: sysml.SysMLService.ExecuteState:output_type -> sysml.ExecuteStateResponse + 74, // 354: sysml.SysMLService.Convert:output_type -> sysml.ConvertResponse + 77, // 355: sysml.SysMLService.Migrate:output_type -> sysml.MigrateResponse + 101, // 356: sysml.SysMLService.ApplyEdits:output_type -> sysml.ApplyEditsResponse + 9, // 357: sysml.SysMLService.VerifyConstraint:output_type -> sysml.VerifyConstraintResponse + 12, // 358: sysml.SysMLService.VerifyRequirement:output_type -> sysml.VerifyRequirementResponse + 14, // 359: sysml.SysMLService.VerifySatisfaction:output_type -> sysml.VerifySatisfactionResponse + 16, // 360: sysml.SysMLService.ValidateInstance:output_type -> sysml.ValidateInstanceResponse + 18, // 361: sysml.SysMLService.EvaluateCalc:output_type -> sysml.EvaluateCalcResponse + 26, // 362: sysml.SysMLService.RunAnalysis:output_type -> sysml.RunAnalysisResponse + 39, // 363: sysml.SysMLService.CheckBehavior:output_type -> sysml.CheckBehaviorResponse + 143, // 364: sysml.SysMLService.RunSweep:output_type -> sysml.RunSweepResponse + 155, // 365: sysml.SysMLService.RunRuns:output_type -> sysml.RunRunsResponse + 152, // 366: sysml.SysMLService.SelfCheck:output_type -> sysml.SelfCheckResponse + 154, // 367: sysml.SysMLService.RecordRun:output_type -> sysml.RecordRunResponse + 42, // 368: sysml.SysMLService.ListEngines:output_type -> sysml.ListEnginesResponse + 134, // 369: sysml.SysMLService.Query:output_type -> sysml.QueryResponse + 51, // 370: sysml.SysMLService.GetElementProperties:output_type -> sysml.GetElementPropertiesResponse + 166, // 371: sysml.SysMLService.RunDocumentQuery:output_type -> sysml.RunDocumentQueryResponse + 175, // 372: sysml.SysMLService.RenderDocument:output_type -> sysml.RenderDocumentResponse + 177, // 373: sysml.SysMLService.RenderView:output_type -> sysml.RenderViewResponse + 190, // 374: sysml.SysMLService.ExportGraphs:output_type -> sysml.ExportGraphsResponse + 193, // 375: sysml.SysMLService.ImportData:output_type -> sysml.ImportDataResponse + 198, // 376: sysml.SysMLService.CompareResults:output_type -> sysml.CompareResultsResponse + 344, // [344:377] is the sub-list for method output_type + 311, // [311:344] is the sub-list for method input_type + 311, // [311:311] is the sub-list for extension type_name + 311, // [311:311] is the sub-list for extension extendee + 0, // [0:311] is the sub-list for field type_name } func init() { file_sysml_proto_init() } @@ -21348,15 +21562,15 @@ func file_sysml_proto_init() { (*DocumentValue_BigIntValue)(nil), (*DocumentValue_RationalValue)(nil), } - file_sysml_proto_msgTypes[190].OneofWrappers = []any{} - file_sysml_proto_msgTypes[193].OneofWrappers = []any{} + file_sysml_proto_msgTypes[192].OneofWrappers = []any{} + file_sysml_proto_msgTypes[195].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_sysml_proto_rawDesc), len(file_sysml_proto_rawDesc)), NumEnums: 4, - NumMessages: 218, + NumMessages: 220, NumExtensions: 0, NumServices: 1, }, diff --git a/api/proto/sysml.proto b/api/proto/sysml.proto index 20bd9baf32..d9a5c24c89 100644 --- a/api/proto/sysml.proto +++ b/api/proto/sysml.proto @@ -2551,6 +2551,11 @@ message ServerInfoResponse { // and the response carries the document in `asciidoc`. // "render_view" - the RenderView RPC renders a declared view or targeted // pseudo-view as machine-readable diagram data. + // "query_result_view" - RunDocumentQueryRequest.as_view and + // QueryRequest.as_view write the answer as a + // QVTS::QueryResult view in result_view (a failed query's as + // a QueryResultView detail), and RenderView answers such a + // view's header and, for RenderViewRequest.form, a document. // "export_graphs" - the ExportGraphs RPC exports the lowered graph of an // action or state machine as canonical graphs:1 JSON. // "diagnostic_codes" - Diagnostic.code is populated, so an empty code is a @@ -2597,6 +2602,10 @@ message QueryRequest { Query query = 2; // OSLC Query 3.0 parameter text, mutually exclusive with query. string oslc_query = 3; + // Also write the answer as a QVTS::QueryResult view, in result_view; a path or + // model error carries its view as a QueryResultView detail. Under the + // "query_result_view" capability. + bool as_view = 4; } // QueryResponse contains the elements the query selected, in the order they are @@ -2605,6 +2614,10 @@ message QueryRequest { // rather than answering empty. message QueryResponse { repeated QueryResultElement elements = 1; + // The answer as SysML text when the request set as_view, as + // RunDocumentQueryResponse.result_view; its query is the OSLC text, or the + // API query written as `scope=…; select=…; where=…; orderBy=…`. + string result_view = 2; } // Query is the standard's Query resource (SysML v2 API & Services). Its `@type` @@ -3031,6 +3044,10 @@ message RunDocumentQueryRequest { // :`); a path or model error carries a QueryOutcome detail as a // named query's does. Reported as the "inline_document_query" capability. string inline_query = 4; + // Also write the answer as a QVTS::QueryResult view, in result_view; a path or + // model error carries its view as a QueryResultView detail. Under the + // "query_result_view" capability. + bool as_view = 5; } // DocumentQueryBinding binds one entry parameter of a document query. @@ -3215,6 +3232,16 @@ message DocumentQueryRow { message RunDocumentQueryResponse { repeated DocumentQueryColumn columns = 1; repeated DocumentQueryRow rows = 2; + // The answer as SysML text when the request set as_view: a package holding one + // `view : QVTS::QueryResult` that exposes each selected element and states the + // query with its bindings, the source, the outcome and the provenance. + string result_view = 3; +} + +// QueryResultView is a failed query written as a QVTS::QueryResult view, an error +// detail beside QueryOutcome when the request set as_view: it exposes the frontier and finding elements. +message QueryResultView { + string text = 1; } // QueryOutcome is the record behind a document query that could not be run, an error @@ -3326,6 +3353,11 @@ message RenderViewRequest { // owned usage no Layout, nested definition or package keeps a node) or // "ports" (the port usages with the ports nested under them). string compartments = 6; + // A document form to also render a QVTS::QueryResult view in — "markdown", + // "html" or "asciidoc", as RenderDocumentRequest.form — answered in the + // response's field of that name. Fails with INVALID_ARGUMENT for any other + // view. Under the "query_result_view" capability. + string form = 7; } // RenderViewResponse carries all machine-readable fields of the rendering. @@ -3347,6 +3379,19 @@ message RenderViewResponse { repeated string shown = 11; // The view frame round a graph-shaped rendering; unset for a frameless one. RenderFrame frame = 12; + // A QVTS::QueryResult view's query, source, outcome and provenance, in that + // order, above its rows; empty for any other view. + repeated RenderHeaderField header = 13; + // The view as a document in the form the request asked for, the others empty. + string markdown = 14; + string html = 15; + string asciidoc = 16; +} + +// RenderHeaderField is one stated attribute of a QVTS::QueryResult view. +message RenderHeaderField { + string name = 1; + string value = 2; } // RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's diff --git a/client/node/src/generated/sysml_pb.ts b/client/node/src/generated/sysml_pb.ts index 545ee9e5ce..5030b412cc 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("CgtzeXNtbC5wcm90bxIFc3lzbWwiqQMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQSIQoFbm90ZXMYEiADKAsyEi5zeXNtbC5WZXJkaWN0Tm90ZSI6CgtWZXJkaWN0Tm90ZRIMCgRraW5kGAEgASgJEg8KB3N1YmplY3QYAiABKAkSDAoEdGV4dBgDIAEoCSJeChFXaXRuZXNzQXNzaWdubWVudBIPCgdmZWF0dXJlGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUSDAoEdW5pdBgDIAEoCRINCgVleGFjdBgEIAEoCSI1CgVCb3VuZBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgDEg8KB3JlYWNoZWQYAyABKAgisAIKF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCRIfCglhcmd1bWVudHMYBiADKAsyDC5zeXNtbC5WYWx1ZRJLCg9uYW1lZF9hcmd1bWVudHMYByADKAsyMi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpYBChhWZXJpZnlDb25zdHJhaW50UmVzcG9uc2USHwoHdmVyZGljdBgBIAEoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljIrICChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJEh8KCWFyZ3VtZW50cxgGIAMoCzIMLnN5c21sLlZhbHVlEkwKD25hbWVkX2FyZ3VtZW50cxgHIAMoCzIzLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpwBChNWZXJpZmljYXRpb25WZXJkaWN0Eg8KB2Nhc2VfaWQYASABKAkSDAoEa2luZBgCIAEoCRIOCgZkZXRhaWwYAyABKAkSDwoHc3ViY2FzZRgEIAEoCBIWCg5yZXF1aXJlbWVudF9pZBgFIAEoCRITCgtpbnN0YW5jZV9pZBgGIAEoAxIYChBpbnN0YW5jZV90eXBlX2lkGAcgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgivAIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkSFAoMdG9vbF9kcnlfcnVuGAggASgIGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIvQCCgpUb29sRHJ5UnVuEg4KBmFjdGlvbhgBIAEoCRIMCgR0b29sGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSEAoIbWFuaWZlc3QYBCABKAkSEgoKZXhlY3V0YWJsZRgFIAEoCRIQCghwcm90b2NvbBgGIAEoCRIMCgRhcmdzGAcgAygJEgsKA2VudhgIIAMoCRILCgNjd2QYCSABKAkSDQoFc3RkaW4YCiABKAkSEgoKc3RkaW5fZGF0YRgLIAEoCRIpCgppbnB1dF9maWxlGAwgASgLMhUuc3lzbWwuVG9vbERyeVJ1bkZpbGUSEgoKb3V0cHV0X2RpchgNIAEoCBImCgZpbnB1dHMYDiADKAsyFi5zeXNtbC5Ub29sRHJ5UnVuSW5wdXQSKAoHb3V0cHV0cxgPIAMoCzIXLnN5c21sLlRvb2xEcnlSdW5PdXRwdXQSFAoMcmVwbHlfc291cmNlGBAgASgJEg0KBWxpbmVzGBEgAygJIjwKDlRvb2xEcnlSdW5GaWxlEgwKBG5hbWUYASABKAkSDgoGZm9ybWF0GAIgASgJEgwKBGRhdGEYAyABKAkiUwoPVG9vbERyeVJ1bklucHV0EhAKCHZhcmlhYmxlGAEgASgJEhEKCXBhcmFtZXRlchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIMCgR1bml0GAQgASgJIjcKEFRvb2xEcnlSdW5PdXRwdXQSEAoIdmFyaWFibGUYASABKAkSEQoJcGFyYW1ldGVyGAIgASgJIoUEChNSdW5BbmFseXNpc1Jlc3BvbnNlEiIKB291dHB1dHMYASADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAIgAygLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSIAoIb3V0Y29tZXMYCCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAkgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSKgoLZXZhbHVhdGlvbnMYCiADKAsyFS5zeXNtbC5DYXNlRXZhbHVhdGlvbhIOCgZlbmdpbmUYCyABKAkSEAoIc3RyZW5ndGgYDCABKAkSHAoGYm91bmRzGA0gAygLMgwuc3lzbWwuQm91bmQSJwoMdG9vbF9kcnlfcnVuGA4gASgLMhEuc3lzbWwuVG9vbERyeVJ1biIsChBQcm9iYWJpbGl0eVJhbmdlEgsKA21pbhgBIAEoARILCgNtYXgYAiABKAEiywIKB091dGNvbWUSLAoHb3V0cHV0cxgBIAMoCzIbLnN5c21sLk91dGNvbWUuT3V0cHV0c0VudHJ5EhMKC2ZpbmFsX3N0YXRlGAIgASgJEhYKDnN0YXRlc192aXNpdGVkGAMgAygJEg0KBWVycm9yGAQgASgJEhYKDmxpbmVhcml6YXRpb25zGAUgASgFEg8KB3dpdG5lc3MYBiADKAkSJgoLZGlhZ25vc3RpY3MYByADKAsyES5zeXNtbC5EaWFnbm9zdGljEhMKC3Byb2JhYmlsaXR5GAggASgBEjIKEXByb2JhYmlsaXR5X3JhbmdlGAkgASgLMhcuc3lzbWwuUHJvYmFiaWxpdHlSYW5nZRo8CgxPdXRwdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIu4BChFFeHBsb3JhdGlvblN0YXR1cxIQCghjb21wbGV0ZRgBIAEoCBIMCgRydW5zGAIgASgFEhMKC2J1ZGdldHNfaGl0GAMgAygJEhMKC3J1bnNfYnVkZ2V0GAQgASgFEhQKDGRlcHRoX2J1ZGdldBgFIAEoBRIhChlwcm9iYWJpbGl0aWVzX2xvd2VyX2JvdW5kGAYgASgIEh0KFWZhaWxlZF9saW5lYXJpemF0aW9ucxgHIAEoBRIUCgx1bmVudW1lcmF0ZWQYCCADKAkSIQoIY292ZXJhZ2UYCSABKAsyDy5zeXNtbC5Db3ZlcmFnZSJbCghDb3ZlcmFnZRIkCgZzdGF0ZXMYASADKAsyFC5zeXNtbC5Db3ZlcmFnZUVudHJ5EikKC3RyYW5zaXRpb25zGAIgAygLMhQuc3lzbWwuQ292ZXJhZ2VFbnRyeSJACg1Db3ZlcmFnZUVudHJ5EgwKBHBhdGgYASABKAkSEwoLZGVjbGFyYXRpb24YAiABKAkSDAoEcnVucxgDIAEoBSLRAwoUQ2hlY2tCZWhhdmlvclJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIYChBhY3Rpb25fc3ltYm9sX2lkGAIgASgJEh8KF3N0YXRlX21hY2hpbmVfc3ltYm9sX2lkGAMgASgJEjcKBmlucHV0cxgEIAMoCzInLnN5c21sLkNoZWNrQmVoYXZpb3JSZXF1ZXN0LklucHV0c0VudHJ5EhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAkSFgoOY2hlY2tfcHJvcGVydHkYBiADKAkSFQoNY2hlY2tfZGl2ZXJnZRgHIAMoCRITCgtjaGVja19pbnB1dBgIIAMoCRIUCgxjaGVja19hc3N1bWUYCSADKAkSFQoNY2hlY2tfd2l0bmVzcxgKIAEoCBITCgtjaGVja19kZXB0aBgLIAEoBRIUCgxjaGVja19zdGF0ZXMYDCABKAUSFAoMY2hlY2tfdW5yb2xsGA0gASgFEhUKDWNoZWNrX3RpbWVvdXQYDiABKAESDgoGZW5naW5lGA8gASgJGjsKC0lucHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASJ5CgxDaGVja1dpdG5lc3MSEAoIc2NoZWR1bGUYASABKAkSDQoFZHJhd3MYAiADKAkSDwoHY2hvaWNlcxgDIAMoCRIOCgZpbnB1dHMYBCADKAkSEQoJZmlsZV9uYW1lGAUgASgJEhQKDGZpbGVfY29udGVudBgGIAEoCSKXAQoOQ2hlY2tWaW9sYXRpb24SDAoEa2luZBgBIAEoCRIQCghwcm9wZXJ0eRgCIAEoCRINCgVlcnJvchgDIAEoCRINCgVkZXB0aBgEIAEoBRITCgtwcm9iYWJpbGl0eRgFIAEoARIkCgd3aXRuZXNzGAYgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEgwKBHRleHQYByABKAkiSgoTQ2hlY2tEaXZlcmdlbnRWYWx1ZRINCgV2YWx1ZRgBIAEoCRIkCgd3aXRuZXNzGAIgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzIk4KD0NoZWNrRGl2ZXJnZW5jZRIPCgdmZWF0dXJlGAEgASgJEioKBnZhbHVlcxgCIAMoCzIaLnN5c21sLkNoZWNrRGl2ZXJnZW50VmFsdWUioQEKCkNoZWNrRmluYWwSDwoHb3V0Y29tZRgBIAEoCRItCgZ2YWx1ZXMYAiADKAsyHS5zeXNtbC5DaGVja0ZpbmFsLlZhbHVlc0VudHJ5EiQKB3dpdG5lc3MYAyABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLgAQoLQ2hlY2tTZWFyY2gSDgoGc3RhdGVzGAEgASgFEg0KBW1vdmVzGAIgASgFEhEKCW1heF9kZXB0aBgDIAEoBRISCgpib3VuZHNfaGl0GAQgAygJEg8KB2hvcml6b24YBSABKAESEwoLaG9yaXpvbl9zZXQYBiABKAgSFAoMbWFzc19ib3VuZGVkGAcgASgIEg0KBW5vdGVzGAggAygJEg0KBXNjb3BlGAkgAygJEg4KBnN0YXR1cxgKIAEoCRIhCghjb3ZlcmFnZRgLIAEoCzIPLnN5c21sLkNvdmVyYWdlIrsDChVDaGVja0JlaGF2aW9yUmVzcG9uc2USDwoHdmVyZGljdBgBIAEoCRINCgVsaW5lcxgCIAMoCRIiCgZzZWFyY2gYAyABKAsyEi5zeXNtbC5DaGVja1NlYXJjaBIpCgp2aW9sYXRpb25zGAQgAygLMhUuc3lzbWwuQ2hlY2tWaW9sYXRpb24SKwoLZGl2ZXJnZW5jZXMYBSADKAsyFi5zeXNtbC5DaGVja0RpdmVyZ2VuY2USIQoGZmluYWxzGAYgAygLMhEuc3lzbWwuQ2hlY2tGaW5hbBINCgVjbGFpbRgHIAEoCRITCgtmcmVlX2lucHV0cxgIIAMoCRITCgthc3N1bXB0aW9ucxgJIAMoCRIkCgd3aXRuZXNzGAogASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEiUKCGNvbnRyYXN0GAsgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEg4KBmVuZ2luZRgMIAEoCRIQCghzdHJlbmd0aBgNIAEoCRIcCgZib3VuZHMYDiADKAsyDC5zeXNtbC5Cb3VuZBIOCgZyZWFzb24YDyABKAkSDQoFZXJyb3IYESABKAkiIwoSTGlzdEVuZ2luZXNSZXF1ZXN0Eg0KBXByb2JlGAEgASgIIvwBCgpFbmdpbmVJbmZvEgwKBG5hbWUYASABKAkSEQoJYXV0aG9yaXR5GAIgASgJEg8KB2Fuc3dlcnMYAyADKAkSDgoGYm91bmRzGAQgAygJEg8KB3Byb2Nlc3MYBSABKAkSFQoNcHJvY2Vzc19mb3VuZBgGIAEoCRINCgVyZWFkeRgHIAEoCBITCgt1bmF2YWlsYWJsZRgIIAEoCRIMCgRraW5kGAkgASgJEhAKCHByb3RvY29sGAogASgJEg4KBnNvdXJjZRgLIAEoCRIPCgdjb21tYW5kGAwgASgJEg8KB3ZlcnNpb24YDSABKAkSDgoGc2VydmVkGA4gASgIIjkKE0xpc3RFbmdpbmVzUmVzcG9uc2USIgoHZW5naW5lcxgBIAMoCzIRLnN5c21sLkVuZ2luZUluZm8ijAEKEFBhcnNlRmlsZVJlcXVlc3QSEwoJZmlsZV9wYXRoGAEgASgJSAASEQoHY29udGVudBgCIAEoCUgAEhgKDGNvbnRlbnRfaGFzaBgDIAEoCUICGAESEAoIbGFuZ3VhZ2UYBCABKAkSGgoSc3RyaWN0X2NvbmZvcm1hbmNlGAUgASgIQggKBnNvdXJjZSJiCg5Tb3VyY2VEb2N1bWVudBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASEAoIbGFuZ3VhZ2UYAyABKAkSDAoEbmFtZRgEIAEoCUIICgZzb3VyY2UidAoTUGFyc2VTb3VyY2VzUmVxdWVzdBIoCglkb2N1bWVudHMYASADKAsyFS5zeXNtbC5Tb3VyY2VEb2N1bWVudBIaChJzdHJpY3RfY29uZm9ybWFuY2UYAiABKAgSFwoPYmFzZV9tb2RlbF9oYXNoGAMgASgJIpUBChRQYXJzZVNvdXJjZXNSZXNwb25zZRISCgptb2RlbF9oYXNoGAEgASgJEiAKBXJvb3RzGAIgAygLMhEuc3lzbWwuU3ltYm9sSW5mbxImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSDQoFZXJyb3IYBCABKAkSEAoIYWZmZWN0ZWQYBSADKAkifwoRUGFyc2VGaWxlUmVzcG9uc2USEgoKbW9kZWxfaGFzaBgBIAEoCRIfCgRyb290GAIgASgLMhEuc3lzbWwuU3ltYm9sSW5mbxImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSDQoFZXJyb3IYBCABKAkiWgoQR2V0U3ltYm9sUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIfChdpbmNsdWRlX2xpYnJhcnlfbWVtYmVycxgDIAEoCCJCCg5TeW1ib2xSZXNwb25zZRIhCgZzeW1ib2wYASABKAsyES5zeXNtbC5TeW1ib2xJbmZvEg0KBWVycm9yGAIgASgJIlkKG0dldEVsZW1lbnRQcm9wZXJ0aWVzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhIKCmVsZW1lbnRfaWQYAiABKAkSEgoKcHJvcGVydGllcxgDIAMoCSJ9ChxHZXRFbGVtZW50UHJvcGVydGllc1Jlc3BvbnNlEiIKB2VsZW1lbnQYASABKAsyES5zeXNtbC5FbGVtZW50UmVmEioKCnByb3BlcnRpZXMYAiADKAsyFi5zeXNtbC5FbGVtZW50UHJvcGVydHkSDQoFZXJyb3IYAyABKAkiQwoKRWxlbWVudFJlZhIKCgJpZBgBIAEoCRIWCg5xdWFsaWZpZWRfbmFtZRgCIAEoCRIRCgltZXRhY2xhc3MYAyABKAkimAEKD0VsZW1lbnRQcm9wZXJ0eRIMCgRuYW1lGAEgASgJEhYKDmRlZmluaW5nX2NsYXNzGAIgASgJEgwKBG1hbnkYAyABKAgSDwoHZGVyaXZlZBgEIAEoCBIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5FbGVtZW50UHJvcGVydHlWYWx1ZRITCgt1bnN1cHBvcnRlZBgGIAEoCSKwAQoURWxlbWVudFByb3BlcnR5VmFsdWUSJAoHZWxlbWVudBgBIAEoCzIRLnN5c21sLkVsZW1lbnRSZWZIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISAASEwoJaW50X3ZhbHVlGAQgASgDSAASFAoKcmVhbF92YWx1ZRgFIAEoAUgAEhAKBm51bWJlchgGIAEoCUgAQgcKBXZhbHVlIlMKEkRpYWdub3N0aWNzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhQKDGRpc2FibGVfbGludBgCIAMoCRITCgtlbmFibGVfbGludBgDIAMoCSJMChNEaWFnbm9zdGljc1Jlc3BvbnNlEiYKC2RpYWdub3N0aWNzGAEgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgCIAEoCSJvCg9FdmFsdWF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRISCgpleHByZXNzaW9uGAIgASgJEhkKEWNvbnRleHRfc3ltYm9sX2lkGAMgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAQgASgJImcKEEV2YWx1YXRlUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljIuwBCghJbnN0YW5jZRIKCgJpZBgBIAEoAxIWCg50eXBlX3N5bWJvbF9pZBgCIAEoCRI6Cg5mZWF0dXJlX3ZhbHVlcxgEIAMoCzIiLnN5c21sLkluc3RhbmNlLkZlYXR1cmVWYWx1ZXNFbnRyeRIoCgpyZWFjaGVkX2J5GAUgASgLMhQuc3lzbWwuSW5zdGFuY2VSZWFjaBpJChJGZWF0dXJlVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMuc3lzbWwuRmVhdHVyZVZhbHVlOgI4AUoECAMQBFIFc2xvdHMicgoNSW5zdGFuY2VSZWFjaBITCgtpbnN0YW5jZV9pZBgBIAEoAxIUCgxmZWF0dXJlX25hbWUYAiABKAkSGQoRZmVhdHVyZV9zeW1ib2xfaWQYAyABKAkSDQoFaW5kZXgYBCABKAUSDAoEcGF0aBgFIAEoCSKdAQoMRmVhdHVyZVZhbHVlEhQKDGZlYXR1cmVfbmFtZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEhwKBnZhbHVlcxgDIAMoCzIMLnN5c21sLlZhbHVlEhQKDG1hdGVyaWFsaXplZBgEIAEoCBINCgVlcnJvchgFIAEoCRIXCg9vcmRlcl9kZXBlbmRlbnQYBiABKAUiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIlEKFEluc3RhbmNlUGF0aHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSJQoGb2JqZWN0GAIgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QihQEKFUluc3RhbmNlUGF0aHNSZXNwb25zZRIiCgVwYXRocxgBIAMoCzITLnN5c21sLkluc3RhbmNlUGF0aBIRCgl0cnVuY2F0ZWQYAiABKAgSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljImcKDEluc3RhbmNlUGF0aBIhCgRyb290GAEgASgLMhMuc3lzbWwuSW5zdGFuY2VSb290EgwKBHBhdGgYAiABKAkSJgoFc3RlcHMYAyADKAsyFy5zeXNtbC5JbnN0YW5jZVBhdGhTdGVwIjYKDEluc3RhbmNlUm9vdBITCgtpbnN0YW5jZV9pZBgBIAEoAxIRCglzeW1ib2xfaWQYAiABKAkiZwoQSW5zdGFuY2VQYXRoU3RlcBIUCgxmZWF0dXJlX25hbWUYASABKAkSGQoRZmVhdHVyZV9zeW1ib2xfaWQYAiABKAkSDQoFaW5kZXgYAyABKAUSEwoLaW5zdGFuY2VfaWQYBCABKAMi6QIKFEV4ZWN1dGVBY3Rpb25SZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGAoQYWN0aW9uX3N5bWJvbF9pZBgCIAEoCRI3CgZpbnB1dHMYAyADKAsyJy5zeXNtbC5FeGVjdXRlQWN0aW9uUmVxdWVzdC5JbnB1dHNFbnRyeRIQCghzY2hlZHVsZRgEIAEoCRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhQKB2FkdmFuY2UYBiABKAFIAIgBARIRCgRzZWVkGAcgASgESAGIAQESDQoFZHJhd3MYCCABKAkSEgoKY2xvY2tfc3RlcBgJIAEoARINCgV0cmFjZRgKIAEoCBIOCgZldmVudHMYCyADKAkaOwoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBQgoKCF9hZHZhbmNlQgcKBV9zZWVkIooFChVFeGVjdXRlQWN0aW9uUmVzcG9uc2USOgoHb3V0cHV0cxgBIAMoCzIpLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PdXRwdXRzRW50cnkSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiAKCG91dGNvbWVzGAQgAygLMg4uc3lzbWwuT3V0Y29tZRItCgtleHBsb3JhdGlvbhgFIAEoCzIYLnN5c21sLkV4cGxvcmF0aW9uU3RhdHVzEhIKCmZpbmFsX3RpbWUYBiABKAESUwoUcGVyZm9ybWVyX2F0dHJpYnV0ZXMYByADKAsyNS5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2UuUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EkkKD29yZGVyX2RlcGVuZGVudBgIIAMoCzIwLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5EiMKBXRyYWNlGAkgAygLMhQuc3lzbWwuRG9jdW1lbnRFdmVudBIVCg10cmFjZV9kcm9wcGVkGAogASgFGjwKDE91dHB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaSAoYUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEi+QEKE0V4ZWN1dGVTdGF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIfChdzdGF0ZV9tYWNoaW5lX3N5bWJvbF9pZBgCIAEoCRIOCgZldmVudHMYAyADKAkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRINCgV0cmFjZRgGIAEoCBIUCgdhZHZhbmNlGAcgASgBSACIAQESEQoEc2VlZBgIIAEoBEgBiAEBEg0KBWRyYXdzGAkgASgJEhIKCmNsb2NrX3N0ZXAYCiABKAFCCgoIX2FkdmFuY2VCBwoFX3NlZWQikAQKFEV4ZWN1dGVTdGF0ZVJlc3BvbnNlEhYKDnN0YXRlc192aXNpdGVkGAEgAygJEkQKDWZpbmFsX2NvbnRleHQYAiADKAsyLS5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5GaW5hbENvbnRleHRFbnRyeRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBSADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAYgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgHIAEoARIjCgV0cmFjZRgIIAMoCzIULnN5c21sLkRvY3VtZW50RXZlbnQSFQoNdHJhY2VfZHJvcHBlZBgJIAEoBRJICg9vcmRlcl9kZXBlbmRlbnQYCiADKAsyLy5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5GkEKEUZpbmFsQ29udGV4dEVudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEiwwIKDkNvbnZlcnRSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIUCgptb2RlbF9oYXNoGAYgASgJSAASEwoLZnJvbV9mb3JtYXQYAyABKAkSEQoJdG9fZm9ybWF0GAQgASgJEh4KFnRvbGVyYXRlX3N5bnRheF9lcnJvcnMYBSABKAgSDwoHaWRfZm9ybRgHIAEoCRIRCglkb2N1bWVudHMYCCADKAkSDwoHY29tcGFjdBgJIAEoCBIUCgxvbWl0X2Rlcml2ZWQYCiABKAgSFAoMa2VlcF9kZXJpdmVkGAsgAygJEiEKGWluY2x1ZGVfY2hlY2tfZGlhZ25vc3RpY3MYDCABKAgSHQoVaW5jbHVkZV9saWJyYXJ5X3N0dWJzGA0gASgIQggKBnNvdXJjZSLpAQoPQ29udmVydFJlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSEwoLZnJvbV9mb3JtYXQYAiABKAkSEQoJdG9fZm9ybWF0GAMgASgJEg0KBWVycm9yGAQgASgJEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIUCgxleHBlcmltZW50YWwYBiABKAgSGwoTZXhwZXJpbWVudGFsX25vdGljZRgHIAEoCRIzChJsaWJyYXJ5X3JlZmVyZW5jZXMYCCADKAsyFy5zeXNtbC5MaWJyYXJ5UmVmZXJlbmNlIloKEExpYnJhcnlSZWZlcmVuY2USCgoCaWQYASABKAkSFgoOcXVhbGlmaWVkX25hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIUCgxsaWJyYXJ5X3BhdGgYBCABKAki7gEKDk1pZ3JhdGVSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAxIABITCgtmcm9tX2Zvcm1hdBgDIAEoCRIRCgl0b19mb3JtYXQYBCABKAkSDgoGcmVwb3J0GAUgASgIEg8KB3Jlc3VsdHMYBiABKAgSFQoLbGF5b3V0X3BhdGgYByABKAlIARIYCg5sYXlvdXRfY29udGVudBgIIAEoCUgBEhYKDmltYWdlX2Jhc2VfdXJsGAkgASgJEg4KBnN0cmljdBgKIAEoCEIICgZzb3VyY2VCCAoGbGF5b3V0IuoBCg9NaWdyYXRlUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRITCgtmcm9tX2Zvcm1hdBgCIAEoCRIRCgl0b19mb3JtYXQYAyABKAkSDQoFZXJyb3IYBCABKAkSFAoMZXhwZXJpbWVudGFsGAUgASgIEhsKE2V4cGVyaW1lbnRhbF9ub3RpY2UYBiABKAkSJgoGcmVwb3J0GAcgASgLMhYuc3lzbWwuTWlncmF0aW9uUmVwb3J0Eg8KB3Jlc3VsdHMYCCABKAkSIwoFZmlsZXMYCSADKAsyFC5zeXNtbC5NaWdyYXRpb25GaWxlIsMBCg9NaWdyYXRpb25SZXBvcnQSDgoGc291cmNlGAEgASgJEhAKCGV4cG9ydGVyGAIgASgJEg8KB3N1bW1hcnkYAyABKAkSDgoGbWFwcGVkGAQgASgFEhQKDGFwcHJveGltYXRlZBgFIAEoBRIQCgh1bm1hcHBlZBgGIAEoBRIPCgdza2lwcGVkGAcgASgFEiYKB2VudHJpZXMYCCADKAsyFS5zeXNtbC5NaWdyYXRpb25FbnRyeRIMCgR0ZXh0GAkgASgJImcKDk1pZ3JhdGlvbkVudHJ5EgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSDwoHdmVyZGljdBgFIAEoCRIMCgRub3RlGAYgASgJIi4KDU1pZ3JhdGlvbkZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIn0KEUFwcGx5RWRpdHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSKAoKb3BlcmF0aW9ucxgCIAMoCzIULnN5c21sLkVkaXRPcGVyYXRpb24SEAoIZG9jdW1lbnQYAyABKAkSGAoQYWNjZXB0X2RvY3VtZW50cxgEIAEoCCLDBgoNRWRpdE9wZXJhdGlvbhIoCglzZXRfdmFsdWUYASABKAsyEy5zeXNtbC5TZXRWYWx1ZUVkaXRIABIjCgZyZW5hbWUYAiABKAsyES5zeXNtbC5SZW5hbWVFZGl0SAASKgoKYWRkX21lbWJlchgDIAEoCzIULnN5c21sLkFkZE1lbWJlckVkaXRIABIjCgZkZWxldGUYBCABKAsyES5zeXNtbC5EZWxldGVFZGl0SAASHwoEbW92ZRgFIAEoCzIPLnN5c21sLk1vdmVFZGl0SAASMgoOYWRkX2Nvbm5lY3Rpb24YBiABKAsyGC5zeXNtbC5BZGRDb25uZWN0aW9uRWRpdEgAEiwKC2FkZF9zYXRpc2Z5GAcgASgLMhUuc3lzbWwuQWRkU2F0aXNmeUVkaXRIABJJChphZGRfcmVxdWlyZW1lbnRfY29uc3RyYWludBgIIAEoCzIjLnN5c21sLkFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXRIABIyCg5hZGRfdHJhbnNpdGlvbhgJIAEoCzIYLnN5c21sLkFkZFRyYW5zaXRpb25FZGl0SAASKgoKYWRkX2ltcG9ydBgKIAEoCzIULnN5c21sLkFkZEltcG9ydEVkaXRIABI4ChFhZGRfZG9jdW1lbnRhdGlvbhgLIAEoCzIbLnN5c21sLkFkZERvY3VtZW50YXRpb25FZGl0SAASKgoKYWRkX3ZlcmlmeRgMIAEoCzIULnN5c21sLkFkZFZlcmlmeUVkaXRIABIuCgxhZGRfbWV0YWRhdGEYDSABKAsyFi5zeXNtbC5BZGRNZXRhZGF0YUVkaXRIABIuCgxhZGRfc2VxdWVuY2UYDiABKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXRIABI7ChNhZGRfbWV0YWRhdGFfcHJlZml4GA8gASgLMhwuc3lzbWwuQWRkTWV0YWRhdGFQcmVmaXhFZGl0SAASLAoLYWRkX2NvbW1lbnQYECABKAsyFS5zeXNtbC5BZGRDb21tZW50RWRpdEgAEiYKCGFkZF9ub3RlGBIgASgLMhIuc3lzbWwuQWRkTm90ZUVkaXRIAEILCglvcGVyYXRpb24ikgIKDUFkZE1lbWJlckVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEgwKBHR5cGUYBCABKAkSFAoMbXVsdGlwbGljaXR5GAUgASgJEg0KBXZhbHVlGAYgASgJEhMKC3NwZWNpYWxpemVzGAcgAygJEhMKC2lzX2Fic3RyYWN0GAggASgIEhEKCXJlZGVmaW5lcxgJIAMoCRISCgppc19kZWZhdWx0GAogASgIEhEKCWRpcmVjdGlvbhgLIAEoCRIZChFtZXRhZGF0YV9wcmVmaXhlcxgOIAMoCRILCgNkb2MYDCABKAkSFwoPYm9keV9leHByZXNzaW9uGA0gASgJInkKDkFkZFNhdGlzZnlFZGl0Eg0KBW93bmVyGAEgASgJEhMKC3JlcXVpcmVtZW50GAIgASgJEhoKEnNhdGlzZnlpbmdfZmVhdHVyZRgDIAEoCRITCgtpc19hc3NlcnRlZBgEIAEoCBISCgppc19uZWdhdGVkGAUgASgIIl0KHEFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRISCgpleHByZXNzaW9uGAMgASgJEgwKBG5hbWUYBCABKAkikQEKEUFkZFRyYW5zaXRpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBG5hbWUYAiABKAkSDgoGc291cmNlGAMgASgJEg4KBnRhcmdldBgEIAEoCRIPCgd0cmlnZ2VyGAUgASgJEg0KBWd1YXJkGAYgASgJEg4KBmVmZmVjdBgHIAEoCRIPCgdpbml0aWFsGAggASgIIjMKDUFkZFZlcmlmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkiNgoUTWV0YWRhdGFGZWF0dXJlVmFsdWUSDwoHZmVhdHVyZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKUAQoPQWRkTWV0YWRhdGFFZGl0Eg0KBW93bmVyGAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5NZXRhZGF0YUZlYXR1cmVWYWx1ZRIRCglzaG9ydGhhbmQYBiABKAgiPgoVQWRkTWV0YWRhdGFQcmVmaXhFZGl0Eg4KBnRhcmdldBgBIAEoCRIVCg1tZXRhZGF0YV90eXBlGAIgASgJIoABCg1BZGRJbXBvcnRFZGl0Eg0KBW93bmVyGAEgASgJEhIKCnZpc2liaWxpdHkYAiABKAkSDgoGdGFyZ2V0GAMgASgJEhQKDGlzX3JlY3Vyc2l2ZRgEIAEoCBIVCg1pc19pbXBvcnRfYWxsGAUgASgIEg8KB2ZpbHRlcnMYBiADKAkiYwoUQWRkRG9jdW1lbnRhdGlvbkVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZsb2NhbGUYBCABKAkSDwoHcmVwbGFjZRgFIAEoCCJaCg5BZGRDb21tZW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRib2R5GAIgASgJEgwKBG5hbWUYAyABKAkSDQoFYWJvdXQYBCADKAkSDgoGbG9jYWxlGAUgASgJIisKC0FkZE5vdGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIMCgR0ZXh0GAIgASgJIs0CCg9BZGRTZXF1ZW5jZUVkaXQSDQoFb3duZXIYASABKAkSDwoHa2V5d29yZBgCIAEoCRILCgNyZWYYAyABKAkSEwoLbWVtYmVyX2tpbmQYBCABKAkSEwoLbWVtYmVyX25hbWUYBSABKAkSDAoEdHlwZRgGIAEoCRINCgVhZnRlchgHIAEoCRIRCgljb25kaXRpb24YCCABKAkSDQoFdmFsdWUYCSABKAkSDgoGdGFyZ2V0GAogASgJEgsKA3ZpYRgLIAEoCRINCgV1bnRpbBgMIAEoCRIkCgRib2R5GA0gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EikKCWVsc2VfYm9keRgOIAMoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdBIUCgxtdWx0aXBsaWNpdHkYDyABKAkSEQoJcGFyYW1ldGVyGBAgASgJIm4KEUFkZENvbm5lY3Rpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBGtpbmQYAiABKAkSEAoIZnJvbV9lbmQYAyABKAkSDgoGdG9fZW5kGAQgASgJEgwKBG5hbWUYBSABKAkSDAoEdHlwZRgGIAEoCSItCgpEZWxldGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIPCgdjYXNjYWRlGAIgASgIIikKCE1vdmVFZGl0Eg4KBnRhcmdldBgBIAEoCRINCgVvd25lchgCIAEoCSItCgxTZXRWYWx1ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBXZhbHVlGAIgASgJIi4KClJlbmFtZUVkaXQSDgoGdGFyZ2V0GAEgASgJEhAKCG5ld19uYW1lGAIgASgJIpACChJBcHBseUVkaXRzUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRIjCgdhcHBsaWVkGAIgAygLMhIuc3lzbWwuQXBwbGllZEVkaXQSDQoFZXJyb3IYAyABKAkSIwoHZmFpbHVyZRgEIAEoDjISLnN5c21sLkVkaXRGYWlsdXJlEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIaChJyZWZlcnJpbmdfZWxlbWVudHMYBiADKAkSKAoJZG9jdW1lbnRzGAcgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSIgoJcmVmZXJyZXJzGAggAygLMg8uc3lzbWwuUmVmZXJyZXIiLwoORWRpdGVkRG9jdW1lbnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJIioKCFJlZmVycmVyEgwKBG5hbWUYASABKAkSEAoIZG9jdW1lbnQYAiABKAkijAEKC0FwcGxpZWRFZGl0EhcKD29wZXJhdGlvbl9pbmRleBgBIAEoBRIOCgZ0YXJnZXQYAiABKAkSDgoGb2Zmc2V0GAMgASgFEg4KBmxlbmd0aBgEIAEoBRIQCghvbGRfdGV4dBgFIAEoCRIQCghuZXdfdGV4dBgGIAEoCRIQCghkb2N1bWVudBgHIAEoCSLDAwoKU3ltYm9sSW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSMQoIbWV0YWRhdGEYBCADKAsyHy5zeXNtbC5TeW1ib2xJbmZvLk1ldGFkYXRhRW50cnkSEQoJY2hpbGRfaWRzGAUgAygJEigKCmF0dHJpYnV0ZXMYBiADKAsyFC5zeXNtbC5BdHRyaWJ1dGVJbmZvEiIKCXR5cGVfaW5mbxgHIAEoCzIPLnN5c21sLlR5cGVJbmZvEi0KDG11bHRpcGxpY2l0eRgIIAEoCzIXLnN5c21sLk11bHRpcGxpY2l0eUluZm8SLgoPc3BlY2lhbGl6YXRpb25zGAkgAygLMhUuc3lzbWwuU3BlY2lhbGl6YXRpb24SIwobd2l0aGhlbGRfbGlicmFyeV9hdHRyaWJ1dGVzGAogASgFEiIKB21lbWJlcnMYCyADKAsyES5zeXNtbC5NZW1iZXJJbmZvEiAKGHdpdGhoZWxkX2xpYnJhcnlfbWVtYmVycxgMIAEoBRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicAoKTWVtYmVySW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSEQoJaW5oZXJpdGVkGAQgASgIEhYKDmluaGVyaXRlZF9mcm9tGAUgASgJEg8KB2xpYnJhcnkYBiABKAgiWAoOU3BlY2lhbGl6YXRpb24SDAoEa2luZBgBIAEoCRIQCghkZWNsYXJlZBgCIAEoCRIRCgl0YXJnZXRfaWQYAyABKAkSEwoLdGFyZ2V0X2tpbmQYBCABKAkitAEKCFR5cGVJbmZvEhAKCGRlY2xhcmVkGAEgASgJEhMKC3Jlc29sdmVkX2lkGAIgASgJEhUKDXJlc29sdmVkX2tpbmQYAyABKAkSEQoJcHJpbWl0aXZlGAQgASgJEhgKEHByaW1pdGl2ZV9zb3VyY2UYBSABKAkSEAoIcXVhbnRpdHkYBiABKAgSDAoEdW5pdBgHIAEoCRIdCgV0eXBlcxgIIAMoCzIOLnN5c21sLlR5cGVSZWYiIwoHVHlwZVJlZhIKCgJpZBgBIAEoCRIMCgRraW5kGAIgASgJIjAKEE11bHRpcGxpY2l0eUluZm8SDQoFbG93ZXIYASABKAkSDQoFdXBwZXIYAiABKAkiVgoNQXR0cmlidXRlSW5mbxIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkSGwoFdmFsdWUYAyABKAsyDC5zeXNtbC5WYWx1ZRIMCgR1bml0GAQgASgJIocGCgVWYWx1ZRITCglpbnRfdmFsdWUYASABKANIABIUCgpyZWFsX3ZhbHVlGAIgASgBSAASFAoKYm9vbF92YWx1ZRgDIAEoCEgAEhYKDHN0cmluZ192YWx1ZRgEIAEoCUgAEhUKC2luc3RhbmNlX2lkGAUgASgDSAASKAoIc2VxdWVuY2UYBiABKAsyFC5zeXNtbC5WYWx1ZVNlcXVlbmNlSAASDgoEbnVsbBgHIAEoCUgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIqCgxlbnVtX2xpdGVyYWwYCSABKAsyEi5zeXNtbC5FbnVtTGl0ZXJhbEgAEg8KBXVuc2V0GAogASgISAASIQoHY29tcGxleBgLIAEoCzIOLnN5c21sLkNvbXBsZXhIABIdCgVhcnJheRgMIAEoCzIMLnN5c21sLkFycmF5SAASHwoGdmVjdG9yGA0gASgLMg0uc3lzbWwuVmVjdG9ySAASMAoPdmVjdG9yX3F1YW50aXR5GA4gASgLMhUuc3lzbWwuVmVjdG9yUXVhbnRpdHlIABIwCg9tZWFzdXJlbWVudF9yZWYYDyABKAsyFS5zeXNtbC5NZWFzdXJlbWVudFJlZkgAEhIKCGluZmluaXR5GBAgASgISAASIwoIZnVuY3Rpb24YESABKAsyDy5zeXNtbC5GdW5jdGlvbkgAEh4KA3NldBgSIAEoCzIPLnN5c21sLlZhbHVlU2V0SAASMAoPdGVuc29yX3F1YW50aXR5GBMgASgLMhUuc3lzbWwuVGVuc29yUXVhbnRpdHlIABInCgptZXRhb2JqZWN0GBQgASgLMhEuc3lzbWwuTWV0YW9iamVjdEgAEisKDHVuZGV0ZXJtaW5lZBgVIAEoCzITLnN5c21sLlVuZGV0ZXJtaW5lZEgAEhcKDWJpZ19pbnRfdmFsdWUYFiABKAlIABIpCg5yYXRpb25hbF92YWx1ZRgXIAEoCzIPLnN5c21sLlJhdGlvbmFsSABCBgoEa2luZCIyCghSYXRpb25hbBIRCgludW1lcmF0b3IYASABKAkSEwoLZGVub21pbmF0b3IYAiABKAkiNgoKTWV0YW9iamVjdBISCgplbGVtZW50X2lkGAEgASgJEhQKDG1ldGFjbGFzc19pZBgCIAEoCSJGCgxVbmRldGVybWluZWQSDgoGcmVhc29uGAEgASgJEiYKBWNvdW50GAIgASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbyIsCghGdW5jdGlvbhIPCgdjYWxjX2lkGAEgASgJEg8KB3NlbGZfaWQYAiABKAMiKgoIVmFsdWVTZXQSHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSJJCg5UZW5zb3JRdWFudGl0eRISCgpkaW1lbnNpb25zGAEgAygDEiMKCmNvbXBvbmVudHMYAiADKAsyDy5zeXNtbC5RdWFudGl0eSI7CgVBcnJheRISCgpkaW1lbnNpb25zGAEgAygDEh4KCGVsZW1lbnRzGAIgAygLMgwuc3lzbWwuVmFsdWUiKgoGVmVjdG9yEiAKCmNvbXBvbmVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSI1Cg5WZWN0b3JRdWFudGl0eRIjCgpjb21wb25lbnRzGAEgAygLMg8uc3lzbWwuUXVhbnRpdHkiKgoHQ29tcGxleBIMCgRyZWFsGAEgASgBEhEKCWltYWdpbmFyeRgCIAEoASJkCgtFbnVtTGl0ZXJhbBISCgpsaXRlcmFsX2lkGAEgASgJEhYKDmVudW1lcmF0aW9uX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSGwoFdmFsdWUYBCABKAsyDC5zeXNtbC5WYWx1ZSIvCg1WYWx1ZVNlcXVlbmNlEh4KCGVsZW1lbnRzGAEgAygLMgwuc3lzbWwuVmFsdWUiyAEKCFF1YW50aXR5EhcKDWludF9tYWduaXR1ZGUYASABKANIABIYCg5yZWFsX21hZ25pdHVkZRgCIAEoAUgAEhsKEWJpZ19pbnRfbWFnbml0dWRlGAUgASgJSAASLQoScmF0aW9uYWxfbWFnbml0dWRlGAYgASgLMg8uc3lzbWwuUmF0aW9uYWxIABIMCgR1bml0GAMgASgJEiIKCXVuaXRfdGVybRgEIAEoCzIPLnN5c21sLlVuaXRUZXJtQgsKCW1hZ25pdHVkZSJTCg5NZWFzdXJlbWVudFJlZhIMCgR1bml0GAEgASgJEiIKCXVuaXRfdGVybRgCIAEoCzIPLnN5c21sLlVuaXRUZXJtEg8KB3VuaXRfaWQYAyABKAkiVAoIVW5pdFRlcm0SEQoJc2NhbGVfbnVtGAEgASgBEhEKCXNjYWxlX2RlbhgCIAEoARIiCgdmYWN0b3JzGAMgAygLMhEuc3lzbWwuVW5pdEZhY3RvciIvCgpVbml0RmFjdG9yEg8KB3VuaXRfaWQYASABKAkSEAoIZXhwb25lbnQYAiABKAEihgEKCkRpYWdub3N0aWMSEAoIc2V2ZXJpdHkYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIZCgRzcGFuGAMgASgLMgsuc3lzbWwuU3BhbhIMCgRjb2RlGAQgASgJEhcKD29yZGVyX2RlcGVuZGVudBgFIAMoCRITCgtpbmRlcGVuZGVudBgGIAEoCCJeCgRTcGFuEgwKBGZpbGUYASABKAkSEgoKc3RhcnRfbGluZRgCIAEoBRIRCglzdGFydF9jb2wYAyABKAUSEAoIZW5kX2xpbmUYBCABKAUSDwoHZW5kX2NvbBgFIAEoBSITChFTZXJ2ZXJJbmZvUmVxdWVzdCI7ChJTZXJ2ZXJJbmZvUmVzcG9uc2USDwoHdmVyc2lvbhgBIAEoCRIUCgxjYXBhYmlsaXRpZXMYAiADKAkiUwoMUXVlcnlSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGwoFcXVlcnkYAiABKAsyDC5zeXNtbC5RdWVyeRISCgpvc2xjX3F1ZXJ5GAMgASgJIjwKDVF1ZXJ5UmVzcG9uc2USKwoIZWxlbWVudHMYASADKAsyGS5zeXNtbC5RdWVyeVJlc3VsdEVsZW1lbnQiWgoFUXVlcnkSDQoFc2NvcGUYASADKAkSDgoGc2VsZWN0GAIgAygJEiAKBXdoZXJlGAMgASgLMhEuc3lzbWwuQ29uc3RyYWludBIQCghvcmRlcl9ieRgEIAMoCSJ8CgpDb25zdHJhaW50Ei8KCXByaW1pdGl2ZRgBIAEoCzIaLnN5c21sLlByaW1pdGl2ZUNvbnN0cmFpbnRIABIvCgljb21wb3NpdGUYAiABKAsyGi5zeXNtbC5Db21wb3NpdGVDb25zdHJhaW50SABCDAoKY29uc3RyYWludCJzChNQcmltaXRpdmVDb25zdHJhaW50Eg8KB2ludmVyc2UYASABKAgSEAoIcHJvcGVydHkYAiABKAkSKgoIb3BlcmF0b3IYAyABKA4yGC5zeXNtbC5QcmltaXRpdmVPcGVyYXRvchINCgV2YWx1ZRgEIAMoCSJoChNDb21wb3NpdGVDb25zdHJhaW50EioKCG9wZXJhdG9yGAEgASgOMhguc3lzbWwuQ29tcG9zaXRlT3BlcmF0b3ISJQoKY29uc3RyYWludBgCIAMoCzIRLnN5c21sLkNvbnN0cmFpbnQirgEKElF1ZXJ5UmVzdWx0RWxlbWVudBIKCgJpZBgBIAEoCRIMCgR0eXBlGAIgASgJEj0KCnByb3BlcnRpZXMYAyADKAsyKS5zeXNtbC5RdWVyeVJlc3VsdEVsZW1lbnQuUHJvcGVydGllc0VudHJ5EgwKBHBhdGgYBCABKAkaMQoPUHJvcGVydGllc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicwoKU3dlZXBSYW5nZRIRCglwYXJhbWV0ZXIYASABKAkSGwoFc3RhcnQYAiABKAsyDC5zeXNtbC5WYWx1ZRIZCgNlbmQYAyABKAsyDC5zeXNtbC5WYWx1ZRIaCgRzdGVwGAQgASgLMgwuc3lzbWwuVmFsdWUi0AIKD1J1blN3ZWVwUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJDCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyKi5zeXNtbC5SdW5Td2VlcFJlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIhCgZyYW5nZXMYBiADKAsyES5zeXNtbC5Td2VlcFJhbmdlEg8KB3NhbXBsZXMYByABKAMSDAoEc2VlZBgIIAEoBBIOCgZlbmdpbmUYCSABKAkaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEi9AEKCFN3ZWVwUm93EiEKBmlucHV0cxgBIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYAyADKAsyDi5zeXNtbC5WZXJkaWN0EhYKDmVsYXBzZWRfbWljcm9zGAQgASgDEg0KBWVycm9yGAUgASgJEiwKDmZhaWx1cmVfcmVhc29uGAYgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIqCgtldmFsdWF0aW9ucxgHIAMoCzIVLnN5c21sLkNhc2VFdmFsdWF0aW9uIq0CChBSdW5Td2VlcFJlc3BvbnNlEh0KBHJvd3MYASADKAsyDy5zeXNtbC5Td2VlcFJvdxISCgpwYXJhbWV0ZXJzGAIgAygJEg8KB3NhbXBsZWQYAyABKAgSDAoEc2VlZBgEIAEoBBINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YByABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiIKCWluc3RhbmNlcxgIIAMoCzIPLnN5c21sLkluc3RhbmNlEg4KBmVuZ2luZRgJIAEoCRIQCghzdHJlbmd0aBgKIAEoCRIcCgZib3VuZHMYCyADKAsyDC5zeXNtbC5Cb3VuZCKaBAoOUnVuUnVuc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIYChBhY3Rpb25fc3ltYm9sX2lkGAIgASgJEhoKEmFuYWx5c2lzX3N5bWJvbF9pZBgDIAEoCRIxCgZpbnB1dHMYBCADKAsyIS5zeXNtbC5SdW5SdW5zUmVxdWVzdC5JbnB1dHNFbnRyeRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAYgASgJEh8KCWFyZ3VtZW50cxgHIAMoCzIMLnN5c21sLlZhbHVlEkIKD25hbWVkX2FyZ3VtZW50cxgIIAMoCzIpLnN5c21sLlJ1blJ1bnNSZXF1ZXN0Lk5hbWVkQXJndW1lbnRzRW50cnkSDAoEcnVucxgJIAEoAxIRCgRzZWVkGAogASgESACIAQESDQoFZHJhd3MYCyABKAkSEgoKY2xvY2tfc3RlcBgMIAEoARIPCgdvYnNlcnZlGA0gAygJEg4KBmVuZ2luZRgOIAEoCRo7CgtJbnB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAFCBwoFX3NlZWQisAIKD1J1bkRpc3RyaWJ1dGlvbhIMCgRuYW1lGAEgASgJEgwKBHVuaXQYAiABKAkSDQoFY291bnQYAyABKAMSDwoHbnVtZXJpYxgEIAEoCBIZCgNtaW4YBSABKAsyDC5zeXNtbC5WYWx1ZRIZCgNtYXgYBiABKAsyDC5zeXNtbC5WYWx1ZRIaCgRtZWFuGAcgASgLMgwuc3lzbWwuVmFsdWUSEQoJZGV2aWF0aW9uGAggASgBEikKC3BlcmNlbnRpbGVzGAkgAygLMhQuc3lzbWwuUnVuUGVyY2VudGlsZRIpCgloaXN0b2dyYW0YCiADKAsyFi5zeXNtbC5SdW5IaXN0b2dyYW1CaW4SJgoGdmFsdWVzGAsgAygLMhYuc3lzbWwuUnVuQ291bnRlZFZhbHVlIkAKDVJ1blBlcmNlbnRpbGUSEgoKcGVyY2VudGlsZRgBIAEoARIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlIlcKD1J1bkhpc3RvZ3JhbUJpbhIZCgNsb3cYASABKAsyDC5zeXNtbC5WYWx1ZRIaCgRoaWdoGAIgASgLMgwuc3lzbWwuVmFsdWUSDQoFY291bnQYAyABKAMiPQoPUnVuQ291bnRlZFZhbHVlEhsKBXZhbHVlGAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFY291bnQYAiABKAMiQgoQU2VsZkNoZWNrUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhoKEnNlbGZfY2hlY2tfcGFja2FnZRgCIAMoCSKJAQoQU2VsZkNoZWNrRmluZGluZxIOCgZzdGF0dXMYASABKAkSDwoHc3ViamVjdBgCIAEoCRIQCghsb2NhdGlvbhgDIAEoCRISCgpjb25zdHJhaW50GAQgASgJEg8KB2VsZW1lbnQYBSABKAkSDwoHbWVzc2FnZRgGIAEoCRIMCgRsaW5lGAcgASgJIjkKFFNlbGZDaGVja0FwcGxpY2F0aW9uEhIKCmNvbnN0cmFpbnQYASABKAkSDQoFY291bnQYAiABKAMirwIKEVNlbGZDaGVja1Jlc3BvbnNlEg4KBnN0YXR1cxgBIAEoCRIpCghmaW5kaW5ncxgCIAMoCzIXLnN5c21sLlNlbGZDaGVja0ZpbmRpbmcSEAoIZWxlbWVudHMYAyABKAMSDgoGY2hlY2tzGAQgASgDEhIKCnZpb2xhdGlvbnMYBSABKAMSEwoLdW5ldmFsdWF0ZWQYBiABKAMSGQoRZXZhbHVhdGlvbl9lcnJvcnMYByABKAMSMQoMYXBwbGljYXRpb25zGAggAygLMhsuc3lzbWwuU2VsZkNoZWNrQXBwbGljYXRpb24SDwoHc3VtbWFyeRgJIAEoCRINCgVlcnJvchgKIAEoCRImCgtkaWFnbm9zdGljcxgLIAMoCzIRLnN5c21sLkRpYWdub3N0aWMilQMKEFJlY29yZFJ1blJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIaChJhbmFseXNpc19zeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSHwoJYXJndW1lbnRzGAQgAygLMgwuc3lzbWwuVmFsdWUSRAoPbmFtZWRfYXJndW1lbnRzGAUgAygLMisuc3lzbWwuUmVjb3JkUnVuUmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5Eg4KBmVuZ2luZRgGIAEoCRITCgtyZWNvcmRfaW50bxgHIAEoCRIhCgZyYW5nZXMYCCADKAsyES5zeXNtbC5Td2VlcFJhbmdlEgwKBHJ1bnMYCSABKAMSEQoEc2VlZBgKIAEoBEgAiAEBEhgKEGFjY2VwdF9kb2N1bWVudHMYCyABKAgaQwoTTmFtZWRBcmd1bWVudHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAFCBwoFX3NlZWQiqAMKEVJlY29yZFJ1blJlc3BvbnNlEicKA3J1bhgBIAEoCzIaLnN5c21sLlJ1bkFuYWx5c2lzUmVzcG9uc2USJgoFc3dlZXAYAiABKAsyFy5zeXNtbC5SdW5Td2VlcFJlc3BvbnNlEiYKBnNhbXBsZRgDIAEoCzIWLnN5c21sLlJ1blJ1bnNSZXNwb25zZRIPCgdwYWNrYWdlGAQgASgJEhIKCmRlZmluaXRpb24YBSABKAkSDwoHcmVjb3JkcxgGIAMoCRIOCgZzb3VyY2UYByABKAkSDwoHY29udGVudBgIIAEoCRIoCglkb2N1bWVudHMYCSADKAsyFS5zeXNtbC5FZGl0ZWREb2N1bWVudBIPCgdza2lwcGVkGAogASgDEg8KB3JlYXNvbnMYCyADKAkSDQoFZXJyb3IYDCABKAkSLAoOZmFpbHVyZV9yZWFzb24YDSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEiYKC2RpYWdub3N0aWNzGA4gAygLMhEuc3lzbWwuRGlhZ25vc3RpYxISCgptb2RlbF9oYXNoGA8gASgJIsMDCg9SdW5SdW5zUmVzcG9uc2USHQoEcm93cxgBIAMoCzIPLnN5c21sLlN3ZWVwUm93EhMKC29ic2VydmFibGVzGAIgAygJEi0KDWRpc3RyaWJ1dGlvbnMYAyADKAsyFi5zeXNtbC5SdW5EaXN0cmlidXRpb24SDQoFbGluZXMYBCADKAkSIgoHb3V0cHV0cxgFIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSIAoIdmVyZGljdHMYBiADKAsyDi5zeXNtbC5WZXJkaWN0EhMKC3VuY29uY2x1ZGVkGAcgASgJEg0KBWVycm9yGAggASgJEiYKC2RpYWdub3N0aWNzGAkgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgKIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SIgoJaW5zdGFuY2VzGAsgAygLMg8uc3lzbWwuSW5zdGFuY2USDgoGZW5naW5lGAwgASgJEhAKCHN0cmVuZ3RoGA0gASgJEhwKBmJvdW5kcxgOIAMoCzIMLnN5c21sLkJvdW5kEhEKBHNlZWQYDyABKARIAIgBAUIHCgVfc2VlZCKEAQoXUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIQCghxdWVyeV9pZBgCIAEoCRItCghiaW5kaW5ncxgDIAMoCzIbLnN5c21sLkRvY3VtZW50UXVlcnlCaW5kaW5nEhQKDGlubGluZV9xdWVyeRgEIAEoCSJPChREb2N1bWVudFF1ZXJ5QmluZGluZxIRCglwYXJhbWV0ZXIYASABKAkSJAoGdmFsdWVzGAIgAygLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZSK7AwoNRG9jdW1lbnRWYWx1ZRIUCgplbGVtZW50X2lkGAEgASgJSAASFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASEwoJaW50X3ZhbHVlGAMgASgDSAASFAoKcmVhbF92YWx1ZRgEIAEoAUgAEhQKCmJvb2xfdmFsdWUYBSABKAhIABISCghpbmZpbml0eRgGIAEoCEgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIpCgd2ZXJkaWN0GAkgASgLMhYuc3lzbWwuRG9jdW1lbnRWZXJkaWN0SAASJwoGb2JqZWN0GAogASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3RIABIlCgVzdGF0ZRgLIAEoCzIULnN5c21sLkRvY3VtZW50U3RhdGVIABIlCgVldmVudBgMIAEoCzIULnN5c21sLkRvY3VtZW50RXZlbnRIABIXCg1iaWdfaW50X3ZhbHVlGA0gASgJSAASKQoOcmF0aW9uYWxfdmFsdWUYDiABKAsyDy5zeXNtbC5SYXRpb25hbEgAEhQKDGVsZW1lbnRfdHlwZRgHIAEoCUIGCgRraW5kIloKDkRvY3VtZW50T2JqZWN0EhMKC2luc3RhbmNlX2lkGAEgASgDEgwKBHBhdGgYAiABKAkSJQoHZWxlbWVudBgDIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUirgEKD0RvY3VtZW50VmVyZGljdBInCglhc3NlcnRpb24YASABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlEgwKBGtpbmQYAiABKAkSDAoEdGV4dBgDIAEoCRIMCgRwYXRoGAQgASgJEg8KB3ZlcmRpY3QYBSABKAkSEQoJY29uZGl0aW9uGAYgASgJEg4KBnJlYXNvbhgHIAEoCRIUCgx2ZXJpZmljYXRpb24YCCADKAkisQEKDURvY3VtZW50U3RhdGUSJQoGb2JqZWN0GAEgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QSDwoHbWFjaGluZRgCIAEoCRIMCgRuYW1lGAMgASgJEhIKCnN0YXRlX3BhdGgYBCABKAkSIwoFc3RhdGUYBSABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlEg4KBnJlZ2lvbhgGIAEoCRIRCgllbmNsb3NpbmcYByADKAki5wIKDURvY3VtZW50RXZlbnQSDAoEa2luZBgBIAEoCRIiCgR0aW1lGAIgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIlCgZvYmplY3QYAyABKAsyFS5zeXNtbC5Eb2N1bWVudE9iamVjdBIPCgdtYWNoaW5lGAQgASgJEg0KBXN0YXRlGAUgASgJEgwKBGZyb20YBiABKAkSCgoCdG8YByABKAkSJQoGdGFyZ2V0GAggASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QSDQoFZXZlbnQYCSABKAkSDwoHcGF5bG9hZBgKIAMoCRIUCgxhbHRlcm5hdGl2ZXMYCyADKAkSDQoFdGFrZW4YDCABKAkSDAoEdGV4dBgNIAEoCRINCgV0b2tlbhgOIAEoAxIMCgRzdGVwGA8gASgFEg8KB2ZlYXR1cmUYECABKAkSGwoFdmFsdWUYESABKAsyDC5zeXNtbC5WYWx1ZSIjChNEb2N1bWVudFF1ZXJ5Q29sdW1uEgwKBG5hbWUYASABKAkiOQoRRG9jdW1lbnRRdWVyeUNlbGwSJAoGdmFsdWVzGAEgAygLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZSJiChBEb2N1bWVudFF1ZXJ5Um93EiUKB2VsZW1lbnQYASABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlEicKBWNlbGxzGAIgAygLMhguc3lzbWwuRG9jdW1lbnRRdWVyeUNlbGwibgoYUnVuRG9jdW1lbnRRdWVyeVJlc3BvbnNlEisKB2NvbHVtbnMYASADKAsyGi5zeXNtbC5Eb2N1bWVudFF1ZXJ5Q29sdW1uEiUKBHJvd3MYAiADKAsyFy5zeXNtbC5Eb2N1bWVudFF1ZXJ5Um93IvEBCgxRdWVyeU91dGNvbWUSDAoEa2luZBgBIAEoCRIMCgRzdGVwGAIgASgJEiUKCGZhaWx1cmVzGAMgAygLMhMuc3lzbWwuUXVlcnlGYWlsdXJlEiUKCGZpbmRpbmdzGAQgAygLMhMuc3lzbWwuUXVlcnlGaW5kaW5nEioKDXBhdGhfZmFpbHVyZXMYBSADKAsyEy5zeXNtbC5RdWVyeUZhaWx1cmUSFgoOZmFpbHVyZXNfdG90YWwYBiABKAUSFgoOZmluZGluZ3NfdG90YWwYByABKAUSGwoTcGF0aF9mYWlsdXJlc190b3RhbBgIIAEoBSJWCgxRdWVyeUZhaWx1cmUSDAoEc3RlcBgBIAEoCRIQCghleHBlY3RlZBgCIAEoCRImCghmcm9udGllchgDIAEoCzIULnN5c21sLlF1ZXJ5RnJvbnRpZXIi2wEKDVF1ZXJ5RnJvbnRpZXISCgoCYXQYASABKAkSKwoHbWVtYmVycxgCIAMoCzIaLnN5c21sLlF1ZXJ5RnJvbnRpZXJNZW1iZXISLQoIZmVhdHVyZXMYAyADKAsyGy5zeXNtbC5RdWVyeUZyb250aWVyRmVhdHVyZRINCgVraW5kcxgEIAMoCRIPCgduZWFyZXN0GAUgASgJEhUKDW1lbWJlcnNfdG90YWwYBiABKAUSFgoOZmVhdHVyZXNfdG90YWwYByABKAUSEwoLa2luZHNfdG90YWwYCCABKAUiNgoTUXVlcnlGcm9udGllck1lbWJlchIMCgRuYW1lGAEgASgJEhEKCW1ldGFjbGFzcxgCIAEoCSIyChRRdWVyeUZyb250aWVyRmVhdHVyZRIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkiUwoMUXVlcnlGaW5kaW5nEgwKBHN0ZXAYASABKAkSDwoHZWxlbWVudBgCIAEoCRISCgpjb25zdHJhaW50GAMgASgJEhAKCG9ic2VydmVkGAQgASgJIk4KFVJlbmRlckRvY3VtZW50UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEgwKBGZvcm0YAyABKAkiXQoWUmVuZGVyRG9jdW1lbnRSZXNwb25zZRIQCghtYXJrZG93bhgBIAEoCRIMCgRodG1sGAIgASgJEhAKCGFzY2lpZG9jGAQgASgJEhEKCWZpbGVfbmFtZRgDIAEoCSJ3ChFSZW5kZXJWaWV3UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEgwKBHZpZXcYAiABKAkSDQoFcG9ydHMYAyABKAkSDAoEc2hvdxgEIAMoCRINCgVkZXB0aBgFIAEoBRIUCgxjb21wYXJ0bWVudHMYBiABKAkivwIKElJlbmRlclZpZXdSZXNwb25zZRIMCgR2aWV3GAEgASgJEgwKBGtpbmQYAiABKAkSDgoGc3RhdGVkGAMgASgJEiAKBW5vZGVzGAQgAygLMhEuc3lzbWwuUmVuZGVyTm9kZRIgCgVlZGdlcxgFIAMoCzIRLnN5c21sLlJlbmRlckVkZ2USDwoHY29sdW1ucxgGIAMoCRIeCgRyb3dzGAcgAygLMhAuc3lzbWwuUmVuZGVyUm93EiMKBmNhbnZhcxgIIAEoCzITLnN5c21sLlJlbmRlckNhbnZhcxIgCgVub3RlcxgJIAMoCzIRLnN5c21sLlJlbmRlck5vdGUSDwoHbm90aWNlcxgKIAMoCRINCgVzaG93bhgLIAMoCRIhCgVmcmFtZRgMIAEoCzISLnN5c21sLlJlbmRlckZyYW1lImAKC1JlbmRlckZyYW1lEgwKBG5hbWUYASABKAkSDAoEdHlwZRgCIAEoCRIPCgdleHBvc2VzGAMgAygJEg8KB2ZpbHRlcnMYBCADKAkSEwoLYW5ub3RhdGlvbnMYBSADKAki8AIKClJlbmRlck5vZGUSCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEhgKEG5hbWVfc3ludGhlc2l6ZWQYBCABKAgSDAoEdHlwZRgFIAEoCRIOCgZkZXRhaWwYBiABKAkSDAoEdGV4dBgHIAEoCRIQCghzdGFuZF9pbhgIIAEoCBIOCgZwYXJlbnQYCSABKAkSIAoFcG9ydHMYCiADKAsyES5zeXNtbC5SZW5kZXJQb3J0EhsKBm9yaWdpbhgLIAEoCzILLnN5c21sLlNwYW4SJwoIZ2VvbWV0cnkYDCABKAsyFS5zeXNtbC5SZW5kZXJHZW9tZXRyeRIhCgVzdHlsZRgNIAEoCzISLnN5c21sLlJlbmRlclN0eWxlEhMKC2NvbXBhcnRtZW50GA4gASgJEhEKCWluaGVyaXRlZBgPIAEoCBINCgVhcnJvdxgQIAEoCRIQCghwYXJhbGxlbBgRIAEoCCJaCgpSZW5kZXJQb3J0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIRCglkaXJlY3Rpb24YBCABKAkSEQoJaW5oZXJpdGVkGAUgASgIItgBCgpSZW5kZXJFZGdlEgwKBGZyb20YASABKAkSCgoCdG8YAiABKAkSEQoJZnJvbV9wb3J0GAMgASgJEg8KB3RvX3BvcnQYBCABKAkSDQoFbGFiZWwYBSABKAkSDAoEbmFtZRgGIAEoCRIMCgRraW5kGAcgASgJEhsKBm9yaWdpbhgIIAEoCzILLnN5c21sLlNwYW4SIQoFcm91dGUYCSADKAsyEi5zeXNtbC5SZW5kZXJQb2ludBIhCgVzdHlsZRgKIAEoCzISLnN5c21sLlJlbmRlclN0eWxlInwKDlJlbmRlckdlb21ldHJ5EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAESEAoIaGFzX3NpemUYBSABKAgSEQoJY29sbGFwc2VkGAYgASgIEhAKCHVucGxhY2VkGAcgASgIIk0KDFJlbmRlckNhbnZhcxIMCgR1bml0GAEgASgJEg0KBXdpZHRoGAIgASgBEg4KBmhlaWdodBgDIAEoARIQCghoYXNfc2l6ZRgEIAEoCCJ2CgtSZW5kZXJTdHlsZRIMCgRmaWxsGAEgASgJEgwKBGxpbmUYAiABKAkSDAoEdGV4dBgDIAEoCRIMCgRmb250GAQgASgJEhEKCWZvbnRfc2l6ZRgFIAEoARIMCgRib2xkGAYgASgIEg4KBml0YWxpYxgHIAEoCCIjCgtSZW5kZXJQb2ludBIJCgF4GAEgASgBEgkKAXkYAiABKAEiNwoJUmVuZGVyUm93Eg0KBWNlbGxzGAEgAygJEhsKBm9yaWdpbhgCIAEoCzILLnN5c21sLlNwYW4isgEKClJlbmRlck5vdGUSDAoEdGV4dBgBIAEoCRIOCgZhbmNob3IYAiABKAkSEQoJZWRnZV9mcm9tGAMgASgJEg8KB2VkZ2VfdG8YBCABKAkSCQoBeBgFIAEoARIJCgF5GAYgASgBEg0KBXdpZHRoGAcgASgBEg4KBmhlaWdodBgIIAEoARIQCghoYXNfc2l6ZRgJIAEoCBIbCgZvcmlnaW4YCiABKAsyCy5zeXNtbC5TcGFuIjoKE0V4cG9ydEdyYXBoc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIPCgdzdWJqZWN0GAIgASgJIkkKFEV4cG9ydEdyYXBoc1Jlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSDwoHdmVyc2lvbhgCIAEoBRIPCgdzdWJqZWN0GAMgASgJIpABChFJbXBvcnREYXRhUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEiIKB2ltcG9ydHMYAiADKAsyES5zeXNtbC5EYXRhSW1wb3J0EhEKCWltcG9ydF9hcxgDIAEoCRIWCg5pbXBvcnRfZHJ5X3J1bhgEIAEoCBIYChBhY2NlcHRfZG9jdW1lbnRzGAUgASgIIlYKCkRhdGFJbXBvcnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEhUKDWltcG9ydF9mb3JtYXQYAyABKAkSEgoKaW1wb3J0X21hcBgEIAEoCSK+AQoSSW1wb3J0RGF0YVJlc3BvbnNlEiIKBWZpbGVzGAEgAygLMhMuc3lzbWwuSW1wb3J0ZWRGaWxlEigKCWRvY3VtZW50cxgCIAMoCzIVLnN5c21sLkVkaXRlZERvY3VtZW50Eg8KB2NvbnRlbnQYAyABKAkSEgoKbW9kZWxfaGFzaBgEIAEoCRINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMiaQoMSW1wb3J0ZWRGaWxlEgwKBG5hbWUYASABKAkSDgoGdmFsdWVzGAIgASgDEhAKCGVsZW1lbnRzGAMgASgDEikKC2Fzc2lnbm1lbnRzGAQgAygLMhQuc3lzbWwuSW1wb3J0ZWRWYWx1ZSJ3Cg1JbXBvcnRlZFZhbHVlEg8KB2VsZW1lbnQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIRCglyZWRlZmluZXMYBCABKAkSDQoFd2hlcmUYBSABKAkSEwoLZGVzY3JpcHRpb24YBiABKAki5gEKFUNvbXBhcmVSZXN1bHRzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEg8KB3Jlc3VsdHMYAiABKAkSDwoHYWN0aW9ucxgDIAMoCRIMCgRydW5zGAQgASgDEhEKBHNlZWQYBSABKARIAIgBARINCgVkcmF3cxgGIAEoCRIXCgpjbG9ja19zdGVwGAcgASgBSAGIAQESJgoHb2JzZXJ2ZRgIIAMoCzIVLnN5c21sLk9ic2VydmFibGVQYWlyEg4KBmVuZ2luZRgJIAEoCUIHCgVfc2VlZEINCgtfY2xvY2tfc3RlcCIxCg5PYnNlcnZhYmxlUGFpchIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCSKFAgoWQ29tcGFyZVJlc3VsdHNSZXNwb25zZRI2Cg5jb25maWd1cmF0aW9ucxgBIAMoCzIeLnN5c21sLkNvbmZpZ3VyYXRpb25Db21wYXJpc29uEg4KBnNvdXJjZRgCIAEoCRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEg4KBmVuZ2luZRgGIAEoCRIQCghzdHJlbmd0aBgHIAEoCRIcCgZib3VuZHMYCCADKAsyDC5zeXNtbC5Cb3VuZCLEAwoXQ29uZmlndXJhdGlvbkNvbXBhcmlzb24SCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghiZWhhdmlvchgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSFwoPcmVzdWx0X2xvY2F0aW9uGAUgASgJEg4KBnN0YXR1cxgGIAEoCRISCgp1bnJlc29sdmVkGAcgASgJEhMKC3N0b3JlZF9ydW5zGAggASgDEhgKEHN0b3JlZF9zbmFwc2hvdHMYCSABKAMSDAoEcnVucxgKIAEoAxIRCgljb21wbGV0ZWQYCyABKAMSDQoFZHJhd3MYDCABKAkSEQoEc2VlZBgNIAEoBEgAiAEBEhIKCmNsb2NrX3N0ZXAYDiABKAESHQoEcm93cxgPIAMoCzIPLnN5c21sLlN3ZWVwUm93EiIKCWluc3RhbmNlcxgQIAMoCzIPLnN5c21sLkluc3RhbmNlEjAKC29ic2VydmFibGVzGBEgAygLMhsuc3lzbWwuT2JzZXJ2YWJsZUNvbXBhcmlzb24SDgoGZXJyb3JzGBIgAygJEg0KBW5vdGVzGBMgAygJEg0KBWxpbmVzGBQgAygJQgcKBV9zZWVkIsgCChRPYnNlcnZhYmxlQ29tcGFyaXNvbhIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRIMCgR1bml0GAMgASgJEikKBHRvb2wYBCABKAsyGy5zeXNtbC5Db21wYXJlZERpc3RyaWJ1dGlvbhIOCgZwb29sZWQYBSABKAgSEAoIdW5zdG9yZWQYBiABKAgSKAoDcnVuGAcgASgLMhsuc3lzbWwuQ29tcGFyZWREaXN0cmlidXRpb24SEAoIcHJvZHVjZWQYCCABKAMSEAoIY29tcGFyZWQYCSABKAgSLgoKZGlmZmVyZW5jZRgKIAEoCzIaLnN5c21sLlN0YXRpc3RpY0RpZmZlcmVuY2USJwoIZGVjbGFyZWQYCyABKAsyFS5zeXNtbC5DYXNlU3RhdGlzdGljcxINCgVub3RlcxgMIAMoCSJ6ChRDb21wYXJlZERpc3RyaWJ1dGlvbhINCgVjb3VudBgBIAEoAxILCgNtaW4YAiABKAESDAoEbWVhbhgDIAEoARILCgNwNTAYBCABKAESCwoDcDkwGAUgASgBEgsKA21heBgGIAEoARIRCglkZXZpYXRpb24YByABKAEiVwoTU3RhdGlzdGljRGlmZmVyZW5jZRILCgNtaW4YASABKAkSDAoEbWVhbhgCIAEoCRILCgNwNTAYAyABKAkSCwoDcDkwGAQgASgJEgsKA21heBgFIAEoCSJVCg5DYXNlU3RhdGlzdGljcxIQCghhbmFseXNpcxgBIAEoCRIiCgRyb3dzGAIgAygLMhQuc3lzbWwuQ2FzZVN0YXRpc3RpYxINCgVub3RlcxgDIAMoCSJdCg1DYXNlU3RhdGlzdGljEhEKCXN0YXRpc3RpYxgBIAEoCRIKCgJvZhgCIAEoCRIMCgR0b29sGAMgASgJEgsKA3J1bhgEIAEoCRISCgpkaWZmZXJlbmNlGAUgASgJKrEBCg1GYWlsdXJlUmVhc29uEh4KGkZBSUxVUkVfUkVBU09OX1VOU1BFQ0lGSUVEEAASHQoZRkFJTFVSRV9SRUFTT05fRVZBTFVBVElPThABEh0KGUZBSUxVUkVfUkVBU09OX1dST05HX0tJTkQQAhIkCiBGQUlMVVJFX1JFQVNPTl9BTUJJR1VPVVNfU1VCSkVDVBADEhwKGEZBSUxVUkVfUkVBU09OX1VOREVDSURFRBAEKowFCgtFZGl0RmFpbHVyZRIcChhFRElUX0ZBSUxVUkVfVU5TUEVDSUZJRUQQABIeChpFRElUX0ZBSUxVUkVfTk9fT1BFUkFUSU9OUxABEh8KG0VESVRfRkFJTFVSRV9VTktOT1dOX1RBUkdFVBACEiEKHUVESVRfRkFJTFVSRV9BTUJJR1VPVVNfVEFSR0VUEAMSGwoXRURJVF9GQUlMVVJFX05PVF9WQUxVRUQQBBIeChpFRElUX0ZBSUxVUkVfSU5WQUxJRF9WQUxVRRAFEh0KGUVESVRfRkFJTFVSRV9JTlZBTElEX05BTUUQBhIaChZFRElUX0ZBSUxVUkVfTk9UX05BTUVEEAcSIgoeRURJVF9GQUlMVVJFX1JFTkFNRV9SRUZFUkVOQ0VEEAgSIgoeRURJVF9GQUlMVVJFX09WRVJMQVBQSU5HX0VESVRTEAkSHwobRURJVF9GQUlMVVJFX1JFU1VMVF9JTlZBTElEEAoSHgoaRURJVF9GQUlMVVJFX09XTkVSX1VOS05PV04QCxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfTk9UX05BTUVTUEFDRRAMEh0KGUVESVRfRkFJTFVSRV9JTExFR0FMX0tJTkQQDRIiCh5FRElUX0ZBSUxVUkVfTUVNQkVSX05BTUVfVEFLRU4QDhIiCh5FRElUX0ZBSUxVUkVfREVMRVRFX1JFRkVSRU5DRUQQDxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfSU5TSURFX1RBUkdFVBAQEiAKHEVESVRfRkFJTFVSRV9NT1ZFX1JFRkVSRU5DRUQQERIlCiFFRElUX0ZBSUxVUkVfUkVGRVJFTkNFRF9FTFNFV0hFUkUQEiqaAgoRUHJpbWl0aXZlT3BlcmF0b3ISIgoeUFJJTUlUSVZFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASHAoYUFJJTUlUSVZFX09QRVJBVE9SX0VRVUFMEAESHgoaUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVIQAhIbChdQUklNSVRJVkVfT1BFUkFUT1JfTEVTUxADEiEKHVBSSU1JVElWRV9PUEVSQVRPUl9MRVNTX0VRVUFMEAQSJAogUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVJfRVFVQUwQBRIZChVQUklNSVRJVkVfT1BFUkFUT1JfSU4QBhIiCh5QUklNSVRJVkVfT1BFUkFUT1JfSU5TVEFOQ0VfT0YQBypuChFDb21wb3NpdGVPcGVyYXRvchIiCh5DT01QT1NJVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIaChZDT01QT1NJVEVfT1BFUkFUT1JfQU5EEAESGQoVQ09NUE9TSVRFX09QRVJBVE9SX09SEAIyyhIKDFN5c01MU2VydmljZRJECg1HZXRTZXJ2ZXJJbmZvEhguc3lzbWwuU2VydmVySW5mb1JlcXVlc3QaGS5zeXNtbC5TZXJ2ZXJJbmZvUmVzcG9uc2USPgoJUGFyc2VGaWxlEhcuc3lzbWwuUGFyc2VGaWxlUmVxdWVzdBoYLnN5c21sLlBhcnNlRmlsZVJlc3BvbnNlEkcKDFBhcnNlU291cmNlcxIaLnN5c21sLlBhcnNlU291cmNlc1JlcXVlc3QaGy5zeXNtbC5QYXJzZVNvdXJjZXNSZXNwb25zZRI7CglHZXRTeW1ib2wSFy5zeXNtbC5HZXRTeW1ib2xSZXF1ZXN0GhUuc3lzbWwuU3ltYm9sUmVzcG9uc2USRwoOR2V0RGlhZ25vc3RpY3MSGS5zeXNtbC5EaWFnbm9zdGljc1JlcXVlc3QaGi5zeXNtbC5EaWFnbm9zdGljc1Jlc3BvbnNlEjsKCEV2YWx1YXRlEhYuc3lzbWwuRXZhbHVhdGVSZXF1ZXN0Ghcuc3lzbWwuRXZhbHVhdGVSZXNwb25zZRJECgtJbnN0YW50aWF0ZRIZLnN5c21sLkluc3RhbnRpYXRlUmVxdWVzdBoaLnN5c21sLkluc3RhbnRpYXRlUmVzcG9uc2USSgoNSW5zdGFuY2VQYXRocxIbLnN5c21sLkluc3RhbmNlUGF0aHNSZXF1ZXN0Ghwuc3lzbWwuSW5zdGFuY2VQYXRoc1Jlc3BvbnNlEkoKDUV4ZWN1dGVBY3Rpb24SGy5zeXNtbC5FeGVjdXRlQWN0aW9uUmVxdWVzdBocLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZRJHCgxFeGVjdXRlU3RhdGUSGi5zeXNtbC5FeGVjdXRlU3RhdGVSZXF1ZXN0Ghsuc3lzbWwuRXhlY3V0ZVN0YXRlUmVzcG9uc2USOAoHQ29udmVydBIVLnN5c21sLkNvbnZlcnRSZXF1ZXN0GhYuc3lzbWwuQ29udmVydFJlc3BvbnNlEjgKB01pZ3JhdGUSFS5zeXNtbC5NaWdyYXRlUmVxdWVzdBoWLnN5c21sLk1pZ3JhdGVSZXNwb25zZRJBCgpBcHBseUVkaXRzEhguc3lzbWwuQXBwbHlFZGl0c1JlcXVlc3QaGS5zeXNtbC5BcHBseUVkaXRzUmVzcG9uc2USUwoQVmVyaWZ5Q29uc3RyYWludBIeLnN5c21sLlZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0Gh8uc3lzbWwuVmVyaWZ5Q29uc3RyYWludFJlc3BvbnNlElYKEVZlcmlmeVJlcXVpcmVtZW50Eh8uc3lzbWwuVmVyaWZ5UmVxdWlyZW1lbnRSZXF1ZXN0GiAuc3lzbWwuVmVyaWZ5UmVxdWlyZW1lbnRSZXNwb25zZRJZChJWZXJpZnlTYXRpc2ZhY3Rpb24SIC5zeXNtbC5WZXJpZnlTYXRpc2ZhY3Rpb25SZXF1ZXN0GiEuc3lzbWwuVmVyaWZ5U2F0aXNmYWN0aW9uUmVzcG9uc2USUwoQVmFsaWRhdGVJbnN0YW5jZRIeLnN5c21sLlZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0Gh8uc3lzbWwuVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEkcKDEV2YWx1YXRlQ2FsYxIaLnN5c21sLkV2YWx1YXRlQ2FsY1JlcXVlc3QaGy5zeXNtbC5FdmFsdWF0ZUNhbGNSZXNwb25zZRJECgtSdW5BbmFseXNpcxIZLnN5c21sLlJ1bkFuYWx5c2lzUmVxdWVzdBoaLnN5c21sLlJ1bkFuYWx5c2lzUmVzcG9uc2USSgoNQ2hlY2tCZWhhdmlvchIbLnN5c21sLkNoZWNrQmVoYXZpb3JSZXF1ZXN0Ghwuc3lzbWwuQ2hlY2tCZWhhdmlvclJlc3BvbnNlEjsKCFJ1blN3ZWVwEhYuc3lzbWwuUnVuU3dlZXBSZXF1ZXN0Ghcuc3lzbWwuUnVuU3dlZXBSZXNwb25zZRI4CgdSdW5SdW5zEhUuc3lzbWwuUnVuUnVuc1JlcXVlc3QaFi5zeXNtbC5SdW5SdW5zUmVzcG9uc2USPgoJU2VsZkNoZWNrEhcuc3lzbWwuU2VsZkNoZWNrUmVxdWVzdBoYLnN5c21sLlNlbGZDaGVja1Jlc3BvbnNlEj4KCVJlY29yZFJ1bhIXLnN5c21sLlJlY29yZFJ1blJlcXVlc3QaGC5zeXNtbC5SZWNvcmRSdW5SZXNwb25zZRJECgtMaXN0RW5naW5lcxIZLnN5c21sLkxpc3RFbmdpbmVzUmVxdWVzdBoaLnN5c21sLkxpc3RFbmdpbmVzUmVzcG9uc2USMgoFUXVlcnkSEy5zeXNtbC5RdWVyeVJlcXVlc3QaFC5zeXNtbC5RdWVyeVJlc3BvbnNlEl8KFEdldEVsZW1lbnRQcm9wZXJ0aWVzEiIuc3lzbWwuR2V0RWxlbWVudFByb3BlcnRpZXNSZXF1ZXN0GiMuc3lzbWwuR2V0RWxlbWVudFByb3BlcnRpZXNSZXNwb25zZRJTChBSdW5Eb2N1bWVudFF1ZXJ5Eh4uc3lzbWwuUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QaHy5zeXNtbC5SdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USTQoOUmVuZGVyRG9jdW1lbnQSHC5zeXNtbC5SZW5kZXJEb2N1bWVudFJlcXVlc3QaHS5zeXNtbC5SZW5kZXJEb2N1bWVudFJlc3BvbnNlEkEKClJlbmRlclZpZXcSGC5zeXNtbC5SZW5kZXJWaWV3UmVxdWVzdBoZLnN5c21sLlJlbmRlclZpZXdSZXNwb25zZRJHCgxFeHBvcnRHcmFwaHMSGi5zeXNtbC5FeHBvcnRHcmFwaHNSZXF1ZXN0Ghsuc3lzbWwuRXhwb3J0R3JhcGhzUmVzcG9uc2USQQoKSW1wb3J0RGF0YRIYLnN5c21sLkltcG9ydERhdGFSZXF1ZXN0Ghkuc3lzbWwuSW1wb3J0RGF0YVJlc3BvbnNlEk0KDkNvbXBhcmVSZXN1bHRzEhwuc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXF1ZXN0Gh0uc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXNwb25zZUIqWihnaXRodWIuY29tL09wZW4tTUJFRS9PcGVuU3lzTUwvYXBpL3Byb3RvYgZwcm90bzM"); + fileDesc("CgtzeXNtbC5wcm90bxIFc3lzbWwiqQMKB1ZlcmRpY3QSDAoEa2luZBgBIAEoCRISCgplbGVtZW50X2lkGAIgASgJEg8KB2VsZW1lbnQYAyABKAkSDQoFaG9sZHMYBCABKAgSEQoJY29uZGl0aW9uGAUgASgJEhMKC2luc3RhbmNlX2lkGAYgASgDEhgKEGluc3RhbmNlX3R5cGVfaWQYByABKAkSDQoFZXJyb3IYCCABKAkSLAoOZmFpbHVyZV9yZWFzb24YCSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEhYKDnJlcXVpcmVtZW50X2lkGAogASgJEg4KBmVuZ2luZRgLIAEoCRIQCghzdHJlbmd0aBgMIAEoCRIcCgZib3VuZHMYDSADKAsyDC5zeXNtbC5Cb3VuZBIVCg1pbnN0YW5jZV9wYXRoGA4gASgJEhAKCHF1ZXN0aW9uGA8gASgJEg4KBnN0YXR1cxgQIAEoCRIpCgd3aXRuZXNzGBEgAygLMhguc3lzbWwuV2l0bmVzc0Fzc2lnbm1lbnQSIQoFbm90ZXMYEiADKAsyEi5zeXNtbC5WZXJkaWN0Tm90ZSI6CgtWZXJkaWN0Tm90ZRIMCgRraW5kGAEgASgJEg8KB3N1YmplY3QYAiABKAkSDAoEdGV4dBgDIAEoCSJeChFXaXRuZXNzQXNzaWdubWVudBIPCgdmZWF0dXJlGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUSDAoEdW5pdBgDIAEoCRINCgVleGFjdBgEIAEoCSI1CgVCb3VuZBIMCgRuYW1lGAEgASgJEg0KBWxpbWl0GAIgASgDEg8KB3JlYWNoZWQYAyABKAgisAIKF1ZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEg4KBmVuZ2luZRgEIAEoCRIQCghxdWVzdGlvbhgFIAEoCRIfCglhcmd1bWVudHMYBiADKAsyDC5zeXNtbC5WYWx1ZRJLCg9uYW1lZF9hcmd1bWVudHMYByADKAsyMi5zeXNtbC5WZXJpZnlDb25zdHJhaW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpYBChhWZXJpZnlDb25zdHJhaW50UmVzcG9uc2USHwoHdmVyZGljdBgBIAEoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljIrICChhWZXJpZnlSZXF1aXJlbWVudFJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYAyABKAkSDgoGZW5naW5lGAQgASgJEhAKCHF1ZXN0aW9uGAUgASgJEh8KCWFyZ3VtZW50cxgGIAMoCzIMLnN5c21sLlZhbHVlEkwKD25hbWVkX2FyZ3VtZW50cxgHIAMoCzIzLnN5c21sLlZlcmlmeVJlcXVpcmVtZW50UmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5GkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIpwBChNWZXJpZmljYXRpb25WZXJkaWN0Eg8KB2Nhc2VfaWQYASABKAkSDAoEa2luZBgCIAEoCRIOCgZkZXRhaWwYAyABKAkSDwoHc3ViY2FzZRgEIAEoCBIWCg5yZXF1aXJlbWVudF9pZBgFIAEoCRITCgtpbnN0YW5jZV9pZBgGIAEoAxIYChBpbnN0YW5jZV90eXBlX2lkGAcgASgJItIBChlWZXJpZnlSZXF1aXJlbWVudFJlc3BvbnNlEh8KB3ZlcmRpY3QYASABKAsyDi5zeXNtbC5WZXJkaWN0EiIKCWluc3RhbmNlcxgCIAMoCzIPLnN5c21sLkluc3RhbmNlEg0KBWVycm9yGAMgASgJEiYKC2RpYWdub3N0aWNzGAQgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBSADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0ImQKGVZlcmlmeVNhdGlzZmFjdGlvblJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIRCglzeW1ib2xfaWQYAiABKAkSDgoGZW5naW5lGAMgASgJEhAKCHF1ZXN0aW9uGAQgASgJIoICChpWZXJpZnlTYXRpc2ZhY3Rpb25SZXNwb25zZRIgCgh2ZXJkaWN0cxgBIAMoCzIOLnN5c21sLlZlcmRpY3QSIgoJaW5zdGFuY2VzGAIgAygLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhI5ChV2ZXJpZmljYXRpb25fdmVyZGljdHMYBiADKAsyGi5zeXNtbC5WZXJpZmljYXRpb25WZXJkaWN0IlAKF1ZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEg4KBmVuZ2luZRgDIAEoCSKyAgoYVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEiAKCHZlcmRpY3RzGAEgAygLMg4uc3lzbWwuVmVyZGljdBIfCgdzdW1tYXJ5GAIgASgLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSDwoHYm91bmRlZBgIIAEoCCJtChNFdmFsdWF0ZUNhbGNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEh8KCWFyZ3VtZW50cxgDIAMoCzIMLnN5c21sLlZhbHVlEg4KBmVuZ2luZRgEIAEoCSL9AQoURXZhbHVhdGVDYWxjUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSIgoHb3V0cHV0cxgCIAMoCzIRLnN5c21sLkNhbGNPdXRwdXQSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAUgASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIOCgZlbmdpbmUYBiABKAkSEAoIc3RyZW5ndGgYByABKAkSHAoGYm91bmRzGAggAygLMgwuc3lzbWwuQm91bmQiNwoKQ2FsY091dHB1dBIMCgRuYW1lGAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUikwEKDkNhc2VFdmFsdWF0aW9uEhMKC2Z1bmN0aW9uX2lkGAEgASgJEh8KCWFyZ3VtZW50cxgCIAMoCzIMLnN5c21sLlZhbHVlEhwKBnJlc3VsdBgDIAEoCzIMLnN5c21sLlZhbHVlEg0KBWVycm9yGAQgASgJEhAKCHNlbGVjdGVkGAUgASgIEgwKBHRpZWQYBiABKAgivAIKElJ1bkFuYWx5c2lzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJGCg9uYW1lZF9hcmd1bWVudHMYBSADKAsyLS5zeXNtbC5SdW5BbmFseXNpc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIQCghzY2hlZHVsZRgGIAEoCRIOCgZlbmdpbmUYByABKAkSFAoMdG9vbF9kcnlfcnVuGAggASgIGkMKE05hbWVkQXJndW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIvQCCgpUb29sRHJ5UnVuEg4KBmFjdGlvbhgBIAEoCRIMCgR0b29sGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSEAoIbWFuaWZlc3QYBCABKAkSEgoKZXhlY3V0YWJsZRgFIAEoCRIQCghwcm90b2NvbBgGIAEoCRIMCgRhcmdzGAcgAygJEgsKA2VudhgIIAMoCRILCgNjd2QYCSABKAkSDQoFc3RkaW4YCiABKAkSEgoKc3RkaW5fZGF0YRgLIAEoCRIpCgppbnB1dF9maWxlGAwgASgLMhUuc3lzbWwuVG9vbERyeVJ1bkZpbGUSEgoKb3V0cHV0X2RpchgNIAEoCBImCgZpbnB1dHMYDiADKAsyFi5zeXNtbC5Ub29sRHJ5UnVuSW5wdXQSKAoHb3V0cHV0cxgPIAMoCzIXLnN5c21sLlRvb2xEcnlSdW5PdXRwdXQSFAoMcmVwbHlfc291cmNlGBAgASgJEg0KBWxpbmVzGBEgAygJIjwKDlRvb2xEcnlSdW5GaWxlEgwKBG5hbWUYASABKAkSDgoGZm9ybWF0GAIgASgJEgwKBGRhdGEYAyABKAkiUwoPVG9vbERyeVJ1bklucHV0EhAKCHZhcmlhYmxlGAEgASgJEhEKCXBhcmFtZXRlchgCIAEoCRINCgV2YWx1ZRgDIAEoCRIMCgR1bml0GAQgASgJIjcKEFRvb2xEcnlSdW5PdXRwdXQSEAoIdmFyaWFibGUYASABKAkSEQoJcGFyYW1ldGVyGAIgASgJIoUEChNSdW5BbmFseXNpc1Jlc3BvbnNlEiIKB291dHB1dHMYASADKAsyES5zeXNtbC5DYWxjT3V0cHV0EiAKCHZlcmRpY3RzGAIgAygLMg4uc3lzbWwuVmVyZGljdBIiCglpbnN0YW5jZXMYAyADKAsyDy5zeXNtbC5JbnN0YW5jZRINCgVlcnJvchgEIAEoCRImCgtkaWFnbm9zdGljcxgFIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEjkKFXZlcmlmaWNhdGlvbl92ZXJkaWN0cxgHIAMoCzIaLnN5c21sLlZlcmlmaWNhdGlvblZlcmRpY3QSIAoIb3V0Y29tZXMYCCADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAkgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSKgoLZXZhbHVhdGlvbnMYCiADKAsyFS5zeXNtbC5DYXNlRXZhbHVhdGlvbhIOCgZlbmdpbmUYCyABKAkSEAoIc3RyZW5ndGgYDCABKAkSHAoGYm91bmRzGA0gAygLMgwuc3lzbWwuQm91bmQSJwoMdG9vbF9kcnlfcnVuGA4gASgLMhEuc3lzbWwuVG9vbERyeVJ1biIsChBQcm9iYWJpbGl0eVJhbmdlEgsKA21pbhgBIAEoARILCgNtYXgYAiABKAEiywIKB091dGNvbWUSLAoHb3V0cHV0cxgBIAMoCzIbLnN5c21sLk91dGNvbWUuT3V0cHV0c0VudHJ5EhMKC2ZpbmFsX3N0YXRlGAIgASgJEhYKDnN0YXRlc192aXNpdGVkGAMgAygJEg0KBWVycm9yGAQgASgJEhYKDmxpbmVhcml6YXRpb25zGAUgASgFEg8KB3dpdG5lc3MYBiADKAkSJgoLZGlhZ25vc3RpY3MYByADKAsyES5zeXNtbC5EaWFnbm9zdGljEhMKC3Byb2JhYmlsaXR5GAggASgBEjIKEXByb2JhYmlsaXR5X3JhbmdlGAkgASgLMhcuc3lzbWwuUHJvYmFiaWxpdHlSYW5nZRo8CgxPdXRwdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBIu4BChFFeHBsb3JhdGlvblN0YXR1cxIQCghjb21wbGV0ZRgBIAEoCBIMCgRydW5zGAIgASgFEhMKC2J1ZGdldHNfaGl0GAMgAygJEhMKC3J1bnNfYnVkZ2V0GAQgASgFEhQKDGRlcHRoX2J1ZGdldBgFIAEoBRIhChlwcm9iYWJpbGl0aWVzX2xvd2VyX2JvdW5kGAYgASgIEh0KFWZhaWxlZF9saW5lYXJpemF0aW9ucxgHIAEoBRIUCgx1bmVudW1lcmF0ZWQYCCADKAkSIQoIY292ZXJhZ2UYCSABKAsyDy5zeXNtbC5Db3ZlcmFnZSJbCghDb3ZlcmFnZRIkCgZzdGF0ZXMYASADKAsyFC5zeXNtbC5Db3ZlcmFnZUVudHJ5EikKC3RyYW5zaXRpb25zGAIgAygLMhQuc3lzbWwuQ292ZXJhZ2VFbnRyeSJACg1Db3ZlcmFnZUVudHJ5EgwKBHBhdGgYASABKAkSEwoLZGVjbGFyYXRpb24YAiABKAkSDAoEcnVucxgDIAEoBSLRAwoUQ2hlY2tCZWhhdmlvclJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIYChBhY3Rpb25fc3ltYm9sX2lkGAIgASgJEh8KF3N0YXRlX21hY2hpbmVfc3ltYm9sX2lkGAMgASgJEjcKBmlucHV0cxgEIAMoCzInLnN5c21sLkNoZWNrQmVoYXZpb3JSZXF1ZXN0LklucHV0c0VudHJ5EhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAkSFgoOY2hlY2tfcHJvcGVydHkYBiADKAkSFQoNY2hlY2tfZGl2ZXJnZRgHIAMoCRITCgtjaGVja19pbnB1dBgIIAMoCRIUCgxjaGVja19hc3N1bWUYCSADKAkSFQoNY2hlY2tfd2l0bmVzcxgKIAEoCBITCgtjaGVja19kZXB0aBgLIAEoBRIUCgxjaGVja19zdGF0ZXMYDCABKAUSFAoMY2hlY2tfdW5yb2xsGA0gASgFEhUKDWNoZWNrX3RpbWVvdXQYDiABKAESDgoGZW5naW5lGA8gASgJGjsKC0lucHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASJ5CgxDaGVja1dpdG5lc3MSEAoIc2NoZWR1bGUYASABKAkSDQoFZHJhd3MYAiADKAkSDwoHY2hvaWNlcxgDIAMoCRIOCgZpbnB1dHMYBCADKAkSEQoJZmlsZV9uYW1lGAUgASgJEhQKDGZpbGVfY29udGVudBgGIAEoCSKXAQoOQ2hlY2tWaW9sYXRpb24SDAoEa2luZBgBIAEoCRIQCghwcm9wZXJ0eRgCIAEoCRINCgVlcnJvchgDIAEoCRINCgVkZXB0aBgEIAEoBRITCgtwcm9iYWJpbGl0eRgFIAEoARIkCgd3aXRuZXNzGAYgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEgwKBHRleHQYByABKAkiSgoTQ2hlY2tEaXZlcmdlbnRWYWx1ZRINCgV2YWx1ZRgBIAEoCRIkCgd3aXRuZXNzGAIgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzIk4KD0NoZWNrRGl2ZXJnZW5jZRIPCgdmZWF0dXJlGAEgASgJEioKBnZhbHVlcxgCIAMoCzIaLnN5c21sLkNoZWNrRGl2ZXJnZW50VmFsdWUioQEKCkNoZWNrRmluYWwSDwoHb3V0Y29tZRgBIAEoCRItCgZ2YWx1ZXMYAiADKAsyHS5zeXNtbC5DaGVja0ZpbmFsLlZhbHVlc0VudHJ5EiQKB3dpdG5lc3MYAyABKAsyEy5zeXNtbC5DaGVja1dpdG5lc3MaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLgAQoLQ2hlY2tTZWFyY2gSDgoGc3RhdGVzGAEgASgFEg0KBW1vdmVzGAIgASgFEhEKCW1heF9kZXB0aBgDIAEoBRISCgpib3VuZHNfaGl0GAQgAygJEg8KB2hvcml6b24YBSABKAESEwoLaG9yaXpvbl9zZXQYBiABKAgSFAoMbWFzc19ib3VuZGVkGAcgASgIEg0KBW5vdGVzGAggAygJEg0KBXNjb3BlGAkgAygJEg4KBnN0YXR1cxgKIAEoCRIhCghjb3ZlcmFnZRgLIAEoCzIPLnN5c21sLkNvdmVyYWdlIrsDChVDaGVja0JlaGF2aW9yUmVzcG9uc2USDwoHdmVyZGljdBgBIAEoCRINCgVsaW5lcxgCIAMoCRIiCgZzZWFyY2gYAyABKAsyEi5zeXNtbC5DaGVja1NlYXJjaBIpCgp2aW9sYXRpb25zGAQgAygLMhUuc3lzbWwuQ2hlY2tWaW9sYXRpb24SKwoLZGl2ZXJnZW5jZXMYBSADKAsyFi5zeXNtbC5DaGVja0RpdmVyZ2VuY2USIQoGZmluYWxzGAYgAygLMhEuc3lzbWwuQ2hlY2tGaW5hbBINCgVjbGFpbRgHIAEoCRITCgtmcmVlX2lucHV0cxgIIAMoCRITCgthc3N1bXB0aW9ucxgJIAMoCRIkCgd3aXRuZXNzGAogASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEiUKCGNvbnRyYXN0GAsgASgLMhMuc3lzbWwuQ2hlY2tXaXRuZXNzEg4KBmVuZ2luZRgMIAEoCRIQCghzdHJlbmd0aBgNIAEoCRIcCgZib3VuZHMYDiADKAsyDC5zeXNtbC5Cb3VuZBIOCgZyZWFzb24YDyABKAkSDQoFZXJyb3IYESABKAkiIwoSTGlzdEVuZ2luZXNSZXF1ZXN0Eg0KBXByb2JlGAEgASgIIvwBCgpFbmdpbmVJbmZvEgwKBG5hbWUYASABKAkSEQoJYXV0aG9yaXR5GAIgASgJEg8KB2Fuc3dlcnMYAyADKAkSDgoGYm91bmRzGAQgAygJEg8KB3Byb2Nlc3MYBSABKAkSFQoNcHJvY2Vzc19mb3VuZBgGIAEoCRINCgVyZWFkeRgHIAEoCBITCgt1bmF2YWlsYWJsZRgIIAEoCRIMCgRraW5kGAkgASgJEhAKCHByb3RvY29sGAogASgJEg4KBnNvdXJjZRgLIAEoCRIPCgdjb21tYW5kGAwgASgJEg8KB3ZlcnNpb24YDSABKAkSDgoGc2VydmVkGA4gASgIIjkKE0xpc3RFbmdpbmVzUmVzcG9uc2USIgoHZW5naW5lcxgBIAMoCzIRLnN5c21sLkVuZ2luZUluZm8ijAEKEFBhcnNlRmlsZVJlcXVlc3QSEwoJZmlsZV9wYXRoGAEgASgJSAASEQoHY29udGVudBgCIAEoCUgAEhgKDGNvbnRlbnRfaGFzaBgDIAEoCUICGAESEAoIbGFuZ3VhZ2UYBCABKAkSGgoSc3RyaWN0X2NvbmZvcm1hbmNlGAUgASgIQggKBnNvdXJjZSJiCg5Tb3VyY2VEb2N1bWVudBITCglmaWxlX3BhdGgYASABKAlIABIRCgdjb250ZW50GAIgASgJSAASEAoIbGFuZ3VhZ2UYAyABKAkSDAoEbmFtZRgEIAEoCUIICgZzb3VyY2UidAoTUGFyc2VTb3VyY2VzUmVxdWVzdBIoCglkb2N1bWVudHMYASADKAsyFS5zeXNtbC5Tb3VyY2VEb2N1bWVudBIaChJzdHJpY3RfY29uZm9ybWFuY2UYAiABKAgSFwoPYmFzZV9tb2RlbF9oYXNoGAMgASgJIpUBChRQYXJzZVNvdXJjZXNSZXNwb25zZRISCgptb2RlbF9oYXNoGAEgASgJEiAKBXJvb3RzGAIgAygLMhEuc3lzbWwuU3ltYm9sSW5mbxImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSDQoFZXJyb3IYBCABKAkSEAoIYWZmZWN0ZWQYBSADKAkifwoRUGFyc2VGaWxlUmVzcG9uc2USEgoKbW9kZWxfaGFzaBgBIAEoCRIfCgRyb290GAIgASgLMhEuc3lzbWwuU3ltYm9sSW5mbxImCgtkaWFnbm9zdGljcxgDIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSDQoFZXJyb3IYBCABKAkiWgoQR2V0U3ltYm9sUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhEKCXN5bWJvbF9pZBgCIAEoCRIfChdpbmNsdWRlX2xpYnJhcnlfbWVtYmVycxgDIAEoCCJCCg5TeW1ib2xSZXNwb25zZRIhCgZzeW1ib2wYASABKAsyES5zeXNtbC5TeW1ib2xJbmZvEg0KBWVycm9yGAIgASgJIlkKG0dldEVsZW1lbnRQcm9wZXJ0aWVzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhIKCmVsZW1lbnRfaWQYAiABKAkSEgoKcHJvcGVydGllcxgDIAMoCSJ9ChxHZXRFbGVtZW50UHJvcGVydGllc1Jlc3BvbnNlEiIKB2VsZW1lbnQYASABKAsyES5zeXNtbC5FbGVtZW50UmVmEioKCnByb3BlcnRpZXMYAiADKAsyFi5zeXNtbC5FbGVtZW50UHJvcGVydHkSDQoFZXJyb3IYAyABKAkiQwoKRWxlbWVudFJlZhIKCgJpZBgBIAEoCRIWCg5xdWFsaWZpZWRfbmFtZRgCIAEoCRIRCgltZXRhY2xhc3MYAyABKAkimAEKD0VsZW1lbnRQcm9wZXJ0eRIMCgRuYW1lGAEgASgJEhYKDmRlZmluaW5nX2NsYXNzGAIgASgJEgwKBG1hbnkYAyABKAgSDwoHZGVyaXZlZBgEIAEoCBIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5FbGVtZW50UHJvcGVydHlWYWx1ZRITCgt1bnN1cHBvcnRlZBgGIAEoCSKwAQoURWxlbWVudFByb3BlcnR5VmFsdWUSJAoHZWxlbWVudBgBIAEoCzIRLnN5c21sLkVsZW1lbnRSZWZIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISAASEwoJaW50X3ZhbHVlGAQgASgDSAASFAoKcmVhbF92YWx1ZRgFIAEoAUgAEhAKBm51bWJlchgGIAEoCUgAQgcKBXZhbHVlIlMKEkRpYWdub3N0aWNzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhQKDGRpc2FibGVfbGludBgCIAMoCRITCgtlbmFibGVfbGludBgDIAMoCSJMChNEaWFnbm9zdGljc1Jlc3BvbnNlEiYKC2RpYWdub3N0aWNzGAEgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxINCgVlcnJvchgCIAEoCSJvCg9FdmFsdWF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRISCgpleHByZXNzaW9uGAIgASgJEhkKEWNvbnRleHRfc3ltYm9sX2lkGAMgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAQgASgJImcKEEV2YWx1YXRlUmVzcG9uc2USHAoGcmVzdWx0GAEgASgLMgwuc3lzbWwuVmFsdWUSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljIuwBCghJbnN0YW5jZRIKCgJpZBgBIAEoAxIWCg50eXBlX3N5bWJvbF9pZBgCIAEoCRI6Cg5mZWF0dXJlX3ZhbHVlcxgEIAMoCzIiLnN5c21sLkluc3RhbmNlLkZlYXR1cmVWYWx1ZXNFbnRyeRIoCgpyZWFjaGVkX2J5GAUgASgLMhQuc3lzbWwuSW5zdGFuY2VSZWFjaBpJChJGZWF0dXJlVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMuc3lzbWwuRmVhdHVyZVZhbHVlOgI4AUoECAMQBFIFc2xvdHMicgoNSW5zdGFuY2VSZWFjaBITCgtpbnN0YW5jZV9pZBgBIAEoAxIUCgxmZWF0dXJlX25hbWUYAiABKAkSGQoRZmVhdHVyZV9zeW1ib2xfaWQYAyABKAkSDQoFaW5kZXgYBCABKAUSDAoEcGF0aBgFIAEoCSKdAQoMRmVhdHVyZVZhbHVlEhQKDGZlYXR1cmVfbmFtZRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlEhwKBnZhbHVlcxgDIAMoCzIMLnN5c21sLlZhbHVlEhQKDG1hdGVyaWFsaXplZBgEIAEoCBINCgVlcnJvchgFIAEoCRIXCg9vcmRlcl9kZXBlbmRlbnQYBiABKAUiOwoSSW5zdGFudGlhdGVSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJIpMBChNJbnN0YW50aWF0ZVJlc3BvbnNlEiEKCGluc3RhbmNlGAEgASgLMg8uc3lzbWwuSW5zdGFuY2USDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiIKCWluc3RhbmNlcxgEIAMoCzIPLnN5c21sLkluc3RhbmNlIlEKFEluc3RhbmNlUGF0aHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSJQoGb2JqZWN0GAIgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QihQEKFUluc3RhbmNlUGF0aHNSZXNwb25zZRIiCgVwYXRocxgBIAMoCzITLnN5c21sLkluc3RhbmNlUGF0aBIRCgl0cnVuY2F0ZWQYAiABKAgSDQoFZXJyb3IYAyABKAkSJgoLZGlhZ25vc3RpY3MYBCADKAsyES5zeXNtbC5EaWFnbm9zdGljImcKDEluc3RhbmNlUGF0aBIhCgRyb290GAEgASgLMhMuc3lzbWwuSW5zdGFuY2VSb290EgwKBHBhdGgYAiABKAkSJgoFc3RlcHMYAyADKAsyFy5zeXNtbC5JbnN0YW5jZVBhdGhTdGVwIjYKDEluc3RhbmNlUm9vdBITCgtpbnN0YW5jZV9pZBgBIAEoAxIRCglzeW1ib2xfaWQYAiABKAkiZwoQSW5zdGFuY2VQYXRoU3RlcBIUCgxmZWF0dXJlX25hbWUYASABKAkSGQoRZmVhdHVyZV9zeW1ib2xfaWQYAiABKAkSDQoFaW5kZXgYAyABKAUSEwoLaW5zdGFuY2VfaWQYBCABKAMi6QIKFEV4ZWN1dGVBY3Rpb25SZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGAoQYWN0aW9uX3N5bWJvbF9pZBgCIAEoCRI3CgZpbnB1dHMYAyADKAsyJy5zeXNtbC5FeGVjdXRlQWN0aW9uUmVxdWVzdC5JbnB1dHNFbnRyeRIQCghzY2hlZHVsZRgEIAEoCRIbChNwZXJmb3JtZXJfc3ltYm9sX2lkGAUgASgJEhQKB2FkdmFuY2UYBiABKAFIAIgBARIRCgRzZWVkGAcgASgESAGIAQESDQoFZHJhd3MYCCABKAkSEgoKY2xvY2tfc3RlcBgJIAEoARINCgV0cmFjZRgKIAEoCBIOCgZldmVudHMYCyADKAkaOwoLSW5wdXRzRW50cnkSCwoDa2V5GAEgASgJEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWU6AjgBQgoKCF9hZHZhbmNlQgcKBV9zZWVkIooFChVFeGVjdXRlQWN0aW9uUmVzcG9uc2USOgoHb3V0cHV0cxgBIAMoCzIpLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PdXRwdXRzRW50cnkSDQoFZXJyb3IYAiABKAkSJgoLZGlhZ25vc3RpY3MYAyADKAsyES5zeXNtbC5EaWFnbm9zdGljEiAKCG91dGNvbWVzGAQgAygLMg4uc3lzbWwuT3V0Y29tZRItCgtleHBsb3JhdGlvbhgFIAEoCzIYLnN5c21sLkV4cGxvcmF0aW9uU3RhdHVzEhIKCmZpbmFsX3RpbWUYBiABKAESUwoUcGVyZm9ybWVyX2F0dHJpYnV0ZXMYByADKAsyNS5zeXNtbC5FeGVjdXRlQWN0aW9uUmVzcG9uc2UuUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EkkKD29yZGVyX2RlcGVuZGVudBgIIAMoCzIwLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5EiMKBXRyYWNlGAkgAygLMhQuc3lzbWwuRG9jdW1lbnRFdmVudBIVCg10cmFjZV9kcm9wcGVkGAogASgFGjwKDE91dHB1dHNFbnRyeRILCgNrZXkYASABKAkSGwoFdmFsdWUYAiABKAsyDC5zeXNtbC5WYWx1ZToCOAEaSAoYUGVyZm9ybWVyQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEi+QEKE0V4ZWN1dGVTdGF0ZVJlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIfChdzdGF0ZV9tYWNoaW5lX3N5bWJvbF9pZBgCIAEoCRIOCgZldmVudHMYAyADKAkSEAoIc2NoZWR1bGUYBCABKAkSGwoTcGVyZm9ybWVyX3N5bWJvbF9pZBgFIAEoCRINCgV0cmFjZRgGIAEoCBIUCgdhZHZhbmNlGAcgASgBSACIAQESEQoEc2VlZBgIIAEoBEgBiAEBEg0KBWRyYXdzGAkgASgJEhIKCmNsb2NrX3N0ZXAYCiABKAFCCgoIX2FkdmFuY2VCBwoFX3NlZWQikAQKFEV4ZWN1dGVTdGF0ZVJlc3BvbnNlEhYKDnN0YXRlc192aXNpdGVkGAEgAygJEkQKDWZpbmFsX2NvbnRleHQYAiADKAsyLS5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5GaW5hbENvbnRleHRFbnRyeRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSIAoIb3V0Y29tZXMYBSADKAsyDi5zeXNtbC5PdXRjb21lEi0KC2V4cGxvcmF0aW9uGAYgASgLMhguc3lzbWwuRXhwbG9yYXRpb25TdGF0dXMSEgoKZmluYWxfdGltZRgHIAEoARIjCgV0cmFjZRgIIAMoCzIULnN5c21sLkRvY3VtZW50RXZlbnQSFQoNdHJhY2VfZHJvcHBlZBgJIAEoBRJICg9vcmRlcl9kZXBlbmRlbnQYCiADKAsyLy5zeXNtbC5FeGVjdXRlU3RhdGVSZXNwb25zZS5PcmRlckRlcGVuZGVudEVudHJ5GkEKEUZpbmFsQ29udGV4dEVudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARo1ChNPcmRlckRlcGVuZGVudEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBToCOAEiwwIKDkNvbnZlcnRSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAlIABIUCgptb2RlbF9oYXNoGAYgASgJSAASEwoLZnJvbV9mb3JtYXQYAyABKAkSEQoJdG9fZm9ybWF0GAQgASgJEh4KFnRvbGVyYXRlX3N5bnRheF9lcnJvcnMYBSABKAgSDwoHaWRfZm9ybRgHIAEoCRIRCglkb2N1bWVudHMYCCADKAkSDwoHY29tcGFjdBgJIAEoCBIUCgxvbWl0X2Rlcml2ZWQYCiABKAgSFAoMa2VlcF9kZXJpdmVkGAsgAygJEiEKGWluY2x1ZGVfY2hlY2tfZGlhZ25vc3RpY3MYDCABKAgSHQoVaW5jbHVkZV9saWJyYXJ5X3N0dWJzGA0gASgIQggKBnNvdXJjZSLpAQoPQ29udmVydFJlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSEwoLZnJvbV9mb3JtYXQYAiABKAkSEQoJdG9fZm9ybWF0GAMgASgJEg0KBWVycm9yGAQgASgJEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIUCgxleHBlcmltZW50YWwYBiABKAgSGwoTZXhwZXJpbWVudGFsX25vdGljZRgHIAEoCRIzChJsaWJyYXJ5X3JlZmVyZW5jZXMYCCADKAsyFy5zeXNtbC5MaWJyYXJ5UmVmZXJlbmNlIloKEExpYnJhcnlSZWZlcmVuY2USCgoCaWQYASABKAkSFgoOcXVhbGlmaWVkX25hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIUCgxsaWJyYXJ5X3BhdGgYBCABKAki7gEKDk1pZ3JhdGVSZXF1ZXN0EhMKCWZpbGVfcGF0aBgBIAEoCUgAEhEKB2NvbnRlbnQYAiABKAxIABITCgtmcm9tX2Zvcm1hdBgDIAEoCRIRCgl0b19mb3JtYXQYBCABKAkSDgoGcmVwb3J0GAUgASgIEg8KB3Jlc3VsdHMYBiABKAgSFQoLbGF5b3V0X3BhdGgYByABKAlIARIYCg5sYXlvdXRfY29udGVudBgIIAEoCUgBEhYKDmltYWdlX2Jhc2VfdXJsGAkgASgJEg4KBnN0cmljdBgKIAEoCEIICgZzb3VyY2VCCAoGbGF5b3V0IuoBCg9NaWdyYXRlUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRITCgtmcm9tX2Zvcm1hdBgCIAEoCRIRCgl0b19mb3JtYXQYAyABKAkSDQoFZXJyb3IYBCABKAkSFAoMZXhwZXJpbWVudGFsGAUgASgIEhsKE2V4cGVyaW1lbnRhbF9ub3RpY2UYBiABKAkSJgoGcmVwb3J0GAcgASgLMhYuc3lzbWwuTWlncmF0aW9uUmVwb3J0Eg8KB3Jlc3VsdHMYCCABKAkSIwoFZmlsZXMYCSADKAsyFC5zeXNtbC5NaWdyYXRpb25GaWxlIsMBCg9NaWdyYXRpb25SZXBvcnQSDgoGc291cmNlGAEgASgJEhAKCGV4cG9ydGVyGAIgASgJEg8KB3N1bW1hcnkYAyABKAkSDgoGbWFwcGVkGAQgASgFEhQKDGFwcHJveGltYXRlZBgFIAEoBRIQCgh1bm1hcHBlZBgGIAEoBRIPCgdza2lwcGVkGAcgASgFEiYKB2VudHJpZXMYCCADKAsyFS5zeXNtbC5NaWdyYXRpb25FbnRyeRIMCgR0ZXh0GAkgASgJImcKDk1pZ3JhdGlvbkVudHJ5EgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSDwoHdmVyZGljdBgFIAEoCRIMCgRub3RlGAYgASgJIi4KDU1pZ3JhdGlvbkZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIn0KEUFwcGx5RWRpdHNSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSKAoKb3BlcmF0aW9ucxgCIAMoCzIULnN5c21sLkVkaXRPcGVyYXRpb24SEAoIZG9jdW1lbnQYAyABKAkSGAoQYWNjZXB0X2RvY3VtZW50cxgEIAEoCCLDBgoNRWRpdE9wZXJhdGlvbhIoCglzZXRfdmFsdWUYASABKAsyEy5zeXNtbC5TZXRWYWx1ZUVkaXRIABIjCgZyZW5hbWUYAiABKAsyES5zeXNtbC5SZW5hbWVFZGl0SAASKgoKYWRkX21lbWJlchgDIAEoCzIULnN5c21sLkFkZE1lbWJlckVkaXRIABIjCgZkZWxldGUYBCABKAsyES5zeXNtbC5EZWxldGVFZGl0SAASHwoEbW92ZRgFIAEoCzIPLnN5c21sLk1vdmVFZGl0SAASMgoOYWRkX2Nvbm5lY3Rpb24YBiABKAsyGC5zeXNtbC5BZGRDb25uZWN0aW9uRWRpdEgAEiwKC2FkZF9zYXRpc2Z5GAcgASgLMhUuc3lzbWwuQWRkU2F0aXNmeUVkaXRIABJJChphZGRfcmVxdWlyZW1lbnRfY29uc3RyYWludBgIIAEoCzIjLnN5c21sLkFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXRIABIyCg5hZGRfdHJhbnNpdGlvbhgJIAEoCzIYLnN5c21sLkFkZFRyYW5zaXRpb25FZGl0SAASKgoKYWRkX2ltcG9ydBgKIAEoCzIULnN5c21sLkFkZEltcG9ydEVkaXRIABI4ChFhZGRfZG9jdW1lbnRhdGlvbhgLIAEoCzIbLnN5c21sLkFkZERvY3VtZW50YXRpb25FZGl0SAASKgoKYWRkX3ZlcmlmeRgMIAEoCzIULnN5c21sLkFkZFZlcmlmeUVkaXRIABIuCgxhZGRfbWV0YWRhdGEYDSABKAsyFi5zeXNtbC5BZGRNZXRhZGF0YUVkaXRIABIuCgxhZGRfc2VxdWVuY2UYDiABKAsyFi5zeXNtbC5BZGRTZXF1ZW5jZUVkaXRIABI7ChNhZGRfbWV0YWRhdGFfcHJlZml4GA8gASgLMhwuc3lzbWwuQWRkTWV0YWRhdGFQcmVmaXhFZGl0SAASLAoLYWRkX2NvbW1lbnQYECABKAsyFS5zeXNtbC5BZGRDb21tZW50RWRpdEgAEiYKCGFkZF9ub3RlGBIgASgLMhIuc3lzbWwuQWRkTm90ZUVkaXRIAEILCglvcGVyYXRpb24ikgIKDUFkZE1lbWJlckVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEgwKBHR5cGUYBCABKAkSFAoMbXVsdGlwbGljaXR5GAUgASgJEg0KBXZhbHVlGAYgASgJEhMKC3NwZWNpYWxpemVzGAcgAygJEhMKC2lzX2Fic3RyYWN0GAggASgIEhEKCXJlZGVmaW5lcxgJIAMoCRISCgppc19kZWZhdWx0GAogASgIEhEKCWRpcmVjdGlvbhgLIAEoCRIZChFtZXRhZGF0YV9wcmVmaXhlcxgOIAMoCRILCgNkb2MYDCABKAkSFwoPYm9keV9leHByZXNzaW9uGA0gASgJInkKDkFkZFNhdGlzZnlFZGl0Eg0KBW93bmVyGAEgASgJEhMKC3JlcXVpcmVtZW50GAIgASgJEhoKEnNhdGlzZnlpbmdfZmVhdHVyZRgDIAEoCRITCgtpc19hc3NlcnRlZBgEIAEoCBISCgppc19uZWdhdGVkGAUgASgIIl0KHEFkZFJlcXVpcmVtZW50Q29uc3RyYWludEVkaXQSDQoFb3duZXIYASABKAkSDAoEa2luZBgCIAEoCRISCgpleHByZXNzaW9uGAMgASgJEgwKBG5hbWUYBCABKAkikQEKEUFkZFRyYW5zaXRpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBG5hbWUYAiABKAkSDgoGc291cmNlGAMgASgJEg4KBnRhcmdldBgEIAEoCRIPCgd0cmlnZ2VyGAUgASgJEg0KBWd1YXJkGAYgASgJEg4KBmVmZmVjdBgHIAEoCRIPCgdpbml0aWFsGAggASgIIjMKDUFkZFZlcmlmeUVkaXQSDQoFb3duZXIYASABKAkSEwoLcmVxdWlyZW1lbnQYAiABKAkiNgoUTWV0YWRhdGFGZWF0dXJlVmFsdWUSDwoHZmVhdHVyZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKUAQoPQWRkTWV0YWRhdGFFZGl0Eg0KBW93bmVyGAEgASgJEhUKDW1ldGFkYXRhX3R5cGUYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVhYm91dBgEIAMoCRIrCgZ2YWx1ZXMYBSADKAsyGy5zeXNtbC5NZXRhZGF0YUZlYXR1cmVWYWx1ZRIRCglzaG9ydGhhbmQYBiABKAgiPgoVQWRkTWV0YWRhdGFQcmVmaXhFZGl0Eg4KBnRhcmdldBgBIAEoCRIVCg1tZXRhZGF0YV90eXBlGAIgASgJIoABCg1BZGRJbXBvcnRFZGl0Eg0KBW93bmVyGAEgASgJEhIKCnZpc2liaWxpdHkYAiABKAkSDgoGdGFyZ2V0GAMgASgJEhQKDGlzX3JlY3Vyc2l2ZRgEIAEoCBIVCg1pc19pbXBvcnRfYWxsGAUgASgIEg8KB2ZpbHRlcnMYBiADKAkiYwoUQWRkRG9jdW1lbnRhdGlvbkVkaXQSDgoGdGFyZ2V0GAEgASgJEgwKBGJvZHkYAiABKAkSDAoEbmFtZRgDIAEoCRIOCgZsb2NhbGUYBCABKAkSDwoHcmVwbGFjZRgFIAEoCCJaCg5BZGRDb21tZW50RWRpdBINCgVvd25lchgBIAEoCRIMCgRib2R5GAIgASgJEgwKBG5hbWUYAyABKAkSDQoFYWJvdXQYBCADKAkSDgoGbG9jYWxlGAUgASgJIisKC0FkZE5vdGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIMCgR0ZXh0GAIgASgJIs0CCg9BZGRTZXF1ZW5jZUVkaXQSDQoFb3duZXIYASABKAkSDwoHa2V5d29yZBgCIAEoCRILCgNyZWYYAyABKAkSEwoLbWVtYmVyX2tpbmQYBCABKAkSEwoLbWVtYmVyX25hbWUYBSABKAkSDAoEdHlwZRgGIAEoCRINCgVhZnRlchgHIAEoCRIRCgljb25kaXRpb24YCCABKAkSDQoFdmFsdWUYCSABKAkSDgoGdGFyZ2V0GAogASgJEgsKA3ZpYRgLIAEoCRINCgV1bnRpbBgMIAEoCRIkCgRib2R5GA0gAygLMhYuc3lzbWwuQWRkU2VxdWVuY2VFZGl0EikKCWVsc2VfYm9keRgOIAMoCzIWLnN5c21sLkFkZFNlcXVlbmNlRWRpdBIUCgxtdWx0aXBsaWNpdHkYDyABKAkSEQoJcGFyYW1ldGVyGBAgASgJIm4KEUFkZENvbm5lY3Rpb25FZGl0Eg0KBW93bmVyGAEgASgJEgwKBGtpbmQYAiABKAkSEAoIZnJvbV9lbmQYAyABKAkSDgoGdG9fZW5kGAQgASgJEgwKBG5hbWUYBSABKAkSDAoEdHlwZRgGIAEoCSItCgpEZWxldGVFZGl0Eg4KBnRhcmdldBgBIAEoCRIPCgdjYXNjYWRlGAIgASgIIikKCE1vdmVFZGl0Eg4KBnRhcmdldBgBIAEoCRINCgVvd25lchgCIAEoCSItCgxTZXRWYWx1ZUVkaXQSDgoGdGFyZ2V0GAEgASgJEg0KBXZhbHVlGAIgASgJIi4KClJlbmFtZUVkaXQSDgoGdGFyZ2V0GAEgASgJEhAKCG5ld19uYW1lGAIgASgJIpACChJBcHBseUVkaXRzUmVzcG9uc2USDwoHY29udGVudBgBIAEoCRIjCgdhcHBsaWVkGAIgAygLMhIuc3lzbWwuQXBwbGllZEVkaXQSDQoFZXJyb3IYAyABKAkSIwoHZmFpbHVyZRgEIAEoDjISLnN5c21sLkVkaXRGYWlsdXJlEiYKC2RpYWdub3N0aWNzGAUgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIaChJyZWZlcnJpbmdfZWxlbWVudHMYBiADKAkSKAoJZG9jdW1lbnRzGAcgAygLMhUuc3lzbWwuRWRpdGVkRG9jdW1lbnQSIgoJcmVmZXJyZXJzGAggAygLMg8uc3lzbWwuUmVmZXJyZXIiLwoORWRpdGVkRG9jdW1lbnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJIioKCFJlZmVycmVyEgwKBG5hbWUYASABKAkSEAoIZG9jdW1lbnQYAiABKAkijAEKC0FwcGxpZWRFZGl0EhcKD29wZXJhdGlvbl9pbmRleBgBIAEoBRIOCgZ0YXJnZXQYAiABKAkSDgoGb2Zmc2V0GAMgASgFEg4KBmxlbmd0aBgEIAEoBRIQCghvbGRfdGV4dBgFIAEoCRIQCghuZXdfdGV4dBgGIAEoCRIQCghkb2N1bWVudBgHIAEoCSLDAwoKU3ltYm9sSW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSMQoIbWV0YWRhdGEYBCADKAsyHy5zeXNtbC5TeW1ib2xJbmZvLk1ldGFkYXRhRW50cnkSEQoJY2hpbGRfaWRzGAUgAygJEigKCmF0dHJpYnV0ZXMYBiADKAsyFC5zeXNtbC5BdHRyaWJ1dGVJbmZvEiIKCXR5cGVfaW5mbxgHIAEoCzIPLnN5c21sLlR5cGVJbmZvEi0KDG11bHRpcGxpY2l0eRgIIAEoCzIXLnN5c21sLk11bHRpcGxpY2l0eUluZm8SLgoPc3BlY2lhbGl6YXRpb25zGAkgAygLMhUuc3lzbWwuU3BlY2lhbGl6YXRpb24SIwobd2l0aGhlbGRfbGlicmFyeV9hdHRyaWJ1dGVzGAogASgFEiIKB21lbWJlcnMYCyADKAsyES5zeXNtbC5NZW1iZXJJbmZvEiAKGHdpdGhoZWxkX2xpYnJhcnlfbWVtYmVycxgMIAEoBRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEicAoKTWVtYmVySW5mbxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSEQoJaW5oZXJpdGVkGAQgASgIEhYKDmluaGVyaXRlZF9mcm9tGAUgASgJEg8KB2xpYnJhcnkYBiABKAgiWAoOU3BlY2lhbGl6YXRpb24SDAoEa2luZBgBIAEoCRIQCghkZWNsYXJlZBgCIAEoCRIRCgl0YXJnZXRfaWQYAyABKAkSEwoLdGFyZ2V0X2tpbmQYBCABKAkitAEKCFR5cGVJbmZvEhAKCGRlY2xhcmVkGAEgASgJEhMKC3Jlc29sdmVkX2lkGAIgASgJEhUKDXJlc29sdmVkX2tpbmQYAyABKAkSEQoJcHJpbWl0aXZlGAQgASgJEhgKEHByaW1pdGl2ZV9zb3VyY2UYBSABKAkSEAoIcXVhbnRpdHkYBiABKAgSDAoEdW5pdBgHIAEoCRIdCgV0eXBlcxgIIAMoCzIOLnN5c21sLlR5cGVSZWYiIwoHVHlwZVJlZhIKCgJpZBgBIAEoCRIMCgRraW5kGAIgASgJIjAKEE11bHRpcGxpY2l0eUluZm8SDQoFbG93ZXIYASABKAkSDQoFdXBwZXIYAiABKAkiVgoNQXR0cmlidXRlSW5mbxIMCgRuYW1lGAEgASgJEgwKBHR5cGUYAiABKAkSGwoFdmFsdWUYAyABKAsyDC5zeXNtbC5WYWx1ZRIMCgR1bml0GAQgASgJIocGCgVWYWx1ZRITCglpbnRfdmFsdWUYASABKANIABIUCgpyZWFsX3ZhbHVlGAIgASgBSAASFAoKYm9vbF92YWx1ZRgDIAEoCEgAEhYKDHN0cmluZ192YWx1ZRgEIAEoCUgAEhUKC2luc3RhbmNlX2lkGAUgASgDSAASKAoIc2VxdWVuY2UYBiABKAsyFC5zeXNtbC5WYWx1ZVNlcXVlbmNlSAASDgoEbnVsbBgHIAEoCUgAEiMKCHF1YW50aXR5GAggASgLMg8uc3lzbWwuUXVhbnRpdHlIABIqCgxlbnVtX2xpdGVyYWwYCSABKAsyEi5zeXNtbC5FbnVtTGl0ZXJhbEgAEg8KBXVuc2V0GAogASgISAASIQoHY29tcGxleBgLIAEoCzIOLnN5c21sLkNvbXBsZXhIABIdCgVhcnJheRgMIAEoCzIMLnN5c21sLkFycmF5SAASHwoGdmVjdG9yGA0gASgLMg0uc3lzbWwuVmVjdG9ySAASMAoPdmVjdG9yX3F1YW50aXR5GA4gASgLMhUuc3lzbWwuVmVjdG9yUXVhbnRpdHlIABIwCg9tZWFzdXJlbWVudF9yZWYYDyABKAsyFS5zeXNtbC5NZWFzdXJlbWVudFJlZkgAEhIKCGluZmluaXR5GBAgASgISAASIwoIZnVuY3Rpb24YESABKAsyDy5zeXNtbC5GdW5jdGlvbkgAEh4KA3NldBgSIAEoCzIPLnN5c21sLlZhbHVlU2V0SAASMAoPdGVuc29yX3F1YW50aXR5GBMgASgLMhUuc3lzbWwuVGVuc29yUXVhbnRpdHlIABInCgptZXRhb2JqZWN0GBQgASgLMhEuc3lzbWwuTWV0YW9iamVjdEgAEisKDHVuZGV0ZXJtaW5lZBgVIAEoCzITLnN5c21sLlVuZGV0ZXJtaW5lZEgAEhcKDWJpZ19pbnRfdmFsdWUYFiABKAlIABIpCg5yYXRpb25hbF92YWx1ZRgXIAEoCzIPLnN5c21sLlJhdGlvbmFsSABCBgoEa2luZCIyCghSYXRpb25hbBIRCgludW1lcmF0b3IYASABKAkSEwoLZGVub21pbmF0b3IYAiABKAkiNgoKTWV0YW9iamVjdBISCgplbGVtZW50X2lkGAEgASgJEhQKDG1ldGFjbGFzc19pZBgCIAEoCSJGCgxVbmRldGVybWluZWQSDgoGcmVhc29uGAEgASgJEiYKBWNvdW50GAIgASgLMhcuc3lzbWwuTXVsdGlwbGljaXR5SW5mbyIsCghGdW5jdGlvbhIPCgdjYWxjX2lkGAEgASgJEg8KB3NlbGZfaWQYAiABKAMiKgoIVmFsdWVTZXQSHgoIZWxlbWVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSJJCg5UZW5zb3JRdWFudGl0eRISCgpkaW1lbnNpb25zGAEgAygDEiMKCmNvbXBvbmVudHMYAiADKAsyDy5zeXNtbC5RdWFudGl0eSI7CgVBcnJheRISCgpkaW1lbnNpb25zGAEgAygDEh4KCGVsZW1lbnRzGAIgAygLMgwuc3lzbWwuVmFsdWUiKgoGVmVjdG9yEiAKCmNvbXBvbmVudHMYASADKAsyDC5zeXNtbC5WYWx1ZSI1Cg5WZWN0b3JRdWFudGl0eRIjCgpjb21wb25lbnRzGAEgAygLMg8uc3lzbWwuUXVhbnRpdHkiKgoHQ29tcGxleBIMCgRyZWFsGAEgASgBEhEKCWltYWdpbmFyeRgCIAEoASJkCgtFbnVtTGl0ZXJhbBISCgpsaXRlcmFsX2lkGAEgASgJEhYKDmVudW1lcmF0aW9uX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSGwoFdmFsdWUYBCABKAsyDC5zeXNtbC5WYWx1ZSIvCg1WYWx1ZVNlcXVlbmNlEh4KCGVsZW1lbnRzGAEgAygLMgwuc3lzbWwuVmFsdWUiyAEKCFF1YW50aXR5EhcKDWludF9tYWduaXR1ZGUYASABKANIABIYCg5yZWFsX21hZ25pdHVkZRgCIAEoAUgAEhsKEWJpZ19pbnRfbWFnbml0dWRlGAUgASgJSAASLQoScmF0aW9uYWxfbWFnbml0dWRlGAYgASgLMg8uc3lzbWwuUmF0aW9uYWxIABIMCgR1bml0GAMgASgJEiIKCXVuaXRfdGVybRgEIAEoCzIPLnN5c21sLlVuaXRUZXJtQgsKCW1hZ25pdHVkZSJTCg5NZWFzdXJlbWVudFJlZhIMCgR1bml0GAEgASgJEiIKCXVuaXRfdGVybRgCIAEoCzIPLnN5c21sLlVuaXRUZXJtEg8KB3VuaXRfaWQYAyABKAkiVAoIVW5pdFRlcm0SEQoJc2NhbGVfbnVtGAEgASgBEhEKCXNjYWxlX2RlbhgCIAEoARIiCgdmYWN0b3JzGAMgAygLMhEuc3lzbWwuVW5pdEZhY3RvciIvCgpVbml0RmFjdG9yEg8KB3VuaXRfaWQYASABKAkSEAoIZXhwb25lbnQYAiABKAEihgEKCkRpYWdub3N0aWMSEAoIc2V2ZXJpdHkYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIZCgRzcGFuGAMgASgLMgsuc3lzbWwuU3BhbhIMCgRjb2RlGAQgASgJEhcKD29yZGVyX2RlcGVuZGVudBgFIAMoCRITCgtpbmRlcGVuZGVudBgGIAEoCCJeCgRTcGFuEgwKBGZpbGUYASABKAkSEgoKc3RhcnRfbGluZRgCIAEoBRIRCglzdGFydF9jb2wYAyABKAUSEAoIZW5kX2xpbmUYBCABKAUSDwoHZW5kX2NvbBgFIAEoBSITChFTZXJ2ZXJJbmZvUmVxdWVzdCI7ChJTZXJ2ZXJJbmZvUmVzcG9uc2USDwoHdmVyc2lvbhgBIAEoCRIUCgxjYXBhYmlsaXRpZXMYAiADKAkiZAoMUXVlcnlSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGwoFcXVlcnkYAiABKAsyDC5zeXNtbC5RdWVyeRISCgpvc2xjX3F1ZXJ5GAMgASgJEg8KB2FzX3ZpZXcYBCABKAgiUQoNUXVlcnlSZXNwb25zZRIrCghlbGVtZW50cxgBIAMoCzIZLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudBITCgtyZXN1bHRfdmlldxgCIAEoCSJaCgVRdWVyeRINCgVzY29wZRgBIAMoCRIOCgZzZWxlY3QYAiADKAkSIAoFd2hlcmUYAyABKAsyES5zeXNtbC5Db25zdHJhaW50EhAKCG9yZGVyX2J5GAQgAygJInwKCkNvbnN0cmFpbnQSLwoJcHJpbWl0aXZlGAEgASgLMhouc3lzbWwuUHJpbWl0aXZlQ29uc3RyYWludEgAEi8KCWNvbXBvc2l0ZRgCIAEoCzIaLnN5c21sLkNvbXBvc2l0ZUNvbnN0cmFpbnRIAEIMCgpjb25zdHJhaW50InMKE1ByaW1pdGl2ZUNvbnN0cmFpbnQSDwoHaW52ZXJzZRgBIAEoCBIQCghwcm9wZXJ0eRgCIAEoCRIqCghvcGVyYXRvchgDIAEoDjIYLnN5c21sLlByaW1pdGl2ZU9wZXJhdG9yEg0KBXZhbHVlGAQgAygJImgKE0NvbXBvc2l0ZUNvbnN0cmFpbnQSKgoIb3BlcmF0b3IYASABKA4yGC5zeXNtbC5Db21wb3NpdGVPcGVyYXRvchIlCgpjb25zdHJhaW50GAIgAygLMhEuc3lzbWwuQ29uc3RyYWludCKuAQoSUXVlcnlSZXN1bHRFbGVtZW50EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSPQoKcHJvcGVydGllcxgDIAMoCzIpLnN5c21sLlF1ZXJ5UmVzdWx0RWxlbWVudC5Qcm9wZXJ0aWVzRW50cnkSDAoEcGF0aBgEIAEoCRoxCg9Qcm9wZXJ0aWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJzCgpTd2VlcFJhbmdlEhEKCXBhcmFtZXRlchgBIAEoCRIbCgVzdGFydBgCIAEoCzIMLnN5c21sLlZhbHVlEhkKA2VuZBgDIAEoCzIMLnN5c21sLlZhbHVlEhoKBHN0ZXAYBCABKAsyDC5zeXNtbC5WYWx1ZSLQAgoPUnVuU3dlZXBSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEQoJc3ltYm9sX2lkGAIgASgJEhkKEXN1YmplY3Rfc3ltYm9sX2lkGAMgASgJEh8KCWFyZ3VtZW50cxgEIAMoCzIMLnN5c21sLlZhbHVlEkMKD25hbWVkX2FyZ3VtZW50cxgFIAMoCzIqLnN5c21sLlJ1blN3ZWVwUmVxdWVzdC5OYW1lZEFyZ3VtZW50c0VudHJ5EiEKBnJhbmdlcxgGIAMoCzIRLnN5c21sLlN3ZWVwUmFuZ2USDwoHc2FtcGxlcxgHIAEoAxIMCgRzZWVkGAggASgEEg4KBmVuZ2luZRgJIAEoCRpDChNOYW1lZEFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ASL0AQoIU3dlZXBSb3cSIQoGaW5wdXRzGAEgAygLMhEuc3lzbWwuQ2FsY091dHB1dBIiCgdvdXRwdXRzGAIgAygLMhEuc3lzbWwuQ2FsY091dHB1dBIgCgh2ZXJkaWN0cxgDIAMoCzIOLnN5c21sLlZlcmRpY3QSFgoOZWxhcHNlZF9taWNyb3MYBCABKAMSDQoFZXJyb3IYBSABKAkSLAoOZmFpbHVyZV9yZWFzb24YBiABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEioKC2V2YWx1YXRpb25zGAcgAygLMhUuc3lzbWwuQ2FzZUV2YWx1YXRpb24irQIKEFJ1blN3ZWVwUmVzcG9uc2USHQoEcm93cxgBIAMoCzIPLnN5c21sLlN3ZWVwUm93EhIKCnBhcmFtZXRlcnMYAiADKAkSDwoHc2FtcGxlZBgDIAEoCBIMCgRzZWVkGAQgASgEEg0KBWVycm9yGAUgASgJEiYKC2RpYWdub3N0aWNzGAYgAygLMhEuc3lzbWwuRGlhZ25vc3RpYxIsCg5mYWlsdXJlX3JlYXNvbhgHIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SIgoJaW5zdGFuY2VzGAggAygLMg8uc3lzbWwuSW5zdGFuY2USDgoGZW5naW5lGAkgASgJEhAKCHN0cmVuZ3RoGAogASgJEhwKBmJvdW5kcxgLIAMoCzIMLnN5c21sLkJvdW5kIpoECg5SdW5SdW5zUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhgKEGFjdGlvbl9zeW1ib2xfaWQYAiABKAkSGgoSYW5hbHlzaXNfc3ltYm9sX2lkGAMgASgJEjEKBmlucHV0cxgEIAMoCzIhLnN5c21sLlJ1blJ1bnNSZXF1ZXN0LklucHV0c0VudHJ5EhsKE3BlcmZvcm1lcl9zeW1ib2xfaWQYBSABKAkSGQoRc3ViamVjdF9zeW1ib2xfaWQYBiABKAkSHwoJYXJndW1lbnRzGAcgAygLMgwuc3lzbWwuVmFsdWUSQgoPbmFtZWRfYXJndW1lbnRzGAggAygLMikuc3lzbWwuUnVuUnVuc1JlcXVlc3QuTmFtZWRBcmd1bWVudHNFbnRyeRIMCgRydW5zGAkgASgDEhEKBHNlZWQYCiABKARIAIgBARINCgVkcmF3cxgLIAEoCRISCgpjbG9ja19zdGVwGAwgASgBEg8KB29ic2VydmUYDSADKAkSDgoGZW5naW5lGA4gASgJGjsKC0lucHV0c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4ARpDChNOYW1lZEFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4AUIHCgVfc2VlZCKwAgoPUnVuRGlzdHJpYnV0aW9uEgwKBG5hbWUYASABKAkSDAoEdW5pdBgCIAEoCRINCgVjb3VudBgDIAEoAxIPCgdudW1lcmljGAQgASgIEhkKA21pbhgFIAEoCzIMLnN5c21sLlZhbHVlEhkKA21heBgGIAEoCzIMLnN5c21sLlZhbHVlEhoKBG1lYW4YByABKAsyDC5zeXNtbC5WYWx1ZRIRCglkZXZpYXRpb24YCCABKAESKQoLcGVyY2VudGlsZXMYCSADKAsyFC5zeXNtbC5SdW5QZXJjZW50aWxlEikKCWhpc3RvZ3JhbRgKIAMoCzIWLnN5c21sLlJ1bkhpc3RvZ3JhbUJpbhImCgZ2YWx1ZXMYCyADKAsyFi5zeXNtbC5SdW5Db3VudGVkVmFsdWUiQAoNUnVuUGVyY2VudGlsZRISCgpwZXJjZW50aWxlGAEgASgBEhsKBXZhbHVlGAIgASgLMgwuc3lzbWwuVmFsdWUiVwoPUnVuSGlzdG9ncmFtQmluEhkKA2xvdxgBIAEoCzIMLnN5c21sLlZhbHVlEhoKBGhpZ2gYAiABKAsyDC5zeXNtbC5WYWx1ZRINCgVjb3VudBgDIAEoAyI9Cg9SdW5Db3VudGVkVmFsdWUSGwoFdmFsdWUYASABKAsyDC5zeXNtbC5WYWx1ZRINCgVjb3VudBgCIAEoAyJCChBTZWxmQ2hlY2tSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSGgoSc2VsZl9jaGVja19wYWNrYWdlGAIgAygJIokBChBTZWxmQ2hlY2tGaW5kaW5nEg4KBnN0YXR1cxgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhAKCGxvY2F0aW9uGAMgASgJEhIKCmNvbnN0cmFpbnQYBCABKAkSDwoHZWxlbWVudBgFIAEoCRIPCgdtZXNzYWdlGAYgASgJEgwKBGxpbmUYByABKAkiOQoUU2VsZkNoZWNrQXBwbGljYXRpb24SEgoKY29uc3RyYWludBgBIAEoCRINCgVjb3VudBgCIAEoAyKvAgoRU2VsZkNoZWNrUmVzcG9uc2USDgoGc3RhdHVzGAEgASgJEikKCGZpbmRpbmdzGAIgAygLMhcuc3lzbWwuU2VsZkNoZWNrRmluZGluZxIQCghlbGVtZW50cxgDIAEoAxIOCgZjaGVja3MYBCABKAMSEgoKdmlvbGF0aW9ucxgFIAEoAxITCgt1bmV2YWx1YXRlZBgGIAEoAxIZChFldmFsdWF0aW9uX2Vycm9ycxgHIAEoAxIxCgxhcHBsaWNhdGlvbnMYCCADKAsyGy5zeXNtbC5TZWxmQ2hlY2tBcHBsaWNhdGlvbhIPCgdzdW1tYXJ5GAkgASgJEg0KBWVycm9yGAogASgJEiYKC2RpYWdub3N0aWNzGAsgAygLMhEuc3lzbWwuRGlhZ25vc3RpYyKVAwoQUmVjb3JkUnVuUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhoKEmFuYWx5c2lzX3N5bWJvbF9pZBgCIAEoCRIZChFzdWJqZWN0X3N5bWJvbF9pZBgDIAEoCRIfCglhcmd1bWVudHMYBCADKAsyDC5zeXNtbC5WYWx1ZRJECg9uYW1lZF9hcmd1bWVudHMYBSADKAsyKy5zeXNtbC5SZWNvcmRSdW5SZXF1ZXN0Lk5hbWVkQXJndW1lbnRzRW50cnkSDgoGZW5naW5lGAYgASgJEhMKC3JlY29yZF9pbnRvGAcgASgJEiEKBnJhbmdlcxgIIAMoCzIRLnN5c21sLlN3ZWVwUmFuZ2USDAoEcnVucxgJIAEoAxIRCgRzZWVkGAogASgESACIAQESGAoQYWNjZXB0X2RvY3VtZW50cxgLIAEoCBpDChNOYW1lZEFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIbCgV2YWx1ZRgCIAEoCzIMLnN5c21sLlZhbHVlOgI4AUIHCgVfc2VlZCKoAwoRUmVjb3JkUnVuUmVzcG9uc2USJwoDcnVuGAEgASgLMhouc3lzbWwuUnVuQW5hbHlzaXNSZXNwb25zZRImCgVzd2VlcBgCIAEoCzIXLnN5c21sLlJ1blN3ZWVwUmVzcG9uc2USJgoGc2FtcGxlGAMgASgLMhYuc3lzbWwuUnVuUnVuc1Jlc3BvbnNlEg8KB3BhY2thZ2UYBCABKAkSEgoKZGVmaW5pdGlvbhgFIAEoCRIPCgdyZWNvcmRzGAYgAygJEg4KBnNvdXJjZRgHIAEoCRIPCgdjb250ZW50GAggASgJEigKCWRvY3VtZW50cxgJIAMoCzIVLnN5c21sLkVkaXRlZERvY3VtZW50Eg8KB3NraXBwZWQYCiABKAMSDwoHcmVhc29ucxgLIAMoCRINCgVlcnJvchgMIAEoCRIsCg5mYWlsdXJlX3JlYXNvbhgNIAEoDjIULnN5c21sLkZhaWx1cmVSZWFzb24SJgoLZGlhZ25vc3RpY3MYDiADKAsyES5zeXNtbC5EaWFnbm9zdGljEhIKCm1vZGVsX2hhc2gYDyABKAkiwwMKD1J1blJ1bnNSZXNwb25zZRIdCgRyb3dzGAEgAygLMg8uc3lzbWwuU3dlZXBSb3cSEwoLb2JzZXJ2YWJsZXMYAiADKAkSLQoNZGlzdHJpYnV0aW9ucxgDIAMoCzIWLnN5c21sLlJ1bkRpc3RyaWJ1dGlvbhINCgVsaW5lcxgEIAMoCRIiCgdvdXRwdXRzGAUgAygLMhEuc3lzbWwuQ2FsY091dHB1dBIgCgh2ZXJkaWN0cxgGIAMoCzIOLnN5c21sLlZlcmRpY3QSEwoLdW5jb25jbHVkZWQYByABKAkSDQoFZXJyb3IYCCABKAkSJgoLZGlhZ25vc3RpY3MYCSADKAsyES5zeXNtbC5EaWFnbm9zdGljEiwKDmZhaWx1cmVfcmVhc29uGAogASgOMhQuc3lzbWwuRmFpbHVyZVJlYXNvbhIiCglpbnN0YW5jZXMYCyADKAsyDy5zeXNtbC5JbnN0YW5jZRIOCgZlbmdpbmUYDCABKAkSEAoIc3RyZW5ndGgYDSABKAkSHAoGYm91bmRzGA4gAygLMgwuc3lzbWwuQm91bmQSEQoEc2VlZBgPIAEoBEgAiAEBQgcKBV9zZWVkIpUBChdSdW5Eb2N1bWVudFF1ZXJ5UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEhAKCHF1ZXJ5X2lkGAIgASgJEi0KCGJpbmRpbmdzGAMgAygLMhsuc3lzbWwuRG9jdW1lbnRRdWVyeUJpbmRpbmcSFAoMaW5saW5lX3F1ZXJ5GAQgASgJEg8KB2FzX3ZpZXcYBSABKAgiTwoURG9jdW1lbnRRdWVyeUJpbmRpbmcSEQoJcGFyYW1ldGVyGAEgASgJEiQKBnZhbHVlcxgCIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUiuwMKDURvY3VtZW50VmFsdWUSFAoKZWxlbWVudF9pZBgBIAEoCUgAEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhMKCWludF92YWx1ZRgDIAEoA0gAEhQKCnJlYWxfdmFsdWUYBCABKAFIABIUCgpib29sX3ZhbHVlGAUgASgISAASEgoIaW5maW5pdHkYBiABKAhIABIjCghxdWFudGl0eRgIIAEoCzIPLnN5c21sLlF1YW50aXR5SAASKQoHdmVyZGljdBgJIAEoCzIWLnN5c21sLkRvY3VtZW50VmVyZGljdEgAEicKBm9iamVjdBgKIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0SAASJQoFc3RhdGUYCyABKAsyFC5zeXNtbC5Eb2N1bWVudFN0YXRlSAASJQoFZXZlbnQYDCABKAsyFC5zeXNtbC5Eb2N1bWVudEV2ZW50SAASFwoNYmlnX2ludF92YWx1ZRgNIAEoCUgAEikKDnJhdGlvbmFsX3ZhbHVlGA4gASgLMg8uc3lzbWwuUmF0aW9uYWxIABIUCgxlbGVtZW50X3R5cGUYByABKAlCBgoEa2luZCJaCg5Eb2N1bWVudE9iamVjdBITCgtpbnN0YW5jZV9pZBgBIAEoAxIMCgRwYXRoGAIgASgJEiUKB2VsZW1lbnQYAyABKAsyFC5zeXNtbC5Eb2N1bWVudFZhbHVlIq4BCg9Eb2N1bWVudFZlcmRpY3QSJwoJYXNzZXJ0aW9uGAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIMCgRraW5kGAIgASgJEgwKBHRleHQYAyABKAkSDAoEcGF0aBgEIAEoCRIPCgd2ZXJkaWN0GAUgASgJEhEKCWNvbmRpdGlvbhgGIAEoCRIOCgZyZWFzb24YByABKAkSFAoMdmVyaWZpY2F0aW9uGAggAygJIrEBCg1Eb2N1bWVudFN0YXRlEiUKBm9iamVjdBgBIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg8KB21hY2hpbmUYAiABKAkSDAoEbmFtZRgDIAEoCRISCgpzdGF0ZV9wYXRoGAQgASgJEiMKBXN0YXRlGAUgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRIOCgZyZWdpb24YBiABKAkSEQoJZW5jbG9zaW5nGAcgAygJIucCCg1Eb2N1bWVudEV2ZW50EgwKBGtpbmQYASABKAkSIgoEdGltZRgCIAEoCzIULnN5c21sLkRvY3VtZW50VmFsdWUSJQoGb2JqZWN0GAMgASgLMhUuc3lzbWwuRG9jdW1lbnRPYmplY3QSDwoHbWFjaGluZRgEIAEoCRINCgVzdGF0ZRgFIAEoCRIMCgRmcm9tGAYgASgJEgoKAnRvGAcgASgJEiUKBnRhcmdldBgIIAEoCzIVLnN5c21sLkRvY3VtZW50T2JqZWN0Eg0KBWV2ZW50GAkgASgJEg8KB3BheWxvYWQYCiADKAkSFAoMYWx0ZXJuYXRpdmVzGAsgAygJEg0KBXRha2VuGAwgASgJEgwKBHRleHQYDSABKAkSDQoFdG9rZW4YDiABKAMSDAoEc3RlcBgPIAEoBRIPCgdmZWF0dXJlGBAgASgJEhsKBXZhbHVlGBEgASgLMgwuc3lzbWwuVmFsdWUiIwoTRG9jdW1lbnRRdWVyeUNvbHVtbhIMCgRuYW1lGAEgASgJIjkKEURvY3VtZW50UXVlcnlDZWxsEiQKBnZhbHVlcxgBIAMoCzIULnN5c21sLkRvY3VtZW50VmFsdWUiYgoQRG9jdW1lbnRRdWVyeVJvdxIlCgdlbGVtZW50GAEgASgLMhQuc3lzbWwuRG9jdW1lbnRWYWx1ZRInCgVjZWxscxgCIAMoCzIYLnN5c21sLkRvY3VtZW50UXVlcnlDZWxsIoMBChhSdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USKwoHY29sdW1ucxgBIAMoCzIaLnN5c21sLkRvY3VtZW50UXVlcnlDb2x1bW4SJQoEcm93cxgCIAMoCzIXLnN5c21sLkRvY3VtZW50UXVlcnlSb3cSEwoLcmVzdWx0X3ZpZXcYAyABKAkiHwoPUXVlcnlSZXN1bHRWaWV3EgwKBHRleHQYASABKAki8QEKDFF1ZXJ5T3V0Y29tZRIMCgRraW5kGAEgASgJEgwKBHN0ZXAYAiABKAkSJQoIZmFpbHVyZXMYAyADKAsyEy5zeXNtbC5RdWVyeUZhaWx1cmUSJQoIZmluZGluZ3MYBCADKAsyEy5zeXNtbC5RdWVyeUZpbmRpbmcSKgoNcGF0aF9mYWlsdXJlcxgFIAMoCzITLnN5c21sLlF1ZXJ5RmFpbHVyZRIWCg5mYWlsdXJlc190b3RhbBgGIAEoBRIWCg5maW5kaW5nc190b3RhbBgHIAEoBRIbChNwYXRoX2ZhaWx1cmVzX3RvdGFsGAggASgFIlYKDFF1ZXJ5RmFpbHVyZRIMCgRzdGVwGAEgASgJEhAKCGV4cGVjdGVkGAIgASgJEiYKCGZyb250aWVyGAMgASgLMhQuc3lzbWwuUXVlcnlGcm9udGllciLbAQoNUXVlcnlGcm9udGllchIKCgJhdBgBIAEoCRIrCgdtZW1iZXJzGAIgAygLMhouc3lzbWwuUXVlcnlGcm9udGllck1lbWJlchItCghmZWF0dXJlcxgDIAMoCzIbLnN5c21sLlF1ZXJ5RnJvbnRpZXJGZWF0dXJlEg0KBWtpbmRzGAQgAygJEg8KB25lYXJlc3QYBSABKAkSFQoNbWVtYmVyc190b3RhbBgGIAEoBRIWCg5mZWF0dXJlc190b3RhbBgHIAEoBRITCgtraW5kc190b3RhbBgIIAEoBSI2ChNRdWVyeUZyb250aWVyTWVtYmVyEgwKBG5hbWUYASABKAkSEQoJbWV0YWNsYXNzGAIgASgJIjIKFFF1ZXJ5RnJvbnRpZXJGZWF0dXJlEgwKBG5hbWUYASABKAkSDAoEdHlwZRgCIAEoCSJTCgxRdWVyeUZpbmRpbmcSDAoEc3RlcBgBIAEoCRIPCgdlbGVtZW50GAIgASgJEhIKCmNvbnN0cmFpbnQYAyABKAkSEAoIb2JzZXJ2ZWQYBCABKAkiTgoVUmVuZGVyRG9jdW1lbnRSZXF1ZXN0EhIKCm1vZGVsX2hhc2gYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSDAoEZm9ybRgDIAEoCSJdChZSZW5kZXJEb2N1bWVudFJlc3BvbnNlEhAKCG1hcmtkb3duGAEgASgJEgwKBGh0bWwYAiABKAkSEAoIYXNjaWlkb2MYBCABKAkSEQoJZmlsZV9uYW1lGAMgASgJIoUBChFSZW5kZXJWaWV3UmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEgwKBHZpZXcYAiABKAkSDQoFcG9ydHMYAyABKAkSDAoEc2hvdxgEIAMoCRINCgVkZXB0aBgFIAEoBRIUCgxjb21wYXJ0bWVudHMYBiABKAkSDAoEZm9ybRgHIAEoCSKbAwoSUmVuZGVyVmlld1Jlc3BvbnNlEgwKBHZpZXcYASABKAkSDAoEa2luZBgCIAEoCRIOCgZzdGF0ZWQYAyABKAkSIAoFbm9kZXMYBCADKAsyES5zeXNtbC5SZW5kZXJOb2RlEiAKBWVkZ2VzGAUgAygLMhEuc3lzbWwuUmVuZGVyRWRnZRIPCgdjb2x1bW5zGAYgAygJEh4KBHJvd3MYByADKAsyEC5zeXNtbC5SZW5kZXJSb3cSIwoGY2FudmFzGAggASgLMhMuc3lzbWwuUmVuZGVyQ2FudmFzEiAKBW5vdGVzGAkgAygLMhEuc3lzbWwuUmVuZGVyTm90ZRIPCgdub3RpY2VzGAogAygJEg0KBXNob3duGAsgAygJEiEKBWZyYW1lGAwgASgLMhIuc3lzbWwuUmVuZGVyRnJhbWUSKAoGaGVhZGVyGA0gAygLMhguc3lzbWwuUmVuZGVySGVhZGVyRmllbGQSEAoIbWFya2Rvd24YDiABKAkSDAoEaHRtbBgPIAEoCRIQCghhc2NpaWRvYxgQIAEoCSIwChFSZW5kZXJIZWFkZXJGaWVsZBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJImAKC1JlbmRlckZyYW1lEgwKBG5hbWUYASABKAkSDAoEdHlwZRgCIAEoCRIPCgdleHBvc2VzGAMgAygJEg8KB2ZpbHRlcnMYBCADKAkSEwoLYW5ub3RhdGlvbnMYBSADKAki8AIKClJlbmRlck5vZGUSCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEhgKEG5hbWVfc3ludGhlc2l6ZWQYBCABKAgSDAoEdHlwZRgFIAEoCRIOCgZkZXRhaWwYBiABKAkSDAoEdGV4dBgHIAEoCRIQCghzdGFuZF9pbhgIIAEoCBIOCgZwYXJlbnQYCSABKAkSIAoFcG9ydHMYCiADKAsyES5zeXNtbC5SZW5kZXJQb3J0EhsKBm9yaWdpbhgLIAEoCzILLnN5c21sLlNwYW4SJwoIZ2VvbWV0cnkYDCABKAsyFS5zeXNtbC5SZW5kZXJHZW9tZXRyeRIhCgVzdHlsZRgNIAEoCzISLnN5c21sLlJlbmRlclN0eWxlEhMKC2NvbXBhcnRtZW50GA4gASgJEhEKCWluaGVyaXRlZBgPIAEoCBINCgVhcnJvdxgQIAEoCRIQCghwYXJhbGxlbBgRIAEoCCJaCgpSZW5kZXJQb3J0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIRCglkaXJlY3Rpb24YBCABKAkSEQoJaW5oZXJpdGVkGAUgASgIItgBCgpSZW5kZXJFZGdlEgwKBGZyb20YASABKAkSCgoCdG8YAiABKAkSEQoJZnJvbV9wb3J0GAMgASgJEg8KB3RvX3BvcnQYBCABKAkSDQoFbGFiZWwYBSABKAkSDAoEbmFtZRgGIAEoCRIMCgRraW5kGAcgASgJEhsKBm9yaWdpbhgIIAEoCzILLnN5c21sLlNwYW4SIQoFcm91dGUYCSADKAsyEi5zeXNtbC5SZW5kZXJQb2ludBIhCgVzdHlsZRgKIAEoCzISLnN5c21sLlJlbmRlclN0eWxlInwKDlJlbmRlckdlb21ldHJ5EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAESEAoIaGFzX3NpemUYBSABKAgSEQoJY29sbGFwc2VkGAYgASgIEhAKCHVucGxhY2VkGAcgASgIIk0KDFJlbmRlckNhbnZhcxIMCgR1bml0GAEgASgJEg0KBXdpZHRoGAIgASgBEg4KBmhlaWdodBgDIAEoARIQCghoYXNfc2l6ZRgEIAEoCCJ2CgtSZW5kZXJTdHlsZRIMCgRmaWxsGAEgASgJEgwKBGxpbmUYAiABKAkSDAoEdGV4dBgDIAEoCRIMCgRmb250GAQgASgJEhEKCWZvbnRfc2l6ZRgFIAEoARIMCgRib2xkGAYgASgIEg4KBml0YWxpYxgHIAEoCCIjCgtSZW5kZXJQb2ludBIJCgF4GAEgASgBEgkKAXkYAiABKAEiNwoJUmVuZGVyUm93Eg0KBWNlbGxzGAEgAygJEhsKBm9yaWdpbhgCIAEoCzILLnN5c21sLlNwYW4isgEKClJlbmRlck5vdGUSDAoEdGV4dBgBIAEoCRIOCgZhbmNob3IYAiABKAkSEQoJZWRnZV9mcm9tGAMgASgJEg8KB2VkZ2VfdG8YBCABKAkSCQoBeBgFIAEoARIJCgF5GAYgASgBEg0KBXdpZHRoGAcgASgBEg4KBmhlaWdodBgIIAEoARIQCghoYXNfc2l6ZRgJIAEoCBIbCgZvcmlnaW4YCiABKAsyCy5zeXNtbC5TcGFuIjoKE0V4cG9ydEdyYXBoc1JlcXVlc3QSEgoKbW9kZWxfaGFzaBgBIAEoCRIPCgdzdWJqZWN0GAIgASgJIkkKFEV4cG9ydEdyYXBoc1Jlc3BvbnNlEg8KB2NvbnRlbnQYASABKAkSDwoHdmVyc2lvbhgCIAEoBRIPCgdzdWJqZWN0GAMgASgJIpABChFJbXBvcnREYXRhUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEiIKB2ltcG9ydHMYAiADKAsyES5zeXNtbC5EYXRhSW1wb3J0EhEKCWltcG9ydF9hcxgDIAEoCRIWCg5pbXBvcnRfZHJ5X3J1bhgEIAEoCBIYChBhY2NlcHRfZG9jdW1lbnRzGAUgASgIIlYKCkRhdGFJbXBvcnQSDAoEbmFtZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEhUKDWltcG9ydF9mb3JtYXQYAyABKAkSEgoKaW1wb3J0X21hcBgEIAEoCSK+AQoSSW1wb3J0RGF0YVJlc3BvbnNlEiIKBWZpbGVzGAEgAygLMhMuc3lzbWwuSW1wb3J0ZWRGaWxlEigKCWRvY3VtZW50cxgCIAMoCzIVLnN5c21sLkVkaXRlZERvY3VtZW50Eg8KB2NvbnRlbnQYAyABKAkSEgoKbW9kZWxfaGFzaBgEIAEoCRINCgVlcnJvchgFIAEoCRImCgtkaWFnbm9zdGljcxgGIAMoCzIRLnN5c21sLkRpYWdub3N0aWMiaQoMSW1wb3J0ZWRGaWxlEgwKBG5hbWUYASABKAkSDgoGdmFsdWVzGAIgASgDEhAKCGVsZW1lbnRzGAMgASgDEikKC2Fzc2lnbm1lbnRzGAQgAygLMhQuc3lzbWwuSW1wb3J0ZWRWYWx1ZSJ3Cg1JbXBvcnRlZFZhbHVlEg8KB2VsZW1lbnQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIRCglyZWRlZmluZXMYBCABKAkSDQoFd2hlcmUYBSABKAkSEwoLZGVzY3JpcHRpb24YBiABKAki5gEKFUNvbXBhcmVSZXN1bHRzUmVxdWVzdBISCgptb2RlbF9oYXNoGAEgASgJEg8KB3Jlc3VsdHMYAiABKAkSDwoHYWN0aW9ucxgDIAMoCRIMCgRydW5zGAQgASgDEhEKBHNlZWQYBSABKARIAIgBARINCgVkcmF3cxgGIAEoCRIXCgpjbG9ja19zdGVwGAcgASgBSAGIAQESJgoHb2JzZXJ2ZRgIIAMoCzIVLnN5c21sLk9ic2VydmFibGVQYWlyEg4KBmVuZ2luZRgJIAEoCUIHCgVfc2VlZEINCgtfY2xvY2tfc3RlcCIxCg5PYnNlcnZhYmxlUGFpchIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCSKFAgoWQ29tcGFyZVJlc3VsdHNSZXNwb25zZRI2Cg5jb25maWd1cmF0aW9ucxgBIAMoCzIeLnN5c21sLkNvbmZpZ3VyYXRpb25Db21wYXJpc29uEg4KBnNvdXJjZRgCIAEoCRINCgVlcnJvchgDIAEoCRImCgtkaWFnbm9zdGljcxgEIAMoCzIRLnN5c21sLkRpYWdub3N0aWMSLAoOZmFpbHVyZV9yZWFzb24YBSABKA4yFC5zeXNtbC5GYWlsdXJlUmVhc29uEg4KBmVuZ2luZRgGIAEoCRIQCghzdHJlbmd0aBgHIAEoCRIcCgZib3VuZHMYCCADKAsyDC5zeXNtbC5Cb3VuZCLEAwoXQ29uZmlndXJhdGlvbkNvbXBhcmlzb24SCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIQCghiZWhhdmlvchgDIAEoCRIOCgZ0YXJnZXQYBCABKAkSFwoPcmVzdWx0X2xvY2F0aW9uGAUgASgJEg4KBnN0YXR1cxgGIAEoCRISCgp1bnJlc29sdmVkGAcgASgJEhMKC3N0b3JlZF9ydW5zGAggASgDEhgKEHN0b3JlZF9zbmFwc2hvdHMYCSABKAMSDAoEcnVucxgKIAEoAxIRCgljb21wbGV0ZWQYCyABKAMSDQoFZHJhd3MYDCABKAkSEQoEc2VlZBgNIAEoBEgAiAEBEhIKCmNsb2NrX3N0ZXAYDiABKAESHQoEcm93cxgPIAMoCzIPLnN5c21sLlN3ZWVwUm93EiIKCWluc3RhbmNlcxgQIAMoCzIPLnN5c21sLkluc3RhbmNlEjAKC29ic2VydmFibGVzGBEgAygLMhsuc3lzbWwuT2JzZXJ2YWJsZUNvbXBhcmlzb24SDgoGZXJyb3JzGBIgAygJEg0KBW5vdGVzGBMgAygJEg0KBWxpbmVzGBQgAygJQgcKBV9zZWVkIsgCChRPYnNlcnZhYmxlQ29tcGFyaXNvbhIOCgZzdG9yZWQYASABKAkSDwoHZmVhdHVyZRgCIAEoCRIMCgR1bml0GAMgASgJEikKBHRvb2wYBCABKAsyGy5zeXNtbC5Db21wYXJlZERpc3RyaWJ1dGlvbhIOCgZwb29sZWQYBSABKAgSEAoIdW5zdG9yZWQYBiABKAgSKAoDcnVuGAcgASgLMhsuc3lzbWwuQ29tcGFyZWREaXN0cmlidXRpb24SEAoIcHJvZHVjZWQYCCABKAMSEAoIY29tcGFyZWQYCSABKAgSLgoKZGlmZmVyZW5jZRgKIAEoCzIaLnN5c21sLlN0YXRpc3RpY0RpZmZlcmVuY2USJwoIZGVjbGFyZWQYCyABKAsyFS5zeXNtbC5DYXNlU3RhdGlzdGljcxINCgVub3RlcxgMIAMoCSJ6ChRDb21wYXJlZERpc3RyaWJ1dGlvbhINCgVjb3VudBgBIAEoAxILCgNtaW4YAiABKAESDAoEbWVhbhgDIAEoARILCgNwNTAYBCABKAESCwoDcDkwGAUgASgBEgsKA21heBgGIAEoARIRCglkZXZpYXRpb24YByABKAEiVwoTU3RhdGlzdGljRGlmZmVyZW5jZRILCgNtaW4YASABKAkSDAoEbWVhbhgCIAEoCRILCgNwNTAYAyABKAkSCwoDcDkwGAQgASgJEgsKA21heBgFIAEoCSJVCg5DYXNlU3RhdGlzdGljcxIQCghhbmFseXNpcxgBIAEoCRIiCgRyb3dzGAIgAygLMhQuc3lzbWwuQ2FzZVN0YXRpc3RpYxINCgVub3RlcxgDIAMoCSJdCg1DYXNlU3RhdGlzdGljEhEKCXN0YXRpc3RpYxgBIAEoCRIKCgJvZhgCIAEoCRIMCgR0b29sGAMgASgJEgsKA3J1bhgEIAEoCRISCgpkaWZmZXJlbmNlGAUgASgJKrEBCg1GYWlsdXJlUmVhc29uEh4KGkZBSUxVUkVfUkVBU09OX1VOU1BFQ0lGSUVEEAASHQoZRkFJTFVSRV9SRUFTT05fRVZBTFVBVElPThABEh0KGUZBSUxVUkVfUkVBU09OX1dST05HX0tJTkQQAhIkCiBGQUlMVVJFX1JFQVNPTl9BTUJJR1VPVVNfU1VCSkVDVBADEhwKGEZBSUxVUkVfUkVBU09OX1VOREVDSURFRBAEKowFCgtFZGl0RmFpbHVyZRIcChhFRElUX0ZBSUxVUkVfVU5TUEVDSUZJRUQQABIeChpFRElUX0ZBSUxVUkVfTk9fT1BFUkFUSU9OUxABEh8KG0VESVRfRkFJTFVSRV9VTktOT1dOX1RBUkdFVBACEiEKHUVESVRfRkFJTFVSRV9BTUJJR1VPVVNfVEFSR0VUEAMSGwoXRURJVF9GQUlMVVJFX05PVF9WQUxVRUQQBBIeChpFRElUX0ZBSUxVUkVfSU5WQUxJRF9WQUxVRRAFEh0KGUVESVRfRkFJTFVSRV9JTlZBTElEX05BTUUQBhIaChZFRElUX0ZBSUxVUkVfTk9UX05BTUVEEAcSIgoeRURJVF9GQUlMVVJFX1JFTkFNRV9SRUZFUkVOQ0VEEAgSIgoeRURJVF9GQUlMVVJFX09WRVJMQVBQSU5HX0VESVRTEAkSHwobRURJVF9GQUlMVVJFX1JFU1VMVF9JTlZBTElEEAoSHgoaRURJVF9GQUlMVVJFX09XTkVSX1VOS05PV04QCxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfTk9UX05BTUVTUEFDRRAMEh0KGUVESVRfRkFJTFVSRV9JTExFR0FMX0tJTkQQDRIiCh5FRElUX0ZBSUxVUkVfTUVNQkVSX05BTUVfVEFLRU4QDhIiCh5FRElUX0ZBSUxVUkVfREVMRVRFX1JFRkVSRU5DRUQQDxIkCiBFRElUX0ZBSUxVUkVfT1dORVJfSU5TSURFX1RBUkdFVBAQEiAKHEVESVRfRkFJTFVSRV9NT1ZFX1JFRkVSRU5DRUQQERIlCiFFRElUX0ZBSUxVUkVfUkVGRVJFTkNFRF9FTFNFV0hFUkUQEiqaAgoRUHJpbWl0aXZlT3BlcmF0b3ISIgoeUFJJTUlUSVZFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASHAoYUFJJTUlUSVZFX09QRVJBVE9SX0VRVUFMEAESHgoaUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVIQAhIbChdQUklNSVRJVkVfT1BFUkFUT1JfTEVTUxADEiEKHVBSSU1JVElWRV9PUEVSQVRPUl9MRVNTX0VRVUFMEAQSJAogUFJJTUlUSVZFX09QRVJBVE9SX0dSRUFURVJfRVFVQUwQBRIZChVQUklNSVRJVkVfT1BFUkFUT1JfSU4QBhIiCh5QUklNSVRJVkVfT1BFUkFUT1JfSU5TVEFOQ0VfT0YQBypuChFDb21wb3NpdGVPcGVyYXRvchIiCh5DT01QT1NJVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIaChZDT01QT1NJVEVfT1BFUkFUT1JfQU5EEAESGQoVQ09NUE9TSVRFX09QRVJBVE9SX09SEAIyyhIKDFN5c01MU2VydmljZRJECg1HZXRTZXJ2ZXJJbmZvEhguc3lzbWwuU2VydmVySW5mb1JlcXVlc3QaGS5zeXNtbC5TZXJ2ZXJJbmZvUmVzcG9uc2USPgoJUGFyc2VGaWxlEhcuc3lzbWwuUGFyc2VGaWxlUmVxdWVzdBoYLnN5c21sLlBhcnNlRmlsZVJlc3BvbnNlEkcKDFBhcnNlU291cmNlcxIaLnN5c21sLlBhcnNlU291cmNlc1JlcXVlc3QaGy5zeXNtbC5QYXJzZVNvdXJjZXNSZXNwb25zZRI7CglHZXRTeW1ib2wSFy5zeXNtbC5HZXRTeW1ib2xSZXF1ZXN0GhUuc3lzbWwuU3ltYm9sUmVzcG9uc2USRwoOR2V0RGlhZ25vc3RpY3MSGS5zeXNtbC5EaWFnbm9zdGljc1JlcXVlc3QaGi5zeXNtbC5EaWFnbm9zdGljc1Jlc3BvbnNlEjsKCEV2YWx1YXRlEhYuc3lzbWwuRXZhbHVhdGVSZXF1ZXN0Ghcuc3lzbWwuRXZhbHVhdGVSZXNwb25zZRJECgtJbnN0YW50aWF0ZRIZLnN5c21sLkluc3RhbnRpYXRlUmVxdWVzdBoaLnN5c21sLkluc3RhbnRpYXRlUmVzcG9uc2USSgoNSW5zdGFuY2VQYXRocxIbLnN5c21sLkluc3RhbmNlUGF0aHNSZXF1ZXN0Ghwuc3lzbWwuSW5zdGFuY2VQYXRoc1Jlc3BvbnNlEkoKDUV4ZWN1dGVBY3Rpb24SGy5zeXNtbC5FeGVjdXRlQWN0aW9uUmVxdWVzdBocLnN5c21sLkV4ZWN1dGVBY3Rpb25SZXNwb25zZRJHCgxFeGVjdXRlU3RhdGUSGi5zeXNtbC5FeGVjdXRlU3RhdGVSZXF1ZXN0Ghsuc3lzbWwuRXhlY3V0ZVN0YXRlUmVzcG9uc2USOAoHQ29udmVydBIVLnN5c21sLkNvbnZlcnRSZXF1ZXN0GhYuc3lzbWwuQ29udmVydFJlc3BvbnNlEjgKB01pZ3JhdGUSFS5zeXNtbC5NaWdyYXRlUmVxdWVzdBoWLnN5c21sLk1pZ3JhdGVSZXNwb25zZRJBCgpBcHBseUVkaXRzEhguc3lzbWwuQXBwbHlFZGl0c1JlcXVlc3QaGS5zeXNtbC5BcHBseUVkaXRzUmVzcG9uc2USUwoQVmVyaWZ5Q29uc3RyYWludBIeLnN5c21sLlZlcmlmeUNvbnN0cmFpbnRSZXF1ZXN0Gh8uc3lzbWwuVmVyaWZ5Q29uc3RyYWludFJlc3BvbnNlElYKEVZlcmlmeVJlcXVpcmVtZW50Eh8uc3lzbWwuVmVyaWZ5UmVxdWlyZW1lbnRSZXF1ZXN0GiAuc3lzbWwuVmVyaWZ5UmVxdWlyZW1lbnRSZXNwb25zZRJZChJWZXJpZnlTYXRpc2ZhY3Rpb24SIC5zeXNtbC5WZXJpZnlTYXRpc2ZhY3Rpb25SZXF1ZXN0GiEuc3lzbWwuVmVyaWZ5U2F0aXNmYWN0aW9uUmVzcG9uc2USUwoQVmFsaWRhdGVJbnN0YW5jZRIeLnN5c21sLlZhbGlkYXRlSW5zdGFuY2VSZXF1ZXN0Gh8uc3lzbWwuVmFsaWRhdGVJbnN0YW5jZVJlc3BvbnNlEkcKDEV2YWx1YXRlQ2FsYxIaLnN5c21sLkV2YWx1YXRlQ2FsY1JlcXVlc3QaGy5zeXNtbC5FdmFsdWF0ZUNhbGNSZXNwb25zZRJECgtSdW5BbmFseXNpcxIZLnN5c21sLlJ1bkFuYWx5c2lzUmVxdWVzdBoaLnN5c21sLlJ1bkFuYWx5c2lzUmVzcG9uc2USSgoNQ2hlY2tCZWhhdmlvchIbLnN5c21sLkNoZWNrQmVoYXZpb3JSZXF1ZXN0Ghwuc3lzbWwuQ2hlY2tCZWhhdmlvclJlc3BvbnNlEjsKCFJ1blN3ZWVwEhYuc3lzbWwuUnVuU3dlZXBSZXF1ZXN0Ghcuc3lzbWwuUnVuU3dlZXBSZXNwb25zZRI4CgdSdW5SdW5zEhUuc3lzbWwuUnVuUnVuc1JlcXVlc3QaFi5zeXNtbC5SdW5SdW5zUmVzcG9uc2USPgoJU2VsZkNoZWNrEhcuc3lzbWwuU2VsZkNoZWNrUmVxdWVzdBoYLnN5c21sLlNlbGZDaGVja1Jlc3BvbnNlEj4KCVJlY29yZFJ1bhIXLnN5c21sLlJlY29yZFJ1blJlcXVlc3QaGC5zeXNtbC5SZWNvcmRSdW5SZXNwb25zZRJECgtMaXN0RW5naW5lcxIZLnN5c21sLkxpc3RFbmdpbmVzUmVxdWVzdBoaLnN5c21sLkxpc3RFbmdpbmVzUmVzcG9uc2USMgoFUXVlcnkSEy5zeXNtbC5RdWVyeVJlcXVlc3QaFC5zeXNtbC5RdWVyeVJlc3BvbnNlEl8KFEdldEVsZW1lbnRQcm9wZXJ0aWVzEiIuc3lzbWwuR2V0RWxlbWVudFByb3BlcnRpZXNSZXF1ZXN0GiMuc3lzbWwuR2V0RWxlbWVudFByb3BlcnRpZXNSZXNwb25zZRJTChBSdW5Eb2N1bWVudFF1ZXJ5Eh4uc3lzbWwuUnVuRG9jdW1lbnRRdWVyeVJlcXVlc3QaHy5zeXNtbC5SdW5Eb2N1bWVudFF1ZXJ5UmVzcG9uc2USTQoOUmVuZGVyRG9jdW1lbnQSHC5zeXNtbC5SZW5kZXJEb2N1bWVudFJlcXVlc3QaHS5zeXNtbC5SZW5kZXJEb2N1bWVudFJlc3BvbnNlEkEKClJlbmRlclZpZXcSGC5zeXNtbC5SZW5kZXJWaWV3UmVxdWVzdBoZLnN5c21sLlJlbmRlclZpZXdSZXNwb25zZRJHCgxFeHBvcnRHcmFwaHMSGi5zeXNtbC5FeHBvcnRHcmFwaHNSZXF1ZXN0Ghsuc3lzbWwuRXhwb3J0R3JhcGhzUmVzcG9uc2USQQoKSW1wb3J0RGF0YRIYLnN5c21sLkltcG9ydERhdGFSZXF1ZXN0Ghkuc3lzbWwuSW1wb3J0RGF0YVJlc3BvbnNlEk0KDkNvbXBhcmVSZXN1bHRzEhwuc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXF1ZXN0Gh0uc3lzbWwuQ29tcGFyZVJlc3VsdHNSZXNwb25zZUIqWihnaXRodWIuY29tL09wZW4tTUJFRS9PcGVuU3lzTUwvYXBpL3Byb3RvYgZwcm90bzM"); /** * Verdict is one verification's answer: whether the condition held, and, when @@ -7041,6 +7041,11 @@ export type ServerInfoResponse = Message<"sysml.ServerInfoResponse"> & { * and the response carries the document in `asciidoc`. * "render_view" - the RenderView RPC renders a declared view or targeted * pseudo-view as machine-readable diagram data. + * "query_result_view" - RunDocumentQueryRequest.as_view and + * QueryRequest.as_view write the answer as a + * QVTS::QueryResult view in result_view (a failed query's as + * a QueryResultView detail), and RenderView answers such a + * view's header and, for RenderViewRequest.form, a document. * "export_graphs" - the ExportGraphs RPC exports the lowered graph of an * action or state machine as canonical graphs:1 JSON. * "diagnostic_codes" - Diagnostic.code is populated, so an empty code is a @@ -7115,6 +7120,15 @@ export type QueryRequest = Message<"sysml.QueryRequest"> & { * @generated from field: string oslc_query = 3; */ oslcQuery: string; + + /** + * Also write the answer as a QVTS::QueryResult view, in result_view; a path or + * model error carries its view as a QueryResultView detail. Under the + * "query_result_view" capability. + * + * @generated from field: bool as_view = 4; + */ + asView: boolean; }; /** @@ -7137,6 +7151,15 @@ export type QueryResponse = Message<"sysml.QueryResponse"> & { * @generated from field: repeated sysml.QueryResultElement elements = 1; */ elements: QueryResultElement[]; + + /** + * The answer as SysML text when the request set as_view, as + * RunDocumentQueryResponse.result_view; its query is the OSLC text, or the + * API query written as `scope=…; select=…; where=…; orderBy=…`. + * + * @generated from field: string result_view = 2; + */ + resultView: string; }; /** @@ -8470,6 +8493,15 @@ export type RunDocumentQueryRequest = Message<"sysml.RunDocumentQueryRequest"> & * @generated from field: string inline_query = 4; */ inlineQuery: string; + + /** + * Also write the answer as a QVTS::QueryResult view, in result_view; a path or + * model error carries its view as a QueryResultView detail. Under the + * "query_result_view" capability. + * + * @generated from field: bool as_view = 5; + */ + asView: boolean; }; /** @@ -9045,6 +9077,15 @@ export type RunDocumentQueryResponse = Message<"sysml.RunDocumentQueryResponse"> * @generated from field: repeated sysml.DocumentQueryRow rows = 2; */ rows: DocumentQueryRow[]; + + /** + * The answer as SysML text when the request set as_view: a package holding one + * `view : QVTS::QueryResult` that exposes each selected element and states the + * query with its bindings, the source, the outcome and the provenance. + * + * @generated from field: string result_view = 3; + */ + resultView: string; }; /** @@ -9054,6 +9095,26 @@ export type RunDocumentQueryResponse = Message<"sysml.RunDocumentQueryResponse"> export const RunDocumentQueryResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_sysml, 162); +/** + * QueryResultView is a failed query written as a QVTS::QueryResult view, an error + * detail beside QueryOutcome when the request set as_view: it exposes the frontier and finding elements. + * + * @generated from message sysml.QueryResultView + */ +export type QueryResultView = Message<"sysml.QueryResultView"> & { + /** + * @generated from field: string text = 1; + */ + text: string; +}; + +/** + * Describes the message sysml.QueryResultView. + * Use `create(QueryResultViewSchema)` to create a new message. + */ +export const QueryResultViewSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_sysml, 163); + /** * 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. @@ -9120,7 +9181,7 @@ export type QueryOutcome = Message<"sysml.QueryOutcome"> & { * Use `create(QueryOutcomeSchema)` to create a new message. */ export const QueryOutcomeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 163); + messageDesc(file_sysml, 164); /** * QueryFailure is one failure of one step on one element: what the step @@ -9150,7 +9211,7 @@ export type QueryFailure = Message<"sysml.QueryFailure"> & { * Use `create(QueryFailureSchema)` to create a new message. */ export const QueryFailureSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 164); + messageDesc(file_sysml, 165); /** * QueryFrontier is what the model holds where the path stopped: the last @@ -9218,7 +9279,7 @@ export type QueryFrontier = Message<"sysml.QueryFrontier"> & { * Use `create(QueryFrontierSchema)` to create a new message. */ export const QueryFrontierSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 165); + messageDesc(file_sysml, 166); /** * @generated from message sysml.QueryFrontierMember @@ -9240,7 +9301,7 @@ export type QueryFrontierMember = Message<"sysml.QueryFrontierMember"> & { * Use `create(QueryFrontierMemberSchema)` to create a new message. */ export const QueryFrontierMemberSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 166); + messageDesc(file_sysml, 167); /** * @generated from message sysml.QueryFrontierFeature @@ -9264,7 +9325,7 @@ export type QueryFrontierFeature = Message<"sysml.QueryFrontierFeature"> & { * Use `create(QueryFrontierFeatureSchema)` to create a new message. */ export const QueryFrontierFeatureSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 167); + messageDesc(file_sysml, 168); /** * QueryFinding is one finding about an element at a step: a constraint the @@ -9299,7 +9360,7 @@ export type QueryFinding = Message<"sysml.QueryFinding"> & { * Use `create(QueryFindingSchema)` to create a new message. */ export const QueryFindingSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 168); + messageDesc(file_sysml, 169); /** * RenderDocumentRequest renders a named document — a part def specializing @@ -9342,7 +9403,7 @@ export type RenderDocumentRequest = Message<"sysml.RenderDocumentRequest"> & { * Use `create(RenderDocumentRequestSchema)` to create a new message. */ export const RenderDocumentRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 169); + messageDesc(file_sysml, 170); /** * RenderDocumentResponse carries the rendered document in the form requested, @@ -9383,7 +9444,7 @@ export type RenderDocumentResponse = Message<"sysml.RenderDocumentResponse"> & { * Use `create(RenderDocumentResponseSchema)` to create a new message. */ export const RenderDocumentResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 170); + messageDesc(file_sysml, 171); /** * RenderViewRequest names a declared view or targeted pseudo-view to render. @@ -9438,6 +9499,16 @@ export type RenderViewRequest = Message<"sysml.RenderViewRequest"> & { * @generated from field: string compartments = 6; */ compartments: string; + + /** + * A document form to also render a QVTS::QueryResult view in — "markdown", + * "html" or "asciidoc", as RenderDocumentRequest.form — answered in the + * response's field of that name. Fails with INVALID_ARGUMENT for any other + * view. Under the "query_result_view" capability. + * + * @generated from field: string form = 7; + */ + form: string; }; /** @@ -9445,7 +9516,7 @@ export type RenderViewRequest = Message<"sysml.RenderViewRequest"> & { * Use `create(RenderViewRequestSchema)` to create a new message. */ export const RenderViewRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 171); + messageDesc(file_sysml, 172); /** * RenderViewResponse carries all machine-readable fields of the rendering. @@ -9521,6 +9592,31 @@ export type RenderViewResponse = Message<"sysml.RenderViewResponse"> & { * @generated from field: sysml.RenderFrame frame = 12; */ frame?: RenderFrame | undefined; + + /** + * A QVTS::QueryResult view's query, source, outcome and provenance, in that + * order, above its rows; empty for any other view. + * + * @generated from field: repeated sysml.RenderHeaderField header = 13; + */ + header: RenderHeaderField[]; + + /** + * The view as a document in the form the request asked for, the others empty. + * + * @generated from field: string markdown = 14; + */ + markdown: string; + + /** + * @generated from field: string html = 15; + */ + html: string; + + /** + * @generated from field: string asciidoc = 16; + */ + asciidoc: string; }; /** @@ -9528,7 +9624,31 @@ export type RenderViewResponse = Message<"sysml.RenderViewResponse"> & { * Use `create(RenderViewResponseSchema)` to create a new message. */ export const RenderViewResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 172); + messageDesc(file_sysml, 173); + +/** + * RenderHeaderField is one stated attribute of a QVTS::QueryResult view. + * + * @generated from message sysml.RenderHeaderField + */ +export type RenderHeaderField = Message<"sysml.RenderHeaderField"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: string value = 2; + */ + value: string; +}; + +/** + * Describes the message sysml.RenderHeaderField. + * Use `create(RenderHeaderFieldSchema)` to create a new message. + */ +export const RenderHeaderFieldSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_sysml, 174); /** * RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's @@ -9569,7 +9689,7 @@ export type RenderFrame = Message<"sysml.RenderFrame"> & { * Use `create(RenderFrameSchema)` to create a new message. */ export const RenderFrameSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 173); + messageDesc(file_sysml, 175); /** * RenderNode is one flattened node of the rendering. @@ -9683,7 +9803,7 @@ export type RenderNode = Message<"sysml.RenderNode"> & { * Use `create(RenderNodeSchema)` to create a new message. */ export const RenderNodeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 174); + messageDesc(file_sysml, 176); /** * RenderPort is a feature drawn on a node's border. @@ -9724,7 +9844,7 @@ export type RenderPort = Message<"sysml.RenderPort"> & { * Use `create(RenderPortSchema)` to create a new message. */ export const RenderPortSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 175); + messageDesc(file_sysml, 177); /** * RenderEdge joins two rendered nodes and may connect their ports. @@ -9788,7 +9908,7 @@ export type RenderEdge = Message<"sysml.RenderEdge"> & { * Use `create(RenderEdgeSchema)` to create a new message. */ export const RenderEdgeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 176); + messageDesc(file_sysml, 178); /** * RenderGeometry locates a node on the rendering's canvas. @@ -9839,7 +9959,7 @@ export type RenderGeometry = Message<"sysml.RenderGeometry"> & { * Use `create(RenderGeometrySchema)` to create a new message. */ export const RenderGeometrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 177); + messageDesc(file_sysml, 179); /** * RenderCanvas is the rendering's drawing surface. @@ -9873,7 +9993,7 @@ export type RenderCanvas = Message<"sysml.RenderCanvas"> & { * Use `create(RenderCanvasSchema)` to create a new message. */ export const RenderCanvasSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 178); + messageDesc(file_sysml, 180); /** * RenderStyle is the optional styling of a node or edge. @@ -9922,7 +10042,7 @@ export type RenderStyle = Message<"sysml.RenderStyle"> & { * Use `create(RenderStyleSchema)` to create a new message. */ export const RenderStyleSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 179); + messageDesc(file_sysml, 181); /** * RenderPoint is a route waypoint on the rendering's canvas. @@ -9946,7 +10066,7 @@ export type RenderPoint = Message<"sysml.RenderPoint"> & { * Use `create(RenderPointSchema)` to create a new message. */ export const RenderPointSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 180); + messageDesc(file_sysml, 182); /** * RenderRow is one row of a tabular rendering. @@ -9970,7 +10090,7 @@ export type RenderRow = Message<"sysml.RenderRow"> & { * Use `create(RenderRowSchema)` to create a new message. */ export const RenderRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 181); + messageDesc(file_sysml, 183); /** * RenderNote is a note box drawn on the rendering's canvas. @@ -10034,7 +10154,7 @@ export type RenderNote = Message<"sysml.RenderNote"> & { * Use `create(RenderNoteSchema)` to create a new message. */ export const RenderNoteSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 182); + messageDesc(file_sysml, 184); /** * ExportGraphsRequest names the behavior whose lowered graph is exported. @@ -10060,7 +10180,7 @@ export type ExportGraphsRequest = Message<"sysml.ExportGraphsRequest"> & { * Use `create(ExportGraphsRequestSchema)` to create a new message. */ export const ExportGraphsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 183); + messageDesc(file_sysml, 185); /** * ExportGraphsResponse carries the `graphs:` form: the lowered @@ -10097,7 +10217,7 @@ export type ExportGraphsResponse = Message<"sysml.ExportGraphsResponse"> & { * Use `create(ExportGraphsResponseSchema)` to create a new message. */ export const ExportGraphsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 184); + messageDesc(file_sysml, 186); /** * ImportDataRequest is the data `sysml -import` sets the feature values of, one @@ -10149,7 +10269,7 @@ export type ImportDataRequest = Message<"sysml.ImportDataRequest"> & { * Use `create(ImportDataRequestSchema)` to create a new message. */ export const ImportDataRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 185); + messageDesc(file_sysml, 187); /** * DataImport is one data file: its name, which names the format by extension @@ -10190,7 +10310,7 @@ export type DataImport = Message<"sysml.DataImport"> & { * Use `create(DataImportSchema)` to create a new message. */ export const DataImportSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 186); + messageDesc(file_sysml, 188); /** * ImportDataResponse is what the imports set, and the model they made. @@ -10245,7 +10365,7 @@ export type ImportDataResponse = Message<"sysml.ImportDataResponse"> & { * Use `create(ImportDataResponseSchema)` to create a new message. */ export const ImportDataResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 187); + messageDesc(file_sysml, 189); /** * ImportedFile is what one data file set: the values, the elements they were @@ -10280,7 +10400,7 @@ export type ImportedFile = Message<"sysml.ImportedFile"> & { * Use `create(ImportedFileSchema)` to create a new message. */ export const ImportedFileSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 188); + messageDesc(file_sysml, 190); /** * ImportedValue is one assignment: the qualified name of the element, the @@ -10328,7 +10448,7 @@ export type ImportedValue = Message<"sysml.ImportedValue"> & { * Use `create(ImportedValueSchema)` to create a new message. */ export const ImportedValueSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 189); + messageDesc(file_sysml, 191); /** * CompareResultsRequest runs the configurations a tool's results sidecar indexes @@ -10409,7 +10529,7 @@ export type CompareResultsRequest = Message<"sysml.CompareResultsRequest"> & { * Use `create(CompareResultsRequestSchema)` to create a new message. */ export const CompareResultsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 190); + messageDesc(file_sysml, 192); /** * ObservablePair is a stored observable and the feature of the run that answers @@ -10434,7 +10554,7 @@ export type ObservablePair = Message<"sysml.ObservablePair"> & { * Use `create(ObservablePairSchema)` to create a new message. */ export const ObservablePairSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 191); + messageDesc(file_sysml, 193); /** * CompareResultsResponse is one comparison per configuration, in the order the @@ -10493,7 +10613,7 @@ export type CompareResultsResponse = Message<"sysml.CompareResultsResponse"> & { * Use `create(CompareResultsResponseSchema)` to create a new message. */ export const CompareResultsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 192); + messageDesc(file_sysml, 194); /** * ConfigurationComparison is one configuration's runs beside the tool's results. @@ -10629,7 +10749,7 @@ export type ConfigurationComparison = Message<"sysml.ConfigurationComparison"> & * Use `create(ConfigurationComparisonSchema)` to create a new message. */ export const ConfigurationComparisonSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 193); + messageDesc(file_sysml, 195); /** * ObservableComparison is one observable: the tool's distribution beside the @@ -10723,7 +10843,7 @@ export type ObservableComparison = Message<"sysml.ObservableComparison"> & { * Use `create(ObservableComparisonSchema)` to create a new message. */ export const ObservableComparisonSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 194); + messageDesc(file_sysml, 196); /** * ComparedDistribution is a distribution of numbers by its statistics; a pooled @@ -10773,7 +10893,7 @@ export type ComparedDistribution = Message<"sysml.ComparedDistribution"> & { * Use `create(ComparedDistributionSchema)` to create a new message. */ export const ComparedDistributionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 195); + messageDesc(file_sysml, 197); /** * StatisticDifference is the relative difference of each statistic as a signed @@ -10813,7 +10933,7 @@ export type StatisticDifference = Message<"sysml.StatisticDifference"> & { * Use `create(StatisticDifferenceSchema)` to create a new message. */ export const StatisticDifferenceSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 196); + messageDesc(file_sysml, 198); /** * CaseStatistics compares the statistics a Simulation::MonteCarlo case declares @@ -10843,7 +10963,7 @@ export type CaseStatistics = Message<"sysml.CaseStatistics"> & { * Use `create(CaseStatisticsSchema)` to create a new message. */ export const CaseStatisticsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 197); + messageDesc(file_sysml, 199); /** * CaseStatistic is one statistic of the case: which, where the case declares @@ -10883,7 +11003,7 @@ export type CaseStatistic = Message<"sysml.CaseStatistic"> & { * Use `create(CaseStatisticSchema)` to create a new message. */ export const CaseStatisticSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_sysml, 198); + messageDesc(file_sysml, 200); /** * FailureReason says what kind of failure an `error` reports, so a client acts diff --git a/client/python/opensysml/proto/sysml_pb2.py b/client/python/opensysml/proto/sysml_pb2.py index f57f92bfc1..f48e95f32c 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\"\xee\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\x12!\n\x08\x63overage\x18\t \x01(\x0b\x32\x0f.sysml.Coverage\"[\n\x08\x43overage\x12$\n\x06states\x18\x01 \x03(\x0b\x32\x14.sysml.CoverageEntry\x12)\n\x0btransitions\x18\x02 \x03(\x0b\x32\x14.sysml.CoverageEntry\"@\n\rCoverageEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65\x63laration\x18\x02 \x01(\t\x12\x0c\n\x04runs\x18\x03 \x01(\x05\"\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\"\xe0\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\x12!\n\x08\x63overage\x18\x0b \x01(\x0b\x32\x0f.sysml.Coverage\"\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\"Z\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\x17include_library_members\x18\x03 \x01(\x08\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"Y\n\x1bGetElementPropertiesRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x12\n\nproperties\x18\x03 \x03(\t\"}\n\x1cGetElementPropertiesResponse\x12\"\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x11.sysml.ElementRef\x12*\n\nproperties\x18\x02 \x03(\x0b\x32\x16.sysml.ElementProperty\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"C\n\nElementRef\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0equalified_name\x18\x02 \x01(\t\x12\x11\n\tmetaclass\x18\x03 \x01(\t\"\x98\x01\n\x0f\x45lementProperty\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65\x66ining_class\x18\x02 \x01(\t\x12\x0c\n\x04many\x18\x03 \x01(\x08\x12\x0f\n\x07\x64\x65rived\x18\x04 \x01(\x08\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.ElementPropertyValue\x12\x13\n\x0bunsupported\x18\x06 \x01(\t\"\xb0\x01\n\x14\x45lementPropertyValue\x12$\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x11.sysml.ElementRefH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x05 \x01(\x01H\x00\x12\x10\n\x06number\x18\x06 \x01(\tH\x00\x42\x07\n\x05value\"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\"\xec\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\x12(\n\nreached_by\x18\x05 \x01(\x0b\x32\x14.sysml.InstanceReach\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\"r\n\rInstanceReach\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x02 \x01(\t\x12\x19\n\x11\x66\x65\x61ture_symbol_id\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"\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\"Q\n\x14InstancePathsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12%\n\x06object\x18\x02 \x01(\x0b\x32\x15.sysml.DocumentObject\"\x85\x01\n\x15InstancePathsResponse\x12\"\n\x05paths\x18\x01 \x03(\x0b\x32\x13.sysml.InstancePath\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"g\n\x0cInstancePath\x12!\n\x04root\x18\x01 \x01(\x0b\x32\x13.sysml.InstanceRoot\x12\x0c\n\x04path\x18\x02 \x01(\t\x12&\n\x05steps\x18\x03 \x03(\x0b\x32\x17.sysml.InstancePathStep\"6\n\x0cInstanceRoot\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"g\n\x10InstancePathStep\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x19\n\x11\x66\x65\x61ture_symbol_id\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\x13\n\x0binstance_id\x18\x04 \x01(\x03\"\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\"Z\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\x12\x14\n\x0clibrary_path\x18\x04 \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\"\xc3\x03\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\x12\"\n\x07members\x18\x0b \x03(\x0b\x32\x11.sysml.MemberInfo\x12 \n\x18withheld_library_members\x18\x0c \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"p\n\nMemberInfo\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\x11\n\tinherited\x18\x04 \x01(\x08\x12\x16\n\x0einherited_from\x18\x05 \x01(\t\x12\x0f\n\x07library\x18\x06 \x01(\x08\"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\"\xb4\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\x12\x1d\n\x05types\x18\x08 \x03(\x0b\x32\x0e.sysml.TypeRef\"#\n\x07TypeRef\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \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\"\xae\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\x12\x0c\n\x04path\x18\x04 \x01(\t\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\"\x84\x01\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\x12\x14\n\x0cinline_query\x18\x04 \x01(\t\"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\"\xf1\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\x12\x16\n\x0e\x66\x61ilures_total\x18\x06 \x01(\x05\x12\x16\n\x0e\x66indings_total\x18\x07 \x01(\x05\x12\x1b\n\x13path_failures_total\x18\x08 \x01(\x05\"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\"\xdb\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\x12\x15\n\rmembers_total\x18\x06 \x01(\x05\x12\x16\n\x0e\x66\x65\x61tures_total\x18\x07 \x01(\x05\x12\x13\n\x0bkinds_total\x18\x08 \x01(\x05\"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\"\xbf\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\x12!\n\x05\x66rame\x18\x0c \x01(\x0b\x32\x12.sysml.RenderFrame\"`\n\x0bRenderFrame\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0f\n\x07\x65xposes\x18\x03 \x03(\t\x12\x0f\n\x07\x66ilters\x18\x04 \x03(\t\x12\x13\n\x0b\x61nnotations\x18\x05 \x03(\t\"\xf0\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\x12\r\n\x05\x61rrow\x18\x10 \x01(\t\x12\x10\n\x08parallel\x18\x11 \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\xca\x12\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\rInstancePaths\x12\x1b.sysml.InstancePathsRequest\x1a\x1c.sysml.InstancePathsResponse\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\x12_\n\x14GetElementProperties\x12\".sysml.GetElementPropertiesRequest\x1a#.sysml.GetElementPropertiesResponse\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\"\xee\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\x12!\n\x08\x63overage\x18\t \x01(\x0b\x32\x0f.sysml.Coverage\"[\n\x08\x43overage\x12$\n\x06states\x18\x01 \x03(\x0b\x32\x14.sysml.CoverageEntry\x12)\n\x0btransitions\x18\x02 \x03(\x0b\x32\x14.sysml.CoverageEntry\"@\n\rCoverageEntry\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65\x63laration\x18\x02 \x01(\t\x12\x0c\n\x04runs\x18\x03 \x01(\x05\"\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\"\xe0\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\x12!\n\x08\x63overage\x18\x0b \x01(\x0b\x32\x0f.sysml.Coverage\"\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\"Z\n\x10GetSymbolRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\x12\x1f\n\x17include_library_members\x18\x03 \x01(\x08\"B\n\x0eSymbolResponse\x12!\n\x06symbol\x18\x01 \x01(\x0b\x32\x11.sysml.SymbolInfo\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"Y\n\x1bGetElementPropertiesRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12\x12\n\nelement_id\x18\x02 \x01(\t\x12\x12\n\nproperties\x18\x03 \x03(\t\"}\n\x1cGetElementPropertiesResponse\x12\"\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x11.sysml.ElementRef\x12*\n\nproperties\x18\x02 \x03(\x0b\x32\x16.sysml.ElementProperty\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"C\n\nElementRef\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0equalified_name\x18\x02 \x01(\t\x12\x11\n\tmetaclass\x18\x03 \x01(\t\"\x98\x01\n\x0f\x45lementProperty\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x64\x65\x66ining_class\x18\x02 \x01(\t\x12\x0c\n\x04many\x18\x03 \x01(\x08\x12\x0f\n\x07\x64\x65rived\x18\x04 \x01(\x08\x12+\n\x06values\x18\x05 \x03(\x0b\x32\x1b.sysml.ElementPropertyValue\x12\x13\n\x0bunsupported\x18\x06 \x01(\t\"\xb0\x01\n\x14\x45lementPropertyValue\x12$\n\x07\x65lement\x18\x01 \x01(\x0b\x32\x11.sysml.ElementRefH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x00\x12\x14\n\nreal_value\x18\x05 \x01(\x01H\x00\x12\x10\n\x06number\x18\x06 \x01(\tH\x00\x42\x07\n\x05value\"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\"\xec\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\x12(\n\nreached_by\x18\x05 \x01(\x0b\x32\x14.sysml.InstanceReach\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\"r\n\rInstanceReach\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x02 \x01(\t\x12\x19\n\x11\x66\x65\x61ture_symbol_id\x18\x03 \x01(\t\x12\r\n\x05index\x18\x04 \x01(\x05\x12\x0c\n\x04path\x18\x05 \x01(\t\"\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\"Q\n\x14InstancePathsRequest\x12\x12\n\nmodel_hash\x18\x01 \x01(\t\x12%\n\x06object\x18\x02 \x01(\x0b\x32\x15.sysml.DocumentObject\"\x85\x01\n\x15InstancePathsResponse\x12\"\n\x05paths\x18\x01 \x03(\x0b\x32\x13.sysml.InstancePath\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12&\n\x0b\x64iagnostics\x18\x04 \x03(\x0b\x32\x11.sysml.Diagnostic\"g\n\x0cInstancePath\x12!\n\x04root\x18\x01 \x01(\x0b\x32\x13.sysml.InstanceRoot\x12\x0c\n\x04path\x18\x02 \x01(\t\x12&\n\x05steps\x18\x03 \x03(\x0b\x32\x17.sysml.InstancePathStep\"6\n\x0cInstanceRoot\x12\x13\n\x0binstance_id\x18\x01 \x01(\x03\x12\x11\n\tsymbol_id\x18\x02 \x01(\t\"g\n\x10InstancePathStep\x12\x14\n\x0c\x66\x65\x61ture_name\x18\x01 \x01(\t\x12\x19\n\x11\x66\x65\x61ture_symbol_id\x18\x02 \x01(\t\x12\r\n\x05index\x18\x03 \x01(\x05\x12\x13\n\x0binstance_id\x18\x04 \x01(\x03\"\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\"Z\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\x12\x14\n\x0clibrary_path\x18\x04 \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\"\xc3\x03\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\x12\"\n\x07members\x18\x0b \x03(\x0b\x32\x11.sysml.MemberInfo\x12 \n\x18withheld_library_members\x18\x0c \x01(\x05\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"p\n\nMemberInfo\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\x11\n\tinherited\x18\x04 \x01(\x08\x12\x16\n\x0einherited_from\x18\x05 \x01(\t\x12\x0f\n\x07library\x18\x06 \x01(\x08\"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\"\xb4\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\x12\x1d\n\x05types\x18\x08 \x03(\x0b\x32\x0e.sysml.TypeRef\"#\n\x07TypeRef\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \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\"d\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\x12\x0f\n\x07\x61s_view\x18\x04 \x01(\x08\"Q\n\rQueryResponse\x12+\n\x08\x65lements\x18\x01 \x03(\x0b\x32\x19.sysml.QueryResultElement\x12\x13\n\x0bresult_view\x18\x02 \x01(\t\"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\"\xae\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\x12\x0c\n\x04path\x18\x04 \x01(\t\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\"\x95\x01\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\x12\x14\n\x0cinline_query\x18\x04 \x01(\t\x12\x0f\n\x07\x61s_view\x18\x05 \x01(\x08\"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\"\x83\x01\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\x12\x13\n\x0bresult_view\x18\x03 \x01(\t\"\x1f\n\x0fQueryResultView\x12\x0c\n\x04text\x18\x01 \x01(\t\"\xf1\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\x12\x16\n\x0e\x66\x61ilures_total\x18\x06 \x01(\x05\x12\x16\n\x0e\x66indings_total\x18\x07 \x01(\x05\x12\x1b\n\x13path_failures_total\x18\x08 \x01(\x05\"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\"\xdb\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\x12\x15\n\rmembers_total\x18\x06 \x01(\x05\x12\x16\n\x0e\x66\x65\x61tures_total\x18\x07 \x01(\x05\x12\x13\n\x0bkinds_total\x18\x08 \x01(\x05\"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\"\x85\x01\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\x12\x0c\n\x04\x66orm\x18\x07 \x01(\t\"\x9b\x03\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\x12!\n\x05\x66rame\x18\x0c \x01(\x0b\x32\x12.sysml.RenderFrame\x12(\n\x06header\x18\r \x03(\x0b\x32\x18.sysml.RenderHeaderField\x12\x10\n\x08markdown\x18\x0e \x01(\t\x12\x0c\n\x04html\x18\x0f \x01(\t\x12\x10\n\x08\x61sciidoc\x18\x10 \x01(\t\"0\n\x11RenderHeaderField\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"`\n\x0bRenderFrame\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0f\n\x07\x65xposes\x18\x03 \x03(\t\x12\x0f\n\x07\x66ilters\x18\x04 \x03(\t\x12\x13\n\x0b\x61nnotations\x18\x05 \x03(\t\"\xf0\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\x12\r\n\x05\x61rrow\x18\x10 \x01(\t\x12\x10\n\x08parallel\x18\x11 \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\xca\x12\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\rInstancePaths\x12\x1b.sysml.InstancePathsRequest\x1a\x1c.sysml.InstancePathsResponse\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\x12_\n\x14GetElementProperties\x12\".sysml.GetElementPropertiesRequest\x1a#.sysml.GetElementPropertiesResponse\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=32139 - _globals['_FAILUREREASON']._serialized_end=32316 - _globals['_EDITFAILURE']._serialized_start=32319 - _globals['_EDITFAILURE']._serialized_end=32971 - _globals['_PRIMITIVEOPERATOR']._serialized_start=32974 - _globals['_PRIMITIVEOPERATOR']._serialized_end=33256 - _globals['_COMPOSITEOPERATOR']._serialized_start=33258 - _globals['_COMPOSITEOPERATOR']._serialized_end=33368 + _globals['_FAILUREREASON']._serialized_start=32406 + _globals['_FAILUREREASON']._serialized_end=32583 + _globals['_EDITFAILURE']._serialized_start=32586 + _globals['_EDITFAILURE']._serialized_end=33238 + _globals['_PRIMITIVEOPERATOR']._serialized_start=33241 + _globals['_PRIMITIVEOPERATOR']._serialized_end=33523 + _globals['_COMPOSITEOPERATOR']._serialized_start=33525 + _globals['_COMPOSITEOPERATOR']._serialized_end=33635 _globals['_VERDICT']._serialized_start=23 _globals['_VERDICT']._serialized_end=448 _globals['_VERDICTNOTE']._serialized_start=450 @@ -367,155 +367,159 @@ _globals['_SERVERINFORESPONSE']._serialized_start=20331 _globals['_SERVERINFORESPONSE']._serialized_end=20390 _globals['_QUERYREQUEST']._serialized_start=20392 - _globals['_QUERYREQUEST']._serialized_end=20475 - _globals['_QUERYRESPONSE']._serialized_start=20477 - _globals['_QUERYRESPONSE']._serialized_end=20537 - _globals['_QUERY']._serialized_start=20539 - _globals['_QUERY']._serialized_end=20629 - _globals['_CONSTRAINT']._serialized_start=20631 - _globals['_CONSTRAINT']._serialized_end=20755 - _globals['_PRIMITIVECONSTRAINT']._serialized_start=20757 - _globals['_PRIMITIVECONSTRAINT']._serialized_end=20872 - _globals['_COMPOSITECONSTRAINT']._serialized_start=20874 - _globals['_COMPOSITECONSTRAINT']._serialized_end=20978 - _globals['_QUERYRESULTELEMENT']._serialized_start=20981 - _globals['_QUERYRESULTELEMENT']._serialized_end=21155 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=21106 - _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=21155 - _globals['_SWEEPRANGE']._serialized_start=21157 - _globals['_SWEEPRANGE']._serialized_end=21272 - _globals['_RUNSWEEPREQUEST']._serialized_start=21275 - _globals['_RUNSWEEPREQUEST']._serialized_end=21611 + _globals['_QUERYREQUEST']._serialized_end=20492 + _globals['_QUERYRESPONSE']._serialized_start=20494 + _globals['_QUERYRESPONSE']._serialized_end=20575 + _globals['_QUERY']._serialized_start=20577 + _globals['_QUERY']._serialized_end=20667 + _globals['_CONSTRAINT']._serialized_start=20669 + _globals['_CONSTRAINT']._serialized_end=20793 + _globals['_PRIMITIVECONSTRAINT']._serialized_start=20795 + _globals['_PRIMITIVECONSTRAINT']._serialized_end=20910 + _globals['_COMPOSITECONSTRAINT']._serialized_start=20912 + _globals['_COMPOSITECONSTRAINT']._serialized_end=21016 + _globals['_QUERYRESULTELEMENT']._serialized_start=21019 + _globals['_QUERYRESULTELEMENT']._serialized_end=21193 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_start=21144 + _globals['_QUERYRESULTELEMENT_PROPERTIESENTRY']._serialized_end=21193 + _globals['_SWEEPRANGE']._serialized_start=21195 + _globals['_SWEEPRANGE']._serialized_end=21310 + _globals['_RUNSWEEPREQUEST']._serialized_start=21313 + _globals['_RUNSWEEPREQUEST']._serialized_end=21649 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RUNSWEEPREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_SWEEPROW']._serialized_start=21614 - _globals['_SWEEPROW']._serialized_end=21858 - _globals['_RUNSWEEPRESPONSE']._serialized_start=21861 - _globals['_RUNSWEEPRESPONSE']._serialized_end=22162 - _globals['_RUNRUNSREQUEST']._serialized_start=22165 - _globals['_RUNRUNSREQUEST']._serialized_end=22703 + _globals['_SWEEPROW']._serialized_start=21652 + _globals['_SWEEPROW']._serialized_end=21896 + _globals['_RUNSWEEPRESPONSE']._serialized_start=21899 + _globals['_RUNSWEEPRESPONSE']._serialized_end=22200 + _globals['_RUNRUNSREQUEST']._serialized_start=22203 + _globals['_RUNRUNSREQUEST']._serialized_end=22741 _globals['_RUNRUNSREQUEST_INPUTSENTRY']._serialized_start=5735 _globals['_RUNRUNSREQUEST_INPUTSENTRY']._serialized_end=5794 _globals['_RUNRUNSREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RUNRUNSREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_RUNDISTRIBUTION']._serialized_start=22706 - _globals['_RUNDISTRIBUTION']._serialized_end=23010 - _globals['_RUNPERCENTILE']._serialized_start=23012 - _globals['_RUNPERCENTILE']._serialized_end=23076 - _globals['_RUNHISTOGRAMBIN']._serialized_start=23078 - _globals['_RUNHISTOGRAMBIN']._serialized_end=23165 - _globals['_RUNCOUNTEDVALUE']._serialized_start=23167 - _globals['_RUNCOUNTEDVALUE']._serialized_end=23228 - _globals['_SELFCHECKREQUEST']._serialized_start=23230 - _globals['_SELFCHECKREQUEST']._serialized_end=23296 - _globals['_SELFCHECKFINDING']._serialized_start=23299 - _globals['_SELFCHECKFINDING']._serialized_end=23436 - _globals['_SELFCHECKAPPLICATION']._serialized_start=23438 - _globals['_SELFCHECKAPPLICATION']._serialized_end=23495 - _globals['_SELFCHECKRESPONSE']._serialized_start=23498 - _globals['_SELFCHECKRESPONSE']._serialized_end=23801 - _globals['_RECORDRUNREQUEST']._serialized_start=23804 - _globals['_RECORDRUNREQUEST']._serialized_end=24209 + _globals['_RUNDISTRIBUTION']._serialized_start=22744 + _globals['_RUNDISTRIBUTION']._serialized_end=23048 + _globals['_RUNPERCENTILE']._serialized_start=23050 + _globals['_RUNPERCENTILE']._serialized_end=23114 + _globals['_RUNHISTOGRAMBIN']._serialized_start=23116 + _globals['_RUNHISTOGRAMBIN']._serialized_end=23203 + _globals['_RUNCOUNTEDVALUE']._serialized_start=23205 + _globals['_RUNCOUNTEDVALUE']._serialized_end=23266 + _globals['_SELFCHECKREQUEST']._serialized_start=23268 + _globals['_SELFCHECKREQUEST']._serialized_end=23334 + _globals['_SELFCHECKFINDING']._serialized_start=23337 + _globals['_SELFCHECKFINDING']._serialized_end=23474 + _globals['_SELFCHECKAPPLICATION']._serialized_start=23476 + _globals['_SELFCHECKAPPLICATION']._serialized_end=23533 + _globals['_SELFCHECKRESPONSE']._serialized_start=23536 + _globals['_SELFCHECKRESPONSE']._serialized_end=23839 + _globals['_RECORDRUNREQUEST']._serialized_start=23842 + _globals['_RECORDRUNREQUEST']._serialized_end=24247 _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._serialized_start=899 _globals['_RECORDRUNREQUEST_NAMEDARGUMENTSENTRY']._serialized_end=966 - _globals['_RECORDRUNRESPONSE']._serialized_start=24212 - _globals['_RECORDRUNRESPONSE']._serialized_end=24636 - _globals['_RUNRUNSRESPONSE']._serialized_start=24639 - _globals['_RUNRUNSRESPONSE']._serialized_end=25090 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=25093 - _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=25225 - _globals['_DOCUMENTQUERYBINDING']._serialized_start=25227 - _globals['_DOCUMENTQUERYBINDING']._serialized_end=25306 - _globals['_DOCUMENTVALUE']._serialized_start=25309 - _globals['_DOCUMENTVALUE']._serialized_end=25752 - _globals['_DOCUMENTOBJECT']._serialized_start=25754 - _globals['_DOCUMENTOBJECT']._serialized_end=25844 - _globals['_DOCUMENTVERDICT']._serialized_start=25847 - _globals['_DOCUMENTVERDICT']._serialized_end=26021 - _globals['_DOCUMENTSTATE']._serialized_start=26024 - _globals['_DOCUMENTSTATE']._serialized_end=26201 - _globals['_DOCUMENTEVENT']._serialized_start=26204 - _globals['_DOCUMENTEVENT']._serialized_end=26563 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=26565 - _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=26600 - _globals['_DOCUMENTQUERYCELL']._serialized_start=26602 - _globals['_DOCUMENTQUERYCELL']._serialized_end=26659 - _globals['_DOCUMENTQUERYROW']._serialized_start=26661 - _globals['_DOCUMENTQUERYROW']._serialized_end=26759 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=26761 - _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=26871 - _globals['_QUERYOUTCOME']._serialized_start=26874 - _globals['_QUERYOUTCOME']._serialized_end=27115 - _globals['_QUERYFAILURE']._serialized_start=27117 - _globals['_QUERYFAILURE']._serialized_end=27203 - _globals['_QUERYFRONTIER']._serialized_start=27206 - _globals['_QUERYFRONTIER']._serialized_end=27425 - _globals['_QUERYFRONTIERMEMBER']._serialized_start=27427 - _globals['_QUERYFRONTIERMEMBER']._serialized_end=27481 - _globals['_QUERYFRONTIERFEATURE']._serialized_start=27483 - _globals['_QUERYFRONTIERFEATURE']._serialized_end=27533 - _globals['_QUERYFINDING']._serialized_start=27535 - _globals['_QUERYFINDING']._serialized_end=27618 - _globals['_RENDERDOCUMENTREQUEST']._serialized_start=27620 - _globals['_RENDERDOCUMENTREQUEST']._serialized_end=27698 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=27700 - _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=27793 - _globals['_RENDERVIEWREQUEST']._serialized_start=27795 - _globals['_RENDERVIEWREQUEST']._serialized_end=27914 - _globals['_RENDERVIEWRESPONSE']._serialized_start=27917 - _globals['_RENDERVIEWRESPONSE']._serialized_end=28236 - _globals['_RENDERFRAME']._serialized_start=28238 - _globals['_RENDERFRAME']._serialized_end=28334 - _globals['_RENDERNODE']._serialized_start=28337 - _globals['_RENDERNODE']._serialized_end=28705 - _globals['_RENDERPORT']._serialized_start=28707 - _globals['_RENDERPORT']._serialized_end=28797 - _globals['_RENDEREDGE']._serialized_start=28800 - _globals['_RENDEREDGE']._serialized_end=29016 - _globals['_RENDERGEOMETRY']._serialized_start=29018 - _globals['_RENDERGEOMETRY']._serialized_end=29142 - _globals['_RENDERCANVAS']._serialized_start=29144 - _globals['_RENDERCANVAS']._serialized_end=29221 - _globals['_RENDERSTYLE']._serialized_start=29223 - _globals['_RENDERSTYLE']._serialized_end=29341 - _globals['_RENDERPOINT']._serialized_start=29343 - _globals['_RENDERPOINT']._serialized_end=29378 - _globals['_RENDERROW']._serialized_start=29380 - _globals['_RENDERROW']._serialized_end=29435 - _globals['_RENDERNOTE']._serialized_start=29438 - _globals['_RENDERNOTE']._serialized_end=29616 - _globals['_EXPORTGRAPHSREQUEST']._serialized_start=29618 - _globals['_EXPORTGRAPHSREQUEST']._serialized_end=29676 - _globals['_EXPORTGRAPHSRESPONSE']._serialized_start=29678 - _globals['_EXPORTGRAPHSRESPONSE']._serialized_end=29751 - _globals['_IMPORTDATAREQUEST']._serialized_start=29754 - _globals['_IMPORTDATAREQUEST']._serialized_end=29898 - _globals['_DATAIMPORT']._serialized_start=29900 - _globals['_DATAIMPORT']._serialized_end=29986 - _globals['_IMPORTDATARESPONSE']._serialized_start=29989 - _globals['_IMPORTDATARESPONSE']._serialized_end=30179 - _globals['_IMPORTEDFILE']._serialized_start=30181 - _globals['_IMPORTEDFILE']._serialized_end=30286 - _globals['_IMPORTEDVALUE']._serialized_start=30288 - _globals['_IMPORTEDVALUE']._serialized_end=30407 - _globals['_COMPARERESULTSREQUEST']._serialized_start=30410 - _globals['_COMPARERESULTSREQUEST']._serialized_end=30640 - _globals['_OBSERVABLEPAIR']._serialized_start=30642 - _globals['_OBSERVABLEPAIR']._serialized_end=30691 - _globals['_COMPARERESULTSRESPONSE']._serialized_start=30694 - _globals['_COMPARERESULTSRESPONSE']._serialized_end=30955 - _globals['_CONFIGURATIONCOMPARISON']._serialized_start=30958 - _globals['_CONFIGURATIONCOMPARISON']._serialized_end=31410 - _globals['_OBSERVABLECOMPARISON']._serialized_start=31413 - _globals['_OBSERVABLECOMPARISON']._serialized_end=31741 - _globals['_COMPAREDDISTRIBUTION']._serialized_start=31743 - _globals['_COMPAREDDISTRIBUTION']._serialized_end=31865 - _globals['_STATISTICDIFFERENCE']._serialized_start=31867 - _globals['_STATISTICDIFFERENCE']._serialized_end=31954 - _globals['_CASESTATISTICS']._serialized_start=31956 - _globals['_CASESTATISTICS']._serialized_end=32041 - _globals['_CASESTATISTIC']._serialized_start=32043 - _globals['_CASESTATISTIC']._serialized_end=32136 - _globals['_SYSMLSERVICE']._serialized_start=33371 - _globals['_SYSMLSERVICE']._serialized_end=35749 + _globals['_RECORDRUNRESPONSE']._serialized_start=24250 + _globals['_RECORDRUNRESPONSE']._serialized_end=24674 + _globals['_RUNRUNSRESPONSE']._serialized_start=24677 + _globals['_RUNRUNSRESPONSE']._serialized_end=25128 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_start=25131 + _globals['_RUNDOCUMENTQUERYREQUEST']._serialized_end=25280 + _globals['_DOCUMENTQUERYBINDING']._serialized_start=25282 + _globals['_DOCUMENTQUERYBINDING']._serialized_end=25361 + _globals['_DOCUMENTVALUE']._serialized_start=25364 + _globals['_DOCUMENTVALUE']._serialized_end=25807 + _globals['_DOCUMENTOBJECT']._serialized_start=25809 + _globals['_DOCUMENTOBJECT']._serialized_end=25899 + _globals['_DOCUMENTVERDICT']._serialized_start=25902 + _globals['_DOCUMENTVERDICT']._serialized_end=26076 + _globals['_DOCUMENTSTATE']._serialized_start=26079 + _globals['_DOCUMENTSTATE']._serialized_end=26256 + _globals['_DOCUMENTEVENT']._serialized_start=26259 + _globals['_DOCUMENTEVENT']._serialized_end=26618 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_start=26620 + _globals['_DOCUMENTQUERYCOLUMN']._serialized_end=26655 + _globals['_DOCUMENTQUERYCELL']._serialized_start=26657 + _globals['_DOCUMENTQUERYCELL']._serialized_end=26714 + _globals['_DOCUMENTQUERYROW']._serialized_start=26716 + _globals['_DOCUMENTQUERYROW']._serialized_end=26814 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_start=26817 + _globals['_RUNDOCUMENTQUERYRESPONSE']._serialized_end=26948 + _globals['_QUERYRESULTVIEW']._serialized_start=26950 + _globals['_QUERYRESULTVIEW']._serialized_end=26981 + _globals['_QUERYOUTCOME']._serialized_start=26984 + _globals['_QUERYOUTCOME']._serialized_end=27225 + _globals['_QUERYFAILURE']._serialized_start=27227 + _globals['_QUERYFAILURE']._serialized_end=27313 + _globals['_QUERYFRONTIER']._serialized_start=27316 + _globals['_QUERYFRONTIER']._serialized_end=27535 + _globals['_QUERYFRONTIERMEMBER']._serialized_start=27537 + _globals['_QUERYFRONTIERMEMBER']._serialized_end=27591 + _globals['_QUERYFRONTIERFEATURE']._serialized_start=27593 + _globals['_QUERYFRONTIERFEATURE']._serialized_end=27643 + _globals['_QUERYFINDING']._serialized_start=27645 + _globals['_QUERYFINDING']._serialized_end=27728 + _globals['_RENDERDOCUMENTREQUEST']._serialized_start=27730 + _globals['_RENDERDOCUMENTREQUEST']._serialized_end=27808 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_start=27810 + _globals['_RENDERDOCUMENTRESPONSE']._serialized_end=27903 + _globals['_RENDERVIEWREQUEST']._serialized_start=27906 + _globals['_RENDERVIEWREQUEST']._serialized_end=28039 + _globals['_RENDERVIEWRESPONSE']._serialized_start=28042 + _globals['_RENDERVIEWRESPONSE']._serialized_end=28453 + _globals['_RENDERHEADERFIELD']._serialized_start=28455 + _globals['_RENDERHEADERFIELD']._serialized_end=28503 + _globals['_RENDERFRAME']._serialized_start=28505 + _globals['_RENDERFRAME']._serialized_end=28601 + _globals['_RENDERNODE']._serialized_start=28604 + _globals['_RENDERNODE']._serialized_end=28972 + _globals['_RENDERPORT']._serialized_start=28974 + _globals['_RENDERPORT']._serialized_end=29064 + _globals['_RENDEREDGE']._serialized_start=29067 + _globals['_RENDEREDGE']._serialized_end=29283 + _globals['_RENDERGEOMETRY']._serialized_start=29285 + _globals['_RENDERGEOMETRY']._serialized_end=29409 + _globals['_RENDERCANVAS']._serialized_start=29411 + _globals['_RENDERCANVAS']._serialized_end=29488 + _globals['_RENDERSTYLE']._serialized_start=29490 + _globals['_RENDERSTYLE']._serialized_end=29608 + _globals['_RENDERPOINT']._serialized_start=29610 + _globals['_RENDERPOINT']._serialized_end=29645 + _globals['_RENDERROW']._serialized_start=29647 + _globals['_RENDERROW']._serialized_end=29702 + _globals['_RENDERNOTE']._serialized_start=29705 + _globals['_RENDERNOTE']._serialized_end=29883 + _globals['_EXPORTGRAPHSREQUEST']._serialized_start=29885 + _globals['_EXPORTGRAPHSREQUEST']._serialized_end=29943 + _globals['_EXPORTGRAPHSRESPONSE']._serialized_start=29945 + _globals['_EXPORTGRAPHSRESPONSE']._serialized_end=30018 + _globals['_IMPORTDATAREQUEST']._serialized_start=30021 + _globals['_IMPORTDATAREQUEST']._serialized_end=30165 + _globals['_DATAIMPORT']._serialized_start=30167 + _globals['_DATAIMPORT']._serialized_end=30253 + _globals['_IMPORTDATARESPONSE']._serialized_start=30256 + _globals['_IMPORTDATARESPONSE']._serialized_end=30446 + _globals['_IMPORTEDFILE']._serialized_start=30448 + _globals['_IMPORTEDFILE']._serialized_end=30553 + _globals['_IMPORTEDVALUE']._serialized_start=30555 + _globals['_IMPORTEDVALUE']._serialized_end=30674 + _globals['_COMPARERESULTSREQUEST']._serialized_start=30677 + _globals['_COMPARERESULTSREQUEST']._serialized_end=30907 + _globals['_OBSERVABLEPAIR']._serialized_start=30909 + _globals['_OBSERVABLEPAIR']._serialized_end=30958 + _globals['_COMPARERESULTSRESPONSE']._serialized_start=30961 + _globals['_COMPARERESULTSRESPONSE']._serialized_end=31222 + _globals['_CONFIGURATIONCOMPARISON']._serialized_start=31225 + _globals['_CONFIGURATIONCOMPARISON']._serialized_end=31677 + _globals['_OBSERVABLECOMPARISON']._serialized_start=31680 + _globals['_OBSERVABLECOMPARISON']._serialized_end=32008 + _globals['_COMPAREDDISTRIBUTION']._serialized_start=32010 + _globals['_COMPAREDDISTRIBUTION']._serialized_end=32132 + _globals['_STATISTICDIFFERENCE']._serialized_start=32134 + _globals['_STATISTICDIFFERENCE']._serialized_end=32221 + _globals['_CASESTATISTICS']._serialized_start=32223 + _globals['_CASESTATISTICS']._serialized_end=32308 + _globals['_CASESTATISTIC']._serialized_start=32310 + _globals['_CASESTATISTIC']._serialized_end=32403 + _globals['_SYSMLSERVICE']._serialized_start=33638 + _globals['_SYSMLSERVICE']._serialized_end=36016 # @@protoc_insertion_point(module_scope) diff --git a/client/python/opensysml/proto/sysml_pb2.pyi b/client/python/opensysml/proto/sysml_pb2.pyi index d4ebc095f6..458782326e 100644 --- a/client/python/opensysml/proto/sysml_pb2.pyi +++ b/client/python/opensysml/proto/sysml_pb2.pyi @@ -2080,20 +2080,24 @@ class ServerInfoResponse(_message.Message): def __init__(self, version: _Optional[str] = ..., capabilities: _Optional[_Iterable[str]] = ...) -> None: ... class QueryRequest(_message.Message): - __slots__ = ("model_hash", "query", "oslc_query") + __slots__ = ("model_hash", "query", "oslc_query", "as_view") MODEL_HASH_FIELD_NUMBER: _ClassVar[int] QUERY_FIELD_NUMBER: _ClassVar[int] OSLC_QUERY_FIELD_NUMBER: _ClassVar[int] + AS_VIEW_FIELD_NUMBER: _ClassVar[int] model_hash: str query: Query oslc_query: str - def __init__(self, model_hash: _Optional[str] = ..., query: _Optional[_Union[Query, _Mapping]] = ..., oslc_query: _Optional[str] = ...) -> None: ... + as_view: bool + def __init__(self, model_hash: _Optional[str] = ..., query: _Optional[_Union[Query, _Mapping]] = ..., oslc_query: _Optional[str] = ..., as_view: _Optional[bool] = ...) -> None: ... class QueryResponse(_message.Message): - __slots__ = ("elements",) + __slots__ = ("elements", "result_view") ELEMENTS_FIELD_NUMBER: _ClassVar[int] + RESULT_VIEW_FIELD_NUMBER: _ClassVar[int] elements: _containers.RepeatedCompositeFieldContainer[QueryResultElement] - def __init__(self, elements: _Optional[_Iterable[_Union[QueryResultElement, _Mapping]]] = ...) -> None: ... + result_view: str + def __init__(self, elements: _Optional[_Iterable[_Union[QueryResultElement, _Mapping]]] = ..., result_view: _Optional[str] = ...) -> None: ... class Query(_message.Message): __slots__ = ("scope", "select", "where", "order_by") @@ -2499,16 +2503,18 @@ class RunRunsResponse(_message.Message): def __init__(self, rows: _Optional[_Iterable[_Union[SweepRow, _Mapping]]] = ..., observables: _Optional[_Iterable[str]] = ..., distributions: _Optional[_Iterable[_Union[RunDistribution, _Mapping]]] = ..., lines: _Optional[_Iterable[str]] = ..., outputs: _Optional[_Iterable[_Union[CalcOutput, _Mapping]]] = ..., verdicts: _Optional[_Iterable[_Union[Verdict, _Mapping]]] = ..., unconcluded: _Optional[str] = ..., error: _Optional[str] = ..., diagnostics: _Optional[_Iterable[_Union[Diagnostic, _Mapping]]] = ..., failure_reason: _Optional[_Union[FailureReason, str]] = ..., instances: _Optional[_Iterable[_Union[Instance, _Mapping]]] = ..., engine: _Optional[str] = ..., strength: _Optional[str] = ..., bounds: _Optional[_Iterable[_Union[Bound, _Mapping]]] = ..., seed: _Optional[int] = ...) -> None: ... class RunDocumentQueryRequest(_message.Message): - __slots__ = ("model_hash", "query_id", "bindings", "inline_query") + __slots__ = ("model_hash", "query_id", "bindings", "inline_query", "as_view") MODEL_HASH_FIELD_NUMBER: _ClassVar[int] QUERY_ID_FIELD_NUMBER: _ClassVar[int] BINDINGS_FIELD_NUMBER: _ClassVar[int] INLINE_QUERY_FIELD_NUMBER: _ClassVar[int] + AS_VIEW_FIELD_NUMBER: _ClassVar[int] model_hash: str query_id: str bindings: _containers.RepeatedCompositeFieldContainer[DocumentQueryBinding] inline_query: str - def __init__(self, model_hash: _Optional[str] = ..., query_id: _Optional[str] = ..., bindings: _Optional[_Iterable[_Union[DocumentQueryBinding, _Mapping]]] = ..., inline_query: _Optional[str] = ...) -> None: ... + as_view: bool + def __init__(self, model_hash: _Optional[str] = ..., query_id: _Optional[str] = ..., bindings: _Optional[_Iterable[_Union[DocumentQueryBinding, _Mapping]]] = ..., inline_query: _Optional[str] = ..., as_view: _Optional[bool] = ...) -> None: ... class DocumentQueryBinding(_message.Message): __slots__ = ("parameter", "values") @@ -2656,12 +2662,20 @@ class DocumentQueryRow(_message.Message): def __init__(self, element: _Optional[_Union[DocumentValue, _Mapping]] = ..., cells: _Optional[_Iterable[_Union[DocumentQueryCell, _Mapping]]] = ...) -> None: ... class RunDocumentQueryResponse(_message.Message): - __slots__ = ("columns", "rows") + __slots__ = ("columns", "rows", "result_view") COLUMNS_FIELD_NUMBER: _ClassVar[int] ROWS_FIELD_NUMBER: _ClassVar[int] + RESULT_VIEW_FIELD_NUMBER: _ClassVar[int] columns: _containers.RepeatedCompositeFieldContainer[DocumentQueryColumn] rows: _containers.RepeatedCompositeFieldContainer[DocumentQueryRow] - def __init__(self, columns: _Optional[_Iterable[_Union[DocumentQueryColumn, _Mapping]]] = ..., rows: _Optional[_Iterable[_Union[DocumentQueryRow, _Mapping]]] = ...) -> None: ... + result_view: str + def __init__(self, columns: _Optional[_Iterable[_Union[DocumentQueryColumn, _Mapping]]] = ..., rows: _Optional[_Iterable[_Union[DocumentQueryRow, _Mapping]]] = ..., result_view: _Optional[str] = ...) -> None: ... + +class QueryResultView(_message.Message): + __slots__ = ("text",) + TEXT_FIELD_NUMBER: _ClassVar[int] + text: str + def __init__(self, text: _Optional[str] = ...) -> None: ... class QueryOutcome(_message.Message): __slots__ = ("kind", "step", "failures", "findings", "path_failures", "failures_total", "findings_total", "path_failures_total") @@ -2764,23 +2778,25 @@ class RenderDocumentResponse(_message.Message): def __init__(self, markdown: _Optional[str] = ..., html: _Optional[str] = ..., asciidoc: _Optional[str] = ..., file_name: _Optional[str] = ...) -> None: ... class RenderViewRequest(_message.Message): - __slots__ = ("model_hash", "view", "ports", "show", "depth", "compartments") + __slots__ = ("model_hash", "view", "ports", "show", "depth", "compartments", "form") MODEL_HASH_FIELD_NUMBER: _ClassVar[int] VIEW_FIELD_NUMBER: _ClassVar[int] PORTS_FIELD_NUMBER: _ClassVar[int] SHOW_FIELD_NUMBER: _ClassVar[int] DEPTH_FIELD_NUMBER: _ClassVar[int] COMPARTMENTS_FIELD_NUMBER: _ClassVar[int] + FORM_FIELD_NUMBER: _ClassVar[int] model_hash: str view: str ports: str show: _containers.RepeatedScalarFieldContainer[str] depth: int compartments: str - def __init__(self, model_hash: _Optional[str] = ..., view: _Optional[str] = ..., ports: _Optional[str] = ..., show: _Optional[_Iterable[str]] = ..., depth: _Optional[int] = ..., compartments: _Optional[str] = ...) -> None: ... + form: str + def __init__(self, model_hash: _Optional[str] = ..., view: _Optional[str] = ..., ports: _Optional[str] = ..., show: _Optional[_Iterable[str]] = ..., depth: _Optional[int] = ..., compartments: _Optional[str] = ..., form: _Optional[str] = ...) -> None: ... class RenderViewResponse(_message.Message): - __slots__ = ("view", "kind", "stated", "nodes", "edges", "columns", "rows", "canvas", "notes", "notices", "shown", "frame") + __slots__ = ("view", "kind", "stated", "nodes", "edges", "columns", "rows", "canvas", "notes", "notices", "shown", "frame", "header", "markdown", "html", "asciidoc") VIEW_FIELD_NUMBER: _ClassVar[int] KIND_FIELD_NUMBER: _ClassVar[int] STATED_FIELD_NUMBER: _ClassVar[int] @@ -2793,6 +2809,10 @@ class RenderViewResponse(_message.Message): NOTICES_FIELD_NUMBER: _ClassVar[int] SHOWN_FIELD_NUMBER: _ClassVar[int] FRAME_FIELD_NUMBER: _ClassVar[int] + HEADER_FIELD_NUMBER: _ClassVar[int] + MARKDOWN_FIELD_NUMBER: _ClassVar[int] + HTML_FIELD_NUMBER: _ClassVar[int] + ASCIIDOC_FIELD_NUMBER: _ClassVar[int] view: str kind: str stated: str @@ -2805,7 +2825,19 @@ class RenderViewResponse(_message.Message): notices: _containers.RepeatedScalarFieldContainer[str] shown: _containers.RepeatedScalarFieldContainer[str] frame: RenderFrame - def __init__(self, view: _Optional[str] = ..., kind: _Optional[str] = ..., stated: _Optional[str] = ..., nodes: _Optional[_Iterable[_Union[RenderNode, _Mapping]]] = ..., edges: _Optional[_Iterable[_Union[RenderEdge, _Mapping]]] = ..., columns: _Optional[_Iterable[str]] = ..., rows: _Optional[_Iterable[_Union[RenderRow, _Mapping]]] = ..., canvas: _Optional[_Union[RenderCanvas, _Mapping]] = ..., notes: _Optional[_Iterable[_Union[RenderNote, _Mapping]]] = ..., notices: _Optional[_Iterable[str]] = ..., shown: _Optional[_Iterable[str]] = ..., frame: _Optional[_Union[RenderFrame, _Mapping]] = ...) -> None: ... + header: _containers.RepeatedCompositeFieldContainer[RenderHeaderField] + markdown: str + html: str + asciidoc: str + def __init__(self, view: _Optional[str] = ..., kind: _Optional[str] = ..., stated: _Optional[str] = ..., nodes: _Optional[_Iterable[_Union[RenderNode, _Mapping]]] = ..., edges: _Optional[_Iterable[_Union[RenderEdge, _Mapping]]] = ..., columns: _Optional[_Iterable[str]] = ..., rows: _Optional[_Iterable[_Union[RenderRow, _Mapping]]] = ..., canvas: _Optional[_Union[RenderCanvas, _Mapping]] = ..., notes: _Optional[_Iterable[_Union[RenderNote, _Mapping]]] = ..., notices: _Optional[_Iterable[str]] = ..., shown: _Optional[_Iterable[str]] = ..., frame: _Optional[_Union[RenderFrame, _Mapping]] = ..., header: _Optional[_Iterable[_Union[RenderHeaderField, _Mapping]]] = ..., markdown: _Optional[str] = ..., html: _Optional[str] = ..., asciidoc: _Optional[str] = ...) -> None: ... + +class RenderHeaderField(_message.Message): + __slots__ = ("name", "value") + NAME_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + name: str + value: str + def __init__(self, name: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... class RenderFrame(_message.Message): __slots__ = ("name", "type", "exposes", "filters", "annotations") diff --git a/client/rust/conformance/sysml.descriptor.binpb b/client/rust/conformance/sysml.descriptor.binpb index bf9216b91f..5f5f376551 100644 --- a/client/rust/conformance/sysml.descriptor.binpb +++ b/client/rust/conformance/sysml.descriptor.binpb @@ -1,5 +1,5 @@ -Œá +§ù sysml.protosysml"à Verdict kind ( Rkind @@ -1006,15 +1006,18 @@ start_line (R startLine ServerInfoRequest"R ServerInfoResponse version ( Rversion" - capabilities ( R capabilities"p + capabilities ( R capabilities"‰ QueryRequest model_hash ( R modelHash" query ( 2 .sysml.QueryRquery -oslc_query ( R oslcQuery"F +oslc_query ( R oslcQuery +as_view (RasView"g QueryResponse5 -elements ( 2.sysml.QueryResultElementRelements"y +elements ( 2.sysml.QueryResultElementRelements + result_view ( R +resultView"y Query scope ( Rscope select ( Rselect' @@ -1229,13 +1232,14 @@ model_hash ( R modelHash" strength ( Rstrength$ bounds ( 2 .sysml.BoundRbounds seed (HRseedˆB -_seed"¯ +_seed"È RunDocumentQueryRequest model_hash ( R modelHash query_id ( RqueryId7 bindings ( 2.sysml.DocumentQueryBindingRbindings! - inline_query ( R inlineQuery"b + inline_query ( R inlineQuery +as_view (RasView"b DocumentQueryBinding parameter ( R parameter, values ( 2.sysml.DocumentValueRvalues"Ï @@ -1307,10 +1311,14 @@ state_path ( R statePath* values ( 2.sysml.DocumentValueRvalues"r DocumentQueryRow. element ( 2.sysml.DocumentValueRelement. -cells ( 2.sysml.DocumentQueryCellRcells"} +cells ( 2.sysml.DocumentQueryCellRcells"ž RunDocumentQueryResponse4 columns ( 2.sysml.DocumentQueryColumnRcolumns+ -rows ( 2.sysml.DocumentQueryRowRrows"Ð +rows ( 2.sysml.DocumentQueryRowRrows + result_view ( R +resultView"% +QueryResultView +text ( Rtext"Ð QueryOutcome kind ( Rkind step ( Rstep/ @@ -1357,7 +1365,7 @@ documentId markdown ( Rmarkdown html ( Rhtml asciidoc ( Rasciidoc - file_name ( RfileName"ª + file_name ( RfileName"¾ RenderViewRequest model_hash ( R modelHash @@ -1365,7 +1373,8 @@ model_hash ( R modelHash ports ( Rports show ( Rshow depth (Rdepth" - compartments ( R compartments"– + compartments ( R compartments +form ( Rform"” RenderViewResponse view ( Rview kind ( Rkind @@ -1379,7 +1388,14 @@ model_hash ( R modelHash notices ( Rnotices shown ( Rshown( -frame ( 2.sysml.RenderFrameRframe"‹ +frame ( 2.sysml.RenderFrameRframe0 +header ( 2.sysml.RenderHeaderFieldRheader +markdown ( Rmarkdown +html ( Rhtml +asciidoc ( Rasciidoc"= +RenderHeaderField +name ( Rname +value ( Rvalue"‹ RenderFrame name ( Rname type ( Rtype @@ -1679,8 +1695,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“‡ +²     @@ -10211,7 +10227,7 @@ G ™ B -€œŸ3 ServerInfoResponse describes the running service. +€œ¤3 ServerInfoResponse describes the running service. €œ @@ -10226,8 +10242,8 @@ B €    €  -šC -€ž#ŠC Named capabilities this build supports, each an exact string a client can +ùE +€£#éE 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: @@ -10315,6 +10331,11 @@ B and the response carries the document in `asciidoc`. "render_view" - the RenderView RPC renders a declared view or targeted pseudo-view as machine-readable diagram data. + "query_result_view" - RunDocumentQueryRequest.as_view and + QueryRequest.as_view write the answer as a + QVTS::QueryResult view in result_view (a failed query's as + a QueryResultView detail), and RenderView answers such a + view's header and, for RenderViewRequest.form, a document. "export_graphs" - the ExportGraphs RPC exports the lowered graph of an action or state machine as canonical graphs:1 JSON. "diagnostic_codes" - Diagnostic.code is populated, so an empty code is a @@ -10354,311 +10375,333 @@ B refused with FAILED_PRECONDITION.  -€ž +€£  -€ž  +€£   -€ž +€£  -€ž!" +€£!" V -�¢§G QueryRequest runs a Query against a model the service already parsed. +�§°G QueryRequest runs a Query against a model the service already parsed. -�¢ +�§ ( -�£" from ParseFile response +�¨" from ParseFile response  -�£ +�¨  -�£  +�¨   -�£ +�¨ -�¤ +�©  -�¤ +�©  -�¤ +�©  -�¤ +�© N -�¦? OSLC Query 3.0 parameter text, mutually exclusive with query. +�«? OSLC Query 3.0 parameter text, mutually exclusive with query. + + +�« + +�«  + +�« +Ä +�¯´ Also write the answer as a QVTS::QueryResult view, in result_view; a path or + model error carries its view as a QueryResultView detail. Under the + "query_result_view" capability.  -�¦ +�¯  -�¦  +�¯  -�¦ +�¯ – -‚­¯† QueryResponse contains the elements the query selected, in the order they are +‚¶¼† 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. -‚­ +‚¶ -‚®+ +‚·+ + +‚· +  -‚® +‚·  + +‚·& + +‚·)* +Ü +‚»Ì The answer as SysML text when the request set as_view, as + RunDocumentQueryResponse.result_view; its query is the OSLC text, or the + API query written as `scope=…; select=…; where=…; orderBy=…`.  -‚®  +‚»  -‚®& +‚»   -‚®)* +‚» ¸ -ƒµÂ¨ Query is the standard's Query resource (SysML v2 API & Services). Its `@type` +ƒÂϨ 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. -ƒµ +ƒÂ é -ƒ¹Ù Elements the query considers, each named by qualified name, together with +ƒÆÙ 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.  -ƒ¹ +ƒÆ  -ƒ¹  +ƒÆ   -ƒ¹ +ƒÆ  -ƒ¹ +ƒÆ Z -ƒ»K Properties to report for each matched element. Empty reports all of them. +ƒÈK Properties to report for each matched element. Empty reports all of them.  -ƒ» +ƒÈ  -ƒ»  +ƒÈ   -ƒ» +ƒÈ  -ƒ» +ƒÈ Y -ƒ½J Filter every considered element must satisfy. Unset matches all of them. +ƒÊJ Filter every considered element must satisfy. Unset matches all of them.  -ƒ½ +ƒÊ  -ƒ½  +ƒÊ   -ƒ½ +ƒÊ é -ƒÁÙ Properties the matched elements are sorted by, in order of precedence, +ƒÎÙ 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.  -ƒÁ +ƒÎ  -ƒÁ  +ƒÎ   -ƒÁ +ƒÎ  -ƒÁ +ƒÎ ¥ -„ÆË• Constraint is the standard's Constraint, whose `@type` discriminates between +„ÓØ• 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. -„Æ +„Ó  -„ÇÊ +„Ô×  -„Ç +„Ô -„È& +„Õ&  -„È +„Õ  -„È! +„Õ!  -„È$% +„Õ$% -„É& +„Ö&  -„É +„Ö  -„É! +„Ö!  -„É$% +„Ö$% Y -…ÎÙJ PrimitiveConstraint compares one property of an element against a value. +…ÛæJ PrimitiveConstraint compares one property of an element against a value. -…Î +…Û 2 -…Ð# Negates the comparison's verdict. +…Ý# Negates the comparison's verdict.  -…Ð +…Ý  -…Ð +…Ý  -…Ð +…Ý ¨ -…Ó˜ Property to compare, as named in docs/reference/api.md's query property table +…à˜ Property to compare, as named in docs/reference/api.md's query property table ("@type", "name", "qualifiedName", ...). An unknown one fails the call.  -…Ó +…à  -…Ó  +…à   -…Ó +…à -…Ô! +…á!  -…Ô +…á  -…Ô +…á  -…Ô +…á ð -…Øà Values to compare against. The standard writes one value, and its clients +…åà 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.  -…Ø +…å  -…Ø  +…å   -…Ø +…å  -…Ø +…å € -Ýê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. -é +ö -é#$ +ö#$ í -†ïòÝ CompositeConstraint combines constraints. The standard combines at least two +†üÿÝ 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. -†ï +†ü -†ð! +†ý!  -†ð +†ý  -†ð +†ý  -†ð +†ý -†ñ% +†þ%  -†ñ +†þ  -†ñ  +†þ   -†ñ +†þ  -†ñ#$ +†þ#$ 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" -ø +… -ø +… ± -‡�ˆ¡ QueryResultElement is one matched element. `id` and `type` are always +‡Ž•¡ 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 has no value of. An OSLC query selecting held objects (`rdf:type=elmt:`) answers @@ -10666,1163 +10709,1163 @@ Q instance of, and `path` the object itself. -‡� +‡Ž B -‡‚"3 qualified name, the identity this service reports +‡�"3 qualified name, the identity this service reports  -‡‚ +‡�  -‡‚ +‡�  -‡‚ +‡� I -‡ƒ": metamodel type name ("PartUsage", "PartDefinition", ...) +‡�": metamodel type name ("PartUsage", "PartDefinition", ...)  -‡ƒ +‡�  -‡ƒ +‡�  -‡ƒ +‡� -‡„% +‡‘%  -‡„ +‡‘  -‡„ +‡‘  -‡„#$ +‡‘#$ p -‡‡a The path the session holds an object under (`car.wheels[2]`, `#7`); empty +‡”a The path the session holds an object under (`car.wheels[2]`, `#7`); empty for a model element.  -‡‡ +‡”  -‡‡ +‡”  -‡‡ +‡” á -ˆ�˜Ñ SweepRange is one parameter's range: the endpoints a swept run advances +ˆœ¥Ñ 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. -ˆ� +ˆœ ‹ -ˆ’| Name of the input parameter the range binds, which the target must declare +ˆŸ| Name of the input parameter the range binds, which the target must declare and the request's own arguments must not bind.  -ˆ’ +ˆŸ  -ˆ’  +ˆŸ   -ˆ’ +ˆŸ • -ˆ•… The endpoint the range's runs start at, and the one they run to, which is +ˆ¢… 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.  -ˆ• +ˆ¢  -ˆ• +ˆ¢  -ˆ• +ˆ¢ -ˆ– +ˆ£  -ˆ– +ˆ£  -ˆ– +ˆ£  -ˆ– +ˆ£ -ˆ— +ˆ¤  -ˆ— +ˆ¤  -ˆ— +ˆ¤  -ˆ— +ˆ¤ º -‰žµª RunSweepRequest runs one analysis case or calc once per row of a sweep. Every +‰«Âª 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. -‰ž +‰« -‰Ÿ +‰¬  -‰Ÿ +‰¬  -‰Ÿ  +‰¬   -‰Ÿ +‰¬ G -‰¡8 FQN of the analysis case or calc, definition or usage. +‰®8 FQN of the analysis case or calc, definition or usage.  -‰¡ +‰®  -‰¡  +‰®   -‰¡ +‰® ® -‰¤ž Optional FQN of a part/usage to instantiate as an analysis case's subject, +‰±ž 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.  -‰¤ +‰±  -‰¤  +‰±   -‰¤ +‰± x -‰§i Positional arguments for the target's input parameters, in declaration +‰´i Positional arguments for the target's input parameters, in declaration order, as every row binds them.  -‰§ +‰´  -‰§  +‰´   -‰§ +‰´  -‰§ +‰´ V -‰©)G Arguments bound to input parameters by name, as every row binds them. +‰¶)G Arguments bound to input parameters by name, as every row binds them.  -‰© +‰¶  -‰©$ +‰¶$  -‰©'( +‰¶'( ‚ -‰¬!s The ranges swept, which several of make one row per point of their +‰¹!s The ranges swept, which several of make one row per point of their cartesian product, the first varying slowest.  -‰¬ +‰¹  -‰¬  +‰¹   -‰¬ +‰¹  -‰¬ +‰¹ ¥ -‰¯• Rows to draw uniformly from each range instead of stepping through it. 0 +‰¼• 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.  -‰¯ +‰¼  -‰¯ +‰¼  -‰¯ +‰¼ ” -‰²„ Seed the draws are taken from: the same seed draws the same table on every +‰¿„ Seed the draws are taken from: the same seed draws the same table on every platform. Required with `samples`, ignored without it.  -‰² +‰¿  -‰² +‰¿  -‰² +‰¿ T -‰´E The engine the sweep is put to; see VerifyConstraintRequest.engine. +‰ÁE The engine the sweep is put to; see VerifyConstraintRequest.engine.  -‰´ +‰Á  -‰´  +‰Á   -‰´ +‰Á Õ -ŠºÌÅ 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. -Šº +ŠÇ U -м!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.  -м +ŠÉ  -м  +ŠÉ   -м +ŠÉ  -м +ŠÉ o -Š¿"` 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".  -Š¿ +ŠÌ  -Š¿  +ŠÌ   -Š¿ +ŠÌ  -Š¿ ! +ŠÌ ! T -ŠÁ 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.  -ŠÁ +ŠÎ  -ŠÁ  +ŠÎ   -ŠÁ +ŠÎ  -ŠÁ +ŠÎ 8 -ŠÃ) 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.  -ŠÆ +ŠÓ  -ŠÆ  +ŠÓ   -ŠÆ +ŠÓ 6 -ŠÈ#' 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. -‹Ñ +‹Þ -‹Ò +‹ß  -‹Ò +‹ß  -‹Ò  +‹ß   -‹Ò +‹ß  -‹Ò +‹ß z -‹Õ!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.  -‹Õ +‹â  -‹Õ  +‹â   -‹Õ +‹â  -‹Õ +‹â I -‹×: Whether the rows were drawn rather than stepped through. +‹ä: Whether the rows were drawn rather than stepped through.  -‹× +‹ä  -‹× +‹ä  -‹× +‹ä X -‹Ù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.  -‹Ü +‹é  -‹Ü  +‹é   -‹Ü +‹é -‹Ý& +‹ê&  -‹Ý +‹ê  -‹Ý  +‹ê   -‹Ý! +‹ê!  -‹Ý$% +‹ê$% 6 -‹ß#' 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. -Œî +Œû -Œï +Œü  -Œï +Œü  -Œï  +Œü   -Œï +Œü j -Œò[ 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.  -Œò +Œÿ  -Œò  +Œÿ   -Œò +Œÿ V -Œô G FQN of the Simulation::MonteCarlo analysis case, definition or usage. +Œ� G FQN of the Simulation::MonteCarlo analysis case, definition or usage.  -Œô +Œ�  -Œô  +Œ�   -Œô +Œ� 8 -Œö ) 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.  -Œû +Œˆ  -Œû  +Œˆ   -Œû +Œˆ T -Œý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.  -Œý +ŒŠ  -Œý  +ŒŠ   -Œý +ŒŠ  -Œý +ŒŠ -Œþ) +Œ‹)  -Œþ +Œ‹  -Œþ$ +Œ‹$  -Œþ'( +Œ‹'( 9 -Œ€* 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".  Œ -‡ +”  Œ -‡  +”   Œ -‡ +” W -Œ ‰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.  -Œ � +Œ š  -Œ �  +Œ š   -Œ � +Œ š  -Œ � +Œ š T -Œ �E The engine the runs are put to; see VerifyConstraintRequest.engine. +Œ œE The engine the runs are put to; see VerifyConstraintRequest.engine.  -Œ � +Œ œ  -Œ �  +Œ œ   -Œ � +Œ œ S -�“¤D RunDistribution summarises one observable over the completed runs. +� ±D RunDistribution summarises one observable over the completed runs. -�“ +�  -�” +�¡  -�” +�¡  -�” +�¡  -�” +�¡ [ -�–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.  -�› +�¨  -�› +�¨  -�› +�¨ -�œ +�©  -�œ +�©  -�œ +�©  -�œ +�© -�� +�ª  -�� +�ª  -�� +�ª  -�� +�ª -�ž +�«  -�ž +�«  -�ž +�«  -�ž +�« : -� + Sample standard deviation of the numbers. +�­+ Sample standard deviation of the numbers.  -�  +�­  -�   +�­   -�  +�­ -�¡) +�®)  -�¡ +�®  -�¡  +�®   -�¡$ +�®$  -�¡'( +�®'( -� ¢* +� ¯*  -� ¢ +� ¯  -� ¢  +� ¯   -� ¢$ +� ¯$  -� ¢') +� ¯') � -£' +°'  � -£ +°  � -£  +°   � -£! +°!  � -£$& +°$& R -ާª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 @@ -11831,302 +11874,302 @@ 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 DocumentQueries::Query the model declares (query_id) or one +˜Ôê¾ RunDocumentQueryRequest runs a DocumentQueries::Query the model declares (query_id) or one written in inline_query over a parsed model and its Instantiate objects, binding its parameters. -˜Ç +˜Ô ( -˜È" 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. Exactly one of query_id and inline_query is given.  -˜Ì +˜Ù  -˜Ì  +˜Ù   -˜Ì +˜Ù � -˜Ï-€ 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.  -˜Ï +˜Ü  -˜Ï  +˜Ü   -˜Ï ( +˜Ü (  -˜Ï+, +˜Ü+, Ø -˜ØÈ A query expression to run in place of a named query — the result +˜åÈ A query expression to run in place of a named query — the result expression of a `calc def` specializing DocumentQueries::Query, such as `Project(WhereType(Descendants(Named("Vehicles")), "PartUsage"), ("name", "mass"))` — compiled in the model's context with the DocumentQueries @@ -12136,198 +12179,209 @@ P named query's does. Reported as the "inline_document_query" capability.  -˜Ø +˜å + +˜å  + +˜å +Ä +˜é´ Also write the answer as a QVTS::QueryResult view, in result_view; a path or + model error carries its view as a QueryResultView detail. Under the + "query_result_view" capability. + + +˜é  -˜Ø  +˜é  -˜Ø +˜é 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 @@ -12335,191 +12389,191 @@ 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. -žÃ +žÔ ¼ -žÊ¬ "accept", "send", "transition", "entry", "exit", "do", "choice", "guard" or +žÛ¬ "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 @@ -12527,571 +12581,596 @@ Z 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.  -žÓ +žä  -žÓ  +žä   -žÓ +žä � -žÖ� The state entered, exited or stepped by an entry, exit or do record; the +žç� 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.  -žÖ +žç  -žÖ  +žç   -žÖ +žç Ç -žÚ· A fired transition's source and target states; a step's source node (empty +žë· 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.  -žÞ +žï  -žÞ +žï  -žÞ +žï “ -žáƒ The signal or event accepted or sent, the trigger a transition fired on, or +žòƒ 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.  -ž ã +ž ô  -ž ã  +ž ô   -ž ã +ž ô  -ž ã +ž ô ¥ ž -æ$• 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 +ž þ× 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 +ž‚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. -¢Ž +¢Ÿ -¢�+ +¢ +  -¢� +¢   -¢�  +¢    -¢�& +¢ &  -¢�)* +¢ )* -¢�% +¢¡% + +¢¡ + + +¢¡  + +¢¡ + +¢¡#$ +ò +¢¥â The answer as SysML text when the request set as_view: a package holding one + `view : QVTS::QueryResult` that exposes each selected element and states the + query with its bindings, the source, the outcome and the provenance. + + +¢¥ + +¢¥   -¢� +¢¥ +É +£ª¬¹ QueryResultView is a failed query written as a QVTS::QueryResult view, an error + detail beside QueryOutcome when the request set as_view: it exposes the frontier and finding elements. + +£ª + +£«  -¢�  +£«  -¢� +£«  -¢�#$ +£« Ä -£• ´ 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  -£š +¤µ  -£š  +¤µ   -£š% +¤µ%  -£š() +¤µ() É -£�¹ The detail is bounded to fit a status trailer: the lists above hold the first +¤¸¹ The detail is bounded to fit a status trailer: the lists above hold the first few of a fan-out, and these count how many there were in all (the CLI's -json record carries every one).  -£� +¤¸  -£� +¤¸  -£� +¤¸ -£ž +¤¹  -£ž +¤¹  -£ž +¤¹  -£ž +¤¹ -£Ÿ +¤º  -£Ÿ +¤º  -£Ÿ +¤º  -£Ÿ +¤º � -¤¤¨� 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  -¥± +¦Ì  -¥±  +¦Ì   -¥± +¦Ì Ç -¥´· Bounded to fit a status trailer: members, features and kinds hold the nearest spellings +¦Ï· Bounded to fit a status trailer: members, features and kinds hold the nearest spellings only, and these count how many there were in all (the CLI's -json record carries every one).  -¥´ +¦Ï  -¥´ +¦Ï  -¥´ +¦Ï -¥µ +¦Ð  -¥µ +¦Ð  -¥µ +¦Ð  -¥µ +¦Ð -¥¶ +¦Ñ  -¥¶ +¦Ñ  -¥¶ +¦Ñ  -¥¶ +¦Ñ -¦¹¼ +§Ô× -¦¹ +§Ô -¦º +§Õ  -¦º +§Õ  -¦º +§Õ  -¦º +§Õ -¦» +§Ö  -¦» +§Ö  -¦»  +§Ö   -¦» +§Ö -§¾Á +¨ÙÜ -§¾ +¨Ù -§¿ +¨Ú  -§¿ +¨Ú  -§¿ +¨Ú  -§¿ +¨Ú - -§À" 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 @@ -13099,1938 +13178,2009 @@ 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).  -«ÿ +¬š + +¬š  + +¬š +  +¬Ÿ� A document form to also render a QVTS::QueryResult view in — "markdown", + "html" or "asciidoc", as RenderDocumentRequest.form — answered in the + response's field of that name. Fails with INVALID_ARGUMENT for any other + view. Under the "query_result_view" capability. + + +¬Ÿ  -«ÿ  +¬Ÿ  -«ÿ +¬Ÿ Y -¬ƒ•J RenderViewResponse carries all machine-readable fields of the rendering. +­£¼J RenderViewResponse carries all machine-readable fields of the rendering. -¬ƒ +­£ -¬„ +­¤  -¬„ +­¤  -¬„ +­¤  -¬„ +­¤ -¬… +­¥  -¬… +­¥  -¬… +­¥  -¬… +­¥ -¬† +­¦  -¬† +­¦  -¬†  +­¦   -¬† +­¦ „ -¬‰ u Nodes are flattened with parents before children; each node is listed once, +­© u Nodes are flattened with parents before children; each node is listed once, and ids are unique within a rendering.  -¬‰ +­©  -¬‰  +­©   -¬‰ +­©  -¬‰ +­© -¬Š +­ª  -¬Š +­ª  -¬Š  +­ª   -¬Š +­ª  -¬Š +­ª -¬‹ +­«  -¬‹ +­«  -¬‹  +­«   -¬‹ +­«  -¬‹ +­« -¬Œ +­¬  -¬Œ +­¬  -¬Œ  +­¬   -¬Œ +­¬  -¬Œ +­¬ 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.  -¬ -’ +­ +²  -¬ -’  +­ +²   -¬ -’ +­ +²  -¬ -’ +­ +² Z -¬ ”K The view frame round a graph-shaped rendering; unset for a frameless one. +­ ´K The view frame round a graph-shaped rendering; unset for a frameless one.  -¬ ” +­ ´ + +­ ´ + +­ ´ +Œ +­ ·)} A QVTS::QueryResult view's query, source, outcome and provenance, in that + order, above its rows; empty for any other view. + + +­ · + + +­ ·  + +­ ·# + +­ ·&( +\ +­ ¹M The view as a document in the form the request asked for, the others empty. + + +­ ¹ + +­ ¹  + +­ ¹ + +­º + +­º + +­º + +­º + +­» + +­» + +­»  + +­» +W +®¿ÂH RenderHeaderField is one stated attribute of a QVTS::QueryResult view. + + +®¿ + +®À + +®À + +®À + +®À + +®Á + +®Á  -¬ ” +®Á   -¬ ” +®Á ò -­š â RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's +¯ÇÍâ RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's name and view definition, and the lines of the three information compartments (exposes top right, filters bottom left, annotations bottom right). -­š +¯Ç -­› +¯È  -­› +¯È  -­› +¯È  -­› +¯È -­œ +¯É  -­œ +¯É  -­œ +¯É  -­œ +¯É -­� +¯Ê  -­� +¯Ê  -­�  +¯Ê   -­� +¯Ê  -­� +¯Ê -­ž +¯Ë  -­ž +¯Ë  -­ž  +¯Ë   -­ž +¯Ë  -­ž +¯Ë -­Ÿ" +¯Ì"  -­Ÿ +¯Ì  -­Ÿ  +¯Ì   -­Ÿ +¯Ì  -­Ÿ ! +¯Ì ! 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.  -®¸ +°å  -®¸ +°å  -®¸ +°å õ -®¼å Set on an item box drawn on a connection line (a flow, succession flow or +°éå Set on an item box drawn on a connection line (a flow, succession flow or message whose ends are the connection's): "right" when the item goes toward the line's second end, "left" toward its first. Empty for every other node.  -®¼ +°é  -®¼  +°é   -®¼ +°é c -®¾T The state's substates run in parallel; a label writes «parallel» under the name. +°ëT The state's substates run in parallel; a label writes «parallel» under the 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 713f3ee9c5..146a6d28cd 100644 --- a/client/rust/opensysml/src/proto/sysml/sysml.rs +++ b/client/rust/opensysml/src/proto/sysml/sysml.rs @@ -3160,6 +3160,11 @@ pub struct ServerInfoResponse { /// and the response carries the document in `asciidoc`. /// "render_view" - the RenderView RPC renders a declared view or targeted /// pseudo-view as machine-readable diagram data. + /// "query_result_view" - RunDocumentQueryRequest.as_view and + /// QueryRequest.as_view write the answer as a + /// QVTS::QueryResult view in result_view (a failed query's as + /// a QueryResultView detail), and RenderView answers such a + /// view's header and, for RenderViewRequest.form, a document. /// "export_graphs" - the ExportGraphs RPC exports the lowered graph of an /// action or state machine as canonical graphs:1 JSON. /// "diagnostic_codes" - Diagnostic.code is populated, so an empty code is a @@ -3211,6 +3216,11 @@ pub struct QueryRequest { /// OSLC Query 3.0 parameter text, mutually exclusive with query. #[prost(string, tag="3")] pub oslc_query: ::prost::alloc::string::String, + /// Also write the answer as a QVTS::QueryResult view, in result_view; a path or + /// model error carries its view as a QueryResultView detail. Under the + /// "query_result_view" capability. + #[prost(bool, tag="4")] + pub as_view: bool, } /// 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; @@ -3220,6 +3230,11 @@ pub struct QueryRequest { pub struct QueryResponse { #[prost(message, repeated, tag="1")] pub elements: ::prost::alloc::vec::Vec, + /// The answer as SysML text when the request set as_view, as + /// RunDocumentQueryResponse.result_view; its query is the OSLC text, or the + /// API query written as `scope=…; select=…; where=…; orderBy=…`. + #[prost(string, tag="2")] + pub result_view: ::prost::alloc::string::String, } /// 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 @@ -3800,6 +3815,11 @@ pub struct RunDocumentQueryRequest { /// named query's does. Reported as the "inline_document_query" capability. #[prost(string, tag="4")] pub inline_query: ::prost::alloc::string::String, + /// Also write the answer as a QVTS::QueryResult view, in result_view; a path or + /// model error carries its view as a QueryResultView detail. Under the + /// "query_result_view" capability. + #[prost(bool, tag="5")] + pub as_view: bool, } /// DocumentQueryBinding binds one entry parameter of a document query. #[derive(Clone, PartialEq, ::prost::Message)] @@ -4053,6 +4073,18 @@ pub struct RunDocumentQueryResponse { pub columns: ::prost::alloc::vec::Vec, #[prost(message, repeated, tag="2")] pub rows: ::prost::alloc::vec::Vec, + /// The answer as SysML text when the request set as_view: a package holding one + /// `view : QVTS::QueryResult` that exposes each selected element and states the + /// query with its bindings, the source, the outcome and the provenance. + #[prost(string, tag="3")] + pub result_view: ::prost::alloc::string::String, +} +/// QueryResultView is a failed query written as a QVTS::QueryResult view, an error +/// detail beside QueryOutcome when the request set as_view: it exposes the frontier and finding elements. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct QueryResultView { + #[prost(string, tag="1")] + pub text: ::prost::alloc::string::String, } /// 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. @@ -4216,6 +4248,12 @@ pub struct RenderViewRequest { /// "ports" (the port usages with the ports nested under them). #[prost(string, tag="6")] pub compartments: ::prost::alloc::string::String, + /// A document form to also render a QVTS::QueryResult view in — "markdown", + /// "html" or "asciidoc", as RenderDocumentRequest.form — answered in the + /// response's field of that name. Fails with INVALID_ARGUMENT for any other + /// view. Under the "query_result_view" capability. + #[prost(string, tag="7")] + pub form: ::prost::alloc::string::String, } /// RenderViewResponse carries all machine-readable fields of the rendering. #[derive(Clone, PartialEq, ::prost::Message)] @@ -4249,6 +4287,25 @@ pub struct RenderViewResponse { /// The view frame round a graph-shaped rendering; unset for a frameless one. #[prost(message, optional, tag="12")] pub frame: ::core::option::Option, + /// A QVTS::QueryResult view's query, source, outcome and provenance, in that + /// order, above its rows; empty for any other view. + #[prost(message, repeated, tag="13")] + pub header: ::prost::alloc::vec::Vec, + /// The view as a document in the form the request asked for, the others empty. + #[prost(string, tag="14")] + pub markdown: ::prost::alloc::string::String, + #[prost(string, tag="15")] + pub html: ::prost::alloc::string::String, + #[prost(string, tag="16")] + pub asciidoc: ::prost::alloc::string::String, +} +/// RenderHeaderField is one stated attribute of a QVTS::QueryResult view. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct RenderHeaderField { + #[prost(string, tag="1")] + pub name: ::prost::alloc::string::String, + #[prost(string, tag="2")] + pub value: ::prost::alloc::string::String, } /// RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's /// name and view definition, and the lines of the three information diff --git a/cmd/sysml/check.go b/cmd/sysml/check.go index 557c99f03f..309da8f3f8 100644 --- a/cmd/sysml/check.go +++ b/cmd/sysml/check.go @@ -888,13 +888,51 @@ func runChecks(files []string, exprs []string, c checks) int { // after the behaviors named have run, so a query over the session's states or // trace reads what the run did. func (c *checks) runQueries(sess *repl.Session, rep *reporter) { + if len(c.queries) == 0 { + return + } + sess.SetResultViews(asViewPath != "") + var views []string for _, query := range c.queries { + var verdict repl.Verdict if query.inline { - rep.verdict(sess.RunInlineDocumentQuery(query.text)) - continue + verdict = sess.RunInlineDocumentQuery(query.text) + } else { + verdict = sess.RunDocumentQuery(query.text) } - rep.verdict(sess.RunDocumentQuery(query.text)) + if verdict.ResultView != "" { + views = append(views, verdict.ResultView) + // -json reports the view in the check's resultView beside its rows. + if asViewPath == stdoutPath && !rep.machine { + view := resultViewLines(verdict.ResultView, len(views) > 1) + // A failed query's view is printed before its error, which keeps the exit status. + if verdict.Status == repl.VerdictUnresolved { + rep.info(view) + } else { + verdict.Lines = view + } + } + } + rep.verdict(verdict) + } + if asViewPath == "" || asViewPath == stdoutPath || len(views) == 0 { + return + } + if err := writeOutputFile(asViewPath, []byte(strings.Join(views, "\n")), "QueryResult view"); err != nil { + rep.verdict(repl.Verdict{Subject: "-as-view", Status: repl.VerdictUnresolved, Lines: []string{"error: " + err.Error()}}) + } +} + +// stdoutPath is the -as-view argument that prints the view in place of the rows. +const stdoutPath = "-" + +// resultViewLines are a view's lines, after a blank one when it follows another. +func resultViewLines(view string, follows bool) []string { + lines := strings.Split(strings.TrimRight(view, "\n"), "\n") + if follows { + return append([]string{""}, lines...) } + return lines } // queryInvocation is one query to run: a named query with its bindings, as diff --git a/cmd/sysml/main.go b/cmd/sysml/main.go index 4387b0a962..ef39f17157 100644 --- a/cmd/sysml/main.go +++ b/cmd/sysml/main.go @@ -128,6 +128,7 @@ var ( bundleDir string unbundleFile string queryText string + asViewPath string outputPath string fromFormat string idForm string @@ -410,6 +411,10 @@ func runCLI() int { fmt.Fprintln(os.Stderr, `sysml: -query is empty; give it OSLC Query text, as -query 'sysml:name="battery"'`) return 2 } + if flagGiven("as-view") && (asViewPath == "" || queryText == "" && len(modelChecks.queries) == 0) { + fmt.Fprintln(os.Stderr, "sysml: -as-view names the file the answer of -run-query, -run-inline-query or -query is written to as a QVTS::QueryResult view, or - to print it in place of the rows, as -run-query Heavy -as-view heavy.sysml") + return 2 + } if flagGiven("graphs") && graphsSubject == "" { fmt.Fprintln(os.Stderr, "sysml: -graphs is empty; name the action or state machine to export, as -graphs Pipeline::terrain") return 2 diff --git a/cmd/sysml/query.go b/cmd/sysml/query.go index da166ba754..f58d4ff442 100644 --- a/cmd/sysml/query.go +++ b/cmd/sysml/query.go @@ -18,7 +18,25 @@ func runQuery(files []string, text string) int { if status != exitHolds { return status } - lines, err := sess.Query(text) + var lines []string + if asViewPath == "" { + lines, err = sess.Query(text) + } else { + var written string + lines, written, err = sess.QueryAsView(text) + // A path or model error is an outcome too: its view is written before the error is reported. + switch { + case written == "": + case asViewPath != stdoutPath: + if werr := writeOutputFile(asViewPath, []byte(written), "QueryResult view"); werr != nil { + return fail(werr) + } + case err != nil: + writeLines(os.Stdout, resultViewLines(written, false)) + default: + lines = resultViewLines(written, false) + } + } if err != nil { return fail(err) } diff --git a/cmd/sysml/report.go b/cmd/sysml/report.go index bddf7169d3..5f7fe115b1 100644 --- a/cmd/sysml/report.go +++ b/cmd/sysml/report.go @@ -154,6 +154,8 @@ type checkResult struct { // Outcome is the QVTS record behind a document query that could not be run: // `pathError` or `modelError` with its step and frontier; absent otherwise. Outcome *queryexec.Outcome `json:"outcome,omitempty"` + // ResultView is a document query's answer as a QVTS::QueryResult view, under -as-view. + ResultView string `json:"resultView,omitempty"` // Verifications are the verdicts the bodies of the verification cases // verifying the requirement produced, reported beside its own. Verifications []verificationVerdict `json:"verifications,omitempty"` @@ -921,6 +923,7 @@ func (r *reporter) finish() int { Values: namedValues(v.Values), Lines: v.Lines, Outcome: v.Outcome, + ResultView: v.ResultView, Verifications: verificationVerdicts(v.Verifications), Evaluations: caseEvaluations(v.Evaluations), Rows: checkRows(v.Rows), diff --git a/cmd/sysml/usage.go b/cmd/sysml/usage.go index 7ee5e2012e..51553abe9b 100644 --- a/cmd/sysml/usage.go +++ b/cmd/sysml/usage.go @@ -689,6 +689,7 @@ func registerFlags(fs *flag.FlagSet) { fs.StringVar(&modelChecks.recordInto, "record-into", "", "Record -record-run runs into this package instead of a Records package beside the case's") fs.Var(queryFlag{queries: &modelChecks.queries}, "run-query", "Execute this document query and report its rows, as -run-query \"Heavy root=telescope\" (repeatable)") fs.Var(queryFlag{queries: &modelChecks.queries, inline: true}, "run-inline-query", "Execute this query expression — the body of a document query, written in place — and report its rows, as -run-inline-query 'Project(WhereType(Descendants(Named(\"Vehicles\")), \"PartUsage\"), (\"name\", \"mass\"))' (repeatable)") + fs.StringVar(&asViewPath, "as-view", "", "Write the answer of each -run-query, -run-inline-query or -query into this file as a QVTS::QueryResult view, or with - print it in place of the rows: the selected elements exposed, or a path or model error's frontier and finding elements, with the query, source, outcome and provenance") fs.Var(&modelChecks.instantiate, "instantiate", "Create an object of this definition or usage before the checks, so a verdict is about it (repeatable)") fs.BoolVar(&modelChecks.jsonOut, "json", false, "Report checks as one JSON document rather than as lines") fs.StringVar(&modelChecks.format, "format", "", "Report checks as text, json, sarif or junit; json is -json, and sarif (SARIF 2.1.0) and junit (JUnit XML) carry -validate's diagnostics to a CI service") @@ -817,6 +818,7 @@ func optionGroups() []usage.OptionGroup { usage.Opt("record-into", ""), usage.Opt("run-query", ""), usage.Opt("run-inline-query", ""), + usage.Opt("as-view", fileArg), usage.Opt("instantiate", nameArg), usage.Opt("json", ""), usage.Opt("format", ""), diff --git a/examples/qvts/README.md b/examples/qvts/README.md index 863a2c4e72..783bfed030 100644 --- a/examples/qvts/README.md +++ b/examples/qvts/README.md @@ -802,3 +802,121 @@ SysML v2 REPL — %help for commands, Ctrl-D to exit ``` Exit status: 0 + + +## 11. The answer as a `QVTS::QueryResult` view + +`-as-view -` prints a query's answer as a view in place of its rows; `-as-view +` writes it to a file beside them. The view exposes the selected elements +by reference and states the query, the files it ran over, the outcome and the +digest of the model. + +```console +$ bin/sysml examples/qvts/lander.sysml examples/qvts/queries.sysml -run-query QVTSDemo::CabinMass -as-view - +``` + +```text +✓ package Lander +✓ package QVTSDemo +package CabinMassResult { + private import QVTS::*; + + view cabinMass : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "QVTSDemo::CabinMass"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd"; + } +} +``` + +Exit status: 0 + +A path or model error is an outcome too. Its view exposes the frontier's +elements, and its provenance names the failing step. + +```console +$ bin/sysml examples/qvts/lander.sysml examples/qvts/queries.sysml -run-query QVTSDemo::MisspelledName -as-view - +``` + +```text +✓ package Lander +✓ package QVTSDemo +package MisspelledNameResult { + private import QVTS::*; + + view misspelledName : QueryResult { + expose Lander::lander; + attribute :>> query = "QVTSDemo::MisspelledName"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni)"; + } +} +sysml: query QVTSDemo::MisspelledName names no element Lander::lander::cabni: Lander::lander has no member cabni — did you mean cabin? + path error at Named(Lander::lander::cabni): expected exactly one element with that qualified name + at Lander::lander; members: [cabin (PartUsage), cabinEngine (ConnectionUsage), engine (PartUsage), engineBay (ConnectionUsage), scienceBay (PartUsage)]; nearest: cabin +``` + +Exit status: 2 + +OSLC Query text answers through the same engine, so `-query` writes the same +view. A property the metamodel does not define is a path error whose frontier is +the property names, none of them an element to expose. + +```console +$ bin/sysml examples/qvts/lander.sysml -query 'oslc.where=sysml:name="cabin"' -as-view - +``` + +```text +✓ package Lander +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "oslc.where=sysml:name=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206"; + } +} +``` + +Exit status: 0 + +```console +$ bin/sysml examples/qvts/lander.sysml -query 'oslc.where=sysml:nme="cabin"' -as-view - +``` + +```text +✓ package Lander +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + attribute :>> query = "oslc.where=sysml:nme=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme)"; + } +} +sysml: unknown OSLC query property "sysml:nme" — did you mean sysml:name? +``` + +Exit status: 2 + +`expected/views/` records each of these views, an empty selection, a fan-out, +the duplicate-name model error and an inline query, with the view rendered by +`-render` (`.txt`, `.view.md`) and by `-render-document` in Markdown, HTML and +AsciiDoc. A view loads beside the model it was written over: + +```console +$ bin/sysml examples/qvts/lander.sysml examples/qvts/queries.sysml examples/qvts/expected/views/cabin-mass.sysml -render-document CabinMassResult::cabinMass +``` + +`observatory/` holds `observatory.sysml` and `result.sysml` from +[Open-MBEE/qvts](https://github.com/Open-MBEE/qvts) `examples/` at commit +`302893676c3dfa77693404e31243e31dc266c3b7`, unchanged: the view that repository +writes by hand, rendered here as `expected/views/heavy-parts.*`. diff --git a/examples/qvts/expected/view-cabin-mass.txt b/examples/qvts/expected/view-cabin-mass.txt new file mode 100644 index 0000000000..2548beaaa2 --- /dev/null +++ b/examples/qvts/expected/view-cabin-mass.txt @@ -0,0 +1,13 @@ +✓ package Lander +✓ package QVTSDemo +package CabinMassResult { + private import QVTS::*; + + view cabinMass : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "QVTSDemo::CabinMass"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd"; + } +} diff --git a/examples/qvts/expected/view-misspelled-name.txt b/examples/qvts/expected/view-misspelled-name.txt new file mode 100644 index 0000000000..37e3db3d1d --- /dev/null +++ b/examples/qvts/expected/view-misspelled-name.txt @@ -0,0 +1,16 @@ +✓ package Lander +✓ package QVTSDemo +package MisspelledNameResult { + private import QVTS::*; + + view misspelledName : QueryResult { + expose Lander::lander; + attribute :>> query = "QVTSDemo::MisspelledName"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni)"; + } +} +sysml: query QVTSDemo::MisspelledName names no element Lander::lander::cabni: Lander::lander has no member cabni — did you mean cabin? + path error at Named(Lander::lander::cabni): expected exactly one element with that qualified name + at Lander::lander; members: [cabin (PartUsage), cabinEngine (ConnectionUsage), engine (PartUsage), engineBay (ConnectionUsage), scienceBay (PartUsage)]; nearest: cabin diff --git a/examples/qvts/expected/view-oslc-cabin.txt b/examples/qvts/expected/view-oslc-cabin.txt new file mode 100644 index 0000000000..7569df509d --- /dev/null +++ b/examples/qvts/expected/view-oslc-cabin.txt @@ -0,0 +1,12 @@ +✓ package Lander +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "oslc.where=sysml:name=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206"; + } +} diff --git a/examples/qvts/expected/view-oslc-unknown-property.txt b/examples/qvts/expected/view-oslc-unknown-property.txt new file mode 100644 index 0000000000..e15c59a9c7 --- /dev/null +++ b/examples/qvts/expected/view-oslc-unknown-property.txt @@ -0,0 +1,12 @@ +✓ package Lander +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + attribute :>> query = "oslc.where=sysml:nme=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme)"; + } +} +sysml: unknown OSLC query property "sysml:nme" — did you mean sysml:name? diff --git a/examples/qvts/expected/views/ambiguous-part.adoc b/examples/qvts/expected/views/ambiguous-part.adoc new file mode 100644 index 0000000000..e50c5889c3 --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.adoc @@ -0,0 +1,12 @@ += AmbiguousPartResult::ambiguousPart + +query:: QVTSDemo::AmbiguousPart +source:: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +outcome:: modelError +provenance:: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated) + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Duplicates | package | | +|=== diff --git a/examples/qvts/expected/views/ambiguous-part.html b/examples/qvts/expected/views/ambiguous-part.html new file mode 100644 index 0000000000..38415c3e00 --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.html @@ -0,0 +1,234 @@ + + + + + +AmbiguousPartResult::ambiguousPart + + + +
+

AmbiguousPartResult::ambiguousPart

+
+
+
query
+
QVTSDemo::AmbiguousPart
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
modelError
+
+
+
provenance
+
sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated)
+
+
+ + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Duplicatespackage
+
+ + diff --git a/examples/qvts/expected/views/ambiguous-part.md b/examples/qvts/expected/views/ambiguous-part.md new file mode 100644 index 0000000000..fc573b46a0 --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.md @@ -0,0 +1,13 @@ +# AmbiguousPartResult::ambiguousPart + +**query** — QVTSDemo::AmbiguousPart + +**source** — examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml + +**outcome** — modelError + +**provenance** — sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Duplicates | package | | | diff --git a/examples/qvts/expected/views/ambiguous-part.sysml b/examples/qvts/expected/views/ambiguous-part.sysml new file mode 100644 index 0000000000..10e29c2a1c --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.sysml @@ -0,0 +1,11 @@ +package AmbiguousPartResult { + private import QVTS::*; + + view ambiguousPart : QueryResult { + expose Duplicates; + attribute :>> query = "QVTSDemo::AmbiguousPart"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::modelError; + attribute :>> provenance = "sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated)"; + } +} diff --git a/examples/qvts/expected/views/ambiguous-part.txt b/examples/qvts/expected/views/ambiguous-part.txt new file mode 100644 index 0000000000..a749b469ef --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.txt @@ -0,0 +1,10 @@ +AmbiguousPartResult::ambiguousPart - table rendering (view def QueryResult) + +query: QVTSDemo::AmbiguousPart +source: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +outcome: modelError +provenance: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated) + +Element Kind Type Declared in +---------- ------- ---- ----------- +Duplicates package diff --git a/examples/qvts/expected/views/ambiguous-part.view.md b/examples/qvts/expected/views/ambiguous-part.view.md new file mode 100644 index 0000000000..0b1268bf98 --- /dev/null +++ b/examples/qvts/expected/views/ambiguous-part.view.md @@ -0,0 +1,10 @@ + + +- **query**: QVTSDemo::AmbiguousPart +- **source**: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +- **outcome**: modelError +- **provenance**: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad; step Named(Duplicates::repeated) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Duplicates | package | | | diff --git a/examples/qvts/expected/views/cabin-mass.adoc b/examples/qvts/expected/views/cabin-mass.adoc new file mode 100644 index 0000000000..4a9bfe3a90 --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.adoc @@ -0,0 +1,12 @@ += CabinMassResult::cabinMass + +query:: QVTSDemo::CabinMass +source:: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome:: established +provenance:: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Lander::lander::cabin | part | Payload | Lander::lander +|=== diff --git a/examples/qvts/expected/views/cabin-mass.html b/examples/qvts/expected/views/cabin-mass.html new file mode 100644 index 0000000000..7d05681cfd --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.html @@ -0,0 +1,234 @@ + + + + + +CabinMassResult::cabinMass + + + +
+

CabinMassResult::cabinMass

+
+
+
query
+
QVTSDemo::CabinMass
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd
+
+
+ + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Lander::lander::cabinpartPayloadLander::lander
+
+ + diff --git a/examples/qvts/expected/views/cabin-mass.md b/examples/qvts/expected/views/cabin-mass.md new file mode 100644 index 0000000000..67ac1b1ddf --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.md @@ -0,0 +1,13 @@ +# CabinMassResult::cabinMass + +**query** — QVTSDemo::CabinMass + +**source** — examples/qvts/lander.sysml examples/qvts/queries.sysml + +**outcome** — established + +**provenance** — sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/cabin-mass.sysml b/examples/qvts/expected/views/cabin-mass.sysml new file mode 100644 index 0000000000..1acd08a68b --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.sysml @@ -0,0 +1,11 @@ +package CabinMassResult { + private import QVTS::*; + + view cabinMass : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "QVTSDemo::CabinMass"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd"; + } +} diff --git a/examples/qvts/expected/views/cabin-mass.txt b/examples/qvts/expected/views/cabin-mass.txt new file mode 100644 index 0000000000..7babb1331b --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.txt @@ -0,0 +1,10 @@ +CabinMassResult::cabinMass - table rendering (view def QueryResult) + +query: QVTSDemo::CabinMass +source: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome: established +provenance: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +Element Kind Type Declared in +--------------------- ---- ------- -------------- +Lander::lander::cabin part Payload Lander::lander diff --git a/examples/qvts/expected/views/cabin-mass.view.md b/examples/qvts/expected/views/cabin-mass.view.md new file mode 100644 index 0000000000..4210a1ca00 --- /dev/null +++ b/examples/qvts/expected/views/cabin-mass.view.md @@ -0,0 +1,10 @@ + + +- **query**: QVTSDemo::CabinMass +- **source**: examples/qvts/lander.sysml examples/qvts/queries.sysml +- **outcome**: established +- **provenance**: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/double-mass-value.adoc b/examples/qvts/expected/views/double-mass-value.adoc new file mode 100644 index 0000000000..238cc7f278 --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.adoc @@ -0,0 +1,12 @@ += DoubleMassValueResult::doubleMassValue + +query:: QVTSDemo::DoubleMassValue +source:: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +outcome:: established +provenance:: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Duplicates::doubleMass | part | Instrument | Duplicates +|=== diff --git a/examples/qvts/expected/views/double-mass-value.html b/examples/qvts/expected/views/double-mass-value.html new file mode 100644 index 0000000000..99fffae077 --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.html @@ -0,0 +1,234 @@ + + + + + +DoubleMassValueResult::doubleMassValue + + + +
+

DoubleMassValueResult::doubleMassValue

+
+
+
query
+
QVTSDemo::DoubleMassValue
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad
+
+
+ + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Duplicates::doubleMasspartInstrumentDuplicates
+
+ + diff --git a/examples/qvts/expected/views/double-mass-value.md b/examples/qvts/expected/views/double-mass-value.md new file mode 100644 index 0000000000..4f20bd583f --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.md @@ -0,0 +1,13 @@ +# DoubleMassValueResult::doubleMassValue + +**query** — QVTSDemo::DoubleMassValue + +**source** — examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml + +**outcome** — established + +**provenance** — sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Duplicates::doubleMass | part | Instrument | Duplicates | diff --git a/examples/qvts/expected/views/double-mass-value.sysml b/examples/qvts/expected/views/double-mass-value.sysml new file mode 100644 index 0000000000..91eaf0dd8e --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.sysml @@ -0,0 +1,11 @@ +package DoubleMassValueResult { + private import QVTS::*; + + view doubleMassValue : QueryResult { + expose Duplicates::doubleMass; + attribute :>> query = "QVTSDemo::DoubleMassValue"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad"; + } +} diff --git a/examples/qvts/expected/views/double-mass-value.txt b/examples/qvts/expected/views/double-mass-value.txt new file mode 100644 index 0000000000..82aceff992 --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.txt @@ -0,0 +1,10 @@ +DoubleMassValueResult::doubleMassValue - table rendering (view def QueryResult) + +query: QVTSDemo::DoubleMassValue +source: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +outcome: established +provenance: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad + +Element Kind Type Declared in +---------------------- ---- ---------- ----------- +Duplicates::doubleMass part Instrument Duplicates diff --git a/examples/qvts/expected/views/double-mass-value.view.md b/examples/qvts/expected/views/double-mass-value.view.md new file mode 100644 index 0000000000..05ae11b539 --- /dev/null +++ b/examples/qvts/expected/views/double-mass-value.view.md @@ -0,0 +1,10 @@ + + +- **query**: QVTSDemo::DoubleMassValue +- **source**: examples/qvts/lander.sysml examples/qvts/duplicates.sysml examples/qvts/queries.sysml +- **outcome**: established +- **provenance**: sha256:df6f9af4c0fcb42e8b57c31e1b9c5d2c7ddf56890bd556334fd1db776ea24dad + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Duplicates::doubleMass | part | Instrument | Duplicates | diff --git a/examples/qvts/expected/views/empty-selection.adoc b/examples/qvts/expected/views/empty-selection.adoc new file mode 100644 index 0000000000..7d1fc2595b --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.adoc @@ -0,0 +1,8 @@ += EmptySelectionResult::emptySelection + +query:: QVTSDemo::EmptySelection +source:: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome:: established +provenance:: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +the query result exposes no element diff --git a/examples/qvts/expected/views/empty-selection.html b/examples/qvts/expected/views/empty-selection.html new file mode 100644 index 0000000000..b875a7d152 --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.html @@ -0,0 +1,217 @@ + + + + + +EmptySelectionResult::emptySelection + + + +
+

EmptySelectionResult::emptySelection

+
+
+
query
+
QVTSDemo::EmptySelection
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd
+
+
+

the query result exposes no element

+
+ + diff --git a/examples/qvts/expected/views/empty-selection.md b/examples/qvts/expected/views/empty-selection.md new file mode 100644 index 0000000000..205a8bccc4 --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.md @@ -0,0 +1,11 @@ +# EmptySelectionResult::emptySelection + +**query** — QVTSDemo::EmptySelection + +**source** — examples/qvts/lander.sysml examples/qvts/queries.sysml + +**outcome** — established + +**provenance** — sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +the query result exposes no element diff --git a/examples/qvts/expected/views/empty-selection.sysml b/examples/qvts/expected/views/empty-selection.sysml new file mode 100644 index 0000000000..e09363a7e2 --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.sysml @@ -0,0 +1,10 @@ +package EmptySelectionResult { + private import QVTS::*; + + view emptySelection : QueryResult { + attribute :>> query = "QVTSDemo::EmptySelection"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd"; + } +} diff --git a/examples/qvts/expected/views/empty-selection.txt b/examples/qvts/expected/views/empty-selection.txt new file mode 100644 index 0000000000..0bf11b2410 --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.txt @@ -0,0 +1,8 @@ +EmptySelectionResult::emptySelection - table rendering (view def QueryResult) + +query: QVTSDemo::EmptySelection +source: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome: established +provenance: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +the query result exposes no element diff --git a/examples/qvts/expected/views/empty-selection.view.md b/examples/qvts/expected/views/empty-selection.view.md new file mode 100644 index 0000000000..0ed20c85ec --- /dev/null +++ b/examples/qvts/expected/views/empty-selection.view.md @@ -0,0 +1,8 @@ + + +- **query**: QVTSDemo::EmptySelection +- **source**: examples/qvts/lander.sysml examples/qvts/queries.sysml +- **outcome**: established +- **provenance**: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd + +the query result exposes no element diff --git a/examples/qvts/expected/views/heavy-parts.adoc b/examples/qvts/expected/views/heavy-parts.adoc new file mode 100644 index 0000000000..da822988bc --- /dev/null +++ b/examples/qvts/expected/views/heavy-parts.adoc @@ -0,0 +1,13 @@ += HeavyPartsResult::heavyParts + +query:: QVTSExamples::HeavyParts threshold=10.0 +source:: examples/observatory.sysml +outcome:: established +provenance:: urn:prov:bundle:heavyParts + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Observatory::telescope::mountControl | part | Subsystem | Observatory::telescope +| Observatory::telescope::primaryMirror | part | MirrorAssembly | Observatory::telescope +|=== diff --git a/examples/qvts/expected/views/heavy-parts.html b/examples/qvts/expected/views/heavy-parts.html new file mode 100644 index 0000000000..83a443eae1 --- /dev/null +++ b/examples/qvts/expected/views/heavy-parts.html @@ -0,0 +1,240 @@ + + + + + +HeavyPartsResult::heavyParts + + + +
+

HeavyPartsResult::heavyParts

+
+
+
query
+
QVTSExamples::HeavyParts threshold=10.0
+
+
+
source
+
examples/observatory.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
urn:prov:bundle:heavyParts
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Observatory::telescope::mountControlpartSubsystemObservatory::telescope
Observatory::telescope::primaryMirrorpartMirrorAssemblyObservatory::telescope
+
+ + diff --git a/examples/qvts/expected/views/heavy-parts.md b/examples/qvts/expected/views/heavy-parts.md new file mode 100644 index 0000000000..a3a8b51d12 --- /dev/null +++ b/examples/qvts/expected/views/heavy-parts.md @@ -0,0 +1,14 @@ +# HeavyPartsResult::heavyParts + +**query** — QVTSExamples::HeavyParts threshold=10.0 + +**source** — examples/observatory.sysml + +**outcome** — established + +**provenance** — urn:prov:bundle:heavyParts + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Observatory::telescope::mountControl | part | Subsystem | Observatory::telescope | +| Observatory::telescope::primaryMirror | part | MirrorAssembly | Observatory::telescope | diff --git a/examples/qvts/expected/views/heavy-parts.txt b/examples/qvts/expected/views/heavy-parts.txt new file mode 100644 index 0000000000..7c3cb3d6b4 --- /dev/null +++ b/examples/qvts/expected/views/heavy-parts.txt @@ -0,0 +1,11 @@ +HeavyPartsResult::heavyParts - table rendering (view def QueryResult) + +query: QVTSExamples::HeavyParts threshold=10.0 +source: examples/observatory.sysml +outcome: established +provenance: urn:prov:bundle:heavyParts + +Element Kind Type Declared in +------------------------------------- ---- -------------- ---------------------- +Observatory::telescope::mountControl part Subsystem Observatory::telescope +Observatory::telescope::primaryMirror part MirrorAssembly Observatory::telescope diff --git a/examples/qvts/expected/views/heavy-parts.view.md b/examples/qvts/expected/views/heavy-parts.view.md new file mode 100644 index 0000000000..b4b97c47c9 --- /dev/null +++ b/examples/qvts/expected/views/heavy-parts.view.md @@ -0,0 +1,11 @@ + + +- **query**: QVTSExamples::HeavyParts threshold=10.0 +- **source**: examples/observatory.sysml +- **outcome**: established +- **provenance**: urn:prov:bundle:heavyParts + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Observatory::telescope::mountControl | part | Subsystem | Observatory::telescope | +| Observatory::telescope::primaryMirror | part | MirrorAssembly | Observatory::telescope | diff --git a/examples/qvts/expected/views/inline-mass.adoc b/examples/qvts/expected/views/inline-mass.adoc new file mode 100644 index 0000000000..2722ef8a06 --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.adoc @@ -0,0 +1,14 @@ += AnswerResult::answer + +query:: Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass")) +source:: examples/qvts/lander.sysml +outcome:: established +provenance:: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Lander::lander::cabin | part | Payload | Lander::lander +| Lander::lander::engine | part | Payload | Lander::lander +| Lander::lander::scienceBay | part | Payload | Lander::lander +|=== diff --git a/examples/qvts/expected/views/inline-mass.html b/examples/qvts/expected/views/inline-mass.html new file mode 100644 index 0000000000..9067b05b49 --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.html @@ -0,0 +1,246 @@ + + + + + +AnswerResult::answer + + + +
+

AnswerResult::answer

+
+
+
query
+
Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass"))
+
+
+
source
+
examples/qvts/lander.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Lander::lander::cabinpartPayloadLander::lander
Lander::lander::enginepartPayloadLander::lander
Lander::lander::scienceBaypartPayloadLander::lander
+
+ + diff --git a/examples/qvts/expected/views/inline-mass.md b/examples/qvts/expected/views/inline-mass.md new file mode 100644 index 0000000000..fd54b5ff34 --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.md @@ -0,0 +1,15 @@ +# AnswerResult::answer + +**query** — Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass")) + +**source** — examples/qvts/lander.sysml + +**outcome** — established + +**provenance** — sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | +| Lander::lander::engine | part | Payload | Lander::lander | +| Lander::lander::scienceBay | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/inline-mass.sysml b/examples/qvts/expected/views/inline-mass.sysml new file mode 100644 index 0000000000..f3d8f93d86 --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.sysml @@ -0,0 +1,13 @@ +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + expose Lander::lander::cabin; + expose Lander::lander::engine; + expose Lander::lander::scienceBay; + attribute :>> query = "Project(WhereType(Descendants(Named(\"Lander::lander\")), \"PartUsage\", true), (\"qualifiedName\", \"mass\"))"; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206"; + } +} diff --git a/examples/qvts/expected/views/inline-mass.txt b/examples/qvts/expected/views/inline-mass.txt new file mode 100644 index 0000000000..27eb12be7a --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.txt @@ -0,0 +1,12 @@ +AnswerResult::answer - table rendering (view def QueryResult) + +query: Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass")) +source: examples/qvts/lander.sysml +outcome: established +provenance: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +Element Kind Type Declared in +-------------------------- ---- ------- -------------- +Lander::lander::cabin part Payload Lander::lander +Lander::lander::engine part Payload Lander::lander +Lander::lander::scienceBay part Payload Lander::lander diff --git a/examples/qvts/expected/views/inline-mass.view.md b/examples/qvts/expected/views/inline-mass.view.md new file mode 100644 index 0000000000..a9f43cc24a --- /dev/null +++ b/examples/qvts/expected/views/inline-mass.view.md @@ -0,0 +1,12 @@ + + +- **query**: Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass")) +- **source**: examples/qvts/lander.sysml +- **outcome**: established +- **provenance**: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | +| Lander::lander::engine | part | Payload | Lander::lander | +| Lander::lander::scienceBay | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/missing-mass-project.adoc b/examples/qvts/expected/views/missing-mass-project.adoc new file mode 100644 index 0000000000..6a7fe19c1b --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.adoc @@ -0,0 +1,13 @@ += MissingMassProjectResult::missingMassProject + +query:: QVTSDemo::MissingMassProject +source:: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome:: pathError +provenance:: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass) + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Lander::lander::cabinEngine | connection | | Lander::lander +| Lander::lander::engineBay | connection | | Lander::lander +|=== diff --git a/examples/qvts/expected/views/missing-mass-project.html b/examples/qvts/expected/views/missing-mass-project.html new file mode 100644 index 0000000000..ba040f009d --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.html @@ -0,0 +1,240 @@ + + + + + +MissingMassProjectResult::missingMassProject + + + +
+

MissingMassProjectResult::missingMassProject

+
+
+
query
+
QVTSDemo::MissingMassProject
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
pathError
+
+
+
provenance
+
sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass)
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Lander::lander::cabinEngineconnectionLander::lander
Lander::lander::engineBayconnectionLander::lander
+
+ + diff --git a/examples/qvts/expected/views/missing-mass-project.md b/examples/qvts/expected/views/missing-mass-project.md new file mode 100644 index 0000000000..0659909302 --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.md @@ -0,0 +1,14 @@ +# MissingMassProjectResult::missingMassProject + +**query** — QVTSDemo::MissingMassProject + +**source** — examples/qvts/lander.sysml examples/qvts/queries.sysml + +**outcome** — pathError + +**provenance** — sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabinEngine | connection | | Lander::lander | +| Lander::lander::engineBay | connection | | Lander::lander | diff --git a/examples/qvts/expected/views/missing-mass-project.sysml b/examples/qvts/expected/views/missing-mass-project.sysml new file mode 100644 index 0000000000..58ab83d3e2 --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.sysml @@ -0,0 +1,12 @@ +package MissingMassProjectResult { + private import QVTS::*; + + view missingMassProject : QueryResult { + expose Lander::lander::cabinEngine; + expose Lander::lander::engineBay; + attribute :>> query = "QVTSDemo::MissingMassProject"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass)"; + } +} diff --git a/examples/qvts/expected/views/missing-mass-project.txt b/examples/qvts/expected/views/missing-mass-project.txt new file mode 100644 index 0000000000..0369469829 --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.txt @@ -0,0 +1,11 @@ +MissingMassProjectResult::missingMassProject - table rendering (view def QueryResult) + +query: QVTSDemo::MissingMassProject +source: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome: pathError +provenance: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass) + +Element Kind Type Declared in +--------------------------- ---------- ---- -------------- +Lander::lander::cabinEngine connection Lander::lander +Lander::lander::engineBay connection Lander::lander diff --git a/examples/qvts/expected/views/missing-mass-project.view.md b/examples/qvts/expected/views/missing-mass-project.view.md new file mode 100644 index 0000000000..edd5a9d8c4 --- /dev/null +++ b/examples/qvts/expected/views/missing-mass-project.view.md @@ -0,0 +1,11 @@ + + +- **query**: QVTSDemo::MissingMassProject +- **source**: examples/qvts/lander.sysml examples/qvts/queries.sysml +- **outcome**: pathError +- **provenance**: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Feature(mass) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabinEngine | connection | | Lander::lander | +| Lander::lander::engineBay | connection | | Lander::lander | diff --git a/examples/qvts/expected/views/misspelled-name.adoc b/examples/qvts/expected/views/misspelled-name.adoc new file mode 100644 index 0000000000..391e0cab2b --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.adoc @@ -0,0 +1,12 @@ += MisspelledNameResult::misspelledName + +query:: QVTSDemo::MisspelledName +source:: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome:: pathError +provenance:: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni) + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Lander::lander | part | | Lander +|=== diff --git a/examples/qvts/expected/views/misspelled-name.html b/examples/qvts/expected/views/misspelled-name.html new file mode 100644 index 0000000000..6aaa8a903c --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.html @@ -0,0 +1,234 @@ + + + + + +MisspelledNameResult::misspelledName + + + +
+

MisspelledNameResult::misspelledName

+
+
+
query
+
QVTSDemo::MisspelledName
+
+
+
source
+
examples/qvts/lander.sysml examples/qvts/queries.sysml
+
+
+
outcome
+
pathError
+
+
+
provenance
+
sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni)
+
+
+ + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Lander::landerpartLander
+
+ + diff --git a/examples/qvts/expected/views/misspelled-name.md b/examples/qvts/expected/views/misspelled-name.md new file mode 100644 index 0000000000..b8bec4bc73 --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.md @@ -0,0 +1,13 @@ +# MisspelledNameResult::misspelledName + +**query** — QVTSDemo::MisspelledName + +**source** — examples/qvts/lander.sysml examples/qvts/queries.sysml + +**outcome** — pathError + +**provenance** — sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander | part | | Lander | diff --git a/examples/qvts/expected/views/misspelled-name.sysml b/examples/qvts/expected/views/misspelled-name.sysml new file mode 100644 index 0000000000..4d9b6792cb --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.sysml @@ -0,0 +1,11 @@ +package MisspelledNameResult { + private import QVTS::*; + + view misspelledName : QueryResult { + expose Lander::lander; + attribute :>> query = "QVTSDemo::MisspelledName"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni)"; + } +} diff --git a/examples/qvts/expected/views/misspelled-name.txt b/examples/qvts/expected/views/misspelled-name.txt new file mode 100644 index 0000000000..4865e508d0 --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.txt @@ -0,0 +1,10 @@ +MisspelledNameResult::misspelledName - table rendering (view def QueryResult) + +query: QVTSDemo::MisspelledName +source: examples/qvts/lander.sysml examples/qvts/queries.sysml +outcome: pathError +provenance: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni) + +Element Kind Type Declared in +-------------- ---- ---- ----------- +Lander::lander part Lander diff --git a/examples/qvts/expected/views/misspelled-name.view.md b/examples/qvts/expected/views/misspelled-name.view.md new file mode 100644 index 0000000000..a6fa9da072 --- /dev/null +++ b/examples/qvts/expected/views/misspelled-name.view.md @@ -0,0 +1,10 @@ + + +- **query**: QVTSDemo::MisspelledName +- **source**: examples/qvts/lander.sysml examples/qvts/queries.sysml +- **outcome**: pathError +- **provenance**: sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd; step Named(Lander::lander::cabni) + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander | part | | Lander | diff --git a/examples/qvts/expected/views/oslc-cabin.adoc b/examples/qvts/expected/views/oslc-cabin.adoc new file mode 100644 index 0000000000..4caa823af1 --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.adoc @@ -0,0 +1,12 @@ += AnswerResult::answer + +query:: oslc.where=sysml:name="cabin" +source:: examples/qvts/lander.sysml +outcome:: established +provenance:: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +[options="header"] +|=== +| Element | Kind | Type | Declared in +| Lander::lander::cabin | part | Payload | Lander::lander +|=== diff --git a/examples/qvts/expected/views/oslc-cabin.html b/examples/qvts/expected/views/oslc-cabin.html new file mode 100644 index 0000000000..d7a89e1969 --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.html @@ -0,0 +1,234 @@ + + + + + +AnswerResult::answer + + + +
+

AnswerResult::answer

+
+
+
query
+
oslc.where=sysml:name="cabin"
+
+
+
source
+
examples/qvts/lander.sysml
+
+
+
outcome
+
established
+
+
+
provenance
+
sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206
+
+
+ + + + + + + + + + + + + + + + + +
ElementKindTypeDeclared in
Lander::lander::cabinpartPayloadLander::lander
+
+ + diff --git a/examples/qvts/expected/views/oslc-cabin.md b/examples/qvts/expected/views/oslc-cabin.md new file mode 100644 index 0000000000..68a0421893 --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.md @@ -0,0 +1,13 @@ +# AnswerResult::answer + +**query** — oslc.where=sysml:name="cabin" + +**source** — examples/qvts/lander.sysml + +**outcome** — established + +**provenance** — sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/oslc-cabin.sysml b/examples/qvts/expected/views/oslc-cabin.sysml new file mode 100644 index 0000000000..eae1bc9e0b --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.sysml @@ -0,0 +1,11 @@ +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "oslc.where=sysml:name=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206"; + } +} diff --git a/examples/qvts/expected/views/oslc-cabin.txt b/examples/qvts/expected/views/oslc-cabin.txt new file mode 100644 index 0000000000..23de9ad0ca --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.txt @@ -0,0 +1,10 @@ +AnswerResult::answer - table rendering (view def QueryResult) + +query: oslc.where=sysml:name="cabin" +source: examples/qvts/lander.sysml +outcome: established +provenance: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +Element Kind Type Declared in +--------------------- ---- ------- -------------- +Lander::lander::cabin part Payload Lander::lander diff --git a/examples/qvts/expected/views/oslc-cabin.view.md b/examples/qvts/expected/views/oslc-cabin.view.md new file mode 100644 index 0000000000..8bcb756165 --- /dev/null +++ b/examples/qvts/expected/views/oslc-cabin.view.md @@ -0,0 +1,10 @@ + + +- **query**: oslc.where=sysml:name="cabin" +- **source**: examples/qvts/lander.sysml +- **outcome**: established +- **provenance**: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206 + +| Element | Kind | Type | Declared in | +| --- | --- | --- | --- | +| Lander::lander::cabin | part | Payload | Lander::lander | diff --git a/examples/qvts/expected/views/oslc-unknown-property.adoc b/examples/qvts/expected/views/oslc-unknown-property.adoc new file mode 100644 index 0000000000..a60301fb5f --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.adoc @@ -0,0 +1,8 @@ += AnswerResult::answer + +query:: oslc.where=sysml:nme="cabin" +source:: examples/qvts/lander.sysml +outcome:: pathError +provenance:: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme) + +the query result exposes no element diff --git a/examples/qvts/expected/views/oslc-unknown-property.html b/examples/qvts/expected/views/oslc-unknown-property.html new file mode 100644 index 0000000000..2e907d28b9 --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.html @@ -0,0 +1,217 @@ + + + + + +AnswerResult::answer + + + +
+

AnswerResult::answer

+
+
+
query
+
oslc.where=sysml:nme="cabin"
+
+
+
source
+
examples/qvts/lander.sysml
+
+
+
outcome
+
pathError
+
+
+
provenance
+
sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme)
+
+
+

the query result exposes no element

+
+ + diff --git a/examples/qvts/expected/views/oslc-unknown-property.md b/examples/qvts/expected/views/oslc-unknown-property.md new file mode 100644 index 0000000000..7cf7d79cdb --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.md @@ -0,0 +1,11 @@ +# AnswerResult::answer + +**query** — oslc.where=sysml:nme="cabin" + +**source** — examples/qvts/lander.sysml + +**outcome** — pathError + +**provenance** — sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme) + +the query result exposes no element diff --git a/examples/qvts/expected/views/oslc-unknown-property.sysml b/examples/qvts/expected/views/oslc-unknown-property.sysml new file mode 100644 index 0000000000..167471022f --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.sysml @@ -0,0 +1,10 @@ +package AnswerResult { + private import QVTS::*; + + view answer : QueryResult { + attribute :>> query = "oslc.where=sysml:nme=\"cabin\""; + attribute :>> source = "examples/qvts/lander.sysml"; + attribute :>> outcome = Outcome::pathError; + attribute :>> provenance = "sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme)"; + } +} diff --git a/examples/qvts/expected/views/oslc-unknown-property.txt b/examples/qvts/expected/views/oslc-unknown-property.txt new file mode 100644 index 0000000000..89de2ad4c0 --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.txt @@ -0,0 +1,8 @@ +AnswerResult::answer - table rendering (view def QueryResult) + +query: oslc.where=sysml:nme="cabin" +source: examples/qvts/lander.sysml +outcome: pathError +provenance: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme) + +the query result exposes no element diff --git a/examples/qvts/expected/views/oslc-unknown-property.view.md b/examples/qvts/expected/views/oslc-unknown-property.view.md new file mode 100644 index 0000000000..471db245ea --- /dev/null +++ b/examples/qvts/expected/views/oslc-unknown-property.view.md @@ -0,0 +1,8 @@ + + +- **query**: oslc.where=sysml:nme="cabin" +- **source**: examples/qvts/lander.sysml +- **outcome**: pathError +- **provenance**: sha256:8afb8c8cac1d730f946612f6face4667b32a0e0ef1feeb0c44d44ed6d924e206; step Feature(sysml:nme) + +the query result exposes no element diff --git a/examples/qvts/observatory/observatory.sysml b/examples/qvts/observatory/observatory.sysml new file mode 100644 index 0000000000..4c321e3afc --- /dev/null +++ b/examples/qvts/observatory/observatory.sysml @@ -0,0 +1,101 @@ +package Observatory { + private import ScalarValues::*; + + part def Subsystem { + attribute mass : Real; + } + part def MirrorAssembly :> Subsystem; + + port def OpticalPort; + port def DataPort; + + part telescope { + part primaryMirror : MirrorAssembly { + attribute :>> mass = 10.0; + port opticalOut : OpticalPort; + } + part instrumentCluster : Subsystem { + attribute :>> mass = 4.5; + port opticalIn : OpticalPort; + port dataOut : DataPort; + } + part mountControl : Subsystem { + attribute :>> mass = 15.0; + port dataIn : DataPort; + } + connection opticalPath connect primaryMirror.opticalOut to instrumentCluster.opticalIn; + connection dataPath connect instrumentCluster.dataOut to mountControl.dataIn; + } + + requirement massRequirement; + requirement pointingRequirement { + requirement slewRequirement; + requirement trackingRequirement; + } + part observatory { + satisfy massRequirement by telescope; + } + + package Operations { + private import ScalarValues::*; + + enum def ObservingMode { imaging; spectroscopy; } + + item def Photon; + item def Image; + + calc def ExposureTime { in flux : Real; return : Real = 1.0 / flux; } + + action def Observe { + in mode : ObservingMode; + out image : Image; + } + action observe : Observe { + first start; + then action acquire { out image : Image; } + then action readout { in image : Image; out processed : Image; } + then done; + flow acquire.image to readout.image; + } + + state def TelescopeState; + state telescopeState : TelescopeState { + entry; then idle; + state idle; + state slewing; + state tracking; + transition idle_to_slewing first idle then slewing; + transition slewing_to_tracking first slewing then tracking; + } + + constraint def MassBudget { in total : Real; total <= 30.0 } + requirement def MassLimit { + subject sub : Subsystem; + require constraint { sub.mass <= 20.0 } + } + + interface def OpticalInterface { end source : OpticalPort; end target : OpticalPort; } + interface opticalLink : OpticalInterface connect telescope.primaryMirror.opticalOut to telescope.instrumentCluster.opticalIn; + + allocation def FunctionToPart { end function : Observe; end part : Subsystem; } + allocation observeToCluster : FunctionToPart allocate observe to telescope.instrumentCluster; + + verification def ThroughputTest { + objective { verify massRequirement; } + } + + use case def ObserveTarget { subject obs : Subsystem; } + + metadata def Heritage { attribute mission : String; } + @Heritage about telescope { mission = "Hubble"; } + + occurrence def Night; + individual def HubbleTelescope :> Subsystem; + + view def MassView; + viewpoint def EngineerViewpoint; + rendering def TableRendering; + } + + package Empty; +} diff --git a/examples/qvts/observatory/result.sysml b/examples/qvts/observatory/result.sysml new file mode 100644 index 0000000000..26a122f603 --- /dev/null +++ b/examples/qvts/observatory/result.sysml @@ -0,0 +1,14 @@ +package HeavyPartsResult { + doc /* The result of a query over Observatory as a view: references to the + selected elements, never copies of them. */ + private import QVTS::*; + + view heavyParts : QueryResult { + expose Observatory::telescope::mountControl; + expose Observatory::telescope::primaryMirror; + attribute :>> query = "QVTSExamples::HeavyParts threshold=10.0"; + attribute :>> source = "examples/observatory.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "urn:prov:bundle:heavyParts"; + } +} diff --git a/internal/doc/docir/queryresult.go b/internal/doc/docir/queryresult.go new file mode 100644 index 0000000000..e420db9171 --- /dev/null +++ b/internal/doc/docir/queryresult.go @@ -0,0 +1,36 @@ +package docir + +import ( + "github.com/Open-MBEE/OpenSysML/internal/doc/queryexec" + "github.com/Open-MBEE/OpenSysML/internal/ir/view" + "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" +) + +// QueryResult is the document a QVTS::QueryResult view is written as: titled by +// the view, its header as definitions, its exposed elements as the table's rows. +func QueryResult(rendering *view.Rendering) *Document { + definitions := make([]Definition, len(rendering.Header)) + for i, field := range rendering.Header { + definitions[i] = Definition{ + term: []TextRun{{kind: RunPlain, text: field.Name}}, + description: []TextRun{{kind: RunPlain, text: field.Value}}, + } + } + columns := make([]queryexec.Column, len(rendering.Columns)) + for i, label := range rendering.Columns { + columns[i] = queryexec.StaticColumn(label, 0, symbols.Origin{}) + } + rows := make([]queryexec.Row, len(rendering.Rows)) + for i, cells := range rendering.Rows { + rows[i] = queryexec.StaticRow(cells, symbols.Origin{}) + } + body := Content{kind: ContentTable, columns: columns, rows: rows} + if len(rows) == 0 { + // A view exposing nothing says so, as its rendering does, in place of a table of no rows. + body = Content{kind: ContentParagraph, runs: []TextRun{{kind: RunPlain, text: rendering.EmptyReason()}}} + } + return &Document{name: rendering.View, title: rendering.View, content: []Content{ + {kind: ContentDefinitions, definitions: definitions}, + body, + }} +} diff --git a/internal/doc/queryexec/resultview.go b/internal/doc/queryexec/resultview.go new file mode 100644 index 0000000000..27c478ffbb --- /dev/null +++ b/internal/doc/queryexec/resultview.go @@ -0,0 +1,170 @@ +package queryexec + +import ( + "strconv" + "strings" + "unicode" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" + "github.com/Open-MBEE/OpenSysML/internal/syntax/source" +) + +// The names the QVTS library declares, which a written result view is typed by. +const ( + ResultViewLibrary = "QVTS" + ResultViewDefinition = "QVTS::QueryResult" + OutcomeEstablished = "established" +) + +// DefaultResultViewName names the view of a run whose query has no name. +const DefaultResultViewName = "Answer" + +// ResultView is what a surface knows about one query run besides its outcome: +// the four attributes of the QVTS::QueryResult view the run is written as. +type ResultView struct { + // Name names the view: the query's name, or one the caller chose. + Name string + // Query is the query as the surface was given it: a qualified name with its + // bindings, an inline expression, or SysML v2 API or OSLC query text. + Query string + // Source is the model as the surface knows it: file paths or a model hash. + Source string + // Provenance identifies the run's inputs; a failed run's step is added to it. + Provenance string +} + +// ResultViewName is the view name of a query: the last segment of its qualified +// name, DefaultResultViewName for a query with none. +func ResultViewName(query string) string { + segments := symbols.SegmentsOf(query) + if len(segments) == 0 || !source.IsIdentifier(segments[len(segments)-1]) { + return DefaultResultViewName + } + return segments[len(segments)-1] +} + +// Write is the run as one view typed by QVTS::QueryResult exposing the selection, or a failed +// run's frontier and finding elements; false for an error carrying no QVTS record. +func (v ResultView) Write(index *symbols.Index, result *RowSet, err error) (string, bool) { + if err != nil { + var typed *Error + if !asError(err, &typed) || typed.Outcome == nil { + return "", false + } + return v.WriteOutcome(index, *typed.Outcome), true + } + return v.write(index, result, nil), true +} + +// WriteOutcome is a failed run as its view: failed is its path or model error. +func (v ResultView) WriteOutcome(index *symbols.Index, failed Outcome) string { + return v.write(index, nil, &failed) +} + +func (v ResultView) write(index *symbols.Index, result *RowSet, failed *Outcome) string { + outcome, provenance := OutcomeEstablished, v.Provenance + var exposed []string + unnamed := 0 + if failed != nil { + outcome = failed.Kind() + provenance = joinProvenance(provenance, "step "+failed.Step().Label()) + exposed = outcomeElements(index, *failed) + } else if result != nil { + for _, row := range result.Rows() { + name := symbols.FQNOf(row.Element().Declaration()) + if name == "" { + unnamed++ + continue + } + exposed = appendDistinct(exposed, name) + } + } + name := v.Name + if name == "" { + name = DefaultResultViewName + } + var b strings.Builder + b.WriteString("package " + source.NameText(upperFirst(name)+"Result") + " {\n") + b.WriteString("\tprivate import " + ResultViewLibrary + "::*;\n\n") + b.WriteString("\tview " + source.NameText(lowerFirst(name)) + " : QueryResult {\n") + if unnamed > 0 { + b.WriteString("\t\t// " + unnamedNote(unnamed) + "\n") + } + for _, element := range exposed { + b.WriteString("\t\texpose " + source.QualifiedNameText(element) + ";\n") + } + b.WriteString("\t\tattribute :>> query = " + source.StringText(v.Query) + ";\n") + b.WriteString("\t\tattribute :>> source = " + source.StringText(v.Source) + ";\n") + b.WriteString("\t\tattribute :>> outcome = Outcome::" + outcome + ";\n") + b.WriteString("\t\tattribute :>> provenance = " + source.StringText(provenance) + ";\n") + b.WriteString("\t}\n}\n") + return b.String() +} + +// ResultViewQualifiedName is the qualified name of the view Write declares. +func (v ResultView) ResultViewQualifiedName() string { + name := v.Name + if name == "" { + name = DefaultResultViewName + } + return source.QualifiedNameOf([]string{upperFirst(name) + "Result", lowerFirst(name)}) +} + +func unnamedNote(n int) string { + if n == 1 { + return "1 selected element has no qualified name to expose it by." + } + return strconv.Itoa(n) + " selected elements have no qualified name to expose them by." +} + +func joinProvenance(base, step string) string { + if base == "" { + return step + } + return base + "; " + step +} + +// outcomeElements is what a failed run exposes: where each path failure stopped +// and what each finding is about, those the model declares, in record order. +func outcomeElements(index *symbols.Index, outcome Outcome) []string { + var out []string + add := func(name string) { + if name != "" && index != nil && len(index.LookupQualified(name)) > 0 { + out = appendDistinct(out, name) + } + } + if outcome.Model != nil { + for _, finding := range outcome.Model.Findings { + add(finding.Element) + } + for _, failure := range outcome.Model.PathFailures { + add(failure.Frontier.At) + } + } + if outcome.Path != nil { + for _, failure := range outcome.Path.Failures { + add(failure.Frontier.At) + } + } + return out +} + +func appendDistinct(xs []string, x string) []string { + for _, have := range xs { + if have == x { + return xs + } + } + return append(xs, x) +} + +func upperFirst(s string) string { return mapFirst(s, unicode.ToUpper) } + +func lowerFirst(s string) string { return mapFirst(s, unicode.ToLower) } + +func mapFirst(s string, f func(rune) rune) string { + for i, r := range s { + return string(f(r)) + s[i+len(string(r)):] + } + return s +} diff --git a/internal/doc/queryexec/resultview_test.go b/internal/doc/queryexec/resultview_test.go new file mode 100644 index 0000000000..353025370a --- /dev/null +++ b/internal/doc/queryexec/resultview_test.go @@ -0,0 +1,70 @@ +package queryexec + +import ( + "errors" + "testing" +) + +func TestResultViewWritesTheRunAsAQueryResultView(t *testing.T) { + fixture := loadExecutionFixture(t, ` +part def Subsystem; +part telescope : Subsystem { part mirror; part 'mount control'; } +package Duplicates { part a; part a; } +calc def Parts :> Query { Descendants(Named(qualifiedName = "Observatory::telescope")) } +calc def Nothing :> Query { WhereType(Descendants(Named(qualifiedName = "Observatory::telescope")), "StateUsage") } +calc def Misspelled :> Query { Named(qualifiedName = "Observatory::telescop") } +calc def Ambiguous :> Query { Named(qualifiedName = "Observatory::Duplicates::a") } +calc def RootMiss :> Query { Named(qualifiedName = "Observatry") } +`) + spec := func(name string) ResultView { + return ResultView{Name: name, Query: "Observatory::" + name, Source: `a "quoted" path.sysml`, Provenance: "sha256:abc"} + } + write := func(name string) string { + t.Helper() + result, err := fixture.execute(t, name, nil, Options{}) + text, ok := spec(name).Write(fixture.index, result, err) + if !ok { + t.Fatalf("%s: no view written for result %v, error %v", name, result, err) + } + again, _ := spec(name).Write(fixture.index, result, err) + if again != text { + t.Errorf("%s: two writes of one run differ", name) + } + return text + } + header := func(name, view string) string { + return "package " + name + "Result {\n\tprivate import QVTS::*;\n\n\tview " + view + " : QueryResult {\n" + } + attributes := func(name, outcome, provenance string) string { + return "\t\tattribute :>> query = \"Observatory::" + name + "\";\n" + + "\t\tattribute :>> source = \"a \\\"quoted\\\" path.sysml\";\n" + + "\t\tattribute :>> outcome = Outcome::" + outcome + ";\n" + + "\t\tattribute :>> provenance = \"" + provenance + "\";\n\t}\n}\n" + } + selection := "\t\texpose Observatory::telescope::mirror;\n\t\texpose Observatory::telescope::'mount control';\n" + cases := []struct{ name, view, want string }{ + {"Parts", "parts", selection + attributes("Parts", "established", "sha256:abc")}, + {"Nothing", "nothing", attributes("Nothing", "established", "sha256:abc")}, + {"Misspelled", "misspelled", "\t\texpose Observatory;\n" + + attributes("Misspelled", "pathError", "sha256:abc; step Named(Observatory::telescop)")}, + {"Ambiguous", "ambiguous", "\t\texpose Observatory::Duplicates;\n" + + attributes("Ambiguous", "modelError", "sha256:abc; step Named(Observatory::Duplicates::a)")}, + {"RootMiss", "rootMiss", attributes("RootMiss", "pathError", "sha256:abc; step Named(Observatry)")}, + } + for _, c := range cases { + if got, want := write(c.name), header(c.name, c.view)+c.want; got != want { + t.Errorf("%s:\n got:\n%s\nwant:\n%s", c.name, got, want) + } + } + if text, ok := (ResultView{}).Write(fixture.index, nil, errors.New("no record")); ok { + t.Errorf("an error carrying no QVTS record wrote a view:\n%s", text) + } + if got, want := spec("Parts").ResultViewQualifiedName(), "PartsResult::parts"; got != want { + t.Errorf("qualified name = %q, want %q", got, want) + } + for query, want := range map[string]string{"A::B::CabinMass": "CabinMass", "": DefaultResultViewName, "A::'two words'": DefaultResultViewName} { + if got := ResultViewName(query); got != want { + t.Errorf("ResultViewName(%q) = %q, want %q", query, got, want) + } + } +} diff --git a/internal/doc/querytranslate/outcome.go b/internal/doc/querytranslate/outcome.go new file mode 100644 index 0000000000..062e6904b0 --- /dev/null +++ b/internal/doc/querytranslate/outcome.go @@ -0,0 +1,29 @@ +package querytranslate + +import ( + "errors" + + "github.com/Open-MBEE/OpenSysML/internal/doc/queryexec" + "github.com/Open-MBEE/OpenSysML/internal/semantic/suggest" +) + +// OutcomeOf is the QVTS record of a translator refusal that has one: an unknown property is a +// path error whose frontier lists the properties the query could have named, with the nearest. +func OutcomeOf(err error) *queryexec.Outcome { + var terr *Error + if !errors.As(err, &terr) || terr.Kind != ErrUnknownProperty { + return nil + } + frontier := queryexec.Frontier{Features: make([]queryexec.FeatureRef, 0, len(terr.Candidates))} + for _, candidate := range terr.Candidates { + frontier.Features = append(frontier.Features, queryexec.FeatureRef{Name: candidate}) + } + if nearest := suggest.Nearest(terr.Property, terr.Candidates); len(nearest) > 0 { + frontier.Nearest = nearest[0] + } + return &queryexec.Outcome{Path: &queryexec.PathError{Failures: []queryexec.Failure{{ + Step: queryexec.Step{Kind: queryexec.StepFeature, Argument: terr.Property}, + Expected: "a property of the metamodel", + Frontier: frontier, + }}}} +} diff --git a/internal/frontend/grpc/capability_test.go b/internal/frontend/grpc/capability_test.go index fc41d30a98..11afcebecc 100644 --- a/internal/frontend/grpc/capability_test.go +++ b/internal/frontend/grpc/capability_test.go @@ -445,9 +445,9 @@ func TestRenderDocumentFileNameIsWithheldWithoutItsCapability(t *testing.T) { } // The capability is the newest, appended after every one before it. -func TestInlineDocumentQueryCapabilityIsTheNewest(t *testing.T) { - if all := Capabilities(); all[len(all)-1] != CapabilityInlineDocumentQuery { - t.Errorf("capabilities %v do not end with %q, the newest", all, CapabilityInlineDocumentQuery) +func TestQueryResultViewCapabilityIsTheNewest(t *testing.T) { + if all := Capabilities(); all[len(all)-1] != CapabilityQueryResultView { + t.Errorf("capabilities %v do not end with %q, the newest", all, CapabilityQueryResultView) } } diff --git a/internal/frontend/grpc/docquery.go b/internal/frontend/grpc/docquery.go index 8144cce443..ecf49ba69f 100644 --- a/internal/frontend/grpc/docquery.go +++ b/internal/frontend/grpc/docquery.go @@ -52,6 +52,11 @@ func (s *Service) RunDocumentQuery(ctx context.Context, req *pb.RunDocumentQuery return nil, err } } + if req.AsView { + if err := s.requireCapability(CapabilityQueryResultView); err != nil { + return nil, err + } + } // The query runs over the model's runtime and the objects it holds, as // %run-query runs over the session's; Objects answers no rows while none are held. held := s.objects(cached) @@ -63,6 +68,7 @@ func (s *Service) RunDocumentQuery(ctx context.Context, req *pb.RunDocumentQuery err error ) queryName := req.QueryId + spec := resultViewSpec(cached, req.ModelHash, queryexec.DefaultResultViewName, req.InlineQuery) if req.InlineQuery != "" { queryName = "the inline query" inline, program, qctx, err = cached.inlineQuery(qctx, req.InlineQuery) @@ -70,10 +76,12 @@ func (s *Service) RunDocumentQuery(ctx context.Context, req *pb.RunDocumentQuery return nil, documentStatus(err) } } else { - program, err = namedQuery(qctx, req.QueryId) + var fqn string + program, fqn, err = namedQuery(qctx, req.QueryId) if err != nil { return nil, err } + spec = resultViewSpec(cached, req.ModelHash, queryexec.ResultViewName(fqn), bindingsText(fqn, req.Bindings)) } if slices.ContainsFunc(req.Bindings, bindingHoldsBigInt) { if err := s.requireCapability(CapabilityBigIntValues); err != nil { @@ -91,9 +99,16 @@ func (s *Service) RunDocumentQuery(ctx context.Context, req *pb.RunDocumentQuery } result, err := queryexec.Execute(program, qctx, bindings, queryexec.Options{}) if err != nil { - return nil, held.documentStatus(queryexec.LocateInline(inline, err)) + status := held.documentStatus(queryexec.LocateInline(inline, err)) + if req.AsView { + status = withResultView(status, failedResultView(spec, qctx, err)) + } + return nil, status } response := rowSetResponse(qctx.Index, result) + if req.AsView { + response.ResultView, _ = spec.Write(qctx.Index, result, nil) + } if !s.capabilities.has(CapabilityBigIntValues) && slices.ContainsFunc(response.Rows, rowHoldsBigInt) { // DocumentValue has no unsupported arm to stand in for a wide Integer. return nil, statusErrorf(connect.CodeUnimplemented, @@ -106,21 +121,21 @@ func (s *Service) RunDocumentQuery(ctx context.Context, req *pb.RunDocumentQuery return response, nil } -// namedQuery plans the document query the model declares under id. -func namedQuery(qctx queryexec.Context, id string) (*queryplan.Program, error) { +// namedQuery plans the document query the model declares under id, and answers its qualified name. +func namedQuery(qctx queryexec.Context, id string) (*queryplan.Program, string, error) { sym, err := documentSymbol(qctx.Index, id) if err != nil { - return nil, err + return nil, "", err } if !queryplan.IsQueryDefinition(qctx.Index, qctx.Model, sym) { - return nil, statusErrorf(connect.CodeInvalidArgument, + return nil, "", statusErrorf(connect.CodeInvalidArgument, "%s is not a document query: one is a calc def specializing DocumentQueries::Query", id) } program, err := queryplan.Compile(qctx.Index, qctx.Model, qctx.Resolver, sym) if err != nil { - return nil, documentStatus(err) + return nil, "", documentStatus(err) } - return program, nil + return program, symbols.FQNOf(sym), nil } // inlineQuery plans text as a query definition of its own over the model, in an diff --git a/internal/frontend/grpc/query.go b/internal/frontend/grpc/query.go index 3bb20ea7ef..a1d7caabc1 100644 --- a/internal/frontend/grpc/query.go +++ b/internal/frontend/grpc/query.go @@ -11,7 +11,6 @@ import ( "github.com/Open-MBEE/OpenSysML/internal/doc/querytranslate" "github.com/Open-MBEE/OpenSysML/internal/frontend/symbolfacts" corequery "github.com/Open-MBEE/OpenSysML/internal/semantic/query" - "github.com/Open-MBEE/OpenSysML/internal/semantic/suggest" "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" "github.com/Open-MBEE/OpenSysML/internal/translate/export" ) @@ -120,6 +119,11 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes if req.Query == nil && req.OslcQuery == "" { return nil, queryStatus(queryErrorf(QueryErrMalformedConstraint, "query is unset")) } + if req.AsView { + if err := s.requireCapability(CapabilityQueryResultView); err != nil { + return nil, err + } + } sc := cached.SymbolContext() defer sc.Lock()() @@ -130,6 +134,19 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes qctx.Identity = eval.identity table := cached.queryTable(qctx) + text := req.OslcQuery + if text == "" { + text = apiQueryText(req.Query) + } + spec := resultViewSpec(cached, req.ModelHash, queryexec.DefaultResultViewName, text) + // refused is a translator refusal as its status, with the view of the path error it is. + refused := func(err error) error { + status := queryStatus(err) + if outcome := querytranslate.OutcomeOf(err); req.AsView && outcome != nil { + status = withResultView(status, spec.WriteOutcome(qctx.Index, *outcome)) + } + return status + } var parsed querytranslate.Query var err error if req.OslcQuery != "" { @@ -138,11 +155,11 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes parsed, err = apiQuery(req.Query) } if err != nil { - return nil, queryStatus(err) + return nil, refused(err) } plan, err := querytranslate.Translate(parsed, querytranslate.Context{Index: qctx.Index, Model: qctx.Model, Table: table}, "Query") if err != nil { - return nil, queryStatus(err) + return nil, refused(err) } bindings := queryexec.Bindings{} if !plan.Objects { @@ -158,9 +175,17 @@ func (s *Service) Query(ctx context.Context, req *pb.QueryRequest) (*pb.QueryRes } result, err := queryexec.Execute(plan.Program, qctx, bindings, queryexec.Options{}) if err != nil { - return nil, held.queryExecStatus(err) + status := held.queryExecStatus(err) + if req.AsView { + status = withResultView(status, failedResultView(spec, qctx, err)) + } + return nil, status } - return &pb.QueryResponse{Elements: eval.resultElements(qctx, result)}, nil + response := &pb.QueryResponse{Elements: eval.resultElements(qctx, result)} + if req.AsView { + response.ResultView, _ = spec.Write(qctx.Index, result, nil) + } + return response, nil } // resultElements renders the plan's rows: an element by the identity this @@ -320,34 +345,12 @@ func queryStatus(err error) error { qerr = &QueryError{Kind: translatorKind(err), Message: err.Error(), Err: err} } status := connect.NewError(connect.CodeInvalidArgument, qerr) - if outcome := translatorOutcome(err); outcome != nil { + if outcome := querytranslate.OutcomeOf(err); outcome != nil { return withQueryOutcome(status, outcome) } return status } -// translatorOutcome is the QVTS record of a translator refusal that has one: -// an unknown property is a path error whose frontier lists the properties the -// query could have named, with the nearest spelling. -func translatorOutcome(err error) *queryexec.Outcome { - var terr *querytranslate.Error - if !errors.As(err, &terr) || terr.Kind != querytranslate.ErrUnknownProperty { - return nil - } - frontier := queryexec.Frontier{Features: make([]queryexec.FeatureRef, 0, len(terr.Candidates))} - for _, candidate := range terr.Candidates { - frontier.Features = append(frontier.Features, queryexec.FeatureRef{Name: candidate}) - } - if nearest := suggest.Nearest(terr.Property, terr.Candidates); len(nearest) > 0 { - frontier.Nearest = nearest[0] - } - return &queryexec.Outcome{Path: &queryexec.PathError{Failures: []queryexec.Failure{{ - Step: queryexec.Step{Kind: queryexec.StepFeature, Argument: terr.Property}, - Expected: "a property of the metamodel", - Frontier: frontier, - }}}} -} - // translatorKind is the service's kind for a translator refusal. func translatorKind(err error) QueryErrorKind { var terr *querytranslate.Error diff --git a/internal/frontend/grpc/render_view.go b/internal/frontend/grpc/render_view.go index e08e60efeb..13ea2d1d1d 100644 --- a/internal/frontend/grpc/render_view.go +++ b/internal/frontend/grpc/render_view.go @@ -41,6 +41,12 @@ func (s *Service) RenderView(ctx context.Context, req *pb.RenderViewRequest) (*p return nil, statusError(connect.CodeInvalidArgument, (&view.UnknownCompartmentsError{Name: req.Compartments}).Error()) } + if req.Form != "" { + if err := s.requireCapability(CapabilityQueryResultView); err != nil { + return nil, err + } + } + worker, release := cached.worker() defer release() renderer := view.NewRenderer(worker.Model.Semantics(), worker.Model.Resolver(), cachedSourceText(cached)) @@ -55,7 +61,20 @@ func (s *Service) RenderView(ctx context.Context, req *pb.RenderViewRequest) (*p } return nil, statusError(connect.CodeInvalidArgument, err.Error()) } - return renderViewData(cached, rendering.DataWith(view.Options{Ports: ports, Show: shown, Compartments: compartments})), nil + response := renderViewData(cached, rendering.DataWith(view.Options{Ports: ports, Show: shown, Compartments: compartments})) + if !s.capabilities.has(CapabilityQueryResultView) { + response.Header = nil + } + if req.Form != "" { + if len(rendering.Header) == 0 { + return nil, statusErrorf(connect.CodeInvalidArgument, + "%s is not a QVTS::QueryResult view: form renders one as a document", req.View) + } + if err := queryResultForm(response, rendering, req.Form); err != nil { + return nil, err + } + } + return response, nil } type renderViewOrigins struct { @@ -104,6 +123,9 @@ func renderViewData(model *CachedModel, data view.Data) *pb.RenderViewResponse { Rows: make([]*pb.RenderRow, 0, len(data.Rows)), Notes: make([]*pb.RenderNote, 0, len(data.Notes)), } + for _, field := range data.Header { + response.Header = append(response.Header, &pb.RenderHeaderField{Name: field.Name, Value: field.Value}) + } if data.Canvas != nil { response.Canvas = &pb.RenderCanvas{ Unit: data.Canvas.Unit, Width: data.Canvas.Width, Height: data.Canvas.Height, HasSize: data.Canvas.HasSize, diff --git a/internal/frontend/grpc/resultview.go b/internal/frontend/grpc/resultview.go new file mode 100644 index 0000000000..fcbb0a689b --- /dev/null +++ b/internal/frontend/grpc/resultview.go @@ -0,0 +1,201 @@ +package grpc + +import ( + "errors" + "strconv" + "strings" + + "connectrpc.com/connect" + pb "github.com/Open-MBEE/OpenSysML/api/proto" + "github.com/Open-MBEE/OpenSysML/internal/doc/docir" + "github.com/Open-MBEE/OpenSysML/internal/doc/docrender" + "github.com/Open-MBEE/OpenSysML/internal/doc/queryexec" + "github.com/Open-MBEE/OpenSysML/internal/ir/view" +) + +// CapabilityQueryResultView names the as_view fields of RunDocumentQueryRequest and QueryRequest, +// which write an answer as a QVTS::QueryResult view, and RenderView's header and form for one. +const CapabilityQueryResultView = "query_result_view" + +// modelSource prefixes the hash a result view names a model by when its +// documents were parsed from content and have no file. +const modelSource = "model:" + +// contentName is what a document parsed from request content is named, having no file. +const contentName = "" + +// resultViewSpec states a run over a cached model: its source the files the +// model was parsed from, or its hash when it has none, its provenance the hash. +func resultViewSpec(cached *CachedModel, hash, name, query string) queryexec.ResultView { + var files []string + for _, doc := range cached.Documents { + if doc.Source != nil && doc.Source.Name() != "" && doc.Source.Name() != contentName { + files = append(files, doc.Source.Name()) + } + } + origin := modelSource + hash + if len(files) > 0 { + origin = strings.Join(files, " ") + } + return queryexec.ResultView{Name: name, Query: query, Source: origin, Provenance: modelSource + hash} +} + +// withResultView attaches a failed query's view to its status as a +// QueryResultView detail, beside the QueryOutcome it is written from. +func withResultView(status error, text string) error { + var connErr *connect.Error + if text == "" || !errors.As(status, &connErr) { + return status + } + detail, err := connect.NewErrorDetail(&pb.QueryResultView{Text: text}) + if err != nil { + return status + } + connErr.AddDetail(detail) + return connErr +} + +// failedResultView is the view of a run that failed with err, empty when err +// carries no path or model error. +func failedResultView(spec queryexec.ResultView, qctx queryexec.Context, err error) string { + text, _ := spec.Write(qctx.Index, nil, err) + return text +} + +// bindingsText writes a request's bindings as %run-query takes them, +// `=` in request order, after the query's name. +func bindingsText(name string, bindings []*pb.DocumentQueryBinding) string { + parts := []string{name} + for _, binding := range bindings { + for _, value := range binding.GetValues() { + parts = append(parts, binding.GetParameter()+"="+bindingValueText(value)) + } + } + return strings.Join(parts, " ") +} + +func bindingValueText(value *pb.DocumentValue) string { + switch kind := value.GetKind().(type) { + case *pb.DocumentValue_ElementId: + return kind.ElementId + case *pb.DocumentValue_StringValue: + return strconv.Quote(kind.StringValue) + case *pb.DocumentValue_IntValue: + return strconv.FormatInt(kind.IntValue, 10) + case *pb.DocumentValue_RealValue: + return strconv.FormatFloat(kind.RealValue, 'g', -1, 64) + case *pb.DocumentValue_BoolValue: + return strconv.FormatBool(kind.BoolValue) + case *pb.DocumentValue_BigIntValue: + return kind.BigIntValue + case *pb.DocumentValue_RationalValue: + return rationalText(kind.RationalValue) + case *pb.DocumentValue_Quantity: + return quantityText(kind.Quantity) + case *pb.DocumentValue_Object: + if kind.Object.GetPath() != "" { + return kind.Object.GetPath() + } + return "#" + strconv.FormatInt(kind.Object.GetInstanceId(), 10) + default: + return "?" + } +} + +func rationalText(r *pb.Rational) string { + return r.GetNumerator() + "/" + r.GetDenominator() +} + +func quantityText(q *pb.Quantity) string { + var magnitude string + switch m := q.GetMagnitude().(type) { + case *pb.Quantity_IntMagnitude: + magnitude = strconv.FormatInt(m.IntMagnitude, 10) + case *pb.Quantity_RealMagnitude: + magnitude = strconv.FormatFloat(m.RealMagnitude, 'g', -1, 64) + case *pb.Quantity_BigIntMagnitude: + magnitude = m.BigIntMagnitude + case *pb.Quantity_RationalMagnitude: + magnitude = rationalText(m.RationalMagnitude) + } + return magnitude + " [" + q.GetUnit() + "]" +} + +// apiQueryText writes a SysML v2 API Query as the text its view states: +// `scope=…; select=…; where=…; orderBy=…`, each part present when the query has it. +func apiQueryText(q *pb.Query) string { + var parts []string + if len(q.GetScope()) > 0 { + parts = append(parts, "scope="+strings.Join(q.GetScope(), ",")) + } + if len(q.GetSelect()) > 0 { + parts = append(parts, "select="+strings.Join(q.GetSelect(), ",")) + } + if q.GetWhere() != nil { + parts = append(parts, "where="+constraintText(q.GetWhere())) + } + if len(q.GetOrderBy()) > 0 { + parts = append(parts, "orderBy="+strings.Join(q.GetOrderBy(), ",")) + } + return strings.Join(parts, "; ") +} + +var primitiveOperatorText = map[pb.PrimitiveOperator]string{ + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_EQUAL: "=", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_GREATER: ">", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_LESS: "<", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_LESS_EQUAL: "<=", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_GREATER_EQUAL: ">=", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_IN: " in ", + pb.PrimitiveOperator_PRIMITIVE_OPERATOR_INSTANCE_OF: " instanceOf ", +} + +func constraintText(c *pb.Constraint) string { + if primitive := c.GetPrimitive(); primitive != nil { + values := make([]string, len(primitive.GetValue())) + for i, value := range primitive.GetValue() { + values[i] = strconv.Quote(value) + } + operand := strings.Join(values, ",") + if len(values) != 1 { + operand = "[" + operand + "]" + } + text := primitive.GetProperty() + primitiveOperatorText[primitive.GetOperator()] + operand + if primitive.GetInverse() { + return "not(" + text + ")" + } + return text + } + composite := c.GetComposite() + operator := " and " + if composite.GetOperator() == pb.CompositeOperator_COMPOSITE_OPERATOR_OR { + operator = " or " + } + terms := make([]string, len(composite.GetConstraint())) + for i, term := range composite.GetConstraint() { + terms[i] = constraintText(term) + } + return "(" + strings.Join(terms, operator) + ")" +} + +// queryResultForm renders a QVTS::QueryResult view's rendering as a document in +// form into the response's field of that name. +func queryResultForm(response *pb.RenderViewResponse, rendering *view.Rendering, form string) error { + document := docir.QueryResult(rendering) + var err error + switch form { + case renderFormMarkdown: + response.Markdown, err = docrender.Markdown(document, docrender.MarkdownOptions{}) + case renderFormHTML: + response.Html, err = docrender.HTML(document, docrender.HTMLOptions{}) + case renderFormAsciiDoc: + response.Asciidoc, err = docrender.AsciiDoc(document, docrender.AsciiDocOptions{}) + default: + return statusErrorf(connect.CodeInvalidArgument, + "form %q is not one this service renders: markdown, html or asciidoc", form) + } + if err != nil { + return documentStatus(err) + } + return nil +} diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index 4ce48caf7d..e49cbebffb 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -432,6 +432,7 @@ var capabilities = []string{ CapabilityVerdictNotes, CapabilityElementProperties, CapabilityInlineDocumentQuery, + CapabilityQueryResultView, } type capabilityAvailability struct { diff --git a/internal/frontend/repl/docquery.go b/internal/frontend/repl/docquery.go index f315a4083e..9e47e24589 100644 --- a/internal/frontend/repl/docquery.go +++ b/internal/frontend/repl/docquery.go @@ -37,35 +37,42 @@ func (s *Session) RunDocumentQuery(invocation string) Verdict { return s.withTrace(unresolvedVerdict(invocation, "a document query to run must be named")) } name := fields[0] - lines, values, table, err := s.runDocumentQuery(name, fields[1:]) + answer, err := s.runDocumentQuery(name, fields[1:]) if err != nil { verdict := unresolvedVerdict(name, err.Error()) verdict.Lines = append(verdict.Lines, queryexec.OutcomeLines(err)...) verdict.Outcome = queryOutcome(err) + verdict.ResultView = answer.view return s.withTrace(verdict) } - return s.withTrace(Verdict{Subject: name, Status: VerdictHolds, Lines: lines, Values: values, Table: table}) + return s.withTrace(Verdict{Subject: name, Status: VerdictHolds, Lines: answer.lines, Values: answer.values, Table: answer.table, ResultView: answer.view}) } // doRunQuery carries out %run-query, reporting a query that could not be run // the way the prompt reports any command it cannot carry out. func (s *Session) doRunQuery(invocation string) ([]string, bool, error) { - if text, ok := inlineInvocation(strings.TrimSpace(invocation)); ok { - lines, _, _, err := s.runInlineQuery(text) - if err != nil { - return append([]string{errPrefix + err.Error()}, queryexec.OutcomeLines(err)...), false, nil + invocation, asView := cutAsView(invocation) + if asView { + defer s.writingResultViews()() + } + var answer queryAnswer + var err error + if text, ok := inlineInvocation(invocation); ok { + answer, err = s.runInlineQuery(text) + } else { + fields := splitQueryArgs(invocation) + if len(fields) == 0 { + return []string{runQueryUsage}, false, nil } - return lines, false, nil + answer, err = s.runDocumentQuery(fields[0], fields[1:]) } - fields := splitQueryArgs(strings.TrimSpace(invocation)) - if len(fields) == 0 { - return []string{runQueryUsage}, false, nil + if asView && answer.view != "" { + return viewLines(answer.view), false, nil } - lines, _, _, err := s.runDocumentQuery(fields[0], fields[1:]) if err != nil { return append([]string{errPrefix + err.Error()}, queryexec.OutcomeLines(err)...), false, nil } - return lines, false, nil + return answer.lines, false, nil } // queryOutcome is the QVTS record behind a failed query, nil when it carries none. @@ -176,35 +183,37 @@ func bracketDelta(token string) int { // runDocumentQuery resolves the named query definition, compiles it to a plan, // binds the arguments and executes the plan against the session's model. -func (s *Session) runDocumentQuery(name string, args []string) ([]string, []NamedValue, *VerdictTable, error) { +func (s *Session) runDocumentQuery(name string, args []string) (queryAnswer, error) { sym, fqn, err := s.lookupSymbol(name) if err != nil { - return nil, nil, nil, err + return queryAnswer{}, err } ctx, err := s.getOrCreateRuntime() if err != nil { - return nil, nil, nil, fmt.Errorf("runtime init: %w", err) + return queryAnswer{}, fmt.Errorf("runtime init: %w", err) } idx := s.browseIndex() model, resolver := ctx.Semantics(), ctx.Resolver() if !queryplan.IsQueryDefinition(idx, model, sym) { - return nil, nil, nil, fmt.Errorf("%s is not a document query: one is a calc def specializing DocumentQueries::Query", notationName(fqn)) + return queryAnswer{}, fmt.Errorf("%s is not a document query: one is a calc def specializing DocumentQueries::Query", notationName(fqn)) } program, err := queryplan.Compile(idx, model, resolver, sym) if err != nil { - return nil, nil, nil, err + return queryAnswer{}, err } bindings, err := s.queryBindings(ctx, regroupBindings(args)) if err != nil { - return nil, nil, nil, err + return queryAnswer{}, err } context := s.queryContext(ctx) result, err := queryexec.Execute(program, context, bindings, queryexec.Options{}) + written := strings.Join(append([]string{fqn}, regroupBindings(args)...), " ") + view := s.resultView(queryexec.ResultViewName(fqn), written, context.Index, result, err) if err != nil { - return nil, nil, nil, err + return queryAnswer{view: view}, err } lines, values, table := renderRowSet(notationName(fqn), result, context) - return lines, values, table, nil + return queryAnswer{lines: lines, values: values, table: table, view: view}, nil } // queryContext is the context the session's queries execute in: its model, and diff --git a/internal/frontend/repl/docquery_inline.go b/internal/frontend/repl/docquery_inline.go index 8363f5019f..838071864b 100644 --- a/internal/frontend/repl/docquery_inline.go +++ b/internal/frontend/repl/docquery_inline.go @@ -26,14 +26,15 @@ func (s *Session) RunInlineDocumentQuery(text string) Verdict { } func (s *Session) inlineQueryVerdict(text string) Verdict { - lines, values, table, err := s.runInlineQuery(text) + answer, err := s.runInlineQuery(text) if err != nil { verdict := unresolvedVerdict(text, err.Error()) verdict.Lines = append(verdict.Lines, queryexec.OutcomeLines(err)...) verdict.Outcome = queryOutcome(err) + verdict.ResultView = answer.view return verdict } - return Verdict{Subject: text, Status: VerdictHolds, Lines: lines, Values: values, Table: table} + return Verdict{Subject: text, Status: VerdictHolds, Lines: answer.lines, Values: answer.values, Table: answer.table, ResultView: answer.view} } // inlineInvocation reads `inline ` out of a %run-query invocation; @@ -59,14 +60,14 @@ func isBindingArg(arg string) bool { // runInlineQuery plans text over the session's declarations, in an index of its // own beside them, and executes it against the session's model and objects. -func (s *Session) runInlineQuery(text string) ([]string, []NamedValue, *VerdictTable, error) { +func (s *Session) runInlineQuery(text string) (queryAnswer, error) { ctx, err := s.getOrCreateRuntime() if err != nil { - return nil, nil, nil, fmt.Errorf("runtime init: %w", err) + return queryAnswer{}, fmt.Errorf("runtime init: %w", err) } inline, err := queryplan.ParseInline(s.browseIndex(), text) if err != nil { - return nil, nil, nil, inlineQueryError(err) + return queryAnswer{}, inlineQueryError(err) } resolver := resolve.New(inline.Index) sem := passes.NewTypedModel(resolver) @@ -75,16 +76,17 @@ func (s *Session) runInlineQuery(text string) ([]string, []NamedValue, *VerdictT sem.ShareAbout(s.about) program, err := queryplan.Compile(inline.Index, sem, resolver, inline.Entry) if err != nil { - return nil, nil, nil, inlineQueryError(queryexec.LocateInline(inline, err)) + return queryAnswer{}, inlineQueryError(queryexec.LocateInline(inline, err)) } context := s.queryContext(ctx) context.Index, context.Resolver, context.Model = inline.Index, resolver, sem result, err := queryexec.Execute(program, context, nil, queryexec.Options{}) + view := s.resultView(queryexec.DefaultResultViewName, text, s.browseIndex(), result, err) if err != nil { - return nil, nil, nil, inlineQueryError(queryexec.LocateInline(inline, err)) + return queryAnswer{view: view}, inlineQueryError(queryexec.LocateInline(inline, err)) } lines, values, table := renderRows(inlineQueryHeading, result, context) - return lines, values, table, nil + return queryAnswer{lines: lines, values: values, table: table, view: view}, nil } // inlineQueryError reports a fault located in the inline text with the line it diff --git a/internal/frontend/repl/docrender.go b/internal/frontend/repl/docrender.go index 96603d3b5d..464016a0e1 100644 --- a/internal/frontend/repl/docrender.go +++ b/internal/frontend/repl/docrender.go @@ -98,6 +98,9 @@ func (s *Session) evaluateDocument(invocation, extension string) (*docir.Documen } idx := s.browseIndex() sem, resolver := ctx.Semantics(), ctx.Resolver() + if result, ok, err := s.queryResultDocument(sym); ok || err != nil { + return result, nil, err + } if !docplan.IsDocumentDefinition(idx, sem, sym) { return nil, nil, fmt.Errorf("%s is not a document: one is a part def specializing DocumentQueries::Document", notationName(fqn)) } @@ -340,3 +343,23 @@ func (s *Session) renderDocumentHTMLFragment(name string, opts docrender.Markdow Files: files, }) } + +// queryResultDocument is the document a view typed by QVTS::QueryResult is +// written as; false for any other element. +func (s *Session) queryResultDocument(sym *symbols.Symbol) (*docir.Document, bool, error) { + if !semantics.IsView(sym) { + return nil, false, nil + } + renderer, err := s.overlaidRenderer("", 0) + if err != nil { + return nil, false, err + } + if !renderer.IsQueryResult(sym) { + return nil, false, nil + } + rendering, err := renderer.Render(sym) + if err != nil { + return nil, true, err + } + return docir.QueryResult(rendering), true, nil +} diff --git a/internal/frontend/repl/meta.go b/internal/frontend/repl/meta.go index 078183f5f3..a39732a234 100644 --- a/internal/frontend/repl/meta.go +++ b/internal/frontend/repl/meta.go @@ -868,9 +868,19 @@ func (s *Session) metaDebugCommand(fields []string, line string) (metaResult, bo return metaOut(s.doInvoke(object, operation, args)), true case cmdQuery: if len(fields) < 2 { - return metaOut([]string{"usage: %query "}, false, nil), true + return metaOut([]string{queryUsage}, false, nil), true + } + text, asView := cutAsView(strings.TrimPrefix(strings.TrimSpace(line), cmdQuery)) + if text == "" { + return metaOut([]string{queryUsage}, false, nil), true + } + if asView { + defer s.writingResultViews()() + } + lines, written, err := s.query(text) + if asView && written != "" { + return metaOut(viewLines(written), false, nil), true } - lines, err := s.query(strings.TrimSpace(strings.TrimPrefix(strings.TrimSpace(line), cmdQuery))) if err != nil { return metaOut([]string{errPrefix + err.Error()}, false, nil), true } diff --git a/internal/frontend/repl/oslc_query.go b/internal/frontend/repl/oslc_query.go index 325cb2e69d..e5d5583d30 100644 --- a/internal/frontend/repl/oslc_query.go +++ b/internal/frontend/repl/oslc_query.go @@ -18,6 +18,15 @@ import ( // line for the interactive frontend. func (s *Session) Query(text string) ([]string, error) { defer s.enter()() + lines, _, err := s.query(text) + return lines, err +} + +// QueryAsView is Query with the answer also written as a QVTS::QueryResult +// view, which a path or model error has too; empty when the run has no outcome. +func (s *Session) QueryAsView(text string) (lines []string, view string, err error) { + defer s.enter()() + defer s.writingResultViews()() return s.query(text) } @@ -27,20 +36,20 @@ var errQueryNotLinked = errors.New("OSLC query is not linked into this build") // errNoQueryModel is Query's answer while the session holds no model to query. var errNoQueryModel = &querytranslate.Error{Kind: querytranslate.ErrNoModel, Message: "no model loaded"} -func (s *Session) query(text string) ([]string, error) { +func (s *Session) query(text string) ([]string, string, error) { if replext.Positional() == nil { - return nil, errQueryNotLinked + return nil, "", errQueryNotLinked } if len(s.sessionMembers()) == 0 || s.hasAnalysisErrors() { - return nil, errNoQueryModel + return nil, "", errNoQueryModel } idx := s.browseIndex() if idx == nil { - return nil, errNoQueryModel + return nil, "", errNoQueryModel } ctx, err := s.getOrCreateRuntime() if err != nil { - return nil, fmt.Errorf("runtime init: %w", err) + return nil, "", fmt.Errorf("runtime init: %w", err) } context := s.queryContext(ctx) namer := &replQueryModel{session: s, index: idx} @@ -48,17 +57,17 @@ func (s *Session) query(text string) ([]string, error) { table := querytranslate.NewTable(context.Index, context.Model) q, err := querytranslate.ParseOSLC(text, table) if err != nil { - return nil, err + return nil, s.refusedQueryView(text, context.Index, err), err } plan, err := querytranslate.Translate(q, querytranslate.Context{Index: context.Index, Model: context.Model, Table: table}, "%query") if err != nil { - return nil, err + return nil, s.refusedQueryView(text, context.Index, err), err } bindings := queryexec.Bindings{} if !plan.Objects { candidates, err := namer.Candidates(q.Scope) if err != nil { - return nil, err + return nil, "", err } values := make([]queryexec.Value, len(candidates)) for i, sym := range candidates { @@ -67,8 +76,9 @@ func (s *Session) query(text string) ([]string, error) { bindings[querytranslate.SourceParameter] = values } result, err := queryexec.Execute(plan.Program, context, bindings, queryexec.Options{}) + written := s.resultView(queryexec.DefaultResultViewName, text, context.Index, result, err) if err != nil { - return nil, err + return nil, written, err } rows := result.Rows() columns := result.Columns() @@ -98,7 +108,7 @@ func (s *Session) query(text string) ([]string, error) { } lines = append(lines, line.String()) } - return lines, nil + return lines, written, nil } // replQueryModel names the session's elements as %query reports them — by diff --git a/internal/frontend/repl/query.go b/internal/frontend/repl/query.go index 873036e409..caa685d858 100644 --- a/internal/frontend/repl/query.go +++ b/internal/frontend/repl/query.go @@ -71,6 +71,9 @@ type Verdict struct { // Outcome is the QVTS record behind a document query that could not be run // (queryexec.Outcome); nil for every other verdict. Outcome *queryexec.Outcome + // ResultView is a document query's answer written as a QVTS::QueryResult view, + // when the session writes them (SetResultViews); empty otherwise. + ResultView string // Plan is how the engines answered: the selection made, each engine put to // the question and what it answered, and the composed result whose standing // the last line reports. Nil for a verdict decided before any engine was asked. diff --git a/internal/frontend/repl/resultview.go b/internal/frontend/repl/resultview.go new file mode 100644 index 0000000000..103e0d7f91 --- /dev/null +++ b/internal/frontend/repl/resultview.go @@ -0,0 +1,116 @@ +package repl + +import ( + "crypto/sha256" + "encoding/hex" + "os" + "path/filepath" + "strings" + + "github.com/Open-MBEE/OpenSysML/internal/doc/queryexec" + "github.com/Open-MBEE/OpenSysML/internal/doc/querytranslate" + "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" +) + +// asViewOption is what %run-query and %query take before the query to print +// its answer as a QVTS::QueryResult view in place of its rows. +const asViewOption = "-as-view" + +const queryUsage = "usage: %query [-as-view] " + +// sessionSource is the source a result view states for a session that loaded no file. +const sessionSource = "session" + +// queryAnswer is what one query run reports: its rows as lines and as data, +// and, when the session writes them, the run as a QVTS::QueryResult view. +type queryAnswer struct { + lines []string + values []NamedValue + table *VerdictTable + view string +} + +// SetResultViews makes each document query the session runs also write its +// answer as a QVTS::QueryResult view, reported in Verdict.ResultView. +func (s *Session) SetResultViews(on bool) { + defer s.enter()() + s.resultViews = on +} + +// writingResultViews turns result views on until the returned func is called. +func (s *Session) writingResultViews() func() { + previous := s.resultViews + s.resultViews = true + return func() { s.resultViews = previous } +} + +// cutAsView reads a leading -as-view off a query invocation. +func cutAsView(invocation string) (string, bool) { + invocation = strings.TrimSpace(invocation) + rest, ok := strings.CutPrefix(invocation, asViewOption) + if !ok || (rest != "" && rest[0] != ' ' && rest[0] != '\t') { + return invocation, false + } + return strings.TrimSpace(rest), true +} + +func viewLines(text string) []string { + return strings.Split(strings.TrimRight(text, "\n"), "\n") +} + +// resultView writes one run as a view named name; empty when the session writes +// none or the run has no outcome. +func (s *Session) resultView(name, query string, index *symbols.Index, result *queryexec.RowSet, err error) string { + if !s.resultViews { + return "" + } + text, _ := s.resultViewSpec(name, query).Write(index, result, err) + return text +} + +// refusedQueryView is the view of query text the translator refused with a QVTS +// record, an unknown property being a path error; empty for any other refusal. +func (s *Session) refusedQueryView(query string, index *symbols.Index, err error) string { + outcome := querytranslate.OutcomeOf(err) + if !s.resultViews || outcome == nil { + return "" + } + return s.resultViewSpec(queryexec.DefaultResultViewName, query).WriteOutcome(index, *outcome) +} + +// resultViewSpec states a run over the files the session loaded, identified by +// the digest of its documents. +func (s *Session) resultViewSpec(name, query string) queryexec.ResultView { + var files []string + for _, sn := range s.snippets { + if sn.origin != "" { + files = append(files, sourcePath(sn.origin)) + } + } + origin := sessionSource + if len(files) > 0 { + origin = strings.Join(files, " ") + } + digest := sha256.New() + for _, doc := range s.sessionDocs() { + digest.Write([]byte(doc.Content)) + digest.Write([]byte{0}) + } + return queryexec.ResultView{ + Name: name, + Query: query, + Source: origin, + Provenance: "sha256:" + hex.EncodeToString(digest.Sum(nil)), + } +} + +// sourcePath names a loaded file as a view states it: relative to the working +// directory when it is under it, with forward slashes, so a view moves between machines. +func sourcePath(path string) string { + if cwd, err := os.Getwd(); err == nil { + if rel, err := filepath.Rel(cwd, path); err == nil && filepath.IsLocal(rel) { + return filepath.ToSlash(rel) + } + } + return filepath.ToSlash(path) +} diff --git a/internal/frontend/repl/session.go b/internal/frontend/repl/session.go index 52a9dc7c6b..1ee41d5ce2 100644 --- a/internal/frontend/repl/session.go +++ b/internal/frontend/repl/session.go @@ -97,6 +97,8 @@ type Session struct { // while it runs (exploreVerdict). Lower-case helpers assume the caller holds both. mu sync.Mutex state sync.Mutex + // resultViews makes each document query write its answer as a QVTS::QueryResult view. + resultViews bool // elementIDs is the reader the session's queries share (elementIDReader). elementIDs sessionElementIDs diff --git a/internal/ir/view/clone.go b/internal/ir/view/clone.go index 49a6f38dfb..a6e3e3dcf3 100644 --- a/internal/ir/view/clone.go +++ b/internal/ir/view/clone.go @@ -25,6 +25,7 @@ func (r *Rendering) Clone() *Rendering { for i, row := range r.Rows { out.Rows[i] = append([]string(nil), row...) } + out.Header = append([]HeaderField(nil), r.Header...) out.RowOrigins = append([]Origin(nil), r.RowOrigins...) out.Notices = append([]string(nil), r.Notices...) out.Frame = cloneFrame(r.Frame) diff --git a/internal/ir/view/data.go b/internal/ir/view/data.go index 8dcec15619..e431f6554d 100644 --- a/internal/ir/view/data.go +++ b/internal/ir/view/data.go @@ -23,6 +23,8 @@ type Data struct { // Columns and Rows are the tabular rendering, empty for every other kind. Columns []string Rows []RowData + // Header is what a query-result rendering states about its run. + Header []HeaderField `json:",omitempty"` // Lanes are a run timeline's object machines. Lanes []Lane // Canvas is the drawing surface the view states, nil for none. @@ -130,6 +132,7 @@ func (r *Rendering) data(ports *portView) Data { Run: r.Run, RunUntil: r.RunUntil, Columns: r.Columns, + Header: r.Header, Lanes: r.Lanes, Canvas: r.Canvas, Notes: r.Notes, diff --git a/internal/ir/view/markdown.go b/internal/ir/view/markdown.go index 5c7834c292..79f20afc06 100644 --- a/internal/ir/view/markdown.go +++ b/internal/ir/view/markdown.go @@ -30,6 +30,15 @@ func (r *Rendering) MarkdownCells(escape func(string) string) string { for _, notice := range r.Notices { fmt.Fprintf(&b, "\n", markdownComment(notice)) } + if len(r.Header) > 0 { + b.WriteString("\n") + for _, field := range r.Header { + fmt.Fprintf(&b, "- **%s**: %s\n", field.Name, markdownText(field.Value)) + } + if !r.Empty() { + b.WriteString("\n") + } + } if r.Empty() { fmt.Fprintf(&b, "\n%s\n", r.EmptyReason()) return b.String() diff --git a/internal/ir/view/queryresult.go b/internal/ir/view/queryresult.go new file mode 100644 index 0000000000..38f6ad70f8 --- /dev/null +++ b/internal/ir/view/queryresult.go @@ -0,0 +1,90 @@ +package view + +import ( + "fmt" + "sort" + "strings" + + "github.com/Open-MBEE/OpenSysML/internal/semantic/symbols" + "github.com/Open-MBEE/OpenSysML/internal/syntax/ast" + "github.com/Open-MBEE/OpenSysML/internal/syntax/source" +) + +// queryResultDefinition is the view definition a written query answer is typed by. +const queryResultDefinition = "QVTS::QueryResult" + +// queryResultAttributes are what a QueryResult view states about its run, in +// the order the QVTS library declares them. +var queryResultAttributes = []string{"query", "source", "outcome", "provenance"} + +// HeaderField is one statement a rendering makes about itself as a whole. +type HeaderField struct { + Name string + Value string +} + +// IsQueryResult reports whether view is typed by the QVTS library's QueryResult. +func (r *Renderer) IsQueryResult(view *symbols.Symbol) bool { + for _, sym := range r.model.AllSupertypes(view) { + if r.fqn(sym) == queryResultDefinition { + return true + } + } + return false +} + +// renderQueryResult renders a query answer: one row per exposed element and +// the four attributes of its run as the header. +func (r *Renderer) renderQueryResult(view *symbols.Symbol, exposed []*symbols.Symbol, out *Rendering) { + out.Columns = tableColumns + for _, elem := range exposed { + out.appendRow([]string{r.notationName(elem), declKind(elem), r.headType(elem), r.notationName(elem.Owner())}, symbolOrigin(elem)) + } + for _, name := range queryResultAttributes { + value, _ := r.statedValue(view, name) + out.Header = append(out.Header, HeaderField{Name: name, Value: value}) + } + if len(exposed) == 0 { + out.emptyReason = "the query result exposes no element" + } +} + +// statedValue is the value view binds its attribute name to, a string as its +// text and a reference by its last name; false when the view binds none. +func (r *Renderer) statedValue(view *symbols.Symbol, name string) (string, bool) { + if view == nil || view.Scope == nil { + return "", false + } + members := append(view.Scope.Members(), view.Scope.AnonymousMembers()...) + sort.SliceStable(members, func(i, j int) bool { return members[i].DeclSpan.Offset < members[j].DeclSpan.Offset }) + for _, member := range members { + if !member.Kind.IsAttributeLike() || r.model.EffectiveNameOf(member) != name { + continue + } + usage, ok := member.Decl.(*ast.Usage) + if !ok || usage.Value == nil { + continue + } + if literal, ok := usage.Value.(*ast.LiteralString); ok { + return source.StringValue(literal.Value), true + } + return symbols.LastSegment(referenceText(usage.Value)), true + } + return "", false +} + +// writeHeaderText writes the header of a query-result rendering, one field a line. +func writeHeaderText(b *strings.Builder, header []HeaderField) { + if len(header) == 0 { + return + } + b.WriteString("\n") + for _, field := range header { + fmt.Fprintf(b, "%s: %s\n", field.Name, field.Value) + } +} + +// markdownText escapes what Markdown would read as markup in running text. +func markdownText(text string) string { + return strings.NewReplacer("\\", "\\\\", "*", "\\*", "_", "\\_", "`", "\\`", "<", "\\<", "[", "\\[", "\n", " ").Replace(text) +} diff --git a/internal/ir/view/text.go b/internal/ir/view/text.go index 68975cce0e..6ab757247a 100644 --- a/internal/ir/view/text.go +++ b/internal/ir/view/text.go @@ -52,6 +52,7 @@ func (r *Rendering) textWith(options Options) string { writeNotices(&b, r.Notices) return b.String() } + writeHeaderText(&b, r.Header) if r.Empty() { b.WriteString("\n" + r.EmptyReason() + "\n") writeNotices(&b, slices.Concat(r.Notices, pictureNotices)) diff --git a/internal/ir/view/view.go b/internal/ir/view/view.go index 28d10e5ff3..2cbf88a127 100644 --- a/internal/ir/view/view.go +++ b/internal/ir/view/view.go @@ -573,6 +573,9 @@ type Rendering struct { // Lanes are a timeline's object machines, in the order the run first // recorded them. Lanes []Lane + // Header is what a query-result rendering states about its run, in the + // order the QVTS library declares the attributes; nil for every other view. + Header []HeaderField // RowOrigins is where each row's element was declared, one entry per row. RowOrigins []Origin // Shown is the optional notation elements the view's rendering shows, read @@ -703,7 +706,11 @@ func (r *Renderer) render(view *symbols.Symbol, drawn *Drawn) (*Rendering, error case KindMixed: r.renderMixed(view, exposed, out) case KindTable: - r.renderTable(view, exposed, out) + if r.IsQueryResult(view) { + r.renderQueryResult(view, exposed, out) + } else { + r.renderTable(view, exposed, out) + } case KindMatrix: r.renderMatrix(exposed, r.matrixShownKinds(view), false, out) case KindSequence: @@ -822,6 +829,9 @@ func (r *Renderer) KindOf(view *symbols.Symbol) (Kind, string, error) { } return definitionKind, definitionStated, nil } + if r.IsQueryResult(view) { + return KindTable, "view def QueryResult", nil + } return KindTree, "", nil } diff --git a/tests/grpc/conformance_docquery_test.go b/tests/grpc/conformance_docquery_test.go index 80b55197fb..85155601e2 100644 --- a/tests/grpc/conformance_docquery_test.go +++ b/tests/grpc/conformance_docquery_test.go @@ -41,7 +41,7 @@ func runRunDocumentQueryCase(t *testing.T, srv *grpc.Service, ctx context.Contex bindings = append(bindings, &pb.DocumentQueryBinding{Parameter: b.Parameter, Values: values}) } resp, err := srv.RunDocumentQuery(ctx, &pb.RunDocumentQueryRequest{ - ModelHash: modelHash, QueryId: tc.QueryID, InlineQuery: tc.InlineQuery, Bindings: bindings, + ModelHash: modelHash, QueryId: tc.QueryID, InlineQuery: tc.InlineQuery, Bindings: bindings, AsView: tc.AsView, }) if tc.ExpectedError != "" { if err == nil { @@ -50,11 +50,13 @@ func runRunDocumentQueryCase(t *testing.T, srv *grpc.Service, ctx context.Contex if !strings.Contains(err.Error(), tc.ExpectedError) { t.Fatalf("error = %q, want it to contain %q", err.Error(), tc.ExpectedError) } + checkResultView(t, modelHash, tc, failedResultView(err)) return } if err != nil { t.Fatalf("RunDocumentQuery: %v", err) } + checkResultView(t, modelHash, tc, resp.ResultView) columns := make([]string, 0, len(resp.Columns)) for _, column := range resp.Columns { columns = append(columns, column.Name) diff --git a/tests/grpc/conformance_test.go b/tests/grpc/conformance_test.go index 09fb5d9858..4c866ad7e5 100644 --- a/tests/grpc/conformance_test.go +++ b/tests/grpc/conformance_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "maps" "os" @@ -15,6 +16,7 @@ import ( "sync" "testing" + "connectrpc.com/connect" pb "github.com/Open-MBEE/OpenSysML/api/proto" "github.com/Open-MBEE/OpenSysML/internal/exec/analysis" "github.com/Open-MBEE/OpenSysML/internal/exec/solve" @@ -235,6 +237,20 @@ type conformanceCase struct { Query map[string]any `json:"query,omitempty"` ExpectedElementIDs []string `json:"expected_element_ids,omitempty"` ExpectedQueryError string `json:"expected_query_error,omitempty"` + // OslcQuery is OSLC Query text asked in place of Query. AsView asks the query RPCs for + // the answer as a QVTS::QueryResult view too: ExpectedResultView is its text, a failed + // query's read off the QueryResultView detail, with the model hash written . + OslcQuery string `json:"oslc_query,omitempty"` + AsView bool `json:"as_view,omitempty"` + ExpectedResultView string `json:"expected_result_view,omitempty"` + // RenderView: Form is the document form asked for, ExpectedHeader the view's header as + // "name: value" lines, ExpectedRows its rows joined by " | ", ExpectedDocument the document. + // ExpectedDocumentParts are what an HTML page must contain, in place of the whole page. + Form string `json:"form,omitempty"` + ExpectedHeader []string `json:"expected_header,omitempty"` + ExpectedViewRows []string `json:"expected_view_rows,omitempty"` + ExpectedDocument string `json:"expected_document,omitempty"` + ExpectedDocumentParts []string `json:"expected_document_parts,omitempty"` // Model names the fixture parsed instead of .sysml, so cases reading // different elements of one model share it. @@ -1111,7 +1127,7 @@ func runExecuteActionCase(t *testing.T, srv *grpc.Service, ctx context.Context, // checks the nodes drawn, the compartment each row is drawn in and the edges. func runRenderViewCase(t *testing.T, srv *grpc.Service, ctx context.Context, modelHash string, tc conformanceCase) { t.Helper() - resp, err := srv.RenderView(ctx, &pb.RenderViewRequest{ModelHash: modelHash, View: tc.View, Compartments: tc.Compartments}) + resp, err := srv.RenderView(ctx, &pb.RenderViewRequest{ModelHash: modelHash, View: tc.View, Compartments: tc.Compartments, Form: tc.Form}) if tc.ExpectedError != "" { if err == nil || !strings.Contains(err.Error(), tc.ExpectedError) { t.Fatalf("RenderView error = %v, want %q", err, tc.ExpectedError) @@ -1149,6 +1165,30 @@ func runRenderViewCase(t *testing.T, srv *grpc.Service, ctx context.Context, mod if !slices.Equal(labels, tc.ExpectedEdgeLabels) { t.Errorf("edge labels = %v, want %v", labels, tc.ExpectedEdgeLabels) } + var header, rows []string + for _, field := range resp.Header { + header = append(header, field.GetName()+": "+field.GetValue()) + } + if !slices.Equal(header, tc.ExpectedHeader) { + t.Errorf("header = %q, want %q", header, tc.ExpectedHeader) + } + if tc.ExpectedViewRows != nil { + for _, row := range resp.Rows { + rows = append(rows, strings.Join(row.GetCells(), " | ")) + } + if !slices.Equal(rows, tc.ExpectedViewRows) { + t.Errorf("rows = %q, want %q", rows, tc.ExpectedViewRows) + } + } + document := resp.Markdown + resp.Html + resp.Asciidoc + if tc.ExpectedDocumentParts == nil && document != tc.ExpectedDocument { + t.Errorf("document:\n%s\nwant:\n%s", document, tc.ExpectedDocument) + } + for _, part := range tc.ExpectedDocumentParts { + if !strings.Contains(resp.Html, part) { + t.Errorf("html has no %q", part) + } + } } // runGetDiagnosticsCase asks for the model's diagnostics under the case's lint @@ -1305,19 +1345,23 @@ func runRunRunsCase(t *testing.T, srv *grpc.Service, ctx context.Context, modelH func runQueryCase(t *testing.T, srv *grpc.Service, ctx context.Context, modelHash string, tc conformanceCase) { t.Helper() - encoded, err := json.Marshal(tc.Query) - if err != nil { - t.Fatalf("query: %v", err) - } - query := &pb.Query{} - if err := protojson.Unmarshal(encoded, query); err != nil { - t.Fatalf("query is not a protojson Query: %v", err) + req := &pb.QueryRequest{ModelHash: modelHash, OslcQuery: tc.OslcQuery, AsView: tc.AsView} + if tc.OslcQuery == "" { + encoded, err := json.Marshal(tc.Query) + if err != nil { + t.Fatalf("query: %v", err) + } + req.Query = &pb.Query{} + if err := protojson.Unmarshal(encoded, req.Query); err != nil { + t.Fatalf("query is not a protojson Query: %v", err) + } } - resp, err := srv.Query(ctx, &pb.QueryRequest{ModelHash: modelHash, Query: query}) + resp, err := srv.Query(ctx, req) if tc.ExpectedQueryError != "" { if err == nil || !strings.Contains(err.Error(), tc.ExpectedQueryError) { t.Fatalf("Query err = %v, want one containing %q", err, tc.ExpectedQueryError) } + checkResultView(t, modelHash, tc, failedResultView(err)) return } if err != nil { @@ -1330,6 +1374,32 @@ func runQueryCase(t *testing.T, srv *grpc.Service, ctx context.Context, modelHas if !slices.Equal(ids, tc.ExpectedElementIDs) { t.Errorf("elements = %v, want %v", ids, tc.ExpectedElementIDs) } + checkResultView(t, modelHash, tc, resp.ResultView) +} + +// failedResultView is the view a failed query carries as a QueryResultView detail. +func failedResultView(err error) string { + var connErr *connect.Error + if !errors.As(err, &connErr) { + return "" + } + for _, detail := range connErr.Details() { + if msg, derr := detail.Value(); derr == nil { + if view, ok := msg.(*pb.QueryResultView); ok { + return view.Text + } + } + } + return "" +} + +// checkResultView compares a query's view with the case's, the model hash written . +func checkResultView(t *testing.T, modelHash string, tc conformanceCase, got string) { + t.Helper() + got = strings.ReplaceAll(got, modelHash, "") + if got != tc.ExpectedResultView { + t.Errorf("result view:\n%s\nwant:\n%s", got, tc.ExpectedResultView) + } } func runGetElementPropertiesCase(t *testing.T, srv *grpc.Service, ctx context.Context, modelHash string, tc conformanceCase) { diff --git a/tests/grpc/testdata/conformance/query_result_view.sysml b/tests/grpc/testdata/conformance/query_result_view.sysml new file mode 100644 index 0000000000..5663e95e86 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view.sysml @@ -0,0 +1,55 @@ +package Probe { + private import DocumentQueries::*; + private import KerML::Root::Element; + private import ScalarValues::*; + private import QVTS::*; + + part def Payload { + attribute mass : Real; + } + part probe { + part camera : Payload { + attribute :>> mass = 4.5; + } + part antenna : Payload { + attribute :>> mass = 12.0; + } + part twin; + part twin; + } + + calc def Masses :> Query { + in root : Element; + Project(source = WhereType(source = Descendants(source = root), type = "PartUsage"), properties = ("name", "mass")) + } + calc def Self :> Query { + in root : Element; + Project(source = root, properties = ("name")) + } + calc def NoStates :> Query { + Project(source = WhereType(source = Descendants(source = Named(qualifiedName = "Probe::probe")), type = "StateUsage"), properties = ("name")) + } + calc def Misspelled :> Query { + Project(source = Named(qualifiedName = "Probe::probe::camra"), properties = ("name")) + } + calc def Twin :> Query { + Project(source = Named(qualifiedName = "Probe::probe::twin"), properties = ("name")) + } + + view heavy : QueryResult { + expose Probe::probe::antenna; + attribute :>> query = "Probe::Self root=Probe::probe::antenna"; + attribute :>> source = "probe.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "urn:prov:bundle:heavy"; + } + view nothing : QueryResult { + attribute :>> query = "Probe::NoStates"; + attribute :>> source = "probe.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "urn:prov:bundle:nothing"; + } + view plain { + expose Probe::probe::camera; + } +} diff --git a/tests/grpc/testdata/conformance/query_result_view_api.expected.json b/tests/grpc/testdata/conformance/query_result_view_api.expected.json new file mode 100644 index 0000000000..8618c1c396 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_api.expected.json @@ -0,0 +1,26 @@ +{ + "rpc": "Query", + "model": "query_result_view.sysml", + "query": { + "scope": [ + "Probe::probe" + ], + "select": [ + "name" + ], + "where": { + "primitive": { + "property": "name", + "operator": "PRIMITIVE_OPERATOR_EQUAL", + "value": [ + "antenna" + ] + } + } + }, + "as_view": true, + "expected_element_ids": [ + "Probe::probe::antenna" + ], + "expected_result_view": "package AnswerResult {\n\tprivate import QVTS::*;\n\n\tview answer : QueryResult {\n\t\texpose Probe::probe::antenna;\n\t\tattribute :>> query = \"scope=Probe::probe; select=name; where=name=\\\"antenna\\\"\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::established;\n\t\tattribute :>> provenance = \"model:\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_empty.expected.json b/tests/grpc/testdata/conformance/query_result_view_empty.expected.json new file mode 100644 index 0000000000..d04d508978 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_empty.expected.json @@ -0,0 +1,11 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "query_id": "Probe::NoStates", + "as_view": true, + "expected_columns": [ + "name" + ], + "expected_rows": [], + "expected_result_view": "package NoStatesResult {\n\tprivate import QVTS::*;\n\n\tview noStates : QueryResult {\n\t\tattribute :>> query = \"Probe::NoStates\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::established;\n\t\tattribute :>> provenance = \"model:\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_inline.expected.json b/tests/grpc/testdata/conformance/query_result_view_inline.expected.json new file mode 100644 index 0000000000..605cd4fdde --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_inline.expected.json @@ -0,0 +1,26 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "inline_query": "Project(Named(\"Probe::probe::antenna\"), (\"name\"))", + "as_view": true, + "expected_columns": [ + "name" + ], + "expected_rows": [ + { + "element": { + "kind": "element_id", + "value": "Probe::probe::antenna (PartUsage)" + }, + "cells": [ + [ + { + "kind": "string_value", + "value": "antenna" + } + ] + ] + } + ], + "expected_result_view": "package AnswerResult {\n\tprivate import QVTS::*;\n\n\tview answer : QueryResult {\n\t\texpose Probe::probe::antenna;\n\t\tattribute :>> query = \"Project(Named(\\\"Probe::probe::antenna\\\"), (\\\"name\\\"))\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::established;\n\t\tattribute :>> provenance = \"model:\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_model_error.expected.json b/tests/grpc/testdata/conformance/query_result_view_model_error.expected.json new file mode 100644 index 0000000000..f18e9c8f93 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_model_error.expected.json @@ -0,0 +1,8 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "query_id": "Probe::Twin", + "as_view": true, + "expected_error": "twin", + "expected_result_view": "package TwinResult {\n\tprivate import QVTS::*;\n\n\tview twin : QueryResult {\n\t\texpose Probe::probe;\n\t\tattribute :>> query = \"Probe::Twin\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::modelError;\n\t\tattribute :>> provenance = \"model:; step Named(Probe::probe::twin)\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_named.expected.json b/tests/grpc/testdata/conformance/query_result_view_named.expected.json new file mode 100644 index 0000000000..7557cfffae --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_named.expected.json @@ -0,0 +1,37 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "query_id": "Probe::Self", + "bindings": [ + { + "parameter": "root", + "values": [ + { + "kind": "element_id", + "value": "Probe::probe::antenna" + } + ] + } + ], + "as_view": true, + "expected_columns": [ + "name" + ], + "expected_rows": [ + { + "element": { + "kind": "element_id", + "value": "Probe::probe::antenna (PartUsage)" + }, + "cells": [ + [ + { + "kind": "string_value", + "value": "antenna" + } + ] + ] + } + ], + "expected_result_view": "package SelfResult {\n\tprivate import QVTS::*;\n\n\tview self : QueryResult {\n\t\texpose Probe::probe::antenna;\n\t\tattribute :>> query = \"Probe::Self root=Probe::probe::antenna\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::established;\n\t\tattribute :>> provenance = \"model:\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_oslc.expected.json b/tests/grpc/testdata/conformance/query_result_view_oslc.expected.json new file mode 100644 index 0000000000..2d553a2bc7 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_oslc.expected.json @@ -0,0 +1,10 @@ +{ + "rpc": "Query", + "model": "query_result_view.sysml", + "oslc_query": "oslc.where=sysml:name=\"camera\"", + "as_view": true, + "expected_element_ids": [ + "Probe::probe::camera" + ], + "expected_result_view": "package AnswerResult {\n\tprivate import QVTS::*;\n\n\tview answer : QueryResult {\n\t\texpose Probe::probe::camera;\n\t\tattribute :>> query = \"oslc.where=sysml:name=\\\"camera\\\"\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::established;\n\t\tattribute :>> provenance = \"model:\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_oslc_unknown_property.expected.json b/tests/grpc/testdata/conformance/query_result_view_oslc_unknown_property.expected.json new file mode 100644 index 0000000000..d611f608a4 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_oslc_unknown_property.expected.json @@ -0,0 +1,8 @@ +{ + "rpc": "Query", + "model": "query_result_view.sysml", + "oslc_query": "oslc.where=sysml:nme=\"camera\"", + "as_view": true, + "expected_query_error": "sysml:nme", + "expected_result_view": "package AnswerResult {\n\tprivate import QVTS::*;\n\n\tview answer : QueryResult {\n\t\tattribute :>> query = \"oslc.where=sysml:nme=\\\"camera\\\"\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::pathError;\n\t\tattribute :>> provenance = \"model:; step Feature(sysml:nme)\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_path_error.expected.json b/tests/grpc/testdata/conformance/query_result_view_path_error.expected.json new file mode 100644 index 0000000000..1c40b051a0 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_path_error.expected.json @@ -0,0 +1,8 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "query_id": "Probe::Misspelled", + "as_view": true, + "expected_error": "camra", + "expected_result_view": "package MisspelledResult {\n\tprivate import QVTS::*;\n\n\tview misspelled : QueryResult {\n\t\texpose Probe::probe;\n\t\tattribute :>> query = \"Probe::Misspelled\";\n\t\tattribute :>> source = \"model:\";\n\t\tattribute :>> outcome = Outcome::pathError;\n\t\tattribute :>> provenance = \"model:; step Named(Probe::probe::camra)\";\n\t}\n}\n" +} diff --git a/tests/grpc/testdata/conformance/query_result_view_unasked.expected.json b/tests/grpc/testdata/conformance/query_result_view_unasked.expected.json new file mode 100644 index 0000000000..6ec02a2330 --- /dev/null +++ b/tests/grpc/testdata/conformance/query_result_view_unasked.expected.json @@ -0,0 +1,9 @@ +{ + "rpc": "RunDocumentQuery", + "model": "query_result_view.sysml", + "query_id": "Probe::NoStates", + "expected_columns": [ + "name" + ], + "expected_rows": [] +} diff --git a/tests/grpc/testdata/conformance/render_view_form_not_query_result.expected.json b/tests/grpc/testdata/conformance/render_view_form_not_query_result.expected.json new file mode 100644 index 0000000000..f254186031 --- /dev/null +++ b/tests/grpc/testdata/conformance/render_view_form_not_query_result.expected.json @@ -0,0 +1,7 @@ +{ + "rpc": "RenderView", + "model": "query_result_view.sysml", + "view": "Probe::plain", + "form": "markdown", + "expected_error": "is not a QVTS::QueryResult view" +} diff --git a/tests/grpc/testdata/conformance/render_view_query_result.expected.json b/tests/grpc/testdata/conformance/render_view_query_result.expected.json new file mode 100644 index 0000000000..033a914569 --- /dev/null +++ b/tests/grpc/testdata/conformance/render_view_query_result.expected.json @@ -0,0 +1,14 @@ +{ + "rpc": "RenderView", + "model": "query_result_view.sysml", + "view": "Probe::heavy", + "expected_header": [ + "query: Probe::Self root=Probe::probe::antenna", + "source: probe.sysml", + "outcome: established", + "provenance: urn:prov:bundle:heavy" + ], + "expected_view_rows": [ + "Probe::probe::antenna | part | Payload | Probe::probe" + ] +} diff --git a/tests/grpc/testdata/conformance/render_view_query_result_asciidoc.expected.json b/tests/grpc/testdata/conformance/render_view_query_result_asciidoc.expected.json new file mode 100644 index 0000000000..550082a026 --- /dev/null +++ b/tests/grpc/testdata/conformance/render_view_query_result_asciidoc.expected.json @@ -0,0 +1,13 @@ +{ + "rpc": "RenderView", + "model": "query_result_view.sysml", + "view": "Probe::nothing", + "form": "asciidoc", + "expected_header": [ + "query: Probe::NoStates", + "source: probe.sysml", + "outcome: established", + "provenance: urn:prov:bundle:nothing" + ], + "expected_document": "= Probe::nothing\n\nquery:: Probe::NoStates\nsource:: probe.sysml\noutcome:: established\nprovenance:: urn:prov:bundle:nothing\n\nthe query result exposes no element\n" +} diff --git a/tests/grpc/testdata/conformance/render_view_query_result_html.expected.json b/tests/grpc/testdata/conformance/render_view_query_result_html.expected.json new file mode 100644 index 0000000000..ce30c038e4 --- /dev/null +++ b/tests/grpc/testdata/conformance/render_view_query_result_html.expected.json @@ -0,0 +1,18 @@ +{ + "rpc": "RenderView", + "model": "query_result_view.sysml", + "view": "Probe::heavy", + "form": "html", + "expected_header": [ + "query: Probe::Self root=Probe::probe::antenna", + "source: probe.sysml", + "outcome: established", + "provenance: urn:prov:bundle:heavy" + ], + "expected_document_parts": [ + "", + "Probe::heavy", + "urn:prov:bundle:heavy", + "Probe::probe::antenna" + ] +} diff --git a/tests/grpc/testdata/conformance/render_view_query_result_markdown.expected.json b/tests/grpc/testdata/conformance/render_view_query_result_markdown.expected.json new file mode 100644 index 0000000000..4e2e57df60 --- /dev/null +++ b/tests/grpc/testdata/conformance/render_view_query_result_markdown.expected.json @@ -0,0 +1,13 @@ +{ + "rpc": "RenderView", + "model": "query_result_view.sysml", + "view": "Probe::heavy", + "form": "markdown", + "expected_header": [ + "query: Probe::Self root=Probe::probe::antenna", + "source: probe.sysml", + "outcome: established", + "provenance: urn:prov:bundle:heavy" + ], + "expected_document": "# Probe::heavy\n\n**query** — Probe::Self root=Probe::probe::antenna\n\n**source** — probe.sysml\n\n**outcome** — established\n\n**provenance** — urn:prov:bundle:heavy\n\n| Element | Kind | Type | Declared in |\n| --- | --- | --- | --- |\n| Probe::probe::antenna | part | Payload | Probe::probe |\n" +} diff --git a/tests/qvts/examples_test.go b/tests/qvts/examples_test.go index 39d3245935..84d4fe9ff6 100644 --- a/tests/qvts/examples_test.go +++ b/tests/qvts/examples_test.go @@ -45,8 +45,10 @@ func TestExampleRecordings(t *testing.T) { return args } const ( - inlineMass = `Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass"))` - inlineFault = `Project(Named("Lander") ("qualifiedName"))` + inlineMass = `Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass"))` + inlineFault = `Project(Named("Lander") ("qualifiedName"))` + oslcCabin = `oslc.where=sysml:name="cabin"` + oslcUnknownProperty = `oslc.where=sysml:nme="cabin"` ) runs := []recording{ {name: "cabin-mass", args: query("CabinMass", false), status: 0}, @@ -98,6 +100,20 @@ func TestExampleRecordings(t *testing.T) { {name: "model-error-json", args: query("AmbiguousPart", true), status: 2}, {name: "ttl-cabin-excerpt", args: []string{"examples/qvts/lander.sysml", "-convert", "ttl"}, status: 0, view: rdfCabinExcerpt}, {name: "metamodel-partusage", args: []string{"-metamodel-table"}, status: 0, view: metamodelPartUsage}, + {name: "view-cabin-mass", args: append(query("CabinMass", false), "-as-view", "-"), status: 0}, + {name: "view-misspelled-name", args: append(query("MisspelledName", false), "-as-view", "-"), status: 2}, + { + name: "view-oslc-cabin", + args: []string{"examples/qvts/lander.sysml", "-query", oslcCabin, "-as-view", "-"}, + command: "bin/sysml examples/qvts/lander.sysml -query '" + oslcCabin + "' -as-view -", + status: 0, + }, + { + name: "view-oslc-unknown-property", + args: []string{"examples/qvts/lander.sysml", "-query", oslcUnknownProperty, "-as-view", "-"}, + command: "bin/sysml examples/qvts/lander.sysml -query '" + oslcUnknownProperty + "' -as-view -", + status: 2, + }, } for i := range runs { if runs[i].command == "" { diff --git a/tests/qvts/result_views_test.go b/tests/qvts/result_views_test.go new file mode 100644 index 0000000000..bd897693cb --- /dev/null +++ b/tests/qvts/result_views_test.go @@ -0,0 +1,134 @@ +package qvts_test + +import ( + "bytes" + "errors" + "os" + "os/exec" + "path/filepath" + "testing" +) + +// resultView is one query answer written as a QVTS::QueryResult view and that +// view rendered: models are loaded, query is the flag and text that runs it. +type resultView struct { + name string + models []string + query []string + view string + status int +} + +// renderedForms are the renderings recorded for each view, by file extension: +// RenderView's text and Markdown, and every form RenderDocument writes without a converter. +var renderedForms = []struct { + extension string + args []string +}{ + {".txt", []string{"-render", "", "-render-form", "text"}}, + {".view.md", []string{"-render", "", "-render-form", "markdown"}}, + {".md", []string{"-render-document", "", "-doc-form", "markdown"}}, + {".html", []string{"-render-document", "", "-doc-form", "html"}}, + {".adoc", []string{"-render-document", "", "-doc-form", "asciidoc"}}, +} + +func TestResultViews(t *testing.T) { + root := repoRoot(t) + binary := buildCLI(t, root) + lander := []string{"examples/qvts/lander.sysml", "examples/qvts/queries.sysml"} + duplicates := []string{"examples/qvts/lander.sysml", "examples/qvts/duplicates.sysml", "examples/qvts/queries.sysml"} + named := func(name string) []string { return []string{"-run-query", "QVTSDemo::" + name} } + cases := []resultView{ + {name: "cabin-mass", models: lander, query: named("CabinMass"), view: "CabinMassResult::cabinMass"}, + {name: "empty-selection", models: lander, query: named("EmptySelection"), view: "EmptySelectionResult::emptySelection"}, + {name: "missing-mass-project", models: lander, query: named("MissingMassProject"), view: "MissingMassProjectResult::missingMassProject", status: 2}, + {name: "misspelled-name", models: lander, query: named("MisspelledName"), view: "MisspelledNameResult::misspelledName", status: 2}, + {name: "ambiguous-part", models: duplicates, query: named("AmbiguousPart"), view: "AmbiguousPartResult::ambiguousPart", status: 2}, + {name: "double-mass-value", models: duplicates, query: named("DoubleMassValue"), view: "DoubleMassValueResult::doubleMassValue"}, + { + name: "inline-mass", models: lander[:1], view: "AnswerResult::answer", + query: []string{"-run-inline-query", `Project(WhereType(Descendants(Named("Lander::lander")), "PartUsage", true), ("qualifiedName", "mass"))`}, + }, + { + name: "oslc-cabin", models: lander[:1], view: "AnswerResult::answer", + query: []string{"-query", `oslc.where=sysml:name="cabin"`}, + }, + { + name: "oslc-unknown-property", models: lander[:1], view: "AnswerResult::answer", + query: []string{"-query", `oslc.where=sysml:nme="cabin"`}, status: 2, + }, + // The view Open-MBEE/qvts writes by hand over its observatory, rendered as the engine's are. + {name: "heavy-parts", models: []string{"examples/qvts/observatory/observatory.sysml"}, view: "HeavyPartsResult::heavyParts"}, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + recorded := filepath.Join("examples", "qvts", "expected", "views", c.name+".sysml") + if c.query == nil { + recorded = "examples/qvts/observatory/result.sysml" + } else { + written := filepath.Join(t.TempDir(), "view.sysml") + args := append(append(append([]string(nil), c.models...), c.query...), "-as-view", written) + runCLI(t, binary, root, c.status, args...) + // The same run writes the same bytes: a view is deterministic for one commit. + again := filepath.Join(t.TempDir(), "view.sysml") + runCLI(t, binary, root, c.status, append(args[:len(args)-1:len(args)-1], again)...) + first, second := readFile(t, written), readFile(t, again) + if !bytes.Equal(first, second) { + t.Fatalf("two runs wrote different views\n--- first ---\n%s\n--- second ---\n%s", first, second) + } + compareRecording(t, root, recorded, first) + } + for _, form := range renderedForms { + out := filepath.Join(t.TempDir(), "rendered"+filepath.Ext(form.extension)) + args := append(append([]string(nil), c.models...), recorded) + args = append(args, form.args[0], c.view, form.args[2], form.args[3], "-o", out) + runCLI(t, binary, root, 0, args...) + compareRecording(t, root, filepath.Join("examples", "qvts", "expected", "views", c.name+form.extension), readFile(t, out)) + } + }) + } +} + +func runCLI(t *testing.T, binary, root string, status int, args ...string) { + t.Helper() + cmd := exec.Command(binary, args...) + cmd.Dir = root + output, err := cmd.CombinedOutput() + got := 0 + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + got = exitErr.ExitCode() + } else if err != nil { + t.Fatalf("run %v: %v\n%s", args, err, output) + } + if got != status { + t.Fatalf("sysml %v: exit = %d, want %d\n%s", args, got, status, output) + } +} + +func readFile(t *testing.T, path string) []byte { + t.Helper() + content, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + return content +} + +func compareRecording(t *testing.T, root, path string, got []byte) { + t.Helper() + path = filepath.Join(root, path) + if *update { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(path, got, 0o644); err != nil { + t.Fatal(err) + } + return + } + want := readFile(t, path) + if !bytes.Equal(got, want) { + t.Errorf("recording differs from %s\n--- got ---\n%s\n--- want ---\n%s", path, got, want) + } +} From 23c39e98aa26624711d3b60207bb538118151490 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:19:27 +0000 Subject: [PATCH 03/14] build(libs): pin the extension libraries at the QVTS engine-contract entries Co-Authored-By: jason.han --- .../OpenSysML Libraries/engine-contract.json | 15 +++++++++++++++ scripts/extension-libraries-pin.sh | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/internal/workspace/libs/stdlib/OpenSysML Libraries/engine-contract.json b/internal/workspace/libs/stdlib/OpenSysML Libraries/engine-contract.json index 6ce25aefa2..5dcafaf70a 100644 --- a/internal/workspace/libs/stdlib/OpenSysML Libraries/engine-contract.json +++ b/internal/workspace/libs/stdlib/OpenSysML Libraries/engine-contract.json @@ -912,6 +912,21 @@ "internal/ir/view/view.go" ] }, + { + "name": "QVTS", + "kind": "package", + "consumers": [ + "internal/doc/queryexec/resultview.go" + ] + }, + { + "name": "QVTS::QueryResult", + "kind": "element", + "consumers": [ + "internal/doc/queryexec/resultview.go", + "internal/ir/view/queryresult.go" + ] + }, { "name": "RandomFunctions", "kind": "package", diff --git a/scripts/extension-libraries-pin.sh b/scripts/extension-libraries-pin.sh index b75e22fa21..6e750af81e 100755 --- a/scripts/extension-libraries-pin.sh +++ b/scripts/extension-libraries-pin.sh @@ -7,5 +7,5 @@ # The ref names where the pin was taken; the commit is what every fetch # verifies, because a ref is mutable. Change them together. EXTENSIONS_REPO="${EXTENSIONS_REPO:-https://github.com/Open-MBEE/OpenSysML-Extensions-Library.git}" -EXTENSIONS_REF="${EXTENSIONS_REF:-main}" -EXTENSIONS_COMMIT="${EXTENSIONS_COMMIT:-93e34bf466a2108124a29886c48c3b4a3edace43}" +EXTENSIONS_REF="${EXTENSIONS_REF:-feat/qvts-library}" +EXTENSIONS_COMMIT="${EXTENSIONS_COMMIT:-c6d05b002c27e5e532cedc97685c54534e85cfa6}" From b60ce3445cea0c0a7fd0c0cb6f5d9f1686280de5 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:19:27 +0000 Subject: [PATCH 04/14] feat(client): carry the QueryResult view in the Go, Python and Java clients Co-Authored-By: jason.han --- .../org/openmbee/opensysml/Capabilities.java | 6 + .../opensysml/DocumentQueryResult.java | 17 ++- .../java/org/openmbee/opensysml/Model.java | 117 +++++++++++++++++- .../opensysml/QueryOutcomeException.java | 25 ++++ .../openmbee/opensysml/QuerySelection.java | 26 ++++ .../org/openmbee/opensysml/RenderedView.java | 24 +++- .../opensysml/internal/ConnectTransport.java | 21 +++- .../openmbee/opensysml/internal/Protos.java | 2 +- .../opensysml/ApiIntegrationTest.java | 58 +++++++++ client/opensysml/client.go | 17 +++ client/opensysml/documents.go | 31 ++++- client/opensysml/errors.go | 18 +++ client/opensysml/inprocess.go | 2 +- client/opensysml/query.go | 56 ++++++--- client/opensysml/remote.go | 2 +- client/opensysml/render_view.go | 31 ++++- client/opensysml/result_view_test.go | 81 ++++++++++++ client/opensysml/types.go | 1 + client/python/opensysml/__init__.py | 6 +- client/python/opensysml/capabilities.py | 5 + client/python/opensysml/connection.py | 40 ++++-- client/python/opensysml/document.py | 19 +++ client/python/opensysml/errors.py | 46 ++++++- client/python/opensysml/model.py | 26 ++-- client/python/opensysml/query.py | 17 ++- client/python/tests/test_document.py | 79 ++++++++++++ docs/clients/python/queries.md | 24 ++++ docs/reference/client-parity.md | 1 + docs/reference/python-api.md | 12 ++ 29 files changed, 765 insertions(+), 45 deletions(-) create mode 100644 client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QuerySelection.java create mode 100644 client/opensysml/result_view_test.go 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 2a909e0bd7..fc56dcd8eb 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 @@ -199,6 +199,12 @@ public final class Capabilities { /** {@code RunDocumentQueryRequest.inline_query}: a query expression run in place of a name. */ public static final String INLINE_DOCUMENT_QUERY = "inline_document_query"; + /** + * {@code as_view} of the two query requests and {@code form} of {@code RenderViewRequest}: an + * answer written as a {@code QVTS::QueryResult} view, and such a view rendered as a document. + */ + public static final String QUERY_RESULT_VIEW = "query_result_view"; + /** The {@code RenderDocument} RPC renders a named document to Markdown. */ public static final String RENDER_DOCUMENT = "render_document"; diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentQueryResult.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentQueryResult.java index cf915feeea..543c501b4e 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentQueryResult.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/DocumentQueryResult.java @@ -1,6 +1,7 @@ package org.openmbee.opensysml; import java.util.List; +import java.util.Objects; /** * A document query's answer: its projected columns and typed rows, both in the deterministic order @@ -9,17 +10,31 @@ * * @param columns the projected property names, in projection order * @param rows the selected rows, in the engine's order + * @param resultView the answer as a {@code QVTS::QueryResult} view, SysML text exposing each + * selected element; empty unless the call asked for it */ -public record DocumentQueryResult(List columns, List rows) { +public record DocumentQueryResult(List columns, List rows, String resultView) { /** * Creates a result, copying its collections. * * @param columns the column names * @param rows the rows + * @param resultView the answer as a view, or empty */ public DocumentQueryResult { columns = List.copyOf(columns); rows = List.copyOf(rows); + Objects.requireNonNull(resultView, "resultView"); + } + + /** + * Creates a result that carries no view. + * + * @param columns the column names + * @param rows the rows + */ + public DocumentQueryResult(List columns, List rows) { + this(columns, rows, ""); } } 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 cc635509ac..8c23098d51 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 @@ -1448,10 +1448,53 @@ public List queryOslc(String oslcQuery) { return selected(QueryRequest.newBuilder().setModelHash(hash).setOslcQuery(oslcQuery)); } + /** + * Selects elements as {@link #query(Query)} does, answering the selection with its {@code + * QVTS::QueryResult} view. A query that ends in a path error throws a {@link + * QueryOutcomeException} whose {@link QueryOutcomeException#resultView()} is the view of it. + * + * @param query the elements considered, the properties reported and the filter applied + * @return the elements selected and the view exposing them + * @throws ServiceException as {@link #query(Query)} throws + * @throws CapabilityException if the service does not advertise {@code query_result_view} + */ + public QuerySelection queryAsView(Query query) { + Objects.requireNonNull(query, "query"); + connection.capabilities().require(Capabilities.QUERY); + if (!query.orderBy().isEmpty()) { + connection.capabilities().require(Capabilities.QUERY_ORDER_BY); + } + connection.capabilities().require(Capabilities.QUERY_RESULT_VIEW); + return selection( + QueryRequest.newBuilder().setModelHash(hash).setQuery(Protos.proto(query)).setAsView(true)); + } + + /** + * Selects elements as {@link #queryOslc(String)} does, answering as {@link #queryAsView(Query)} + * does; a property the metamodel does not define is a path error, thrown with its view. + * + * @param oslcQuery the query, as OSLC Query Syntax spells it + * @return the elements selected and the view exposing them + * @throws ServiceException as {@link #queryOslc(String)} throws + * @throws CapabilityException if the service does not advertise {@code query_result_view} + */ + public QuerySelection queryOslcAsView(String oslcQuery) { + Objects.requireNonNull(oslcQuery, "oslcQuery"); + connection.capabilities().require(Capabilities.OSLC_QUERY); + connection.capabilities().require(Capabilities.QUERY_RESULT_VIEW); + return selection( + QueryRequest.newBuilder().setModelHash(hash).setOslcQuery(oslcQuery).setAsView(true)); + } + private List selected(QueryRequest.Builder request) { + return selection(request).elements(); + } + + private QuerySelection selection(QueryRequest.Builder request) { QueryResponse response = connection.call("Query", request.build(), QueryResponse.getDefaultInstance()); - return Protos.queryElements(response.getElementsList()); + return new QuerySelection( + Protos.queryElements(response.getElementsList()), response.getResultView()); } /** @@ -1944,6 +1987,50 @@ public DocumentQueryResult runInlineDocumentQuery( bindings); } + /** + * Runs a document query as {@link #runDocumentQuery(String, Map)} does, the result also carrying + * the answer as a {@code QVTS::QueryResult} view. A query that ends in a path or model error + * throws a {@link QueryOutcomeException} whose {@link QueryOutcomeException#resultView()} is the + * view of that outcome. + * + * @param queryId qualified name of the document query + * @param bindings the entry parameters' values, by parameter name + * @return the projected columns and rows, and the view exposing the selected elements + * @throws ServiceException as {@link #runDocumentQuery(String, Map)} throws + * @throws CapabilityException if the service does not advertise {@code query_result_view} + */ + public DocumentQueryResult runDocumentQueryAsView( + String queryId, Map> bindings) { + Objects.requireNonNull(queryId, "queryId"); + connection.capabilities().require(Capabilities.QUERY_RESULT_VIEW); + return runDocumentQuery( + RunDocumentQueryRequest.newBuilder().setModelHash(hash).setQueryId(queryId).setAsView(true), + bindings); + } + + /** + * Runs a query expression as {@link #runInlineDocumentQuery(String, Map)} does, with the view as + * {@link #runDocumentQueryAsView(String, Map)} carries it. + * + * @param expression the query expression + * @param bindings the entry parameters' values, by parameter name + * @return the projected columns and rows, and the view exposing the selected elements + * @throws ServiceException as {@link #runInlineDocumentQuery(String, Map)} throws + * @throws CapabilityException if the service does not advertise {@code query_result_view} + */ + public DocumentQueryResult runInlineDocumentQueryAsView( + String expression, Map> bindings) { + Objects.requireNonNull(expression, "expression"); + connection.capabilities().require(Capabilities.INLINE_DOCUMENT_QUERY); + connection.capabilities().require(Capabilities.QUERY_RESULT_VIEW); + return runDocumentQuery( + RunDocumentQueryRequest.newBuilder() + .setModelHash(hash) + .setInlineQuery(expression) + .setAsView(true), + bindings); + } + private DocumentQueryResult runDocumentQuery( RunDocumentQueryRequest.Builder request, Map> bindings) { Objects.requireNonNull(bindings, "bindings"); @@ -2076,6 +2163,33 @@ public RenderedView renderView( */ public RenderedView renderView( String viewName, RenderViewPorts ports, List show, int depth, String compartments) { + return renderView(viewName, ports, show, depth, compartments, ""); + } + + /** + * Renders a {@code QVTS::QueryResult} view as a document too: its {@link RenderedView#header()} + * is the view's query, source, outcome and provenance, its rows the exposed elements, and its + * {@link RenderedView#document()} the same in {@code form}. + * + * @param viewName qualified name of the view + * @param form the document form + * @return the rendering, with the document + * @throws ServiceException if the view is not a {@code QVTS::QueryResult} view + * @throws CapabilityException if the service does not advertise {@code query_result_view} + */ + public RenderedView renderView(String viewName, DocumentForm form) { + Objects.requireNonNull(form, "form"); + connection.capabilities().require(Capabilities.QUERY_RESULT_VIEW); + return renderView(viewName, RenderViewPorts.MINIMAL, List.of(), 0, "", form.wireName()); + } + + private RenderedView renderView( + String viewName, + RenderViewPorts ports, + List show, + int depth, + String compartments, + String form) { Objects.requireNonNull(viewName, "viewName"); Objects.requireNonNull(compartments, "compartments"); Objects.requireNonNull(ports, "ports"); @@ -2094,6 +2208,7 @@ public RenderedView renderView( .addAllShow(show) .setDepth(depth) .setCompartments(compartments) + .setForm(form) .build(), RenderViewResponse.getDefaultInstance()); return RenderedView.from(response); diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QueryOutcomeException.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QueryOutcomeException.java index 3e9ad99876..81d6af3c34 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QueryOutcomeException.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QueryOutcomeException.java @@ -13,6 +13,7 @@ public class QueryOutcomeException extends ServiceException { private static final long serialVersionUID = 1L; private final QueryOutcome outcome; + private final String resultView; /** * Creates the exception. @@ -22,8 +23,32 @@ public class QueryOutcomeException extends ServiceException { * @param outcome the decoded outcome */ public QueryOutcomeException(StatusCode status, String message, QueryOutcome outcome) { + this(status, message, outcome, ""); + } + + /** + * Creates the failure of a query that was asked for its view. + * + * @param status the status the service refused with + * @param message the service's wording + * @param outcome the outcome + * @param resultView the outcome as a {@code QVTS::QueryResult} view, or empty + */ + public QueryOutcomeException( + StatusCode status, String message, QueryOutcome outcome, String resultView) { super(status, message); this.outcome = Objects.requireNonNull(outcome, "outcome"); + this.resultView = Objects.requireNonNull(resultView, "resultView"); + } + + /** + * The failed query as a {@code QVTS::QueryResult} view: it exposes the frontier and finding + * elements and states the outcome. Empty unless the call asked for the view. + * + * @return the view text, or empty + */ + public String resultView() { + return resultView; } /** diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QuerySelection.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QuerySelection.java new file mode 100644 index 0000000000..32bf50093e --- /dev/null +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/QuerySelection.java @@ -0,0 +1,26 @@ +package org.openmbee.opensysml; + +import java.util.List; +import java.util.Objects; + +/** + * A query's selection with the {@code QVTS::QueryResult} view of it, as {@link + * Model#queryAsView(Query)} and {@link Model#queryOslcAsView(String)} answer. + * + * @param elements the elements selected, as {@link Model#query(Query)} answers them + * @param resultView the selection as SysML text: one view exposing each element and stating the + * query, its source, the outcome and the provenance + */ +public record QuerySelection(List elements, String resultView) { + + /** + * Creates a selection, copying its elements. + * + * @param elements the elements selected + * @param resultView the view text + */ + public QuerySelection { + elements = List.copyOf(elements); + Objects.requireNonNull(resultView, "resultView"); + } +} diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/RenderedView.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/RenderedView.java index 938d2bfb78..5f1b653def 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/RenderedView.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/RenderedView.java @@ -17,7 +17,9 @@ public record RenderedView( Optional canvas, List notes, List notices, - List shown) { + List shown, + List header, + String document) { public RenderedView { Objects.requireNonNull(view, "view"); @@ -31,6 +33,20 @@ public record RenderedView( notes = List.copyOf(notes); notices = List.copyOf(notices); shown = List.copyOf(shown); + header = List.copyOf(header); + Objects.requireNonNull(document, "document"); + } + + /** + * One attribute a {@code QVTS::QueryResult} view binds: its query, source, outcome or + * provenance. {@link RenderedView#header()} holds the four in that order, and is empty for any + * other view; {@link RenderedView#document()} is the view in the document form asked for. + */ + public record HeaderField(String name, String value) { + public HeaderField { + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(value, "value"); + } } /** @@ -235,7 +251,11 @@ public static RenderedView from(RenderViewResponse response) { note.hasOrigin() ? Optional.of(span(note.getOrigin())) : Optional.empty())) .toList(), response.getNoticesList(), - response.getShownList()); + response.getShownList(), + response.getHeaderList().stream() + .map(field -> new HeaderField(field.getName(), field.getValue())) + .toList(), + response.getMarkdown() + response.getHtml() + response.getAsciidoc()); } private static Span span(org.openmbee.opensysml.proto.Span span) { diff --git a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/ConnectTransport.java b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/ConnectTransport.java index 9e7dc8e3d9..d4527bf463 100644 --- a/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/ConnectTransport.java +++ b/client/java/opensysml-client/src/main/java/org/openmbee/opensysml/internal/ConnectTransport.java @@ -153,6 +153,7 @@ private ServiceException refusal(String method, HttpResponse response) { StatusCode status = StatusCode.fromHttpStatus(response.statusCode()); String message = text; Optional outcome = Optional.empty(); + String resultView = ""; try { Object error = Json.parse(text); String code = Json.stringMember(error, "code"); @@ -164,11 +165,12 @@ private ServiceException refusal(String method, HttpResponse response) { message = reported; } outcome = queryOutcome(Json.listMember(error, "details")); + resultView = queryResultView(Json.listMember(error, "details")); } catch (IllegalArgumentException e) { // Not a Connect error body; the HTTP status and the text are the whole answer. } if (outcome.isPresent()) { - return new QueryOutcomeException(status, method + ": " + message, outcome.get()); + return new QueryOutcomeException(status, method + ": " + message, outcome.get(), resultView); } return serviceException(status, method + ": " + message); } @@ -198,6 +200,23 @@ private static Optional queryOutcome(List details) { return Optional.empty(); } + /** The text of the {@code QueryResultView} among a Connect error's details, or empty. */ + private static String queryResultView(List details) { + String type = org.openmbee.opensysml.proto.QueryResultView.getDescriptor().getFullName(); + for (Object detail : details) { + if (!type.equals(Json.stringMember(detail, "type"))) { + continue; + } + try { + byte[] bytes = Base64.getDecoder().decode(padded(Json.stringMember(detail, "value"))); + return org.openmbee.opensysml.proto.QueryResultView.parseFrom(bytes).getText(); + } catch (IllegalArgumentException | InvalidProtocolBufferException e) { + // Not a view; a later detail may be one. + } + } + return ""; + } + private static String padded(String base64) { int remainder = base64.length() % 4; return remainder == 0 ? base64 : base64 + "====".substring(remainder); 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 95ea2d27dc..021d93d1ea 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 @@ -2530,7 +2530,7 @@ public static DocumentQueryResult documentQueryResult(RunDocumentQueryResponse r } rows.add(documentRow(row.getElement(), cells)); } - return new DocumentQueryResult(columns, rows); + return new DocumentQueryResult(columns, rows, response.getResultView()); } private static DocumentRow documentRow( 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 7de80319e2..aee713b42c 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 @@ -1504,6 +1504,64 @@ void runInlineDocumentQueryAnswersTypedRows() { assertTrue(failed.getMessage().contains("inline query 1:"), failed.getMessage()); } + private static Path resultViewFixture() { + return Path.of(System.getProperty("user.dir")) + .resolve("../../../tests/grpc/testdata/conformance/query_result_view.sysml") + .normalize(); + } + + @Test + void queriesAnswerAsResultViews() { + Model model = connection.load(resultViewFixture()); + DocumentQueryResult named = + model.runDocumentQueryAsView( + "Probe::Self", + Map.of("root", List.of(new DocumentValue.ElementRef("Probe::probe::antenna", "")))); + assertTrue(named.resultView().contains("view self : QueryResult"), named.resultView()); + assertTrue(named.resultView().contains("expose Probe::probe::antenna;"), named.resultView()); + assertEquals("", model.runDocumentQuery("Probe::NoStates").resultView()); + + QuerySelection selected = model.queryOslcAsView("oslc.where=sysml:name=\"camera\""); + assertEquals(1, selected.elements().size()); + assertTrue(selected.resultView().contains("expose Probe::probe::camera;"), selected.resultView()); + + QueryOutcomeException unknown = + assertThrows( + QueryOutcomeException.class, + () -> model.queryOslcAsView("oslc.where=sysml:nme=\"camera\"")); + assertTrue(unknown.resultView().contains("Outcome::pathError"), unknown.resultView()); + QueryOutcomeException twin = + assertThrows( + QueryOutcomeException.class, + () -> model.runDocumentQueryAsView("Probe::Twin", Map.of())); + assertTrue(twin.resultView().contains("Outcome::modelError"), twin.resultView()); + QueryOutcomeException unasked = + assertThrows(QueryOutcomeException.class, () -> model.runDocumentQuery("Probe::Twin")); + assertEquals("", unasked.resultView()); + } + + @Test + void renderViewRendersAResultViewAsADocument() { + Model model = connection.load(resultViewFixture()); + RenderedView rendered = model.renderView("Probe::heavy", DocumentForm.MARKDOWN); + assertEquals( + List.of( + new RenderedView.HeaderField("query", "Probe::Self root=Probe::probe::antenna"), + new RenderedView.HeaderField("source", "probe.sysml"), + new RenderedView.HeaderField("outcome", "established"), + new RenderedView.HeaderField("provenance", "urn:prov:bundle:heavy")), + rendered.header()); + assertEquals("Probe::probe::antenna", rendered.rows().get(0).cells().get(0)); + assertTrue( + rendered.document().contains("| Probe::probe::antenna | part | Payload | Probe::probe |"), + rendered.document()); + assertEquals("", model.renderView("Probe::heavy").document()); + ServiceException refused = + assertThrows( + ServiceException.class, () -> model.renderView("Probe::plain", DocumentForm.HTML)); + assertTrue(refused.getMessage().contains("is not a QVTS::QueryResult view")); + } + @Test void renderDocumentRendersTheNamedDocument() { Model model = connection.load(fixture("document.sysml")); diff --git a/client/opensysml/client.go b/client/opensysml/client.go index cb06a9ee52..b7a3488b8d 100644 --- a/client/opensysml/client.go +++ b/client/opensysml/client.go @@ -173,6 +173,14 @@ type Client interface { // the oslc_query capability. QueryOSLC(ctx context.Context, model *Model, oslc string) ([]QueryElement, error) + // QueryAsView is Query answering the selection with its QVTS::QueryResult + // view; a path error carries its view in the StatusError. Requires + // query_result_view. + QueryAsView(ctx context.Context, model *Model, query Query) (*QueryAnswer, error) + + // QueryOSLCAsView is QueryOSLC answering as QueryAsView does. + QueryOSLCAsView(ctx context.Context, model *Model, oslc string) (*QueryAnswer, error) + // ElementProperties reads the metamodel properties of one element by their // specification names ("inheritedFeature", "connectorEnd", ...), as the // model's API element form spells them; every property the element carries @@ -190,6 +198,15 @@ type Client interface { // query, as RunDocumentQuery runs one. Requires inline_document_query. RunInlineDocumentQuery(ctx context.Context, model *Model, expression string, bindings ...Binding) (*Rows, error) + // RunDocumentQueryAsView is RunDocumentQuery whose Rows also carry the answer + // as a QVTS::QueryResult view; a path or model error carries its view in the + // StatusError. Requires query_result_view. + RunDocumentQueryAsView(ctx context.Context, model *Model, queryID string, bindings ...Binding) (*Rows, error) + + // RunInlineDocumentQueryAsView is RunInlineDocumentQuery with the view, as + // RunDocumentQueryAsView carries it. + RunInlineDocumentQueryAsView(ctx context.Context, model *Model, expression string, bindings ...Binding) (*Rows, error) + // RenderDocument renders the named document to Markdown. Requires the // render_document capability. RenderDocument(ctx context.Context, model *Model, documentID string) (string, error) diff --git a/client/opensysml/documents.go b/client/opensysml/documents.go index ca7a49fa15..d5d4af6e5e 100644 --- a/client/opensysml/documents.go +++ b/client/opensysml/documents.go @@ -207,6 +207,9 @@ type Rows struct { Columns []string // Rows are the selected elements and their cells. Rows []Row + // ResultView is the answer as a QVTS::QueryResult view, SysML text exposing + // the selected elements; empty unless the call asked for it. + ResultView string } // Row is one selected element and its projected cells, one per column. @@ -284,6 +287,30 @@ func (c *client) RunInlineDocumentQuery( return c.runDocumentQuery(ctx, model, &pb.RunDocumentQueryRequest{InlineQuery: expression}, bindings) } +func (c *client) RunDocumentQueryAsView( + ctx context.Context, + model *Model, + queryID string, + bindings ...Binding, +) (*Rows, error) { + if err := c.requireCapabilities(ctx, CapabilityQueryResultView); err != nil { + return nil, err + } + return c.runDocumentQuery(ctx, model, &pb.RunDocumentQueryRequest{QueryId: queryID, AsView: true}, bindings) +} + +func (c *client) RunInlineDocumentQueryAsView( + ctx context.Context, + model *Model, + expression string, + bindings ...Binding, +) (*Rows, error) { + if err := c.requireCapabilities(ctx, CapabilityInlineDocumentQuery, CapabilityQueryResultView); err != nil { + return nil, err + } + return c.runDocumentQuery(ctx, model, &pb.RunDocumentQueryRequest{InlineQuery: expression, AsView: true}, bindings) +} + // runDocumentQuery sends req, naming or spelling the query, with bindings bound. func (c *client) runDocumentQuery(ctx context.Context, model *Model, req *pb.RunDocumentQueryRequest, bindings []Binding) (*Rows, error) { hash, err := c.call(model) @@ -316,7 +343,9 @@ func (c *client) runDocumentQuery(ctx context.Context, model *Model, req *pb.Run if err != nil { return nil, err } - rows := &Rows{Columns: make([]string, 0, len(resp.Columns)), Rows: make([]Row, 0, len(resp.Rows))} + rows := &Rows{ + Columns: make([]string, 0, len(resp.Columns)), Rows: make([]Row, 0, len(resp.Rows)), ResultView: resp.ResultView, + } for _, column := range resp.Columns { rows.Columns = append(rows.Columns, column.Name) } diff --git a/client/opensysml/errors.go b/client/opensysml/errors.go index 10c86c1909..de9c71172d 100644 --- a/client/opensysml/errors.go +++ b/client/opensysml/errors.go @@ -4,6 +4,9 @@ import ( "errors" "fmt" "strings" + + "connectrpc.com/connect" + pb "github.com/Open-MBEE/OpenSysML/api/proto" ) // Code is a canonical gRPC status code, the spelling in which the service @@ -76,6 +79,21 @@ type StatusError struct { Code Code // Message is the service's own wording. Message string + // ResultView is a failed query as a QVTS::QueryResult view, its outcome the + // path or model error; empty unless the call asked for the view. + ResultView string +} + +// resultViewOf reads the QueryResultView detail a refused query carries. +func resultViewOf(refused *connect.Error) string { + for _, detail := range refused.Details() { + if message, err := detail.Value(); err == nil { + if view, ok := message.(*pb.QueryResultView); ok { + return view.GetText() + } + } + } + return "" } // Error renders the refusal with its canonical code name. Code.String is diff --git a/client/opensysml/inprocess.go b/client/opensysml/inprocess.go index 7fb39d6604..9e139da77b 100644 --- a/client/opensysml/inprocess.go +++ b/client/opensysml/inprocess.go @@ -293,7 +293,7 @@ func statusToError(err error) error { } var ce *connect.Error if errors.As(err, &ce) { - return &StatusError{Code: Code(ce.Code()), Message: ce.Message()} + return &StatusError{Code: Code(ce.Code()), Message: ce.Message(), ResultView: resultViewOf(ce)} } return &StatusError{Code: CodeUnknown, Message: err.Error()} } diff --git a/client/opensysml/query.go b/client/opensysml/query.go index 00cb969e28..a90158a073 100644 --- a/client/opensysml/query.go +++ b/client/opensysml/query.go @@ -138,31 +138,59 @@ type QueryElement struct { Properties map[string]string } +// QueryAnswer is a selection with the QVTS::QueryResult view of it. +type QueryAnswer struct { + // Elements are the selected elements, as Query answers them. + Elements []QueryElement + // ResultView is the selection as SysML text: one view exposing each element. + ResultView string +} + func (c *client) Query(ctx context.Context, model *Model, query Query) ([]QueryElement, error) { - hash, err := c.call(model) + answer, err := c.selectElements(ctx, model, &pb.QueryRequest{Query: queryToProto(query)}) if err != nil { return nil, err } - return c.selectElements(ctx, &pb.QueryRequest{ - ModelHash: hash, - Query: &pb.Query{ - Scope: append([]string(nil), query.Scope...), - Select: append([]string(nil), query.Select...), - Where: conditionToProto(query.Where), - OrderBy: append([]string(nil), query.OrderBy...), - }, - }) + return answer.Elements, nil } func (c *client) QueryOSLC(ctx context.Context, model *Model, oslc string) ([]QueryElement, error) { - hash, err := c.call(model) + answer, err := c.selectElements(ctx, model, &pb.QueryRequest{OslcQuery: oslc}) if err != nil { return nil, err } - return c.selectElements(ctx, &pb.QueryRequest{ModelHash: hash, OslcQuery: oslc}) + return answer.Elements, nil +} + +func (c *client) QueryAsView(ctx context.Context, model *Model, query Query) (*QueryAnswer, error) { + if err := c.requireCapabilities(ctx, CapabilityQueryResultView); err != nil { + return nil, err + } + return c.selectElements(ctx, model, &pb.QueryRequest{Query: queryToProto(query), AsView: true}) } -func (c *client) selectElements(ctx context.Context, req *pb.QueryRequest) ([]QueryElement, error) { +func (c *client) QueryOSLCAsView(ctx context.Context, model *Model, oslc string) (*QueryAnswer, error) { + if err := c.requireCapabilities(ctx, CapabilityQueryResultView); err != nil { + return nil, err + } + return c.selectElements(ctx, model, &pb.QueryRequest{OslcQuery: oslc, AsView: true}) +} + +func queryToProto(query Query) *pb.Query { + return &pb.Query{ + Scope: append([]string(nil), query.Scope...), + Select: append([]string(nil), query.Select...), + Where: conditionToProto(query.Where), + OrderBy: append([]string(nil), query.OrderBy...), + } +} + +func (c *client) selectElements(ctx context.Context, model *Model, req *pb.QueryRequest) (*QueryAnswer, error) { + hash, err := c.call(model) + if err != nil { + return nil, err + } + req.ModelHash = hash resp, err := c.caller.query(ctx, req) if err != nil { return nil, err @@ -178,7 +206,7 @@ func (c *client) selectElements(ctx context.Context, req *pb.QueryRequest) ([]Qu } elements = append(elements, converted) } - return elements, nil + return &QueryAnswer{Elements: elements, ResultView: resp.ResultView}, nil } func conditionToProto(condition *Condition) *pb.Constraint { diff --git a/client/opensysml/remote.go b/client/opensysml/remote.go index f338d87c2c..4a79a1efa9 100644 --- a/client/opensysml/remote.go +++ b/client/opensysml/remote.go @@ -376,7 +376,7 @@ func (r *remote) close() error { func connectToError(err error) error { var connectErr *connect.Error if errors.As(err, &connectErr) { - return &StatusError{Code: Code(connectErr.Code()), Message: connectErr.Message()} + return &StatusError{Code: Code(connectErr.Code()), Message: connectErr.Message(), ResultView: resultViewOf(connectErr)} } return &StatusError{Code: CodeUnavailable, Message: err.Error()} } diff --git a/client/opensysml/render_view.go b/client/opensysml/render_view.go index 78c5d4eadd..5c9cc61ea6 100644 --- a/client/opensysml/render_view.go +++ b/client/opensysml/render_view.go @@ -16,6 +16,14 @@ type renderViewOptions struct { show []string depth int compartments string + form string +} + +// WithDocumentForm asks for a QVTS::QueryResult view as a document too, in +// "markdown", "html" or "asciidoc": RenderedView.Document. Another view, or +// another form, is refused as an invalid request. Requires query_result_view. +func WithDocumentForm(form string) RenderViewOption { + return func(options *renderViewOptions) { options.form = form } } // WithCompartments folds a tree rendering's owned members into compartment @@ -68,6 +76,17 @@ type RenderedView struct { Shown []string // Frame is the view frame round a graph-shaped rendering; nil when frameless. Frame *RenderFrame + // Header is a QVTS::QueryResult view's query, source, outcome and provenance, + // in that order; empty for any other view. + Header []RenderHeaderField + // Document is the view as the document WithDocumentForm asked for. + Document string +} + +// RenderHeaderField is one attribute a QVTS::QueryResult view binds. +type RenderHeaderField struct { + Name string + Value string } // RenderFrame is the view frame of SysML v2 §8.2.3.26: the name compartment's @@ -197,6 +216,11 @@ func (c *client) RenderView(ctx context.Context, model *Model, viewName string, for _, opt := range opts { opt(&options) } + if options.form != "" { + if err := c.requireCapabilities(ctx, CapabilityQueryResultView); err != nil { + return nil, err + } + } if options.depth < 0 || options.depth > math.MaxInt32 { return nil, &StatusError{Code: CodeInvalidArgument, Message: fmt.Sprintf("depth must be between 0 and %d, got %d", math.MaxInt32, options.depth)} } @@ -207,6 +231,7 @@ func (c *client) RenderView(ctx context.Context, model *Model, viewName string, Show: append([]string(nil), options.show...), Depth: int32(options.depth), Compartments: options.compartments, + Form: options.form, }) if err != nil { return nil, err @@ -218,7 +243,11 @@ func renderedViewFromProto(response *pb.RenderViewResponse) *RenderedView { result := &RenderedView{ View: response.View, Kind: response.Kind, Stated: response.Stated, Columns: append([]string(nil), response.Columns...), Notices: append([]string(nil), response.Notices...), - Shown: append([]string(nil), response.Shown...), + Shown: append([]string(nil), response.Shown...), + Document: response.Markdown + response.Html + response.Asciidoc, + } + for _, field := range response.Header { + result.Header = append(result.Header, RenderHeaderField{Name: field.Name, Value: field.Value}) } for _, node := range response.Nodes { converted := RenderNode{ diff --git a/client/opensysml/result_view_test.go b/client/opensysml/result_view_test.go new file mode 100644 index 0000000000..680a9ffb51 --- /dev/null +++ b/client/opensysml/result_view_test.go @@ -0,0 +1,81 @@ +package opensysml_test + +import ( + "context" + "errors" + "strings" + "testing" + + "github.com/Open-MBEE/OpenSysML/client/opensysml" +) + +const resultViewSource = documentSource + ` +package Answers { + private import QVTS::*; + + view mount : QueryResult { + expose Observatory::telescope::mount; + attribute :>> query = "Observatory::Subsystems"; + attribute :>> source = "observatory.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "urn:prov:bundle:mount"; + } +} +` + +func TestQueriesAnswerAsResultViews(t *testing.T) { + client := newClient(t) + model := parse(t, client, resultViewSource) + ctx := context.Background() + + rows, err := client.RunInlineDocumentQueryAsView(ctx, model, `Project(Named("Observatory::telescope::mount"), ("name"))`) + if err != nil { + t.Fatalf("RunInlineDocumentQueryAsView: %v", err) + } + for _, want := range []string{"view answer : QueryResult", "expose Observatory::telescope::mount;", "Outcome::established"} { + if !strings.Contains(rows.ResultView, want) { + t.Errorf("result view has no %q:\n%s", want, rows.ResultView) + } + } + plain, err := client.RunInlineDocumentQuery(ctx, model, `Project(Named("Observatory::telescope::mount"), ("name"))`) + if err != nil || plain.ResultView != "" { + t.Errorf("unasked view = %q, err %v; want none", plain.ResultView, err) + } + + answer, err := client.QueryOSLCAsView(ctx, model, `oslc.where=sysml:name="optics"`) + if err != nil { + t.Fatalf("QueryOSLCAsView: %v", err) + } + if len(answer.Elements) != 1 || !strings.Contains(answer.ResultView, "expose Observatory::telescope::optics;") { + t.Errorf("elements = %v, view:\n%s", answer.Elements, answer.ResultView) + } + + // A path error is an outcome: its view rides the refusal. + _, err = client.QueryOSLCAsView(ctx, model, `oslc.where=sysml:nme="optics"`) + var refused *opensysml.StatusError + if !errors.As(err, &refused) || !strings.Contains(refused.ResultView, "Outcome::pathError") { + t.Errorf("err = %v, want a refusal carrying a pathError view", err) + } + _, err = client.RunInlineDocumentQueryAsView(ctx, model, `Project(Named("Observatory::telescope::mnt"), ("name"))`) + if !errors.As(err, &refused) || !strings.Contains(refused.ResultView, "expose Observatory::telescope;") { + t.Errorf("err = %v, want a refusal whose view exposes the frontier", err) + } +} + +func TestRenderViewRendersAResultViewAsADocument(t *testing.T) { + client := newClient(t) + model := parse(t, client, resultViewSource) + rendered, err := client.RenderView(context.Background(), model, "Answers::mount", opensysml.WithDocumentForm("markdown")) + if err != nil { + t.Fatalf("RenderView: %v", err) + } + if len(rendered.Header) != 4 || rendered.Header[2] != (opensysml.RenderHeaderField{Name: "outcome", Value: "established"}) { + t.Errorf("header = %v, want query, source, outcome, provenance", rendered.Header) + } + if len(rendered.Rows) != 1 || rendered.Rows[0].Cells[0] != "Observatory::telescope::mount" { + t.Errorf("rows = %v, want the exposed mount", rendered.Rows) + } + if !strings.Contains(rendered.Document, "| Observatory::telescope::mount |") { + t.Errorf("document has no row for the mount:\n%s", rendered.Document) + } +} diff --git a/client/opensysml/types.go b/client/opensysml/types.go index 66012965f9..13cb88b8c4 100644 --- a/client/opensysml/types.go +++ b/client/opensysml/types.go @@ -21,6 +21,7 @@ const ( CapabilityOSLCQuery = sysmlgrpc.CapabilityOSLCQuery CapabilityDocumentQuery = sysmlgrpc.CapabilityDocumentQuery CapabilityInlineDocumentQuery = sysmlgrpc.CapabilityInlineDocumentQuery + CapabilityQueryResultView = sysmlgrpc.CapabilityQueryResultView CapabilityRenderDocument = sysmlgrpc.CapabilityRenderDocument CapabilityRenderView = sysmlgrpc.CapabilityRenderView CapabilityExportGraphs = sysmlgrpc.CapabilityExportGraphs diff --git a/client/python/opensysml/__init__.py b/client/python/opensysml/__init__.py index 12350fb12d..0d158d8d8f 100644 --- a/client/python/opensysml/__init__.py +++ b/client/python/opensysml/__init__.py @@ -34,6 +34,7 @@ from opensysml.capabilities import ( CAPABILITY_ELEMENT_PROPERTIES, CAPABILITY_INLINE_DOCUMENT_QUERY, + CAPABILITY_QUERY_RESULT_VIEW, CAPABILITY_RECORD_RUN, CAPABILITY_RUNS, CAPABILITY_SELF_CHECK, @@ -79,14 +80,14 @@ SelfCheckFinding, SelfCheckResult, ) -from opensysml.query import QueryElement, QueryError +from opensysml.query import QueryElement, QueryElements, QueryError from opensysml.element_properties import ElementIdentity, ElementProperties, ElementProperty from opensysml.sources import SourceDocument from opensysml.document import ( DocumentEvent, DocumentQueryError, DocumentQueryResult, DocumentRow, DocumentState, DocumentVerdict, ElementRef, Graphs, INFINITY, ObjectRef, RenderCanvas, RenderEdge, RenderFrame, RenderGeometry, RenderNode, RenderNote, RenderPoint, RenderPort, RenderRow, - RenderSpan, RenderStyle, RenderedView, + RenderHeaderField, RenderSpan, RenderStyle, RenderedView, ) from opensysml.conversion import ( FORMAT_API_JSON, FORMAT_SYSML, FORMAT_TURTLE, ID_FORM_QUALIFIED, ID_FORM_UUID, Conversion, @@ -152,6 +153,7 @@ "Bound", "EngineInfo", "Standing", "QueryElement", "QueryError", "ElementIdentity", "ElementProperties", "ElementProperty", "CAPABILITY_ELEMENT_PROPERTIES", "CAPABILITY_INLINE_DOCUMENT_QUERY", + "CAPABILITY_QUERY_RESULT_VIEW", "QueryElements", "RenderHeaderField", "SourceDocument", "DocumentEvent", "DocumentQueryError", "DocumentQueryResult", "DocumentRow", "DocumentState", "DocumentVerdict", "ElementRef", "INFINITY", "ObjectRef", diff --git a/client/python/opensysml/capabilities.py b/client/python/opensysml/capabilities.py index fbbcde5b31..6178655463 100644 --- a/client/python/opensysml/capabilities.py +++ b/client/python/opensysml/capabilities.py @@ -73,6 +73,11 @@ #: the field with ``UNIMPLEMENTED``. CAPABILITY_INLINE_DOCUMENT_QUERY = "inline_document_query" +#: ``as_view`` of the two query requests and ``form`` of ``RenderViewRequest``: +#: a query's answer written as a ``QVTS::QueryResult`` view, and such a view +#: rendered as a document. Without it the service ignores the fields. +CAPABILITY_QUERY_RESULT_VIEW = "query_result_view" + #: The ``RenderDocument`` RPC, which renders a named document to Markdown. #: Without it the service refuses with ``UNIMPLEMENTED``. CAPABILITY_RENDER_DOCUMENT = "render_document" diff --git a/client/python/opensysml/connection.py b/client/python/opensysml/connection.py index 34fe347eea..3d89b7edce 100644 --- a/client/python/opensysml/connection.py +++ b/client/python/opensysml/connection.py @@ -18,6 +18,7 @@ from opensysml.capabilities import ( CAPABILITY_ELEMENT_PROPERTIES, CAPABILITY_INLINE_DOCUMENT_QUERY, + CAPABILITY_QUERY_RESULT_VIEW, CAPABILITY_CONVERT_CHECK_DIAGNOSTICS, CAPABILITY_CONVERT_COMPACT, CAPABILITY_CONVERT_LIBRARY_STUBS, @@ -1933,7 +1934,7 @@ def apply_edits(self, model_hash, operations): return result_of(response) def query(self, model_hash, payload=None, scope=None, select=None, where=None, - order_by=None, oslc=None): + order_by=None, oslc=None, as_view=False): """Run a SysML v2 API & Services Query over a loaded model. The query is the standard's JSON object, so a cookbook payload works @@ -1954,9 +1955,13 @@ def query(self, model_hash, payload=None, scope=None, select=None, where=None, place of the standard's Query; not combined with the others. An empty string is no OSLC at all, so the structured query (empty, answering every element) is sent instead + as_view (bool): Also answer the selection as a ``QVTS::QueryResult`` + view, the answer's ``result_view``; a query that ends in a + path error then raises with the view as the error's + ``result_view``. Needs the ``query_result_view`` capability Returns: - list[QueryElement]: The elements selected, in ``order_by`` order, + QueryElements: The elements selected, a list in ``order_by`` order, or declaration order without one Raises: @@ -1975,9 +1980,11 @@ def query(self, model_hash, payload=None, scope=None, select=None, where=None, "Provide either oslc or the standard's Query (payload or keywords), not both" ) needed = (CAPABILITY_QUERY, CAPABILITY_OSLC_QUERY) + if as_view: + needed += (CAPABILITY_QUERY_RESULT_VIEW,) for capability in needed: require(self.server_info(), capability, upgrade_remedy(capability)) - request = sysml_pb2.QueryRequest(model_hash=model_hash, oslc_query=oslc) + request = sysml_pb2.QueryRequest(model_hash=model_hash, oslc_query=oslc, as_view=as_view) with translate_rpc_errors( unimplemented=self._capability_refusal(needed) ): @@ -1987,9 +1994,11 @@ def query(self, model_hash, payload=None, scope=None, select=None, where=None, order_by=order_by) needed = (CAPABILITY_QUERY, CAPABILITY_QUERY_ORDER_BY) if query.order_by \ else (CAPABILITY_QUERY,) + if as_view: + needed += (CAPABILITY_QUERY_RESULT_VIEW,) for capability in needed: require(self.server_info(), capability, upgrade_remedy(capability)) - request = sysml_pb2.QueryRequest(model_hash=model_hash, query=query) + request = sysml_pb2.QueryRequest(model_hash=model_hash, query=query, as_view=as_view) with translate_rpc_errors( unimplemented=self._capability_refusal(needed) ): @@ -2039,7 +2048,8 @@ def get_element_properties(self, model_hash, element, properties=()): raise ConversionError(response.error) return element_properties_of(response) - def run_document_query(self, model_hash, query_id=None, bindings=None, inline_query=None): + def run_document_query(self, model_hash, query_id=None, bindings=None, inline_query=None, + as_view=False): """Run a document query, named or written in place, and answer its typed rows. The query is the model's own — a calc def specializing @@ -2060,6 +2070,10 @@ def run_document_query(self, model_hash, query_id=None, bindings=None, inline_qu "PartUsage"), ("name", "mass"))`` — with the ``DocumentQueries`` library in scope and the model's own names reachable; needs the ``inline_document_query`` capability + as_view (bool): Also answer as a ``QVTS::QueryResult`` view, the + result's ``result_view``; a query that ends in a path or model + error then raises with the view as the error's + ``result_view``. Needs the ``query_result_view`` capability Returns: DocumentQueryResult: Projected columns and typed rows, in the @@ -2090,11 +2104,18 @@ def run_document_query(self, model_hash, query_id=None, bindings=None, inline_qu CAPABILITY_INLINE_DOCUMENT_QUERY, upgrade_remedy(CAPABILITY_INLINE_DOCUMENT_QUERY), ) + if as_view: + require( + self.server_info(), + CAPABILITY_QUERY_RESULT_VIEW, + upgrade_remedy(CAPABILITY_QUERY_RESULT_VIEW), + ) request = sysml_pb2.RunDocumentQueryRequest( model_hash=model_hash, query_id=query_id or "", inline_query=inline_query or "", bindings=build_bindings(bindings), + as_view=as_view, ) if any(binding_holds_big_int(binding) for binding in request.bindings): require( @@ -2203,8 +2224,12 @@ def diagnostics(self, model_hash, disable_lint=(), enable_lint=()): return [Diagnostic(d) for d in response.diagnostics] def render_view(self, model_hash, view_name, ports="minimal", show=None, depth=0, - compartments="positioned"): - """Render a named view with minimal or full ports, the optional notation elements named, above 0 a depth bound and the compartment folding named.""" + compartments="positioned", form=None): + """Render a named view with minimal or full ports, the optional notation elements named, above 0 a depth bound and the compartment folding named; ``form`` asks for a ``QVTS::QueryResult`` view as a document too.""" + if form not in (None, "markdown", "html", "asciidoc"): + raise ValueError("form must be 'markdown', 'html' or 'asciidoc'") + if form is not None: + require(self.server_info(), CAPABILITY_QUERY_RESULT_VIEW, upgrade_remedy(CAPABILITY_QUERY_RESULT_VIEW)) if ports not in ("minimal", "full"): raise ValueError("ports must be 'minimal' or 'full'") if compartments not in ("positioned", "most", "ports"): @@ -2219,6 +2244,7 @@ def render_view(self, model_hash, view_name, ports="minimal", show=None, depth=0 show=list(show or ()), depth=depth, compartments="" if compartments == "positioned" else compartments, + form=form or "", ) with translate_rpc_errors( not_found=lambda message, code: ViewNotFoundError( diff --git a/client/python/opensysml/document.py b/client/python/opensysml/document.py index f227254cc2..7bfa3d0c3f 100644 --- a/client/python/opensysml/document.py +++ b/client/python/opensysml/document.py @@ -379,6 +379,19 @@ class RenderedView: notices: tuple shown: tuple frame: Optional[RenderFrame] = None + #: A ``QVTS::QueryResult`` view's query, source, outcome and provenance, in + #: that order; empty for any other view. + header: tuple = () + #: The view as the document ``form`` asked for; ``""`` without one. + document: str = "" + + +@dataclass(frozen=True) +class RenderHeaderField: + """One attribute a ``QVTS::QueryResult`` view binds.""" + + name: str + value: str def _render_span(span): @@ -447,6 +460,8 @@ def render_view_result(response): return RenderedView( response.view, response.kind, response.stated, nodes, edges, tuple(response.columns), rows, canvas, notes, tuple(response.notices), tuple(response.shown), frame, + tuple(RenderHeaderField(field.name, field.value) for field in response.header), + response.markdown + response.html + response.asciidoc, ) #: What a binding value or an answered cell value may be. DocumentValue = Union[ @@ -502,6 +517,9 @@ class DocumentQueryResult: columns: tuple rows: tuple + #: The answer as a ``QVTS::QueryResult`` view, SysML text exposing the + #: selected elements; ``""`` unless the call asked ``as_view``. + result_view: str = "" def __iter__(self): return iter(self.rows) @@ -639,6 +657,7 @@ def result_of(response): _row_of(row) for row in response.rows ), + result_view=response.result_view, ) diff --git a/client/python/opensysml/errors.py b/client/python/opensysml/errors.py index 3bac784cee..d3fc2ab286 100644 --- a/client/python/opensysml/errors.py +++ b/client/python/opensysml/errors.py @@ -639,6 +639,43 @@ def from_rpc_error(exc, not_found=ModelNotFoundError, unimplemented=None): return cls(message, code=code) +_RESULT_VIEW_TYPE = "type.googleapis.com/sysml.QueryResultView" + + +def result_view_of(exc): + """The ``QVTS::QueryResult`` view a refused query carries, or ``""``. + + The service attaches it as a ``QueryResultView`` status detail when the + call asked for the view and the query ended in a path or model error. + """ + from google.protobuf import any_pb2 + from google.protobuf.internal.decoder import _DecodeVarint + + from opensysml.proto import sysml_pb2 + + if not isinstance(exc, grpc.Call): + return "" + status = next( + (value for key, value in exc.trailing_metadata() or () if key == "grpc-status-details-bin"), b"" + ) + # google.rpc.Status: details are field 3, each a length-delimited Any. + position = 0 + while position < len(status): + tag, position = _DecodeVarint(status, position) + if tag & 7 == 0: + _, position = _DecodeVarint(status, position) + continue + if tag & 7 != 2: + return "" + size, position = _DecodeVarint(status, position) + if tag >> 3 == 3: + detail = any_pb2.Any.FromString(status[position:position + size]) + if detail.type_url == _RESULT_VIEW_TYPE: + return sysml_pb2.QueryResultView.FromString(detail.value).text + position += size + return "" + + @contextmanager def translate_rpc_errors(not_found=ModelNotFoundError, unimplemented=None): """Re-raise any ``grpc.RpcError`` raised in the block as a OpenSysMLError. @@ -657,9 +694,12 @@ def translate_rpc_errors(not_found=ModelNotFoundError, unimplemented=None): try: yield except grpc.RpcError as exc: - raise from_rpc_error( - exc, not_found=not_found, unimplemented=unimplemented - ) from exc + error = from_rpc_error(exc, not_found=not_found, unimplemented=unimplemented) + view = result_view_of(exc) + if view: + # A query that ended in a path or model error, asked for as a view. + error.result_view = view + raise error from exc __all__ = [ diff --git a/client/python/opensysml/model.py b/client/python/opensysml/model.py index 7352058f5e..b5ec84f43d 100644 --- a/client/python/opensysml/model.py +++ b/client/python/opensysml/model.py @@ -433,7 +433,7 @@ def element_properties(self, element, *properties): return self._client.get_element_properties(self._hash, element, properties) def query(self, payload=None, scope=None, select=None, where=None, order_by=None, - oslc=None): + oslc=None, as_view=False): """Run a SysML v2 API & Services Query over this model. Takes the standard's ``Query`` JSON, so a payload written for the @@ -453,9 +453,13 @@ def query(self, payload=None, scope=None, select=None, where=None, order_by=None ``sysml:name="vehicle"``, evaluated in place of the standard's Query; not combined with the others. An empty string is no OSLC at all, so the structured query is sent instead + as_view (bool): Also answer the selection as a ``QVTS::QueryResult`` + view, the answer's ``result_view``; a path error then raises + with the view as the error's ``result_view``. Needs the + ``query_result_view`` capability Returns: - list[QueryElement]: The elements selected, in ``order_by`` order, + QueryElements: The elements selected, a list in ``order_by`` order, or declaration order without one Raises: @@ -474,10 +478,10 @@ def query(self, payload=None, scope=None, select=None, where=None, order_by=None """ return self.connection.query( self._hash, payload, scope=scope, select=select, where=where, order_by=order_by, - oslc=oslc, + oslc=oslc, as_view=as_view, ) - def run_document_query(self, query_id=None, bindings=None, inline_query=None): + def run_document_query(self, query_id=None, bindings=None, inline_query=None, as_view=False): """Run one of this model's named document queries, or a query expression. The query is the model's own — a calc def specializing @@ -496,6 +500,10 @@ def run_document_query(self, query_id=None, bindings=None, inline_query=None): Named("Vehicles")), "PartUsage"), ("name", "mass"))`` — with the ``DocumentQueries`` library in scope; needs the ``inline_document_query`` capability + as_view (bool): Also answer as a ``QVTS::QueryResult`` view, the + result's ``result_view``; a path or model error then raises + with the view as the error's ``result_view``. Needs the + ``query_result_view`` capability Returns: DocumentQueryResult: Projected columns and typed rows, in the @@ -520,7 +528,7 @@ def run_document_query(self, query_id=None, bindings=None, inline_query=None): ('name',) """ return self.connection.run_document_query( - self._hash, query_id, bindings=bindings, inline_query=inline_query, + self._hash, query_id, bindings=bindings, inline_query=inline_query, as_view=as_view, ) def render_document(self, document_id, form="markdown"): @@ -558,7 +566,7 @@ def render_document(self, document_id, form="markdown"): return self.connection.render_document(self._hash, document_id, form=form) def render_view(self, view_name, ports="minimal", show=None, depth=0, - compartments="positioned") -> RenderedView: + compartments="positioned", form=None) -> RenderedView: """Render one named view as typed diagram data. Args: @@ -580,6 +588,10 @@ def render_view(self, view_name, ports="minimal", show=None, depth=0, definition or package keeps a node, ``"ports"`` the port usages with the ports nested under them; a row is a node whose ``compartment`` names the compartment of its ``parent`` + form (str | None): ``"markdown"``, ``"html"`` or ``"asciidoc"`` to + have a ``QVTS::QueryResult`` view as a document too, the + result's ``document``; another view is refused. Needs the + ``query_result_view`` capability Returns: RenderedView: Ordered nodes, edges, table data and optional layout @@ -594,7 +606,7 @@ def render_view(self, view_name, ports="minimal", show=None, depth=0, ModelNotFoundError: If the service no longer holds this model """ return self.connection.render_view(self._hash, view_name, ports=ports, show=show, depth=depth, - compartments=compartments) + compartments=compartments, form=form) def check_action(self, action_symbol_id, inputs=None, performer=None, properties=(), diverge=(), diff --git a/client/python/opensysml/query.py b/client/python/opensysml/query.py index 711422e721..6ad2b0c82d 100644 --- a/client/python/opensysml/query.py +++ b/client/python/opensysml/query.py @@ -292,9 +292,22 @@ def _value(value): raise QueryError(f"cannot compare against {value!r}") +class QueryElements(list): + """The elements a query selected, a list of :class:`QueryElement`. + + Attributes: + result_view: The selection as a ``QVTS::QueryResult`` view, SysML text + exposing each element; ``""`` unless the call asked ``as_view``. + """ + + result_view: str = "" + + def elements_of(response): """The elements a ``QueryResponse`` reports, as :class:`QueryElement` records.""" - return [ + elements = QueryElements( QueryElement(id=e.id, type=e.type, properties=dict(e.properties), path=e.path) for e in response.elements - ] + ) + elements.result_view = response.result_view + return elements diff --git a/client/python/tests/test_document.py b/client/python/tests/test_document.py index f3c88b8fd2..e491e54701 100644 --- a/client/python/tests/test_document.py +++ b/client/python/tests/test_document.py @@ -17,6 +17,7 @@ from opensysml.capabilities import ( CAPABILITY_INLINE_DOCUMENT_QUERY, + CAPABILITY_QUERY_RESULT_VIEW, CAPABILITY_DOCUMENT_QUERY, CAPABILITY_RENDER_DOCUMENT, CAPABILITY_RENDER_DOCUMENT_ASCIIDOC, @@ -43,6 +44,7 @@ ) from opensysml.errors import ( InvalidRequestError, + OpenSysMLError, ModelNotFoundError, SymbolNotFoundError, UnsupportedValueError, @@ -86,11 +88,17 @@ "document_query_states.sysml", ) VIEW_FIXTURE = os.path.join(REPO_ROOT, "conformance", "fixtures", "views.sysml") +#: The service's result-view fixture: a probe, queries over it and two +#: ``QVTS::QueryResult`` views. +RESULT_VIEW_FIXTURE = os.path.join( + REPO_ROOT, "tests", "grpc", "testdata", "conformance", "query_result_view.sysml", +) CAPABILITIES = ( CAPABILITY_DOCUMENT_QUERY, CAPABILITY_INLINE_DOCUMENT_QUERY, CAPABILITY_RENDER_DOCUMENT, CAPABILITY_RENDER_DOCUMENT_HTML, CAPABILITY_RENDER_DOCUMENT_ASCIIDOC, CAPABILITY_RENDER_VIEW, + CAPABILITY_QUERY_RESULT_VIEW, ) @@ -155,6 +163,31 @@ def start(**kwargs): server.stop(None) +def test_a_result_view_requires_its_own_capability(fake_service): + """A service that cannot write the view is not asked for one.""" + port, service = fake_service(capabilities=(CAPABILITY_DOCUMENT_QUERY, CAPABILITY_RENDER_VIEW)) + with Connection(port=port, auto_start=False) as conn: + model = conn.load_from_content("package Demo;") + with pytest.raises(MissingCapabilityError) as excinfo: + model.run_document_query("Demo::Q", as_view=True) + assert excinfo.value.capability == CAPABILITY_QUERY_RESULT_VIEW + with pytest.raises(MissingCapabilityError): + model.render_view("Demo::v", form="markdown") + with pytest.raises(ValueError, match="form must be"): + model.render_view("Demo::v", form="pdf") + assert service.requests == [] + + +def test_a_result_view_is_asked_for_and_carried(fake_service): + port, service = fake_service( + response=sysml_pb2.RunDocumentQueryResponse(result_view="package QResult {}\n")) + with Connection(port=port, auto_start=False) as conn: + model = conn.load_from_content("package Demo;") + assert model.run_document_query("Demo::Q", as_view=True).result_view == "package QResult {}\n" + model.run_document_query("Demo::Q") + assert [r.as_view for r in service.requests] == [True, False] + + def test_bindings_translate_to_typed_values(): """Each Python kind becomes its own wire kind, bool before int.""" bindings = build_bindings({ @@ -1078,6 +1111,52 @@ def test_a_document_query_answers_typed_ordered_rows(self, real_service, telesco assert [row[1] for row in result] == [(1.5,), (15.0,), (8.5,), (20.0,)] assert {row.element.type for row in result} == {"PartUsage"} + def test_queries_answer_as_result_views(self, real_service): + with open(RESULT_VIEW_FIXTURE, encoding="utf-8") as f: + source = f.read() + with Connection(port=real_service, auto_start=False) as conn: + model = conn.load_from_content(source) + named = model.run_document_query( + "Probe::Self", bindings={"root": ElementRef("Probe::probe::antenna")}, as_view=True) + assert "view self : QueryResult" in named.result_view + assert "expose Probe::probe::antenna;" in named.result_view + assert 'attribute :>> query = "Probe::Self root=Probe::probe::antenna";' in named.result_view + assert model.run_document_query("Probe::NoStates").result_view == "" + + selected = model.query(oslc='sysml:name="camera"', as_view=True) + assert [e.id for e in selected] == ["Probe::probe::camera"] + assert "expose Probe::probe::camera;" in selected.result_view + assert model.query(oslc='sysml:name="camera"').result_view == "" + + # A path or model error is an outcome: its view rides the error. + with pytest.raises(InvalidRequestError) as unknown: + model.query(oslc='sysml:nme="camera"', as_view=True) + assert "Outcome::pathError" in unknown.value.result_view + with pytest.raises(OpenSysMLError) as twin: + model.run_document_query("Probe::Twin", as_view=True) + assert "Outcome::modelError" in twin.value.result_view + with pytest.raises(OpenSysMLError) as unasked: + model.run_document_query("Probe::Twin") + assert not hasattr(unasked.value, "result_view") + + def test_a_result_view_renders_as_a_document(self, real_service): + with open(RESULT_VIEW_FIXTURE, encoding="utf-8") as f: + source = f.read() + with Connection(port=real_service, auto_start=False) as conn: + model = conn.load_from_content(source) + rendered = model.render_view("Probe::heavy", form="markdown") + assert [(f.name, f.value) for f in rendered.header] == [ + ("query", "Probe::Self root=Probe::probe::antenna"), + ("source", "probe.sysml"), + ("outcome", "established"), + ("provenance", "urn:prov:bundle:heavy"), + ] + assert rendered.rows[0].cells[0] == "Probe::probe::antenna" + assert "| Probe::probe::antenna | part | Payload | Probe::probe |" in rendered.document + assert model.render_view("Probe::heavy").document == "" + with pytest.raises(InvalidRequestError, match="is not a QVTS::QueryResult view"): + model.render_view("Probe::plain", form="markdown") + def test_a_query_expression_runs_in_place_of_a_name(self, real_service, telescope): with Connection(port=real_service, auto_start=False) as conn: model = conn.load_from_content(telescope) diff --git a/docs/clients/python/queries.md b/docs/clients/python/queries.md index 2d13e0d551..20c4f23c20 100644 --- a/docs/clients/python/queries.md +++ b/docs/clients/python/queries.md @@ -65,6 +65,30 @@ the document model. It returns Markdown by default or standalone HTML with converter toolchain. The service must advertise `document_query`, `render_document`, and `render_document_html` for their corresponding calls. +## The answer as a view + +`as_view=True` on `query` and `run_document_query` also answers the selection +as a `QVTS::QueryResult` view: SysML text that exposes each selected element and +states the query, its source, the outcome and the provenance. A query that ends +in a path or model error still raises, with the view of that outcome as the +error's `result_view`. + +```python +result = model.run_document_query("Observatory::SubsystemTable", as_view=True) +print(result.result_view) + +selected = model.query(oslc='sysml:name="mount"', as_view=True) +print(selected.result_view) + +rendered = model.render_view("Answers::subsystems", form="markdown") +rendered.header # query, source, outcome, provenance +rendered.document # the view as a Markdown document +``` + +`render_view` renders such a view, loaded beside its model, as a table of the +exposed elements under the four attributes; `form` is `"markdown"`, `"html"` or +`"asciidoc"`. The service must advertise `query_result_view`. + For the full supported property and query surface, see the [Go API reference](../../reference/api.md) and [Python API reference](../../reference/python-api.md). diff --git a/docs/reference/client-parity.md b/docs/reference/client-parity.md index 39fe9df511..f9160efa76 100644 --- a/docs/reference/client-parity.md +++ b/docs/reference/client-parity.md @@ -67,6 +67,7 @@ from the clients and a gap is a stated gap rather than a silent one. | `strict_conformance` | bound | bound | bound | bound | bound | bound | bound | | `document_query` | bound | bound | bound | bound | bound | bound | bound | | `inline_document_query` | bound | bound | bound | bound | bound | bound | bound | +| `query_result_view` | bound | bound | not bound | bound | not bound | not bound | not bound | | `render_document` | bound | bound | bound | bound | bound | bound | bound | | `parse_sources` | bound | bound | bound | bound | bound | bound | bound | | `complex_values` | bound | bound | bound | bound | bound | bound | bound | diff --git a/docs/reference/python-api.md b/docs/reference/python-api.md index 8293544efc..2df9510850 100644 --- a/docs/reference/python-api.md +++ b/docs/reference/python-api.md @@ -44,6 +44,10 @@ connecting to models. options: heading_level: 3 +::: opensysml.CAPABILITY_QUERY_RESULT_VIEW + options: + heading_level: 3 + ::: opensysml.CAPABILITY_CONSTRAINT_BODY_AUTHORING options: heading_level: 3 @@ -853,6 +857,10 @@ Results and errors from the standard query model. options: heading_level: 3 +::: opensysml.QueryElements + options: + heading_level: 3 + ::: opensysml.QueryError options: heading_level: 3 @@ -922,6 +930,10 @@ Typed query rows, document values, and document and view render results. options: heading_level: 3 +::: opensysml.RenderHeaderField + options: + heading_level: 3 + ::: opensysml.RenderPoint options: heading_level: 3 From 9cf641d8e6bbca951f1804558284ac51b2e9ea11 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:28:04 +0000 Subject: [PATCH 05/14] feat(mdk): write a query's answer as a QueryResult view and render documents from Cameo Co-Authored-By: jason.han --- .../mdk/magic/docgen/BridgeResult.java | 70 +++++- .../mdk/magic/docgen/BridgeRunner.java | 10 + .../mdk/magic/docgen/DocBookRenderer.java | 23 ++ .../mdk/magic/docgen/OpenSysMLQuery.java | 19 +- .../mdk/magic/docgen/PluginLocator.java | 21 +- .../org/openmbee/mdk/magic/docgen/Flat.java | 17 ++ .../mdk/magic/docgen/OpenSysMLQueryTest.java | 39 ++++ .../mdk/magic/docgen/PluginLocatorTest.java | 16 ++ .../openmbee/mdk/magic/MagicMdkPlugin.java | 6 + .../mdk/magic/actions/OperationActions.java | 117 +++++++++- .../mdk/magic/bridge/DocGenBridge.java | 40 ++++ .../mdk/magic/docgen/DocGenExtensions.java | 29 ++- .../mdk/magic/engine/DocumentRenderer.java | 87 ++++++++ .../org/openmbee/mdk/magic/engine/Engine.java | 76 ++++++- .../mdk/magic/export/ResultViewFiles.java | 65 ++++++ .../mdk/magic/results/QueryAnswer.java | 8 + .../mdk/magic/results/ResultViews.java | 26 +++ .../mdk/magic/results/ResultsMapper.java | 4 +- .../openmbee/mdk/magic/results/RunResult.java | 67 +++++- .../mdk/magic/ResultViewEndToEndTest.java | 206 ++++++++++++++++++ 20 files changed, 921 insertions(+), 25 deletions(-) create mode 100644 editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/DocumentRenderer.java create mode 100644 editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/export/ResultViewFiles.java create mode 100644 editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultViews.java create mode 100644 editors/mdk/plugin/src/test/java/org/openmbee/mdk/magic/ResultViewEndToEndTest.java diff --git a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeResult.java b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeResult.java index 323a158e7b..c563e91e2a 100644 --- a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeResult.java +++ b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeResult.java @@ -21,7 +21,8 @@ public record BridgeResult( List outcomes, List diagnostics, List schedule, - List tables) { + List
tables, + List views) { public record Outcome(String label, String detail, String status, Optional elementId) {} @@ -50,6 +51,43 @@ public record Cell(String text, Optional elementId) { } } + /** + * A query's answer as a {@code QVTS::QueryResult} view: its qualified name and SysML text, and, + * when the plugin rendered it, the four attributes it binds and the rows it exposes. + */ + public record View( + String query, String name, String text, List header, List columns, List> rows) { + public View { + Objects.requireNonNull(query); + Objects.requireNonNull(name); + Objects.requireNonNull(text); + header = List.copyOf(header); + columns = List.copyOf(columns); + rows = rows.stream().map(List::copyOf).toList(); + } + + /** Whether the plugin laid the view out, so it has a header to show. */ + public boolean rendered() { + return !header.isEmpty(); + } + } + + public record Field(String name, String value) {} + + public BridgeResult( + String operation, + String operationLabel, + String subject, + String status, + long elapsedMillis, + Optional finalTime, + List outcomes, + List diagnostics, + List schedule, + List
tables) { + this(operation, operationLabel, subject, status, elapsedMillis, finalTime, outcomes, diagnostics, schedule, tables, List.of()); + } + public BridgeResult( String operation, String operationLabel, @@ -73,6 +111,7 @@ public BridgeResult( diagnostics = List.copyOf(diagnostics); schedule = List.copyOf(schedule); tables = List.copyOf(tables); + views = List.copyOf(views); } public static BridgeResult from(Map flat) { @@ -96,7 +135,34 @@ public static BridgeResult from(Map flat) { text(flat, "operation"), text(flat, "operationLabel"), text(flat, "subject"), text(flat, "status"), elapsed instanceof Number number ? number.longValue() : 0L, Optional.ofNullable(flat.get("finalTime")).map(String::valueOf), - outcomes, diagnostics, schedule, tables(flat.get("tables"))); + outcomes, diagnostics, schedule, tables(flat.get("tables")), views(flat.get("views"))); + } + + private static List views(Object value) { + List views = new ArrayList<>(); + if (!(value instanceof List list)) return views; + for (Object item : list) { + if (!(item instanceof Map view)) continue; + for (String key : List.of("query", "name", "text")) { + if (view.get(key) == null) throw new IllegalArgumentException("bridge result view lacks " + key); + } + List header = new ArrayList<>(); + if (view.get("header") instanceof List fields) { + for (Object field : fields) { + if (field instanceof Map pair) { + header.add(new Field(String.valueOf(pair.get("name")), String.valueOf(pair.get("value")))); + } + } + } + List> rows = new ArrayList<>(); + if (view.get("rows") instanceof List flatRows) { + for (Object row : flatRows) rows.add(strings(row)); + } + views.add(new View( + String.valueOf(view.get("query")), String.valueOf(view.get("name")), String.valueOf(view.get("text")), + header, strings(view.get("columns")), rows)); + } + return views; } private static List
tables(Object value) { diff --git a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeRunner.java b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeRunner.java index 027d872b2b..cbdb1dd060 100644 --- a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeRunner.java +++ b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/BridgeRunner.java @@ -10,4 +10,14 @@ @FunctionalInterface public interface BridgeRunner { Map run(BaseElement element, String operation, String calcArguments); + + /** + * Runs as {@link #run(BaseElement, String, String)} does, a query's answers also written as + * {@code QVTS::QueryResult} views when {@code view} asks ({@code text} or {@code rendered}); + * a runner that knows no views ignores a blank {@code view} and refuses any other. + */ + default Map run(BaseElement element, String operation, String calcArguments, String view) { + if (view == null || view.isBlank()) return run(element, operation, calcArguments); + throw new IllegalStateException("this runner cannot write a query's answer as a view"); + } } diff --git a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/DocBookRenderer.java b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/DocBookRenderer.java index 4071e5e227..36988e4e83 100644 --- a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/DocBookRenderer.java +++ b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/DocBookRenderer.java @@ -24,6 +24,9 @@ public static List render(BridgeResult result) { for (BridgeResult.Table answered : result.tables()) { elements.add(rows(answered)); } + for (BridgeResult.View view : result.views()) { + elements.addAll(view(view)); + } if (!result.diagnostics().isEmpty()) { DBTable table = table("Diagnostics: " + result.subject(), List.of("Severity", "Code", "Message", "Location")); for (BridgeResult.Diagnostic diagnostic : result.diagnostics()) { @@ -57,6 +60,26 @@ static DBTable rows(BridgeResult.Table answered) { return table; } + /** + * A result view: rendered, the attributes it binds as one table and the elements it exposes as + * another, row for row what {@code RenderView} lays out; otherwise its SysML text. + */ + static List view(BridgeResult.View view) { + if (!view.rendered()) { + return List.of(new DBParagraph("Query result view " + view.name() + ":"), new DBParagraph(view.text())); + } + DBTable header = table("Query result view " + view.name(), List.of("Attribute", "Value")); + for (BridgeResult.Field field : view.header()) { + header.getBody().add(row(field.name(), field.value())); + } + DBTable exposed = table(view.name() + ": " + rowCount(view.rows().size()), view.columns()); + exposed.setShowIfEmpty(true); + for (List cells : view.rows()) { + exposed.getBody().add(row(cells.toArray(String[]::new))); + } + return List.of(header, exposed); + } + private static String rowCount(int rows) { return rows == 0 ? "no rows" : rows + (rows == 1 ? " row" : " rows"); } diff --git a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/OpenSysMLQuery.java b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/OpenSysMLQuery.java index 5b5176108f..24f9b95232 100644 --- a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/OpenSysMLQuery.java +++ b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/OpenSysMLQuery.java @@ -21,6 +21,7 @@ */ public abstract class OpenSysMLQuery extends Query { static final String ARGUMENTS_TAG = "arguments"; + static final String VIEW_TAG = "view"; private static final Logger LOG = Logger.getLogger(OpenSysMLQuery.class.getName()); @@ -51,6 +52,7 @@ public List visit(boolean forViewEditor, String outputDir) { return elements; } String arguments = arguments(); + String view = tagValue(VIEW_TAG); for (Object target : targets) { if (!(target instanceof BaseElement element)) { elements.add(new DBParagraph( @@ -59,7 +61,7 @@ public List visit(boolean forViewEditor, String outputDir) { } try { elements.addAll(DocBookRenderer.render( - BridgeResult.from(runner.run(element, operation, arguments)))); + BridgeResult.from(runner.run(element, operation, arguments, view)))); } catch (RuntimeException failure) { log("[ERROR] OpenSysML " + operationLabel + " of " + element.getHumanName() + ": " + failure.getMessage()); elements.add(DocBookRenderer.failure(operationLabel, element.getHumanName(), failure)); @@ -68,18 +70,23 @@ public List visit(boolean forViewEditor, String outputDir) { return elements; } - /** The {@code arguments} tag of this query's stereotype, read from the action or the behavior it calls. */ + /** The {@code arguments} tag of this query's stereotype. */ String arguments() { + return tagValue(ARGUMENTS_TAG); + } + + /** A tag of this query's stereotype, read from the action or the behavior it calls; empty when unset. */ + String tagValue(String name) { if (dgElement == null) return ""; - String value = tag(dgElement); + String value = tag(dgElement, name); if (value == null && dgElement instanceof CallBehaviorAction call && call.getBehavior() != null) { - value = tag(call.getBehavior()); + value = tag(call.getBehavior(), name); } return value == null ? "" : value; } - private String tag(Element element) { - Object value = StereotypesHelper.getStereotypePropertyFirst(element, getClass().getName(), ARGUMENTS_TAG); + private String tag(Element element, String name) { + Object value = StereotypesHelper.getStereotypePropertyFirst(element, getClass().getName(), name); return value == null ? null : String.valueOf(value); } diff --git a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/PluginLocator.java b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/PluginLocator.java index 28783f0242..e48dd6a8f9 100644 --- a/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/PluginLocator.java +++ b/editors/mdk/mdk-bridge/src/main/java/org/openmbee/mdk/magic/docgen/PluginLocator.java @@ -29,18 +29,33 @@ public PluginLocator() { @Override public Map run(BaseElement element, String operation, String calcArguments) { + return invoke( + new Class[] {BaseElement.class, String.class, String.class}, element, operation, calcArguments); + } + + /** A blank {@code view} goes through the three-argument entry point, so an older plugin still answers. */ + @Override + public Map run(BaseElement element, String operation, String calcArguments, String view) { + if (view == null || view.isBlank()) return run(element, operation, calcArguments); + return invoke( + new Class[] {BaseElement.class, String.class, String.class, String.class}, + element, operation, calcArguments, view); + } + + private Map invoke(Class[] signature, Object... arguments) { Plugin plugin = plugin(); Method method; try { - method = plugin.getClass().getMethod(METHOD, BaseElement.class, String.class, String.class); + method = plugin.getClass().getMethod(METHOD, signature); } catch (NoSuchMethodException missing) { throw new IllegalStateException( - "the installed Magic MDK plugin has no " + METHOD + " entry point; update it to match this extension", + "the installed Magic MDK plugin has no " + METHOD + " entry point taking " + signature.length + + " arguments; update it to match this extension", missing); } Object result; try { - result = method.invoke(plugin, element, operation, calcArguments); + result = method.invoke(plugin, arguments); } catch (IllegalAccessException inaccessible) { throw new IllegalStateException(METHOD + " is not accessible on the Magic MDK plugin", inaccessible); } catch (InvocationTargetException failed) { diff --git a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/Flat.java b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/Flat.java index 99c6fdffa0..c9b91bb8ca 100644 --- a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/Flat.java +++ b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/Flat.java @@ -25,6 +25,23 @@ static Map verify(String subject, String status) { return flat; } + /** A run whose one query answered with a view; {@code rendered} adds the header and rows RenderView lays out. */ + static Map view(boolean rendered) { + Map flat = verify("A::Q", "PASSED"); + Map view = new LinkedHashMap<>(); + view.put("query", "A::Q"); + view.put("name", "QResult::q"); + view.put("text", "package QResult {\n\tview q : QueryResult {\n\t\texpose A::a;\n\t}\n}\n"); + view.put("header", rendered + ? List.of(row("name", "query", "value", "A::Q"), row("name", "source", "value", "a.sysml"), + row("name", "outcome", "value", "established"), row("name", "provenance", "value", "sha256:1")) + : List.of()); + view.put("columns", rendered ? List.of("element", "kind", "type", "owner") : List.of()); + view.put("rows", rendered ? List.of(List.of("A::a", "part", "", "A")) : List.of()); + flat.put("views", List.of(view)); + return flat; + } + static Map row(String... pairs) { Map row = new LinkedHashMap<>(); for (int i = 0; i < pairs.length; i += 2) row.put(pairs[i], pairs[i + 1]); diff --git a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/OpenSysMLQueryTest.java b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/OpenSysMLQueryTest.java index edf86f33d8..bb7d1fdb1e 100644 --- a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/OpenSysMLQueryTest.java +++ b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/OpenSysMLQueryTest.java @@ -1,14 +1,18 @@ package org.openmbee.mdk.magic.docgen; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Test; import org.openmbee.mdk.docgen.docbook.DBParagraph; import org.openmbee.mdk.docgen.docbook.DBTable; +import org.openmbee.mdk.docgen.docbook.DBText; import org.openmbee.mdk.docgen.docbook.DocumentElement; class OpenSysMLQueryTest { @@ -64,6 +68,41 @@ void aFailingRunBecomesAnErrorParagraphAndTheOthersStillRender() { assertEquals("OpenSysML Verify of Part B: PASSED (42 ms)", ((DBParagraph) elements.get(1)).getText()); } + @Test + void aViewIsLaidOutAsItsAttributesAndItsExposedElements() { + BridgeResult rendered = BridgeResult.from(Flat.view(true)); + List tables = DocBookRenderer.view(rendered.views().get(0)); + DBTable header = (DBTable) tables.get(0); + assertEquals("Query result view QResult::q", header.getTitle()); + assertEquals(4, header.getBody().size()); + assertEquals("outcome", ((DBText) header.getBody().get(2).get(0)).getText()); + assertEquals("established", ((DBText) header.getBody().get(2).get(1)).getText()); + DBTable exposed = (DBTable) tables.get(1); + assertEquals("QResult::q: 1 row", exposed.getTitle()); + assertEquals("A::a", ((DBText) exposed.getBody().get(0).get(0)).getText()); + assertEquals(4, exposed.getHeaders().get(0).size()); + + BridgeResult text = BridgeResult.from(Flat.view(false)); + assertFalse(text.views().get(0).rendered()); + List paragraphs = DocBookRenderer.view(text.views().get(0)); + assertEquals("Query result view QResult::q:", ((DBParagraph) paragraphs.get(0)).getText()); + assertTrue(String.valueOf(((DBParagraph) paragraphs.get(1)).getText()).contains("expose A::a;")); + assertEquals(DocBookRenderer.render(BridgeResult.from(Flat.verify("x", "PASSED"))).size() + 2, + DocBookRenderer.render(text).size(), "the view follows the run's tables"); + + Map nameless = Flat.view(false); + ((Map) ((List) nameless.get("views")).get(0)).remove("name"); + assertEquals("bridge result view lacks name", + assertThrows(IllegalArgumentException.class, () -> BridgeResult.from(nameless)).getMessage()); + } + + @Test + void aRunnerWithoutViewsRefusesOneAndIgnoresABlank() { + BridgeRunner runner = (element, operation, args) -> Flat.verify("x", "PASSED"); + assertEquals("PASSED", runner.run(new FakeElement("A"), "RUN_QUERY", "", "").get("status")); + assertThrows(IllegalStateException.class, () -> runner.run(new FakeElement("A"), "RUN_QUERY", "", "text")); + } + @Test void ignoredQueriesRenderNothing() { OpenSysMLQuery query = query((element, operation, args) -> Flat.verify("x", "PASSED")); diff --git a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/PluginLocatorTest.java b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/PluginLocatorTest.java index 70404574cf..7f5091ecd9 100644 --- a/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/PluginLocatorTest.java +++ b/editors/mdk/mdk-bridge/src/test/java/org/openmbee/mdk/magic/docgen/PluginLocatorTest.java @@ -37,6 +37,18 @@ void explainsAnOutdatedPluginWithoutTheEntryPoint() { assertTrue(failure.getMessage().contains("no docGen entry point"), failure.getMessage()); } + @Test + void aViewGoesThroughTheFourArgumentEntryPointAndABlankOneDoesNot() { + PluginLocator locator = new PluginLocator(() -> List.of(new OpenSysML())); + FakeElement element = new FakeElement("A"); + assertEquals("Part A rendered", locator.run(element, "RUN_QUERY", "", "rendered").get("subject")); + assertEquals("Part A", locator.run(element, "RUN_QUERY", "", " ").get("subject")); + PluginLocator older = new PluginLocator(() -> List.of(new Failing())); + IllegalStateException failure = assertThrows(IllegalStateException.class, + () -> older.run(element, "RUN_QUERY", "", "text")); + assertTrue(failure.getMessage().contains("no docGen entry point taking 4 arguments"), failure.getMessage()); + } + @Test void unwrapsRuntimeFailuresOfThePlugin() { PluginLocator locator = new PluginLocator(() -> List.of(new Failing())); @@ -87,6 +99,10 @@ public static final class OpenSysML extends Described { public Map docGen(BaseElement element, String operation, String calcArguments) { return Flat.verify(element.getHumanName(), "PASSED"); } + + public Map docGen(BaseElement element, String operation, String calcArguments, String view) { + return Flat.verify(element.getHumanName() + " " + view, "PASSED"); + } } public static final class Failing extends Described { diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/MagicMdkPlugin.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/MagicMdkPlugin.java index 0cd4a36a65..4e03e4f05d 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/MagicMdkPlugin.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/MagicMdkPlugin.java @@ -50,6 +50,12 @@ public Map docGen(BaseElement element, String operation, String return new DocGenBridge(this::engine).run(Project.getProject(element), element, operation, calcArguments); } + /** Runs a query for MDK DocGen with its answer as a view; see {@link DocGenBridge#run(Project, BaseElement, String, String, String)}. */ + public Map docGen(BaseElement element, String operation, String calcArguments, String view) { + return new DocGenBridge(this::engine) + .run(Project.getProject(element), element, operation, calcArguments, view); + } + private synchronized Engine engine() { if (engine == null) engine = new Engine(getDescriptor().getPluginDirectory().toPath()); return engine; diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/actions/OperationActions.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/actions/OperationActions.java index 614e0627a7..bf228e2b84 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/actions/OperationActions.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/actions/OperationActions.java @@ -14,8 +14,10 @@ import com.nomagic.task.ProgressStatus; import com.nomagic.ui.ProgressStatusRunner; import com.nomagic.utils.PriorityProvider; +import java.awt.Desktop; import java.awt.event.ActionEvent; import java.io.File; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; import java.nio.file.Path; @@ -39,6 +41,7 @@ import org.openmbee.mdk.magic.engine.QueryPlan; import org.openmbee.mdk.magic.engine.RunRequest; import org.openmbee.mdk.magic.export.ModelExport; +import org.openmbee.mdk.magic.export.ResultViewFiles; import org.openmbee.mdk.magic.identity.IdentityResolver; import org.openmbee.mdk.magic.results.RunResult; import org.openmbee.mdk.magic.selection.Selection; @@ -95,6 +98,7 @@ private void offer(ActionsManager manager, Object selected) { for (Operation operation : Operation.values()) { if (selection.isPresent()) category.addAction(new OperationAction(operation, project, selection.get())); } + if (selection.isPresent()) category.addAction(new RenderAction(project, selection.get())); if (selection.isPresent()) category.addAction(new ExportAction(project, selection.get())); if (root) category.addAction(new InstallDocGenExtensionsAction(project)); manager.addCategory(category); @@ -272,12 +276,123 @@ private void export(ModelSource source, Path destination, ProgressStatus status) } if (result.isEmpty()) return; ModelExport.Result written = result.get(); + ResultViewFiles.exported(project.getFileName(), written.model()); ResultsWindow.onEdt(() -> JOptionPane.showMessageDialog( Application.getInstance().getMainFrame(), written.describe(), TITLE, written.errorCount() > 0 ? JOptionPane.WARNING_MESSAGE : JOptionPane.INFORMATION_MESSAGE)); } } + /** + * Renders the selected document — a {@code DocumentQueries::Document}, or the one a v1 DocGen + * «Document» migrates to — or {@code QVTS::QueryResult} view as Markdown and HTML into a folder + * the user picks, then opens the folder. + */ + private final class RenderAction extends MDAction { + static final String TITLE = "Magic MDK: Render document"; + private final Project project; + private final Selection selection; + + RenderAction(Project project, Selection selection) { + super(CATEGORY_ID + ".render", "Render document...", null, null); + this.project = project; + this.selection = selection; + } + + /** Runs on the EDT: asks for the folder, exports the model, then hands the rendering to the progress runner. */ + @Override + public void actionPerformed(ActionEvent event) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(TITLE); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + String projectFile = project.getFileName(); + if (projectFile != null && !projectFile.isBlank()) { + chooser.setCurrentDirectory(new File(projectFile).getAbsoluteFile().getParentFile()); + } + if (chooser.showSaveDialog(Application.getInstance().getMainFrame()) != JFileChooser.APPROVE_OPTION) return; + Path directory = chooser.getSelectedFile().toPath(); + ModelSource source; + try { + source = selection.export().get(); + } catch (RuntimeException exception) { + JOptionPane.showMessageDialog( + Application.getInstance().getMainFrame(), exception.getMessage(), TITLE, JOptionPane.ERROR_MESSAGE); + return; + } + ProgressStatusRunner.runWithProgressStatus(status -> render(source, directory, status), TITLE, true, 0); + } + + /** Runs off the EDT under the progress dialog; only the dialogs hop back onto it. */ + private void render(ModelSource source, Path directory, ProgressStatus status) { + status.setDescription("Rendering " + selection.subject().qualifiedName()); + Optional> written; + try { + written = engine.get().render(source, selection.subject().qualifiedName(), directory, status::isCancel); + } catch (RuntimeException failure) { + try { + source.close(); + } catch (RuntimeException closeFailure) { + failure.addSuppressed(closeFailure); + } + String message = failure.getMessage() == null ? failure.getClass().getName() : failure.getMessage(); + ResultsWindow.onEdt(() -> JOptionPane.showMessageDialog( + Application.getInstance().getMainFrame(), "Rendering failed: " + message, TITLE, JOptionPane.ERROR_MESSAGE)); + return; + } + String cleanup = ""; + try { + source.close(); + } catch (RuntimeException closeFailure) { + cleanup = "\n\nTemporary export not removed: " + closeFailure.getMessage(); + } + if (written.isEmpty()) return; + StringBuilder message = new StringBuilder("Wrote:\n"); + written.get().forEach(path -> message.append(" ").append(path).append('\n')); + String account = message.toString().strip() + cleanup; + ResultsWindow.onEdt(() -> { + JOptionPane.showMessageDialog( + Application.getInstance().getMainFrame(), account, TITLE, JOptionPane.INFORMATION_MESSAGE); + openFolder(directory); + }); + } + + /** Shows the folder in the desktop's file manager where there is one; the dialog already named the files. */ + private void openFolder(Path directory) { + if (!Desktop.isDesktopSupported() || !Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) return; + try { + Desktop.getDesktop().open(directory.toFile()); + } catch (IOException | RuntimeException unopened) { + JOptionPane.showMessageDialog( + Application.getInstance().getMainFrame(), "Could not open " + directory + ": " + unopened.getMessage(), + TITLE, JOptionPane.WARNING_MESSAGE); + } + } + } + + /** + * Writes the views a "Run query" answered with and says where, one diagnostic per file; a + * project with no file to write beside, or a file that cannot be written, is a warning. + */ + static List writeViews(RunResult result, String projectFile) { + if (result.views().isEmpty()) return List.of(); + Optional anchor = ResultViewFiles.anchor(result.path(), projectFile); + if (anchor.isEmpty()) { + return List.of(viewDiagnostic( + Diagnostic.Severity.WARNING, "query result view not written: save the project first, the view goes beside it")); + } + try { + return ResultViewFiles.write(anchor.get(), result.views()).stream() + .map(path -> viewDiagnostic(Diagnostic.Severity.INFO, "query result view written to " + path)) + .toList(); + } catch (RuntimeException failure) { + return List.of(viewDiagnostic(Diagnostic.Severity.WARNING, failure.getMessage())); + } + } + + private static Diagnostic viewDiagnostic(Diagnostic.Severity severity, String message) { + return new Diagnostic(severity, message, "query-result-view", Optional.empty()); + } + private final class OperationAction extends MDAction { private final Operation operation; private final Project project; @@ -409,7 +524,7 @@ private void run(RunRequest request, IdentityResolver index, ProgressStatus stat Optional.empty()))); } if (result.status() == RunResult.Status.CANCELLED) return; - RunResult completed = result; + RunResult completed = result.withDiagnostics(writeViews(result, project.getFileName())); IdentityResolver completedIndex = index; ResultsWindow.onEdt(() -> { ResultsWindow.forProject(project).show(completed, completedIndex); diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/bridge/DocGenBridge.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/bridge/DocGenBridge.java index 82f1e888fc..cbbfcf35db 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/bridge/DocGenBridge.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/bridge/DocGenBridge.java @@ -29,6 +29,8 @@ */ public final class DocGenBridge { public static final String METHOD = "docGen"; + public static final String VIEW_TEXT = "text"; + public static final String VIEW_RENDERED = "rendered"; private final Supplier engine; private final SelectionResolver resolver; @@ -50,6 +52,23 @@ public DocGenBridge(Supplier engine) { * element OpenSysML can run, or the calc arguments or query bindings do not parse */ public Map run(Project project, BaseElement element, String operation, String calcArguments) { + return run(project, element, operation, calcArguments, ""); + } + + /** + * Runs as {@link #run(Project, BaseElement, String, String)} does; for "Run query", {@code view} + * asks for each answer as a {@code QVTS::QueryResult} view too: {@link #VIEW_TEXT} for its SysML + * text, {@link #VIEW_RENDERED} for the text with the header and rows {@code RenderView} lays out. + * + * @throws IllegalArgumentException also when {@code view} is neither of those nor blank + */ + public Map run( + Project project, BaseElement element, String operation, String calcArguments, String view) { + String views = view == null ? "" : view.strip(); + if (!views.isEmpty() && !views.equals(VIEW_TEXT) && !views.equals(VIEW_RENDERED)) { + throw new IllegalArgumentException( + "the view tag is \"" + VIEW_TEXT + "\" or \"" + VIEW_RENDERED + "\", not \"" + views + "\""); + } Operation parsed = operation(operation); List args = parsed == Operation.EVALUATE_CALC ? CalcArguments.parse(calcArguments) : List.of(); Selection selection = resolver.resolve(project, element).orElseThrow(() -> new IllegalArgumentException( @@ -63,6 +82,8 @@ public Map run(Project project, BaseElement element, String oper request = request.withQueryBindings(QueryArguments.parse(calcArguments, plan)); } result = engine.get().run(request, () -> false); + if (views.equals(VIEW_RENDERED)) result = engine.get().renderViews(source, result, () -> false); + else if (views.isEmpty()) result = result.withViews(List.of()); } catch (RuntimeException failure) { try { source.close(); @@ -145,6 +166,25 @@ public static Map flatten(RunResult result) { tables.add(flatTable); } flat.put("tables", tables); + List> views = new ArrayList<>(); + for (RunResult.View view : result.views()) { + Map flatView = new LinkedHashMap<>(); + flatView.put("query", view.query()); + flatView.put("name", view.name()); + flatView.put("text", view.text()); + List> header = new ArrayList<>(); + for (RunResult.Field field : view.header()) { + Map flatField = new LinkedHashMap<>(); + flatField.put("name", field.name()); + flatField.put("value", field.value()); + header.add(flatField); + } + flatView.put("header", header); + flatView.put("columns", List.copyOf(view.columns())); + flatView.put("rows", view.rows().stream().map(List::copyOf).toList()); + views.add(flatView); + } + flat.put("views", views); return flat; } } diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/docgen/DocGenExtensions.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/docgen/DocGenExtensions.java index fab07e73b3..4a7db41b9d 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/docgen/DocGenExtensions.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/docgen/DocGenExtensions.java @@ -33,6 +33,7 @@ public final class DocGenExtensions { public static final String BASE_STEREOTYPE = "JavaExtension"; public static final String PROFILE_NAME = "Magic MDK DocGen"; public static final String ARGUMENTS_TAG = "arguments"; + public static final String VIEW_TAG = "view"; static final String EXTENSION_PACKAGE = "org.openmbee.mdk.magic.docgen"; static final String STRING_TYPE = "UML Standard Profile::UML2 Metamodel::PrimitiveTypes::String"; private static final List METACLASSES = List.of("Activity", "CallBehaviorAction"); @@ -122,12 +123,19 @@ private static Report create(Project project, Stereotype base) throws ReadOnlyEl } Type string = Finder.byQualifiedName().find(project, STRING_TYPE); if (string == null) { - notes.add("The UML String type was not found; the \"" + ARGUMENTS_TAG + "\" tag is untyped."); + notes.add("The UML String type was not found; the \"" + ARGUMENTS_TAG + "\" and \"" + VIEW_TAG + + "\" tags are untyped."); } for (Operation operation : Operation.values()) { String name = stereotypeName(operation); - if (child(container, Stereotype.class, name).isPresent()) { + Optional present = child(container, Stereotype.class, name); + if (present.isPresent()) { existing.add("«" + name + "»"); + // A stereotype an earlier release created has no view tag yet. + if (operation == Operation.RUN_QUERY && child(present.get(), Property.class, VIEW_TAG).isEmpty()) { + addTag(factory, elements, present.get(), VIEW_TAG, string); + created.add("tag " + VIEW_TAG + " of «" + name + "»"); + } continue; } Stereotype stereotype = StereotypesHelper.createStereotype(container, name, metaclasses); @@ -135,12 +143,8 @@ private static Report create(Project project, Stereotype base) throws ReadOnlyEl generalization.setGeneral(base); generalization.setSpecific(stereotype); elements.addElement(generalization, stereotype); - if (WITH_ARGUMENTS.contains(operation)) { - Property arguments = factory.createPropertyInstance(); - arguments.setName(ARGUMENTS_TAG); - if (string != null) arguments.setType(string); - elements.addElement(arguments, stereotype); - } + if (WITH_ARGUMENTS.contains(operation)) addTag(factory, elements, stereotype, ARGUMENTS_TAG, string); + if (operation == Operation.RUN_QUERY) addTag(factory, elements, stereotype, VIEW_TAG, string); created.add("«" + name + "»"); } if (!StereotypesHelper.getAppliedProfiles(root).contains(container)) { @@ -150,6 +154,15 @@ private static Report create(Project project, Stereotype base) throws ReadOnlyEl return new Report(created, existing, notes); } + private static void addTag( + ElementsFactory factory, ModelElementsManager elements, Stereotype stereotype, String name, Type string) + throws ReadOnlyElementException { + Property tag = factory.createPropertyInstance(); + tag.setName(name); + if (string != null) tag.setType(string); + elements.addElement(tag, stereotype); + } + /** The owned element of {@code type} named {@code name}, skipping same-named elements of other kinds. */ private static Optional child(Element owner, Class type, String name) { for (Element candidate : owner.getOwnedElement()) { diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/DocumentRenderer.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/DocumentRenderer.java new file mode 100644 index 0000000000..db5d57e5bc --- /dev/null +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/DocumentRenderer.java @@ -0,0 +1,87 @@ +package org.openmbee.mdk.magic.engine; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import org.openmbee.mdk.magic.source.ModelSource; +import org.openmbee.opensysml.DocumentForm; +import org.openmbee.opensysml.Model; +import org.openmbee.opensysml.Symbol; + +/** Renders the documents and result views a subject stands for, as Markdown and HTML files named by what was rendered. */ +final class DocumentRenderer { + static final String DOCUMENT = "DocumentQueries::Document"; + static final String RESULT_VIEW = "QVTS::QueryResult"; + private static final List FORMS = List.of(DocumentForm.MARKDOWN, DocumentForm.HTML); + + private DocumentRenderer() {} + + static List render(ModelSource source, Model model, String subjectQualifiedName, Path directory) { + String subject = source.subjectName(subjectQualifiedName); + Set candidates = new LinkedHashSet<>(); + candidates.add(subject); + for (String target : source.mappedTargets(subjectQualifiedName)) candidates.add(QueryResolver.targetName(target)); + Map rendered = new LinkedHashMap<>(); + for (String candidate : candidates) { + Optional symbol = model.findSymbol(candidate); + if (symbol.isEmpty()) continue; + boolean document = specializes(model, symbol.get(), DOCUMENT, new HashSet<>()); + if (!document && !specializes(model, symbol.get(), RESULT_VIEW, new HashSet<>())) continue; + for (DocumentForm form : FORMS) { + String content = document + ? content(form, model.renderDocument(symbol.get().id(), form)) + : model.renderView(symbol.get().id(), form).document(); + rendered.put(fileName(symbol.get().id(), form), content); + } + } + if (rendered.isEmpty()) { + throw new IllegalArgumentException( + subject + " is neither a " + DOCUMENT + " nor a " + RESULT_VIEW + " view" + + (candidates.size() > 1 ? ", and the migration maps it to none" : "")); + } + List written = new ArrayList<>(); + try { + Files.createDirectories(directory); + for (Map.Entry file : rendered.entrySet()) { + Path target = directory.resolve(file.getKey()); + Files.writeString(target, file.getValue(), StandardCharsets.UTF_8); + written.add(target); + } + } catch (IOException exception) { + throw new UncheckedIOException("cannot write to " + directory + ": " + exception.getMessage(), exception); + } + return List.copyOf(written); + } + + private static String content(DocumentForm form, org.openmbee.opensysml.RenderedDocument document) { + return form == DocumentForm.HTML ? document.html() : document.markdown(); + } + + static String fileName(String qualifiedName, DocumentForm form) { + String stem = qualifiedName.replace("::", ".").replaceAll("[^A-Za-z0-9._-]", "_"); + return stem + (form == DocumentForm.HTML ? ".html" : ".md"); + } + + /** Whether {@code symbol} is typed by or specializes {@code definition}, directly or through its generals. */ + private static boolean specializes(Model model, Symbol symbol, String definition, Set visited) { + if (!visited.add(symbol.id())) return false; + if (symbol.id().equals(definition)) return true; + for (Symbol.Specialization general : symbol.specializations()) { + if (general.targetId().isEmpty()) continue; + if (general.targetId().get().equals(definition)) return true; + Optional target = model.findSymbol(general.targetId().get()); + if (target.isPresent() && specializes(model, target.get(), definition, visited)) return true; + } + return false; + } +} diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/Engine.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/Engine.java index ec10be70a2..9383498c74 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/Engine.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/engine/Engine.java @@ -16,7 +16,9 @@ import org.openmbee.opensysml.ConnectionOptions; import org.openmbee.opensysml.Diagnostic; import org.openmbee.opensysml.DocumentValue; +import org.openmbee.opensysml.DocumentForm; import org.openmbee.opensysml.Model; +import org.openmbee.opensysml.RenderedView; import org.openmbee.opensysml.ServiceException; import org.openmbee.opensysml.SourceDocument; import org.openmbee.opensysml.StatusCode; @@ -24,6 +26,7 @@ import org.openmbee.mdk.magic.bin.HostBinary; import org.openmbee.mdk.magic.export.ModelExport; import org.openmbee.mdk.magic.results.QueryAnswer; +import org.openmbee.mdk.magic.results.ResultViews; import org.openmbee.mdk.magic.results.ResultsMapper; import org.openmbee.mdk.magic.results.RunResult; import org.openmbee.mdk.magic.source.ModelSource; @@ -160,6 +163,77 @@ public Optional export( } } + /** + * Lays out the views of {@code result} as {@code RenderView} does: the model of {@code source} + * is parsed with each view's text beside it, so the header and rows are the service's reading + * of what it wrote. + * + * @return the result with its views rendered, or unchanged when it has none or was cancelled + */ + public RunResult renderViews(ModelSource source, RunResult result, Cancellation cancellation) { + Objects.requireNonNull(source); + Objects.requireNonNull(result); + Objects.requireNonNull(cancellation); + if (result.views().isEmpty() || cancellation.requested()) return result; + return withModel(cancellation, current -> { + List documents = new ArrayList<>(source.sources(current)); + for (RunResult.View view : result.views()) { + documents.add(SourceDocument.inline(ResultViews.fileName("view", view.query()), view.text())); + } + Model model = current.parseSources(documents); + List rendered = new ArrayList<>(); + for (RunResult.View view : result.views()) { + RenderedView laid = model.renderView(view.name(), DocumentForm.MARKDOWN); + rendered.add(new RunResult.View( + view.query(), view.name(), view.text(), + laid.header().stream().map(field -> new RunResult.Field(field.name(), field.value())).toList(), + laid.columns(), + laid.rows().stream().map(RenderedView.Row::cells).toList())); + } + return result.withViews(rendered); + }).orElse(result); + } + + /** + * Renders what {@code subjectQualifiedName} stands for into {@code directory} as Markdown and + * HTML: each {@code DocumentQueries::Document} it is, or the migration wrote for it, through + * {@code RenderDocument}; a {@code QVTS::QueryResult} view through {@code RenderView}. + * + * @return the files written, or empty when cancelled + * @throws IllegalArgumentException when the subject is neither a document nor a result view + * @throws RuntimeException when the service or the file system fails; the caller reports it + */ + public Optional> render( + ModelSource source, String subjectQualifiedName, Path directory, Cancellation cancellation) { + Objects.requireNonNull(source); + Objects.requireNonNull(subjectQualifiedName); + Objects.requireNonNull(directory); + Objects.requireNonNull(cancellation); + if (cancellation.requested()) return Optional.empty(); + return withModel(cancellation, current -> { + Model model = current.parseSources(source.sources(current)); + return DocumentRenderer.render(source, model, subjectQualifiedName, directory); + }); + } + + /** Runs {@code work} on the connection under the cancellation watcher; empty when cancelled. */ + private Optional withModel(Cancellation cancellation, java.util.function.Function work) { + Thread watcher = null; + Connection current = null; + try { + current = connection(); + watcher = watcher(cancellation, current); + T value = work.apply(current); + return cancellation.requested() ? Optional.empty() : Optional.of(value); + } catch (RuntimeException exception) { + if (cancellation.requested()) return Optional.empty(); + if (current != null && isUnavailable(exception)) dropConnection(current); + throw exception; + } finally { + stop(watcher); + } + } + /** The first document under the destination's file name, so the diagnostics name the file the user saved. */ private static List named(List documents, Path destination) { if (documents.isEmpty()) return documents; @@ -243,7 +317,7 @@ private static RunResult runQuery(RunRequest request, Model model) { List answers = new ArrayList<>(); for (String query : plan.queries()) { try { - answers.add(QueryAnswer.rows(query, model.runDocumentQuery(query, bindings.get(query)))); + answers.add(QueryAnswer.rows(query, model.runDocumentQueryAsView(query, bindings.get(query)))); } catch (ServiceException failure) { if (failure.status() == StatusCode.UNAVAILABLE || failure.status() == StatusCode.CANCELLED) throw failure; answers.add(QueryAnswer.failed(query, failure)); diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/export/ResultViewFiles.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/export/ResultViewFiles.java new file mode 100644 index 0000000000..0b76b79143 --- /dev/null +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/export/ResultViewFiles.java @@ -0,0 +1,65 @@ +package org.openmbee.mdk.magic.export; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import org.openmbee.mdk.magic.model.ModelPath; +import org.openmbee.mdk.magic.results.ResultViews; +import org.openmbee.mdk.magic.results.RunResult; + +/** + * Writes the {@code QVTS::QueryResult} views of a run as files named by query: beside the SysML v2 + * text a v1 project was last exported to (where its migration report is), else next to the + * project file, which is where a v2 project's always go. + */ +public final class ResultViewFiles { + /** The model file each project (by its file name) was last exported to in this session. */ + private static final Map EXPORTS = new ConcurrentHashMap<>(); + + private ResultViewFiles() {} + + /** Remembers that the project stored at {@code projectFile} was exported to {@code model}. */ + public static void exported(String projectFile, Path model) { + if (projectFile != null && !projectFile.isBlank()) EXPORTS.put(projectFile, model.toAbsolutePath().normalize()); + } + + /** The model file the views of a run on {@code path} are written beside; empty for a project never saved nor exported. */ + public static Optional anchor(ModelPath path, String projectFile) { + if (projectFile == null || projectFile.isBlank()) return Optional.empty(); + Path exported = path == ModelPath.V1_MDZIP ? EXPORTS.get(projectFile) : null; + return Optional.of(exported != null ? exported : Path.of(projectFile).toAbsolutePath().normalize()); + } + + /** + * Writes each view beside {@code anchor} as {@code ..result.sysml}, replacing + * the file a previous run of the same query wrote. + * + * @return the files written, in the views' order + * @throws UncheckedIOException when a file cannot be written + */ + public static List write(Path anchor, List views) { + Path directory = anchor.toAbsolutePath().normalize().getParent(); + if (directory == null) throw new IllegalArgumentException(anchor + " has no parent directory"); + String name = anchor.getFileName().toString(); + int extension = name.lastIndexOf('.'); + String stem = extension > 0 ? name.substring(0, extension) : name; + List written = new ArrayList<>(); + try { + for (RunResult.View view : views) { + Path target = directory.resolve(ResultViews.fileName(stem, view.query())); + Files.writeString(target, view.text(), StandardCharsets.UTF_8); + written.add(target); + } + } catch (IOException exception) { + throw new UncheckedIOException("cannot write a query result view: " + exception.getMessage(), exception); + } + return List.copyOf(written); + } +} diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/QueryAnswer.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/QueryAnswer.java index cb5aa22d4c..28b5e0bd2d 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/QueryAnswer.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/QueryAnswer.java @@ -3,6 +3,7 @@ import java.util.Objects; import java.util.Optional; import org.openmbee.opensysml.DocumentQueryResult; +import org.openmbee.opensysml.QueryOutcomeException; /** What running one query gave: its rows, or the failure the service answered. */ public record QueryAnswer(String query, Optional result, Optional failure) { @@ -22,4 +23,11 @@ public static QueryAnswer rows(String query, DocumentQueryResult result) { public static QueryAnswer failed(String query, RuntimeException failure) { return new QueryAnswer(query, Optional.empty(), Optional.of(failure)); } + + /** The answer as a {@code QVTS::QueryResult} view: of the rows, or of the outcome a failed query reported; empty when the service wrote none. */ + public Optional view() { + String text = result.map(DocumentQueryResult::resultView) + .orElseGet(() -> failure.get() instanceof QueryOutcomeException reported ? reported.resultView() : ""); + return ResultViews.named(text).map(name -> new RunResult.View(query, name, text)); + } } diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultViews.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultViews.java new file mode 100644 index 0000000000..d4e663c80f --- /dev/null +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultViews.java @@ -0,0 +1,26 @@ +package org.openmbee.mdk.magic.results; + +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Reads what the engine's result-view text declares: one package holding one view. */ +public final class ResultViews { + private static final Pattern PACKAGE = Pattern.compile("^package (\\w+) \\{", Pattern.MULTILINE); + private static final Pattern VIEW = Pattern.compile("^\\s*view (\\w+) : QueryResult \\{", Pattern.MULTILINE); + + private ResultViews() {} + + /** The qualified name of the view {@code text} declares; empty for text that declares none. */ + public static Optional named(String text) { + Matcher owner = PACKAGE.matcher(text); + Matcher view = VIEW.matcher(text); + if (!owner.find() || !view.find()) return Optional.empty(); + return Optional.of(owner.group(1) + "::" + view.group(1)); + } + + /** The file a view is written to beside {@code stem}'s model: named by the query, {@code ::} flattened. */ + public static String fileName(String stem, String query) { + return stem + "." + query.replace("::", ".").replaceAll("[^A-Za-z0-9._-]", "_") + ".result.sysml"; + } +} diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultsMapper.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultsMapper.java index 01ee4c66ee..2d9eb8f622 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultsMapper.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/ResultsMapper.java @@ -103,7 +103,9 @@ public static RunResult map(RunRequest request, Analysis value, Duration elapsed public static RunResult map(RunRequest request, List answers, Duration elapsed) { List outcomes = new ArrayList<>(); List
tables = new ArrayList<>(); + List views = new ArrayList<>(); for (QueryAnswer answer : answers) { + answer.view().ifPresent(views::add); if (answer.failure().isPresent()) { outcomes.addAll(QueryFailure.outcomes(answer.query(), answer.failure().get(), request.source()::elementName)); continue; @@ -122,7 +124,7 @@ public static RunResult map(RunRequest request, List answers, Durat } return new RunResult( request.operation(), request.source().path(), request.subjectQualifiedName(), - status, outcomes, List.of(), Optional.empty(), List.of(), tables, elapsed); + status, outcomes, List.of(), Optional.empty(), List.of(), tables, views, elapsed); } static String describe(Table table) { diff --git a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/RunResult.java b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/RunResult.java index 08aa3c0bb9..2e63c17631 100644 --- a/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/RunResult.java +++ b/editors/mdk/plugin/src/main/java/org/openmbee/mdk/magic/results/RunResult.java @@ -22,6 +22,7 @@ public record RunResult( Optional finalTime, List schedule, List
tables, + List views, Duration elapsed) { public enum Status { PASSED, @@ -64,6 +65,49 @@ public record Cell(String text, String elementId) { } } + /** + * A query's answer as a {@code QVTS::QueryResult} view: {@code name} is the view's qualified + * name and {@code text} the SysML declaring it. {@code header}, {@code columns} and {@code rows} + * are the view as {@code RenderView} lays it out, empty until it was rendered. + */ + public record View( + String query, String name, String text, List header, List columns, List> rows) { + public View { + Objects.requireNonNull(query); + Objects.requireNonNull(name); + Objects.requireNonNull(text); + header = List.copyOf(header); + columns = List.copyOf(columns); + rows = rows.stream().map(List::copyOf).toList(); + } + + public View(String query, String name, String text) { + this(query, name, text, List.of(), List.of(), List.of()); + } + } + + /** One attribute a result view binds: query, source, outcome or provenance. */ + public record Field(String name, String value) { + public Field { + Objects.requireNonNull(name); + Objects.requireNonNull(value); + } + } + + public RunResult( + Operation operation, + ModelPath path, + String subject, + Status status, + List outcomes, + List diagnostics, + Optional finalTime, + List schedule, + List
tables, + Duration elapsed) { + this(operation, path, subject, status, outcomes, diagnostics, finalTime, schedule, tables, List.of(), elapsed); + } + public RunResult( Operation operation, ModelPath path, @@ -87,6 +131,7 @@ public RunResult( finalTime = Objects.requireNonNull(finalTime); schedule = List.copyOf(schedule); tables = List.copyOf(tables); + views = List.copyOf(views); Objects.requireNonNull(elapsed); } @@ -106,7 +151,7 @@ public RunResult withOutcomeNames(UnaryOperator rename) { table.rows().stream().map(row -> rename(row, rename)).toList())) .toList(); return new RunResult( - operation, path, subject, status, renamed, diagnostics, finalTime, schedule, renamedTables, elapsed); + operation, path, subject, status, renamed, diagnostics, finalTime, schedule, renamedTables, views, elapsed); } private static Row rename(Row row, UnaryOperator rename) { @@ -122,12 +167,28 @@ public RunResult withLeadingDiagnostics(List leading) { if (leading.isEmpty()) return this; List merged = new ArrayList<>(leading); merged.addAll(diagnostics); - return new RunResult(operation, path, subject, status, outcomes, merged, finalTime, schedule, tables, elapsed); + return new RunResult( + operation, path, subject, status, outcomes, merged, finalTime, schedule, tables, views, elapsed); + } + + /** The result with {@code trailing} after its diagnostics. */ + public RunResult withDiagnostics(List trailing) { + if (trailing.isEmpty()) return this; + List merged = new ArrayList<>(diagnostics); + merged.addAll(trailing); + return new RunResult( + operation, path, subject, status, outcomes, merged, finalTime, schedule, tables, views, elapsed); + } + + /** The result with {@code rendered} in place of its views. */ + public RunResult withViews(List rendered) { + return new RunResult( + operation, path, subject, status, outcomes, diagnostics, finalTime, schedule, tables, rendered, elapsed); } public RunResult withElapsed(Duration total) { return new RunResult( - operation, path, subject, status, outcomes, diagnostics, finalTime, schedule, tables, total); + operation, path, subject, status, outcomes, diagnostics, finalTime, schedule, tables, views, total); } public static RunResult cancelled(RunRequest request) { diff --git a/editors/mdk/plugin/src/test/java/org/openmbee/mdk/magic/ResultViewEndToEndTest.java b/editors/mdk/plugin/src/test/java/org/openmbee/mdk/magic/ResultViewEndToEndTest.java new file mode 100644 index 0000000000..c5c168f8ca --- /dev/null +++ b/editors/mdk/plugin/src/test/java/org/openmbee/mdk/magic/ResultViewEndToEndTest.java @@ -0,0 +1,206 @@ +package org.openmbee.mdk.magic; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.openmbee.mdk.magic.bridge.DocGenBridge; +import org.openmbee.mdk.magic.engine.Engine; +import org.openmbee.mdk.magic.engine.Operation; +import org.openmbee.mdk.magic.engine.RunRequest; +import org.openmbee.mdk.magic.export.ModelExport; +import org.openmbee.mdk.magic.export.ResultViewFiles; +import org.openmbee.mdk.magic.model.ModelPath; +import org.openmbee.mdk.magic.results.RunResult; +import org.openmbee.mdk.magic.results.RunResult.Status; +import org.openmbee.mdk.magic.source.ModelSource; +import org.openmbee.mdk.magic.source.V1MdzipSource; +import org.openmbee.mdk.magic.source.V2TextualSource; +import org.openmbee.opensysml.ConnectionOptions; + +/** Drives "Run query" answers written as QVTS::QueryResult views, and document rendering, through the real service. */ +class ResultViewEndToEndTest { + private static Engine engine; + + @BeforeAll + static void openEngine() { + Path binary = ServiceBinary.required(); + engine = new Engine(() -> ConnectionOptions.builder().binaryPath(binary).build()); + } + + @AfterAll + static void closeEngine() { + if (engine != null) engine.close(); + } + + private static V2TextualSource lander() throws Exception { + Path examples = ServiceBinary.repository().resolve("examples/qvts"); + StringBuilder text = new StringBuilder(); + for (String file : List.of("lander.sysml", "duplicates.sysml", "queries.sysml")) { + text.append(Files.readString(examples.resolve(file))).append('\n'); + } + return new V2TextualSource(text.toString()); + } + + private static RunResult run(ModelSource source, String subject) { + return engine.run(new RunRequest(Operation.RUN_QUERY, source, subject, List.of()), () -> false); + } + + /** A value, an empty selection, a path error and a model error each come back as one view stating its outcome. */ + @Test + void everyOutcomeOfAQueryIsWrittenAsAView() throws Exception { + V2TextualSource source = lander(); + + RunResult cabin = run(source, "QVTSDemo::CabinMass"); + assertEquals(Status.PASSED, cabin.status(), cabin.toString()); + RunResult.View view = cabin.views().get(0); + assertEquals("QVTSDemo::CabinMass", view.query()); + assertEquals("CabinMassResult::cabinMass", view.name()); + assertTrue(view.text().contains("view cabinMass : QueryResult {"), view.text()); + assertTrue(view.text().contains("expose Lander::lander::cabin;"), view.text()); + assertTrue(view.text().contains("attribute :>> query = \"QVTSDemo::CabinMass\";"), view.text()); + assertTrue(view.text().contains("attribute :>> outcome = Outcome::established;"), view.text()); + assertEquals(view.text(), run(source, "QVTSDemo::CabinMass").views().get(0).text(), "the same run writes the same bytes"); + + RunResult empty = run(source, "QVTSDemo::EmptySelection"); + assertEquals(Status.INFO, empty.status(), empty.toString()); + assertTrue(empty.views().get(0).text().contains("Outcome::established"), empty.views().toString()); + assertFalse(empty.views().get(0).text().contains("expose "), "an empty selection exposes nothing"); + + RunResult missing = run(source, "QVTSDemo::MissingMassProject"); + assertEquals(Status.FAILED, missing.status(), missing.toString()); + String pathError = missing.views().get(0).text(); + assertTrue(pathError.contains("attribute :>> outcome = Outcome::pathError;"), pathError); + assertTrue(pathError.contains("expose Lander::lander::cabinEngine;"), "the view exposes where the path stopped: " + pathError); + + RunResult ambiguous = run(source, "QVTSDemo::AmbiguousPart"); + assertEquals(Status.FAILED, ambiguous.status(), ambiguous.toString()); + assertTrue(ambiguous.views().get(0).text().contains("Outcome::modelError"), ambiguous.views().toString()); + } + + /** The files a run's views land in: next to a v2 project, beside the export of a v1 one, named by the query. */ + @Test + void viewsAreWrittenBesideTheModelNamedByQuery() throws Exception { + RunResult cabin = run(lander(), "QVTSDemo::CabinMass"); + Path directory = Files.createTempDirectory("magic-mdk-views"); + Path project = directory.resolve("lander.mdzip"); + + Path anchor = ResultViewFiles.anchor(ModelPath.V2_TEXTUAL, project.toString()).orElseThrow(); + List written = ResultViewFiles.write(anchor, cabin.views()); + assertEquals(List.of(directory.resolve("lander.QVTSDemo.CabinMass.result.sysml")), written); + assertEquals(cabin.views().get(0).text(), Files.readString(written.get(0))); + + assertEquals(project.toAbsolutePath(), ResultViewFiles.anchor(ModelPath.V1_MDZIP, project.toString()).orElseThrow(), + "a v1 project not yet exported keeps its views next to the project"); + Path exported = directory.resolve("out").resolve("fleet.sysml"); + Files.createDirectories(exported.getParent()); + ResultViewFiles.exported(project.toString(), exported); + assertEquals(exported, ResultViewFiles.anchor(ModelPath.V1_MDZIP, project.toString()).orElseThrow()); + assertEquals(project.toAbsolutePath(), ResultViewFiles.anchor(ModelPath.V2_TEXTUAL, project.toString()).orElseThrow()); + assertEquals(List.of(exported.resolveSibling("fleet.QVTSDemo.CabinMass.result.sysml")), + ResultViewFiles.write(exported, cabin.views())); + assertTrue(ResultViewFiles.anchor(ModelPath.V2_TEXTUAL, "").isEmpty(), "an unsaved project has nowhere to write"); + } + + /** The bridge's rendered view lists the elements its DocGen table lists, row for row. */ + @Test + void aRenderedViewAgreesWithTheDocGenTable() throws Exception { + V2TextualSource source = lander(); + RunResult masses = run(source, "QVTSDemo::MassTable"); + assertEquals(Status.PASSED, masses.status(), masses.toString()); + assertTrue(masses.views().get(0).header().isEmpty(), "a view is laid out only on request"); + + RunResult rendered = engine.renderViews(source, masses, () -> false); + RunResult.View view = rendered.views().get(0); + assertEquals(List.of("query", "source", "outcome", "provenance"), + view.header().stream().map(RunResult.Field::name).toList()); + assertEquals("QVTSDemo::MassTable", view.header().get(0).value()); + assertEquals("established", view.header().get(2).value()); + List tableElements = masses.tables().get(0).rows().stream().map(RunResult.Row::elementId).distinct().toList(); + assertFalse(tableElements.isEmpty()); + assertEquals(tableElements, view.rows().stream().map(row -> row.get(0)).toList()); + + Map flat = DocGenBridge.flatten(rendered); + @SuppressWarnings("unchecked") + Map flatView = ((List>) flat.get("views")).get(0); + assertEquals(view.name(), flatView.get("name")); + assertEquals(view.text(), flatView.get("text")); + assertEquals(view.rows(), flatView.get("rows")); + assertEquals(Map.of("name", "outcome", "value", "established"), ((List) flatView.get("header")).get(2)); + } + + /** "Render document…" on a v2 Document and on a QueryResult view writes Markdown and HTML named by what was rendered. */ + @Test + void rendersADocumentAndAResultViewToFiles() throws Exception { + V2TextualSource source = lander(); + Path directory = Files.createTempDirectory("magic-mdk-render"); + + List report = engine.render(source, "QVTSDemo::MassReport", directory, () -> false).orElseThrow(); + assertEquals(List.of(directory.resolve("QVTSDemo.MassReport.md"), directory.resolve("QVTSDemo.MassReport.html")), report); + assertTrue(Files.readString(report.get(0)).contains("# Lander Mass Report"), Files.readString(report.get(0))); + assertTrue(Files.readString(report.get(1)).contains(" view = engine.render(withView, "CabinMassResult::cabinMass", directory, () -> false).orElseThrow(); + assertEquals(directory.resolve("CabinMassResult.cabinMass.md"), view.get(0)); + String markdown = Files.readString(view.get(0)); + assertTrue(markdown.contains("Lander::lander::cabin"), markdown); + assertTrue(markdown.contains("established"), markdown); + assertTrue(Files.readString(view.get(1)).contains("Lander::lander::cabin")); + + IllegalArgumentException neither = assertThrows(IllegalArgumentException.class, + () -> engine.render(source, "Lander::lander", directory, () -> false)); + assertEquals("Lander::lander is neither a DocumentQueries::Document nor a QVTS::QueryResult view", neither.getMessage()); + assertTrue(engine.render(source, "QVTSDemo::MassReport", directory, () -> true).isEmpty(), "a cancelled rendering writes nothing"); + } + + /** The v1 path: a DocGen «Document» renders through the Document the migration wrote for it, and its queries answer as views. */ + @Test + void v1DocGenDocumentRendersAndItsQueriesAnswerAsViews() throws Exception { + Path directory = Files.createTempDirectory("magic-mdk-test"); + Path mdzip = directory.resolve("documents.mdzip"); + try (OutputStream output = Files.newOutputStream(mdzip); ZipOutputStream zip = new ZipOutputStream(output)) { + zip.putNextEntry(new ZipEntry("com.nomagic.magicdraw.uml_model.model")); + zip.write(Files.readAllBytes(ServiceBinary.repository().resolve("tests/migrate/testdata/xmi/documents.xmi"))); + zip.closeEntry(); + } + Path output = Files.createTempDirectory("magic-mdk-output"); + try (V1MdzipSource source = new V1MdzipSource(mdzip, true)) { + RunResult rows = run(source, "Fleet Viewpoints::Parts Viewpoint::Parts Method::Fleet Parts"); + assertEquals(Status.PASSED, rows.status(), rows.toString()); + assertEquals(1, rows.views().size(), rows.toString()); + assertTrue(rows.views().get(0).text().contains("Outcome::established"), rows.views().toString()); + + Path export = output.resolve("fleet.sysml"); + ModelExport.Result exported = engine.export(source, export, existing -> true, () -> false).orElseThrow(); + ResultViewFiles.exported(mdzip.toString(), exported.model()); + Path anchor = ResultViewFiles.anchor(ModelPath.V1_MDZIP, mdzip.toString()).orElseThrow(); + List written = ResultViewFiles.write(anchor, rows.views()); + assertEquals(exported.report().orElseThrow().getParent(), written.get(0).getParent(), + "the view lands beside the migration report"); + assertTrue(written.get(0).getFileName().toString().startsWith("fleet."), written.toString()); + + List rendered = engine.render(source, "Fleet Documents::Fleet Handbook", output.resolve("rendered"), () -> false) + .orElseThrow(); + assertEquals(2, rendered.size(), rendered.toString()); + assertTrue(rendered.get(0).getFileName().toString().endsWith(".md"), rendered.toString()); + assertFalse(Files.readString(rendered.get(0)).isBlank()); + assertTrue(rendered.get(1).getFileName().toString().endsWith(".html"), rendered.toString()); + } + } +} From b64a428ac813c95f77f830655435309cd4a1ea4b Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 18:31:08 +0000 Subject: [PATCH 06/14] docs(qvts): document the QueryResult view across the query, client and MDK surfaces Co-Authored-By: jason.han --- ...k-result-view-and-render-document.added.md | 1 + changes/unreleased/query-result-view.added.md | 1 + .../render-query-result-view.added.md | 1 + docs/guide/qvts.md | 60 +++++++++++++++++++ docs/internals/design/mdk-plugin.md | 35 ++++++++++- docs/project/mdk-parity.md | 14 ++--- docs/reference/api.md | 11 ++++ docs/reference/cli.md | 1 + docs/reference/java-api.md | 25 ++++++++ docs/reference/oslc-query.md | 8 +++ docs/reference/repl-commands.md | 4 +- editors/mdk/README.md | 41 ++++++++++++- 12 files changed, 189 insertions(+), 13 deletions(-) create mode 100644 changes/unreleased/mdk-result-view-and-render-document.added.md create mode 100644 changes/unreleased/query-result-view.added.md create mode 100644 changes/unreleased/render-query-result-view.added.md diff --git a/changes/unreleased/mdk-result-view-and-render-document.added.md b/changes/unreleased/mdk-result-view-and-render-document.added.md new file mode 100644 index 0000000000..73fc8f95aa --- /dev/null +++ b/changes/unreleased/mdk-result-view-and-render-document.added.md @@ -0,0 +1 @@ +- Magic MDK: *Run query* writes each answer as a `QVTS::QueryResult` view in a `.result.sysml` file beside the project (or beside its last SysML v2 export for a v1 project), *Render document…* writes a `DocumentQueries::Document`, a migrated DocGen «Document» or a result view as Markdown and HTML and opens the folder, and the `RunQuery` DocGen extension's `view` tag adds the view to an MDK document as text or as rendered tables. diff --git a/changes/unreleased/query-result-view.added.md b/changes/unreleased/query-result-view.added.md new file mode 100644 index 0000000000..fd90b273b5 --- /dev/null +++ b/changes/unreleased/query-result-view.added.md @@ -0,0 +1 @@ +- Every query surface can write its answer as a `QVTS::QueryResult` view: `sysml -run-query`, `-run-inline-query` and `-query` take `-as-view `, the REPL's `%run-query` and `%query` a leading `-as-view`, and the `RunDocumentQuery` and `Query` RPCs an `as_view` request field that fills `result_view` (capability `query_result_view`; Go, Python and Java clients). The view exposes the selected elements and states the query, source, outcome and provenance; a path or model error — an OSLC query's unknown property included — writes a view of that outcome exposing the elements the failure is about. The `QVTS` library ships with the OpenSysML Libraries. diff --git a/changes/unreleased/render-query-result-view.added.md b/changes/unreleased/render-query-result-view.added.md new file mode 100644 index 0000000000..186a9f3ba2 --- /dev/null +++ b/changes/unreleased/render-query-result-view.added.md @@ -0,0 +1 @@ +- `RenderView` renders a `QVTS::QueryResult` view as a document — its four attributes as the header, the exposed elements as the rows — in Markdown, HTML and AsciiDoc through the request's `form`, and `sysml -render-document` accepts such a view for every document form. diff --git a/docs/guide/qvts.md b/docs/guide/qvts.md index bc10b6c47b..69ce182225 100644 --- a/docs/guide/qvts.md +++ b/docs/guide/qvts.md @@ -241,6 +241,66 @@ The other shipped clients—Go (`client/opensysml`), Julia, MATLAB, Node, Python Jupyter kernel—read the status message but do not yet expose the structured `QueryOutcome` record as a client-level result. The wire message is defined in `api/proto/sysml.proto`. +## Write the answer as a view + +Every query surface can also write what it answered as a model element: one view typed by +`QVTS::QueryResult`, the shape the [QVTS](https://github.com/Open-MBEE/qvts) library gives a +query result. The library ships with OpenSysML (`OpenSysML Libraries/QVTS.sysml`), so the text +parses against any workspace. + +```console +$ bin/sysml examples/qvts/lander.sysml examples/qvts/queries.sysml -run-query QVTSDemo::CabinMass -as-view - +``` + +```sysml +package CabinMassResult { + private import QVTS::*; + + view cabinMass : QueryResult { + expose Lander::lander::cabin; + attribute :>> query = "QVTSDemo::CabinMass"; + attribute :>> source = "examples/qvts/lander.sysml examples/qvts/queries.sysml"; + attribute :>> outcome = Outcome::established; + attribute :>> provenance = "sha256:110e03c52250fab7b72729f2c70e2cf09f2d1777290be6e30270b523b26e12dd"; + } +} +``` + +The view exposes each selected element once, by qualified name, in the order the rows came. +Projected cells are not copied into it: a cell is a value of the exposed element, which a +document over the view reads again. The four attributes are + +| Attribute | Value | +|:--|:--| +| `query` | A named query's qualified name followed by its bindings; an inline query's expression; the SysML v2 API query or OSLC Query text given to `Query`. | +| `source` | The files the model was read from, as the surface knows them; the model hash over the service. | +| `outcome` | `established` for a value — an empty selection included, which exposes nothing — and `pathError` or `modelError` for a query the model has no answer for. | +| `provenance` | The hash of the model the query read, followed by `; step ` naming the step a failed query stopped at. | + +A failed query has no selection, so its view exposes the elements the failure is about instead: +each frontier's `at` for a path error, each finding's element for a model error. A failure +about no element — an OSLC property no element type has — exposes nothing. The same model and +the same query write the same bytes. + +| Surface | How to ask | +|:--|:--| +| `sysml -run-query`, `-run-inline-query`, `-query` | `-as-view ` writes the view to the file beside the usual report; `-as-view -` prints it in place of the rows. A failed query still writes its view and still exits 2. | +| REPL `%run-query`, `%query` | A leading `-as-view` (`%run-query -as-view QVTSDemo::CabinMass`, also before `inline …`) prints the view in place of the rows. | +| gRPC `RunDocumentQuery`, `Query` | `as_view` in the request fills `result_view.text` in the response; a failed query carries a `QueryResultView` status detail beside its `QueryOutcome`. Needs the `query_result_view` capability. | +| Go client | `RunDocumentQueryAsView`, `RunInlineDocumentQueryAsView`, `QueryAsView`, `QueryOSLCAsView`; `StatusError.ResultView` on a failure. | +| Python client | `as_view=True` on `run_document_query` and `query`; `.result_view` on the result and on the error. | +| Java client | `runDocumentQueryAsView`, `runInlineDocumentQueryAsView`, `queryAsView`, `queryOslcAsView`; `QueryOutcomeException.resultView()` on a failure. | +| Magic MDK | *Run query* writes the view beside the project; see [the plugin's README](https://github.com/Open-MBEE/OpenSysML/blob/develop/editors/mdk/README.md). | + +A result view is a view like any other, so it renders once its text is part of the model: +`sysml … -render CabinMassResult::cabinMass` draws it as `RenderView` does, and +`-render-document CabinMassResult::cabinMass -doc-form markdown` (or `html`, `asciidoc`, `pdf`; +`form` on the `RenderView` RPC) writes it as a document, the four attributes as the header and +the exposed elements as the rows of one table. The RPC refuses a document form for a view that +is not a `QVTS::QueryResult`. `examples/qvts/expected/views/` records the view and each +rendered form for the queries of this guide, for an OSLC query and its unknown-property path +error, and for the QVTS repository's own `result.sysml`. + ## Current limits The native query surface has known gaps; the examples record current output rather than changing diff --git a/docs/internals/design/mdk-plugin.md b/docs/internals/design/mdk-plugin.md index 36cfea7834..aa8d50e378 100644 --- a/docs/internals/design/mdk-plugin.md +++ b/docs/internals/design/mdk-plugin.md @@ -880,6 +880,30 @@ the engine, the window or the bridge distinguishes these outcomes from any other window lists them, `DocGenBridge.flatten` carries them, and `DocBookRenderer` writes them as rows of the outcome table, so a DocGen document shows the same failure text. +### 10.8 The answer as a view, and "Render document" + +`Engine.runQuery` asks with `Model.runDocumentQueryAsView`, so each `QueryAnswer` carries the +`QVTS::QueryResult` view the service wrote — in `DocumentQueryResult.resultView()` for rows, in +`QueryOutcomeException.resultView()` for a reported failure — and `ResultsMapper` puts them in +`RunResult.views` as `View(query, name, text)`, `name` being the view's qualified name read +from the text (`results/ResultViews`). The text is the service's and is not rewritten: on the +v1 path it names elements as the migrated model does, which is what it is written beside. + +`OperationActions.writeViews` runs after a run that was not cancelled and hands the views to +`export/ResultViewFiles`: `anchor` is the model file to write beside — the last export of a v1 +project in this session (`ResultViewFiles.exported`, recorded by the export action), else the +project file — and `write` puts each view in `..result.sysml`. The files +are reported as `query-result-view` diagnostics, `INFO` when written and `WARNING` when not. + +*Render document…* (`OperationActions.RenderAction`) asks for a folder on the EDT, exports as +any operation does, and calls `Engine.render` under the progress runner. `DocumentRenderer` +takes the subject and the declarations the migration report maps it to (`mappedTargets`, as +`QueryResolver` does), keeps those that specialize `DocumentQueries::Document` or +`QVTS::QueryResult`, and writes Markdown and HTML for each: `Model.renderDocument` for a +document, `Model.renderView(name, form)` for a result view. Nothing is written when no +candidate is either. The folder is opened with `java.awt.Desktop`, which is JDK, not OpenAPI, +so the compatibility floor is unchanged. + ## 11. Phased plan | Phase | Delivers | Prerequisites in OpenSysML | @@ -1059,7 +1083,16 @@ a `Profile` named `Magic MDK DocGen` under the primary model, applied to it with `org.openmbee.mdk.magic.docgen.{Instantiate,ExecuteAction,ExecuteState,Verify,EvaluateCalc,RunAnalysis,RunQuery}`, each extending `Activity` and `CallBehaviorAction` with a generalization to `«JavaExtension»`; `EvaluateCalc` and `RunQuery` add a `String` tag `arguments` (the calc's argument list; the -query's parameter bindings, §10.7). The action is idempotent and runs inside one +query's parameter bindings, §10.7), and `RunQuery` a `String` tag `view`: `text` adds each +answer's `QVTS::QueryResult` view to the document as SysML, `rendered` as the two tables +`RenderView` lays out — the four attributes, and the exposed elements — so the view's rows are +the elements of the query's own table. The bridge passes the tag through a four-argument +`docGen(BaseElement, String, String, String)` facade only when it is set, so an extension +with no `view` tag still runs against a plugin that has only the three-argument one; the +plugin flattens the views under `views` (`query`, `name`, `text`, `header`, `columns`, +`rows`), and for `rendered` `Engine.renderViews` parses each view's text beside the model and +reads `RenderView`'s header and rows. A project whose `«RunQuery»` predates the tag gets it +added by the same action. The action is idempotent and runs inside one `SessionManager` session so it is a single undo step. ### 14.4 Build and packaging diff --git a/docs/project/mdk-parity.md b/docs/project/mdk-parity.md index 39fdc28d73..2d18a41bf8 100644 --- a/docs/project/mdk-parity.md +++ b/docs/project/mdk-parity.md @@ -28,7 +28,8 @@ operations (JSON export/import, reference tree), and a headless command line. | --- | --- | --- | --- | --- | | Execution and verification | — (MDK executes nothing; the Cameo Simulation Toolkit does) | Instantiate, Execute action, Execute state, Verify, Evaluate calc, Run analysis from the browser and diagram context menus; results window; validation annotations on the elements | **Implemented** | — | | DocGen «JavaExtension» queries | user-written `Query` classes loaded from `extensions/` into a document | one query per OpenSysML operation, rendered as DocBook summary, outcome and diagnostic tables and schedules; stereotypes created on demand | **Bridged** | — | -| DocGen documents from views and viewpoints | SysML v1 views/viewpoints with the DocGen expression library (sections, paragraphs, tables, images, filters) → DocBook → PDF, and View Editor | SysML v2 views, viewpoints and renderings → Markdown, HTML and PDF in the engine (`internal/doc`, `sysml -render-document`); the queries behind them run from Cameo — *Run query* on a `DocumentQueries::Query` definition of a v2 project, or on the DocGen table, list or «Document» of a v1 project the migration wrote over one, with the bindings asked for and the rows shown as a table, selectable and annotated, and a query's path or model error shown per failure and annotated on the element the path stopped at — and the `RunQuery` DocGen extension renders those rows as a DocBook table, and those failures in its outcome table, inside an MDK document; rendering a whole document from Cameo is not reachable | **Partial** (queries **Implemented**, the `RunQuery` extension **Bridged**, whole documents not reachable) | 1 | +| DocGen documents from views and viewpoints | SysML v1 views/viewpoints with the DocGen expression library (sections, paragraphs, tables, images, filters) → DocBook → PDF, and View Editor | SysML v2 views, viewpoints and renderings → Markdown, HTML and PDF in the engine (`internal/doc`, `sysml -render-document`); the queries behind them run from Cameo — *Run query* on a `DocumentQueries::Query` definition of a v2 project, or on the DocGen table, list or «Document» of a v1 project the migration wrote over one, with the bindings asked for and the rows shown as a table, selectable and annotated, and a query's path or model error shown per failure and annotated on the element the path stopped at — and the `RunQuery` DocGen extension renders those rows as a DocBook table, and those failures in its outcome table, inside an MDK document; *Render document…* on a v2 `DocumentQueries::Document`, or on a v1 DocGen «Document» through the definition the migration wrote for it, writes Markdown and HTML and opens the folder; PDF and View Editor are not reachable from Cameo | **Partial** (queries and Markdown/HTML documents **Implemented**, the `RunQuery` extension **Bridged**, PDF not reachable) | 1 | +| Query answers as model elements | — (a DocGen query's result exists only in the generated document) | every *Run query* answer written as a `QVTS::QueryResult` view in a `.result.sysml` file beside the project or its export — selected elements exposed, query, source, outcome and provenance as attributes, path and model errors included; *Render document…* renders such a view; the `RunQuery` extension's `view` tag adds it to an MDK document as text or as rendered tables | **Implemented** (the extension **Bridged**) | — | | Publish the model to MMS/Flexo | *Commit* of the project's elements as MMS JSON, per project and per branch | RDF export of a v2 model that loads into Flexo MMS (`internal/translate/export`; measured by `TestFlexoInterop`); one-way, not reachable from Cameo | **Partial** | 2 | | Validate the model against MMS and fix | element-by-element diff between Cameo and MMS, listed in a validation window with *Commit*/*Update* fixes | nothing: no element-level diff, no update from Flexo into Cameo | **Not yet** | 4 | | Branches, tags and project mounts in MMS | create/switch MMS branches and tags, keep mounted modules in sync | nothing | **Not yet** | 4 | @@ -44,12 +45,11 @@ operations (JSON export/import, reference tree), and a headless command line. ## The order, and why -1. **SysML v2 documents in Cameo.** A *Generate document* action on a v2 project's view or - viewpoint that runs the engine's document renderer and opens the result. The engine already - produces Markdown, HTML and PDF from v2 views, and *Run query* now runs the queries those - documents are built from, from Cameo and from MDK DocGen; what is missing is the export of the - selected document and the file handoff, both of which the existing `ModelSource`/`Engine` path - provides. This is DocGen's purpose for v2 models and needs nothing from MMS. One session. +1. **SysML v2 documents in Cameo.** *Render document…* renders a v2 document, a migrated v1 + DocGen «Document» or a `QVTS::QueryResult` view as Markdown and HTML and opens the folder, + and *Run query* writes each answer as such a view. What is left is PDF, whose converters the + plugin does not ship, and rendering a v2 view or viewpoint that is not a + `DocumentQueries::Document`. This is DocGen's purpose for v2 models and needs nothing from MMS. 2. **Publish to Flexo.** A *Publish to Flexo MMS* action that runs the RDF export and loads it into a configured Flexo repository and branch. The export and its Flexo compatibility are measured already (`docs/project/rdf-corpus-roundtrip.md`, `TestFlexoInterop`); the work is diff --git a/docs/reference/api.md b/docs/reference/api.md index b9b57c63f3..44a9109749 100644 --- a/docs/reference/api.md +++ b/docs/reference/api.md @@ -1307,6 +1307,17 @@ for a query written in the request. Python: (`client/python/opensysml/document.py`). The JSON shape of a binding and of the result table, captured, is on [the wire contract](wire-contract.md#rundocumentquery). +`RunDocumentQueryRequest.as_view` and `QueryRequest.as_view` ask for the answer written as a +`QVTS::QueryResult` view as well ([QVTS guide](../guide/qvts.md#write-the-answer-as-a-view)): +the response's `result_view` is a `QueryResultView` whose `text` is the SysML declaring it, +absent when the request did not ask, and a query that fails with a `QueryOutcome` detail +carries a `QueryResultView` detail beside it. `RenderViewRequest.form` (`markdown`, `html` or +`asciidoc`) renders such a view as a document: `RenderViewResponse.header` holds its four +attributes as `RenderHeaderField`s and `markdown`, `html` or `asciidoc` the text; a view of +another definition is refused with `INVALID_ARGUMENT`. All of it is advertised as +`query_result_view`; a service without the capability does not know the fields, so a client +checks the capability before asking. + Both name a loaded model by its hash and a definition by qualified name, and compose the engine packages the REPL and CLI compose — `queryplan` → `queryexec` for a query, `docplan` → `docir` → `docrender` for a document — so diff --git a/docs/reference/cli.md b/docs/reference/cli.md index a9da662441..3f071ce6e4 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -332,6 +332,7 @@ written in, so the verdicts are about that object: | `-import-dry-run` | Reports the values `-import` would set and changes and writes nothing | | `-run-query " [

=...]"` | Executes a document query and reports its rows, as `%run-query` does — including any computed `Column` using `expression`, `cell`, or `path` and relationship-derived `RelatedColumn(...)` projections evaluated per row — a `Column` expression may be a feature chain (`stat.runs`, `'Monte Carlo'.runs`) reading a feature of a member nested in the row element, as may a `properties`/`property` string. Each binding is written as `=`; a name binds the object `-instantiate` created under it while the run holds one (`#2` and `car.wheels[2]` bind an object by id and by path), and the element otherwise. A query over `Verdicts` reports each row as ` on : ` ([Which constraints and requirements hold](../manual/query-cookbook.md#which-constraints-and-requirements-hold)). The queries run after `-state`, `-action` and `-advance` have run, so `States`, `InState` and `Events` read where the run left the objects and, with `-trace`, what it recorded — a state row as `. in `, an event row as `t= .: ` ([Where the objects stand and what they did](../manual/query-cookbook.md#where-the-objects-stand-and-what-they-did)). With `-json` the check's `values` carry the row and column counts and its `table` the rows as data: `columns` in order, and per row its `element` and `cells` — per column, the values the cell holds as the prompt spells them (none for an empty cell, several for a collection; an element the conversion wrote is spelled by the address the conversion stated for it, as stated (a reserved-word name bare, `…::function`, not the notation's `'function'`): its qualified name, through an effective name too — a `return` parameter's `result`, a requirement under a nameless objective's `obj` — or, where the conversion addresses it by position, such as a metadata body's restated feature under its anonymous usage or a part under an unnamed part, its `elementId`) | | `-run-inline-query ''` | Executes a query expression written in place of a named query — the result expression of a `calc def` specializing `DocumentQueries::Query`, `Project(WhereType(Descendants(Named("Vehicles")), "PartUsage"), ("name", "mass"))` — and reports its rows exactly as `-run-query` does, through the same compiler and executor, in the loaded model's context: the `DocumentQueries` library imported, the model's own names reachable (`Descendants(Vehicles::car)` as well as `Named("Vehicles::car")`), and the objects `-instantiate` created behind `Objects`, `Verdicts`, `States` and `Events`. The two flags interleave in the order written and may repeat. The check is reported as `Inline query`, and with `-json` its `subject` is the expression. Text that does not parse or plan is reported at its line and column in the expression (`inline query 1:30: expected ')'`, with the expression and a caret under the position), apart from the model's diagnostics; a path or model fault keeps its QVTS outcome record, as a named query's does ([QVTS guide](../guide/qvts.md#write-the-query-inline)) | +| `-as-view ` | With `-run-query`, `-run-inline-query` or `-query`: writes each answer as a `QVTS::QueryResult` view — the selected elements exposed, and the query, source, outcome and provenance as its attributes — into the file beside the usual report, or with `-` prints it in place of the rows. A query that fails with a path or model error writes the view of that outcome and still exits 2 ([Write the answer as a view](../guide/qvts.md#write-the-answer-as-a-view)). | | `-action " [object]"` | Runs an action to completion and reports its outputs, on the object named as `-state` names its performer when one is; under `-schedule explore` each run performs it on an object of its own ([Objects an exploration runs on](#objects-an-exploration-runs-on)) | | `-state " [object]"` | Runs a state machine and reports where it settled. The object is one `-instantiate` created, named as `%state` names it: a usage's name, a feature path to a part it holds (`Fleet::driver.r`), or the id the report prints (`#2`). Naming the machine the object exhibits attaches to its running machine rather than performing it again (a definition exhibited as several usages is refused with the usages to name instead); naming a usage whose definition alone was instantiated says which usage to `-instantiate`. Under `-schedule explore` the object is one each run creates of its own: a definition or usage to instantiate, a path from one into a part it holds (`Mission::mission.vehicle`, `Fleet::fleet.rovers[2]`) or, named alone, the run's one `-instantiate` object exhibiting the machine ([Objects an exploration runs on](#objects-an-exploration-runs-on)) | | `-advance