@thinkhive/sdk 3.1.1 → 4.0.0
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/MIGRATION.md +83 -12
- package/README.md +279 -128
- package/dist/api/agents.d.ts +169 -0
- package/dist/api/agents.js +185 -0
- package/dist/api/apiKeys.d.ts +252 -0
- package/dist/api/apiKeys.js +298 -0
- package/dist/api/business-metrics.d.ts +188 -0
- package/dist/api/business-metrics.js +213 -0
- package/dist/api/calibration.d.ts +0 -62
- package/dist/api/calibration.js +5 -48
- package/dist/api/claims.js +10 -7
- package/dist/api/conversation-eval.d.ts +200 -0
- package/dist/api/conversation-eval.js +235 -0
- package/dist/api/deterministic-graders.d.ts +205 -0
- package/dist/api/deterministic-graders.js +191 -0
- package/dist/api/eval-health.d.ts +250 -0
- package/dist/api/eval-health.js +224 -0
- package/dist/api/human-review.d.ts +275 -0
- package/dist/api/human-review.js +236 -0
- package/dist/api/nondeterminism.d.ts +300 -0
- package/dist/api/nondeterminism.js +250 -0
- package/dist/api/quality-metrics.d.ts +303 -0
- package/dist/api/quality-metrics.js +198 -0
- package/dist/api/roi-analytics.d.ts +263 -0
- package/dist/api/roi-analytics.js +204 -0
- package/dist/api/runs.js +12 -6
- package/dist/api/transcript-patterns.d.ts +204 -0
- package/dist/api/transcript-patterns.js +227 -0
- package/dist/core/client.d.ts +83 -9
- package/dist/core/client.js +229 -34
- package/dist/core/config.d.ts +2 -3
- package/dist/core/config.js +3 -4
- package/dist/core/types.d.ts +57 -4
- package/dist/core/types.js +1 -1
- package/dist/index.d.ts +429 -76
- package/dist/index.js +262 -42
- package/package.json +2 -2
package/dist/core/client.js
CHANGED
|
@@ -5,21 +5,46 @@
|
|
|
5
5
|
* Centralized HTTP client with authentication and error handling
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.ThinkHiveValidationError = exports.ThinkHiveApiError = void 0;
|
|
8
|
+
exports.IpWhitelistError = exports.RateLimitError = exports.AgentScopeError = exports.PermissionDeniedError = exports.ThinkHiveValidationError = exports.ThinkHiveApiError = exports.ThinkHiveError = void 0;
|
|
9
9
|
exports.apiRequest = apiRequest;
|
|
10
10
|
exports.apiRequestWithData = apiRequestWithData;
|
|
11
11
|
const config_1 = require("./config");
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// RETRY CONFIGURATION
|
|
14
|
+
// ============================================================================
|
|
15
|
+
const MAX_RETRIES = 3;
|
|
16
|
+
const INITIAL_BACKOFF = 500; // ms
|
|
17
|
+
const MAX_BACKOFF = 8000; // ms
|
|
18
|
+
const RETRYABLE_CODES = new Set([408, 429, 500, 502, 503, 504]);
|
|
19
|
+
/**
|
|
20
|
+
* Calculate backoff time for retry attempt
|
|
21
|
+
*/
|
|
22
|
+
function calculateBackoff(attempt, retryAfter) {
|
|
23
|
+
if (retryAfter !== undefined) {
|
|
24
|
+
return Math.min(retryAfter * 1000, MAX_BACKOFF); // Convert seconds to ms
|
|
25
|
+
}
|
|
26
|
+
const backoff = INITIAL_BACKOFF * Math.pow(2, attempt);
|
|
27
|
+
return Math.min(backoff, MAX_BACKOFF);
|
|
28
|
+
}
|
|
12
29
|
/**
|
|
13
|
-
*
|
|
30
|
+
* Sleep for a given number of milliseconds
|
|
31
|
+
*/
|
|
32
|
+
function sleep(ms) {
|
|
33
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Make an authenticated API request with retry logic
|
|
14
37
|
*/
|
|
15
38
|
async function apiRequest(path, options = {}) {
|
|
16
39
|
const config = (0, config_1.getConfig)();
|
|
17
|
-
const { method = 'GET', body, headers = {}, apiVersion } = options;
|
|
18
|
-
const version = apiVersion ||
|
|
19
|
-
const url = `${config.endpoint}/api/${version}${path}`;
|
|
40
|
+
const { method = 'GET', body, headers = {}, apiVersion, maxRetries, timeout } = options;
|
|
41
|
+
const version = apiVersion === 'none' ? '' : (apiVersion || '');
|
|
42
|
+
const url = version ? `${config.endpoint}/api/${version}${path}` : `${config.endpoint}/api${path}`;
|
|
43
|
+
const retries = maxRetries ?? MAX_RETRIES;
|
|
44
|
+
const requestTimeout = timeout ?? 30000; // Default 30s
|
|
20
45
|
const requestHeaders = {
|
|
21
46
|
'Content-Type': 'application/json',
|
|
22
|
-
'X-SDK-Version':
|
|
47
|
+
'X-SDK-Version': config_1.SDK_VERSION,
|
|
23
48
|
...headers,
|
|
24
49
|
};
|
|
25
50
|
if (config.apiKey) {
|
|
@@ -29,32 +54,112 @@ async function apiRequest(path, options = {}) {
|
|
|
29
54
|
requestHeaders['X-Agent-ID'] = config.agentId;
|
|
30
55
|
}
|
|
31
56
|
(0, config_1.debugLog)(`${method} ${url}`);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
headers: requestHeaders,
|
|
35
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
36
|
-
});
|
|
37
|
-
// Handle deprecation warnings
|
|
38
|
-
if (response.headers.has('Deprecation')) {
|
|
39
|
-
const sunset = response.headers.get('Sunset');
|
|
40
|
-
const link = response.headers.get('Link');
|
|
41
|
-
console.warn(`[ThinkHive] Deprecation warning: This endpoint is deprecated.` +
|
|
42
|
-
(sunset ? ` Sunset: ${sunset}` : '') +
|
|
43
|
-
(link ? ` Successor: ${link}` : ''));
|
|
44
|
-
}
|
|
45
|
-
if (!response.ok) {
|
|
46
|
-
const errorText = await response.text();
|
|
47
|
-
let errorData = {};
|
|
57
|
+
let lastError = null;
|
|
58
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
48
59
|
try {
|
|
49
|
-
|
|
60
|
+
// Create abort controller for timeout
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timeoutId = setTimeout(() => controller.abort(), requestTimeout);
|
|
63
|
+
let response;
|
|
64
|
+
try {
|
|
65
|
+
response = await fetch(url, {
|
|
66
|
+
method,
|
|
67
|
+
headers: requestHeaders,
|
|
68
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
69
|
+
signal: controller.signal,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
clearTimeout(timeoutId);
|
|
74
|
+
}
|
|
75
|
+
// Handle deprecation warnings
|
|
76
|
+
if (response.headers.has('Deprecation')) {
|
|
77
|
+
const sunset = response.headers.get('Sunset');
|
|
78
|
+
const link = response.headers.get('Link');
|
|
79
|
+
console.warn(`[ThinkHive] Deprecation warning: This endpoint is deprecated.` +
|
|
80
|
+
(sunset ? ` Sunset: ${sunset}` : '') +
|
|
81
|
+
(link ? ` Successor: ${link}` : ''));
|
|
82
|
+
}
|
|
83
|
+
// Check if response is retryable
|
|
84
|
+
if (RETRYABLE_CODES.has(response.status) && attempt < retries) {
|
|
85
|
+
// Get Retry-After header if present (for 429 responses)
|
|
86
|
+
let retryAfter;
|
|
87
|
+
if (response.status === 429) {
|
|
88
|
+
const retryAfterHeader = response.headers.get('Retry-After');
|
|
89
|
+
if (retryAfterHeader) {
|
|
90
|
+
retryAfter = parseFloat(retryAfterHeader);
|
|
91
|
+
if (isNaN(retryAfter)) {
|
|
92
|
+
retryAfter = undefined;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const backoff = calculateBackoff(attempt, retryAfter);
|
|
97
|
+
(0, config_1.debugLog)(`Retrying after ${backoff}ms (attempt ${attempt + 1}/${retries})`);
|
|
98
|
+
await sleep(backoff);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const errorText = await response.text();
|
|
103
|
+
let errorData = {};
|
|
104
|
+
try {
|
|
105
|
+
errorData = JSON.parse(errorText);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
errorData = { message: errorText };
|
|
109
|
+
}
|
|
110
|
+
// Handle rate limit specifically
|
|
111
|
+
if (response.status === 429) {
|
|
112
|
+
const retryAfterHeader = response.headers.get('Retry-After');
|
|
113
|
+
const retryAfter = retryAfterHeader ? parseFloat(retryAfterHeader) * 1000 : 60000;
|
|
114
|
+
throw new RateLimitError(retryAfter);
|
|
115
|
+
}
|
|
116
|
+
throw new ThinkHiveApiError(errorData.message || `HTTP ${response.status}`, response.status, errorData.code);
|
|
117
|
+
}
|
|
118
|
+
// Handle 204 No Content (e.g., successful DELETE)
|
|
119
|
+
if (response.status === 204) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
return response.json();
|
|
50
123
|
}
|
|
51
|
-
catch {
|
|
52
|
-
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Handle abort (timeout)
|
|
126
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
127
|
+
lastError = new ThinkHiveApiError(`Request timed out after ${requestTimeout}ms`, 408);
|
|
128
|
+
if (attempt < retries) {
|
|
129
|
+
const backoff = calculateBackoff(attempt);
|
|
130
|
+
(0, config_1.debugLog)(`Request timed out, retrying after ${backoff}ms (attempt ${attempt + 1}/${retries})`);
|
|
131
|
+
await sleep(backoff);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
throw lastError;
|
|
135
|
+
}
|
|
136
|
+
// Handle network errors (TypeError from fetch)
|
|
137
|
+
if (error instanceof TypeError) {
|
|
138
|
+
lastError = new ThinkHiveApiError(`Network error: ${error.message}`, 503);
|
|
139
|
+
if (attempt < retries) {
|
|
140
|
+
const backoff = calculateBackoff(attempt);
|
|
141
|
+
(0, config_1.debugLog)(`Network error, retrying after ${backoff}ms (attempt ${attempt + 1}/${retries})`);
|
|
142
|
+
await sleep(backoff);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
throw lastError;
|
|
146
|
+
}
|
|
147
|
+
// Re-throw ThinkHive errors (non-retryable)
|
|
148
|
+
if (error instanceof ThinkHiveError) {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
// Unknown error
|
|
152
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
153
|
+
if (attempt < retries) {
|
|
154
|
+
const backoff = calculateBackoff(attempt);
|
|
155
|
+
await sleep(backoff);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
throw new ThinkHiveApiError(`Request failed: ${lastError.message}`, 500);
|
|
53
159
|
}
|
|
54
|
-
const error = new ThinkHiveApiError(errorData.message || `HTTP ${response.status}`, response.status, errorData.code);
|
|
55
|
-
throw error;
|
|
56
160
|
}
|
|
57
|
-
|
|
161
|
+
// Should not reach here, but just in case
|
|
162
|
+
throw lastError || new ThinkHiveApiError('Request failed after all retries', 500);
|
|
58
163
|
}
|
|
59
164
|
/**
|
|
60
165
|
* Make an API request and extract data from response wrapper
|
|
@@ -69,21 +174,111 @@ async function apiRequestWithData(path, options = {}) {
|
|
|
69
174
|
// ============================================================================
|
|
70
175
|
// ERRORS
|
|
71
176
|
// ============================================================================
|
|
72
|
-
|
|
73
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Base error class for ThinkHive SDK errors
|
|
179
|
+
*/
|
|
180
|
+
class ThinkHiveError extends Error {
|
|
181
|
+
constructor(message, code, statusCode, details) {
|
|
74
182
|
super(message);
|
|
75
|
-
this.statusCode = statusCode;
|
|
76
183
|
this.code = code;
|
|
184
|
+
this.statusCode = statusCode;
|
|
185
|
+
this.details = details;
|
|
186
|
+
this.name = 'ThinkHiveError';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.ThinkHiveError = ThinkHiveError;
|
|
190
|
+
/**
|
|
191
|
+
* API request error - returned from ThinkHive server
|
|
192
|
+
*/
|
|
193
|
+
class ThinkHiveApiError extends ThinkHiveError {
|
|
194
|
+
constructor(message, statusCode, code) {
|
|
195
|
+
super(message, code || 'API_ERROR', statusCode);
|
|
77
196
|
this.name = 'ThinkHiveApiError';
|
|
78
197
|
}
|
|
79
198
|
}
|
|
80
199
|
exports.ThinkHiveApiError = ThinkHiveApiError;
|
|
81
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Validation error - invalid input parameters
|
|
202
|
+
*/
|
|
203
|
+
class ThinkHiveValidationError extends ThinkHiveError {
|
|
82
204
|
constructor(message, field) {
|
|
83
|
-
super(message);
|
|
205
|
+
super(message, 'VALIDATION_ERROR', 400, field ? { field } : undefined);
|
|
84
206
|
this.field = field;
|
|
85
207
|
this.name = 'ThinkHiveValidationError';
|
|
86
208
|
}
|
|
87
209
|
}
|
|
88
210
|
exports.ThinkHiveValidationError = ThinkHiveValidationError;
|
|
89
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Permission denied error - API key lacks required permissions
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* try {
|
|
216
|
+
* await thinkHive.traces.create(...);
|
|
217
|
+
* } catch (error) {
|
|
218
|
+
* if (error instanceof PermissionDeniedError) {
|
|
219
|
+
* console.log('API key needs write permission');
|
|
220
|
+
* }
|
|
221
|
+
* }
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
class PermissionDeniedError extends ThinkHiveError {
|
|
225
|
+
constructor(message, details) {
|
|
226
|
+
super(message, 'PERMISSION_DENIED', 403, details);
|
|
227
|
+
this.name = 'PermissionDeniedError';
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
exports.PermissionDeniedError = PermissionDeniedError;
|
|
231
|
+
/**
|
|
232
|
+
* Agent scope violation error - API key not authorized for this agent
|
|
233
|
+
* @example
|
|
234
|
+
* ```typescript
|
|
235
|
+
* // Create key scoped to specific agents
|
|
236
|
+
* const key = await thinkHive.apiKeys.create({
|
|
237
|
+
* name: 'Agent A Key',
|
|
238
|
+
* allowedAgentIds: ['agent-a-id']
|
|
239
|
+
* });
|
|
240
|
+
*
|
|
241
|
+
* // Attempting to use for Agent B will throw AgentScopeError
|
|
242
|
+
* ```
|
|
243
|
+
*/
|
|
244
|
+
class AgentScopeError extends ThinkHiveError {
|
|
245
|
+
constructor(agentId, allowedAgents) {
|
|
246
|
+
super(`API key not authorized for agent ${agentId}`, 'AGENT_SCOPE_VIOLATION', 403, { agentId, allowedAgents });
|
|
247
|
+
this.name = 'AgentScopeError';
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.AgentScopeError = AgentScopeError;
|
|
251
|
+
/**
|
|
252
|
+
* Rate limit exceeded error
|
|
253
|
+
* @example
|
|
254
|
+
* ```typescript
|
|
255
|
+
* try {
|
|
256
|
+
* await thinkHive.traces.create(...);
|
|
257
|
+
* } catch (error) {
|
|
258
|
+
* if (error instanceof RateLimitError) {
|
|
259
|
+
* // Wait and retry
|
|
260
|
+
* await sleep(error.retryAfter);
|
|
261
|
+
* await thinkHive.traces.create(...);
|
|
262
|
+
* }
|
|
263
|
+
* }
|
|
264
|
+
* ```
|
|
265
|
+
*/
|
|
266
|
+
class RateLimitError extends ThinkHiveError {
|
|
267
|
+
constructor(retryAfter) {
|
|
268
|
+
super(`Rate limit exceeded. Retry after ${retryAfter}ms`, 'RATE_LIMIT_EXCEEDED', 429, { retryAfter });
|
|
269
|
+
this.retryAfter = retryAfter;
|
|
270
|
+
this.name = 'RateLimitError';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.RateLimitError = RateLimitError;
|
|
274
|
+
/**
|
|
275
|
+
* IP whitelist violation error
|
|
276
|
+
*/
|
|
277
|
+
class IpWhitelistError extends ThinkHiveError {
|
|
278
|
+
constructor(clientIp) {
|
|
279
|
+
super('Request IP address is not authorized for this API key', 'IP_WHITELIST_VIOLATION', 403, { clientIp });
|
|
280
|
+
this.name = 'IpWhitelistError';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
exports.IpWhitelistError = IpWhitelistError;
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUFtREgsZ0NBcUpDO0FBS0QsZ0RBYUM7QUF4TkQscUNBQTREO0FBRzVELCtFQUErRTtBQUMvRSxzQkFBc0I7QUFDdEIsK0VBQStFO0FBRS9FLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0QixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLO0FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUs7QUFDL0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFaEU7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUFtQjtJQUM1RCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUMzRSxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsRUFBVTtJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQWtCRDs7R0FFRztBQUNJLEtB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RCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILEVBQUUsVUFBVSxFQUFFLENBQ2YsQ0FBQztRQVBjLGVBQVUsR0FBVixVQUFVLENBQVE7UUFRbEMsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFaRCx3Q0FZQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxjQUFjO0lBQ2xELFlBQVksUUFBZ0I7UUFDMUIsS0FBSyxDQUNILHVEQUF1RCxFQUN2RCx3QkFBd0IsRUFDeEIsR0FBRyxFQUNILEVBQUUsUUFBUSxFQUFFLENBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBVkQsNENBVUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaW5rSGl2ZSBTREsgdjMuMCAtIEhUVFAgQ2xpZW50XG4gKlxuICogQ2VudHJhbGl6ZWQgSFRUUCBjbGllbnQgd2l0aCBhdXRoZW50aWNhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmdcbiAqL1xuXG5pbXBvcnQgeyBnZXRDb25maWcsIGRlYnVnTG9nLCBTREtfVkVSU0lPTiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB0eXBlIHsgQXBpUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVUUlkgQ09ORklHVVJBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBNQVhfUkVUUklFUyA9IDM7XG5jb25zdCBJTklUSUFMX0JBQ0tPRkYgPSA1MDA7IC8vIG1zXG5jb25zdCBNQVhfQkFDS09GRiA9IDgwMDA7IC8vIG1zXG5jb25zdCBSRVRSWUFCTEVfQ09ERVMgPSBuZXcgU2V0KFs0MDgsIDQyOSwgNTAwLCA1MDIsIDUwMywgNTA0XSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGJhY2tvZmYgdGltZSBmb3IgcmV0cnkgYXR0ZW1wdFxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgcmV0cnlBZnRlcj86IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChyZXRyeUFmdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gTWF0aC5taW4ocmV0cnlBZnRlciAqIDEwMDAsIE1BWF9CQUNLT0ZGKTsgLy8gQ29udmVydCBzZWNvbmRzIHRvIG1zXG4gIH1cbiAgY29uc3QgYmFja29mZiA9IElOSVRJQUxfQkFDS09GRiAqIE1hdGgucG93KDIsIGF0dGVtcHQpO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiwgTUFYX0JBQ0tPRkYpO1xufVxuXG4vKipcbiAqIFNsZWVwIGZvciBhIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqL1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSFRUUCBDTElFTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3B0aW9ucyB7XG4gIG1ldGhvZD86ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSc7XG4gIGJvZHk/OiB1bmtub3duO1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIE92ZXJyaWRlIEFQSSB2ZXJzaW9uIGZvciB0aGlzIHJlcXVlc3QuIFVzZSAnbm9uZScgZm9yIHVudmVyc2lvbmVkIHJvdXRlcyAoZS5nLiwgL2FwaS9hZ2VudHMpLiAqL1xuICBhcGlWZXJzaW9uPzogJ3YxJyB8ICd2MicgfCAndjMnIHwgJ25vbmUnO1xuICAvKiogT3ZlcnJpZGUgbWF4IHJldHJpZXMgZm9yIHRoaXMgcmVxdWVzdCAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE1ha2UgYW4gYXV0aGVudGljYXRlZCBBUEkgcmVxdWVzdCB3aXRoIHJldHJ5IGxvZ2ljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcGlSZXF1ZXN0PFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgY29uc3QgeyBtZXRob2QgPSAnR0VUJywgYm9keSwgaGVhZGVycyA9IHt9LCBhcGlWZXJzaW9uLCBtYXhSZXRyaWVzLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBhcGlWZXJzaW9uID09PSAnbm9uZScgPyAnJyA6IChhcGlWZXJzaW9uIHx8ICcnKTtcbiAgY29uc3QgdXJsID0gdmVyc2lvbiA/IGAke2NvbmZpZy5lbmRwb2ludH0vYXBpLyR7dmVyc2lvbn0ke3BhdGh9YCA6IGAke2NvbmZpZy5lbmRwb2ludH0vYXBpJHtwYXRofWA7XG4gIGNvbnN0IHJldHJpZXMgPSBtYXhSZXRyaWVzID8/IE1BWF9SRVRSSUVTO1xuICBjb25zdCByZXF1ZXN0VGltZW91dCA9IHRpbWVvdXQgPz8gMzAwMDA7IC8vIERlZmF1bHQgMzBzXG5cbiAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAnWC1TREstVmVyc2lvbic6IFNES19WRVJTSU9OLFxuICAgIC4uLmhlYWRlcnMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5hcGlLZXkpIHtcbiAgICByZXF1ZXN0SGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke2NvbmZpZy5hcGlLZXl9YDtcbiAgfSBlbHNlIGlmIChjb25maWcuYWdlbnRJZCkge1xuICAgIHJlcXVlc3RIZWFkZXJzWydYLUFnZW50LUlEJ10gPSBjb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIGRlYnVnTG9nKGAke21ldGhvZH0gJHt1cmx9YCk7XG5cbiAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSByZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGFib3J0IGNvbnRyb2xsZXIgZm9yIHRpbWVvdXRcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgcmVxdWVzdFRpbWVvdXQpO1xuXG4gICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBkZXByZWNhdGlvbiB3YXJuaW5nc1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnN0IHN1bnNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTdW5zZXQnKTtcbiAgICAgICAgY29uc3QgbGluayA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMaW5rJyk7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW1RoaW5rSGl2ZV0gRGVwcmVjYXRpb24gd2FybmluZzogVGhpcyBlbmRwb2ludCBpcyBkZXByZWNhdGVkLmAgK1xuICAgICAgICAgICAgKHN1bnNldCA/IGAgU3Vuc2V0OiAke3N1bnNldH1gIDogJycpICtcbiAgICAgICAgICAgIChsaW5rID8gYCBTdWNjZXNzb3I6ICR7bGlua31gIDogJycpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIHJldHJ5YWJsZVxuICAgICAgaWYgKFJFVFJZQUJMRV9DT0RFUy5oYXMocmVzcG9uc2Uuc3RhdHVzKSAmJiBhdHRlbXB0IDwgcmV0cmllcykge1xuICAgICAgICAvLyBHZXQgUmV0cnktQWZ0ZXIgaGVhZGVyIGlmIHByZXNlbnQgKGZvciA0MjkgcmVzcG9uc2VzKVxuICAgICAgICBsZXQgcmV0cnlBZnRlcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICBjb25zdCByZXRyeUFmdGVySGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJyk7XG4gICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXIgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHJldHJ5QWZ0ZXIpKSB7XG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdCwgcmV0cnlBZnRlcik7XG4gICAgICAgIGRlYnVnTG9nKGBSZXRyeWluZyBhZnRlciAke2JhY2tvZmZ9bXMgKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtyZXRyaWVzfSlgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgbGV0IGVycm9yRGF0YTogeyBtZXNzYWdlPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH0gPSB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlcnJvckRhdGEgPSBKU09OLnBhcnNlKGVycm9yVGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGVycm9yRGF0YSA9IHsgbWVzc2FnZTogZXJyb3JUZXh0IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdCBzcGVjaWZpY2FsbHlcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlBZnRlckhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpO1xuICAgICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSByZXRyeUFmdGVySGVhZGVyID8gcGFyc2VGbG9hdChyZXRyeUFmdGVySGVhZGVyKSAqIDEwMDAgOiA2MDAwMDtcbiAgICAgICAgICB0aHJvdyBuZXcgUmF0ZUxpbWl0RXJyb3IocmV0cnlBZnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVGhpbmtIaXZlQXBpRXJyb3IoXG4gICAgICAgICAgZXJyb3JEYXRhLm1lc3NhZ2UgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YCxcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgZXJyb3JEYXRhLmNvZGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIDIwNCBObyBDb250ZW50IChlLmcuLCBzdWNjZXNzZnVsIERFTEVURSlcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPFQ+O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgYWJvcnQgKHRpbWVvdXQpXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgbGFzdEVycm9yID0gbmV3IFRoaW5rSGl2ZUFwaUVycm9yKGBSZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke3JlcXVlc3RUaW1lb3V0fW1zYCwgNDA4KTtcbiAgICAgICAgaWYgKGF0dGVtcHQgPCByZXRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgICAgZGVidWdMb2coYFJlcXVlc3QgdGltZWQgb3V0LCByZXRyeWluZyBhZnRlciAke2JhY2tvZmZ9bXMgKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtyZXRyaWVzfSlgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXR3b3JrIGVycm9ycyAoVHlwZUVycm9yIGZyb20gZmV0Y2gpXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gbmV3IFRoaW5rSGl2ZUFwaUVycm9yKGBOZXR3b3JrIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgNTAzKTtcbiAgICAgICAgaWYgKGF0dGVtcHQgPCByZXRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgICAgZGVidWdMb2coYE5ldHdvcmsgZXJyb3IsIHJldHJ5aW5nIGFmdGVyICR7YmFja29mZn1tcyAoYXR0ZW1wdCAke2F0dGVtcHQgKyAxfS8ke3JldHJpZXN9KWApO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtdGhyb3cgVGhpbmtIaXZlIGVycm9ycyAobm9uLXJldHJ5YWJsZSlcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRoaW5rSGl2ZUVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBVbmtub3duIGVycm9yXG4gICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG4gICAgICBpZiAoYXR0ZW1wdCA8IHJldHJpZXMpIHtcbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBUaGlua0hpdmVBcGlFcnJvcihgUmVxdWVzdCBmYWlsZWQ6ICR7bGFzdEVycm9yLm1lc3NhZ2V9YCwgNTAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUsIGJ1dCBqdXN0IGluIGNhc2VcbiAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBUaGlua0hpdmVBcGlFcnJvcignUmVxdWVzdCBmYWlsZWQgYWZ0ZXIgYWxsIHJldHJpZXMnLCA1MDApO1xufVxuXG4vKipcbiAqIE1ha2UgYW4gQVBJIHJlcXVlc3QgYW5kIGV4dHJhY3QgZGF0YSBmcm9tIHJlc3BvbnNlIHdyYXBwZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwaVJlcXVlc3RXaXRoRGF0YTxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlSZXF1ZXN0PEFwaVJlc3BvbnNlPFQ+PihwYXRoLCBvcHRpb25zKTtcbiAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IFRoaW5rSGl2ZUFwaUVycm9yKFxuICAgICAgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InLFxuICAgICAgNTAwLFxuICAgICAgcmVzcG9uc2UuZXJyb3I/LmNvZGVcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZS5kYXRhIGFzIFQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVSUk9SU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJhc2UgZXJyb3IgY2xhc3MgZm9yIFRoaW5rSGl2ZSBTREsgZXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBUaGlua0hpdmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU/OiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVGhpbmtIaXZlRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQVBJIHJlcXVlc3QgZXJyb3IgLSByZXR1cm5lZCBmcm9tIFRoaW5rSGl2ZSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFRoaW5rSGl2ZUFwaUVycm9yIGV4dGVuZHMgVGhpbmtIaXZlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIGNvZGU/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY29kZSB8fCAnQVBJX0VSUk9SJywgc3RhdHVzQ29kZSk7XG4gICAgdGhpcy5uYW1lID0gJ1RoaW5rSGl2ZUFwaUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRpb24gZXJyb3IgLSBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFRoaW5rSGl2ZVZhbGlkYXRpb25FcnJvciBleHRlbmRzIFRoaW5rSGl2ZUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZD86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnVkFMSURBVElPTl9FUlJPUicsIDQwMCwgZmllbGQgPyB7IGZpZWxkIH0gOiB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFtZSA9ICdUaGlua0hpdmVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogUGVybWlzc2lvbiBkZW5pZWQgZXJyb3IgLSBBUEkga2V5IGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgdGhpbmtIaXZlLnRyYWNlcy5jcmVhdGUoLi4uKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFBlcm1pc3Npb25EZW5pZWRFcnJvcikge1xuICogICAgIGNvbnNvbGUubG9nKCdBUEkga2V5IG5lZWRzIHdyaXRlIHBlcm1pc3Npb24nKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRGVuaWVkRXJyb3IgZXh0ZW5kcyBUaGlua0hpdmVFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1BFUk1JU1NJT05fREVOSUVEJywgNDAzLCBkZXRhaWxzKTtcbiAgICB0aGlzLm5hbWUgPSAnUGVybWlzc2lvbkRlbmllZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEFnZW50IHNjb3BlIHZpb2xhdGlvbiBlcnJvciAtIEFQSSBrZXkgbm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgYWdlbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUga2V5IHNjb3BlZCB0byBzcGVjaWZpYyBhZ2VudHNcbiAqIGNvbnN0IGtleSA9IGF3YWl0IHRoaW5rSGl2ZS5hcGlLZXlzLmNyZWF0ZSh7XG4gKiAgIG5hbWU6ICdBZ2VudCBBIEtleScsXG4gKiAgIGFsbG93ZWRBZ2VudElkczogWydhZ2VudC1hLWlkJ11cbiAqIH0pO1xuICpcbiAqIC8vIEF0dGVtcHRpbmcgdG8gdXNlIGZvciBBZ2VudCBCIHdpbGwgdGhyb3cgQWdlbnRTY29wZUVycm9yXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEFnZW50U2NvcGVFcnJvciBleHRlbmRzIFRoaW5rSGl2ZUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWdlbnRJZDogc3RyaW5nLFxuICAgIGFsbG93ZWRBZ2VudHM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYEFQSSBrZXkgbm90IGF1dGhvcml6ZWQgZm9yIGFnZW50ICR7YWdlbnRJZH1gLFxuICAgICAgJ0FHRU5UX1NDT1BFX1ZJT0xBVElPTicsXG4gICAgICA0MDMsXG4gICAgICB7IGFnZW50SWQsIGFsbG93ZWRBZ2VudHMgfVxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ0FnZW50U2NvcGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBSYXRlIGxpbWl0IGV4Y2VlZGVkIGVycm9yXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgYXdhaXQgdGhpbmtIaXZlLnRyYWNlcy5jcmVhdGUoLi4uKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJhdGVMaW1pdEVycm9yKSB7XG4gKiAgICAgLy8gV2FpdCBhbmQgcmV0cnlcbiAqICAgICBhd2FpdCBzbGVlcChlcnJvci5yZXRyeUFmdGVyKTtcbiAqICAgICBhd2FpdCB0aGlua0hpdmUudHJhY2VzLmNyZWF0ZSguLi4pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgVGhpbmtIaXZlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlBZnRlcjogbnVtYmVyXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYFJhdGUgbGltaXQgZXhjZWVkZWQuIFJldHJ5IGFmdGVyICR7cmV0cnlBZnRlcn1tc2AsXG4gICAgICAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICA0MjksXG4gICAgICB7IHJldHJ5QWZ0ZXIgfVxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1JhdGVMaW1pdEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIElQIHdoaXRlbGlzdCB2aW9sYXRpb24gZXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIElwV2hpdGVsaXN0RXJyb3IgZXh0ZW5kcyBUaGlua0hpdmVFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGNsaWVudElwOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgICdSZXF1ZXN0IElQIGFkZHJlc3MgaXMgbm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgQVBJIGtleScsXG4gICAgICAnSVBfV0hJVEVMSVNUX1ZJT0xBVElPTicsXG4gICAgICA0MDMsXG4gICAgICB7IGNsaWVudElwIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdJcFdoaXRlbGlzdEVycm9yJztcbiAgfVxufVxuIl19
|
package/dist/core/config.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* ThinkHive SDK v3.0 - Configuration
|
|
3
3
|
*/
|
|
4
4
|
import type { InitOptions, Framework } from './types';
|
|
5
|
-
export declare const SDK_VERSION = "
|
|
6
|
-
export declare const DEFAULT_ENDPOINT = "https://
|
|
5
|
+
export declare const SDK_VERSION = "4.0.0";
|
|
6
|
+
export declare const DEFAULT_ENDPOINT = "https://app.thinkhive.ai";
|
|
7
7
|
export declare const DEFAULT_SERVICE_NAME = "my-ai-agent";
|
|
8
8
|
export interface ResolvedConfig {
|
|
9
9
|
apiKey: string;
|
|
@@ -13,7 +13,6 @@ export interface ResolvedConfig {
|
|
|
13
13
|
autoInstrument: boolean;
|
|
14
14
|
frameworks: Framework[];
|
|
15
15
|
debug: boolean;
|
|
16
|
-
apiVersion: 'v1' | 'v3';
|
|
17
16
|
}
|
|
18
17
|
/**
|
|
19
18
|
* Initialize configuration from options
|
package/dist/core/config.js
CHANGED
|
@@ -12,8 +12,8 @@ exports.debugLog = debugLog;
|
|
|
12
12
|
// ============================================================================
|
|
13
13
|
// CONSTANTS
|
|
14
14
|
// ============================================================================
|
|
15
|
-
exports.SDK_VERSION = '
|
|
16
|
-
exports.DEFAULT_ENDPOINT = 'https://
|
|
15
|
+
exports.SDK_VERSION = '4.0.0';
|
|
16
|
+
exports.DEFAULT_ENDPOINT = 'https://app.thinkhive.ai';
|
|
17
17
|
exports.DEFAULT_SERVICE_NAME = 'my-ai-agent';
|
|
18
18
|
let config = null;
|
|
19
19
|
let initialized = false;
|
|
@@ -37,7 +37,6 @@ function initConfig(options = {}) {
|
|
|
37
37
|
autoInstrument: options.autoInstrument ?? false,
|
|
38
38
|
frameworks: options.frameworks || ['langchain', 'openai'],
|
|
39
39
|
debug: options.debug ?? false,
|
|
40
|
-
apiVersion: options.apiVersion ?? 'v3',
|
|
41
40
|
};
|
|
42
41
|
initialized = true;
|
|
43
42
|
return config;
|
|
@@ -73,4 +72,4 @@ function debugLog(...args) {
|
|
|
73
72
|
console.log('[ThinkHive]', ...args);
|
|
74
73
|
}
|
|
75
74
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBb0NILGdDQXNCQztBQU1ELDhCQUtDO0FBS0Qsc0NBRUM7QUFLRCxrQ0FHQztBQUtELDRCQUlDO0FBekZELCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osK0VBQStFO0FBRWxFLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUN0QixRQUFBLGdCQUFnQixHQUFHLDBCQUEwQixDQUFDO0FBQzlDLFFBQUEsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO0FBZ0JsRCxJQUFJLE1BQU0sR0FBMEIsSUFBSSxDQUFDO0FBQ3pDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztBQUV4QiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRTs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxVQUF1QixFQUFFO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7SUFDckUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztJQUV4RSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEUsQ0FDL0UsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUc7UUFDUCxNQUFNO1FBQ04sT0FBTztRQUNQLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksd0JBQWdCO1FBQ2hGLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLElBQUksNEJBQW9CO1FBQzlGLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLEtBQUs7UUFDL0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDO1FBQ3pELEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUs7S0FDOUIsQ0FBQztJQUVGLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFNBQVM7SUFDdkIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYTtJQUMzQixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXO0lBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDZCxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxHQUFHLElBQWU7SUFDekMsSUFBSSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyB2My4wIC0gQ29uZmlndXJhdGlvblxuICovXG5cbmltcG9ydCB0eXBlIHsgSW5pdE9wdGlvbnMsIEZyYW1ld29yayB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT05TVEFOVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gJzQuMC4wJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLnRoaW5raGl2ZS5haSc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVJWSUNFX05BTUUgPSAnbXktYWktYWdlbnQnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBHTE9CQUwgQ09ORklHIFNUQVRFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb25maWcge1xuICBhcGlLZXk6IHN0cmluZztcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBlbmRwb2ludDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICBhdXRvSW5zdHJ1bWVudDogYm9vbGVhbjtcbiAgZnJhbWV3b3JrczogRnJhbWV3b3JrW107XG4gIGRlYnVnOiBib29sZWFuO1xufVxuXG5sZXQgY29uZmlnOiBSZXNvbHZlZENvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENPTkZJRyBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gZnJvbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29uZmlnKG9wdGlvbnM6IEluaXRPcHRpb25zID0ge30pOiBSZXNvbHZlZENvbmZpZyB7XG4gIGNvbnN0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5IHx8IHByb2Nlc3MuZW52LlRISU5LSElWRV9BUElfS0VZIHx8ICcnO1xuICBjb25zdCBhZ2VudElkID0gb3B0aW9ucy5hZ2VudElkIHx8IHByb2Nlc3MuZW52LlRISU5LSElWRV9BR0VOVF9JRCB8fCAnJztcblxuICBpZiAoIWFwaUtleSAmJiAhYWdlbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdFaXRoZXIgYXBpS2V5IG9yIGFnZW50SWQgbXVzdCBiZSBwcm92aWRlZCAob3Igc2V0IFRISU5LSElWRV9BUElfS0VZIGVudiB2YXIpJ1xuICAgICk7XG4gIH1cblxuICBjb25maWcgPSB7XG4gICAgYXBpS2V5LFxuICAgIGFnZW50SWQsXG4gICAgZW5kcG9pbnQ6IG9wdGlvbnMuZW5kcG9pbnQgfHwgcHJvY2Vzcy5lbnYuVEhJTktISVZFX0VORFBPSU5UIHx8IERFRkFVTFRfRU5EUE9JTlQsXG4gICAgc2VydmljZU5hbWU6IG9wdGlvbnMuc2VydmljZU5hbWUgfHwgcHJvY2Vzcy5lbnYuVEhJTktISVZFX1NFUlZJQ0VfTkFNRSB8fCBERUZBVUxUX1NFUlZJQ0VfTkFNRSxcbiAgICBhdXRvSW5zdHJ1bWVudDogb3B0aW9ucy5hdXRvSW5zdHJ1bWVudCA/PyBmYWxzZSxcbiAgICBmcmFtZXdvcmtzOiBvcHRpb25zLmZyYW1ld29ya3MgfHwgWydsYW5nY2hhaW4nLCAnb3BlbmFpJ10sXG4gICAgZGVidWc6IG9wdGlvbnMuZGVidWcgPz8gZmFsc2UsXG4gIH07XG5cbiAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIEdldCBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAqIEB0aHJvd3MgaWYgbm90IGluaXRpYWxpemVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoKTogUmVzb2x2ZWRDb25maWcge1xuICBpZiAoIWNvbmZpZyB8fCAhaW5pdGlhbGl6ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaW5rSGl2ZSBTREsgbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXQoKSBmaXJzdC4nKTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIFNESyBpcyBpbml0aWFsaXplZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGluaXRpYWxpemVkO1xufVxuXG4vKipcbiAqIFJlc2V0IGNvbmZpZ3VyYXRpb24gKGZvciB0ZXN0aW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDb25maWcoKTogdm9pZCB7XG4gIGNvbmZpZyA9IG51bGw7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG59XG5cbi8qKlxuICogRGVidWcgbG9nIGhlbHBlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWdMb2coLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gIGlmIChjb25maWc/LmRlYnVnKSB7XG4gICAgY29uc29sZS5sb2coJ1tUaGlua0hpdmVdJywgLi4uYXJncyk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/core/types.d.ts
CHANGED
|
@@ -18,8 +18,6 @@ export interface InitOptions {
|
|
|
18
18
|
frameworks?: Framework[];
|
|
19
19
|
/** Enable debug logging */
|
|
20
20
|
debug?: boolean;
|
|
21
|
-
/** API version (default: 'v3') */
|
|
22
|
-
apiVersion?: 'v1' | 'v3';
|
|
23
21
|
}
|
|
24
22
|
export type Framework = 'langchain' | 'langgraph' | 'openai' | 'openai-assistants' | 'anthropic' | 'llamaindex' | 'n8n' | 'voiceflow';
|
|
25
23
|
/**
|
|
@@ -50,6 +48,32 @@ export interface RunOptions {
|
|
|
50
48
|
ticketLinking?: TicketLinkingOptions;
|
|
51
49
|
/** Custom metadata */
|
|
52
50
|
metadata?: Record<string, unknown>;
|
|
51
|
+
/**
|
|
52
|
+
* Custom business metrics to record with this run.
|
|
53
|
+
* Keys should match metrics declared during agent setup (onboarding).
|
|
54
|
+
* Values can be numbers, booleans, or short strings (max 100 chars).
|
|
55
|
+
*
|
|
56
|
+
* Metrics are aggregated over time for dashboard display and trend analysis.
|
|
57
|
+
* Undeclared metrics will be tracked but flagged as "discovered" metrics.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* metrics: {
|
|
61
|
+
* customer_satisfaction: 4.5,
|
|
62
|
+
* resolution_time_ms: 2450,
|
|
63
|
+
* escalated: false,
|
|
64
|
+
* ticket_priority: 'high'
|
|
65
|
+
* }
|
|
66
|
+
*/
|
|
67
|
+
metrics?: Record<string, number | boolean | string>;
|
|
68
|
+
/**
|
|
69
|
+
* Request evaluation when run is ingested.
|
|
70
|
+
* Overrides agent's auto_evaluate setting for this run.
|
|
71
|
+
*
|
|
72
|
+
* - true: Force evaluation on this run
|
|
73
|
+
* - false: Skip evaluation even if agent has auto_evaluate enabled
|
|
74
|
+
* - undefined: Use agent's auto_evaluate setting (default)
|
|
75
|
+
*/
|
|
76
|
+
runEvaluation?: boolean;
|
|
53
77
|
}
|
|
54
78
|
export type RunOutcome = 'resolved' | 'escalated' | 'abandoned' | 'failed' | 'transferred' | 'pending';
|
|
55
79
|
export interface ConversationMessage {
|
|
@@ -93,6 +117,11 @@ export interface TicketLinkingOptions {
|
|
|
93
117
|
customFieldValue?: string;
|
|
94
118
|
}
|
|
95
119
|
export type LinkMethod = 'sdk_explicit' | 'zendesk_marker' | 'custom_field' | 'middleware_stamp' | 'session_match' | 'email_time_window' | 'manual';
|
|
120
|
+
/**
|
|
121
|
+
* Classification flags for categorizing trace issues
|
|
122
|
+
* Separate from binary outcome (success/failure)
|
|
123
|
+
*/
|
|
124
|
+
export type TraceCustomFlag = 'hallucination' | 'policy_violation' | 'tone_issue' | 'retrieval_miss' | 'error';
|
|
96
125
|
/**
|
|
97
126
|
* Trace options (v2 format, converted to runs internally)
|
|
98
127
|
* @deprecated Use RunOptions instead
|
|
@@ -104,8 +133,10 @@ export interface TraceOptions {
|
|
|
104
133
|
agentResponse: string;
|
|
105
134
|
/** User's detected intent */
|
|
106
135
|
userIntent?: string;
|
|
107
|
-
/**
|
|
108
|
-
outcome?: 'success' | 'failure'
|
|
136
|
+
/** Binary outcome: success or failure */
|
|
137
|
+
outcome?: 'success' | 'failure';
|
|
138
|
+
/** Classification flags for categorizing the issue type (hallucination, policy_violation, etc.) */
|
|
139
|
+
customFlags?: TraceCustomFlag[];
|
|
109
140
|
/** Duration in milliseconds */
|
|
110
141
|
duration?: number;
|
|
111
142
|
/** Session ID for conversation tracking */
|
|
@@ -121,6 +152,28 @@ export interface TraceOptions {
|
|
|
121
152
|
businessContext?: BusinessContext;
|
|
122
153
|
/** Custom metadata */
|
|
123
154
|
metadata?: Record<string, unknown>;
|
|
155
|
+
/**
|
|
156
|
+
* Custom business metrics to record with this trace.
|
|
157
|
+
* Keys should match metrics declared during agent setup.
|
|
158
|
+
* Values can be numbers, booleans, or short strings.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* metrics: {
|
|
162
|
+
* customer_satisfaction: 4.5,
|
|
163
|
+
* resolution_time_ms: 2450,
|
|
164
|
+
* escalated: false
|
|
165
|
+
* }
|
|
166
|
+
*/
|
|
167
|
+
metrics?: Record<string, number | boolean | string>;
|
|
168
|
+
/**
|
|
169
|
+
* Request evaluation when trace is ingested.
|
|
170
|
+
* Overrides agent's auto_evaluate setting for this trace.
|
|
171
|
+
*
|
|
172
|
+
* - true: Force evaluation on this trace
|
|
173
|
+
* - false: Skip evaluation even if agent has auto_evaluate enabled
|
|
174
|
+
* - undefined: Use agent's auto_evaluate setting (default)
|
|
175
|
+
*/
|
|
176
|
+
runEvaluation?: boolean;
|
|
124
177
|
}
|
|
125
178
|
export interface SpanData {
|
|
126
179
|
id?: string;
|
package/dist/core/types.js
CHANGED
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
* Run-centric types with facts vs inferences and customer context snapshots
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyB2My4wIC0gQ29yZSBUeXBlc1xuICpcbiAqIFJ1bi1jZW50cmljIHR5cGVzIHdpdGggZmFjdHMgdnMgaW5mZXJlbmNlcyBhbmQgY3VzdG9tZXIgY29udGV4dCBzbmFwc2hvdHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTklUIE9QVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0T3B0aW9ucyB7XG4gIC8qKiBUaGlua0hpdmUgQVBJIGtleSAoc3RhcnRzIHdpdGggdGhfKSAqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBBZ2VudCBJRCAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xuICAvKiogVGhpbmtIaXZlIEFQSSBlbmRwb2ludCAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgdHJhY2VzICovXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIGF1dG8taW5zdHJ1bWVudGF0aW9uICovXG4gIGF1dG9JbnN0cnVtZW50PzogYm9vbGVhbjtcbiAgLyoqIEZyYW1ld29ya3MgdG8gYXV0by1pbnN0cnVtZW50ICovXG4gIGZyYW1ld29ya3M/OiBGcmFtZXdvcmtbXTtcbiAgLyoqIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIEFQSSB2ZXJzaW9uIChkZWZhdWx0OiAndjMnKSAqL1xuICBhcGlWZXJzaW9uPzogJ3YxJyB8ICd2Myc7XG59XG5cbmV4cG9ydCB0eXBlIEZyYW1ld29yayA9XG4gIHwgJ2xhbmdjaGFpbidcbiAgfCAnbGFuZ2dyYXBoJ1xuICB8ICdvcGVuYWknXG4gIHwgJ29wZW5haS1hc3Npc3RhbnRzJ1xuICB8ICdhbnRocm9waWMnXG4gIHwgJ2xsYW1haW5kZXgnXG4gIHwgJ244bidcbiAgfCAndm9pY2VmbG93JztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUlVOIE9QVElPTlMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgcnVuICh2MyBhdG9taWMgdW5pdClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5PcHRpb25zIHtcbiAgLyoqIEFnZW50IElEICovXG4gIGFnZW50SWQ6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIHJ1biBzdGFydGVkICovXG4gIHN0YXJ0ZWRBdD86IHN0cmluZyB8IERhdGU7XG4gIC8qKiBXaGVuIHRoZSBydW4gZW5kZWQgKi9cbiAgZW5kZWRBdD86IHN0cmluZyB8IERhdGU7XG4gIC8qKiBSdW4gb3V0Y29tZSAqL1xuICBvdXRjb21lPzogUnVuT3V0Y29tZTtcbiAgLyoqIFJlYXNvbiBmb3IgdGhlIG91dGNvbWUgKi9cbiAgb3V0Y29tZVJlYXNvbj86IHN0cmluZztcbiAgLyoqIENvbnZlcnNhdGlvbiBtZXNzYWdlcyAqL1xuICBjb252ZXJzYXRpb25NZXNzYWdlczogQ29udmVyc2F0aW9uTWVzc2FnZVtdO1xuICAvKiogTW9kZWwgSUQgdXNlZCAqL1xuICBtb2RlbElkPzogc3RyaW5nO1xuICAvKiogUHJvbXB0IHZlcnNpb24gKi9cbiAgcHJvbXB0VmVyc2lvbj86IHN0cmluZztcbiAgLyoqIFNlc3Npb24gSUQgZm9yIGNvbnZlcnNhdGlvbiB0cmFja2luZyAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b21lciBjb250ZXh0IHNuYXBzaG90IChBUlIsIGhlYWx0aCBBUyBPRiB0aGlzIHJ1bikgKi9cbiAgY3VzdG9tZXJDb250ZXh0PzogQ3VzdG9tZXJDb250ZXh0U25hcHNob3Q7XG4gIC8qKiBUaWNrZXQgbGlua2luZyBvcHRpb25zICovXG4gIHRpY2tldExpbmtpbmc/OiBUaWNrZXRMaW5raW5nT3B0aW9ucztcbiAgLyoqIEN1c3RvbSBtZXRhZGF0YSAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBSdW5PdXRjb21lID1cbiAgfCAncmVzb2x2ZWQnXG4gIHwgJ2VzY2FsYXRlZCdcbiAgfCAnYWJhbmRvbmVkJ1xuICB8ICdmYWlsZWQnXG4gIHwgJ3RyYW5zZmVycmVkJ1xuICB8ICdwZW5kaW5nJztcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25NZXNzYWdlIHtcbiAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAnc3lzdGVtJyB8ICd0b29sJztcbiAgY29udGVudDogc3RyaW5nO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENVU1RPTUVSIENPTlRFWFQgU05BUFNIT1QgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEN1c3RvbWVyIGNvbnRleHQgY2FwdHVyZWQgQVMgT0YgdGhlIHJ1biB0aW1lIChub3QgY3VycmVudCB2YWx1ZXMpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJDb250ZXh0U25hcHNob3Qge1xuICAvKiogQ3VzdG9tZXIgYWNjb3VudCBJRCAqL1xuICBjdXN0b21lcklkPzogc3RyaW5nO1xuICAvKiogQVJSIGF0IHRoZSB0aW1lIG9mIHRoZSBydW4gKG5vdCBjdXJyZW50IEFSUikgKi9cbiAgYXJyPzogbnVtYmVyO1xuICAvKiogSGVhbHRoIHNjb3JlIGF0IHRoZSB0aW1lIG9mIHRoZSBydW4gKDAtMTAwKSAqL1xuICBoZWFsdGhTY29yZT86IG51bWJlcjtcbiAgLyoqIEN1c3RvbWVyIHNlZ21lbnQgKGUuZy4sICdlbnRlcnByaXNlJywgJ21pZC1tYXJrZXQnLCAnc21iJykgKi9cbiAgc2VnbWVudD86IHN0cmluZztcbiAgLyoqIFdoZW4gdGhpcyBzbmFwc2hvdCB3YXMgY2FwdHVyZWQgKi9cbiAgY2FwdHVyZWRBdD86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZHMgKHdpbGwgYmUgdmFsaWRhdGVkIGFnYWluc3Qgc2NoZW1hKSAqL1xuICBjdXN0b21GaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVElDS0VUIExJTktJTkcgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRldGVybWluaXN0aWMgdGlja2V0IGxpbmtpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWNrZXRMaW5raW5nT3B0aW9ucyB7XG4gIC8qKiBMaW5rIG1ldGhvZCB0byB1c2UgKi9cbiAgbWV0aG9kOiBMaW5rTWV0aG9kO1xuICAvKiogVGlja2V0IElEIChmb3Igc2RrX2V4cGxpY2l0IG1ldGhvZCkgKi9cbiAgdGlja2V0SWQ/OiBzdHJpbmc7XG4gIC8qKiBFeHRlcm5hbCB0aWNrZXQgSUQgKGUuZy4sIFplbmRlc2sgdGlja2V0IElEKSAqL1xuICBleHRlcm5hbFRpY2tldElkPzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gZm9yIGV4dGVybmFsIHRpY2tldCAqL1xuICBwbGF0Zm9ybT86ICd6ZW5kZXNrJyB8ICdpbnRlcmNvbScgfCAnc2FsZXNmb3JjZScgfCAnZnJlc2hkZXNrJztcbiAgLyoqIEN1c3RvbSBmaWVsZCBuYW1lIGZvciBsaW5raW5nICovXG4gIGN1c3RvbUZpZWxkTmFtZT86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZCB2YWx1ZSAqL1xuICBjdXN0b21GaWVsZFZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMaW5rTWV0aG9kID1cbiAgfCAnc2RrX2V4cGxpY2l0JyAgICAgIC8vIERpcmVjdCBTREsgY2FsbCB3aXRoIHRpY2tldCBJRCAoY29uZmlkZW5jZTogMS4wKVxuICB8ICd6ZW5kZXNrX21hcmtlcicgICAgLy8gRW1iZWRkZWQgVEhJRCBtYXJrZXIgaW4gcmVzcG9uc2UgKGNvbmZpZGVuY2U6IDEuMClcbiAgfCAnY3VzdG9tX2ZpZWxkJyAgICAgIC8vIFplbmRlc2sgY3VzdG9tIGZpZWxkIChjb25maWRlbmNlOiAxLjApXG4gIHwgJ21pZGRsZXdhcmVfc3RhbXAnICAvLyBNaWRkbGV3YXJlLWluamVjdGVkIHRyYWNlIElEIChjb25maWRlbmNlOiAwLjk4KVxuICB8ICdzZXNzaW9uX21hdGNoJyAgICAgLy8gU2Vzc2lvbiBJRCBjb3JyZWxhdGlvbiAoY29uZmlkZW5jZTogMC45NSlcbiAgfCAnZW1haWxfdGltZV93aW5kb3cnIC8vIEVtYWlsICsgMTVtaW4gd2luZG93IChjb25maWRlbmNlOiAwLjYpXG4gIHwgJ21hbnVhbCc7ICAgICAgICAgICAvLyBIdW1hbi1hc3NpZ25lZCAoY29uZmlkZW5jZTogMS4wKVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUUkFDRSBPUFRJT05TICh2MiBjb21wYXRpYmlsaXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRyYWNlIG9wdGlvbnMgKHYyIGZvcm1hdCwgY29udmVydGVkIHRvIHJ1bnMgaW50ZXJuYWxseSlcbiAqIEBkZXByZWNhdGVkIFVzZSBSdW5PcHRpb25zIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZU9wdGlvbnMge1xuICAvKiogVXNlcidzIG1lc3NhZ2UvcXVlcnkgKi9cbiAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFnZW50J3MgcmVzcG9uc2UgKi9cbiAgYWdlbnRSZXNwb25zZTogc3RyaW5nO1xuICAvKiogVXNlcidzIGRldGVjdGVkIGludGVudCAqL1xuICB1c2VySW50ZW50Pzogc3RyaW5nO1xuICAvKiogT3V0Y29tZTogc3VjY2VzcywgZmFpbHVyZSwgcGFydGlhbF9zdWNjZXNzICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbF9zdWNjZXNzJztcbiAgLyoqIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgLyoqIFNlc3Npb24gSUQgZm9yIGNvbnZlcnNhdGlvbiB0cmFja2luZyAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb252ZXJzYXRpb24gaGlzdG9yeSAqL1xuICBjb252ZXJzYXRpb25IaXN0b3J5PzogQXJyYXk8eyByb2xlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgLyoqIFNwYW4gZGF0YSBmb3IgZGV0YWlsZWQgYW5hbHlzaXMgKi9cbiAgc3BhbnM/OiBTcGFuRGF0YVtdO1xuICAvKiogQnVzaW5lc3MgY29udGV4dCBmb3IgUk9JIGNhbGN1bGF0aW9uICovXG4gIGJ1c2luZXNzQ29udGV4dD86IEJ1c2luZXNzQ29udGV4dDtcbiAgLyoqIEN1c3RvbSBtZXRhZGF0YSAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYW5EYXRhIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ2xsbScgfCAndG9vbCcgfCAncmV0cmlldmFsJyB8ICdlbWJlZGRpbmcnIHwgJ2NoYWluJyB8ICdjdXN0b20nO1xuICBzdGFydFRpbWU/OiBEYXRlO1xuICBlbmRUaW1lPzogRGF0ZTtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgc3RhdHVzPzogJ29rJyB8ICdlcnJvcicgfCAndGltZW91dCc7XG4gIGVycm9yPzogc3RyaW5nO1xuICBpbnB1dD86IHVua25vd247XG4gIG91dHB1dD86IHVua25vd247XG4gIC8vIExMTS1zcGVjaWZpY1xuICBtb2RlbD86IHN0cmluZztcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG4gIHByb21wdFRva2Vucz86IG51bWJlcjtcbiAgY29tcGxldGlvblRva2Vucz86IG51bWJlcjtcbiAgLy8gVG9vbC1zcGVjaWZpY1xuICB0b29sTmFtZT86IHN0cmluZztcbiAgdG9vbFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLy8gUmV0cmlldmFsLXNwZWNpZmljXG4gIHF1ZXJ5Pzogc3RyaW5nO1xuICBkb2N1bWVudENvdW50PzogbnVtYmVyO1xuICB0b3BTY29yZT86IG51bWJlcjtcbiAgc291cmNlcz86IHN0cmluZ1tdO1xuICAvLyBDaGlsZHJlblxuICBjaGlsZHJlbj86IFNwYW5EYXRhW107XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEN1c3RvbWVyQ29udGV4dFNuYXBzaG90IGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdXNpbmVzc0NvbnRleHQge1xuICAvKiogQ3VzdG9tZXIgSUQgKi9cbiAgY3VzdG9tZXJJZD86IHN0cmluZztcbiAgLyoqIFRyYW5zYWN0aW9uIHZhbHVlIGluIGRvbGxhcnMgKi9cbiAgdHJhbnNhY3Rpb25WYWx1ZT86IG51bWJlcjtcbiAgLyoqIFByaW9yaXR5IGxldmVsICovXG4gIHByaW9yaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG4gIC8qKiBEZXBhcnRtZW50ICovXG4gIGRlcGFydG1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBJbmR1c3RyeSB2ZXJ0aWNhbCAqL1xuICBpbmR1c3RyeT86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBmaWVsZHMgKi9cbiAgY3VzdG9tPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENMQUlNIFRZUEVTICh2Mylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBIGNsYWltIGFib3V0IGEgcnVuIChmYWN0IHZzIGluZmVyZW5jZSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFpbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGFuYWx5c2lzSWQ6IHN0cmluZztcbiAgLyoqIFR5cGUgb2YgY2xhaW0gKi9cbiAgY2xhaW1UeXBlOiBDbGFpbVR5cGU7XG4gIC8qKiBDYXRlZ29yeSBvZiB0aGUgY2xhaW0gKi9cbiAgY2xhaW1DYXRlZ29yeTogQ2xhaW1DYXRlZ29yeTtcbiAgLyoqIFRoZSBjbGFpbSB0ZXh0ICovXG4gIGNsYWltVGV4dDogc3RyaW5nO1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGlzIGNsYWltICgwLTEpICovXG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgLyoqIEhvdyB3ZWxsIGNhbGlicmF0ZWQgaXMgdGhpcyBjb25maWRlbmNlICovXG4gIGNvbmZpZGVuY2VDYWxpYnJhdGlvbjogQ29uZmlkZW5jZUNhbGlicmF0aW9uO1xuICAvKiogRXZpZGVuY2Ugc3VwcG9ydGluZyB0aGlzIGNsYWltICovXG4gIGV2aWRlbmNlOiBFdmlkZW5jZVJlZmVyZW5jZVtdO1xuICAvKiogSXMgdGhpcyBjbGFpbSBleHBsYWluYWJsZSB0byBlbmQgdXNlcnMgKi9cbiAgaXNFeHBsYWluYWJsZTogYm9vbGVhbjtcbiAgLyoqIFByb2JhYmlsaXR5IHZhbHVlIGZvciBwcm9iYWJpbGl0eSBjbGFpbXMgKi9cbiAgcHJvYmFiaWxpdHlWYWx1ZT86IG51bWJlcjtcbiAgLyoqIEh1bWFuLWFzc2lnbmVkIHZlcmlmaWNhdGlvbiBzdGF0dXMgKi9cbiAgaHVtYW5WZXJpZmllZD86IGJvb2xlYW47XG4gIC8qKiBIdW1hbiB2ZXJpZmljYXRpb24gdmVyZGljdCAqL1xuICBodW1hblZlcmRpY3Q/OiAnY29uZmlybWVkJyB8ICdyZWplY3RlZCcgfCAnbW9kaWZpZWQnO1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENsYWltVHlwZSA9ICdvYnNlcnZlZCcgfCAnaW5mZXJyZWQnIHwgJ2NvbXB1dGVkJztcbmV4cG9ydCB0eXBlIENsYWltQ2F0ZWdvcnkgPVxuICB8ICdvdXRjb21lJ1xuICB8ICdyb290X2NhdXNlJ1xuICB8ICdjdXN0b21lcl9pbXBhY3QnXG4gIHwgJ2NodXJuX3Jpc2snXG4gIHwgJ3JldmVudWVfaW1wYWN0J1xuICB8ICdxdWFsaXR5J1xuICB8ICdvdGhlcic7XG5leHBvcnQgdHlwZSBDb25maWRlbmNlQ2FsaWJyYXRpb24gPSAnY2FsaWJyYXRlZCcgfCAndW5jYWxpYnJhdGVkJyB8ICduZWVkc19tb3JlX2RhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2aWRlbmNlUmVmZXJlbmNlIHtcbiAgLyoqIFR5cGUgb2YgZXZpZGVuY2UgKi9cbiAgdHlwZTogJ3NwYW4nIHwgJ21lc3NhZ2UnIHwgJ3Rvb2xfY2FsbCcgfCAnZXh0ZXJuYWwnIHwgJ2NvbXB1dGVkJztcbiAgLyoqIElEIG9mIHRoZSByZWZlcmVuY2VkIGl0ZW0gKi9cbiAgcmVmZXJlbmNlSWQ6IHN0cmluZztcbiAgLyoqIEhvdyByZWxldmFudCBpcyB0aGlzIGV2aWRlbmNlICovXG4gIHJlbGV2YW5jZTogc3RyaW5nO1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGlzIGV2aWRlbmNlICovXG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5BTFlTSVMgUkVTVUxUICh2Mylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGFuYWx5c2lzVmVyc2lvbjogc3RyaW5nO1xuICBtb2RlbFVzZWQ6IHN0cmluZztcbiAgLyoqIE92ZXJhbGwgb3V0Y29tZSB2ZXJkaWN0ICovXG4gIG91dGNvbWVWZXJkaWN0OiAnc3VjY2VzcycgfCAncGFydGlhbF9zdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqIENvbmZpZGVuY2UgaW4gdGhlIHZlcmRpY3QgKDAtMSkgKi9cbiAgb3V0Y29tZUNvbmZpZGVuY2U6IG51bWJlcjtcbiAgLyoqIFJvb3QgY2F1c2UgY2F0ZWdvcnkgaWYgZmFpbHVyZSAqL1xuICByb290Q2F1c2VDYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIENvbmZpZGVuY2UgaW4gcm9vdCBjYXVzZSAoMC0xKSAqL1xuICByb290Q2F1c2VDb25maWRlbmNlPzogbnVtYmVyO1xuICAvKiogSXMgdGhpcyB0aGUgY3VycmVudCBhbmFseXNpcyAqL1xuICBpc0N1cnJlbnQ6IGJvb2xlYW47XG4gIC8qKiBJRCBvZiBhbmFseXNpcyB0aGF0IHN1cGVyc2VkZWQgdGhpcyBvbmUgKi9cbiAgc3VwZXJzZWRlZEJ5Pzogc3RyaW5nO1xuICAvKiogQ2xhaW1zIGZyb20gdGhpcyBhbmFseXNpcyAqL1xuICBjbGFpbXM6IENsYWltW107XG4gIGFuYWx5emVkQXQ/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0FMSUJSQVRJT04gVFlQRVMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGlicmF0aW9uU3RhdHVzIHtcbiAgYWdlbnRJZDogc3RyaW5nO1xuICBwcmVkaWN0aW9uVHlwZTogUHJlZGljdGlvblR5cGU7XG4gIC8qKiBCcmllciBzY29yZSAobG93ZXIgaXMgYmV0dGVyLCA8MC4xIGlzIGdvb2QpICovXG4gIGJyaWVyU2NvcmU6IG51bWJlcjtcbiAgLyoqIEV4cGVjdGVkIENhbGlicmF0aW9uIEVycm9yICovXG4gIGVjZTogbnVtYmVyO1xuICAvKiogU2FtcGxlIGNvdW50ICovXG4gIHNhbXBsZUNvdW50OiBudW1iZXI7XG4gIC8qKiBJcyB0aGUgbW9kZWwgd2VsbC1jYWxpYnJhdGVkICovXG4gIGlzQ2FsaWJyYXRlZDogYm9vbGVhbjtcbiAgLyoqIENhbGlicmF0aW9uIGJ5IGNvbmZpZGVuY2UgYnVja2V0ICovXG4gIGJ1Y2tldHM6IENhbGlicmF0aW9uQnVja2V0W107XG4gIGxhc3RVcGRhdGVkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQcmVkaWN0aW9uVHlwZSA9XG4gIHwgJ291dGNvbWUnXG4gIHwgJ2NodXJuX3Jpc2snXG4gIHwgJ2VzY2FsYXRpb25fcmlzaydcbiAgfCAncmVzb2x1dGlvbl90aW1lJ1xuICB8ICdjdXN0b21lcl9zYXRpc2ZhY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGlicmF0aW9uQnVja2V0IHtcbiAgYnVja2V0U3RhcnQ6IG51bWJlcjtcbiAgYnVja2V0RW5kOiBudW1iZXI7XG4gIHByZWRpY3RlZFByb2JhYmlsaXR5OiBudW1iZXI7XG4gIGFjdHVhbEZyZXF1ZW5jeTogbnVtYmVyO1xuICBzYW1wbGVDb3VudDogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBST0kgVFlQRVMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvaUNvbmZpZyB7XG4gIC8qKiBDb3N0IHBlciBzdXBwb3J0IHRpY2tldCBkZWZsZWN0ZWQgKi9cbiAgdGlja2V0RGVmbGVjdGlvblZhbHVlOiBudW1iZXI7XG4gIC8qKiBDb3N0IHBlciBlc2NhbGF0aW9uICovXG4gIGVzY2FsYXRpb25Db3N0OiBudW1iZXI7XG4gIC8qKiBDb3N0IHBlciBob3VyIG9mIGFnZW50IHRpbWUgKi9cbiAgYWdlbnRIb3VybHlDb3N0OiBudW1iZXI7XG4gIC8qKiBBdmVyYWdlIHJlc29sdXRpb24gdGltZSAobWludXRlcykgKi9cbiAgYXZnUmVzb2x1dGlvbk1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqIENTQVQgaW1wYWN0IG11bHRpcGxpZXIgKi9cbiAgY3NhdEltcGFjdE11bHRpcGxpZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb2lTdW1tYXJ5IHtcbiAgcGVyaW9kOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9O1xuICAvKiogVG90YWwgZXN0aW1hdGVkIHNhdmluZ3MgKi9cbiAgdG90YWxTYXZpbmdzOiBudW1iZXI7XG4gIC8qKiBCcmVha2Rvd24gYnkgY2F0ZWdvcnkgKi9cbiAgYnJlYWtkb3duOiB7XG4gICAgdGlja2V0RGVmbGVjdGlvbjogbnVtYmVyO1xuICAgIGVzY2FsYXRpb25QcmV2ZW50aW9uOiBudW1iZXI7XG4gICAgdGltZVRvUmVzb2x1dGlvbjogbnVtYmVyO1xuICAgIGNodXJuUHJldmVudGlvbjogbnVtYmVyO1xuICB9O1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGVzZSBlc3RpbWF0ZXMgKi9cbiAgY29uZmlkZW5jZTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJztcbiAgLyoqIE1ldGhvZG9sb2d5IHVzZWQgKi9cbiAgbWV0aG9kb2xvZ3k6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVhQTEFJTkFCSUxJVFkgUkVTVUxUICh2MiBjb21wYXRpYmlsaXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBBbmFseXNpc1Jlc3VsdCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbGFpbmFiaWxpdHlSZXN1bHQge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIGV4cGxhaW5hYmlsaXR5SWQ6IHN0cmluZztcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBvdXRjb21lOiB7XG4gICAgdmVyZGljdDogJ3N1Y2Nlc3MnIHwgJ3BhcnRpYWxfc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gICAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAgIHJlYXNvbmluZzogc3RyaW5nO1xuICB9O1xuICBidXNpbmVzc0ltcGFjdDoge1xuICAgIGltcGFjdFNjb3JlOiBudW1iZXI7XG4gICAgY3VzdG9tZXJTYXRpc2ZhY3Rpb246IG51bWJlcjtcbiAgICByZXZlbnVlUmlzazogc3RyaW5nO1xuICB9O1xuICByZWNvbW1lbmRhdGlvbnM6IEFycmF5PHtcbiAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgZXhwZWN0ZWRJbXBhY3Q6IHN0cmluZztcbiAgfT47XG4gIHJhZ0V2YWx1YXRpb24/OiB7XG4gICAgZ3JvdW5kZWRuZXNzOiBudW1iZXI7XG4gICAgZmFpdGhmdWxuZXNzOiBudW1iZXI7XG4gICAgYW5zd2VyUmVsZXZhbmNlOiBudW1iZXI7XG4gIH07XG4gIGhhbGx1Y2luYXRpb25SZXBvcnQ/OiB7XG4gICAgZGV0ZWN0ZWQ6IGJvb2xlYW47XG4gICAgdHlwZXM6IHN0cmluZ1tdO1xuICAgIHNldmVyaXR5OiBzdHJpbmc7XG4gIH07XG4gIHByb2Nlc3NpbmdUaW1lTXM6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVBJIFJFU1BPTlNFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpUmVzcG9uc2U8VD4ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhPzogVDtcbiAgZXJyb3I/OiB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZXRhaWxzPzogdW5rbm93bjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXNwb25zZTxUPiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE6IHtcbiAgICBpdGVtczogVFtdO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgaGFzTW9yZTogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5SZXNwb25zZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbXBhbnlJZDogc3RyaW5nO1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHRpY2tldElkPzogc3RyaW5nO1xuICBjdXN0b21lckFjY291bnRJZD86IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZztcbiAgZW5kZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgb3V0Y29tZT86IFJ1bk91dGNvbWU7XG4gIG91dGNvbWVSZWFzb24/OiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbk1lc3NhZ2VzOiBDb252ZXJzYXRpb25NZXNzYWdlW107XG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIHByb21wdFZlcnNpb24/OiBzdHJpbmc7XG4gIGN1c3RvbWVyQ29udGV4dFNuYXBzaG90PzogQ3VzdG9tZXJDb250ZXh0U25hcHNob3Q7XG4gIHplbmRlc2tNYXJrZXI/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cbiJdfQ==
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbmtIaXZlIFNESyB2My4wIC0gQ29yZSBUeXBlc1xuICpcbiAqIFJ1bi1jZW50cmljIHR5cGVzIHdpdGggZmFjdHMgdnMgaW5mZXJlbmNlcyBhbmQgY3VzdG9tZXIgY29udGV4dCBzbmFwc2hvdHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTklUIE9QVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0T3B0aW9ucyB7XG4gIC8qKiBUaGlua0hpdmUgQVBJIGtleSAoc3RhcnRzIHdpdGggdGhfKSAqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBBZ2VudCBJRCAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xuICAvKiogVGhpbmtIaXZlIEFQSSBlbmRwb2ludCAqL1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgdHJhY2VzICovXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIGF1dG8taW5zdHJ1bWVudGF0aW9uICovXG4gIGF1dG9JbnN0cnVtZW50PzogYm9vbGVhbjtcbiAgLyoqIEZyYW1ld29ya3MgdG8gYXV0by1pbnN0cnVtZW50ICovXG4gIGZyYW1ld29ya3M/OiBGcmFtZXdvcmtbXTtcbiAgLyoqIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgRnJhbWV3b3JrID1cbiAgfCAnbGFuZ2NoYWluJ1xuICB8ICdsYW5nZ3JhcGgnXG4gIHwgJ29wZW5haSdcbiAgfCAnb3BlbmFpLWFzc2lzdGFudHMnXG4gIHwgJ2FudGhyb3BpYydcbiAgfCAnbGxhbWFpbmRleCdcbiAgfCAnbjhuJ1xuICB8ICd2b2ljZWZsb3cnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSVU4gT1BUSU9OUyAodjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBydW4gKHYzIGF0b21pYyB1bml0KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMge1xuICAvKiogQWdlbnQgSUQgKi9cbiAgYWdlbnRJZDogc3RyaW5nO1xuICAvKiogV2hlbiB0aGUgcnVuIHN0YXJ0ZWQgKi9cbiAgc3RhcnRlZEF0Pzogc3RyaW5nIHwgRGF0ZTtcbiAgLyoqIFdoZW4gdGhlIHJ1biBlbmRlZCAqL1xuICBlbmRlZEF0Pzogc3RyaW5nIHwgRGF0ZTtcbiAgLyoqIFJ1biBvdXRjb21lICovXG4gIG91dGNvbWU/OiBSdW5PdXRjb21lO1xuICAvKiogUmVhc29uIGZvciB0aGUgb3V0Y29tZSAqL1xuICBvdXRjb21lUmVhc29uPzogc3RyaW5nO1xuICAvKiogQ29udmVyc2F0aW9uIG1lc3NhZ2VzICovXG4gIGNvbnZlcnNhdGlvbk1lc3NhZ2VzOiBDb252ZXJzYXRpb25NZXNzYWdlW107XG4gIC8qKiBNb2RlbCBJRCB1c2VkICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKiBQcm9tcHQgdmVyc2lvbiAqL1xuICBwcm9tcHRWZXJzaW9uPzogc3RyaW5nO1xuICAvKiogU2Vzc2lvbiBJRCBmb3IgY29udmVyc2F0aW9uIHRyYWNraW5nICovXG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgLyoqIEN1c3RvbWVyIGNvbnRleHQgc25hcHNob3QgKEFSUiwgaGVhbHRoIEFTIE9GIHRoaXMgcnVuKSAqL1xuICBjdXN0b21lckNvbnRleHQ/OiBDdXN0b21lckNvbnRleHRTbmFwc2hvdDtcbiAgLyoqIFRpY2tldCBsaW5raW5nIG9wdGlvbnMgKi9cbiAgdGlja2V0TGlua2luZz86IFRpY2tldExpbmtpbmdPcHRpb25zO1xuICAvKiogQ3VzdG9tIG1ldGFkYXRhICovXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBDdXN0b20gYnVzaW5lc3MgbWV0cmljcyB0byByZWNvcmQgd2l0aCB0aGlzIHJ1bi5cbiAgICogS2V5cyBzaG91bGQgbWF0Y2ggbWV0cmljcyBkZWNsYXJlZCBkdXJpbmcgYWdlbnQgc2V0dXAgKG9uYm9hcmRpbmcpLlxuICAgKiBWYWx1ZXMgY2FuIGJlIG51bWJlcnMsIGJvb2xlYW5zLCBvciBzaG9ydCBzdHJpbmdzIChtYXggMTAwIGNoYXJzKS5cbiAgICpcbiAgICogTWV0cmljcyBhcmUgYWdncmVnYXRlZCBvdmVyIHRpbWUgZm9yIGRhc2hib2FyZCBkaXNwbGF5IGFuZCB0cmVuZCBhbmFseXNpcy5cbiAgICogVW5kZWNsYXJlZCBtZXRyaWNzIHdpbGwgYmUgdHJhY2tlZCBidXQgZmxhZ2dlZCBhcyBcImRpc2NvdmVyZWRcIiBtZXRyaWNzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBtZXRyaWNzOiB7XG4gICAqICAgY3VzdG9tZXJfc2F0aXNmYWN0aW9uOiA0LjUsXG4gICAqICAgcmVzb2x1dGlvbl90aW1lX21zOiAyNDUwLFxuICAgKiAgIGVzY2FsYXRlZDogZmFsc2UsXG4gICAqICAgdGlja2V0X3ByaW9yaXR5OiAnaGlnaCdcbiAgICogfVxuICAgKi9cbiAgbWV0cmljcz86IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmc+O1xuICAvKipcbiAgICogUmVxdWVzdCBldmFsdWF0aW9uIHdoZW4gcnVuIGlzIGluZ2VzdGVkLlxuICAgKiBPdmVycmlkZXMgYWdlbnQncyBhdXRvX2V2YWx1YXRlIHNldHRpbmcgZm9yIHRoaXMgcnVuLlxuICAgKlxuICAgKiAtIHRydWU6IEZvcmNlIGV2YWx1YXRpb24gb24gdGhpcyBydW5cbiAgICogLSBmYWxzZTogU2tpcCBldmFsdWF0aW9uIGV2ZW4gaWYgYWdlbnQgaGFzIGF1dG9fZXZhbHVhdGUgZW5hYmxlZFxuICAgKiAtIHVuZGVmaW5lZDogVXNlIGFnZW50J3MgYXV0b19ldmFsdWF0ZSBzZXR0aW5nIChkZWZhdWx0KVxuICAgKi9cbiAgcnVuRXZhbHVhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJ1bk91dGNvbWUgPVxuICB8ICdyZXNvbHZlZCdcbiAgfCAnZXNjYWxhdGVkJ1xuICB8ICdhYmFuZG9uZWQnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAndHJhbnNmZXJyZWQnXG4gIHwgJ3BlbmRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnNhdGlvbk1lc3NhZ2Uge1xuICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JyB8ICdzeXN0ZW0nIHwgJ3Rvb2wnO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHRpbWVzdGFtcD86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ1VTVE9NRVIgQ09OVEVYVCBTTkFQU0hPVCAodjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3VzdG9tZXIgY29udGV4dCBjYXB0dXJlZCBBUyBPRiB0aGUgcnVuIHRpbWUgKG5vdCBjdXJyZW50IHZhbHVlcylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckNvbnRleHRTbmFwc2hvdCB7XG4gIC8qKiBDdXN0b21lciBhY2NvdW50IElEICovXG4gIGN1c3RvbWVySWQ/OiBzdHJpbmc7XG4gIC8qKiBBUlIgYXQgdGhlIHRpbWUgb2YgdGhlIHJ1biAobm90IGN1cnJlbnQgQVJSKSAqL1xuICBhcnI/OiBudW1iZXI7XG4gIC8qKiBIZWFsdGggc2NvcmUgYXQgdGhlIHRpbWUgb2YgdGhlIHJ1biAoMC0xMDApICovXG4gIGhlYWx0aFNjb3JlPzogbnVtYmVyO1xuICAvKiogQ3VzdG9tZXIgc2VnbWVudCAoZS5nLiwgJ2VudGVycHJpc2UnLCAnbWlkLW1hcmtldCcsICdzbWInKSAqL1xuICBzZWdtZW50Pzogc3RyaW5nO1xuICAvKiogV2hlbiB0aGlzIHNuYXBzaG90IHdhcyBjYXB0dXJlZCAqL1xuICBjYXB0dXJlZEF0Pzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIGZpZWxkcyAod2lsbCBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBzY2hlbWEpICovXG4gIGN1c3RvbUZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUSUNLRVQgTElOS0lORyAodjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGV0ZXJtaW5pc3RpYyB0aWNrZXQgbGlua2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tldExpbmtpbmdPcHRpb25zIHtcbiAgLyoqIExpbmsgbWV0aG9kIHRvIHVzZSAqL1xuICBtZXRob2Q6IExpbmtNZXRob2Q7XG4gIC8qKiBUaWNrZXQgSUQgKGZvciBzZGtfZXhwbGljaXQgbWV0aG9kKSAqL1xuICB0aWNrZXRJZD86IHN0cmluZztcbiAgLyoqIEV4dGVybmFsIHRpY2tldCBJRCAoZS5nLiwgWmVuZGVzayB0aWNrZXQgSUQpICovXG4gIGV4dGVybmFsVGlja2V0SWQ/OiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBmb3IgZXh0ZXJuYWwgdGlja2V0ICovXG4gIHBsYXRmb3JtPzogJ3plbmRlc2snIHwgJ2ludGVyY29tJyB8ICdzYWxlc2ZvcmNlJyB8ICdmcmVzaGRlc2snO1xuICAvKiogQ3VzdG9tIGZpZWxkIG5hbWUgZm9yIGxpbmtpbmcgKi9cbiAgY3VzdG9tRmllbGROYW1lPzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIGZpZWxkIHZhbHVlICovXG4gIGN1c3RvbUZpZWxkVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExpbmtNZXRob2QgPVxuICB8ICdzZGtfZXhwbGljaXQnICAgICAgLy8gRGlyZWN0IFNESyBjYWxsIHdpdGggdGlja2V0IElEIChjb25maWRlbmNlOiAxLjApXG4gIHwgJ3plbmRlc2tfbWFya2VyJyAgICAvLyBFbWJlZGRlZCBUSElEIG1hcmtlciBpbiByZXNwb25zZSAoY29uZmlkZW5jZTogMS4wKVxuICB8ICdjdXN0b21fZmllbGQnICAgICAgLy8gWmVuZGVzayBjdXN0b20gZmllbGQgKGNvbmZpZGVuY2U6IDEuMClcbiAgfCAnbWlkZGxld2FyZV9zdGFtcCcgIC8vIE1pZGRsZXdhcmUtaW5qZWN0ZWQgdHJhY2UgSUQgKGNvbmZpZGVuY2U6IDAuOTgpXG4gIHwgJ3Nlc3Npb25fbWF0Y2gnICAgICAvLyBTZXNzaW9uIElEIGNvcnJlbGF0aW9uIChjb25maWRlbmNlOiAwLjk1KVxuICB8ICdlbWFpbF90aW1lX3dpbmRvdycgLy8gRW1haWwgKyAxNW1pbiB3aW5kb3cgKGNvbmZpZGVuY2U6IDAuNilcbiAgfCAnbWFudWFsJzsgICAgICAgICAgIC8vIEh1bWFuLWFzc2lnbmVkIChjb25maWRlbmNlOiAxLjApXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRSQUNFIE9QVElPTlMgKHYyIGNvbXBhdGliaWxpdHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2xhc3NpZmljYXRpb24gZmxhZ3MgZm9yIGNhdGVnb3JpemluZyB0cmFjZSBpc3N1ZXNcbiAqIFNlcGFyYXRlIGZyb20gYmluYXJ5IG91dGNvbWUgKHN1Y2Nlc3MvZmFpbHVyZSlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2VDdXN0b21GbGFnID1cbiAgfCAnaGFsbHVjaW5hdGlvbidcbiAgfCAncG9saWN5X3Zpb2xhdGlvbidcbiAgfCAndG9uZV9pc3N1ZSdcbiAgfCAncmV0cmlldmFsX21pc3MnXG4gIHwgJ2Vycm9yJztcblxuLyoqXG4gKiBUcmFjZSBvcHRpb25zICh2MiBmb3JtYXQsIGNvbnZlcnRlZCB0byBydW5zIGludGVybmFsbHkpXG4gKiBAZGVwcmVjYXRlZCBVc2UgUnVuT3B0aW9ucyBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VPcHRpb25zIHtcbiAgLyoqIFVzZXIncyBtZXNzYWdlL3F1ZXJ5ICovXG4gIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBBZ2VudCdzIHJlc3BvbnNlICovXG4gIGFnZW50UmVzcG9uc2U6IHN0cmluZztcbiAgLyoqIFVzZXIncyBkZXRlY3RlZCBpbnRlbnQgKi9cbiAgdXNlckludGVudD86IHN0cmluZztcbiAgLyoqIEJpbmFyeSBvdXRjb21lOiBzdWNjZXNzIG9yIGZhaWx1cmUgKi9cbiAgb3V0Y29tZT86ICdzdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgLyoqIENsYXNzaWZpY2F0aW9uIGZsYWdzIGZvciBjYXRlZ29yaXppbmcgdGhlIGlzc3VlIHR5cGUgKGhhbGx1Y2luYXRpb24sIHBvbGljeV92aW9sYXRpb24sIGV0Yy4pICovXG4gIGN1c3RvbUZsYWdzPzogVHJhY2VDdXN0b21GbGFnW107XG4gIC8qKiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKi9cbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKiBTZXNzaW9uIElEIGZvciBjb252ZXJzYXRpb24gdHJhY2tpbmcgKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAvKiogQ29udmVyc2F0aW9uIGhpc3RvcnkgKi9cbiAgY29udmVyc2F0aW9uSGlzdG9yeT86IEFycmF5PHsgcm9sZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT47XG4gIC8qKiBTcGFuIGRhdGEgZm9yIGRldGFpbGVkIGFuYWx5c2lzICovXG4gIHNwYW5zPzogU3BhbkRhdGFbXTtcbiAgLyoqIEJ1c2luZXNzIGNvbnRleHQgZm9yIFJPSSBjYWxjdWxhdGlvbiAqL1xuICBidXNpbmVzc0NvbnRleHQ/OiBCdXNpbmVzc0NvbnRleHQ7XG4gIC8qKiBDdXN0b20gbWV0YWRhdGEgKi9cbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBidXNpbmVzcyBtZXRyaWNzIHRvIHJlY29yZCB3aXRoIHRoaXMgdHJhY2UuXG4gICAqIEtleXMgc2hvdWxkIG1hdGNoIG1ldHJpY3MgZGVjbGFyZWQgZHVyaW5nIGFnZW50IHNldHVwLlxuICAgKiBWYWx1ZXMgY2FuIGJlIG51bWJlcnMsIGJvb2xlYW5zLCBvciBzaG9ydCBzdHJpbmdzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBtZXRyaWNzOiB7XG4gICAqICAgY3VzdG9tZXJfc2F0aXNmYWN0aW9uOiA0LjUsXG4gICAqICAgcmVzb2x1dGlvbl90aW1lX21zOiAyNDUwLFxuICAgKiAgIGVzY2FsYXRlZDogZmFsc2VcbiAgICogfVxuICAgKi9cbiAgbWV0cmljcz86IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmc+O1xuICAvKipcbiAgICogUmVxdWVzdCBldmFsdWF0aW9uIHdoZW4gdHJhY2UgaXMgaW5nZXN0ZWQuXG4gICAqIE92ZXJyaWRlcyBhZ2VudCdzIGF1dG9fZXZhbHVhdGUgc2V0dGluZyBmb3IgdGhpcyB0cmFjZS5cbiAgICpcbiAgICogLSB0cnVlOiBGb3JjZSBldmFsdWF0aW9uIG9uIHRoaXMgdHJhY2VcbiAgICogLSBmYWxzZTogU2tpcCBldmFsdWF0aW9uIGV2ZW4gaWYgYWdlbnQgaGFzIGF1dG9fZXZhbHVhdGUgZW5hYmxlZFxuICAgKiAtIHVuZGVmaW5lZDogVXNlIGFnZW50J3MgYXV0b19ldmFsdWF0ZSBzZXR0aW5nIChkZWZhdWx0KVxuICAgKi9cbiAgcnVuRXZhbHVhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BhbkRhdGEge1xuICBpZD86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiAnbGxtJyB8ICd0b29sJyB8ICdyZXRyaWV2YWwnIHwgJ2VtYmVkZGluZycgfCAnY2hhaW4nIHwgJ2N1c3RvbSc7XG4gIHN0YXJ0VGltZT86IERhdGU7XG4gIGVuZFRpbWU/OiBEYXRlO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBzdGF0dXM/OiAnb2snIHwgJ2Vycm9yJyB8ICd0aW1lb3V0JztcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgb3V0cHV0PzogdW5rbm93bjtcbiAgLy8gTExNLXNwZWNpZmljXG4gIG1vZGVsPzogc3RyaW5nO1xuICBwcm92aWRlcj86IHN0cmluZztcbiAgcHJvbXB0VG9rZW5zPzogbnVtYmVyO1xuICBjb21wbGV0aW9uVG9rZW5zPzogbnVtYmVyO1xuICAvLyBUb29sLXNwZWNpZmljXG4gIHRvb2xOYW1lPzogc3RyaW5nO1xuICB0b29sUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvLyBSZXRyaWV2YWwtc3BlY2lmaWNcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGRvY3VtZW50Q291bnQ/OiBudW1iZXI7XG4gIHRvcFNjb3JlPzogbnVtYmVyO1xuICBzb3VyY2VzPzogc3RyaW5nW107XG4gIC8vIENoaWxkcmVuXG4gIGNoaWxkcmVuPzogU3BhbkRhdGFbXTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ3VzdG9tZXJDb250ZXh0U25hcHNob3QgaW5zdGVhZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzQ29udGV4dCB7XG4gIC8qKiBDdXN0b21lciBJRCAqL1xuICBjdXN0b21lcklkPzogc3RyaW5nO1xuICAvKiogVHJhbnNhY3Rpb24gdmFsdWUgaW4gZG9sbGFycyAqL1xuICB0cmFuc2FjdGlvblZhbHVlPzogbnVtYmVyO1xuICAvKiogUHJpb3JpdHkgbGV2ZWwgKi9cbiAgcHJpb3JpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbiAgLyoqIERlcGFydG1lbnQgKi9cbiAgZGVwYXJ0bWVudD86IHN0cmluZztcbiAgLyoqIEluZHVzdHJ5IHZlcnRpY2FsICovXG4gIGluZHVzdHJ5Pzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIGZpZWxkcyAqL1xuICBjdXN0b20/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0xBSU0gVFlQRVMgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEEgY2xhaW0gYWJvdXQgYSBydW4gKGZhY3QgdnMgaW5mZXJlbmNlKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYWltIHtcbiAgaWQ6IHN0cmluZztcbiAgYW5hbHlzaXNJZDogc3RyaW5nO1xuICAvKiogVHlwZSBvZiBjbGFpbSAqL1xuICBjbGFpbVR5cGU6IENsYWltVHlwZTtcbiAgLyoqIENhdGVnb3J5IG9mIHRoZSBjbGFpbSAqL1xuICBjbGFpbUNhdGVnb3J5OiBDbGFpbUNhdGVnb3J5O1xuICAvKiogVGhlIGNsYWltIHRleHQgKi9cbiAgY2xhaW1UZXh0OiBzdHJpbmc7XG4gIC8qKiBDb25maWRlbmNlIGluIHRoaXMgY2xhaW0gKDAtMSkgKi9cbiAgY29uZmlkZW5jZTogbnVtYmVyO1xuICAvKiogSG93IHdlbGwgY2FsaWJyYXRlZCBpcyB0aGlzIGNvbmZpZGVuY2UgKi9cbiAgY29uZmlkZW5jZUNhbGlicmF0aW9uOiBDb25maWRlbmNlQ2FsaWJyYXRpb247XG4gIC8qKiBFdmlkZW5jZSBzdXBwb3J0aW5nIHRoaXMgY2xhaW0gKi9cbiAgZXZpZGVuY2U6IEV2aWRlbmNlUmVmZXJlbmNlW107XG4gIC8qKiBJcyB0aGlzIGNsYWltIGV4cGxhaW5hYmxlIHRvIGVuZCB1c2VycyAqL1xuICBpc0V4cGxhaW5hYmxlOiBib29sZWFuO1xuICAvKiogUHJvYmFiaWxpdHkgdmFsdWUgZm9yIHByb2JhYmlsaXR5IGNsYWltcyAqL1xuICBwcm9iYWJpbGl0eVZhbHVlPzogbnVtYmVyO1xuICAvKiogSHVtYW4tYXNzaWduZWQgdmVyaWZpY2F0aW9uIHN0YXR1cyAqL1xuICBodW1hblZlcmlmaWVkPzogYm9vbGVhbjtcbiAgLyoqIEh1bWFuIHZlcmlmaWNhdGlvbiB2ZXJkaWN0ICovXG4gIGh1bWFuVmVyZGljdD86ICdjb25maXJtZWQnIHwgJ3JlamVjdGVkJyB8ICdtb2RpZmllZCc7XG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2xhaW1UeXBlID0gJ29ic2VydmVkJyB8ICdpbmZlcnJlZCcgfCAnY29tcHV0ZWQnO1xuZXhwb3J0IHR5cGUgQ2xhaW1DYXRlZ29yeSA9XG4gIHwgJ291dGNvbWUnXG4gIHwgJ3Jvb3RfY2F1c2UnXG4gIHwgJ2N1c3RvbWVyX2ltcGFjdCdcbiAgfCAnY2h1cm5fcmlzaydcbiAgfCAncmV2ZW51ZV9pbXBhY3QnXG4gIHwgJ3F1YWxpdHknXG4gIHwgJ290aGVyJztcbmV4cG9ydCB0eXBlIENvbmZpZGVuY2VDYWxpYnJhdGlvbiA9ICdjYWxpYnJhdGVkJyB8ICd1bmNhbGlicmF0ZWQnIHwgJ25lZWRzX21vcmVfZGF0YSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZpZGVuY2VSZWZlcmVuY2Uge1xuICAvKiogVHlwZSBvZiBldmlkZW5jZSAqL1xuICB0eXBlOiAnc3BhbicgfCAnbWVzc2FnZScgfCAndG9vbF9jYWxsJyB8ICdleHRlcm5hbCcgfCAnY29tcHV0ZWQnO1xuICAvKiogSUQgb2YgdGhlIHJlZmVyZW5jZWQgaXRlbSAqL1xuICByZWZlcmVuY2VJZDogc3RyaW5nO1xuICAvKiogSG93IHJlbGV2YW50IGlzIHRoaXMgZXZpZGVuY2UgKi9cbiAgcmVsZXZhbmNlOiBzdHJpbmc7XG4gIC8qKiBDb25maWRlbmNlIGluIHRoaXMgZXZpZGVuY2UgKi9cbiAgY29uZmlkZW5jZTogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBTkFMWVNJUyBSRVNVTFQgKHYzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5c2lzUmVzdWx0IHtcbiAgaWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgYW5hbHlzaXNWZXJzaW9uOiBzdHJpbmc7XG4gIG1vZGVsVXNlZDogc3RyaW5nO1xuICAvKiogT3ZlcmFsbCBvdXRjb21lIHZlcmRpY3QgKi9cbiAgb3V0Y29tZVZlcmRpY3Q6ICdzdWNjZXNzJyB8ICdwYXJ0aWFsX3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuICAvKiogQ29uZmlkZW5jZSBpbiB0aGUgdmVyZGljdCAoMC0xKSAqL1xuICBvdXRjb21lQ29uZmlkZW5jZTogbnVtYmVyO1xuICAvKiogUm9vdCBjYXVzZSBjYXRlZ29yeSBpZiBmYWlsdXJlICovXG4gIHJvb3RDYXVzZUNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogQ29uZmlkZW5jZSBpbiByb290IGNhdXNlICgwLTEpICovXG4gIHJvb3RDYXVzZUNvbmZpZGVuY2U/OiBudW1iZXI7XG4gIC8qKiBJcyB0aGlzIHRoZSBjdXJyZW50IGFuYWx5c2lzICovXG4gIGlzQ3VycmVudDogYm9vbGVhbjtcbiAgLyoqIElEIG9mIGFuYWx5c2lzIHRoYXQgc3VwZXJzZWRlZCB0aGlzIG9uZSAqL1xuICBzdXBlcnNlZGVkQnk/OiBzdHJpbmc7XG4gIC8qKiBDbGFpbXMgZnJvbSB0aGlzIGFuYWx5c2lzICovXG4gIGNsYWltczogQ2xhaW1bXTtcbiAgYW5hbHl6ZWRBdD86IHN0cmluZztcbiAgY3JlYXRlZEF0Pzogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDQUxJQlJBVElPTiBUWVBFUyAodjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsaWJyYXRpb25TdGF0dXMge1xuICBhZ2VudElkOiBzdHJpbmc7XG4gIHByZWRpY3Rpb25UeXBlOiBQcmVkaWN0aW9uVHlwZTtcbiAgLyoqIEJyaWVyIHNjb3JlIChsb3dlciBpcyBiZXR0ZXIsIDwwLjEgaXMgZ29vZCkgKi9cbiAgYnJpZXJTY29yZTogbnVtYmVyO1xuICAvKiogRXhwZWN0ZWQgQ2FsaWJyYXRpb24gRXJyb3IgKi9cbiAgZWNlOiBudW1iZXI7XG4gIC8qKiBTYW1wbGUgY291bnQgKi9cbiAgc2FtcGxlQ291bnQ6IG51bWJlcjtcbiAgLyoqIElzIHRoZSBtb2RlbCB3ZWxsLWNhbGlicmF0ZWQgKi9cbiAgaXNDYWxpYnJhdGVkOiBib29sZWFuO1xuICAvKiogQ2FsaWJyYXRpb24gYnkgY29uZmlkZW5jZSBidWNrZXQgKi9cbiAgYnVja2V0czogQ2FsaWJyYXRpb25CdWNrZXRbXTtcbiAgbGFzdFVwZGF0ZWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFByZWRpY3Rpb25UeXBlID1cbiAgfCAnb3V0Y29tZSdcbiAgfCAnY2h1cm5fcmlzaydcbiAgfCAnZXNjYWxhdGlvbl9yaXNrJ1xuICB8ICdyZXNvbHV0aW9uX3RpbWUnXG4gIHwgJ2N1c3RvbWVyX3NhdGlzZmFjdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsaWJyYXRpb25CdWNrZXQge1xuICBidWNrZXRTdGFydDogbnVtYmVyO1xuICBidWNrZXRFbmQ6IG51bWJlcjtcbiAgcHJlZGljdGVkUHJvYmFiaWxpdHk6IG51bWJlcjtcbiAgYWN0dWFsRnJlcXVlbmN5OiBudW1iZXI7XG4gIHNhbXBsZUNvdW50OiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJPSSBUWVBFUyAodjMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9pQ29uZmlnIHtcbiAgLyoqIENvc3QgcGVyIHN1cHBvcnQgdGlja2V0IGRlZmxlY3RlZCAqL1xuICB0aWNrZXREZWZsZWN0aW9uVmFsdWU6IG51bWJlcjtcbiAgLyoqIENvc3QgcGVyIGVzY2FsYXRpb24gKi9cbiAgZXNjYWxhdGlvbkNvc3Q6IG51bWJlcjtcbiAgLyoqIENvc3QgcGVyIGhvdXIgb2YgYWdlbnQgdGltZSAqL1xuICBhZ2VudEhvdXJseUNvc3Q6IG51bWJlcjtcbiAgLyoqIEF2ZXJhZ2UgcmVzb2x1dGlvbiB0aW1lIChtaW51dGVzKSAqL1xuICBhdmdSZXNvbHV0aW9uTWludXRlczogbnVtYmVyO1xuICAvKiogQ1NBVCBpbXBhY3QgbXVsdGlwbGllciAqL1xuICBjc2F0SW1wYWN0TXVsdGlwbGllcjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvaVN1bW1hcnkge1xuICBwZXJpb2Q6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH07XG4gIC8qKiBUb3RhbCBlc3RpbWF0ZWQgc2F2aW5ncyAqL1xuICB0b3RhbFNhdmluZ3M6IG51bWJlcjtcbiAgLyoqIEJyZWFrZG93biBieSBjYXRlZ29yeSAqL1xuICBicmVha2Rvd246IHtcbiAgICB0aWNrZXREZWZsZWN0aW9uOiBudW1iZXI7XG4gICAgZXNjYWxhdGlvblByZXZlbnRpb246IG51bWJlcjtcbiAgICB0aW1lVG9SZXNvbHV0aW9uOiBudW1iZXI7XG4gICAgY2h1cm5QcmV2ZW50aW9uOiBudW1iZXI7XG4gIH07XG4gIC8qKiBDb25maWRlbmNlIGluIHRoZXNlIGVzdGltYXRlcyAqL1xuICBjb25maWRlbmNlOiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnO1xuICAvKiogTWV0aG9kb2xvZ3kgdXNlZCAqL1xuICBtZXRob2RvbG9neTogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBMQUlOQUJJTElUWSBSRVNVTFQgKHYyIGNvbXBhdGliaWxpdHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEFuYWx5c2lzUmVzdWx0IGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluYWJpbGl0eVJlc3VsdCB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgZXhwbGFpbmFiaWxpdHlJZDogc3RyaW5nO1xuICBzdW1tYXJ5OiBzdHJpbmc7XG4gIG91dGNvbWU6IHtcbiAgICB2ZXJkaWN0OiAnc3VjY2VzcycgfCAncGFydGlhbF9zdWNjZXNzJyB8ICdmYWlsdXJlJztcbiAgICBjb25maWRlbmNlOiBudW1iZXI7XG4gICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gIH07XG4gIGJ1c2luZXNzSW1wYWN0OiB7XG4gICAgaW1wYWN0U2NvcmU6IG51bWJlcjtcbiAgICBjdXN0b21lclNhdGlzZmFjdGlvbjogbnVtYmVyO1xuICAgIHJldmVudWVSaXNrOiBzdHJpbmc7XG4gIH07XG4gIHJlY29tbWVuZGF0aW9uczogQXJyYXk8e1xuICAgIHByaW9yaXR5OiBzdHJpbmc7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICBhY3Rpb246IHN0cmluZztcbiAgICBleHBlY3RlZEltcGFjdDogc3RyaW5nO1xuICB9PjtcbiAgcmFnRXZhbHVhdGlvbj86IHtcbiAgICBncm91bmRlZG5lc3M6IG51bWJlcjtcbiAgICBmYWl0aGZ1bG5lc3M6IG51bWJlcjtcbiAgICBhbnN3ZXJSZWxldmFuY2U6IG51bWJlcjtcbiAgfTtcbiAgaGFsbHVjaW5hdGlvblJlcG9ydD86IHtcbiAgICBkZXRlY3RlZDogYm9vbGVhbjtcbiAgICB0eXBlczogc3RyaW5nW107XG4gICAgc2V2ZXJpdHk6IHN0cmluZztcbiAgfTtcbiAgcHJvY2Vzc2luZ1RpbWVNczogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBUEkgUkVTUE9OU0UgVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXNwb25zZTxUPiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE/OiBUO1xuICBlcnJvcj86IHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRldGFpbHM/OiB1bmtub3duO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3BvbnNlPFQ+IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZGF0YToge1xuICAgIGl0ZW1zOiBUW107XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICBoYXNNb3JlOiBib29sZWFuO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgY29tcGFueUlkOiBzdHJpbmc7XG4gIGFnZW50SWQ6IHN0cmluZztcbiAgdGlja2V0SWQ/OiBzdHJpbmc7XG4gIGN1c3RvbWVyQWNjb3VudElkPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICBlbmRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBvdXRjb21lPzogUnVuT3V0Y29tZTtcbiAgb3V0Y29tZVJlYXNvbj86IHN0cmluZztcbiAgY29udmVyc2F0aW9uTWVzc2FnZXM6IENvbnZlcnNhdGlvbk1lc3NhZ2VbXTtcbiAgbW9kZWxJZD86IHN0cmluZztcbiAgcHJvbXB0VmVyc2lvbj86IHN0cmluZztcbiAgY3VzdG9tZXJDb250ZXh0U25hcHNob3Q/OiBDdXN0b21lckNvbnRleHRTbmFwc2hvdDtcbiAgemVuZGVza01hcmtlcj86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuIl19
|