@alis-build/a2a 1.0.494 → 1.0.501
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/lf/a2a/v1/a2a_grpc_pb.d.ts +3 -3
- package/lf/a2a/v1/a2a_grpc_pb.js +5 -5
- package/lf/a2a/v1/a2a_grpc_web_pb.d.ts +2 -1
- package/lf/a2a/v1/a2a_grpc_web_pb.js +4 -3
- package/lf/a2a/v1/a2a_pb.d.ts +4 -4
- package/lf/a2a/v1/a2a_pb.js +4 -4
- package/package.json +1 -1
- package/transport/jsonrpc/client.ts +303 -0
- package/transport/jsonrpc/errors.ts +101 -0
- package/transport/jsonrpc/index.ts +30 -0
- package/transport/jsonrpc/sse.ts +174 -0
- package/transport/jsonrpc/types.ts +89 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alis Exchange
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# a2a-ts
|
|
2
|
+
|
|
3
|
+
TypeScript client and types for the Agent-to-Agent (A2A) API. Uses JSON-RPC 2.0 over HTTP with support for both unary and streaming (SSE) operations.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @alis-build/a2a
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { A2AClient } from "@alis-build/a2a/transport/jsonrpc";
|
|
15
|
+
|
|
16
|
+
const client = new A2AClient({
|
|
17
|
+
baseUrl: "https://api.example.com",
|
|
18
|
+
getToken: async () => "your-bearer-token", // optional
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Unary: send message, wait for full response
|
|
22
|
+
const response = await client.sendMessage({
|
|
23
|
+
message: { text: { text: "Hello" } },
|
|
24
|
+
configuration: { acceptedOutputModesList: ["text"], blocking: true },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Streaming: send message, receive incremental updates
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
for await (const event of client.sendStreamingMessage(
|
|
30
|
+
{
|
|
31
|
+
message: { text: { text: "Hello" } },
|
|
32
|
+
configuration: { acceptedOutputModesList: ["text"], blocking: false },
|
|
33
|
+
},
|
|
34
|
+
controller.signal
|
|
35
|
+
)) {
|
|
36
|
+
console.log(event);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Transport (`transport/jsonrpc`)
|
|
41
|
+
|
|
42
|
+
The JSON-RPC transport provides:
|
|
43
|
+
|
|
44
|
+
| Mode | Methods | Use case |
|
|
45
|
+
| ---------- | ------------------------------------------------------------- | --------------------------------- |
|
|
46
|
+
| **Unary** | `sendMessage`, `getTask`, `listTasks`, `cancelTask`, etc. | Single request/response |
|
|
47
|
+
| **Streaming** | `sendStreamingMessage`, `subscribeToTask` | Incremental updates via SSE |
|
|
48
|
+
|
|
49
|
+
### Architecture
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
A2AClient
|
|
53
|
+
├── request() → POST JSON-RPC → parse single JSON response
|
|
54
|
+
└── stream() → POST JSON-RPC → readSseStream() → yield each SSE frame as JSON-RPC response
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Error Handling
|
|
58
|
+
|
|
59
|
+
- **`JsonRpcTransportError`**: Network failures, non-2xx HTTP, stream read errors. Has optional `status` for HTTP status code.
|
|
60
|
+
- **`JsonRpcProtocolError`**: Server returned a JSON-RPC error object. Use `code` or `instanceof` for typed handling:
|
|
61
|
+
- `TaskNotFoundError` (-32001)
|
|
62
|
+
- `TaskNotCancelableError` (-32002)
|
|
63
|
+
- `PushNotificationNotSupportedError` (-32003)
|
|
64
|
+
- `UnsupportedOperationError` (-32004)
|
|
65
|
+
- `ContentTypeNotSupportedError` (-32005)
|
|
66
|
+
- `InvalidAgentResponseError` (-32006)
|
|
67
|
+
- `ExtendedCardNotConfiguredError` (-32007)
|
|
68
|
+
- `UnauthenticatedError` (-31401)
|
|
69
|
+
- `UnauthorizedError` (-31403)
|
|
70
|
+
|
|
71
|
+
### Exports
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// Client and config
|
|
75
|
+
import { A2AClient } from "@alis-build/a2a/transport/jsonrpc";
|
|
76
|
+
import type { A2AClientConfig } from "@alis-build/a2a/transport/jsonrpc";
|
|
77
|
+
|
|
78
|
+
// Errors
|
|
79
|
+
import {
|
|
80
|
+
JsonRpcProtocolError,
|
|
81
|
+
JsonRpcTransportError,
|
|
82
|
+
TaskNotFoundError,
|
|
83
|
+
UnauthenticatedError,
|
|
84
|
+
// ... other typed errors
|
|
85
|
+
} from "@alis-build/a2a/transport/jsonrpc";
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Dependencies
|
|
89
|
+
|
|
90
|
+
- `google-protobuf` – Protobuf types for A2A messages
|
|
91
|
+
- `@alis-build/google-common-protos` – Google common protos
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
See project LICENSE file.
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
// package: lf.a2a.v1
|
|
4
4
|
// file: lf/a2a/v1/a2a.proto
|
|
5
5
|
|
|
6
|
-
import * as lf_a2a_v1_a2a_pb from "
|
|
6
|
+
import * as lf_a2a_v1_a2a_pb from "../../../lf/a2a/v1/a2a_pb";
|
|
7
7
|
import * as google_protobuf_empty_pb from "google-protobuf/google/protobuf/empty_pb";
|
|
8
|
-
import * as grpc from "
|
|
8
|
+
import * as grpc from "grpc";
|
|
9
9
|
|
|
10
10
|
interface IA2AServiceService extends grpc.ServiceDefinition<grpc.UntypedServiceImplementation> {
|
|
11
11
|
sendMessage: grpc.MethodDefinition<lf_a2a_v1_a2a_pb.SendMessageRequest, lf_a2a_v1_a2a_pb.SendMessageResponse>;
|
|
@@ -70,4 +70,4 @@ export class A2AServiceClient extends grpc.Client {
|
|
|
70
70
|
deleteTaskPushNotificationConfig(argument: lf_a2a_v1_a2a_pb.DeleteTaskPushNotificationConfigRequest, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
|
|
71
71
|
deleteTaskPushNotificationConfig(argument: lf_a2a_v1_a2a_pb.DeleteTaskPushNotificationConfigRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
|
|
72
72
|
deleteTaskPushNotificationConfig(argument: lf_a2a_v1_a2a_pb.DeleteTaskPushNotificationConfigRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<google_protobuf_empty_pb.Empty>): grpc.ClientUnaryCall;
|
|
73
|
-
}
|
|
73
|
+
}
|
package/lf/a2a/v1/a2a_grpc_pb.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
// Older protoc compilers don't understand edition yet.
|
|
5
5
|
'use strict';
|
|
6
6
|
var grpc = require('@grpc/grpc-js');
|
|
7
|
-
var lf_a2a_v1_a2a_pb = require('
|
|
8
|
-
var google_api_annotations_pb = require('
|
|
9
|
-
var google_api_client_pb = require('
|
|
10
|
-
var google_api_field_behavior_pb = require('
|
|
7
|
+
var lf_a2a_v1_a2a_pb = require('../../../lf/a2a/v1/a2a_pb.js');
|
|
8
|
+
var google_api_annotations_pb = require('../../../google/api/annotations_pb.js');
|
|
9
|
+
var google_api_client_pb = require('../../../google/api/client_pb.js');
|
|
10
|
+
var google_api_field_behavior_pb = require('../../../google/api/field_behavior_pb.js');
|
|
11
11
|
var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js');
|
|
12
12
|
var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js');
|
|
13
13
|
var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js');
|
|
@@ -344,4 +344,4 @@ deleteTaskPushNotificationConfig: {
|
|
|
344
344
|
},
|
|
345
345
|
};
|
|
346
346
|
|
|
347
|
-
exports.A2AServiceClient = grpc.makeGenericClientConstructor(A2AServiceService, 'A2AService');
|
|
347
|
+
exports.A2AServiceClient = grpc.makeGenericClientConstructor(A2AServiceService, 'A2AService');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as grpcWeb from 'grpc-web';
|
|
2
2
|
|
|
3
3
|
import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto"
|
|
4
|
-
import * as lf_a2a_v1_a2a_pb from '
|
|
4
|
+
import * as lf_a2a_v1_a2a_pb from '../../../lf/a2a/v1/a2a_pb'; // proto import: "lf/a2a/v1/a2a.proto"
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
export class A2AServiceClient {
|
|
@@ -145,3 +145,4 @@ export class A2AServicePromiseClient {
|
|
|
145
145
|
): Promise<google_protobuf_empty_pb.Empty>;
|
|
146
146
|
|
|
147
147
|
}
|
|
148
|
+
|
|
@@ -20,11 +20,11 @@ const grpc = {};
|
|
|
20
20
|
grpc.web = require('grpc-web');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var google_api_annotations_pb = require('
|
|
23
|
+
var google_api_annotations_pb = require('../../../google/api/annotations_pb.js')
|
|
24
24
|
|
|
25
|
-
var google_api_client_pb = require('
|
|
25
|
+
var google_api_client_pb = require('../../../google/api/client_pb.js')
|
|
26
26
|
|
|
27
|
-
var google_api_field_behavior_pb = require('
|
|
27
|
+
var google_api_field_behavior_pb = require('../../../google/api/field_behavior_pb.js')
|
|
28
28
|
|
|
29
29
|
var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js')
|
|
30
30
|
|
|
@@ -750,3 +750,4 @@ proto.lf.a2a.v1.A2AServicePromiseClient.prototype.deleteTaskPushNotificationConf
|
|
|
750
750
|
|
|
751
751
|
|
|
752
752
|
module.exports = proto.lf.a2a.v1;
|
|
753
|
+
|
package/lf/a2a/v1/a2a_pb.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as jspb from 'google-protobuf'
|
|
2
2
|
|
|
3
|
-
import * as google_api_annotations_pb from '
|
|
4
|
-
import * as google_api_client_pb from '
|
|
5
|
-
import * as google_api_field_behavior_pb from '
|
|
3
|
+
import * as google_api_annotations_pb from '../../../google/api/annotations_pb'; // proto import: "google/api/annotations.proto"
|
|
4
|
+
import * as google_api_client_pb from '../../../google/api/client_pb'; // proto import: "google/api/client.proto"
|
|
5
|
+
import * as google_api_field_behavior_pb from '../../../google/api/field_behavior_pb'; // proto import: "google/api/field_behavior.proto"
|
|
6
6
|
import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto"
|
|
7
7
|
import * as google_protobuf_struct_pb from 'google-protobuf/google/protobuf/struct_pb'; // proto import: "google/protobuf/struct.proto"
|
|
8
8
|
import * as google_protobuf_timestamp_pb from 'google-protobuf/google/protobuf/timestamp_pb'; // proto import: "google/protobuf/timestamp.proto"
|
|
@@ -1591,4 +1591,4 @@ export enum Role {
|
|
|
1591
1591
|
ROLE_UNSPECIFIED = 0,
|
|
1592
1592
|
ROLE_USER = 1,
|
|
1593
1593
|
ROLE_AGENT = 2,
|
|
1594
|
-
}
|
|
1594
|
+
}
|
package/lf/a2a/v1/a2a_pb.js
CHANGED
|
@@ -15,11 +15,11 @@ var jspb = require('google-protobuf');
|
|
|
15
15
|
var goog = jspb;
|
|
16
16
|
var global = globalThis;
|
|
17
17
|
|
|
18
|
-
var google_api_annotations_pb = require('
|
|
18
|
+
var google_api_annotations_pb = require('../../../google/api/annotations_pb.js');
|
|
19
19
|
goog.object.extend(proto, google_api_annotations_pb);
|
|
20
|
-
var google_api_client_pb = require('
|
|
20
|
+
var google_api_client_pb = require('../../../google/api/client_pb.js');
|
|
21
21
|
goog.object.extend(proto, google_api_client_pb);
|
|
22
|
-
var google_api_field_behavior_pb = require('
|
|
22
|
+
var google_api_field_behavior_pb = require('../../../google/api/field_behavior_pb.js');
|
|
23
23
|
goog.object.extend(proto, google_api_field_behavior_pb);
|
|
24
24
|
var google_protobuf_empty_pb = require('google-protobuf/google/protobuf/empty_pb.js');
|
|
25
25
|
goog.object.extend(proto, google_protobuf_empty_pb);
|
|
@@ -12567,4 +12567,4 @@ proto.lf.a2a.v1.Role = {
|
|
|
12567
12567
|
goog.object.extend(exports, proto.lf.a2a.v1);
|
|
12568
12568
|
|
|
12569
12569
|
// Below is base64 encoded GeneratedCodeInfo proto
|
|
12570
|
-
// Ch8KAgQAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO8pIIcqCh8KAgQBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKUwIKkwCh8KAgQCEhNsZi9hMmEvdjEvYTJhLnByb3RvGPc1IIE2Ch8KAgQDEhNsZi9hMmEvdjEvYTJhLnByb3RvGME7IMU7Ch8KAgQEEhNsZi9hMmEvdjEvYTJhLnByb3RvGJBBIJdBCh8KAgQFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPFGIPlGCh8KAgQGEhNsZi9hMmEvdjEvYTJhLnByb3RvGNdMIOxMCh8KAgQHEhNsZi9hMmEvdjEvYTJhLnByb3RvGM1SIORSCh8KAgQIEhNsZi9hMmEvdjEvYTJhLnByb3RvGMtYIN1YCh8KAgQJEhNsZi9hMmEvdjEvYTJhLnByb3RvGLVeIMNeCh8KAgQKEhNsZi9hMmEvdjEvYTJhLnByb3RvGI9kIJhkCh8KAgQLEhNsZi9hMmEvdjEvYTJhLnByb3RvGPppIIdqCh8KAgQMEhNsZi9hMmEvdjEvYTJhLnByb3RvGNBvIOFvCh8KAgQNEhNsZi9hMmEvdjEvYTJhLnByb3RvGON1IPF1Ch8KAgQOEhNsZi9hMmEvdjEvYTJhLnByb3RvGL17IMd7CiEKAgQPEhNsZi9hMmEvdjEvYTJhLnByb3RvGK2BASC/gQEKIQoCBBASE2xmL2EyYS92MS9hMmEucHJvdG8Yl4cBILGHAQohCgIEERITbGYvYTJhL3YxL2EyYS5wcm90bxihjQEgq40BCiEKAgQSEhNsZi9hMmEvdjEvYTJhLnByb3RvGJGTASCkkwEKIQoCBBMSE2xmL2EyYS92MS9hMmEucHJvdG8Y/5gBII2ZAQohCgIEFBITbGYvYTJhL3YxL2EyYS5wcm90bxiAnwEglJ8BCiEKAgQVEhNsZi9hMmEvdjEvYTJhLnByb3RvGPKkASCIpQEKIQoCBBYSE2xmL2EyYS92MS9hMmEucHJvdG8Y7KoBIICrAQohCgIEFxITbGYvYTJhL3YxL2EyYS5wcm90bxjesAEg+bABCiEKAgQYEhNsZi9hMmEvdjEvYTJhLnByb3RvGOy2ASCDtwEKIQoCBBkSE2xmL2EyYS92MS9hMmEucHJvdG8Y6rwBIPS8AQohCgIEGhITbGYvYTJhL3YxL2EyYS5wcm90bxjXwgEg8cIBCiEKAgQbEhNsZi9hMmEvdjEvYTJhLnByb3RvGOHIASD7yAEKIQoCBBwSE2xmL2EyYS92MS9hMmEucHJvdG8Y684BIPzOAQohCgIEHRITbGYvYTJhL3YxL2EyYS5wcm90bxjR1AEg4tQBCiEKAgQeEhNsZi9hMmEvdjEvYTJhLnByb3RvGLfaASDK2gEKIQoCBB8SE2xmL2EyYS92MS9hMmEucHJvdG8YpeABILfgAQohCgIEIBITbGYvYTJhL3YxL2EyYS5wcm90bxiP5gEgneYBCiEKAgQhEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnrASD56wEKIQoCBCISE2xmL2EyYS92MS9hMmEucHJvdG8Yy/EBINzxAQohCgIEIxITbGYvYTJhL3YxL2EyYS5wcm90bxje9wEg7/cBCiEKAgQkEhNsZi9hMmEvdjEvYTJhLnByb3RvGMT9ASDo/QEKIQoCBCUSE2xmL2EyYS92MS9hMmEucHJvdG8Y9oMCIJ2EAgohCgIEJhITbGYvYTJhL3YxL2EyYS5wcm90bxi0igIgyooCCiEKAgQnEhNsZi9hMmEvdjEvYTJhLnByb3RvGK6QAiDUkAIKIQoCBCgSE2xmL2EyYS92MS9hMmEucHJvdG8Y6JYCIIOXAgohCgIEKRITbGYvYTJhL3YxL2EyYS5wcm90bxj2nAIgiZ0CCiEKAgQqEhNsZi9hMmEvdjEvYTJhLnByb3RvGJCjAiCeowIKIQoCBCsSE2xmL2EyYS92MS9hMmEucHJvdG8YkakCILipAgojCgQEAAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIjVAiCi1QIKIwoEBAACABITbGYvYTJhL3YxL2EyYS5wcm90bxio1wIgwtcCCiMKBAQAAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyNkCIN7ZAgojCgQEAAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPjbAiCU3AIKIwoEBAACARITbGYvYTJhL3YxL2EyYS5wcm90bxiV3gIgst4CCiMKBAQAAgESE2xmL2EyYS92MS9hMmEucHJvdG8YquECIMfhAgojCgQEAAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjjAiDn4wIKIwoEBAACARITbGYvYTJhL3YxL2EyYS5wcm90bxiq5QIgx+UCCiMKBAQAAgISE2xmL2EyYS92MS9hMmEucHJvdG8YgucCIJLnAgojCgQEAAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGI7pAiCe6QIKIwoEBAACAhITbGYvYTJhL3YxL2EyYS5wcm90bxiQ6wIgousCCiMKBAQAAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y4ewCIPHsAgojCgQEAAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGKbuAiCx7gIKIwoEBAACAxITbGYvYTJhL3YxL2EyYS5wcm90bxi68AIgxfACCiMKBAQBAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsJ0DILWdAwojCgQEAQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIqfAyCPnwMKIwoEBAECARITbGYvYTJhL3YxL2EyYS5wcm90bxjDoAMgz6ADCiMKBAQBAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpKIDILCiAwojCgQEAQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGPmjAyCCpAMKIwoEBAECAhITbGYvYTJhL3YxL2EyYS5wcm90bxiipgMgq6YDCiMKBAQBAgISE2xmL2EyYS92MS9hMmEucHJvdG8YhKgDII+oAwojCgQEAQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGKqpAyCzqQMKIwoEBAECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjzqgMgg6sDCiMKBAQBAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yq60DILutAwojCgQEAQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLGvAyC9rwMKIwoEBAECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjYsQMg6rEDCiMKBAQBAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YmbMDIKezAwojCgQEAQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGMy1AyDatQMKIwoEBAECBBITbGYvYTJhL3YxL2EyYS5wcm90bxjOtwMg2LcDCiMKBAQBAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y8rkDIIK6AwojCgQEAQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLy7AyDHuwMKIwoEBAECBRITbGYvYTJhL3YxL2EyYS5wcm90bxjxvQMg/L0DCiMKBAQBAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y1b8DIOK/AwojCgQEAQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGP/AAyCKwQMKIwoEBAICABITbGYvYTJhL3YxL2EyYS5wcm90bxiI5AMgkOQDCiMKBAQCAgASE2xmL2EyYS92MS9hMmEucHJvdG8YmOYDIKDmAwojCgQEAgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOjnAyDy5wMKIwoEBAICARITbGYvYTJhL3YxL2EyYS5wcm90bxiV6gMgn+oDCiMKBAQCAgESE2xmL2EyYS92MS9hMmEucHJvdG8YhOwDIJDsAwojCgQEAgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLLtAyC87QMKIwoEBAICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiS7wMgnu8DCiMKBAQCAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y4PEDIOzxAwojCgQEAgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNHzAyDf8wMKIwoEBAICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiD9QMgj/UDCiMKBAQDAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyPkDIMz5AwojCgQEAwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNP5AyDW+QMKIwoEBAMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjd+QMg4PkDCiMKBAQDAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y5/kDIOv5AwojCgQEAwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIKnBCCJpwQKIwoEBAMCABITbGYvYTJhL3YxL2EyYS5wcm90bxjeqAQg5agECiMKBAQDAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y2qoEIOOqBAojCgQEAwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLmsBCDArAQKIwoEBAMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjqrQQg8K0ECiMKBAQDAgESE2xmL2EyYS92MS9hMmEucHJvdG8YxbQEIMu0BAojCgQEAwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMC2BCDItgQKIwoEBAMCARITbGYvYTJhL3YxL2EyYS5wcm90bxieuAQgpLgECiMKBAQDAgISE2xmL2EyYS92MS9hMmEucHJvdG8YwbkEIMe5BAojCgQEAwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJy7BCCiuwQKIwoEBAMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiXvQQgn70ECiMKBAQDAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9b4EIPu+BAojCgQEAwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGL7ABCDFwAQKIwoEBAMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjswgQg88IECiMKBAQDAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y98QEIIDFBAojCgQEAwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJnGBCCgxgQKIwoEBAMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjpxwQg9McECiMKBAQDAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YnsoEIKnKBAojCgQEAwIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGILMBCCPzAQKIwoEBAMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxiszQQgt80ECiMKBAQDAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y2c4EIOTOBAojCgQEAwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLnQBCDE0AQKIwoEBAMCBhITbGYvYTJhL3YxL2EyYS5wcm90bxj40QQghNIECiMKBAQDAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Y2dMEIOXTBAojCgQEBAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMiDBSDUgwUKIwoEBAQCABITbGYvYTJhL3YxL2EyYS5wcm90bxivhQUgu4UFCiMKBAQEAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y8oYFIP6GBQojCgQEBAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNmIBSDliAUKIwoEBAQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiZigUgoooFCiMKBAQEAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y/YsFIIaMBQojCgQEBAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMSNBSDLjQUKIwoEBAQCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjDjwUgyo8FCiMKBAQEAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Yj5EFIJuRBQojCgQEBAIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGL2TBSDJkwUKIwoEBAQCBBITbGYvYTJhL3YxL2EyYS5wcm90bxi6lQUgwpUFCiMKBAQEAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y35cFIO2XBQojCgQEBAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGKiZBSCzmQUKIwoEBAQCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjjmwUg7psFCiMKBAQEAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YzZ0FINqdBQojCgQEBAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPqeBSCFnwUKIwoEBAQCBhITbGYvYTJhL3YxL2EyYS5wcm90bxi0oAUgxaAFCiMKBAQEAgYSE2xmL2EyYS92MS9hMmEucHJvdG8YqaIFILqiBQojCgQEBAIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ6kBSCrpAUKIwoEBAQCBhITbGYvYTJhL3YxL2EyYS5wcm90bxijpgUgtqYFCiMKBAQEAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Y4acFIPinBQojCgQEBAIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGNypBSDzqQUKIwoEBAQCBxITbGYvYTJhL3YxL2EyYS5wcm90bxjXqwUg6qsFCiMKBAQEAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Y4q0FIPutBQojCgQEBQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGOzYBSD52AUKIwoEBAUCABITbGYvYTJhL3YxL2EyYS5wcm90bxjW2gUg49oFCiMKBAQFAgESE2xmL2EyYS92MS9hMmEucHJvdG8YldwFIJzcBQojCgQEBQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPndBSCA3gUKIwoEBAUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi53wUgx98FCiMKBAQFAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpOEFILLhBQojCgQEBQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGPriBSCG4wUKIwoEBAUCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiq5QUgtuUFCiMKBAQFAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YqOcFILDnBQojCgQEBQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGM/pBSDd6QUKIwoEBAUCBBITbGYvYTJhL3YxL2EyYS5wcm90bxiZ6wUgpOsFCiMKBAQFAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y1u0FIOHtBQojCgQEBQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGMLvBSDP7wUKIwoEBAUCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjw8AUg+/AFCiMKBAQFAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yq/IFILzyBQojCgQEBQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGKL0BSCz9AUKIwoEBAUCBRITbGYvYTJhL3YxL2EyYS5wcm90bxiZ9gUgpvYFCiMKBAQFAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YoPgFILP4BQojCgQEBgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNGeBiDangYKIwoEBAYCABITbGYvYTJhL3YxL2EyYS5wcm90bxjRoAYg2qAGCiMKBAQGAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yn6IGIKuiBgojCgQEBgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKKkBiCupAYKIwoEBAYCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiIpgYgkaYGCiMKBAQGAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y06gGINyoBgojCgQEBgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNeqBiDiqgYKIwoEBAYCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiOrAYgl6wGCiMKBAQGAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y8a0GIPytBgojCgQEBgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMiwBiDTsAYKIwoEBAYCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjOsgYg27IGCiMKBAQGAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YibQGIJS0BgojCgQEBwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGP3eBiCG3wYKIwoEBAcCABITbGYvYTJhL3YxL2EyYS5wcm90bxiB4QYgiuEGCiMKBAQHAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y0eIGIN3iBgojCgQEBwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNjkBiDk5AYKIwoEBAcCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi+5gYgyeYGCiMKBAQHAgISE2xmL2EyYS92MS9hMmEucHJvdG8YiekGIJTpBgojCgQEBwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJPrBiCg6wYKIwoEBAcCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjQ7AYg2+wGCiMKBAQHAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yje4GIJbuBgojCgQEBwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ3wBiCm8AYKIwoEBAcCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjt8QYg+fEGCiMKBAQHAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YgPQGIIz0BgojCgQEBwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPn1BiCE9gYKIwoEBAcCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjU+AYg3/gGCiMKBAQHAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y3voGIOv6BgojCgQEBwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJv8BiCm/AYKIwoEBAgCABITbGYvYTJhL3YxL2EyYS5wcm90bxiZmwcgopsHCiMKBAQIAgASE2xmL2EyYS92MS9hMmEucHJvdG8Yk50HIJydBwojCgQECAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGN+eByDtngcKIwoEBAgCARITbGYvYTJhL3YxL2EyYS5wcm90bxjeoAcg7KAHCiMKBAQJAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y/sMHIITEBwojCgQECQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO3FByDzxQcKIwoEBAkCARITbGYvYTJhL3YxL2EyYS5wcm90bxi3xwcgyccHCiMKBAQJAgESE2xmL2EyYS92MS9hMmEucHJvdG8YsskHIMTJBwojCgQECQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGP7KByCHywcKIwoEBAkCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjwzAcg+cwHCiMKBAQJAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yvc4HIM/OBwojCgQECQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLjQByDK0AcKIwoEBAoCABITbGYvYTJhL3YxL2EyYS5wcm90bxjmmwgg7ZsICiMKBAQKAgASE2xmL2EyYS92MS9hMmEucHJvdG8YzJ0IINOdCAojCgQECgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGI2fCCCbnwgKIwoEBAoCARITbGYvYTJhL3YxL2EyYS5wcm90bxj6oAggiKEICiMKBAQKAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9KIIII6jCAojCgQECgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNKlCCDspQgKIwoEBAoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjzpwggiagICiMKBAQKAgISE2xmL2EyYS92MS9hMmEucHJvdG8YtKoIINCqCAojCgQECgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJOsCCCerAgKIwoEBAoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjRrggg3K4ICiMKBAQKAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yv7AIIMywCAojCgQECgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGO6xCCD5sQgKIwoEBAoCBBITbGYvYTJhL3YxL2EyYS5wcm90bxifswggqbMICiMKBAQKAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YiLUIIJK1CAojCgQECgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGNK2CCDltggKIwoEBAoCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjEuAgg17gICiMKBAQKAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yq7oIIMC6CAojCgQECgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPC7CCCDvAgKIwoEBAoCBhITbGYvYTJhL3YxL2EyYS5wcm90bxjVvQgg5L0ICiMKBAQKAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Yo8AIILLACAojCgQECgIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGJXCCCCmwggKIwoEBAoCBhITbGYvYTJhL3YxL2EyYS5wcm90bxjMwwgg28MICiMKBAQKAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YqMYIIL3GCAojCgQECgIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGKrJCCDByQgKIwoEBAoCCBITbGYvYTJhL3YxL2EyYS5wcm90bxiuywggycsICiMKBAQKAggSE2xmL2EyYS92MS9hMmEucHJvdG8YnM4IILfOCAojCgQECgIIEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjQCCDf0AgKIwoEBAoCCBITbGYvYTJhL3YxL2EyYS5wcm90bxiP0wggrNMICiMKBAQKAgkSE2xmL2EyYS92MS9hMmEucHJvdG8Y5dQIIP3UCAojCgQECgIJEhNsZi9hMmEvdjEvYTJhLnByb3RvGObWCCD+1ggKIwoEBAoCCRITbGYvYTJhL3YxL2EyYS5wcm90bxjn2Agg+9gICiMKBAQKAgkSE2xmL2EyYS92MS9hMmEucHJvdG8Y+NoIIJLbCAojCgQECgIKEhNsZi9hMmEvdjEvYTJhLnByb3RvGMncCCDi3AgKIwoEBAoCChITbGYvYTJhL3YxL2EyYS5wcm90bxjL3ggg5N4ICiMKBAQKAgoSE2xmL2EyYS92MS9hMmEucHJvdG8YzeAIIOLgCAojCgQECgIKEhNsZi9hMmEvdjEvYTJhLnByb3RvGN/iCCD64ggKIwoEBAoCCxITbGYvYTJhL3YxL2EyYS5wcm90bxi95AggyuQICiMKBAQKAgsSE2xmL2EyYS92MS9hMmEucHJvdG8Yg+cIIJDnCAojCgQECgILEhNsZi9hMmEvdjEvYTJhLnByb3RvGJDpCCCZ6QgKIwoEBAoCCxITbGYvYTJhL3YxL2EyYS5wcm90bxjB6wgg0OsICiMKBAQKAgwSE2xmL2EyYS92MS9hMmEucHJvdG8Ym+0IIKztCAojCgQECgIMEhNsZi9hMmEvdjEvYTJhLnByb3RvGP3vCCCO8AgKIwoEBAoCDBITbGYvYTJhL3YxL2EyYS5wcm90bxie8gggq/IICiMKBAQKAgwSE2xmL2EyYS92MS9hMmEucHJvdG8Y2/QIIO70CAojCgQECgINEhNsZi9hMmEvdjEvYTJhLnByb3RvGIr2CCCU9ggKIwoEBAoCDRITbGYvYTJhL3YxL2EyYS5wcm90bxj09wgg/vcICiMKBAQKAg0SE2xmL2EyYS92MS9hMmEucHJvdG8Y0/kIIN/5CAojCgQECgINEhNsZi9hMmEvdjEvYTJhLnByb3RvGJD7CCCa+wgKIwoEBAsCABITbGYvYTJhL3YxL2EyYS5wcm90bxi1mQkgu5kJCiMKBAQLAgASE2xmL2EyYS92MS9hMmEucHJvdG8YopsJIKibCQojCgQECwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOecCSD2nAkKIwoEBAsCARITbGYvYTJhL3YxL2EyYS5wcm90bxjdngkg7J4JCiMKBAQMAgASE2xmL2EyYS92MS9hMmEucHJvdG8YwcYJIM3GCQojCgQEDAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjICSDUyAkKIwoEBAwCABITbGYvYTJhL3YxL2EyYS5wcm90bxi4ygkgxsoJCiMKBAQMAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y/ssJIIrMCQojCgQEDAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMLNCSDWzQkKIwoEBAwCARITbGYvYTJhL3YxL2EyYS5wcm90bxjRzwkg5c8JCiMKBAQMAgESE2xmL2EyYS92MS9hMmEucHJvdG8YydEJIN/RCQojCgQEDAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGJfTCSCr0wkKIwoEBAwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiF1QkgltUJCiMKBAQMAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y6tcJIPvXCQojCgQEDAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIraCSCX2gkKIwoEBAwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjS3Akg5dwJCiMKBAQMAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Ykt4JIKbeCQojCgQEDAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGKHgCSC14AkKIwoEBAwCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiZ4gkgr+IJCiMKBAQMAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y5+MJIPvjCQojCgQEDQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIGICiCHiAoKIwoEBA0CABITbGYvYTJhL3YxL2EyYS5wcm90bxjwiQog9okKCiMKBAQNAgESE2xmL2EyYS92MS9hMmEucHJvdG8YtYsKIMOLCgojCgQEDQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKyNCiC6jQoKIwoEBA0CAhITbGYvYTJhL3YxL2EyYS5wcm90bxj1jgoggI8KCiMKBAQNAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9ZAKIICRCgojCgQEDQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOKSCiDrkgoKIwoEBA0CAxITbGYvYTJhL3YxL2EyYS5wcm90bxiplQogspUKCiMKBAQNAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yn5cKIKqXCgojCgQEDQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGM+YCiDYmAoKIwoEBA4CABITbGYvYTJhL3YxL2EyYS5wcm90bxjKyAogz8gKCiMKBAQOAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsMoKILXKCgojCgQEDgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnLCiDwywoKIwoEBA4CARITbGYvYTJhL3YxL2EyYS5wcm90bxjRzQog2M0KCiMKBAQOAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yk88KIKHPCgojCgQEDgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGILRCiCQ0QoKIwoEBA4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxjM0gog19IKCiMKBAQOAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YwdQKIMzUCgojCgQEDgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLbWCiC91goKIwoEBA4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxi72AogyNgKCiMKBAQOAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y5tkKIPXZCgojCgQEDgIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGN/bCiDu2woKIwoEBA4CBBITbGYvYTJhL3YxL2EyYS5wcm90bxjY3Qog490KCiMKBAQOAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y4d8KIPLfCgojCgQEDgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJfhCiCo4QoKIwoEBA4CBRITbGYvYTJhL3YxL2EyYS5wcm90bxiS4wogo+MKCiMKBAQOAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YjeUKIJrlCgojCgQEDgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJjnCiCr5woKIwoEBA4CBhITbGYvYTJhL3YxL2EyYS5wcm90bxjT6Aog5egKCiMKBAQOAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Yz+oKIOHqCgojCgQEDgIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGMvsCiDZ7AoKIwoEBA4CBhITbGYvYTJhL3YxL2EyYS5wcm90bxjX7gog6+4KCiMKBAQOAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YyPAKIOPwCgojCgQEDgIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGLjzCiDT8woKIwoEBA4CBxITbGYvYTJhL3YxL2EyYS5wcm90bxjl9Qog/PUKCiMKBAQOAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YrvgKIMv4CgojCgQEDwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJObCyCfmwsKIwoEBA8CABITbGYvYTJhL3YxL2EyYS5wcm90bxiQnQsgnJ0LCiMKBAQPAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3Z4LIOmeCwojCgQEDwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNqgCyDmoAsKIwoEBA8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjLogsg1KILCiMKBAQPAgISE2xmL2EyYS92MS9hMmEucHJvdG8YmqULIKOlCwojCgQEDwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJinCyCjpwsKIwoEBA8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjMqAsg1agLCiMKBAQQAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y5dILIO7SCwojCgQEEAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO/UCyD41AsKIwoEBBACARITbGYvYTJhL3YxL2EyYS5wcm90bxi61gsgv9YLCiMKBAQQAgESE2xmL2EyYS92MS9hMmEucHJvdG8YwNgLIMXYCwojCgQEEAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIzaCyCV2gsKIwoEBBACAhITbGYvYTJhL3YxL2EyYS5wcm90bxiW3Asgn9wLCiMKBAQQAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y4t0LIOjdCwojCgQEEAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnfCyDv3wsKIwoEBBACBBITbGYvYTJhL3YxL2EyYS5wcm90bxi04QsgvOELCiMKBAQQAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YveMLIMXjCwojCgQEEAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLzlCyDN5QsKIwoEBBACBRITbGYvYTJhL3YxL2EyYS5wcm90bxix6AsgwugLCiMKBAQQAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yx+oLINrqCwojCgQEEAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJPsCyCk7AsKIwoEBBECABITbGYvYTJhL3YxL2EyYS5wcm90bxisiQwgt4kMCiMKBAQRAgASE2xmL2EyYS92MS9hMmEucHJvdG8YoYsMIKyLDAojCgQEEQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJaNDCCdjQwKIwoEBBECABITbGYvYTJhL3YxL2EyYS5wcm90bxibjwwgqI8MCiMKBAQSAgASE2xmL2EyYS92MS9hMmEucHJvdG8YmrEMIKexDAojCgQEEgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKC0DCCvtAwKIwoEBBMCABITbGYvYTJhL3YxL2EyYS5wcm90bxj6uAwgkbkMCiMKBAQTAgESE2xmL2EyYS92MS9hMmEucHJvdG8YmLkMILG5DAojCgQEEwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLi5DCDOuQwKIwoEBBMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjVuQwg9LkMCiMKBAQTAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y+7kMII+6DAojCgQEEwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNnrDCDw6wwKIwoEBBMCABITbGYvYTJhL3YxL2EyYS5wcm90bxjC7gwg2e4MCiMKBAQTAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y+/AMIJTxDAojCgQEEwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMfyDCDe8gwKIwoEBBMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjM9Awg5fQMCiMKBAQTAgESE2xmL2EyYS92MS9hMmEucHJvdG8YvfcMINb3DAojCgQEEwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPj5DCCT+gwKIwoEBBMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjI+wwg4fsMCiMKBAQTAgISE2xmL2EyYS92MS9hMmEucHJvdG8YyP0MIN/9DAojCgQEEwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLGADSDIgA0KIwoEBBMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjqgg0gg4MNCiMKBAQTAgISE2xmL2EyYS92MS9hMmEucHJvdG8YtoQNIM2EDQojCgQEEwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMuGDSDphg0KIwoEBBMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjQiQ0g7okNCiMKBAQTAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YkIwNILCMDQojCgQEEwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOqNDSCIjg0KIwoEBBMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjzjw0giJANCiMKBAQTAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y45INIPiSDQojCgQEEwIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGJqVDSCxlQ0KIwoEBBMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjilg0g95YNCiMKBAQUAgASE2xmL2EyYS92MS9hMmEucHJvdG8YqbgNILe4DQojCgQEFAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKy6DSC6ug0KIwoEBBQCARITbGYvYTJhL3YxL2EyYS5wcm90bxj8uw0gh7wNCiMKBAQUAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y/L0NIIe+DQojCgQEFAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGMW/DSDMvw0KIwoEBBQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjBwQ0gyMENCiMKBAQVAgASE2xmL2EyYS92MS9hMmEucHJvdG8YvOMNIMrjDQojCgQEFQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMPlDSDR5Q0KIwoEBBUCARITbGYvYTJhL3YxL2EyYS5wcm90bxiT5w0gnOcNCiMKBAQVAgESE2xmL2EyYS92MS9hMmEucHJvdG8YlekNIJ7pDQojCgQEFQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOfqDSD26g0KIwoEBBUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjv7A0g/uwNCiMKBAQWAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y+Y8OIIeQDgojCgQEFgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPyRDiCKkg4KIwoEBBYCARITbGYvYTJhL3YxL2EyYS5wcm90bxjikw4g6pMOCiMKBAQWAgESE2xmL2EyYS92MS9hMmEucHJvdG8YqpYOILKWDgojCgQEFgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKuYDiC1mA4KIwoEBBYCARITbGYvYTJhL3YxL2EyYS5wcm90bxjfmQ4g55kOCiMKBAQWAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpJsOILibDgojCgQEFgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGK2dDiDBnQ4KIwoEBBcCABITbGYvYTJhL3YxL2EyYS5wcm90bxj3vQ4ghb4OCiMKBAQXAgASE2xmL2EyYS92MS9hMmEucHJvdG8YiMAOIJbADgojCgQEFwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOrBDiD9wQ4KIwoEBBcCARITbGYvYTJhL3YxL2EyYS5wcm90bxiAxA4gk8QOCiMKBAQYAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y0eEOIN/hDgojCgQEGAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNrjDiDo4w4KIwoEBBkCABITbGYvYTJhL3YxL2EyYS5wcm90bxi56A4gy+gOCiMKBAQZAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y0ugOIOToDgojCgQEGQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOvoDiDz6A4KIwoEBBkCAxITbGYvYTJhL3YxL2EyYS5wcm90bxj66A4ggukOCiMKBAQZAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YiekOIJTpDgojCgQEGQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLeYDyDLmA8KIwoEBBkCABITbGYvYTJhL3YxL2EyYS5wcm90bxinmw8gu5sPCiMKBAQZAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y0Z0PIOedDwojCgQEGQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJOfDyCnnw8KIwoEBBkCARITbGYvYTJhL3YxL2EyYS5wcm90bxiSoQ8gpqEPCiMKBAQZAgESE2xmL2EyYS92MS9hMmEucHJvdG8YgqQPIJakDwojCgQEGQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKymDyDCpg8KIwoEBBkCARITbGYvYTJhL3YxL2EyYS5wcm90bxjupw8ggqgPCiMKBAQZAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y0akPINypDwojCgQEGQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ2sDyCorA8KIwoEBBkCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi+rg8gy64PCiMKBAQZAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y7q8PIPmvDwojCgQEGQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMixDyDTsQ8KIwoEBBkCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiUtA8gn7QPCiMKBAQZAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YtbYPIMK2DwojCgQEGQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOW3DyDwtw8KIwoEBBkCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjGuQ8g07kPCiMKBAQZAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YmrwPIKe8DwojCgQEGQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGL2+DyDMvg8KIwoEBBkCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjxvw8g/r8PCiMKBAQaAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y4+kPIPbpDwojCgQEGgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPfrDyCK7A8KIwoEBBoCARITbGYvYTJhL3YxL2EyYS5wcm90bxjT7Q8g3u0PCiMKBAQaAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3+8PIOrvDwojCgQEGgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLXxDyDC8Q8KIwoEBBoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjD8w8g0PMPCiMKBAQaAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yk/YPIJ/2DwojCgQEGgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGPv4DyCJ+Q8KIwoEBBoCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjC+g8g0foPCiMKBAQaAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y3vwPIO38DwojCgQEGwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIaiECCRohAKIwoEBBsCABITbGYvYTJhL3YxL2EyYS5wcm90bxiSpBAgnaQQCiMKBAQbAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y6KUQIPWlEAojCgQEGwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPanECCDqBAKIwoEBBsCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjGqhAg0qoQCiMKBAQbAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yrq0QILytEAojCgQEHAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNHRECDk0RAKIwoEBBwCABITbGYvYTJhL3YxL2EyYS5wcm90bxjT0xAg5tMQCiMKBAQcAgESE2xmL2EyYS92MS9hMmEucHJvdG8YqNUQILXVEAojCgQEHAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKTXECCx1xAKIwoEBBwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjr2RAg99kQCiMKBAQcAgISE2xmL2EyYS92MS9hMmEucHJvdG8YwdwQIM/cEAojCgQEHQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMSAESDPgBEKIwoEBB0CABITbGYvYTJhL3YxL2EyYS5wcm90bxi+ghEgyYIRCiMKBAQdAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yi4QRIJiEEQojCgQEHQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIeGESCUhhEKIwoEBB0CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjOiBEg2ogRCiMKBAQdAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpIsRILKLEQojCgQEHgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKCyESC5shEKIwoEBB4CABITbGYvYTJhL3YxL2EyYS5wcm90bxistBEgxbQRCiMKBAQeAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yh7YRIJK2EQojCgQEHgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIW4ESCQuBEKIwoEBB4CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjUuREg4bkRCiMKBAQeAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y1LsRIOG7EQojCgQEHgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ2+ESCpvhEKIwoEBB4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxj3wBEghcERCiMKBAQfAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y2ugRIOPoEQojCgQEHwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNTqESDd6hEKIwoEBB8CARITbGYvYTJhL3YxL2EyYS5wcm90bxiv7BEguewRCiMKBAQfAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y7O4RIPbuEQojCgQEHwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOvwESD38BEKIwoEBB8CARITbGYvYTJhL3YxL2EyYS5wcm90bxih8hEgq/IRCiMKBAQfAgISE2xmL2EyYS92MS9hMmEucHJvdG8YlfQRIKX0EQojCgQEHwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIv3ESCb9xEKIwoEBB8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxiQ+REgovkRCiMKBAQfAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y0voRIOL6EQojCgQEHwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLn8ESDE/BEKIwoEBB8CAxITbGYvYTJhL3YxL2EyYS5wcm90bxiK/xEglf8RCiMKBAQfAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YioESIJeBEgojCgQEHwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMKCEiDNghIKIwoEBCACABITbGYvYTJhL3YxL2EyYS5wcm90bxiyoxIgu6MSCiMKBAQgAgASE2xmL2EyYS92MS9hMmEucHJvdG8YpKUSIK2lEgojCgQEIAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOOmEiDophIKIwoEBCACARITbGYvYTJhL3YxL2EyYS5wcm90bxjRqBIg1qgSCiMKBAQgAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yl6oSIKeqEgojCgQEIAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGI+sEiCfrBIKIwoEBCACAhITbGYvYTJhL3YxL2EyYS5wcm90bxj9rRIgj64SCiMKBAQgAgISE2xmL2EyYS92MS9hMmEucHJvdG8YxK8SINSvEgojCgQEIQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGOfeEiDw3hIKIwoEBCECABITbGYvYTJhL3YxL2EyYS5wcm90bxjd4BIg5uASCiMKBAQhAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpuISILLiEgojCgQEIQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ/kEiCr5BIKIwoEBCECAhITbGYvYTJhL3YxL2EyYS5wcm90bxj+5RIgh+YSCiMKBAQhAgISE2xmL2EyYS92MS9hMmEucHJvdG8Ym+gSIKToEgojCgQEIQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGODpEiDr6RIKIwoEBCECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjX6xIg4usSCiMKBAQhAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YxO0SINHtEgojCgQEIQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGIjvEiCT7xIKIwoEBCECBBITbGYvYTJhL3YxL2EyYS5wcm90bxjD8BIgz/ASCiMKBAQhAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YvPISIMjyEgojCgQEIQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGIv0EiCb9BIKIwoEBCECBRITbGYvYTJhL3YxL2EyYS5wcm90bxiH9hIgl/YSCiMKBAQhAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y+fcSIIv4EgojCgQEIQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGML5EiDS+RIKIwoEBCECBhITbGYvYTJhL3YxL2EyYS5wcm90bxi7+xIg0vsSCiMKBAQhAgYSE2xmL2EyYS92MS9hMmEucHJvdG8YoP4SILf+EgojCgQEIQIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGKiAEyDBgBMKIwoEBCECBhITbGYvYTJhL3YxL2EyYS5wcm90bxj2gRMgjYITCiMKBAQhAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Yw4MTINaDEwojCgQEIQIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGM+FEyDihRMKIwoEBCECBxITbGYvYTJhL3YxL2EyYS5wcm90bxjEhxMg2YcTCiMKBAQhAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YkIkTIKOJEwojCgQEIgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIavEyCSrxMKIwoEBCICABITbGYvYTJhL3YxL2EyYS5wcm90bxjIsRMg1LETCiMKBAQiAgASE2xmL2EyYS92MS9hMmEucHJvdG8Yz7MTINezEwojCgQEIgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIi2EyCWthMKIwoEBCICARITbGYvYTJhL3YxL2EyYS5wcm90bxi7txMgy7cTCiMKBAQiAgESE2xmL2EyYS92MS9hMmEucHJvdG8YurkTIMq5EwojCgQEIgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIm7EyCUuxMKIwoEBCICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiCvRMgjb0TCiMKBAQiAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yyr4TINa+EwojCgQEIgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMTAEyDQwBMKIwoEBCMCABITbGYvYTJhL3YxL2EyYS5wcm90bxj74hMghOMTCiMKBAQjAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y8+QTIPzkEwojCgQEIwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLXmEyC65hMKIwoEBCMCARITbGYvYTJhL3YxL2EyYS5wcm90bxip6BMgrugTCiMKBAQjAgISE2xmL2EyYS92MS9hMmEucHJvdG8YlOoTIJ/qEwojCgQEIwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOPsEyDu7BMKIwoEBCMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjh7hMg7u4TCiMKBAQjAgISE2xmL2EyYS92MS9hMmEucHJvdG8YmPATIKPwEwojCgQEJAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLWTFCC+kxQKIwoEBCQCABITbGYvYTJhL3YxL2EyYS5wcm90bxjTlRQg3JUUCiMKBAQkAgESE2xmL2EyYS92MS9hMmEucHJvdG8YrZcUILaXFAojCgQEJAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMuZFCDUmRQKIwoEBCQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxigmxQgpZsUCiMKBAQkAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yup0UIL+dFAojCgQEJQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJHBFCCawRQKIwoEBCUCABITbGYvYTJhL3YxL2EyYS5wcm90bxi1wxQgvsMUCiMKBAQlAgESE2xmL2EyYS92MS9hMmEucHJvdG8YksUUIJvFFAojCgQEJQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLbHFCC/xxQKIwoEBCUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiOyRQgk8kUCiMKBAQlAgISE2xmL2EyYS92MS9hMmEucHJvdG8YrssUILPLFAojCgQEJgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNvqFCDk6hQKIwoEBCYCABITbGYvYTJhL3YxL2EyYS5wcm90bxjd7BQg5uwUCiMKBAQmAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpO4UIKnuFAojCgQEJgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKLwFCCn8BQKIwoEBCcCABITbGYvYTJhL3YxL2EyYS5wcm90bxiLlhUglJYVCiMKBAQnAgASE2xmL2EyYS92MS9hMmEucHJvdG8YrZgVILaYFQojCgQEJwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGImaFSCSmhUKIwoEBCcCARITbGYvYTJhL3YxL2EyYS5wcm90bxirnBUgtJwVCiMKBAQnAgISE2xmL2EyYS92MS9hMmEucHJvdG8YiJ4VIJOeFQojCgQEJwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGKugFSC2oBUKIwoEBCcCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiJohUglaIVCiMKBAQnAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YrqQVILqkFQojCgQEKAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKTCFSCtwhUKIwoEBCgCABITbGYvYTJhL3YxL2EyYS5wcm90bxiwxBUgucQVCiMKBAQpAgASE2xmL2EyYS92MS9hMmEucHJvdG8YnMkVIKDJFQojCgQEKQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKfJFSCuyRUKIwoEBCkCABITbGYvYTJhL3YxL2EyYS5wcm90bxi27BUgvewVCiMKBAQpAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y6e4VIPDuFQojCgQEKQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKHxFSCq8RUKIwoEBCkCABITbGYvYTJhL3YxL2EyYS5wcm90bxjS8hUg2fIVCiMKBAQpAgESE2xmL2EyYS92MS9hMmEucHJvdG8YnPQVIKb0FQojCgQEKQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNv2FSDl9hUKIwoEBCkCARITbGYvYTJhL3YxL2EyYS5wcm90bxiW+RUgovkVCiMKBAQpAgESE2xmL2EyYS92MS9hMmEucHJvdG8YzfoVINf6FQojCgQEKgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKT/FSCo/xUKIwoEBCoCARITbGYvYTJhL3YxL2EyYS5wcm90bxiv/xUgtv8VCiMKBAQqAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yvf8VIMr/FQojCgQEKgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGNH/FSDg/xUKIwoEBCoCABITbGYvYTJhL3YxL2EyYS5wcm90bxiIqhYgj6oWCiMKBAQqAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsawWILisFgojCgQEKgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNquFiDjrhYKIwoEBCoCABITbGYvYTJhL3YxL2EyYS5wcm90bxiGsBYgjbAWCiMKBAQqAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yy7EWINWxFgojCgQEKgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIC0FiCKtBYKIwoEBCoCARITbGYvYTJhL3YxL2EyYS5wcm90bxisthYguLYWCiMKBAQqAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3rcWIOi3FgojCgQEKgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGMi5FiDXuRYKIwoEBCoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxisvBYgu7wWCiMKBAQqAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y3b4WIO6+FgojCgQEKgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJnAFiCowBYKIwoEBCoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiOwhYgn8IWCiMKBAQqAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y+sQWIIvFFgojCgQEKgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGK3HFiDAxxYKIwoEBCoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjtyBYg/sgWCiMKBAQrAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyO4WINbuFgojCgQEKwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPrxFiCI8hYKIwoEBCsCABITbGYvYTJhL3YxL2EyYS5wcm90bxjF9BYgz/QWCiMKBAQrAgASE2xmL2EyYS92MS9hMmEucHJvdG8YwvcWINL3FgojCgQEKwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGI/5FiCf+RYKIwoEBCsCARITbGYvYTJhL3YxL2EyYS5wcm90bxi6+xYgyvsWCiEKAgUAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMr8FiDT/BYKIwoEBQACABITbGYvYTJhL3YxL2EyYS5wcm90bxja/BYg8PwWCiMKBAUAAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y9/wWIIv9FgojCgQFAAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJL9FiCk/RYKIwoEBQACAxITbGYvYTJhL3YxL2EyYS5wcm90bxir/RYgv/0WCiMKBAUAAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Yxv0WINf9FgojCgQFAAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGN79FiDx/RYKIwoEBQACBhITbGYvYTJhL3YxL2EyYS5wcm90bxj4/RYgkf4WCiMKBAUAAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YmP4WIKv+FgojCgQFAAIIEhNsZi9hMmEvdjEvYTJhLnByb3RvGLL+FiDK/hYKIQoCBQESE2xmL2EyYS92MS9hMmEucHJvdG8Y/P4WIID/FgojCgQFAQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIf/FiCX/xYKIwoEBQECARITbGYvYTJhL3YxL2EyYS5wcm90bxie/xYgp/8WCiMKBAUBAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yrv8WILj/Fg==
|
|
12570
|
+
// Ch8KAgQAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO8pIIcqCh8KAgQBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKUwIKkwCh8KAgQCEhNsZi9hMmEvdjEvYTJhLnByb3RvGPc1IIE2Ch8KAgQDEhNsZi9hMmEvdjEvYTJhLnByb3RvGME7IMU7Ch8KAgQEEhNsZi9hMmEvdjEvYTJhLnByb3RvGJBBIJdBCh8KAgQFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPFGIPlGCh8KAgQGEhNsZi9hMmEvdjEvYTJhLnByb3RvGNdMIOxMCh8KAgQHEhNsZi9hMmEvdjEvYTJhLnByb3RvGM1SIORSCh8KAgQIEhNsZi9hMmEvdjEvYTJhLnByb3RvGMtYIN1YCh8KAgQJEhNsZi9hMmEvdjEvYTJhLnByb3RvGLVeIMNeCh8KAgQKEhNsZi9hMmEvdjEvYTJhLnByb3RvGI9kIJhkCh8KAgQLEhNsZi9hMmEvdjEvYTJhLnByb3RvGPppIIdqCh8KAgQMEhNsZi9hMmEvdjEvYTJhLnByb3RvGNBvIOFvCh8KAgQNEhNsZi9hMmEvdjEvYTJhLnByb3RvGON1IPF1Ch8KAgQOEhNsZi9hMmEvdjEvYTJhLnByb3RvGL17IMd7CiEKAgQPEhNsZi9hMmEvdjEvYTJhLnByb3RvGK2BASC/gQEKIQoCBBASE2xmL2EyYS92MS9hMmEucHJvdG8Yl4cBILGHAQohCgIEERITbGYvYTJhL3YxL2EyYS5wcm90bxihjQEgq40BCiEKAgQSEhNsZi9hMmEvdjEvYTJhLnByb3RvGJGTASCkkwEKIQoCBBMSE2xmL2EyYS92MS9hMmEucHJvdG8Y/5gBII2ZAQohCgIEFBITbGYvYTJhL3YxL2EyYS5wcm90bxiAnwEglJ8BCiEKAgQVEhNsZi9hMmEvdjEvYTJhLnByb3RvGPKkASCIpQEKIQoCBBYSE2xmL2EyYS92MS9hMmEucHJvdG8Y7KoBIICrAQohCgIEFxITbGYvYTJhL3YxL2EyYS5wcm90bxjesAEg+bABCiEKAgQYEhNsZi9hMmEvdjEvYTJhLnByb3RvGOy2ASCDtwEKIQoCBBkSE2xmL2EyYS92MS9hMmEucHJvdG8Y6rwBIPS8AQohCgIEGhITbGYvYTJhL3YxL2EyYS5wcm90bxjXwgEg8cIBCiEKAgQbEhNsZi9hMmEvdjEvYTJhLnByb3RvGOHIASD7yAEKIQoCBBwSE2xmL2EyYS92MS9hMmEucHJvdG8Y684BIPzOAQohCgIEHRITbGYvYTJhL3YxL2EyYS5wcm90bxjR1AEg4tQBCiEKAgQeEhNsZi9hMmEvdjEvYTJhLnByb3RvGLfaASDK2gEKIQoCBB8SE2xmL2EyYS92MS9hMmEucHJvdG8YpeABILfgAQohCgIEIBITbGYvYTJhL3YxL2EyYS5wcm90bxiP5gEgneYBCiEKAgQhEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnrASD56wEKIQoCBCISE2xmL2EyYS92MS9hMmEucHJvdG8Yy/EBINzxAQohCgIEIxITbGYvYTJhL3YxL2EyYS5wcm90bxje9wEg7/cBCiEKAgQkEhNsZi9hMmEvdjEvYTJhLnByb3RvGMT9ASDo/QEKIQoCBCUSE2xmL2EyYS92MS9hMmEucHJvdG8Y9oMCIJ2EAgohCgIEJhITbGYvYTJhL3YxL2EyYS5wcm90bxi0igIgyooCCiEKAgQnEhNsZi9hMmEvdjEvYTJhLnByb3RvGK6QAiDUkAIKIQoCBCgSE2xmL2EyYS92MS9hMmEucHJvdG8Y6JYCIIOXAgohCgIEKRITbGYvYTJhL3YxL2EyYS5wcm90bxj2nAIgiZ0CCiEKAgQqEhNsZi9hMmEvdjEvYTJhLnByb3RvGJCjAiCeowIKIQoCBCsSE2xmL2EyYS92MS9hMmEucHJvdG8YkakCILipAgojCgQEAAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIjVAiCi1QIKIwoEBAACABITbGYvYTJhL3YxL2EyYS5wcm90bxio1wIgwtcCCiMKBAQAAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyNkCIN7ZAgojCgQEAAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPjbAiCU3AIKIwoEBAACARITbGYvYTJhL3YxL2EyYS5wcm90bxiV3gIgst4CCiMKBAQAAgESE2xmL2EyYS92MS9hMmEucHJvdG8YquECIMfhAgojCgQEAAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjjAiDn4wIKIwoEBAACARITbGYvYTJhL3YxL2EyYS5wcm90bxiq5QIgx+UCCiMKBAQAAgISE2xmL2EyYS92MS9hMmEucHJvdG8YgucCIJLnAgojCgQEAAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGI7pAiCe6QIKIwoEBAACAhITbGYvYTJhL3YxL2EyYS5wcm90bxiQ6wIgousCCiMKBAQAAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y4ewCIPHsAgojCgQEAAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGKbuAiCx7gIKIwoEBAACAxITbGYvYTJhL3YxL2EyYS5wcm90bxi68AIgxfACCiMKBAQBAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsJ0DILWdAwojCgQEAQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIqfAyCPnwMKIwoEBAECARITbGYvYTJhL3YxL2EyYS5wcm90bxjDoAMgz6ADCiMKBAQBAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpKIDILCiAwojCgQEAQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGPmjAyCCpAMKIwoEBAECAhITbGYvYTJhL3YxL2EyYS5wcm90bxiipgMgq6YDCiMKBAQBAgISE2xmL2EyYS92MS9hMmEucHJvdG8YhKgDII+oAwojCgQEAQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGKqpAyCzqQMKIwoEBAECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjzqgMgg6sDCiMKBAQBAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yq60DILutAwojCgQEAQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLGvAyC9rwMKIwoEBAECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjYsQMg6rEDCiMKBAQBAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YmbMDIKezAwojCgQEAQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGMy1AyDatQMKIwoEBAECBBITbGYvYTJhL3YxL2EyYS5wcm90bxjOtwMg2LcDCiMKBAQBAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y8rkDIIK6AwojCgQEAQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLy7AyDHuwMKIwoEBAECBRITbGYvYTJhL3YxL2EyYS5wcm90bxjxvQMg/L0DCiMKBAQBAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y1b8DIOK/AwojCgQEAQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGP/AAyCKwQMKIwoEBAICABITbGYvYTJhL3YxL2EyYS5wcm90bxiI5AMgkOQDCiMKBAQCAgASE2xmL2EyYS92MS9hMmEucHJvdG8YmOYDIKDmAwojCgQEAgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOjnAyDy5wMKIwoEBAICARITbGYvYTJhL3YxL2EyYS5wcm90bxiV6gMgn+oDCiMKBAQCAgESE2xmL2EyYS92MS9hMmEucHJvdG8YhOwDIJDsAwojCgQEAgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLLtAyC87QMKIwoEBAICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiS7wMgnu8DCiMKBAQCAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y4PEDIOzxAwojCgQEAgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNHzAyDf8wMKIwoEBAICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiD9QMgj/UDCiMKBAQDAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyPkDIMz5AwojCgQEAwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNP5AyDW+QMKIwoEBAMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjd+QMg4PkDCiMKBAQDAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y5/kDIOv5AwojCgQEAwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIKnBCCJpwQKIwoEBAMCABITbGYvYTJhL3YxL2EyYS5wcm90bxjeqAQg5agECiMKBAQDAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y2qoEIOOqBAojCgQEAwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLmsBCDArAQKIwoEBAMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjqrQQg8K0ECiMKBAQDAgESE2xmL2EyYS92MS9hMmEucHJvdG8YxbQEIMu0BAojCgQEAwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMC2BCDItgQKIwoEBAMCARITbGYvYTJhL3YxL2EyYS5wcm90bxieuAQgpLgECiMKBAQDAgISE2xmL2EyYS92MS9hMmEucHJvdG8YwbkEIMe5BAojCgQEAwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJy7BCCiuwQKIwoEBAMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiXvQQgn70ECiMKBAQDAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9b4EIPu+BAojCgQEAwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGL7ABCDFwAQKIwoEBAMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjswgQg88IECiMKBAQDAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y98QEIIDFBAojCgQEAwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJnGBCCgxgQKIwoEBAMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjpxwQg9McECiMKBAQDAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YnsoEIKnKBAojCgQEAwIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGILMBCCPzAQKIwoEBAMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxiszQQgt80ECiMKBAQDAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y2c4EIOTOBAojCgQEAwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLnQBCDE0AQKIwoEBAMCBhITbGYvYTJhL3YxL2EyYS5wcm90bxj40QQghNIECiMKBAQDAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Y2dMEIOXTBAojCgQEBAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMiDBSDUgwUKIwoEBAQCABITbGYvYTJhL3YxL2EyYS5wcm90bxivhQUgu4UFCiMKBAQEAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y8oYFIP6GBQojCgQEBAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNmIBSDliAUKIwoEBAQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiZigUgoooFCiMKBAQEAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y/YsFIIaMBQojCgQEBAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMSNBSDLjQUKIwoEBAQCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjDjwUgyo8FCiMKBAQEAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Yj5EFIJuRBQojCgQEBAIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGL2TBSDJkwUKIwoEBAQCBBITbGYvYTJhL3YxL2EyYS5wcm90bxi6lQUgwpUFCiMKBAQEAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y35cFIO2XBQojCgQEBAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGKiZBSCzmQUKIwoEBAQCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjjmwUg7psFCiMKBAQEAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YzZ0FINqdBQojCgQEBAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPqeBSCFnwUKIwoEBAQCBhITbGYvYTJhL3YxL2EyYS5wcm90bxi0oAUgxaAFCiMKBAQEAgYSE2xmL2EyYS92MS9hMmEucHJvdG8YqaIFILqiBQojCgQEBAIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ6kBSCrpAUKIwoEBAQCBhITbGYvYTJhL3YxL2EyYS5wcm90bxijpgUgtqYFCiMKBAQEAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Y4acFIPinBQojCgQEBAIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGNypBSDzqQUKIwoEBAQCBxITbGYvYTJhL3YxL2EyYS5wcm90bxjXqwUg6qsFCiMKBAQEAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Y4q0FIPutBQojCgQEBQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGOzYBSD52AUKIwoEBAUCABITbGYvYTJhL3YxL2EyYS5wcm90bxjW2gUg49oFCiMKBAQFAgESE2xmL2EyYS92MS9hMmEucHJvdG8YldwFIJzcBQojCgQEBQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPndBSCA3gUKIwoEBAUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi53wUgx98FCiMKBAQFAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpOEFILLhBQojCgQEBQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGPriBSCG4wUKIwoEBAUCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiq5QUgtuUFCiMKBAQFAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YqOcFILDnBQojCgQEBQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGM/pBSDd6QUKIwoEBAUCBBITbGYvYTJhL3YxL2EyYS5wcm90bxiZ6wUgpOsFCiMKBAQFAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y1u0FIOHtBQojCgQEBQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGMLvBSDP7wUKIwoEBAUCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjw8AUg+/AFCiMKBAQFAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yq/IFILzyBQojCgQEBQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGKL0BSCz9AUKIwoEBAUCBRITbGYvYTJhL3YxL2EyYS5wcm90bxiZ9gUgpvYFCiMKBAQFAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YoPgFILP4BQojCgQEBgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNGeBiDangYKIwoEBAYCABITbGYvYTJhL3YxL2EyYS5wcm90bxjRoAYg2qAGCiMKBAQGAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yn6IGIKuiBgojCgQEBgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKKkBiCupAYKIwoEBAYCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiIpgYgkaYGCiMKBAQGAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y06gGINyoBgojCgQEBgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNeqBiDiqgYKIwoEBAYCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiOrAYgl6wGCiMKBAQGAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y8a0GIPytBgojCgQEBgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMiwBiDTsAYKIwoEBAYCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjOsgYg27IGCiMKBAQGAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YibQGIJS0BgojCgQEBwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGP3eBiCG3wYKIwoEBAcCABITbGYvYTJhL3YxL2EyYS5wcm90bxiB4QYgiuEGCiMKBAQHAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y0eIGIN3iBgojCgQEBwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNjkBiDk5AYKIwoEBAcCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi+5gYgyeYGCiMKBAQHAgISE2xmL2EyYS92MS9hMmEucHJvdG8YiekGIJTpBgojCgQEBwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJPrBiCg6wYKIwoEBAcCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjQ7AYg2+wGCiMKBAQHAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yje4GIJbuBgojCgQEBwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ3wBiCm8AYKIwoEBAcCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjt8QYg+fEGCiMKBAQHAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YgPQGIIz0BgojCgQEBwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPn1BiCE9gYKIwoEBAcCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjU+AYg3/gGCiMKBAQHAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y3voGIOv6BgojCgQEBwIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJv8BiCm/AYKIwoEBAgCABITbGYvYTJhL3YxL2EyYS5wcm90bxiZmwcgopsHCiMKBAQIAgASE2xmL2EyYS92MS9hMmEucHJvdG8Yk50HIJydBwojCgQECAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGN+eByDtngcKIwoEBAgCARITbGYvYTJhL3YxL2EyYS5wcm90bxjeoAcg7KAHCiMKBAQJAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y/sMHIITEBwojCgQECQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO3FByDzxQcKIwoEBAkCARITbGYvYTJhL3YxL2EyYS5wcm90bxi3xwcgyccHCiMKBAQJAgESE2xmL2EyYS92MS9hMmEucHJvdG8YsskHIMTJBwojCgQECQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGP7KByCHywcKIwoEBAkCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjwzAcg+cwHCiMKBAQJAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yvc4HIM/OBwojCgQECQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLjQByDK0AcKIwoEBAoCABITbGYvYTJhL3YxL2EyYS5wcm90bxjmmwgg7ZsICiMKBAQKAgASE2xmL2EyYS92MS9hMmEucHJvdG8YzJ0IINOdCAojCgQECgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGI2fCCCbnwgKIwoEBAoCARITbGYvYTJhL3YxL2EyYS5wcm90bxj6oAggiKEICiMKBAQKAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9KIIII6jCAojCgQECgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGNKlCCDspQgKIwoEBAoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjzpwggiagICiMKBAQKAgISE2xmL2EyYS92MS9hMmEucHJvdG8YtKoIINCqCAojCgQECgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJOsCCCerAgKIwoEBAoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjRrggg3K4ICiMKBAQKAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yv7AIIMywCAojCgQECgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGO6xCCD5sQgKIwoEBAoCBBITbGYvYTJhL3YxL2EyYS5wcm90bxifswggqbMICiMKBAQKAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YiLUIIJK1CAojCgQECgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGNK2CCDltggKIwoEBAoCBRITbGYvYTJhL3YxL2EyYS5wcm90bxjEuAgg17gICiMKBAQKAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yq7oIIMC6CAojCgQECgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGPC7CCCDvAgKIwoEBAoCBhITbGYvYTJhL3YxL2EyYS5wcm90bxjVvQgg5L0ICiMKBAQKAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Yo8AIILLACAojCgQECgIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGJXCCCCmwggKIwoEBAoCBhITbGYvYTJhL3YxL2EyYS5wcm90bxjMwwgg28MICiMKBAQKAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YqMYIIL3GCAojCgQECgIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGKrJCCDByQgKIwoEBAoCCBITbGYvYTJhL3YxL2EyYS5wcm90bxiuywggycsICiMKBAQKAggSE2xmL2EyYS92MS9hMmEucHJvdG8YnM4IILfOCAojCgQECgIIEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjQCCDf0AgKIwoEBAoCCBITbGYvYTJhL3YxL2EyYS5wcm90bxiP0wggrNMICiMKBAQKAgkSE2xmL2EyYS92MS9hMmEucHJvdG8Y5dQIIP3UCAojCgQECgIJEhNsZi9hMmEvdjEvYTJhLnByb3RvGObWCCD+1ggKIwoEBAoCCRITbGYvYTJhL3YxL2EyYS5wcm90bxjn2Agg+9gICiMKBAQKAgkSE2xmL2EyYS92MS9hMmEucHJvdG8Y+NoIIJLbCAojCgQECgIKEhNsZi9hMmEvdjEvYTJhLnByb3RvGMncCCDi3AgKIwoEBAoCChITbGYvYTJhL3YxL2EyYS5wcm90bxjL3ggg5N4ICiMKBAQKAgoSE2xmL2EyYS92MS9hMmEucHJvdG8YzeAIIOLgCAojCgQECgIKEhNsZi9hMmEvdjEvYTJhLnByb3RvGN/iCCD64ggKIwoEBAoCCxITbGYvYTJhL3YxL2EyYS5wcm90bxi95AggyuQICiMKBAQKAgsSE2xmL2EyYS92MS9hMmEucHJvdG8Yg+cIIJDnCAojCgQECgILEhNsZi9hMmEvdjEvYTJhLnByb3RvGJDpCCCZ6QgKIwoEBAoCCxITbGYvYTJhL3YxL2EyYS5wcm90bxjB6wgg0OsICiMKBAQKAgwSE2xmL2EyYS92MS9hMmEucHJvdG8Ym+0IIKztCAojCgQECgIMEhNsZi9hMmEvdjEvYTJhLnByb3RvGP3vCCCO8AgKIwoEBAoCDBITbGYvYTJhL3YxL2EyYS5wcm90bxie8gggq/IICiMKBAQKAgwSE2xmL2EyYS92MS9hMmEucHJvdG8Y2/QIIO70CAojCgQECgINEhNsZi9hMmEvdjEvYTJhLnByb3RvGIr2CCCU9ggKIwoEBAoCDRITbGYvYTJhL3YxL2EyYS5wcm90bxj09wgg/vcICiMKBAQKAg0SE2xmL2EyYS92MS9hMmEucHJvdG8Y0/kIIN/5CAojCgQECgINEhNsZi9hMmEvdjEvYTJhLnByb3RvGJD7CCCa+wgKIwoEBAsCABITbGYvYTJhL3YxL2EyYS5wcm90bxi1mQkgu5kJCiMKBAQLAgASE2xmL2EyYS92MS9hMmEucHJvdG8YopsJIKibCQojCgQECwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOecCSD2nAkKIwoEBAsCARITbGYvYTJhL3YxL2EyYS5wcm90bxjdngkg7J4JCiMKBAQMAgASE2xmL2EyYS92MS9hMmEucHJvdG8YwcYJIM3GCQojCgQEDAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMjICSDUyAkKIwoEBAwCABITbGYvYTJhL3YxL2EyYS5wcm90bxi4ygkgxsoJCiMKBAQMAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y/ssJIIrMCQojCgQEDAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMLNCSDWzQkKIwoEBAwCARITbGYvYTJhL3YxL2EyYS5wcm90bxjRzwkg5c8JCiMKBAQMAgESE2xmL2EyYS92MS9hMmEucHJvdG8YydEJIN/RCQojCgQEDAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGJfTCSCr0wkKIwoEBAwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiF1QkgltUJCiMKBAQMAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y6tcJIPvXCQojCgQEDAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIraCSCX2gkKIwoEBAwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjS3Akg5dwJCiMKBAQMAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Ykt4JIKbeCQojCgQEDAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGKHgCSC14AkKIwoEBAwCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiZ4gkgr+IJCiMKBAQMAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y5+MJIPvjCQojCgQEDQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIGICiCHiAoKIwoEBA0CABITbGYvYTJhL3YxL2EyYS5wcm90bxjwiQog9okKCiMKBAQNAgESE2xmL2EyYS92MS9hMmEucHJvdG8YtYsKIMOLCgojCgQEDQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKyNCiC6jQoKIwoEBA0CAhITbGYvYTJhL3YxL2EyYS5wcm90bxj1jgoggI8KCiMKBAQNAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y9ZAKIICRCgojCgQEDQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOKSCiDrkgoKIwoEBA0CAxITbGYvYTJhL3YxL2EyYS5wcm90bxiplQogspUKCiMKBAQNAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yn5cKIKqXCgojCgQEDQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGM+YCiDYmAoKIwoEBA4CABITbGYvYTJhL3YxL2EyYS5wcm90bxjKyAogz8gKCiMKBAQOAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsMoKILXKCgojCgQEDgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnLCiDwywoKIwoEBA4CARITbGYvYTJhL3YxL2EyYS5wcm90bxjRzQog2M0KCiMKBAQOAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yk88KIKHPCgojCgQEDgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGILRCiCQ0QoKIwoEBA4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxjM0gog19IKCiMKBAQOAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YwdQKIMzUCgojCgQEDgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLbWCiC91goKIwoEBA4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxi72AogyNgKCiMKBAQOAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y5tkKIPXZCgojCgQEDgIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGN/bCiDu2woKIwoEBA4CBBITbGYvYTJhL3YxL2EyYS5wcm90bxjY3Qog490KCiMKBAQOAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y4d8KIPLfCgojCgQEDgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJfhCiCo4QoKIwoEBA4CBRITbGYvYTJhL3YxL2EyYS5wcm90bxiS4wogo+MKCiMKBAQOAgUSE2xmL2EyYS92MS9hMmEucHJvdG8YjeUKIJrlCgojCgQEDgIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJjnCiCr5woKIwoEBA4CBhITbGYvYTJhL3YxL2EyYS5wcm90bxjT6Aog5egKCiMKBAQOAgYSE2xmL2EyYS92MS9hMmEucHJvdG8Yz+oKIOHqCgojCgQEDgIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGMvsCiDZ7AoKIwoEBA4CBhITbGYvYTJhL3YxL2EyYS5wcm90bxjX7gog6+4KCiMKBAQOAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YyPAKIOPwCgojCgQEDgIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGLjzCiDT8woKIwoEBA4CBxITbGYvYTJhL3YxL2EyYS5wcm90bxjl9Qog/PUKCiMKBAQOAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YrvgKIMv4CgojCgQEDwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJObCyCfmwsKIwoEBA8CABITbGYvYTJhL3YxL2EyYS5wcm90bxiQnQsgnJ0LCiMKBAQPAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3Z4LIOmeCwojCgQEDwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNqgCyDmoAsKIwoEBA8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjLogsg1KILCiMKBAQPAgISE2xmL2EyYS92MS9hMmEucHJvdG8YmqULIKOlCwojCgQEDwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJinCyCjpwsKIwoEBA8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjMqAsg1agLCiMKBAQQAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y5dILIO7SCwojCgQEEAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGO/UCyD41AsKIwoEBBACARITbGYvYTJhL3YxL2EyYS5wcm90bxi61gsgv9YLCiMKBAQQAgESE2xmL2EyYS92MS9hMmEucHJvdG8YwNgLIMXYCwojCgQEEAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIzaCyCV2gsKIwoEBBACAhITbGYvYTJhL3YxL2EyYS5wcm90bxiW3Asgn9wLCiMKBAQQAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y4t0LIOjdCwojCgQEEAIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOnfCyDv3wsKIwoEBBACBBITbGYvYTJhL3YxL2EyYS5wcm90bxi04QsgvOELCiMKBAQQAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YveMLIMXjCwojCgQEEAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGLzlCyDN5QsKIwoEBBACBRITbGYvYTJhL3YxL2EyYS5wcm90bxix6AsgwugLCiMKBAQQAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Yx+oLINrqCwojCgQEEAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGJPsCyCk7AsKIwoEBBECABITbGYvYTJhL3YxL2EyYS5wcm90bxisiQwgt4kMCiMKBAQRAgASE2xmL2EyYS92MS9hMmEucHJvdG8YoYsMIKyLDAojCgQEEQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJaNDCCdjQwKIwoEBBECABITbGYvYTJhL3YxL2EyYS5wcm90bxibjwwgqI8MCiMKBAQSAgASE2xmL2EyYS92MS9hMmEucHJvdG8YmrEMIKexDAojCgQEEgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKC0DCCvtAwKIwoEBBMCABITbGYvYTJhL3YxL2EyYS5wcm90bxj6uAwgkbkMCiMKBAQTAgESE2xmL2EyYS92MS9hMmEucHJvdG8YmLkMILG5DAojCgQEEwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLi5DCDOuQwKIwoEBBMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjVuQwg9LkMCiMKBAQTAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y+7kMII+6DAojCgQEEwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNnrDCDw6wwKIwoEBBMCABITbGYvYTJhL3YxL2EyYS5wcm90bxjC7gwg2e4MCiMKBAQTAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y+/AMIJTxDAojCgQEEwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMfyDCDe8gwKIwoEBBMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjM9Awg5fQMCiMKBAQTAgESE2xmL2EyYS92MS9hMmEucHJvdG8YvfcMINb3DAojCgQEEwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPj5DCCT+gwKIwoEBBMCARITbGYvYTJhL3YxL2EyYS5wcm90bxjI+wwg4fsMCiMKBAQTAgISE2xmL2EyYS92MS9hMmEucHJvdG8YyP0MIN/9DAojCgQEEwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLGADSDIgA0KIwoEBBMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjqgg0gg4MNCiMKBAQTAgISE2xmL2EyYS92MS9hMmEucHJvdG8YtoQNIM2EDQojCgQEEwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMuGDSDphg0KIwoEBBMCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjQiQ0g7okNCiMKBAQTAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YkIwNILCMDQojCgQEEwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOqNDSCIjg0KIwoEBBMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjzjw0giJANCiMKBAQTAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y45INIPiSDQojCgQEEwIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGJqVDSCxlQ0KIwoEBBMCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjilg0g95YNCiMKBAQUAgASE2xmL2EyYS92MS9hMmEucHJvdG8YqbgNILe4DQojCgQEFAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKy6DSC6ug0KIwoEBBQCARITbGYvYTJhL3YxL2EyYS5wcm90bxj8uw0gh7wNCiMKBAQUAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y/L0NIIe+DQojCgQEFAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGMW/DSDMvw0KIwoEBBQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjBwQ0gyMENCiMKBAQVAgASE2xmL2EyYS92MS9hMmEucHJvdG8YvOMNIMrjDQojCgQEFQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMPlDSDR5Q0KIwoEBBUCARITbGYvYTJhL3YxL2EyYS5wcm90bxiT5w0gnOcNCiMKBAQVAgESE2xmL2EyYS92MS9hMmEucHJvdG8YlekNIJ7pDQojCgQEFQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOfqDSD26g0KIwoEBBUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjv7A0g/uwNCiMKBAQWAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y+Y8OIIeQDgojCgQEFgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPyRDiCKkg4KIwoEBBYCARITbGYvYTJhL3YxL2EyYS5wcm90bxjikw4g6pMOCiMKBAQWAgESE2xmL2EyYS92MS9hMmEucHJvdG8YqpYOILKWDgojCgQEFgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKuYDiC1mA4KIwoEBBYCARITbGYvYTJhL3YxL2EyYS5wcm90bxjfmQ4g55kOCiMKBAQWAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpJsOILibDgojCgQEFgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGK2dDiDBnQ4KIwoEBBcCABITbGYvYTJhL3YxL2EyYS5wcm90bxj3vQ4ghb4OCiMKBAQXAgASE2xmL2EyYS92MS9hMmEucHJvdG8YiMAOIJbADgojCgQEFwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOrBDiD9wQ4KIwoEBBcCARITbGYvYTJhL3YxL2EyYS5wcm90bxiAxA4gk8QOCiMKBAQYAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y0eEOIN/hDgojCgQEGAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNrjDiDo4w4KIwoEBBkCABITbGYvYTJhL3YxL2EyYS5wcm90bxi56A4gy+gOCiMKBAQZAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y0ugOIOToDgojCgQEGQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOvoDiDz6A4KIwoEBBkCAxITbGYvYTJhL3YxL2EyYS5wcm90bxj66A4ggukOCiMKBAQZAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YiekOIJTpDgojCgQEGQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLeYDyDLmA8KIwoEBBkCABITbGYvYTJhL3YxL2EyYS5wcm90bxinmw8gu5sPCiMKBAQZAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y0Z0PIOedDwojCgQEGQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJOfDyCnnw8KIwoEBBkCARITbGYvYTJhL3YxL2EyYS5wcm90bxiSoQ8gpqEPCiMKBAQZAgESE2xmL2EyYS92MS9hMmEucHJvdG8YgqQPIJakDwojCgQEGQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKymDyDCpg8KIwoEBBkCARITbGYvYTJhL3YxL2EyYS5wcm90bxjupw8ggqgPCiMKBAQZAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y0akPINypDwojCgQEGQICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ2sDyCorA8KIwoEBBkCAhITbGYvYTJhL3YxL2EyYS5wcm90bxi+rg8gy64PCiMKBAQZAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y7q8PIPmvDwojCgQEGQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMixDyDTsQ8KIwoEBBkCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiUtA8gn7QPCiMKBAQZAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YtbYPIMK2DwojCgQEGQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGOW3DyDwtw8KIwoEBBkCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjGuQ8g07kPCiMKBAQZAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YmrwPIKe8DwojCgQEGQIEEhNsZi9hMmEvdjEvYTJhLnByb3RvGL2+DyDMvg8KIwoEBBkCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjxvw8g/r8PCiMKBAQaAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y4+kPIPbpDwojCgQEGgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPfrDyCK7A8KIwoEBBoCARITbGYvYTJhL3YxL2EyYS5wcm90bxjT7Q8g3u0PCiMKBAQaAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3+8PIOrvDwojCgQEGgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGLXxDyDC8Q8KIwoEBBoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjD8w8g0PMPCiMKBAQaAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yk/YPIJ/2DwojCgQEGgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGPv4DyCJ+Q8KIwoEBBoCBBITbGYvYTJhL3YxL2EyYS5wcm90bxjC+g8g0foPCiMKBAQaAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Y3vwPIO38DwojCgQEGwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIaiECCRohAKIwoEBBsCABITbGYvYTJhL3YxL2EyYS5wcm90bxiSpBAgnaQQCiMKBAQbAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y6KUQIPWlEAojCgQEGwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGPanECCDqBAKIwoEBBsCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjGqhAg0qoQCiMKBAQbAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yrq0QILytEAojCgQEHAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNHRECDk0RAKIwoEBBwCABITbGYvYTJhL3YxL2EyYS5wcm90bxjT0xAg5tMQCiMKBAQcAgESE2xmL2EyYS92MS9hMmEucHJvdG8YqNUQILXVEAojCgQEHAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKTXECCx1xAKIwoEBBwCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjr2RAg99kQCiMKBAQcAgISE2xmL2EyYS92MS9hMmEucHJvdG8YwdwQIM/cEAojCgQEHQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMSAESDPgBEKIwoEBB0CABITbGYvYTJhL3YxL2EyYS5wcm90bxi+ghEgyYIRCiMKBAQdAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yi4QRIJiEEQojCgQEHQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIeGESCUhhEKIwoEBB0CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjOiBEg2ogRCiMKBAQdAgISE2xmL2EyYS92MS9hMmEucHJvdG8YpIsRILKLEQojCgQEHgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKCyESC5shEKIwoEBB4CABITbGYvYTJhL3YxL2EyYS5wcm90bxistBEgxbQRCiMKBAQeAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yh7YRIJK2EQojCgQEHgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIW4ESCQuBEKIwoEBB4CAhITbGYvYTJhL3YxL2EyYS5wcm90bxjUuREg4bkRCiMKBAQeAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y1LsRIOG7EQojCgQEHgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ2+ESCpvhEKIwoEBB4CAxITbGYvYTJhL3YxL2EyYS5wcm90bxj3wBEghcERCiMKBAQfAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y2ugRIOPoEQojCgQEHwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNTqESDd6hEKIwoEBB8CARITbGYvYTJhL3YxL2EyYS5wcm90bxiv7BEguewRCiMKBAQfAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y7O4RIPbuEQojCgQEHwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOvwESD38BEKIwoEBB8CARITbGYvYTJhL3YxL2EyYS5wcm90bxih8hEgq/IRCiMKBAQfAgISE2xmL2EyYS92MS9hMmEucHJvdG8YlfQRIKX0EQojCgQEHwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIv3ESCb9xEKIwoEBB8CAhITbGYvYTJhL3YxL2EyYS5wcm90bxiQ+REgovkRCiMKBAQfAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y0voRIOL6EQojCgQEHwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGLn8ESDE/BEKIwoEBB8CAxITbGYvYTJhL3YxL2EyYS5wcm90bxiK/xEglf8RCiMKBAQfAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YioESIJeBEgojCgQEHwIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMKCEiDNghIKIwoEBCACABITbGYvYTJhL3YxL2EyYS5wcm90bxiyoxIgu6MSCiMKBAQgAgASE2xmL2EyYS92MS9hMmEucHJvdG8YpKUSIK2lEgojCgQEIAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGOOmEiDophIKIwoEBCACARITbGYvYTJhL3YxL2EyYS5wcm90bxjRqBIg1qgSCiMKBAQgAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yl6oSIKeqEgojCgQEIAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGI+sEiCfrBIKIwoEBCACAhITbGYvYTJhL3YxL2EyYS5wcm90bxj9rRIgj64SCiMKBAQgAgISE2xmL2EyYS92MS9hMmEucHJvdG8YxK8SINSvEgojCgQEIQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGOfeEiDw3hIKIwoEBCECABITbGYvYTJhL3YxL2EyYS5wcm90bxjd4BIg5uASCiMKBAQhAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpuISILLiEgojCgQEIQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGJ/kEiCr5BIKIwoEBCECAhITbGYvYTJhL3YxL2EyYS5wcm90bxj+5RIgh+YSCiMKBAQhAgISE2xmL2EyYS92MS9hMmEucHJvdG8Ym+gSIKToEgojCgQEIQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGODpEiDr6RIKIwoEBCECAxITbGYvYTJhL3YxL2EyYS5wcm90bxjX6xIg4usSCiMKBAQhAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YxO0SINHtEgojCgQEIQIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGIjvEiCT7xIKIwoEBCECBBITbGYvYTJhL3YxL2EyYS5wcm90bxjD8BIgz/ASCiMKBAQhAgQSE2xmL2EyYS92MS9hMmEucHJvdG8YvPISIMjyEgojCgQEIQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGIv0EiCb9BIKIwoEBCECBRITbGYvYTJhL3YxL2EyYS5wcm90bxiH9hIgl/YSCiMKBAQhAgUSE2xmL2EyYS92MS9hMmEucHJvdG8Y+fcSIIv4EgojCgQEIQIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGML5EiDS+RIKIwoEBCECBhITbGYvYTJhL3YxL2EyYS5wcm90bxi7+xIg0vsSCiMKBAQhAgYSE2xmL2EyYS92MS9hMmEucHJvdG8YoP4SILf+EgojCgQEIQIGEhNsZi9hMmEvdjEvYTJhLnByb3RvGKiAEyDBgBMKIwoEBCECBhITbGYvYTJhL3YxL2EyYS5wcm90bxj2gRMgjYITCiMKBAQhAgcSE2xmL2EyYS92MS9hMmEucHJvdG8Yw4MTINaDEwojCgQEIQIHEhNsZi9hMmEvdjEvYTJhLnByb3RvGM+FEyDihRMKIwoEBCECBxITbGYvYTJhL3YxL2EyYS5wcm90bxjEhxMg2YcTCiMKBAQhAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YkIkTIKOJEwojCgQEIgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIavEyCSrxMKIwoEBCICABITbGYvYTJhL3YxL2EyYS5wcm90bxjIsRMg1LETCiMKBAQiAgASE2xmL2EyYS92MS9hMmEucHJvdG8Yz7MTINezEwojCgQEIgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIi2EyCWthMKIwoEBCICARITbGYvYTJhL3YxL2EyYS5wcm90bxi7txMgy7cTCiMKBAQiAgESE2xmL2EyYS92MS9hMmEucHJvdG8YurkTIMq5EwojCgQEIgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGIm7EyCUuxMKIwoEBCICAhITbGYvYTJhL3YxL2EyYS5wcm90bxiCvRMgjb0TCiMKBAQiAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Yyr4TINa+EwojCgQEIgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGMTAEyDQwBMKIwoEBCMCABITbGYvYTJhL3YxL2EyYS5wcm90bxj74hMghOMTCiMKBAQjAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y8+QTIPzkEwojCgQEIwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLXmEyC65hMKIwoEBCMCARITbGYvYTJhL3YxL2EyYS5wcm90bxip6BMgrugTCiMKBAQjAgISE2xmL2EyYS92MS9hMmEucHJvdG8YlOoTIJ/qEwojCgQEIwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGOPsEyDu7BMKIwoEBCMCAhITbGYvYTJhL3YxL2EyYS5wcm90bxjh7hMg7u4TCiMKBAQjAgISE2xmL2EyYS92MS9hMmEucHJvdG8YmPATIKPwEwojCgQEJAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGLWTFCC+kxQKIwoEBCQCABITbGYvYTJhL3YxL2EyYS5wcm90bxjTlRQg3JUUCiMKBAQkAgESE2xmL2EyYS92MS9hMmEucHJvdG8YrZcUILaXFAojCgQEJAIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGMuZFCDUmRQKIwoEBCQCAhITbGYvYTJhL3YxL2EyYS5wcm90bxigmxQgpZsUCiMKBAQkAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yup0UIL+dFAojCgQEJQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGJHBFCCawRQKIwoEBCUCABITbGYvYTJhL3YxL2EyYS5wcm90bxi1wxQgvsMUCiMKBAQlAgESE2xmL2EyYS92MS9hMmEucHJvdG8YksUUIJvFFAojCgQEJQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGLbHFCC/xxQKIwoEBCUCAhITbGYvYTJhL3YxL2EyYS5wcm90bxiOyRQgk8kUCiMKBAQlAgISE2xmL2EyYS92MS9hMmEucHJvdG8YrssUILPLFAojCgQEJgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNvqFCDk6hQKIwoEBCYCABITbGYvYTJhL3YxL2EyYS5wcm90bxjd7BQg5uwUCiMKBAQmAgESE2xmL2EyYS92MS9hMmEucHJvdG8YpO4UIKnuFAojCgQEJgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKLwFCCn8BQKIwoEBCcCABITbGYvYTJhL3YxL2EyYS5wcm90bxiLlhUglJYVCiMKBAQnAgASE2xmL2EyYS92MS9hMmEucHJvdG8YrZgVILaYFQojCgQEJwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGImaFSCSmhUKIwoEBCcCARITbGYvYTJhL3YxL2EyYS5wcm90bxirnBUgtJwVCiMKBAQnAgISE2xmL2EyYS92MS9hMmEucHJvdG8YiJ4VIJOeFQojCgQEJwICEhNsZi9hMmEvdjEvYTJhLnByb3RvGKugFSC2oBUKIwoEBCcCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiJohUglaIVCiMKBAQnAgMSE2xmL2EyYS92MS9hMmEucHJvdG8YrqQVILqkFQojCgQEKAIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKTCFSCtwhUKIwoEBCgCABITbGYvYTJhL3YxL2EyYS5wcm90bxiwxBUgucQVCiMKBAQpAgASE2xmL2EyYS92MS9hMmEucHJvdG8YnMkVIKDJFQojCgQEKQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGKfJFSCuyRUKIwoEBCkCABITbGYvYTJhL3YxL2EyYS5wcm90bxi27BUgvewVCiMKBAQpAgASE2xmL2EyYS92MS9hMmEucHJvdG8Y6e4VIPDuFQojCgQEKQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKHxFSCq8RUKIwoEBCkCABITbGYvYTJhL3YxL2EyYS5wcm90bxjS8hUg2fIVCiMKBAQpAgESE2xmL2EyYS92MS9hMmEucHJvdG8YnPQVIKb0FQojCgQEKQIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGNv2FSDl9hUKIwoEBCkCARITbGYvYTJhL3YxL2EyYS5wcm90bxiW+RUgovkVCiMKBAQpAgESE2xmL2EyYS92MS9hMmEucHJvdG8YzfoVINf6FQojCgQEKgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGKT/FSCo/xUKIwoEBCoCARITbGYvYTJhL3YxL2EyYS5wcm90bxiv/xUgtv8VCiMKBAQqAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yvf8VIMr/FQojCgQEKgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGNH/FSDg/xUKIwoEBCoCABITbGYvYTJhL3YxL2EyYS5wcm90bxiIqhYgj6oWCiMKBAQqAgASE2xmL2EyYS92MS9hMmEucHJvdG8YsawWILisFgojCgQEKgIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGNquFiDjrhYKIwoEBCoCABITbGYvYTJhL3YxL2EyYS5wcm90bxiGsBYgjbAWCiMKBAQqAgESE2xmL2EyYS92MS9hMmEucHJvdG8Yy7EWINWxFgojCgQEKgIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGIC0FiCKtBYKIwoEBCoCARITbGYvYTJhL3YxL2EyYS5wcm90bxisthYguLYWCiMKBAQqAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y3rcWIOi3FgojCgQEKgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGMi5FiDXuRYKIwoEBCoCAhITbGYvYTJhL3YxL2EyYS5wcm90bxisvBYgu7wWCiMKBAQqAgISE2xmL2EyYS92MS9hMmEucHJvdG8Y3b4WIO6+FgojCgQEKgICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJnAFiCowBYKIwoEBCoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxiOwhYgn8IWCiMKBAQqAgMSE2xmL2EyYS92MS9hMmEucHJvdG8Y+sQWIIvFFgojCgQEKgIDEhNsZi9hMmEvdjEvYTJhLnByb3RvGK3HFiDAxxYKIwoEBCoCAxITbGYvYTJhL3YxL2EyYS5wcm90bxjtyBYg/sgWCiMKBAQrAgASE2xmL2EyYS92MS9hMmEucHJvdG8YyO4WINbuFgojCgQEKwIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGPrxFiCI8hYKIwoEBCsCABITbGYvYTJhL3YxL2EyYS5wcm90bxjF9BYgz/QWCiMKBAQrAgASE2xmL2EyYS92MS9hMmEucHJvdG8YwvcWINL3FgojCgQEKwIBEhNsZi9hMmEvdjEvYTJhLnByb3RvGI/5FiCf+RYKIwoEBCsCARITbGYvYTJhL3YxL2EyYS5wcm90bxi6+xYgyvsWCiEKAgUAEhNsZi9hMmEvdjEvYTJhLnByb3RvGMr8FiDT/BYKIwoEBQACABITbGYvYTJhL3YxL2EyYS5wcm90bxja/BYg8PwWCiMKBAUAAgESE2xmL2EyYS92MS9hMmEucHJvdG8Y9/wWIIv9FgojCgQFAAICEhNsZi9hMmEvdjEvYTJhLnByb3RvGJL9FiCk/RYKIwoEBQACAxITbGYvYTJhL3YxL2EyYS5wcm90bxir/RYgv/0WCiMKBAUAAgQSE2xmL2EyYS92MS9hMmEucHJvdG8Yxv0WINf9FgojCgQFAAIFEhNsZi9hMmEvdjEvYTJhLnByb3RvGN79FiDx/RYKIwoEBQACBhITbGYvYTJhL3YxL2EyYS5wcm90bxj4/RYgkf4WCiMKBAUAAgcSE2xmL2EyYS92MS9hMmEucHJvdG8YmP4WIKv+FgojCgQFAAIIEhNsZi9hMmEvdjEvYTJhLnByb3RvGLL+FiDK/hYKIQoCBQESE2xmL2EyYS92MS9hMmEucHJvdG8Y/P4WIID/FgojCgQFAQIAEhNsZi9hMmEvdjEvYTJhLnByb3RvGIf/FiCX/xYKIwoEBQECARITbGYvYTJhL3YxL2EyYS5wcm90bxie/xYgp/8WCiMKBAUBAgISE2xmL2EyYS92MS9hMmEucHJvdG8Yrv8WILj/Fg==
|
package/package.json
CHANGED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { A2AClientConfig, JsonRpcRequest, JsonRpcResponse } from "./types";
|
|
2
|
+
import {
|
|
3
|
+
AgentCard,
|
|
4
|
+
CancelTaskRequest,
|
|
5
|
+
DeleteTaskPushNotificationConfigRequest,
|
|
6
|
+
GetExtendedAgentCardRequest,
|
|
7
|
+
GetTaskPushNotificationConfigRequest,
|
|
8
|
+
GetTaskRequest,
|
|
9
|
+
ListTaskPushNotificationConfigsRequest,
|
|
10
|
+
ListTaskPushNotificationConfigsResponse,
|
|
11
|
+
ListTasksRequest,
|
|
12
|
+
ListTasksResponse,
|
|
13
|
+
SendMessageRequest,
|
|
14
|
+
StreamResponse,
|
|
15
|
+
SubscribeToTaskRequest,
|
|
16
|
+
Task,
|
|
17
|
+
TaskPushNotificationConfig,
|
|
18
|
+
} from "../../lf/a2a/v1/a2a_pb";
|
|
19
|
+
import {
|
|
20
|
+
createProtocolError,
|
|
21
|
+
JsonRpcTransportError,
|
|
22
|
+
} from "./errors";
|
|
23
|
+
import { readSseStream } from "./sse";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* JSON-RPC method identifiers.
|
|
27
|
+
* Must match the server-side method names exactly.
|
|
28
|
+
*/
|
|
29
|
+
const Methods = {
|
|
30
|
+
sendMessage: "SendMessage",
|
|
31
|
+
sendStreamingMessage: "SendStreamingMessage",
|
|
32
|
+
getTask: "GetTask",
|
|
33
|
+
listTasks: "ListTasks",
|
|
34
|
+
cancelTask: "CancelTask",
|
|
35
|
+
subscribeToTask: "SubscribeToTask",
|
|
36
|
+
getTaskPushNotificationConfig: "GetTaskPushNotificationConfig",
|
|
37
|
+
createTaskPushNotificationConfig: "CreateTaskPushNotificationConfig",
|
|
38
|
+
listTaskPushNotificationConfigs: "ListTaskPushNotificationConfigs",
|
|
39
|
+
deleteTaskPushNotificationConfig: "DeleteTaskPushNotificationConfig",
|
|
40
|
+
getExtendedAgentCard: "GetExtendedAgentCard",
|
|
41
|
+
} as const;
|
|
42
|
+
|
|
43
|
+
const JSONRPC_VERSION = "2.0";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Client for the A2A (Agent-to-Agent) API over JSON-RPC 2.0.
|
|
47
|
+
*
|
|
48
|
+
* ## Architecture
|
|
49
|
+
*
|
|
50
|
+
* The client uses two transport modes:
|
|
51
|
+
*
|
|
52
|
+
* 1. **Unary** (`request`): POST with JSON body, await single JSON response.
|
|
53
|
+
* Used for: `sendMessage`, `getTask`, `listTasks`, `cancelTask`, etc.
|
|
54
|
+
*
|
|
55
|
+
* 2. **Streaming** (`stream`): POST with JSON body, response is Server-Sent
|
|
56
|
+
* Events (SSE). Each SSE data frame is a JSON-RPC response. Used for:
|
|
57
|
+
* `sendStreamingMessage`, `subscribeToTask`.
|
|
58
|
+
*
|
|
59
|
+
* ## Error handling
|
|
60
|
+
*
|
|
61
|
+
* - **JsonRpcTransportError**: Network failures, non-2xx HTTP, stream read errors.
|
|
62
|
+
* - **JsonRpcProtocolError** (and subclasses): Server returned a JSON-RPC
|
|
63
|
+
* error object (e.g. TaskNotFoundError, UnauthenticatedError).
|
|
64
|
+
*/
|
|
65
|
+
export class A2AClient {
|
|
66
|
+
private readonly config: A2AClientConfig;
|
|
67
|
+
/** Monotonically increasing request ID counter. */
|
|
68
|
+
private requestId = 0;
|
|
69
|
+
|
|
70
|
+
constructor(config: A2AClientConfig) {
|
|
71
|
+
this.config = config;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Sends a message and waits for a single complete response.
|
|
76
|
+
* Use sendStreamingMessage() if the agent streams partial updates.
|
|
77
|
+
*/
|
|
78
|
+
async sendMessage(
|
|
79
|
+
params: SendMessageRequest.AsObject,
|
|
80
|
+
): Promise<StreamResponse.AsObject> {
|
|
81
|
+
return this.request<StreamResponse.AsObject>(Methods.sendMessage, params);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Retrieves a task by ID.
|
|
86
|
+
*/
|
|
87
|
+
async getTask(params: GetTaskRequest.AsObject): Promise<Task.AsObject> {
|
|
88
|
+
return this.request<Task.AsObject>(Methods.getTask, params);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Cancels a task by ID.
|
|
93
|
+
*/
|
|
94
|
+
async cancelTask(params: CancelTaskRequest.AsObject): Promise<Task.AsObject> {
|
|
95
|
+
return this.request<Task.AsObject>(Methods.cancelTask, params);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Lists tasks, with optional filtering and pagination. */
|
|
99
|
+
async listTasks(
|
|
100
|
+
params: Partial<ListTasksRequest.AsObject> = {},
|
|
101
|
+
): Promise<ListTasksResponse.AsObject> {
|
|
102
|
+
return this.request<ListTasksResponse.AsObject>(Methods.listTasks, params);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Retrieves a push notification config by task ID and config ID. */
|
|
106
|
+
async getTaskPushNotificationConfig(
|
|
107
|
+
params: GetTaskPushNotificationConfigRequest.AsObject,
|
|
108
|
+
): Promise<TaskPushNotificationConfig.AsObject> {
|
|
109
|
+
return this.request<TaskPushNotificationConfig.AsObject>(
|
|
110
|
+
Methods.getTaskPushNotificationConfig,
|
|
111
|
+
params,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Creates a push notification config for a task.
|
|
117
|
+
* The config itself is the request payload.
|
|
118
|
+
*/
|
|
119
|
+
async createTaskPushNotificationConfig(
|
|
120
|
+
params: TaskPushNotificationConfig.AsObject,
|
|
121
|
+
): Promise<TaskPushNotificationConfig.AsObject> {
|
|
122
|
+
return this.request<TaskPushNotificationConfig.AsObject>(
|
|
123
|
+
Methods.createTaskPushNotificationConfig,
|
|
124
|
+
params,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Lists push notification configs for a task. */
|
|
129
|
+
async listTaskPushNotificationConfigs(
|
|
130
|
+
params: ListTaskPushNotificationConfigsRequest.AsObject,
|
|
131
|
+
): Promise<ListTaskPushNotificationConfigsResponse.AsObject> {
|
|
132
|
+
return this.request<ListTaskPushNotificationConfigsResponse.AsObject>(
|
|
133
|
+
Methods.listTaskPushNotificationConfigs,
|
|
134
|
+
params,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Deletes a push notification config. Returns void — server sends an empty result. */
|
|
139
|
+
async deleteTaskPushNotificationConfig(
|
|
140
|
+
params: DeleteTaskPushNotificationConfigRequest.AsObject,
|
|
141
|
+
): Promise<void> {
|
|
142
|
+
await this.request<void>(Methods.deleteTaskPushNotificationConfig, params);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Retrieves the extended agent card. */
|
|
146
|
+
async getExtendedAgentCard(
|
|
147
|
+
params: Partial<GetExtendedAgentCardRequest.AsObject> = {},
|
|
148
|
+
): Promise<AgentCard.AsObject> {
|
|
149
|
+
return this.request<AgentCard.AsObject>(
|
|
150
|
+
Methods.getExtendedAgentCard,
|
|
151
|
+
params,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Sends a message and streams back status/artifact update events.
|
|
157
|
+
*
|
|
158
|
+
* The caller controls the stream lifetime via an AbortSignal:
|
|
159
|
+
* ```ts
|
|
160
|
+
* const controller = new AbortController()
|
|
161
|
+
* for await (const event of client.sendStreamingMessage(params, controller.signal)) {
|
|
162
|
+
* if (done) controller.abort() // exits the loop cleanly, no error thrown
|
|
163
|
+
* }
|
|
164
|
+
* ```
|
|
165
|
+
*
|
|
166
|
+
* @throws {JsonRpcTransportError} On fetch failure or stream read error.
|
|
167
|
+
* @throws {JsonRpcProtocolError} On a JSON-RPC error frame (terminal).
|
|
168
|
+
*/
|
|
169
|
+
async *sendStreamingMessage(
|
|
170
|
+
params: SendMessageRequest.AsObject,
|
|
171
|
+
signal?: AbortSignal,
|
|
172
|
+
): AsyncGenerator<StreamResponse.AsObject> {
|
|
173
|
+
yield* this.stream<StreamResponse.AsObject>(
|
|
174
|
+
Methods.sendStreamingMessage,
|
|
175
|
+
params,
|
|
176
|
+
signal,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Resubscribes to an existing task's event stream.
|
|
182
|
+
*
|
|
183
|
+
* @throws {JsonRpcTransportError} On fetch failure or stream read error.
|
|
184
|
+
* @throws {JsonRpcProtocolError} On a JSON-RPC error frame (terminal).
|
|
185
|
+
*/
|
|
186
|
+
async *subscribeToTask(
|
|
187
|
+
params: SubscribeToTaskRequest.AsObject,
|
|
188
|
+
signal?: AbortSignal,
|
|
189
|
+
): AsyncGenerator<StreamResponse.AsObject> {
|
|
190
|
+
yield* this.stream<StreamResponse.AsObject>(
|
|
191
|
+
Methods.subscribeToTask,
|
|
192
|
+
params,
|
|
193
|
+
signal,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Sends a JSON-RPC 2.0 POST request and returns the typed result.
|
|
199
|
+
*
|
|
200
|
+
* Flow: post() → parse JSON → check for error → return result
|
|
201
|
+
*
|
|
202
|
+
* @throws {JsonRpcTransportError} On fetch failure or non-2xx HTTP status.
|
|
203
|
+
* @throws {JsonRpcProtocolError} On a JSON-RPC error object in the response.
|
|
204
|
+
*/
|
|
205
|
+
private async request<R>(method: string, params?: unknown): Promise<R> {
|
|
206
|
+
const response = await this.post(method, params);
|
|
207
|
+
|
|
208
|
+
let data: JsonRpcResponse<R>;
|
|
209
|
+
try {
|
|
210
|
+
data = await response.json();
|
|
211
|
+
} catch {
|
|
212
|
+
throw new JsonRpcTransportError(
|
|
213
|
+
`Invalid JSON in response from ${method}`,
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (data.error) {
|
|
218
|
+
throw createProtocolError(data.error);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return data.result as R;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Sends a JSON-RPC 2.0 POST request and streams back typed responses via SSE.
|
|
226
|
+
*
|
|
227
|
+
* Flow: post() → readSseStream() parses SSE frames → each frame yields result
|
|
228
|
+
*
|
|
229
|
+
* Delegates frame parsing, buffering, and error handling to readSseStream().
|
|
230
|
+
*/
|
|
231
|
+
private async *stream<T>(
|
|
232
|
+
method: string,
|
|
233
|
+
params?: unknown,
|
|
234
|
+
signal?: AbortSignal,
|
|
235
|
+
): AsyncGenerator<T> {
|
|
236
|
+
const response = await this.post(method, params, signal);
|
|
237
|
+
|
|
238
|
+
for await (const frame of readSseStream<T>(response)) {
|
|
239
|
+
yield frame.result as T;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Performs the underlying POST request for both unary and streaming calls.
|
|
245
|
+
*
|
|
246
|
+
* Builds a JSON-RPC 2.0 request envelope, adds auth header if configured,
|
|
247
|
+
* and validates the HTTP response. Does not parse the response body.
|
|
248
|
+
*
|
|
249
|
+
* @throws {JsonRpcTransportError} On fetch failure or non-2xx HTTP status.
|
|
250
|
+
*/
|
|
251
|
+
private async post(
|
|
252
|
+
method: string,
|
|
253
|
+
params?: unknown,
|
|
254
|
+
signal?: AbortSignal,
|
|
255
|
+
): Promise<Response> {
|
|
256
|
+
const payload: JsonRpcRequest = {
|
|
257
|
+
jsonrpc: JSONRPC_VERSION,
|
|
258
|
+
method,
|
|
259
|
+
params,
|
|
260
|
+
id: ++this.requestId,
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
let response: Response;
|
|
264
|
+
try {
|
|
265
|
+
response = await fetch(this.config.baseUrl, {
|
|
266
|
+
method: "POST",
|
|
267
|
+
headers: await this.buildHeaders(),
|
|
268
|
+
body: JSON.stringify(payload),
|
|
269
|
+
signal,
|
|
270
|
+
});
|
|
271
|
+
} catch (cause) {
|
|
272
|
+
// AbortError is re-thrown here since it occurs before we even have a
|
|
273
|
+
// Response — the generator in stream() won't get a chance to swallow it.
|
|
274
|
+
// Let it propagate naturally so the caller sees a clean loop exit.
|
|
275
|
+
throw new JsonRpcTransportError(
|
|
276
|
+
`Network error calling ${method}: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!response.ok) {
|
|
281
|
+
throw new JsonRpcTransportError(
|
|
282
|
+
`HTTP ${response.status} ${response.statusText} calling ${method}`,
|
|
283
|
+
response.status,
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return response;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Builds request headers including Content-Type and optional Authorization. */
|
|
291
|
+
private async buildHeaders(): Promise<HeadersInit> {
|
|
292
|
+
const headers: Record<string, string> = {
|
|
293
|
+
"Content-Type": "application/json",
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
if (this.config.getToken) {
|
|
297
|
+
const token = await this.config.getToken();
|
|
298
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return headers;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { JsonRpcError } from "./types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base error for JSON-RPC protocol-level failures.
|
|
5
|
+
*
|
|
6
|
+
* Thrown when the server returns a JSON-RPC error object (`error` field)
|
|
7
|
+
* instead of a successful result. Use `instanceof` checks or the
|
|
8
|
+
* `code` property to distinguish specific error types.
|
|
9
|
+
*/
|
|
10
|
+
export class JsonRpcProtocolError extends Error {
|
|
11
|
+
/** The JSON-RPC error code (e.g. -32001, -31401). */
|
|
12
|
+
public readonly code: number;
|
|
13
|
+
/** Optional additional data from the server. */
|
|
14
|
+
public readonly data: unknown;
|
|
15
|
+
|
|
16
|
+
constructor(error: JsonRpcError) {
|
|
17
|
+
super(error.message);
|
|
18
|
+
this.name = "JsonRpcProtocolError";
|
|
19
|
+
this.code = error.code;
|
|
20
|
+
this.data = error.data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Error for network or HTTP transport failures.
|
|
26
|
+
*
|
|
27
|
+
* Thrown when:
|
|
28
|
+
* - The fetch fails (network unreachable, DNS, etc.)
|
|
29
|
+
* - The HTTP response is not 2xx
|
|
30
|
+
* - The response body cannot be read (e.g. stream error)
|
|
31
|
+
*/
|
|
32
|
+
export class JsonRpcTransportError extends Error {
|
|
33
|
+
/** HTTP status code, if the failure was due to a non-2xx response. */
|
|
34
|
+
public readonly status?: number;
|
|
35
|
+
|
|
36
|
+
constructor(message: string, status?: number) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = "JsonRpcTransportError";
|
|
39
|
+
this.status = status;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Task not found (code -32001). */
|
|
44
|
+
export class TaskNotFoundError extends JsonRpcProtocolError {}
|
|
45
|
+
|
|
46
|
+
/** Task is not in a cancelable state (code -32002). */
|
|
47
|
+
export class TaskNotCancelableError extends JsonRpcProtocolError {}
|
|
48
|
+
|
|
49
|
+
/** Server does not support push notifications (code -32003). */
|
|
50
|
+
export class PushNotificationNotSupportedError extends JsonRpcProtocolError {}
|
|
51
|
+
|
|
52
|
+
/** Operation is not supported (code -32004). */
|
|
53
|
+
export class UnsupportedOperationError extends JsonRpcProtocolError {}
|
|
54
|
+
|
|
55
|
+
/** Content type not supported (code -32005). */
|
|
56
|
+
export class ContentTypeNotSupportedError extends JsonRpcProtocolError {}
|
|
57
|
+
|
|
58
|
+
/** Invalid agent response (code -32006). */
|
|
59
|
+
export class InvalidAgentResponseError extends JsonRpcProtocolError {}
|
|
60
|
+
|
|
61
|
+
/** Extended card not configured (code -32007). */
|
|
62
|
+
export class ExtendedCardNotConfiguredError extends JsonRpcProtocolError {}
|
|
63
|
+
|
|
64
|
+
/** Unauthenticated (code -31401). */
|
|
65
|
+
export class UnauthenticatedError extends JsonRpcProtocolError {}
|
|
66
|
+
|
|
67
|
+
/** Unauthorized (code -31403). */
|
|
68
|
+
export class UnauthorizedError extends JsonRpcProtocolError {}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Maps A2A-specific error codes to typed error classes.
|
|
72
|
+
* Unknown codes fall back to JsonRpcProtocolError.
|
|
73
|
+
*/
|
|
74
|
+
const errorClassMap: Record<
|
|
75
|
+
number,
|
|
76
|
+
new (e: JsonRpcError) => JsonRpcProtocolError
|
|
77
|
+
> = {
|
|
78
|
+
[-32001]: TaskNotFoundError,
|
|
79
|
+
[-32002]: TaskNotCancelableError,
|
|
80
|
+
[-32003]: PushNotificationNotSupportedError,
|
|
81
|
+
[-32004]: UnsupportedOperationError,
|
|
82
|
+
[-32005]: ContentTypeNotSupportedError,
|
|
83
|
+
[-32006]: InvalidAgentResponseError,
|
|
84
|
+
[-32007]: ExtendedCardNotConfiguredError,
|
|
85
|
+
[-31401]: UnauthenticatedError,
|
|
86
|
+
[-31403]: UnauthorizedError,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Creates a protocol error instance from a JSON-RPC error object.
|
|
91
|
+
*
|
|
92
|
+
* Returns a typed subclass (e.g. TaskNotFoundError) when the error code
|
|
93
|
+
* is known; otherwise returns a generic JsonRpcProtocolError.
|
|
94
|
+
*
|
|
95
|
+
* @param error - The JSON-RPC error object from the server
|
|
96
|
+
* @returns A JsonRpcProtocolError or one of its subclasses
|
|
97
|
+
*/
|
|
98
|
+
export function createProtocolError(error: JsonRpcError): JsonRpcProtocolError {
|
|
99
|
+
const cls = errorClassMap[error.code];
|
|
100
|
+
return cls ? new cls(error) : new JsonRpcProtocolError(error);
|
|
101
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A JSON-RPC Transport
|
|
3
|
+
*
|
|
4
|
+
* Provides a TypeScript client for the Agent-to-Agent (A2A) API over JSON-RPC 2.0.
|
|
5
|
+
* Supports both unary requests (single request/response) and streaming (SSE).
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export { A2AClient } from "./client";
|
|
11
|
+
export {
|
|
12
|
+
createProtocolError,
|
|
13
|
+
JsonRpcProtocolError,
|
|
14
|
+
JsonRpcTransportError,
|
|
15
|
+
TaskNotFoundError,
|
|
16
|
+
TaskNotCancelableError,
|
|
17
|
+
PushNotificationNotSupportedError,
|
|
18
|
+
UnsupportedOperationError,
|
|
19
|
+
ContentTypeNotSupportedError,
|
|
20
|
+
InvalidAgentResponseError,
|
|
21
|
+
ExtendedCardNotConfiguredError,
|
|
22
|
+
UnauthenticatedError,
|
|
23
|
+
UnauthorizedError,
|
|
24
|
+
} from "./errors";
|
|
25
|
+
export type {
|
|
26
|
+
A2AClientConfig,
|
|
27
|
+
JsonRpcError,
|
|
28
|
+
JsonRpcRequest,
|
|
29
|
+
JsonRpcResponse,
|
|
30
|
+
} from "./types";
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type { JsonRpcResponse } from "./types";
|
|
2
|
+
import { createProtocolError, JsonRpcTransportError } from "./errors";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Parsed SSE frame structure.
|
|
6
|
+
*
|
|
7
|
+
* An SSE frame is a block of lines terminated by a blank line (\n\n).
|
|
8
|
+
* Supported fields:
|
|
9
|
+
* - data: JSON payload (multiple data lines are concatenated)
|
|
10
|
+
* - event: optional event type
|
|
11
|
+
* - id: optional event ID
|
|
12
|
+
* - : comment (ignored)
|
|
13
|
+
*/
|
|
14
|
+
interface SseFrame {
|
|
15
|
+
/** Accumulated data payload. */
|
|
16
|
+
data: string;
|
|
17
|
+
/** Optional event type. */
|
|
18
|
+
event?: string;
|
|
19
|
+
/** Optional event ID. */
|
|
20
|
+
id?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Parses a raw SSE fetch Response into an async generator of typed JSON-RPC
|
|
25
|
+
* response objects.
|
|
26
|
+
*
|
|
27
|
+
* ## Flow
|
|
28
|
+
*
|
|
29
|
+
* 1. Read response body through TextDecoderStream
|
|
30
|
+
* 2. Accumulate chunks, split on frame boundaries (\n\n or \r\n\r\n)
|
|
31
|
+
* 3. For each complete frame: parse SSE fields → parse JSON → yield or throw
|
|
32
|
+
* 4. Swallow AbortError so callers can cancel cleanly without a catch block
|
|
33
|
+
*
|
|
34
|
+
* ## Behavior
|
|
35
|
+
*
|
|
36
|
+
* - Handles partial chunks by accumulating lines across chunk boundaries
|
|
37
|
+
* - Ignores comment lines (:) and empty frames
|
|
38
|
+
* - Malformed JSON frames are skipped (e.g. keep-alive payloads)
|
|
39
|
+
* - Error frames are terminal: throws typed JsonRpcProtocolError subclass
|
|
40
|
+
*
|
|
41
|
+
* @param response - A successful fetch Response with a readable body
|
|
42
|
+
* @throws {JsonRpcTransportError} On null body or stream read failures
|
|
43
|
+
* @throws {JsonRpcProtocolError} On JSON-RPC error frames (terminal)
|
|
44
|
+
*/
|
|
45
|
+
export async function* readSseStream<T>(
|
|
46
|
+
response: Response,
|
|
47
|
+
): AsyncGenerator<JsonRpcResponse<T>> {
|
|
48
|
+
if (!response.body) {
|
|
49
|
+
throw new JsonRpcTransportError(
|
|
50
|
+
"Response body is null — cannot read SSE stream",
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
|
|
55
|
+
|
|
56
|
+
// Accumulates characters between \n\n frame boundaries.
|
|
57
|
+
let buffer = "";
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
while (true) {
|
|
61
|
+
let done: boolean;
|
|
62
|
+
let value: string | undefined;
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
({ done, value } = await reader.read());
|
|
66
|
+
} catch (cause) {
|
|
67
|
+
// Swallow AbortError — caller intentionally cancelled the stream.
|
|
68
|
+
if (isAbortError(cause)) return;
|
|
69
|
+
throw new JsonRpcTransportError(
|
|
70
|
+
`SSE stream read error: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (done) break;
|
|
75
|
+
|
|
76
|
+
buffer += value;
|
|
77
|
+
|
|
78
|
+
// Frames are delimited by a blank line (\n\n or \r\n\r\n).
|
|
79
|
+
// We split on double-newline and process all complete frames,
|
|
80
|
+
// keeping any trailing incomplete frame in the buffer.
|
|
81
|
+
const frames = buffer.split(/\n\n|\r\n\r\n/);
|
|
82
|
+
// Last element is the incomplete tail (may be empty string)
|
|
83
|
+
buffer = frames.pop() ?? "";
|
|
84
|
+
|
|
85
|
+
for (const rawFrame of frames) {
|
|
86
|
+
const frame = parseFrame(rawFrame);
|
|
87
|
+
if (!frame) continue; // empty or comment-only frame
|
|
88
|
+
|
|
89
|
+
yield* processFrame<T>(frame);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Process any remaining buffered content after stream closes.
|
|
94
|
+
if (buffer.trim()) {
|
|
95
|
+
const frame = parseFrame(buffer);
|
|
96
|
+
if (frame) yield* processFrame<T>(frame);
|
|
97
|
+
}
|
|
98
|
+
} finally {
|
|
99
|
+
reader.releaseLock();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Parses raw SSE frame text into a structured SseFrame.
|
|
105
|
+
*
|
|
106
|
+
* Per SSE spec: field names are case-sensitive; value has leading space stripped.
|
|
107
|
+
* Multiple `data:` lines are concatenated with newlines.
|
|
108
|
+
*
|
|
109
|
+
* @param raw - Raw frame text (lines before the blank delimiter)
|
|
110
|
+
* @returns Parsed frame or null for empty/comment-only frames
|
|
111
|
+
*/
|
|
112
|
+
function parseFrame(raw: string): SseFrame | null {
|
|
113
|
+
const frame: SseFrame = { data: "" };
|
|
114
|
+
let hasData = false;
|
|
115
|
+
|
|
116
|
+
for (const line of raw.split(/\n|\r\n/)) {
|
|
117
|
+
if (!line || line.startsWith(":")) continue; // empty line or comment
|
|
118
|
+
|
|
119
|
+
const colonIdx = line.indexOf(":");
|
|
120
|
+
if (colonIdx === -1) continue; // malformed line, skip
|
|
121
|
+
|
|
122
|
+
const field = line.slice(0, colonIdx).trim();
|
|
123
|
+
// Per SSE spec, strip exactly one leading space after the colon if present.
|
|
124
|
+
const val = line.slice(colonIdx + 1).replace(/^ /, "");
|
|
125
|
+
|
|
126
|
+
switch (field) {
|
|
127
|
+
case "data":
|
|
128
|
+
// Multiple data lines are concatenated with newlines (SSE spec §9.2.6).
|
|
129
|
+
frame.data = frame.data ? `${frame.data}\n${val}` : val;
|
|
130
|
+
hasData = true;
|
|
131
|
+
break;
|
|
132
|
+
case "event":
|
|
133
|
+
frame.event = val;
|
|
134
|
+
break;
|
|
135
|
+
case "id":
|
|
136
|
+
frame.id = val;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return hasData ? frame : null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Parses an SSE frame's data as a JSON-RPC response and yields it.
|
|
146
|
+
*
|
|
147
|
+
* - Successful responses are yielded to the caller
|
|
148
|
+
* - Error responses throw a typed protocol error (via createProtocolError)
|
|
149
|
+
* - Malformed JSON is skipped (no yield, no throw)
|
|
150
|
+
*
|
|
151
|
+
* @throws {JsonRpcProtocolError} When frame contains a JSON-RPC error object
|
|
152
|
+
*/
|
|
153
|
+
function* processFrame<T>(frame: SseFrame): Generator<JsonRpcResponse<T>> {
|
|
154
|
+
let parsed: JsonRpcResponse<T>;
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
parsed = JSON.parse(frame.data);
|
|
158
|
+
} catch {
|
|
159
|
+
// Malformed JSON — skip non-JSON frames (e.g. keep-alive data payloads).
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (parsed.error) {
|
|
164
|
+
// An error frame is terminal — throw so the caller's for-await catches it.
|
|
165
|
+
throw createProtocolError(parsed.error);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
yield parsed;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Detects AbortError from DOMException (used when fetch/stream is aborted). */
|
|
172
|
+
function isAbortError(err: unknown): boolean {
|
|
173
|
+
return err instanceof DOMException && err.name === "AbortError";
|
|
174
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC 2.0 type definitions and client configuration.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the core types used by the A2A JSON-RPC client for:
|
|
5
|
+
* - Request/response serialization over HTTP
|
|
6
|
+
* - Error handling (protocol vs transport errors)
|
|
7
|
+
* - Client configuration (base URL, auth)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Standard JSON-RPC 2.0 error object (spec-compliant).
|
|
12
|
+
*
|
|
13
|
+
* Server errors include both standard JSON-RPC codes and A2A-specific
|
|
14
|
+
* application codes (e.g. -32001 for TaskNotFound).
|
|
15
|
+
*/
|
|
16
|
+
export interface JsonRpcError {
|
|
17
|
+
/**
|
|
18
|
+
* Integer error code.
|
|
19
|
+
*
|
|
20
|
+
* Standard JSON-RPC 2.0 codes:
|
|
21
|
+
* - -32700: Parse error
|
|
22
|
+
* - -32600: Invalid request
|
|
23
|
+
* - -32601: Method not found
|
|
24
|
+
* - -32602: Invalid params
|
|
25
|
+
* - -32603: Internal error
|
|
26
|
+
*
|
|
27
|
+
* A2A-specific application codes:
|
|
28
|
+
* - -32001: Task not found
|
|
29
|
+
* - -32002: Task not cancelable
|
|
30
|
+
* - -32003: Push notification not supported
|
|
31
|
+
* - -32004: Unsupported operation
|
|
32
|
+
* - -32005: Content type not supported
|
|
33
|
+
* - -32006: Invalid agent response
|
|
34
|
+
* - -32007: Extended card not configured
|
|
35
|
+
* - -31401: Unauthenticated
|
|
36
|
+
* - -31403: Unauthorized
|
|
37
|
+
*/
|
|
38
|
+
code: number;
|
|
39
|
+
/** Human-readable error message. */
|
|
40
|
+
message: string;
|
|
41
|
+
/** Optional additional error data. */
|
|
42
|
+
data?: unknown;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Outbound JSON-RPC 2.0 request envelope.
|
|
47
|
+
*
|
|
48
|
+
* Sent as the body of each POST request to the A2A server.
|
|
49
|
+
*/
|
|
50
|
+
export interface JsonRpcRequest<P = unknown> {
|
|
51
|
+
/** Must be "2.0" per JSON-RPC specification. */
|
|
52
|
+
jsonrpc: "2.0";
|
|
53
|
+
/** The RPC method name (e.g. "SendMessage", "GetTask"). */
|
|
54
|
+
method: string;
|
|
55
|
+
/** Optional parameters object. */
|
|
56
|
+
params?: P;
|
|
57
|
+
/** Request ID for correlating responses. */
|
|
58
|
+
id: string | number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Inbound JSON-RPC 2.0 response envelope.
|
|
63
|
+
*
|
|
64
|
+
* Exactly one of `result` or `error` is set.
|
|
65
|
+
* Used for both unary responses (single JSON body) and streaming responses
|
|
66
|
+
* (each SSE data frame is a JsonRpcResponse).
|
|
67
|
+
*/
|
|
68
|
+
export type JsonRpcResponse<R = unknown> =
|
|
69
|
+
| { jsonrpc: "2.0"; id: string | number; result: R; error?: never }
|
|
70
|
+
| {
|
|
71
|
+
jsonrpc: "2.0";
|
|
72
|
+
id: string | number;
|
|
73
|
+
error: JsonRpcError;
|
|
74
|
+
result?: never;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Configuration for the A2A JSON-RPC client.
|
|
79
|
+
*/
|
|
80
|
+
export interface A2AClientConfig {
|
|
81
|
+
/** Base URL of the A2A agent server, e.g. `https://a2a-agent.example.com/jsonrpc`. */
|
|
82
|
+
baseUrl: string;
|
|
83
|
+
/**
|
|
84
|
+
* Optional bearer token provider.
|
|
85
|
+
* Only needed when not going through an auth gateway.
|
|
86
|
+
* May be async to support token refresh.
|
|
87
|
+
*/
|
|
88
|
+
getToken?: () => string | Promise<string>;
|
|
89
|
+
}
|