athena-query-result-pager 0.4.6 → 0.5.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/README.md +32 -4
- package/lib/index.d.ts +23 -4
- package/lib/index.js +29 -4
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -7,6 +7,23 @@ Paginate [AWS Athena](https://docs.aws.amazon.com/athena/latest/ug/v3-sdk.html)
|
|
|
7
7
|
|
|
8
8
|
Page-level and row-level APIs are symmetric: use the base method for raw **`ParsedRow`** values, or the `*With` / `rowParser` variant for custom types.
|
|
9
9
|
|
|
10
|
+
## Compared to the AWS SDK paginator
|
|
11
|
+
|
|
12
|
+
`@aws-sdk/client-athena` already ships [`paginateGetQueryResults`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-athena/Function/paginateGetQueryResults/). It walks **`NextToken`** and yields raw **`GetQueryResultsCommandOutput`** pages — fine if you only need SDK-shaped pages and will parse rows yourself.
|
|
13
|
+
|
|
14
|
+
**This package is the easier path when you want rows, not raw Athena pages:** header skipping, dictionary / typed rows, and page- or row-level async iteration are built in, so you skip the usual glue code around the official paginator.
|
|
15
|
+
|
|
16
|
+
| | SDK `paginateGetQueryResults` | This package |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| Page walking (`NextToken`) | Yes | Yes |
|
|
19
|
+
| Output | Raw Athena / SDK page objects | Parsed **`ParsedRow`** (or custom `T` via **`RowParser`**) |
|
|
20
|
+
| Header-row handling & parse options | You implement | Via [athena-query-result-parser](https://www.npmjs.com/package/athena-query-result-parser) (`skipHeaderRow`, mismatch behavior, …) |
|
|
21
|
+
| Row-level async iteration | You flatten pages | **`iterateRows`** (one page buffered at a time) |
|
|
22
|
+
| Defaults for **`MaxResults`** / **`QueryResultType`** | Per request input | Constructor **`PagerOptions`**, applied every fetch |
|
|
23
|
+
| Input checks | SDK only | Fail-fast for empty **`queryExecutionId`** and invalid **`maxResults`** |
|
|
24
|
+
|
|
25
|
+
Both still require a finished query execution and rely on your **`AthenaClient`** for retries — see **[Caller responsibilities](#caller-responsibilities)**.
|
|
26
|
+
|
|
10
27
|
## Features
|
|
11
28
|
|
|
12
29
|
- Sends paginated Athena **`GetQueryResults`** requests (`NextToken` / **`MaxResults`**).
|
|
@@ -18,7 +35,8 @@ Page-level and row-level APIs are symmetric: use the base method for raw **`Pars
|
|
|
18
35
|
- Async generators iterate **page-by-page** or **row-by-row** without holding full result sets in memory (only one page of rows is buffered at a time for row iterators).
|
|
19
36
|
- Fail-fast validation: **`maxResults`** must be an integer in **`1..1000`**; **`queryExecutionId`** must be non-empty (**`fetchPage`**, **`fetchPageWith`**).
|
|
20
37
|
- Re-exports **`QueryResultType`**, parser types (**`ParseResultSetOptions`**, **`ParsedRow`**, **`RowParser<T>`**, …), and parser utilities (**`rowToTypedObject`**, **`EXTRA_COLUMNS_KEY`**, …) from the package entry point.
|
|
21
|
-
- Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, **`reset()`**
|
|
38
|
+
- Helpers: **`AthenaQueryResultPager.hasNextPage`**, **`getLastHeaderRowDecision()`**, and **`reset()`** (usually optional — parser state resets automatically when **`queryExecutionId`** changes).
|
|
39
|
+
- Does **not** wait for query completion or add Athena-specific retry beyond the AWS SDK client — see **[Caller responsibilities](#caller-responsibilities)**.
|
|
22
40
|
|
|
23
41
|
## Installation
|
|
24
42
|
|
|
@@ -134,14 +152,24 @@ const decision = pager.getLastHeaderRowDecision();
|
|
|
134
152
|
console.log(decision?.skipped, decision?.reason);
|
|
135
153
|
```
|
|
136
154
|
|
|
137
|
-
###
|
|
155
|
+
### Reusing a pager across executions
|
|
138
156
|
|
|
139
|
-
|
|
157
|
+
Switching to a different **`queryExecutionId`** on **`fetchPage`** / **`fetchPageWith`** (and iterators that call them) **automatically resets** the bundled parser so header-row handling does not leak between queries. Call **`reset()`** only when you need to clear parser state without starting a new fetch:
|
|
140
158
|
|
|
141
159
|
```ts
|
|
142
160
|
pager.reset();
|
|
143
161
|
```
|
|
144
162
|
|
|
163
|
+
## Caller responsibilities
|
|
164
|
+
|
|
165
|
+
This library only paginates and parses **`GetQueryResults`**. It does **not** start queries, wait for execution to finish, or wrap Athena errors with custom retry policies. Failures surface as thrown AWS SDK errors (or parser errors) from **`fetchPage`** / **`fetchPageWith`**.
|
|
166
|
+
|
|
167
|
+
Handle the following in the calling application (or via **`AthenaClient`** configuration):
|
|
168
|
+
|
|
169
|
+
- **Query not finished yet** — Before paging, wait until **`GetQueryExecution`** reports a terminal state such as **`SUCCEEDED`**. Calling this pager while the query is still **`QUEUED`** / **`RUNNING`** will fail with the usual Athena / SDK error for that situation.
|
|
170
|
+
- **Throttling and transient API errors** — Configure retry on the **`AthenaClient`** (AWS SDK v3 retry middleware / client `maxAttempts`, etc.) or retry at the call site around **`fetchPage`** / iterators. This package does not implement Athena-specific backoff for **`ThrottlingException`** or similar.
|
|
171
|
+
- **Failed / cancelled queries** — Check execution state (and Athena’s error reason) before or when catching failures; the pager assumes a completed execution that can return result pages.
|
|
172
|
+
|
|
145
173
|
## Options
|
|
146
174
|
|
|
147
175
|
### `PagerOptions`
|
|
@@ -180,7 +208,7 @@ Both throw if **`queryExecutionId`** is empty or whitespace-only (before invokin
|
|
|
180
208
|
- **`iterateRows(queryExecutionId)`** → **`AsyncGenerator<ParsedRow>`**
|
|
181
209
|
- **`iterateRows<T>(queryExecutionId, rowParser)`** → **`AsyncGenerator<T>`**
|
|
182
210
|
- **`getLastHeaderRowDecision()`** → **`HeaderRowDecision | null`**
|
|
183
|
-
- **`reset()`** — clears bundled parser state (**header row bookkeeping**
|
|
211
|
+
- **`reset()`** — clears bundled parser state (**header row bookkeeping**). Usually unnecessary: **`fetchPage`** / **`fetchPageWith`** reset automatically when **`queryExecutionId`** changes.
|
|
184
212
|
- **`static hasNextPage<T>(pageResult: PageResult<T>)`** → **`boolean`**
|
|
185
213
|
|
|
186
214
|
### Types and re-exports
|
package/lib/index.d.ts
CHANGED
|
@@ -48,6 +48,11 @@ export interface PagerOptions {
|
|
|
48
48
|
*
|
|
49
49
|
* Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
|
|
50
50
|
* `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
|
|
51
|
+
* When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
|
|
52
|
+
*
|
|
53
|
+
* Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
|
|
54
|
+
* succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
|
|
55
|
+
* AWS SDK errors from `GetQueryResults` are propagated as thrown.
|
|
51
56
|
*
|
|
52
57
|
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
53
58
|
*/
|
|
@@ -66,8 +71,10 @@ export declare class AthenaQueryResultPager {
|
|
|
66
71
|
private readonly options;
|
|
67
72
|
/** Parser options applied on every page parse (undefined uses parser defaults). */
|
|
68
73
|
private readonly parseResultSetOptions?;
|
|
69
|
-
/** Stateful parser reused across
|
|
74
|
+
/** Stateful parser reused across pages of the same execution; reset on execution change or {@link AthenaQueryResultPager.reset}. */
|
|
70
75
|
private parser;
|
|
76
|
+
/** Last `queryExecutionId` passed to `fetchPage` / `fetchPageWith`; used to auto-reset the parser. */
|
|
77
|
+
private activeQueryExecutionId;
|
|
71
78
|
/**
|
|
72
79
|
* Creates a pager bound to `client` with optional per-request defaults.
|
|
73
80
|
*
|
|
@@ -76,10 +83,19 @@ export declare class AthenaQueryResultPager {
|
|
|
76
83
|
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
77
84
|
*/
|
|
78
85
|
constructor(client: AthenaClient, options?: PagerOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
|
|
88
|
+
*
|
|
89
|
+
* Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
|
|
90
|
+
*
|
|
91
|
+
* @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
|
|
92
|
+
*/
|
|
93
|
+
private readonly ensureParserForExecution;
|
|
79
94
|
/**
|
|
80
95
|
* Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
|
|
81
96
|
*
|
|
82
97
|
* Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
|
|
98
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
83
99
|
*
|
|
84
100
|
* @param queryExecutionId - Athena query execution identifier.
|
|
85
101
|
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
@@ -91,6 +107,7 @@ export declare class AthenaQueryResultPager {
|
|
|
91
107
|
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
92
108
|
*
|
|
93
109
|
* Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
|
|
110
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
94
111
|
*
|
|
95
112
|
* @typeParam T - Output type produced by `rowParser`.
|
|
96
113
|
* @param queryExecutionId - Athena query execution identifier.
|
|
@@ -141,13 +158,15 @@ export declare class AthenaQueryResultPager {
|
|
|
141
158
|
*
|
|
142
159
|
* Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
|
|
143
160
|
*
|
|
144
|
-
* @returns The last {@link HeaderRowDecision}, or `null` before any parse
|
|
161
|
+
* @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
|
|
145
162
|
*/
|
|
146
163
|
getLastHeaderRowDecision(): HeaderRowDecision | null;
|
|
147
164
|
/**
|
|
148
|
-
* Clears the bundled {@link AthenaQueryResultParser} state
|
|
165
|
+
* Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
|
|
149
166
|
*
|
|
150
|
-
*
|
|
167
|
+
* Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
|
|
168
|
+
* reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
|
|
169
|
+
* (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
|
|
151
170
|
*/
|
|
152
171
|
reset(): void;
|
|
153
172
|
}
|
package/lib/index.js
CHANGED
|
@@ -21,6 +21,11 @@ const DEFAULT_QUERY_RESULT_TYPE = client_athena_1.QueryResultType.DATA_ROWS;
|
|
|
21
21
|
*
|
|
22
22
|
* Constructor `maxResults`, `queryResultType`, and optional `parseResultSetOptions` are applied on every
|
|
23
23
|
* `GetQueryResults` request and {@link AthenaQueryResultParser} invocation respectively.
|
|
24
|
+
* When `queryExecutionId` changes between fetches, the bundled parser is reset automatically.
|
|
25
|
+
*
|
|
26
|
+
* Does not wait for query completion or add Athena-specific retry: callers should wait until the execution
|
|
27
|
+
* succeeds (for example via `GetQueryExecution`) and configure SDK / application-level retry for throttling.
|
|
28
|
+
* AWS SDK errors from `GetQueryResults` are propagated as thrown.
|
|
24
29
|
*
|
|
25
30
|
* @see {@link https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/athena/command/GetQueryResultsCommand/ | GetQueryResultsCommand (AWS SDK)}
|
|
26
31
|
*/
|
|
@@ -43,6 +48,19 @@ class AthenaQueryResultPager {
|
|
|
43
48
|
* @throws {RangeError} When `maxResults` is not an integer in `1..1000` inclusive.
|
|
44
49
|
*/
|
|
45
50
|
constructor(client, options = {}) {
|
|
51
|
+
/**
|
|
52
|
+
* Resets the bundled parser when `queryExecutionId` differs from the previous fetch sequence.
|
|
53
|
+
*
|
|
54
|
+
* Same-execution pagination (with `nextToken`) keeps parser state so header-row handling stays correct.
|
|
55
|
+
*
|
|
56
|
+
* @param queryExecutionId - Athena query execution identifier for the upcoming fetch.
|
|
57
|
+
*/
|
|
58
|
+
this.ensureParserForExecution = (queryExecutionId) => {
|
|
59
|
+
if (this.activeQueryExecutionId !== undefined && this.activeQueryExecutionId !== queryExecutionId) {
|
|
60
|
+
this.parser.reset();
|
|
61
|
+
}
|
|
62
|
+
this.activeQueryExecutionId = queryExecutionId;
|
|
63
|
+
};
|
|
46
64
|
const maxResults = options.maxResults ?? DEFAULT_MAX_RESULTS;
|
|
47
65
|
if (!Number.isInteger(maxResults) || maxResults < MIN_MAX_RESULTS || maxResults > MAX_MAX_RESULTS) {
|
|
48
66
|
throw new RangeError(`options.maxResults must be an integer between ${MIN_MAX_RESULTS} and ${MAX_MAX_RESULTS}, got ${String(maxResults)}`);
|
|
@@ -59,6 +77,7 @@ class AthenaQueryResultPager {
|
|
|
59
77
|
* Retrieves a single results page as dictionary-shaped {@link ParsedRow} values.
|
|
60
78
|
*
|
|
61
79
|
* Uses {@link AthenaQueryResultParser.parseResultSet} on the AWS response.
|
|
80
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
62
81
|
*
|
|
63
82
|
* @param queryExecutionId - Athena query execution identifier.
|
|
64
83
|
* @param nextToken - Pass `undefined` first; subsequent calls use {@link PageResult.nextToken}.
|
|
@@ -69,6 +88,7 @@ class AthenaQueryResultPager {
|
|
|
69
88
|
if (queryExecutionId.trim() === '') {
|
|
70
89
|
throw new Error('queryExecutionId must be a non-empty string');
|
|
71
90
|
}
|
|
91
|
+
this.ensureParserForExecution(queryExecutionId);
|
|
72
92
|
const input = {
|
|
73
93
|
QueryExecutionId: queryExecutionId,
|
|
74
94
|
NextToken: nextToken,
|
|
@@ -87,6 +107,7 @@ class AthenaQueryResultPager {
|
|
|
87
107
|
* Retrieves one page and maps each {@link ParsedRow} through `rowParser`.
|
|
88
108
|
*
|
|
89
109
|
* Uses {@link AthenaQueryResultParser.parseResultSetWith} on the AWS response.
|
|
110
|
+
* When `queryExecutionId` differs from the previous fetch sequence, the bundled parser is reset first.
|
|
90
111
|
*
|
|
91
112
|
* @typeParam T - Output type produced by `rowParser`.
|
|
92
113
|
* @param queryExecutionId - Athena query execution identifier.
|
|
@@ -99,6 +120,7 @@ class AthenaQueryResultPager {
|
|
|
99
120
|
if (queryExecutionId.trim() === '') {
|
|
100
121
|
throw new Error('queryExecutionId must be a non-empty string');
|
|
101
122
|
}
|
|
123
|
+
this.ensureParserForExecution(queryExecutionId);
|
|
102
124
|
const input = {
|
|
103
125
|
QueryExecutionId: queryExecutionId,
|
|
104
126
|
NextToken: nextToken,
|
|
@@ -164,18 +186,21 @@ class AthenaQueryResultPager {
|
|
|
164
186
|
*
|
|
165
187
|
* Useful when {@link PagerOptions.parseResultSetOptions} uses `skipHeaderRow: 'auto'`.
|
|
166
188
|
*
|
|
167
|
-
* @returns The last {@link HeaderRowDecision}, or `null` before any parse
|
|
189
|
+
* @returns The last {@link HeaderRowDecision}, or `null` before any parse / after {@link AthenaQueryResultPager.reset}.
|
|
168
190
|
*/
|
|
169
191
|
getLastHeaderRowDecision() {
|
|
170
192
|
return this.parser.getLastHeaderRowDecision();
|
|
171
193
|
}
|
|
172
194
|
/**
|
|
173
|
-
* Clears the bundled {@link AthenaQueryResultParser} state
|
|
195
|
+
* Clears the bundled {@link AthenaQueryResultParser} state and the tracked active execution id.
|
|
174
196
|
*
|
|
175
|
-
*
|
|
197
|
+
* Usually unnecessary: {@link AthenaQueryResultPager.fetchPage} and {@link AthenaQueryResultPager.fetchPageWith}
|
|
198
|
+
* reset automatically when `queryExecutionId` changes. Call explicitly to clear state without starting a new fetch
|
|
199
|
+
* (for example so {@link AthenaQueryResultPager.getLastHeaderRowDecision} returns `null`).
|
|
176
200
|
*/
|
|
177
201
|
reset() {
|
|
178
202
|
this.parser.reset();
|
|
203
|
+
this.activeQueryExecutionId = undefined;
|
|
179
204
|
}
|
|
180
205
|
}
|
|
181
206
|
exports.AthenaQueryResultPager = AthenaQueryResultPager;
|
|
@@ -191,4 +216,4 @@ Object.defineProperty(exports, "rowToTypedObject", { enumerable: true, get: func
|
|
|
191
216
|
Object.defineProperty(exports, "toBoolean", { enumerable: true, get: function () { return athena_query_result_parser_2.toBoolean; } });
|
|
192
217
|
Object.defineProperty(exports, "toDate", { enumerable: true, get: function () { return athena_query_result_parser_2.toDate; } });
|
|
193
218
|
Object.defineProperty(exports, "toNumber", { enumerable: true, get: function () { return athena_query_result_parser_2.toNumber; } });
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMEM1RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQVdEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDbEcsTUFBTSxJQUFJLFVBQVUsQ0FDbEIsaURBQWlELGVBQWUsUUFBUSxlQUFlLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ3JILENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVU7WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSx5QkFBeUI7U0FDdEUsQ0FBQztRQUNGLElBQUksQ0FBQyxxQkFBcUIs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YUNsaWVudCwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCwgUXVlcnlSZXN1bHRUeXBlLCB0eXBlIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHtcbiAgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIsXG4gIHR5cGUgSGVhZGVyUm93RGVjaXNpb24sXG4gIHR5cGUgUGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICB0eXBlIFBhcnNlZFJvdyxcbiAgdHlwZSBSb3dQYXJzZXIsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcblxuLyoqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0IHJvd3MgcmVxdWVzdGVkIHBlciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0gQVBJIGNhbGwgKGBNYXhSZXN1bHRzYCkuICovXG5jb25zdCBERUZBVUxUX01BWF9SRVNVTFRTID0gMTAwMDtcbi8qKiBNaW5pbXVtIGBNYXhSZXN1bHRzYCB2YWx1ZSBhbGxvd2VkIGJ5IEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IE1JTl9NQVhfUkVTVUxUUyA9IDE7XG4vKiogTWF4aW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNQVhfTUFYX1JFU1VMVFMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCBgUXVlcnlSZXN1bHRUeXBlYCBmb3J3YXJkZWQgdG8gQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgREVGQVVMVF9RVUVSWV9SRVNVTFRfVFlQRSA9IFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1M7XG5cbi8qKlxuICogT25lIHBhZ2Ugb2YgQXRoZW5hIHF1ZXJ5IHJlc3VsdHMgcmV0dXJuZWQgYnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IGFmdGVyIGEgZmV0Y2ggb3IgZ2VuZXJhdG9yIHN0ZXAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gUm93IHJlcHJlc2VudGF0aW9uOyB1c2Uge0BsaW5rIFBhcnNlZFJvd30gb3IgYSB0eXBlIHByb2R1Y2VkIGJ5IHtAbGluayBSb3dQYXJzZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXN1bHQ8VD4ge1xuICAvKiogUGFyc2VkIHJvd3MgZm9yIHRoaXMgcGFnZSBvbmx5LiAqL1xuICByb3dzOiBUW107XG4gIC8qKiBDb250aW51YXRpb24gdG9rZW4gZm9yIHRoZSBmb2xsb3dpbmcgcGFnZSAoYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UpLiAqL1xuICBuZXh0VG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBTYW1lIGFzIGByb3dzLmxlbmd0aGAgZm9yIGNvbnZlbmllbmNlLiAqL1xuICByb3dDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGFwcGxpZWQgdG8gZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgaW52b2NhdGlvbiBtYWRlIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogYE1heFJlc3VsdHNgIHBlciByZXF1ZXN0IOKAlCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRocm91Z2ggMTAwMCAoQXRoZW5hIGxpbWl0cykuXG4gICAqIEBkZWZhdWx0VmFsdWUgMTAwMFxuICAgKi9cbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlfSDigJQgYW55IG1lbWJlciBvZiB0aGUgQVdTIFNESyBlbnVtXG4gICAqIChmb3IgZXhhbXBsZSB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfUk9XU30gZm9yIHRhYnVsYXIgcm93cyBvciB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlLkRBVEFfTUFOSUZFU1R9XG4gICAqIGZvciBDVEFTIC8gVU5MT0FEIC8gSU5TRVJUIG1hbmlmZXN0IG91dHB1dHMgd2hlbiBBdGhlbmEgc3VwcG9ydHMgdGhlbSkuXG4gICAqIEBkZWZhdWx0VmFsdWUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9XG4gICAqL1xuICBxdWVyeVJlc3VsdFR5cGU/OiBRdWVyeVJlc3VsdFR5cGU7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvcndhcmRlZCB0byBldmVyeSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXIucGFyc2VSZXN1bHRTZXR9IC9cbiAgICoge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gY2FsbCAoZm9yIGV4YW1wbGVcbiAgICogYGNvbHVtbkNvdW50TWlzbWF0Y2hCZWhhdmlvcmAsIGBza2lwSGVhZGVyUm93YCwgYGhlYWRlclJvd0RldGVjdGlvblN0cmF0ZWd5YCkuXG4gICAqXG4gICAqIEBzZWUgUGFyc2VSZXN1bHRTZXRPcHRpb25zXG4gICAqL1xuICBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFnaW5hdGVzIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYCAoQVdTIFNESyBmb3IgSmF2YVNjcmlwdCB2Myk6IHdhbGtzIGBOZXh0VG9rZW5gIGFuZCBwYXJzZXMgdGFidWxhciByb3dzIHdpdGhcbiAqIGBhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcmAgd2hlbiBuZWVkZWQuXG4gKlxuICogUHJvdmlkZXMgcGFpcmVkIEFQSXMgZm9yIHJhdyB7QGxpbmsgUGFyc2VkUm93fSBhY2Nlc3MgdmVyc3VzIGN1c3RvbSB7QGxpbmsgUm93UGFyc2VyfSBtYXBwaW5nIGF0IHRoZSBwYWdlIGxldmVsXG4gKiAoYGZldGNoUGFnZWAgLyBgZmV0Y2hQYWdlV2l0aGAsIGBpdGVyYXRlUGFnZXNgIC8gYGl0ZXJhdGVQYWdlc1dpdGhgKSBhbmQgYXQgdGhlIHJvdyBsZXZlbFxuICogKGBpdGVyYXRlUm93c2Agd2l0aCBvciB3aXRob3V0IGByb3dQYXJzZXJgKS5cbiAqXG4gKiBDb25zdHJ1Y3RvciBgbWF4UmVzdWx0c2AsIGBxdWVyeVJlc3VsdFR5cGVgLCBhbmQgb3B0aW9uYWwgYHBhcnNlUmVzdWx0U2V0T3B0aW9uc2AgYXJlIGFwcGxpZWQgb24gZXZlcnlcbiAqIGBHZXRRdWVyeVJlc3VsdHNgIHJlcXVlc3QgYW5kIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcn0gaW52b2NhdGlvbiByZXNwZWN0aXZlbHkuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9hdGhlbmEvY29tbWFuZC9HZXRRdWVyeVJlc3VsdHNDb21tYW5kLyB8IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQgKEFXUyBTREspfVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlSZXN1bHRQYWdlciB7XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbm90aGVyIHJlc3VsdHMgcGFnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzYW1lIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gUm93IHR5cGUgaGVsZCBpbiB7QGxpbmsgUGFnZVJlc3VsdC5yb3dzfS5cbiAgICogQHBhcmFtIHBhZ2VSZXN1bHQgLSBUaGUgbW9zdCByZWNlbnRseSByZXRyaWV2ZWQgcGFnZSBmcm9tIGBmZXRjaFBhZ2VgLCBgZmV0Y2hQYWdlV2l0aGAsIG9yIGEgcGFnZSBpdGVyYXRvci5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4ge0BsaW5rIFBhZ2VSZXN1bHQubmV4dFRva2VufSBpcyBkZWZpbmVkIGFuZCBhbm90aGVyIHBhZ2Ugc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgaGFzTmV4dFBhZ2U8VD4ocGFnZVJlc3VsdDogUGFnZVJlc3VsdDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlUmVzdWx0Lm5leHRUb2tlbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNESyB2MyBjbGllbnQgdXNlZCBmb3IgZXZlcnkgYEdldFF1ZXJ5UmVzdWx0c2AgY2FsbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudDtcbiAgLyoqIE5vcm1hbGl6ZWQgcGFnZXIgc2V0dGluZ3MgKGV2ZXJ5IGZpZWxkIHNldCBhZnRlciBtZXJnaW5nIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxQaWNrPFBhZ2VyT3B0aW9ucywgJ21heFJlc3VsdHMnIHwgJ3F1ZXJ5UmVzdWx0VHlwZSc+PjtcbiAgLyoqIFBhcnNlciBvcHRpb25zIGFwcGxpZWQgb24gZXZlcnkgcGFnZSBwYXJzZSAodW5kZWZpbmVkIHVzZXMgcGFyc2VyIGRlZmF1bHRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJzZVJlc3VsdFNldE9wdGlvbnM/OiBQYXJzZVJlc3VsdFNldE9wdGlvbnM7XG4gIC8qKiBTdGF0ZWZ1bCBwYXJzZXIgcmV1c2VkIGFjcm9zcyBjYWxsczsgcmVjcmVhdGVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS4gKi9cbiAgcHJpdmF0ZSBwYXJzZXI6IEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFnZXIgYm91bmQgdG8gYGNsaWVudGAgd2l0aCBvcHRpb25hbCBwZXItcmVxdWVzdCBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCAtIFNESyB2MyBgQXRoZW5hQ2xpZW50YCB1c2VkIHRvIGNhbGwgYEdldFF1ZXJ5UmVzdWx0c2AuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYE1heFJlc3VsdHNgLCBgUXVlcnlSZXN1bHRUeXBlYCwgYW5kIGBQYXJzZVJlc3VsdFNldE9wdGlvbnNgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMgPSBvcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNpbmdsZSByZXN1bHRzIHBhZ2UgYXMgZGljdGlvbmFyeS1zaGFwZWQge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBuZXh0VG9rZW4gLSBQYXNzIGB1bmRlZmluZWRgIGZpcnN0OyBzdWJzZXF1ZW50IGNhbGxzIHVzZSB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59LlxuICAgKiBAcmV0dXJucyBQYXJzZWQgcm93cyBwbHVzIHBhZ2luYXRpb24gbWV0YWRhdGEgZnJvbSB0aGlzIHJlc3BvbnNlIG9ubHkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBpcyBlbXB0eSBvciB3aGl0ZXNwYWNlIG9ubHkuXG4gICAqL1xuICBhc3luYyBmZXRjaFBhZ2UoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIG5leHRUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0KHJlc3BvbnNlLlJlc3VsdFNldCwgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLk5leHRUb2tlbixcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBvbmUgcGFnZSBhbmQgbWFwcyBlYWNoIHtAbGluayBQYXJzZWRSb3d9IHRocm91Z2ggYHJvd1BhcnNlcmAuXG4gICAqXG4gICAqIFVzZXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBkaWN0aW9uYXJ5IHJvdyBpbnRvIGBUYC5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogR2V0UXVlcnlSZXN1bHRzQ29tbWFuZElucHV0ID0ge1xuICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgTWF4UmVzdWx0czogdGhpcy5vcHRpb25zLm1heFJlc3VsdHMsXG4gICAgICBRdWVyeVJlc3VsdFR5cGU6IHRoaXMub3B0aW9ucy5xdWVyeVJlc3VsdFR5cGUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZChpbnB1dCkpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyc2VyLnBhcnNlUmVzdWx0U2V0V2l0aChcbiAgICAgIHJlc3BvbnNlLlJlc3VsdFNldCxcbiAgICAgIHJvd1BhcnNlcixcbiAgICAgIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93cyxcbiAgICAgIG5leHRUb2tlbjogcmVzcG9uc2UuTmV4dFRva2VuLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IHdhbGtzIGFsbCBwYWdlcyBmb3IgYW4gZXhlY3V0aW9uLCB5aWVsZGluZyBvbmUge0BsaW5rIFBhZ2VSZXN1bHR9IG9mIHtAbGluayBQYXJzZWRSb3d9IHBlciBzdGVwLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBPbmUgcGFnZSBhdCBhIHRpbWUgdW50aWwgQVdTIHJldHVybnMgbm8gYE5leHRUb2tlbmAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxQYXJzZWRSb3c+PiB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hQYWdlKHF1ZXJ5RXhlY3V0aW9uSWQsIG5leHRUb2tlbik7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1lIGFzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gYnV0IG1hcHMgZWFjaCByb3cgdGhyb3VnaCBgcm93UGFyc2VyYCBvbiBldmVyeSBwYWdlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBPdXRwdXQgdHlwZSBlbWl0dGVkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBTdWNjZXNzaXZlIHtAbGluayBQYWdlUmVzdWx0fSB2YWx1ZXMgd2hvc2UgYHJvd3NgIGFyZSB0eXBlZCBhcyBgVGAuXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVBhZ2VzV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2VXaXRoKHF1ZXJ5RXhlY3V0aW9uSWQsIHJvd1BhcnNlciwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gaW50byBpbmRpdmlkdWFsIHtAbGluayBQYXJzZWRSb3d9IHZhbHVlcyAob25lIHJvdyBwZXIgYG5leHQoKWApLlxuICAgKlxuICAgKiBPbmx5IG9uZSBwYWdlIG9mIHJvd3MgaXMgaGVsZCBpbiBtZW1vcnkgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHlpZWxkcyBFYWNoIGRpY3Rpb25hcnktc2hhcGVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93cyhcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdz47XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9IGludG8gaW5kaXZpZHVhbCBgVGAgdmFsdWVzIChvbmUgcm93IHBlciBgbmV4dCgpYCkuXG4gICAqXG4gICAqIE9ubHkgb25lIHBhZ2Ugb2Ygcm93cyBpcyBoZWxkIGluIG1lbW9yeSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIHByb2R1Y2VkIGJ5IGByb3dQYXJzZXJgLlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHJvd1BhcnNlciAtIENvbnZlcnRzIGVhY2ggcGFyc2VkIHJvdyBpbnRvIGBUYC5cbiAgICogQHlpZWxkcyBFYWNoIHRyYW5zZm9ybWVkIHJvdyBpbiBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBpdGVyYXRlUm93czxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFQ+O1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVSb3dzfSBvdmVybG9hZHMuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5pdGVyYXRlUGFnZXN9IHdoZW4gYHJvd1BhcnNlcmAgaXMgb21pdHRlZDsgb3RoZXJ3aXNlIHRvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc1dpdGh9LlxuICAgKi9cbiAgYXN5bmMgKml0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI/OiBSb3dQYXJzZXI8VD4sXG4gICk6IEFzeW5jR2VuZXJhdG9yPFBhcnNlZFJvdyB8IFQ+IHtcbiAgICBjb25zdCBwYWdlcyA9IHJvd1BhcnNlclxuICAgICAgPyB0aGlzLml0ZXJhdGVQYWdlc1dpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyKVxuICAgICAgOiB0aGlzLml0ZXJhdGVQYWdlcyhxdWVyeUV4ZWN1dGlvbklkKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZS5yb3dzKSB7XG4gICAgICAgIHlpZWxkIHJvdztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYnVuZGxlZCBwYXJzZXIncyBtb3N0IHJlY2VudCBoZWFkZXItcm93IGRlY2lzaW9uLlxuICAgKlxuICAgKiBVc2VmdWwgd2hlbiB7QGxpbmsgUGFnZXJPcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9uc30gdXNlcyBgc2tpcEhlYWRlclJvdzogJ2F1dG8nYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhc3Qge0BsaW5rIEhlYWRlclJvd0RlY2lzaW9ufSwgb3IgYG51bGxgIGJlZm9yZSBhbnkgcGFyc2Ugb24gdGhpcyBwYWdlci5cbiAgICovXG4gIGdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpOiBIZWFkZXJSb3dEZWNpc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1bmRsZWQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzdGF0ZSBzbyBoZWFkZXItcm93IGhhbmRsaW5nIGRvZXMgbm90IGxlYWsgYmV0d2VlbiBxdWVyaWVzLlxuICAgKlxuICAgKiBDYWxsIHdoZW4gcmV1c2luZyB0aGlzIHBhZ2VyIGZvciBhIGRpZmZlcmVudCBgcXVlcnlFeGVjdXRpb25JZGAgdGhhbiB0aGUgcHJldmlvdXMgcGFyc2Ugc2VxdWVuY2UuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlci5yZXNldCgpO1xuICB9XG59XG5cbi8qKiBSZS1leHBvcnRzIHtAbGluayBRdWVyeVJlc3VsdFR5cGV9IGZyb20gYEBhd3Mtc2RrL2NsaWVudC1hdGhlbmFgLiAqL1xuZXhwb3J0IHsgUXVlcnlSZXN1bHRUeXBlIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5leHBvcnQge1xuICBFWFRSQV9DT0xVTU5TX0tFWSxcbiAgaGVhZGVyc0Zyb21NZXRhLFxuICBpc0hlYWRlclJvdyxcbiAgcm93VG9PYmplY3QsXG4gIHJvd1RvVHlwZWRPYmplY3QsXG4gIHRvQm9vbGVhbixcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInO1xuZXhwb3J0IHR5cGUge1xuICBBdGhlbmFUeXBlZFZhbHVlLFxuICBDb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3IsXG4gIEhlYWRlclJvd0RlY2lzaW9uLFxuICBQYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gIFBhcnNlZFJvdyxcbiAgUm93UGFyc2VyLFxuICBUeXBlZFBhcnNlZFJvdyxcbn0gZnJvbSAnYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXInOyJdfQ==
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQWlJO0FBQ2pJLDJFQU1vQztBQUVwQyxrSEFBa0g7QUFDbEgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixzRUFBc0U7QUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBRTdCLHVFQUF1RTtBQUN2RSxNQUFNLHlCQUF5QixHQUFHLCtCQUFlLENBQUMsU0FBUyxDQUFDO0FBMEM1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLHNCQUFzQjtJQUVqQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFJLFVBQXlCO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQWFEOzs7Ozs7T0FNRztJQUNILFlBQVksTUFBb0IsRUFBRSxVQUF3QixFQUFFO1FBaUI1RDs7Ozs7O1dBTUc7UUFDYyw2QkFBd0IsR0FBRyxDQUFDLGdCQUF3QixFQUFRLEVBQUU7WUFDN0UsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBNUJBLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLGVBQWUsSUFBSSxVQUFVLEdBQUcsZUFBZSxFQUFF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QUNILEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBaFFELHdEQWdRQztBQUVELHdFQUF3RTtBQUN4RSx3REFBeUQ7QUFBaEQsZ0hBQUEsZUFBZSxPQUFBO0FBQ3hCLHlFQVNvQztBQVJsQywrSEFBQSxpQkFBaUIsT0FBQTtBQUNqQiw2SEFBQSxlQUFlLE9BQUE7QUFDZix5SEFBQSxXQUFXLE9BQUE7QUFDWCx5SEFBQSxXQUFXLE9BQUE7QUFDWCw4SEFBQSxnQkFBZ0IsT0FBQTtBQUNoQix1SEFBQSxTQUFTLE9BQUE7QUFDVCxvSEFBQSxNQUFNLE9BQUE7QUFDTixzSEFBQSxRQUFRLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdGhlbmFDbGllbnQsIEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQsIFF1ZXJ5UmVzdWx0VHlwZSwgdHlwZSBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcbmltcG9ydCB7XG4gIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLFxuICB0eXBlIEhlYWRlclJvd0RlY2lzaW9uLFxuICB0eXBlIFBhcnNlUmVzdWx0U2V0T3B0aW9ucyxcbiAgdHlwZSBQYXJzZWRSb3csXG4gIHR5cGUgUm93UGFyc2VyLFxufSBmcm9tICdhdGhlbmEtcXVlcnktcmVzdWx0LXBhcnNlcic7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdCByb3dzIHJlcXVlc3RlZCBwZXIge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXJ9IEFQSSBjYWxsIChgTWF4UmVzdWx0c2ApLiAqL1xuY29uc3QgREVGQVVMVF9NQVhfUkVTVUxUUyA9IDEwMDA7XG4vKiogTWluaW11bSBgTWF4UmVzdWx0c2AgdmFsdWUgYWxsb3dlZCBieSBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AuICovXG5jb25zdCBNSU5fTUFYX1JFU1VMVFMgPSAxO1xuLyoqIE1heGltdW0gYE1heFJlc3VsdHNgIHZhbHVlIGFsbG93ZWQgYnkgQXRoZW5hIGBHZXRRdWVyeVJlc3VsdHNgLiAqL1xuY29uc3QgTUFYX01BWF9SRVNVTFRTID0gMTAwMDtcblxuLyoqIERlZmF1bHQgYFF1ZXJ5UmVzdWx0VHlwZWAgZm9yd2FyZGVkIHRvIEF0aGVuYSBgR2V0UXVlcnlSZXN1bHRzYC4gKi9cbmNvbnN0IERFRkFVTFRfUVVFUllfUkVTVUxUX1RZUEUgPSBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTO1xuXG4vKipcbiAqIE9uZSBwYWdlIG9mIEF0aGVuYSBxdWVyeSByZXN1bHRzIHJldHVybmVkIGJ5IHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyfSBhZnRlciBhIGZldGNoIG9yIGdlbmVyYXRvciBzdGVwLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFJvdyByZXByZXNlbnRhdGlvbjsgdXNlIHtAbGluayBQYXJzZWRSb3d9IG9yIGEgdHlwZSBwcm9kdWNlZCBieSB7QGxpbmsgUm93UGFyc2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVzdWx0PFQ+IHtcbiAgLyoqIFBhcnNlZCByb3dzIGZvciB0aGlzIHBhZ2Ugb25seS4gKi9cbiAgcm93czogVFtdO1xuICAvKiogQ29udGludWF0aW9uIHRva2VuIGZvciB0aGUgZm9sbG93aW5nIHBhZ2UgKGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyB0aGUgbGFzdCBwYWdlKS4gKi9cbiAgbmV4dFRva2VuPzogc3RyaW5nO1xuICAvKiogU2FtZSBhcyBgcm93cy5sZW5ndGhgIGZvciBjb252ZW5pZW5jZS4gKi9cbiAgcm93Q291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBhcHBsaWVkIHRvIGV2ZXJ5IGBHZXRRdWVyeVJlc3VsdHNgIGludm9jYXRpb24gbWFkZSBieSB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIGBNYXhSZXN1bHRzYCBwZXIgcmVxdWVzdCDigJQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0aHJvdWdoIDEwMDAgKEF0aGVuYSBsaW1pdHMpLlxuICAgKiBAZGVmYXVsdFZhbHVlIDEwMDBcbiAgICovXG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2Age0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZX0g4oCUIGFueSBtZW1iZXIgb2YgdGhlIEFXUyBTREsgZW51bVxuICAgKiAoZm9yIGV4YW1wbGUge0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX1JPV1N9IGZvciB0YWJ1bGFyIHJvd3Mgb3Ige0BsaW5rIFF1ZXJ5UmVzdWx0VHlwZS5EQVRBX01BTklGRVNUfVxuICAgKiBmb3IgQ1RBUyAvIFVOTE9BRCAvIElOU0VSVCBtYW5pZmVzdCBvdXRwdXRzIHdoZW4gQXRoZW5hIHN1cHBvcnRzIHRoZW0pLlxuICAgKiBAZGVmYXVsdFZhbHVlIHtAbGluayBRdWVyeVJlc3VsdFR5cGUuREFUQV9ST1dTfVxuICAgKi9cbiAgcXVlcnlSZXN1bHRUeXBlPzogUXVlcnlSZXN1bHRUeXBlO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3J3YXJkZWQgdG8gZXZlcnkge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyLnBhcnNlUmVzdWx0U2V0fSAvXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGh9IGNhbGwgKGZvciBleGFtcGxlXG4gICAqIGBjb2x1bW5Db3VudE1pc21hdGNoQmVoYXZpb3JgLCBgc2tpcEhlYWRlclJvd2AsIGBoZWFkZXJSb3dEZXRlY3Rpb25TdHJhdGVneWApLlxuICAgKlxuICAgKiBAc2VlIFBhcnNlUmVzdWx0U2V0T3B0aW9uc1xuICAgKi9cbiAgcGFyc2VSZXN1bHRTZXRPcHRpb25zPzogUGFyc2VSZXN1bHRTZXRPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlcyBBdGhlbmEgYEdldFF1ZXJ5UmVzdWx0c2AgKEFXUyBTREsgZm9yIEphdmFTY3JpcHQgdjMpOiB3YWxrcyBgTmV4dFRva2VuYCBhbmQgcGFyc2VzIHRhYnVsYXIgcm93cyB3aXRoXG4gKiBgYXRoZW5hLXF1ZXJ5LXJlc3VsdC1wYXJzZXJgIHdoZW4gbmVlZGVkLlxuICpcbiAqIFByb3ZpZGVzIHBhaXJlZCBBUElzIGZvciByYXcge0BsaW5rIFBhcnNlZFJvd30gYWNjZXNzIHZlcnN1cyBjdXN0b20ge0BsaW5rIFJvd1BhcnNlcn0gbWFwcGluZyBhdCB0aGUgcGFnZSBsZXZlbFxuICogKGBmZXRjaFBhZ2VgIC8gYGZldGNoUGFnZVdpdGhgLCBgaXRlcmF0ZVBhZ2VzYCAvIGBpdGVyYXRlUGFnZXNXaXRoYCkgYW5kIGF0IHRoZSByb3cgbGV2ZWxcbiAqIChgaXRlcmF0ZVJvd3NgIHdpdGggb3Igd2l0aG91dCBgcm93UGFyc2VyYCkuXG4gKlxuICogQ29uc3RydWN0b3IgYG1heFJlc3VsdHNgLCBgcXVlcnlSZXN1bHRUeXBlYCwgYW5kIG9wdGlvbmFsIGBwYXJzZVJlc3VsdFNldE9wdGlvbnNgIGFyZSBhcHBsaWVkIG9uIGV2ZXJ5XG4gKiBgR2V0UXVlcnlSZXN1bHRzYCByZXF1ZXN0IGFuZCB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYXJzZXJ9IGludm9jYXRpb24gcmVzcGVjdGl2ZWx5LlxuICogV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgY2hhbmdlcyBiZXR3ZWVuIGZldGNoZXMsIHRoZSBidW5kbGVkIHBhcnNlciBpcyByZXNldCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIERvZXMgbm90IHdhaXQgZm9yIHF1ZXJ5IGNvbXBsZXRpb24gb3IgYWRkIEF0aGVuYS1zcGVjaWZpYyByZXRyeTogY2FsbGVycyBzaG91bGQgd2FpdCB1bnRpbCB0aGUgZXhlY3V0aW9uXG4gKiBzdWNjZWVkcyAoZm9yIGV4YW1wbGUgdmlhIGBHZXRRdWVyeUV4ZWN1dGlvbmApIGFuZCBjb25maWd1cmUgU0RLIC8gYXBwbGljYXRpb24tbGV2ZWwgcmV0cnkgZm9yIHRocm90dGxpbmcuXG4gKiBBV1MgU0RLIGVycm9ycyBmcm9tIGBHZXRRdWVyeVJlc3VsdHNgIGFyZSBwcm9wYWdhdGVkIGFzIHRocm93bi5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L2F0aGVuYS9jb21tYW5kL0dldFF1ZXJ5UmVzdWx0c0NvbW1hbmQvIHwgR2V0UXVlcnlSZXN1bHRzQ29tbWFuZCAoQVdTIFNESyl9XG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyIHtcblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIGFub3RoZXIgcmVzdWx0cyBwYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHNhbWUgcXVlcnkgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBSb3cgdHlwZSBoZWxkIGluIHtAbGluayBQYWdlUmVzdWx0LnJvd3N9LlxuICAgKiBAcGFyYW0gcGFnZVJlc3VsdCAtIFRoZSBtb3N0IHJlY2VudGx5IHJldHJpZXZlZCBwYWdlIGZyb20gYGZldGNoUGFnZWAsIGBmZXRjaFBhZ2VXaXRoYCwgb3IgYSBwYWdlIGl0ZXJhdG9yLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB7QGxpbmsgUGFnZVJlc3VsdC5uZXh0VG9rZW59IGlzIGRlZmluZWQgYW5kIGFub3RoZXIgcGFnZSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICovXG4gIHN0YXRpYyBoYXNOZXh0UGFnZTxUPihwYWdlUmVzdWx0OiBQYWdlUmVzdWx0PFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VSZXN1bHQubmV4dFRva2VuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogU0RLIHYzIGNsaWVudCB1c2VkIGZvciBldmVyeSBgR2V0UXVlcnlSZXN1bHRzYCBjYWxsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogQXRoZW5hQ2xpZW50O1xuICAvKiogTm9ybWFsaXplZCBwYWdlciBzZXR0aW5ncyAoZXZlcnkgZmllbGQgc2V0IGFmdGVyIG1lcmdpbmcgZGVmYXVsdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPFBpY2s8UGFnZXJPcHRpb25zLCAnbWF4UmVzdWx0cycgfCAncXVlcnlSZXN1bHRUeXBlJz4+O1xuICAvKiogUGFyc2VyIG9wdGlvbnMgYXBwbGllZCBvbiBldmVyeSBwYWdlIHBhcnNlICh1bmRlZmluZWQgdXNlcyBwYXJzZXIgZGVmYXVsdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnNlUmVzdWx0U2V0T3B0aW9ucz86IFBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgLyoqIFN0YXRlZnVsIHBhcnNlciByZXVzZWQgYWNyb3NzIHBhZ2VzIG9mIHRoZSBzYW1lIGV4ZWN1dGlvbjsgcmVzZXQgb24gZXhlY3V0aW9uIGNoYW5nZSBvciB7QGxpbmsgQXRoZW5hUXVlcnlSZXN1bHRQYWdlci5yZXNldH0uICovXG4gIHByaXZhdGUgcGFyc2VyOiBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcjtcbiAgLyoqIExhc3QgYHF1ZXJ5RXhlY3V0aW9uSWRgIHBhc3NlZCB0byBgZmV0Y2hQYWdlYCAvIGBmZXRjaFBhZ2VXaXRoYDsgdXNlZCB0byBhdXRvLXJlc2V0IHRoZSBwYXJzZXIuICovXG4gIHByaXZhdGUgYWN0aXZlUXVlcnlFeGVjdXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFnZXIgYm91bmQgdG8gYGNsaWVudGAgd2l0aCBvcHRpb25hbCBwZXItcmVxdWVzdCBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIGNsaWVudCAtIFNESyB2MyBgQXRoZW5hQ2xpZW50YCB1c2VkIHRvIGNhbGwgYEdldFF1ZXJ5UmVzdWx0c2AuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYE1heFJlc3VsdHNgLCBgUXVlcnlSZXN1bHRUeXBlYCwgYW5kIGBQYXJzZVJlc3VsdFNldE9wdGlvbnNgOyBkZWZhdWx0cyBhcHBseSB3aGVuIG9taXR0ZWQuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG1heFJlc3VsdHNgIGlzIG5vdCBhbiBpbnRlZ2VyIGluIGAxLi4xMDAwYCBpbmNsdXNpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEF0aGVuYUNsaWVudCwgb3B0aW9uczogUGFnZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzID8/IERFRkFVTFRfTUFYX1JFU1VMVFM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlc3VsdHMpIHx8IG1heFJlc3VsdHMgPCBNSU5fTUFYX1JFU1VMVFMgfHwgbWF4UmVzdWx0cyA+IE1BWF9NQVhfUkVTVUxUUykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBvcHRpb25zLm1heFJlc3VsdHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gJHtNSU5fTUFYX1JFU1VMVFN9IGFuZCAke01BWF9NQVhfUkVTVUxUU30sIGdvdCAke1N0cmluZyhtYXhSZXN1bHRzKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBtYXhSZXN1bHRzLFxuICAgICAgcXVlcnlSZXN1bHRUeXBlOiBvcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSA/PyBERUZBVUxUX1FVRVJZX1JFU1VMVF9UWVBFLFxuICAgIH07XG4gICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMgPSBvcHRpb25zLnBhcnNlUmVzdWx0U2V0T3B0aW9ucztcbiAgICB0aGlzLnBhcnNlciA9IG5ldyBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYnVuZGxlZCBwYXJzZXIgd2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBmZXRjaCBzZXF1ZW5jZS5cbiAgICpcbiAgICogU2FtZS1leGVjdXRpb24gcGFnaW5hdGlvbiAod2l0aCBgbmV4dFRva2VuYCkga2VlcHMgcGFyc2VyIHN0YXRlIHNvIGhlYWRlci1yb3cgaGFuZGxpbmcgc3RheXMgY29ycmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgLSBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSB1cGNvbWluZyBmZXRjaC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW5zdXJlUGFyc2VyRm9yRXhlY3V0aW9uID0gKHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZVF1ZXJ5RXhlY3V0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFjdGl2ZVF1ZXJ5RXhlY3V0aW9uSWQgIT09IHF1ZXJ5RXhlY3V0aW9uSWQpIHtcbiAgICAgIHRoaXMucGFyc2VyLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCA9IHF1ZXJ5RXhlY3V0aW9uSWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNpbmdsZSByZXN1bHRzIHBhZ2UgYXMgZGljdGlvbmFyeS1zaGFwZWQge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldH0gb24gdGhlIEFXUyByZXNwb25zZS5cbiAgICogV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBmZXRjaCBzZXF1ZW5jZSwgdGhlIGJ1bmRsZWQgcGFyc2VyIGlzIHJlc2V0IGZpcnN0LlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCAtIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFBhcnNlZCByb3dzIHBsdXMgcGFnaW5hdGlvbiBtZXRhZGF0YSBmcm9tIHRoaXMgcmVzcG9uc2Ugb25seS5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGlzIGVtcHR5IG9yIHdoaXRlc3BhY2Ugb25seS5cbiAgICovXG4gIGFzeW5jIGZldGNoUGFnZShcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8UGFyc2VkUm93Pj4ge1xuICAgIGlmIChxdWVyeUV4ZWN1dGlvbklkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncXVlcnlFeGVjdXRpb25JZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlUGFyc2VyRm9yRXhlY3V0aW9uKHF1ZXJ5RXhlY3V0aW9uSWQpO1xuXG4gICAgY29uc3QgaW5wdXQ6IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIFF1ZXJ5RXhlY3V0aW9uSWQ6IHF1ZXJ5RXhlY3V0aW9uSWQsXG4gICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIE1heFJlc3VsdHM6IHRoaXMub3B0aW9ucy5tYXhSZXN1bHRzLFxuICAgICAgUXVlcnlSZXN1bHRUeXBlOiB0aGlzLm9wdGlvbnMucXVlcnlSZXN1bHRUeXBlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldFF1ZXJ5UmVzdWx0c0NvbW1hbmQoaW5wdXQpKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnBhcnNlci5wYXJzZVJlc3VsdFNldChyZXNwb25zZS5SZXN1bHRTZXQsIHRoaXMucGFyc2VSZXN1bHRTZXRPcHRpb25zKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgb25lIHBhZ2UgYW5kIG1hcHMgZWFjaCB7QGxpbmsgUGFyc2VkUm93fSB0aHJvdWdoIGByb3dQYXJzZXJgLlxuICAgKlxuICAgKiBVc2VzIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhcnNlci5wYXJzZVJlc3VsdFNldFdpdGh9IG9uIHRoZSBBV1MgcmVzcG9uc2UuXG4gICAqIFdoZW4gYHF1ZXJ5RXhlY3V0aW9uSWRgIGRpZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgZmV0Y2ggc2VxdWVuY2UsIHRoZSBidW5kbGVkIHBhcnNlciBpcyByZXNldCBmaXJzdC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBkaWN0aW9uYXJ5IHJvdyBpbnRvIGBUYC5cbiAgICogQHBhcmFtIG5leHRUb2tlbiAtIFBhc3MgYHVuZGVmaW5lZGAgZmlyc3Q7IHN1YnNlcXVlbnQgY2FsbHMgdXNlIHtAbGluayBQYWdlUmVzdWx0Lm5leHRUb2tlbn0uXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHJvd3MgcGx1cyBwYWdpbmF0aW9uIG1ldGFkYXRhIGZyb20gdGhpcyByZXNwb25zZSBvbmx5LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgcXVlcnlFeGVjdXRpb25JZGAgaXMgZW1wdHkgb3Igd2hpdGVzcGFjZSBvbmx5LlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hQYWdlV2l0aDxUPihcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgcm93UGFyc2VyOiBSb3dQYXJzZXI8VD4sXG4gICAgbmV4dFRva2VuPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2VSZXN1bHQ8VD4+IHtcbiAgICBpZiAocXVlcnlFeGVjdXRpb25JZC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5RXhlY3V0aW9uSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuc3VyZVBhcnNlckZvckV4ZWN1dGlvbihxdWVyeUV4ZWN1dGlvbklkKTtcblxuICAgIGNvbnN0IGlucHV0OiBHZXRRdWVyeVJlc3VsdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgTmV4dFRva2VuOiBuZXh0VG9rZW4sXG4gICAgICBNYXhSZXN1bHRzOiB0aGlzLm9wdGlvbnMubWF4UmVzdWx0cyxcbiAgICAgIFF1ZXJ5UmVzdWx0VHlwZTogdGhpcy5vcHRpb25zLnF1ZXJ5UmVzdWx0VHlwZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeVJlc3VsdHNDb21tYW5kKGlucHV0KSk7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJzZXIucGFyc2VSZXN1bHRTZXRXaXRoKFxuICAgICAgcmVzcG9uc2UuUmVzdWx0U2V0LFxuICAgICAgcm93UGFyc2VyLFxuICAgICAgdGhpcy5wYXJzZVJlc3VsdFNldE9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICByb3dzLFxuICAgICAgbmV4dFRva2VuOiByZXNwb25zZS5OZXh0VG9rZW4sXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgd2Fsa3MgYWxsIHBhZ2VzIGZvciBhbiBleGVjdXRpb24sIHlpZWxkaW5nIG9uZSB7QGxpbmsgUGFnZVJlc3VsdH0gb2Yge0BsaW5rIFBhcnNlZFJvd30gcGVyIHN0ZXAuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAeWllbGRzIE9uZSBwYWdlIGF0IGEgdGltZSB1bnRpbCBBV1MgcmV0dXJucyBubyBgTmV4dFRva2VuYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXMoXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICApOiBBc3luY0dlbmVyYXRvcjxQYWdlUmVzdWx0PFBhcnNlZFJvdz4+IHtcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5mZXRjaFBhZ2UocXVlcnlFeGVjdXRpb25JZCwgbmV4dFRva2VuKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICBuZXh0VG9rZW4gPSBwYWdlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbWUgYXMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSBidXQgbWFwcyBlYWNoIHJvdyB0aHJvdWdoIGByb3dQYXJzZXJgIG9uIGV2ZXJ5IHBhZ2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIE91dHB1dCB0eXBlIGVtaXR0ZWQgaW4ge0BsaW5rIFBhZ2VSZXN1bHQucm93c30uXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIFN1Y2Nlc3NpdmUge0BsaW5rIFBhZ2VSZXN1bHR9IHZhbHVlcyB3aG9zZSBgcm93c2AgYXJlIHR5cGVkIGFzIGBUYC5cbiAgICovXG4gIGFzeW5jICppdGVyYXRlUGFnZXNXaXRoPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFnZVJlc3VsdDxUPj4ge1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmZldGNoUGFnZVdpdGgocXVlcnlFeGVjdXRpb25JZCwgcm93UGFyc2VyLCBuZXh0VG9rZW4pO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICAgIG5leHRUb2tlbiA9IHBhZ2UubmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbnMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzfSBpbnRvIGluZGl2aWR1YWwge0BsaW5rIFBhcnNlZFJvd30gdmFsdWVzIChvbmUgcm93IHBlciBgbmV4dCgpYCkuXG4gICAqXG4gICAqIE9ubHkgb25lIHBhZ2Ugb2Ygcm93cyBpcyBoZWxkIGluIG1lbW9yeSBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAeWllbGRzIEVhY2ggZGljdGlvbmFyeS1zaGFwZWQgcm93IGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIGl0ZXJhdGVSb3dzKFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFyc2VkUm93PjtcblxuICAvKipcbiAgICogRmxhdHRlbnMge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzV2l0aH0gaW50byBpbmRpdmlkdWFsIGBUYCB2YWx1ZXMgKG9uZSByb3cgcGVyIGBuZXh0KClgKS5cbiAgICpcbiAgICogT25seSBvbmUgcGFnZSBvZiByb3dzIGlzIGhlbGQgaW4gbWVtb3J5IGF0IGEgdGltZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gT3V0cHV0IHR5cGUgcHJvZHVjZWQgYnkgYHJvd1BhcnNlcmAuXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIC0gQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gcm93UGFyc2VyIC0gQ29udmVydHMgZWFjaCBwYXJzZWQgcm93IGludG8gYFRgLlxuICAgKiBAeWllbGRzIEVhY2ggdHJhbnNmb3JtZWQgcm93IGluIGV4ZWN1dGlvbiBvcmRlci5cbiAgICovXG4gIGl0ZXJhdGVSb3dzPFQ+KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICByb3dQYXJzZXI6IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8VD47XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVJvd3N9IG92ZXJsb2Fkcy5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLml0ZXJhdGVQYWdlc30gd2hlbiBgcm93UGFyc2VyYCBpcyBvbWl0dGVkOyBvdGhlcndpc2UgdG9cbiAgICoge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuaXRlcmF0ZVBhZ2VzV2l0aH0uXG4gICAqL1xuICBhc3luYyAqaXRlcmF0ZVJvd3M8VD4oXG4gICAgcXVlcnlFeGVjdXRpb25JZDogc3RyaW5nLFxuICAgIHJvd1BhcnNlcj86IFJvd1BhcnNlcjxUPixcbiAgKTogQXN5bmNHZW5lcmF0b3I8UGFyc2VkUm93IHwgVD4ge1xuICAgIGNvbnN0IHBhZ2VzID0gcm93UGFyc2VyXG4gICAgICA/IHRoaXMuaXRlcmF0ZVBhZ2VzV2l0aChxdWVyeUV4ZWN1dGlvbklkLCByb3dQYXJzZXIpXG4gICAgICA6IHRoaXMuaXRlcmF0ZVBhZ2VzKHF1ZXJ5RXhlY3V0aW9uSWQpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwYWdlLnJvd3MpIHtcbiAgICAgICAgeWllbGQgcm93O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBidW5kbGVkIHBhcnNlcidzIG1vc3QgcmVjZW50IGhlYWRlci1yb3cgZGVjaXNpb24uXG4gICAqXG4gICAqIFVzZWZ1bCB3aGVuIHtAbGluayBQYWdlck9wdGlvbnMucGFyc2VSZXN1bHRTZXRPcHRpb25zfSB1c2VzIGBza2lwSGVhZGVyUm93OiAnYXV0bydgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbGFzdCB7QGxpbmsgSGVhZGVyUm93RGVjaXNpb259LCBvciBgbnVsbGAgYmVmb3JlIGFueSBwYXJzZSAvIGFmdGVyIHtAbGluayBBdGhlbmFRdWVyeVJlc3VsdFBhZ2VyLnJlc2V0fS5cbiAgICovXG4gIGdldExhc3RIZWFkZXJSb3dEZWNpc2lvbigpOiBIZWFkZXJSb3dEZWNpc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5nZXRMYXN0SGVhZGVyUm93RGVjaXNpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGJ1bmRsZWQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFyc2VyfSBzdGF0ZSBhbmQgdGhlIHRyYWNrZWQgYWN0aXZlIGV4ZWN1dGlvbiBpZC5cbiAgICpcbiAgICogVXN1YWxseSB1bm5lY2Vzc2FyeToge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZmV0Y2hQYWdlfSBhbmQge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZmV0Y2hQYWdlV2l0aH1cbiAgICogcmVzZXQgYXV0b21hdGljYWxseSB3aGVuIGBxdWVyeUV4ZWN1dGlvbklkYCBjaGFuZ2VzLiBDYWxsIGV4cGxpY2l0bHkgdG8gY2xlYXIgc3RhdGUgd2l0aG91dCBzdGFydGluZyBhIG5ldyBmZXRjaFxuICAgKiAoZm9yIGV4YW1wbGUgc28ge0BsaW5rIEF0aGVuYVF1ZXJ5UmVzdWx0UGFnZXIuZ2V0TGFzdEhlYWRlclJvd0RlY2lzaW9ufSByZXR1cm5zIGBudWxsYCkuXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcnNlci5yZXNldCgpO1xuICAgIHRoaXMuYWN0aXZlUXVlcnlFeGVjdXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogUmUtZXhwb3J0cyB7QGxpbmsgUXVlcnlSZXN1bHRUeXBlfSBmcm9tIGBAYXdzLXNkay9jbGllbnQtYXRoZW5hYC4gKi9cbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0VHlwZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuZXhwb3J0IHtcbiAgRVhUUkFfQ09MVU1OU19LRVksXG4gIGhlYWRlcnNGcm9tTWV0YSxcbiAgaXNIZWFkZXJSb3csXG4gIHJvd1RvT2JqZWN0LFxuICByb3dUb1R5cGVkT2JqZWN0LFxuICB0b0Jvb2xlYW4sXG4gIHRvRGF0ZSxcbiAgdG9OdW1iZXIsXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJztcbmV4cG9ydCB0eXBlIHtcbiAgQXRoZW5hVHlwZWRWYWx1ZSxcbiAgQ29sdW1uQ291bnRNaXNtYXRjaEJlaGF2aW9yLFxuICBIZWFkZXJSb3dEZWNpc2lvbixcbiAgUGFyc2VSZXN1bHRTZXRPcHRpb25zLFxuICBQYXJzZWRSb3csXG4gIFJvd1BhcnNlcixcbiAgVHlwZWRQYXJzZWRSb3csXG59IGZyb20gJ2F0aGVuYS1xdWVyeS1yZXN1bHQtcGFyc2VyJzsiXX0=
|
package/package.json
CHANGED
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"projen": "^0.101.20",
|
|
48
48
|
"ts-jest": "^29.4.12",
|
|
49
49
|
"ts-node": "^10.9.2",
|
|
50
|
-
"typescript": "
|
|
50
|
+
"typescript": "6.0.x"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@aws-sdk/client-athena": "^3.983.0",
|
|
@@ -66,8 +66,7 @@
|
|
|
66
66
|
},
|
|
67
67
|
"devEngines": {
|
|
68
68
|
"packageManager": {
|
|
69
|
-
"name": "
|
|
70
|
-
"version": "1.22.22",
|
|
69
|
+
"name": "npm",
|
|
71
70
|
"onFail": "ignore"
|
|
72
71
|
}
|
|
73
72
|
},
|
|
@@ -76,7 +75,7 @@
|
|
|
76
75
|
"publishConfig": {
|
|
77
76
|
"access": "public"
|
|
78
77
|
},
|
|
79
|
-
"version": "0.
|
|
78
|
+
"version": "0.5.0",
|
|
80
79
|
"jest": {
|
|
81
80
|
"coverageProvider": "v8",
|
|
82
81
|
"testMatch": [
|