@centia-io/sdk 0.0.26 → 0.0.27
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 +288 -0
- package/build/{gc2-js-client.js → centia-io-sdk.js} +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# @centia-io/sdk
|
|
2
|
+
|
|
3
|
+
TypeScript/JavaScript client SDK for Centia GC2. It provides:
|
|
4
|
+
|
|
5
|
+
- Authentication helpers:
|
|
6
|
+
- CodeFlow (OAuth 2.0 Authorization Code + PKCE) for browser apps
|
|
7
|
+
- PasswordFlow for trusted/CLI/server environments
|
|
8
|
+
- Data access:
|
|
9
|
+
- Sql: Execute parameterized SQL
|
|
10
|
+
- Rpc: Call JSON-RPC methods
|
|
11
|
+
- createApi: A tiny type-safe helper that maps TypeScript interfaces to JSON‑RPC calls
|
|
12
|
+
|
|
13
|
+
This README focuses on CodeFlow, PasswordFlow, Sql, Rpc and Api.ts (createApi).
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
- npm: `npm install @centia-io/sdk`
|
|
18
|
+
- pnpm: `pnpm add @centia-io/sdk`
|
|
19
|
+
- yarn: `yarn add @centia-io/sdk`
|
|
20
|
+
|
|
21
|
+
Requirements:
|
|
22
|
+
- Browser or Node.js 18+ (for global `fetch`).
|
|
23
|
+
- An accessible GC2 host URL and client credentials.
|
|
24
|
+
|
|
25
|
+
ESM import:
|
|
26
|
+
```ts
|
|
27
|
+
import { CodeFlow, PasswordFlow, Sql, Rpc, createApi } from "@centia-io/sdk";
|
|
28
|
+
import type { RpcRequest, RpcResponse, PgTypes } from "@centia-io/sdk";
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Authentication
|
|
34
|
+
|
|
35
|
+
The SDK handles token storage and refresh for you.
|
|
36
|
+
- Tokens and minimal options are saved to `localStorage` in browsers. In non‑browser environments, an in‑memory store is used for the lifetime of the process.
|
|
37
|
+
- Authorization headers are added automatically for Sql/Rpc requests.
|
|
38
|
+
|
|
39
|
+
### CodeFlow (Browser, OAuth 2.0 Authorization Code + PKCE)
|
|
40
|
+
|
|
41
|
+
Use this flow in browser applications where you can redirect the user to the GC2 login page.
|
|
42
|
+
|
|
43
|
+
Required options:
|
|
44
|
+
- `host`: Base URL of your GC2 instance, e.g. `https://your.gc2.host`
|
|
45
|
+
- `clientId`: OAuth client id configured in GC2
|
|
46
|
+
- `redirectUri`: The URL in your app that handles the redirect back from GC2 (must be whitelisted)
|
|
47
|
+
- `scope` (optional): space‑separated scopes, e.g. `"openid profile"`
|
|
48
|
+
|
|
49
|
+
Example (vanilla JS/TS + SPA):
|
|
50
|
+
```ts
|
|
51
|
+
import { CodeFlow } from "@centia-io/sdk";
|
|
52
|
+
|
|
53
|
+
const codeFlow = new CodeFlow({
|
|
54
|
+
host: "https://your.gc2.host",
|
|
55
|
+
clientId: "your-client-id",
|
|
56
|
+
redirectUri: window.location.origin + "/auth/callback",
|
|
57
|
+
scope: "openid"
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// On app startup, call redirectHandle() once to complete a login redirect (if any)
|
|
61
|
+
codeFlow.redirectHandle().then((signedIn) => {
|
|
62
|
+
if (signedIn) {
|
|
63
|
+
console.log("User signed in");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Start sign-in when user clicks Login
|
|
68
|
+
function onLoginClick() {
|
|
69
|
+
codeFlow.signIn(); // Redirects to GC2 auth page
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Sign out (clears tokens/options and redirects to signout endpoint)
|
|
73
|
+
function onLogoutClick() {
|
|
74
|
+
codeFlow.signOut();
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Notes:
|
|
79
|
+
- `redirectHandle()` detects errors from the auth server, validates `state` (CSRF protection), exchanges the `code` for tokens, stores tokens and cleans up the URL.
|
|
80
|
+
- `signOut()` clears local tokens/options and redirects to the sign-out URL. If you only need to clear local state without redirect, call `codeFlow.clear()`.
|
|
81
|
+
|
|
82
|
+
### PasswordFlow (Trusted environments, CLI/Server)
|
|
83
|
+
|
|
84
|
+
Use only in trusted environments. The user’s database credentials are exchanged directly for tokens.
|
|
85
|
+
|
|
86
|
+
Required options:
|
|
87
|
+
- `host`
|
|
88
|
+
- `clientId`
|
|
89
|
+
- `username`
|
|
90
|
+
- `password`
|
|
91
|
+
- `database`
|
|
92
|
+
|
|
93
|
+
Example (Node.js):
|
|
94
|
+
```ts
|
|
95
|
+
import { PasswordFlow } from "@centia-io/sdk";
|
|
96
|
+
|
|
97
|
+
const flow = new PasswordFlow({
|
|
98
|
+
host: "http://localhost:8080",
|
|
99
|
+
clientId: "gc2-cli",
|
|
100
|
+
username: "mydb",
|
|
101
|
+
password: "secret",
|
|
102
|
+
database: "mydb"
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
await flow.signIn();
|
|
106
|
+
// Tokens are now stored; subsequent Sql/Rpc calls will include Authorization header.
|
|
107
|
+
|
|
108
|
+
// ... your code ...
|
|
109
|
+
|
|
110
|
+
flow.signOut(); // Clears tokens/options in local storage (no redirect)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## SQL
|
|
116
|
+
|
|
117
|
+
Execute parameterized SQL against GC2.
|
|
118
|
+
|
|
119
|
+
- Class: `new Sql()`
|
|
120
|
+
- Method: `exec(request: SqlRequest): Promise<SQLResponse>`
|
|
121
|
+
- Endpoint: `POST {host}/api/v4/sql`
|
|
122
|
+
|
|
123
|
+
Types (simplified):
|
|
124
|
+
- `SqlRequest` has:
|
|
125
|
+
- `q`: SQL string, you can use named placeholders like `:a` (server-side feature)
|
|
126
|
+
- `params?`: object with values for placeholders
|
|
127
|
+
- `type_hints?`: optional explicit type hints
|
|
128
|
+
- `type_formats?`: optional per-column format strings
|
|
129
|
+
- `SQLResponse` has:
|
|
130
|
+
- `schema`: a map of column name -> `{ type: string, array: boolean }`
|
|
131
|
+
- `data`: an array of rows (records)
|
|
132
|
+
|
|
133
|
+
Example:
|
|
134
|
+
```ts
|
|
135
|
+
import { Sql } from "@centia-io/sdk";
|
|
136
|
+
|
|
137
|
+
const sql = new Sql();
|
|
138
|
+
|
|
139
|
+
const payload = {
|
|
140
|
+
a: 1,
|
|
141
|
+
b: "hello",
|
|
142
|
+
c: "3.14", // numeric/decimal values are strings
|
|
143
|
+
d: ["x", "y"], // arrays are supported
|
|
144
|
+
e: { nested: [1,2] } // JSON
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const res = await sql.exec({
|
|
148
|
+
q: "select :a::int as a, :b::varchar as b, :c::numeric as c, :d::varchar[] as d, :e::jsonb as e",
|
|
149
|
+
params: payload
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
console.log(res.schema); // { a: {type: 'int4', array: false}, ... }
|
|
153
|
+
console.log(res.data); // [{ a: 1, b: 'hello', c: '3.14', d: ['x','y'], e: {nested:[1,2]} }]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Typing the rows:
|
|
157
|
+
```ts
|
|
158
|
+
import type { PgTypes } from "@centia-io/sdk";
|
|
159
|
+
|
|
160
|
+
interface Row extends PgTypes.DataRow {
|
|
161
|
+
a: number;
|
|
162
|
+
b: string;
|
|
163
|
+
c: PgTypes.NumericString;
|
|
164
|
+
d: PgTypes.PgArray<string>;
|
|
165
|
+
e: PgTypes.JsonValue;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// res: PgTypes.SQLResponse<Row>
|
|
169
|
+
const res = await sql.exec({ q: "...", params: payload }) as PgTypes.SQLResponse<Row>;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## RPC
|
|
175
|
+
|
|
176
|
+
Call JSON‑RPC methods exposed by GC2.
|
|
177
|
+
|
|
178
|
+
- Class: `new Rpc()`
|
|
179
|
+
- Method: `call(request: RpcRequest): Promise<RpcResponse>`
|
|
180
|
+
- Endpoint: `POST {host}/api/v4/call`
|
|
181
|
+
|
|
182
|
+
Types (simplified):
|
|
183
|
+
- `RpcRequest` has `jsonrpc: "2.0"`, `method`, optional `params`, optional `id`
|
|
184
|
+
- `RpcResponse` has `jsonrpc: "2.0"`, `id`, and `result` with `{ schema, data }`
|
|
185
|
+
|
|
186
|
+
Example:
|
|
187
|
+
```ts
|
|
188
|
+
import { Rpc } from "@centia-io/sdk";
|
|
189
|
+
|
|
190
|
+
const rpc = new Rpc();
|
|
191
|
+
|
|
192
|
+
const payload = { a: 1, b: "hello" };
|
|
193
|
+
|
|
194
|
+
const res = await rpc.call({
|
|
195
|
+
jsonrpc: "2.0",
|
|
196
|
+
method: "typeTest",
|
|
197
|
+
params: payload,
|
|
198
|
+
id: 1
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
console.log(res.result.schema);
|
|
202
|
+
console.log(res.result.data); // array of rows
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Typing the rows:
|
|
206
|
+
```ts
|
|
207
|
+
import type { PgTypes } from "@centia-io/sdk";
|
|
208
|
+
|
|
209
|
+
interface Row extends PgTypes.DataRow {
|
|
210
|
+
a: number;
|
|
211
|
+
b: string;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const res = await rpc.call({ jsonrpc: "2.0", method: "typeTest", params: payload }) as PgTypes.RpcResponse<Row>;
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## createApi (Api.ts)
|
|
220
|
+
|
|
221
|
+
A tiny helper that builds a Proxy around `Rpc` so you can call `api.someMethod(params)` directly, with TypeScript autocompletion and type‑checking based on your own interface.
|
|
222
|
+
|
|
223
|
+
Under the hood, each property access becomes a JSON‑RPC call with the property name as the method. The helper returns `result.data` (array of rows) from the RPC response.
|
|
224
|
+
|
|
225
|
+
Example with typing:
|
|
226
|
+
```ts
|
|
227
|
+
import { createApi } from "@centia-io/sdk";
|
|
228
|
+
import type { PgTypes } from "@centia-io/sdk";
|
|
229
|
+
|
|
230
|
+
// Define the shape of your RPC methods and return types
|
|
231
|
+
interface MyApi {
|
|
232
|
+
typeTest(params: {
|
|
233
|
+
a: number;
|
|
234
|
+
b: string;
|
|
235
|
+
c: PgTypes.NumericString;
|
|
236
|
+
d: PgTypes.PgArray<string>;
|
|
237
|
+
e: PgTypes.JsonValue;
|
|
238
|
+
}): Promise<Array<{
|
|
239
|
+
a: number;
|
|
240
|
+
b: string;
|
|
241
|
+
c: PgTypes.NumericString;
|
|
242
|
+
d: PgTypes.PgArray<string>;
|
|
243
|
+
e: PgTypes.JsonValue;
|
|
244
|
+
}>>;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const api = createApi<MyApi>();
|
|
248
|
+
|
|
249
|
+
const rows = await api.typeTest({
|
|
250
|
+
a: 1,
|
|
251
|
+
b: "hej",
|
|
252
|
+
c: "3.4",
|
|
253
|
+
d: ["ds", "sdsd"],
|
|
254
|
+
e: { zdsd: [2,3,4,5,6,7,8,9,10] }
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
console.log(rows); // typed row array
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Notes:
|
|
261
|
+
- `createApi<T>()` relies on naming conventions: the property name is the JSON‑RPC `method` name.
|
|
262
|
+
- Each call returns `result.data` from the RPC response (array of rows).
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Error handling
|
|
267
|
+
|
|
268
|
+
- Network/HTTP errors: thrown as `Error` with the status/body text when available.
|
|
269
|
+
- Auth errors: the SDK auto‑refreshes access tokens when possible. If the refresh token is expired or missing, you’ll get an error and should re‑authenticate.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Environment details
|
|
274
|
+
|
|
275
|
+
- Storage: tokens/options stored in `localStorage` when available; otherwise a global in‑memory store is used (`globalThis.__gc2_memory_storage`).
|
|
276
|
+
- Fetch: Node.js 18+ recommended (includes native `fetch`). For older Node versions, add a Fetch polyfill.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Examples
|
|
281
|
+
|
|
282
|
+
See the `examples/` folder for runnable snippets showing PasswordFlow + Sql/Rpc and browser CodeFlow usage.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## License
|
|
287
|
+
|
|
288
|
+
AGPL-3.0
|
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
* @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3
|
|
10
10
|
*
|
|
11
11
|
*/const d=async(s,e,t,o,r="application/json")=>{const n=b(),i=await L(r);let c={method:t,headers:i,redirect:"manual"};return o&&(c.body=r==="application/json"?JSON.stringify(o):o),await fetch(n.host+`/api/v${s}/${e}`,c)},u=async(s,e)=>{let t=null,o="";try{o=await s.text()}catch{}if(o)try{t=JSON.parse(o)}catch{}if(s.status!==e){const r=t&&(t.message||t.error)||o||`Unexpected status ${s.status}`;throw new Error(r)}return t};class N{async exec(e){const t=await d("4","sql","POST",e);return await u(t,200)}}class v{async call(e){const t=await d("4","call","POST",e);return await u(t,200)}}class J{async query(e){const t=await d("3",`meta/${e}`,"GET",null);return await u(t,200)}}class z{isAuth(){const e=w();return!(!e.accessToken&&!e.refreshToken)}getTokens(){return w()}}class D{get(){const e=w().accessToken;return q(e)}}class V{async get(e){const t=await d("4",`users/${e}`,"GET",null);return await u(t,200)}}class W{constructor(e){this.options=e}connect(){const e=this,{accessToken:t}=w(),o=()=>{const r=new WebSocket(this.options.host+"/?token="+t);r.onopen=function(){console.log("WebSocket connected!")},r.onmessage=function(n){var i;(i=e.options)==null||i.callBack(n.data)},r.onclose=function(n){t!==""&&(console.log("WebSocket closed, reconnecting in 3 seconds...",n.reason),setTimeout(o,3e3))},r.onerror=function(n){console.error("WebSocket error observed:",n),r.close()}};t!==""&&o()}}class G{async get(){const e=await d("4","stats","GET",null);return await u(e,200)}}class x{async get(e,t){const o=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"GET",null);return await u(o,200)}async create(e,t,o){const r=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"POST",o);return await u(r,200)}async patch(e,t,o){const r=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"PATCH",o);return await u(r,200)}async delete(e,t){const o=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"DELETE",null);return await u(o,204)}}async function H(s,e){const t=new v,o={jsonrpc:"2.0",method:s,id:1,params:e};return(await t.call(o)).result.data}function M(){return new Proxy({},{get(s,e){if(typeof e=="string")return(...t)=>H(e,...t)}})}a.Claims=D,a.CodeFlow=F,a.Meta=J,a.PasswordFlow=j,a.Rpc=v,a.Sql=N,a.Stats=G,a.Status=z,a.Tables=x,a.Users=V,a.Ws=W,a.createApi=M,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
|
12
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MyLWpzLWNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWwvand0LWRlY29kZS50cyIsIi4uL3NyYy91dGlsL3N0b3JhZ2UudHMiLCIuLi9zcmMvdXRpbC91dGlscy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9nYzIuc2VydmljZXMudHMiLCIuLi9zcmMvQ29kZUZsb3cudHMiLCIuLi9zcmMvUGFzc3dvcmRGbG93LnRzIiwiLi4vc3JjL3V0aWwvcmVxdWVzdC1oZWFkZXJzLnRzIiwiLi4vc3JjL3V0aWwvbWFrZS1yZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWwvZ2V0LXJlc3BvbnNlLnRzIiwiLi4vc3JjL1NxbC50cyIsIi4uL3NyYy9ScGMudHMiLCIuLi9zcmMvTWV0YS50cyIsIi4uL3NyYy9TdGF0dXMudHMiLCIuLi9zcmMvQ2xhaW1zLnRzIiwiLi4vc3JjL1VzZXJzLnRzIiwiLi4vc3JjL1dzLnRzIiwiLi4vc3JjL1N0YXRzLnRzIiwiLi4vc3JjL1RhYmxlcy50cyIsIi4uL3NyYy9BcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQXV0aDAsIEluYy4gPHN1cHBvcnRAYXV0aDAuY29tPiAoaHR0cDovL2F1dGgwLmNvbSlcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0RGVjb2RlT3B0aW9ucyB7XHJcbiAgICBoZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEp3dEhlYWRlciB7XHJcbiAgICB0eXA/OiBzdHJpbmc7XHJcbiAgICBhbGc/OiBzdHJpbmc7XHJcbiAgICBraWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XHJcbiAgICBpc3M/OiBzdHJpbmc7XHJcbiAgICBzdWI/OiBzdHJpbmc7XHJcbiAgICBhdWQ/OiBzdHJpbmdbXSB8IHN0cmluZztcclxuICAgIGV4cD86IG51bWJlcjtcclxuICAgIG5iZj86IG51bWJlcjtcclxuICAgIGlhdD86IG51bWJlcjtcclxuICAgIGp0aT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cclxuXHJcbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xyXG5cclxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICBhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XHJcbiAgICAgICAgfSksXHJcbiAgICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyOiBzdHJpbmcpIHtcclxuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XHJcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0SGVhZGVyPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBKd3REZWNvZGVPcHRpb25zICYgeyBoZWFkZXI6IHRydWUgfSxcclxuKTogVDtcclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IEp3dERlY29kZU9wdGlvbnMpOiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlPFQgPSBKd3RIZWFkZXIgfCBKd3RQYXlsb2FkPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zPzogSnd0RGVjb2RlT3B0aW9ucyxcclxuKTogVCB7XHJcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3B0aW9ucyB8fD0ge307XHJcblxyXG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcclxuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGVjb2RlZDogc3RyaW5nO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcclxuICAgICAgICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCkgYXMgVDtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXHJcbiAgICAgICAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlTGlrZSB7XHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGxcclxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZFxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkXHJcbn1cclxuXHJcbmNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlTGlrZSB7XHJcbiAgcHJpdmF0ZSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcclxuXHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGtleSkgPyB0aGlzLnN0b3JlLmdldChrZXkpISA6IG51bGxcclxuICB9XHJcblxyXG4gIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuc2V0KGtleSwgU3RyaW5nKHZhbHVlKSlcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSlcclxuICB9XHJcbn1cclxuXHJcbmxldCBjYWNoZWQ6IFN0b3JhZ2VMaWtlIHwgbnVsbCA9IG51bGxcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKCk6IFN0b3JhZ2VMaWtlIHtcclxuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGc6IGFueSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IChnbG9iYWxUaGlzIGFzIGFueSkgOiAod2luZG93IGFzIGFueSlcclxuICAgIGlmIChnICYmIGcubG9jYWxTdG9yYWdlICYmIHR5cGVvZiBnLmxvY2FsU3RvcmFnZS5nZXRJdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNhY2hlZCA9IGcubG9jYWxTdG9yYWdlIGFzIFN0b3JhZ2VMaWtlXHJcbiAgICAgIHJldHVybiBjYWNoZWRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmUgYW5kIGZhbGwgYmFjayB0byBtZW1vcnkgc3RvcmFnZVxyXG4gIH1cclxuICBjb25zdCBnOiBhbnkgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpIDoge31cclxuICBpZiAoIWcuX19nYzJfbWVtb3J5X3N0b3JhZ2UpIHtcclxuICAgIGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZSgpXHJcbiAgfVxyXG4gIGNhY2hlZCA9IGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgYXMgU3RvcmFnZUxpa2VcclxuICByZXR1cm4gY2FjaGVkXHJcbn1cclxuIiwiaW1wb3J0IHtqd3REZWNvZGV9IGZyb20gJy4vand0LWRlY29kZSdcclxuaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvZ2MyLnNlcnZpY2VzXCI7XHJcbmltcG9ydCB7Z2V0U3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IHR5cGUgVG9rZW5zID0ge1xyXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gICAgaWRUb2tlbj86IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XHJcbiAgICBob3N0OiBzdHJpbmc7XHJcbiAgICB3c0hvc3Q/OiBzdHJpbmc7XHJcbiAgICB0b2tlblVyaT86IHN0cmluZztcclxuICAgIGF1dGhVcmk/OiBzdHJpbmc7XHJcbiAgICBsb2dvdXRVcmk/OiBzdHJpbmc7XHJcbiAgICBkZXZpY2VVcmk/OiBzdHJpbmc7XHJcbiAgICBzY29wZT86IHN0cmluZztcclxuICAgIGNsaWVudElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENvZGVGbG93T3B0aW9ucyA9IE9wdGlvbnMgJiB7XHJcbiAgICByZWRpcmVjdFVyaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXNzd29yZEZsb3dPcHRpb25zID0gT3B0aW9ucyAmIHtcclxuICAgIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgZGF0YWJhc2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgV3NPcHRpb25zID0ge1xyXG4gICAgaG9zdDogc3RyaW5nO1xyXG4gICAgY2FsbEJhY2s/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdldERldmljZUNvZGVSZXNwb25zZSA9IHtcclxuICAgIGRldmljZV9jb2RlOiBzdHJpbmc7XHJcbiAgICB1c2VyX2NvZGU6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmk6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmlfY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICBpbnRlcnZhbDogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR2V0VG9rZW5SZXNwb25zZSA9IHtcclxuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xyXG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xyXG4gICAgcmVmcmVzaF9leHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBpZF90b2tlbj86IHN0cmluZztcclxuICAgIHRva2VuX3R5cGU6IHN0cmluZztcclxuICAgICdub3QtYmVmb3JlLXBvbGljeSc6IG51bWJlcjtcclxuICAgIHNlc3Npb25fc3RhdGU6IHN0cmluZztcclxuICAgIHNjb3BlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSA9IGFzeW5jICgpID0+IHtcclxuXHJcbiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbVN0cmluZyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgyOCk7XHJcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYyA9PiAoJzAnICsgZGVjLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSkuam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hhMjU2ID0gKHBsYWluOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKHBsYWluKTtcclxuICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlNjR1cmxFbmNvZGUgPSAoc3RyOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsuLi5uZXcgVWludDhBcnJheShzdHIpXSkpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcGtjZUNoYWxsZW5nZUZyb21WZXJpZmllcih2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodik7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NHVybEVuY29kZShoYXNoZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyfSA9IHtcclxuICAgICAgICBzdGF0ZTogZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSxcclxuICAgICAgICBjb2RlVmVyaWZpZXI6IGdlbmVyYXRlUmFuZG9tU3RyaW5nKCksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IHBrY2VDaGFsbGVuZ2VGcm9tVmVyaWZpZXIoY29kZVZlcmlmaWVyKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXRlLFxyXG4gICAgICAgIGNvZGVWZXJpZmllcixcclxuICAgICAgICBjb2RlQ2hhbGxlbmdlLFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNUb2tlbkV4cGlyZWQgPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzSnd0RXhwaXJlZCA9IGZhbHNlXHJcbiAgICBjb25zdCB7ZXhwfSA9IGp3dERlY29kZSh0b2tlbilcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwXHJcblxyXG4gICAgaWYgKGV4cCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA+IGV4cCkgaXNKd3RFeHBpcmVkID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSnd0RXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2xhaW1zID0gKHRva2VuOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgcmV0dXJuIGp3dERlY29kZSh0b2tlbilcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhc3N3b3JkSXNTdHJvbmdFbm91Z2ggPSAocGFzc3dvcmQ6IHN0cmluZywgYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnRW50ZXJlZCBwYXNzd29yZCBpcyB0b28gd2VhaydcclxuICAgIGlmIChwYXNzd29yZCA9PT0gJycgJiYgYWxsb3dOdWxsKSByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDgpIHJldHVybiBtZXNzYWdlXHJcbiAgICBpZiAoISgvW0EtWl0vLnRlc3QocGFzc3dvcmQpKSkgcmV0dXJuIG1lc3NhZ2VcclxuICAgIGlmICghKC9bYS16XS8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgaWYgKCEoL1xcZC8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzTG9naW4gPSBhc3luYyAoZ2MyOiBHYzJTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICBjb25zdCB7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbiAmJiAhcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8IChhY2Nlc3NUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChhY2Nlc3NUb2tlbikpKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChyZWZyZXNoVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9naW4gYWdhaW4uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdjMi5nZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKVxyXG4gICAgICAgICAgICAgICAgc2V0VG9rZW5zKHthY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbiwgaWRUb2tlbjogZGF0YT8uaWRfdG9rZW59KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgcmVmcmVzaCB0b2tlbi4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldFRva2VucyA9ICh0b2tlbnM6IFRva2Vucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl90b2tlbnMnLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAnYWNjZXNzVG9rZW4nOiB0b2tlbnMuYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAncmVmcmVzaFRva2VuJzogdG9rZW5zLnJlZnJlc2hUb2tlbixcclxuICAgICAgICAgICAgICAgICdpZFRva2VuJzogdG9rZW5zPy5pZFRva2VuIHx8ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUb2tlbnMgPSAoKTogVG9rZW5zID0+IHtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nIHwgbnVsbCA9IGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdnYzJfdG9rZW5zJylcclxuICAgIGNvbnN0IHRva2VuczogYW55ID0gc3RyID8gSlNPTi5wYXJzZShzdHIpIDoge31cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucz8uYWNjZXNzVG9rZW4gfHwgJycsXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnM/LnJlZnJlc2hUb2tlbiB8fCAnJyxcclxuICAgICAgICBpZFRva2VuOiB0b2tlbnM/LmlkVG9rZW4gfHwgJycsXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gKG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl9vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgJ2NsaWVudElkJzogb3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICdob3N0Jzogb3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgJ3JlZGlyZWN0VXJpJzogb3B0aW9ucy5yZWRpcmVjdFVyaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3B0aW9ucyA9ICgpOiBDb2RlRmxvd09wdGlvbnMgPT4ge1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgfCBudWxsID0gZ2V0U3RvcmFnZSgpLmdldEl0ZW0oJ2djMl9vcHRpb25zJylcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHN0ciA/IEpTT04ucGFyc2Uoc3RyKSA6IHt9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsaWVudElkOiBvcHRpb25zPy5jbGllbnRJZCB8fCAnJyxcclxuICAgICAgICBob3N0OiBvcHRpb25zPy5ob3N0IHx8ICcnLFxyXG4gICAgICAgIHJlZGlyZWN0VXJpOiBvcHRpb25zPy5yZWRpcmVjdFVyaSB8fCAnJyxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZVN0cmluZyA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICByZXR1cm4gYnRvYShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKS5yZWR1Y2UoKGFjYywgYnl0ZSkgPT4gYWNjICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gICAgICAgIC5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhclRva2VucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfdG9rZW5zJylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFyT3B0aW9ucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfb3B0aW9ucycpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXROb25jZSA9ICgpOiBzdHJpbmd8bnVsbCA9PiB7XHJcbiAgICByZXR1cm4gPHN0cmluZz5nZXRTdG9yYWdlKCkuZ2V0SXRlbSgnZ2MyX25vbmNlJylcclxufVxyXG5leHBvcnQgY29uc3QgY2xlYXJOb25jZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfbm9uY2UnKVxyXG59XHJcblxyXG4iLCJpbXBvcnQge0NvZGVGbG93T3B0aW9ucywgR2V0RGV2aWNlQ29kZVJlc3BvbnNlLCBnZXROb25jZSwgR2V0VG9rZW5SZXNwb25zZSwgUGFzc3dvcmRGbG93T3B0aW9uc30gZnJvbSAnLi4vdXRpbC91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2MyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyB8IFBhc3N3b3JkRmxvd09wdGlvbnM7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHlwZSBndWFyZHMgdG8gY2hlY2sgaWYgb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMgb3IgUGFzc3dvcmRGbG93T3B0aW9uc1xyXG4gICAgcHJpdmF0ZSBpc0NvZGVGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiAncmVkaXJlY3RVcmknIGluIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUGFzc3dvcmRGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBQYXNzd29yZEZsb3dPcHRpb25zIHtcclxuICAgICAgICByZXR1cm4gJ3VzZXJuYW1lJyBpbiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5ob3N0fSR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID0gJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7J0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlfTtcclxuICAgICAgICBsZXQgcGF5bG9hZDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xyXG4gICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYm9keSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgYm9keTogcGF5bG9hZCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2VyclRleHR9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldERldmljZUNvZGUoKTogUHJvbWlzZTxHZXREZXZpY2VDb2RlUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLmRldmljZVVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aC9kZXZpY2VgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodGhpcy5idWlsZFVybChwYXRoKSwgJ1BPU1QnLCB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHBvbGxUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLnRva2VuVXJpID8/IGAke3RoaXMuaG9zdH0vYXBpL3Y0L29hdXRoYDtcclxuICAgICAgICBjb25zdCBnZXRUb2tlbiA9IGFzeW5jICgpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2UgfCBudWxsIHwgc3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRVcmwocGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jb2RlOiBkZXZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnZGV2aWNlX2NvZGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gSlNPTi5wYXJzZShlLm1lc3NhZ2Uuc3BsaXQoJzogJylbMV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciA9PT0gJ2F1dGhvcml6YXRpb25fcGVuZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJyb3JfZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBnZXRUb2tlbigpO1xyXG4gICAgICAgIHdoaWxlIChyZXNwb25zZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwgKiAxMTAwKSk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZ2V0VG9rZW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLm9wdGlvbnMuYXV0aFVyaSA/PyBgJHt0aGlzLmhvc3R9L2F1dGgvYFxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxyXG4gICAgICAgIC8vIEdldCBub25jZSBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBnZXROb25jZSgpXHJcbiAgICAgICAgLy8gQWRkIHBhcmFtZXRlcnMgY29uZGl0aW9uYWxseVxyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsIHRoaXMub3B0aW9ucy5jbGllbnRJZCk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3N0YXRlJywgc3RhdGUpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgY29kZUNoYWxsZW5nZSk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgnY29kZV9jaGFsbGVuZ2VfbWV0aG9kJywgJ1MyNTYnKTtcclxuICAgICAgICBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnbm9uY2UnLCBub25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9ubHkgYWRkIHNjb3BlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NvcGUpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnc2NvcGUnLCB0aGlzLm9wdGlvbnMuc2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7YmFzZX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Db2RlVG9rZW4oXHJcbiAgICAgICAgY29kZTogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgICAgICAgY29kZVZlcmlmaWVyOiBzdHJpbmcgfCBudWxsXHJcbiAgICApOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmkgPSB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVGbG93IG9wdGlvbnMgcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcclxuICAgICAgICAgICAgICAgIGNvZGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQYXNzd29yZFRva2VuKCk6IFByb21pc2U8R2V0VG9rZW5SZXNwb25zZT4ge1xyXG4gICAgICAgIGxldCB1c2VybmFtZSwgcGFzc3dvcmQsIGRhdGFiYXNlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXNzd29yZEZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLm9wdGlvbnMudXNlcm5hbWVcclxuICAgICAgICAgICAgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucGFzc3dvcmRcclxuICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3N3b3JkRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgZGF0YWJhc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFJlZnJlc2hUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHZXRUb2tlblJlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduT3V0VVJMKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmdcclxuICAgICAgICBpZiAodGhpcy5pc0NvZGVGbG93T3B0aW9ucyh0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xyXG4gICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nb3V0VXJpID8/IGAke3RoaXMuaG9zdH0vc2lnbm91dD8ke3BhcmFtcy50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL2djMi5zZXJ2aWNlcydcclxuaW1wb3J0IHtnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UsIGlzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5pbXBvcnQge0NvZGVGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9uc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5pbXBvcnQge2dldFN0b3JhZ2V9IGZyb20gJy4vdXRpbC9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29kZUZsb3cge1xyXG4gICAgb3B0aW9uczogQ29kZUZsb3dPcHRpb25zXHJcbiAgICBzZXJ2aWNlOiBHYzJTZXJ2aWNlXHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29kZUZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZGlyZWN0SGFuZGxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaFxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwpXHJcblxyXG4gICAgICAgIGNvbnN0IGVycm9yID0gcXVlcnlQYXJhbXMuZ2V0KCdlcnJvcicpXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZGlyZWN0OiAke3VybH1gKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29kZSA9IHF1ZXJ5UGFyYW1zLmdldCgnY29kZScpXHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBxdWVyeVBhcmFtcy5nZXQoJ3N0YXRlJylcclxuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBnZXRTdG9yYWdlKCkuZ2V0SXRlbSgnc3RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3NzaWJsZSBDU1JGIGF0dGFjay4gQWJvcnRpbmcgbG9naW4hJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBdXRob3JpemF0aW9uQ29kZVRva2VuKGNvZGUsIGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdjb2RlVmVyaWZpZXInKSlcclxuICAgICAgICAgICAgICAgIHNldFRva2Vucyh7YWNjZXNzVG9rZW46IGFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuOiByZWZyZXNoX3Rva2VuLCBpZFRva2VuOiBpZF90b2tlbn0pXHJcbiAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHtcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKCkucmVtb3ZlSXRlbSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgZ2V0U3RvcmFnZSgpLnJlbW92ZUl0ZW0oJ2NvZGVWZXJpZmllcicpXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIGFuZCBjb2RlIGZyb20gdGhlIHJlZGlyZWN0IHVybFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5kZWxldGUoJ2NvZGUnKVxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmRlbGV0ZSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBsb2Mub3JpZ2luICsgbG9jLnBhdGhuYW1lICsgKHBhcmFtcy5zaXplID4gMCA/ICc/JyArIHBhcmFtcy50b1N0cmluZygpIDogJycpXHJcbiAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCAnJywgbmV3VXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGlzTG9naW4odGhpcy5zZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2lnbkluKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlfSA9IGF3YWl0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSgpXHJcbiAgICAgICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oXCJzdGF0ZVwiLCBzdGF0ZSlcclxuICAgICAgICBnZXRTdG9yYWdlKCkuc2V0SXRlbShcImNvZGVWZXJpZmllclwiLCBjb2RlVmVyaWZpZXIpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoXHJcbiAgICAgICAgICAgIGNvZGVDaGFsbGVuZ2UsXHJcbiAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpZ25PdXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRTaWduT3V0VVJMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICBjbGVhck9wdGlvbnMoKVxyXG4gICAgICAgIGNsZWFyTm9uY2UoKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7R2MyU2VydmljZSx9IGZyb20gJy4vc2VydmljZXMvZ2MyLnNlcnZpY2VzJ1xyXG5pbXBvcnQge2lzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgUGFzc3dvcmRGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFzc3dvcmRGbG93IHtcclxuICAgIG9wdGlvbnM6IFBhc3N3b3JkRmxvd09wdGlvbnNcclxuICAgIHNlcnZpY2U6IEdjMlNlcnZpY2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNpZ25JbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRQYXNzd29yZFRva2VuKClcclxuICAgICAgICBzZXRUb2tlbnMoe2FjY2Vzc1Rva2VuOiBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbn0pXHJcbiAgICAgICAgc2V0T3B0aW9ucyh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICByZWRpcmVjdFVyaTogJydcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaWduT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRva2VucygpXHJcbiAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICBjbGVhck5vbmNlKClcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgTWFydGluIEjDuGdoIDxtaEBtYXBjZW50aWEuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAyMDEzLTIwMjQgTWFwQ2VudGlhIEFwU1xyXG4gKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvI0FHUEwgIEdOVSBBRkZFUk8gR0VORVJBTCBQVUJMSUMgTElDRU5TRSAzXHJcbiAqXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtnZXRPcHRpb25zLCBnZXRUb2tlbnMsIGlzTG9naW59IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7R2MyU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL2djMi5zZXJ2aWNlc1wiO1xyXG5cclxuY29uc3QgZ2V0SGVhZGVycyA9IGFzeW5jIChjb250ZW50VHlwZTogc3RyaW5nfG51bGwgPSAnYXBwbGljYXRpb24vanNvbicpOiBQcm9taXNlPGFueT49PiB7XHJcbiAgdHlwZSBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiBzdHJpbmcsXHJcbiAgICBDb29raWU6IHN0cmluZyxcclxuICAgIEF1dGhvcml6YXRpb246IHN0cmluZ3xudWxsLFxyXG4gICAgJ0NvbnRlbnQtVHlwZSc/OiBzdHJpbmdcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKClcclxuICBjb25zdCBzZXJ2aWNlID0gbmV3IEdjMlNlcnZpY2Uob3B0aW9ucylcclxuXHJcbiAgLy8gV2UgY2hlY2sgaXMgdG9rZW4gbmVlZHMgcmVmcmVzaGluZ1xyXG4gIGlmICghYXdhaXQgaXNMb2dpbihzZXJ2aWNlKSkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdJcyBub3QgbG9nZ2VkIGluJylcclxuICB9XHJcblxyXG4gIGNvbnN0IHthY2Nlc3NUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG5cclxuICBjb25zdCBoZWFkZXJzOiBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICBDb29raWU6ICdYREVCVUdfU0VTU0lPTj1YREVCVUdfRUNMSVBTRScsXHJcbiAgICBBdXRob3JpemF0aW9uOiBhY2Nlc3NUb2tlbiA/ICdCZWFyZXIgJyArIGFjY2Vzc1Rva2VuIDogbnVsbCxcclxuICB9XHJcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXHJcbiAgfVxyXG4gIHJldHVybiBoZWFkZXJzXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgZ2V0SGVhZGVyc1xyXG5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgIE1hcnRpbiBIw7hnaCA8bWhAbWFwY2VudGlhLmNvbT5cclxuICogQGNvcHlyaWdodCAgMjAxMy0yMDI0IE1hcENlbnRpYSBBcFNcclxuICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyNBR1BMICBHTlUgQUZGRVJPIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgM1xyXG4gKlxyXG4gKi9cclxuXHJcbmltcG9ydCBnZXRIZWFkZXJzIGZyb20gJy4vcmVxdWVzdC1oZWFkZXJzJ1xyXG5pbXBvcnQgTWV0aG9kIGZyb20gJy4uL2NvbW1vbi9odHRwLXZlcmJzJ1xyXG5pbXBvcnQge2dldE9wdGlvbnN9IGZyb20gJy4vdXRpbHMnXHJcblxyXG5leHBvcnQgY29uc3QgbWFrZSA9IGFzeW5jICh2ZXJzaW9uOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIG1ldGhvZDogTWV0aG9kLCBwYXlsb2FkPzogYW55LCBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbCA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoKVxyXG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlKVxyXG5cclxuICBsZXQgcmVxdWVzdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICByZWRpcmVjdDogJ21hbnVhbCdcclxuICB9XHJcbiAgaWYgKHBheWxvYWQpIHtcclxuICAgIHJlcXVlc3QuYm9keSA9IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSA6IHBheWxvYWRcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IGZldGNoKG9wdGlvbnMuaG9zdCArIGAvYXBpL3Yke3ZlcnNpb259LyR7cmVzb3VyY2V9YCwgcmVxdWVzdClcclxufVxyXG5leHBvcnQgZGVmYXVsdCBtYWtlXHJcbiIsImNvbnN0IGdldCA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGV4cGVjdGVkQ29kZTogbnVtYmVyKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICBsZXQgcmVzOiBhbnkgPSBudWxsXHJcbiAgICBsZXQgYm9keVRleHQgPSAnJ1xyXG5cclxuICAgIC8vIFJlYWQgdGhlIGJvZHkgb25seSBvbmNlIGFzIHRleHQuIFRoaXMgYXZvaWRzIFwiYm9keSB1c2VkIGFscmVhZHlcIiB3aXRoIG5vZGUtZmV0Y2guXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIEV2ZW4gZm9yIDIwNC8zMDMsIHRleHQoKSBpcyBzYWZlIGFuZCB3aWxsIHJldHVybiAnJyBmb3IgZW1wdHkgYm9kaWVzXHJcbiAgICAgICAgYm9keVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgYm9keSByZWFkIGVycm9yczsgd2UnbGwgcHJvY2VlZCB3aXRoIG51bGwvZW1wdHkgYm9keVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRyeSB0byBwYXJzZSBKU09OIGlmIHRoZXJlIGlzIGEgYm9keVxyXG4gICAgaWYgKGJvZHlUZXh0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShib2R5VGV4dClcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBKU09OOyBrZWVwIHJlcyBhcyBudWxsIGFuZCB1c2UgYm9keVRleHQgZm9yIGVycm9yIG1lc3NhZ2VzXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IGV4cGVjdGVkQ29kZSkge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IChyZXMgJiYgKHJlcy5tZXNzYWdlIHx8IHJlcy5lcnJvcikpIHx8IGJvZHlUZXh0IHx8IGBVbmV4cGVjdGVkIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZylcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgMjA0LzMwMywgcmVzIHdpbGwgYmUgbnVsbCAobm8gYm9keSksIHdoaWNoIGlzIGZpbmUgZm9yIGNhbGxlcnMgZXhwZWN0aW5nIG5vIGNvbnRlbnRcclxuICAgIHJldHVybiByZXNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuaW1wb3J0IHtTcWxSZXF1ZXN0LCBTUUxSZXNwb25zZX0gZnJvbSBcIi4vdHlwZXMvcGdUeXBlc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3FsIHtcclxuICAgIGFzeW5jIGV4ZWMocmVxdWVzdDogU3FsUmVxdWVzdCk6IFByb21pc2U8U1FMUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3FsYCwgJ1BPU1QnLCByZXF1ZXN0KVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcbmltcG9ydCB7UnBjUmVxdWVzdCwgUnBjUmVzcG9uc2V9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJwYyB7XHJcbiAgICBhc3luYyBjYWxsKHJlcXVlc3Q6IFJwY1JlcXVlc3QpOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYGNhbGxgLCAnUE9TVCcsIHJlcXVlc3QpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGEge1xyXG4gICAgYXN5bmMgcXVlcnkocmVsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnMycsIGBtZXRhLyR7cmVsfWAsICdHRVQnLCBudWxsKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2dldFRva2Vuc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIHtcclxuICAgIGlzQXV0aCgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnMoKVxyXG4gICAgICAgIHJldHVybiAhKCF0b2tlbnMuYWNjZXNzVG9rZW4gJiYgIXRva2Vucy5yZWZyZXNoVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRva2VucygpIHtcclxuICAgICAgICByZXR1cm4gZ2V0VG9rZW5zKClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2NsYWltcywgZ2V0VG9rZW5zfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFpbXMge1xyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VucyA9IGdldFRva2VucygpLmFjY2Vzc1Rva2VuXHJcbiAgICAgICAgcmV0dXJuIGNsYWltcyh0b2tlbnMpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJzIHtcclxuICAgIGFzeW5jIGdldCh1c2VyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGB1c2Vycy8ke3VzZXJ9YCwgJ0dFVCcsIG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7V3NPcHRpb25zLCBnZXRUb2tlbnN9IGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdzIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV3NPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdzT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VufSA9IGdldFRva2VucygpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ob3N0ICsgYC8/dG9rZW49YCArIGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB3cy5vbm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY29ubmVjdGVkIScpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgbWUub3B0aW9ucz8uY2FsbEJhY2soZXZlbnQuZGF0YSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gMyBzZWNvbmRzLi4uJywgZXZlbnQucmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIDMwMDApOyAvLyBUcnkgdG8gcmVjb25uZWN0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB3cy5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXQgZXJyb3Igb2JzZXJ2ZWQ6JywgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXQgb24gZXJyb3IgdG8gZW5zdXJlIGNsZWFuIHJlY29ubmVjdGlvblxyXG4gICAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XHJcbiAgICBhc3luYyBnZXQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3RhdHNgLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IG1ha2UgZnJvbSBcIi4vdXRpbC9tYWtlLXJlcXVlc3RcIjtcclxuaW1wb3J0IGdldCBmcm9tIFwiLi91dGlsL2dldC1yZXNwb25zZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVzIHtcclxuICAgIGFzeW5jIGdldChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlKHNjaGVtYTogc3RyaW5nLCB0YWJsZTogc3RyaW5nLCBwYXlsb2FkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGBzY2hlbWFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNjaGVtYSl9L3RhYmxlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0YWJsZSl9YCwgJ1BPU1QnLCBwYXlsb2FkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwYXRjaChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZywgcGF5bG9hZDogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc2NoZW1hcy8ke2VuY29kZVVSSUNvbXBvbmVudChzY2hlbWEpfS90YWJsZXMvJHtlbmNvZGVVUklDb21wb25lbnQodGFibGUpfWAsICdQQVRDSCcsIHBheWxvYWQpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnREVMRVRFJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDQpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IFJwYyBmcm9tIFwiLi9ScGNcIlxyXG5pbXBvcnQge1JwY1JlcXVlc3R9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIlxyXG5cclxudHlwZSBNZXRob2RzT2Y8VD4gPSB7XHJcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6IEEpID0+IFIgOiBuZXZlcjtcclxufTtcclxuXHJcbi8vIEltcGxlbWVudGF0aW9uIHNpZ25hdHVyZSAod2lkZSkg4oCUIG92ZXJsb2FkcyBhYm92ZSBjb250cm9sIHRoZSBwdWJsaWMgdHlwaW5nXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoPEsgZXh0ZW5kcyBrZXlvZiBhbnkgJiBzdHJpbmc+KG5hbWU6IEssIGFyZ3M6IG9iamVjdHxBcnJheTxvYmplY3Q+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vY29uc29sZS5sb2coXCJEaXNwYXRjaDpcIiwgbmFtZSwgYXJncyk7XHJcbiAgICAvLyByb3V0ZSB0byByZWFsIGltcGxlbWVudGF0aW9uczpcclxuICAgIGNvbnN0IHJwYyA9IG5ldyBScGMoKVxyXG4gICAgY29uc3QgcmVxdWVzdDogUnBjUmVxdWVzdCA9IHtcclxuICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxyXG4gICAgICAgIG1ldGhvZDogbmFtZSxcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwYXJhbXM6IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICB9XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMuY2FsbChyZXF1ZXN0KVxyXG4gICAgcmV0dXJuIHJlcy5yZXN1bHQuZGF0YVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGk8VD4oKTogTWV0aG9kc09mPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4gKGRpc3BhdGNoIGFzIGFueSkocHJvcCwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgKSBhcyB1bmtub3duIGFzIE1ldGhvZHNPZjxUPjtcclxufVxyXG4iXSwibmFtZXMiOlsiSW52YWxpZFRva2VuRXJyb3IiLCJiNjREZWNvZGVVbmljb2RlIiwic3RyIiwibSIsInAiLCJjb2RlIiwiYmFzZTY0VXJsRGVjb2RlIiwib3V0cHV0Iiwiand0RGVjb2RlIiwidG9rZW4iLCJvcHRpb25zIiwicG9zIiwicGFydCIsImRlY29kZWQiLCJlIiwiTWVtb3J5U3RvcmFnZSIsImtleSIsInZhbHVlIiwiY2FjaGVkIiwiZ2V0U3RvcmFnZSIsImciLCJnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UiLCJnZW5lcmF0ZVJhbmRvbVN0cmluZyIsImFycmF5IiwiZGVjIiwic2hhMjU2IiwicGxhaW4iLCJkYXRhIiwiYmFzZTY0dXJsRW5jb2RlIiwicGtjZUNoYWxsZW5nZUZyb21WZXJpZmllciIsInYiLCJoYXNoZWQiLCJzdGF0ZSIsImNvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJpc1Rva2VuRXhwaXJlZCIsImlzSnd0RXhwaXJlZCIsImV4cCIsImN1cnJlbnRUaW1lIiwiY2xhaW1zIiwiaXNMb2dpbiIsImdjMiIsImFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZ2V0VG9rZW5zIiwiY2xlYXJUb2tlbnMiLCJjbGVhck9wdGlvbnMiLCJzZXRUb2tlbnMiLCJ0b2tlbnMiLCJzZXRPcHRpb25zIiwiZ2V0T3B0aW9ucyIsImdldE5vbmNlIiwiY2xlYXJOb25jZSIsIkdjMlNlcnZpY2UiLCJwYXRoIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiaGVhZGVycyIsInBheWxvYWQiLCJyZXNwb25zZSIsImVyclRleHQiLCJkZXZpY2VDb2RlIiwiaW50ZXJ2YWwiLCJnZXRUb2tlbiIsImVyciIsInJlc29sdmUiLCJyZWRpcmVjdFVyaSIsImJhc2UiLCJwYXJhbXMiLCJub25jZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYXRhYmFzZSIsIkNvZGVGbG93IiwicXVlcnlQYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiaWRfdG9rZW4iLCJsb2MiLCJuZXdVcmwiLCJQYXNzd29yZEZsb3ciLCJnZXRIZWFkZXJzIiwic2VydmljZSIsIm1ha2UiLCJ2ZXJzaW9uIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwiZ2V0IiwiZXhwZWN0ZWRDb2RlIiwicmVzIiwiYm9keVRleHQiLCJtc2ciLCJTcWwiLCJScGMiLCJNZXRhIiwicmVsIiwiU3RhdHVzIiwiQ2xhaW1zIiwiVXNlcnMiLCJ1c2VyIiwiV3MiLCJtZSIsImNvbm5lY3QiLCJ3cyIsImV2ZW50IiwiX2EiLCJTdGF0cyIsIlRhYmxlcyIsInNjaGVtYSIsInRhYmxlIiwiZGlzcGF0Y2giLCJuYW1lIiwiYXJncyIsInJwYyIsImNyZWF0ZUFwaSIsIl90YXJnZXQiLCJwcm9wIl0sIm1hcHBpbmdzIjoiMk5BNENP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
|
|
12
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VudGlhLWlvLXNkay5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWwvand0LWRlY29kZS50cyIsIi4uL3NyYy91dGlsL3N0b3JhZ2UudHMiLCIuLi9zcmMvdXRpbC91dGlscy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9nYzIuc2VydmljZXMudHMiLCIuLi9zcmMvQ29kZUZsb3cudHMiLCIuLi9zcmMvUGFzc3dvcmRGbG93LnRzIiwiLi4vc3JjL3V0aWwvcmVxdWVzdC1oZWFkZXJzLnRzIiwiLi4vc3JjL3V0aWwvbWFrZS1yZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWwvZ2V0LXJlc3BvbnNlLnRzIiwiLi4vc3JjL1NxbC50cyIsIi4uL3NyYy9ScGMudHMiLCIuLi9zcmMvTWV0YS50cyIsIi4uL3NyYy9TdGF0dXMudHMiLCIuLi9zcmMvQ2xhaW1zLnRzIiwiLi4vc3JjL1VzZXJzLnRzIiwiLi4vc3JjL1dzLnRzIiwiLi4vc3JjL1N0YXRzLnRzIiwiLi4vc3JjL1RhYmxlcy50cyIsIi4uL3NyYy9BcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQXV0aDAsIEluYy4gPHN1cHBvcnRAYXV0aDAuY29tPiAoaHR0cDovL2F1dGgwLmNvbSlcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0RGVjb2RlT3B0aW9ucyB7XHJcbiAgICBoZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEp3dEhlYWRlciB7XHJcbiAgICB0eXA/OiBzdHJpbmc7XHJcbiAgICBhbGc/OiBzdHJpbmc7XHJcbiAgICBraWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XHJcbiAgICBpc3M/OiBzdHJpbmc7XHJcbiAgICBzdWI/OiBzdHJpbmc7XHJcbiAgICBhdWQ/OiBzdHJpbmdbXSB8IHN0cmluZztcclxuICAgIGV4cD86IG51bWJlcjtcclxuICAgIG5iZj86IG51bWJlcjtcclxuICAgIGlhdD86IG51bWJlcjtcclxuICAgIGp0aT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cclxuXHJcbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xyXG5cclxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICBhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XHJcbiAgICAgICAgfSksXHJcbiAgICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyOiBzdHJpbmcpIHtcclxuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XHJcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0SGVhZGVyPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBKd3REZWNvZGVPcHRpb25zICYgeyBoZWFkZXI6IHRydWUgfSxcclxuKTogVDtcclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IEp3dERlY29kZU9wdGlvbnMpOiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlPFQgPSBKd3RIZWFkZXIgfCBKd3RQYXlsb2FkPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zPzogSnd0RGVjb2RlT3B0aW9ucyxcclxuKTogVCB7XHJcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3B0aW9ucyB8fD0ge307XHJcblxyXG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcclxuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGVjb2RlZDogc3RyaW5nO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcclxuICAgICAgICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCkgYXMgVDtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXHJcbiAgICAgICAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlTGlrZSB7XHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGxcclxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZFxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkXHJcbn1cclxuXHJcbmNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlTGlrZSB7XHJcbiAgcHJpdmF0ZSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcclxuXHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGtleSkgPyB0aGlzLnN0b3JlLmdldChrZXkpISA6IG51bGxcclxuICB9XHJcblxyXG4gIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuc2V0KGtleSwgU3RyaW5nKHZhbHVlKSlcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSlcclxuICB9XHJcbn1cclxuXHJcbmxldCBjYWNoZWQ6IFN0b3JhZ2VMaWtlIHwgbnVsbCA9IG51bGxcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKCk6IFN0b3JhZ2VMaWtlIHtcclxuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGc6IGFueSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IChnbG9iYWxUaGlzIGFzIGFueSkgOiAod2luZG93IGFzIGFueSlcclxuICAgIGlmIChnICYmIGcubG9jYWxTdG9yYWdlICYmIHR5cGVvZiBnLmxvY2FsU3RvcmFnZS5nZXRJdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNhY2hlZCA9IGcubG9jYWxTdG9yYWdlIGFzIFN0b3JhZ2VMaWtlXHJcbiAgICAgIHJldHVybiBjYWNoZWRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmUgYW5kIGZhbGwgYmFjayB0byBtZW1vcnkgc3RvcmFnZVxyXG4gIH1cclxuICBjb25zdCBnOiBhbnkgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpIDoge31cclxuICBpZiAoIWcuX19nYzJfbWVtb3J5X3N0b3JhZ2UpIHtcclxuICAgIGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZSgpXHJcbiAgfVxyXG4gIGNhY2hlZCA9IGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgYXMgU3RvcmFnZUxpa2VcclxuICByZXR1cm4gY2FjaGVkXHJcbn1cclxuIiwiaW1wb3J0IHtqd3REZWNvZGV9IGZyb20gJy4vand0LWRlY29kZSdcclxuaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvZ2MyLnNlcnZpY2VzXCI7XHJcbmltcG9ydCB7Z2V0U3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IHR5cGUgVG9rZW5zID0ge1xyXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gICAgaWRUb2tlbj86IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XHJcbiAgICBob3N0OiBzdHJpbmc7XHJcbiAgICB3c0hvc3Q/OiBzdHJpbmc7XHJcbiAgICB0b2tlblVyaT86IHN0cmluZztcclxuICAgIGF1dGhVcmk/OiBzdHJpbmc7XHJcbiAgICBsb2dvdXRVcmk/OiBzdHJpbmc7XHJcbiAgICBkZXZpY2VVcmk/OiBzdHJpbmc7XHJcbiAgICBzY29wZT86IHN0cmluZztcclxuICAgIGNsaWVudElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENvZGVGbG93T3B0aW9ucyA9IE9wdGlvbnMgJiB7XHJcbiAgICByZWRpcmVjdFVyaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXNzd29yZEZsb3dPcHRpb25zID0gT3B0aW9ucyAmIHtcclxuICAgIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgZGF0YWJhc2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgV3NPcHRpb25zID0ge1xyXG4gICAgaG9zdDogc3RyaW5nO1xyXG4gICAgY2FsbEJhY2s/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdldERldmljZUNvZGVSZXNwb25zZSA9IHtcclxuICAgIGRldmljZV9jb2RlOiBzdHJpbmc7XHJcbiAgICB1c2VyX2NvZGU6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmk6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmlfY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICBpbnRlcnZhbDogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR2V0VG9rZW5SZXNwb25zZSA9IHtcclxuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xyXG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xyXG4gICAgcmVmcmVzaF9leHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBpZF90b2tlbj86IHN0cmluZztcclxuICAgIHRva2VuX3R5cGU6IHN0cmluZztcclxuICAgICdub3QtYmVmb3JlLXBvbGljeSc6IG51bWJlcjtcclxuICAgIHNlc3Npb25fc3RhdGU6IHN0cmluZztcclxuICAgIHNjb3BlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSA9IGFzeW5jICgpID0+IHtcclxuXHJcbiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbVN0cmluZyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgyOCk7XHJcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYyA9PiAoJzAnICsgZGVjLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSkuam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hhMjU2ID0gKHBsYWluOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKHBsYWluKTtcclxuICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlNjR1cmxFbmNvZGUgPSAoc3RyOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsuLi5uZXcgVWludDhBcnJheShzdHIpXSkpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcGtjZUNoYWxsZW5nZUZyb21WZXJpZmllcih2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodik7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NHVybEVuY29kZShoYXNoZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyfSA9IHtcclxuICAgICAgICBzdGF0ZTogZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSxcclxuICAgICAgICBjb2RlVmVyaWZpZXI6IGdlbmVyYXRlUmFuZG9tU3RyaW5nKCksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IHBrY2VDaGFsbGVuZ2VGcm9tVmVyaWZpZXIoY29kZVZlcmlmaWVyKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXRlLFxyXG4gICAgICAgIGNvZGVWZXJpZmllcixcclxuICAgICAgICBjb2RlQ2hhbGxlbmdlLFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNUb2tlbkV4cGlyZWQgPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzSnd0RXhwaXJlZCA9IGZhbHNlXHJcbiAgICBjb25zdCB7ZXhwfSA9IGp3dERlY29kZSh0b2tlbilcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwXHJcblxyXG4gICAgaWYgKGV4cCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA+IGV4cCkgaXNKd3RFeHBpcmVkID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSnd0RXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2xhaW1zID0gKHRva2VuOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgcmV0dXJuIGp3dERlY29kZSh0b2tlbilcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhc3N3b3JkSXNTdHJvbmdFbm91Z2ggPSAocGFzc3dvcmQ6IHN0cmluZywgYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnRW50ZXJlZCBwYXNzd29yZCBpcyB0b28gd2VhaydcclxuICAgIGlmIChwYXNzd29yZCA9PT0gJycgJiYgYWxsb3dOdWxsKSByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDgpIHJldHVybiBtZXNzYWdlXHJcbiAgICBpZiAoISgvW0EtWl0vLnRlc3QocGFzc3dvcmQpKSkgcmV0dXJuIG1lc3NhZ2VcclxuICAgIGlmICghKC9bYS16XS8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgaWYgKCEoL1xcZC8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzTG9naW4gPSBhc3luYyAoZ2MyOiBHYzJTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICBjb25zdCB7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbiAmJiAhcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8IChhY2Nlc3NUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChhY2Nlc3NUb2tlbikpKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChyZWZyZXNoVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9naW4gYWdhaW4uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdjMi5nZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKVxyXG4gICAgICAgICAgICAgICAgc2V0VG9rZW5zKHthY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbiwgaWRUb2tlbjogZGF0YT8uaWRfdG9rZW59KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgcmVmcmVzaCB0b2tlbi4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldFRva2VucyA9ICh0b2tlbnM6IFRva2Vucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl90b2tlbnMnLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAnYWNjZXNzVG9rZW4nOiB0b2tlbnMuYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAncmVmcmVzaFRva2VuJzogdG9rZW5zLnJlZnJlc2hUb2tlbixcclxuICAgICAgICAgICAgICAgICdpZFRva2VuJzogdG9rZW5zPy5pZFRva2VuIHx8ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUb2tlbnMgPSAoKTogVG9rZW5zID0+IHtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nIHwgbnVsbCA9IGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdnYzJfdG9rZW5zJylcclxuICAgIGNvbnN0IHRva2VuczogYW55ID0gc3RyID8gSlNPTi5wYXJzZShzdHIpIDoge31cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucz8uYWNjZXNzVG9rZW4gfHwgJycsXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnM/LnJlZnJlc2hUb2tlbiB8fCAnJyxcclxuICAgICAgICBpZFRva2VuOiB0b2tlbnM/LmlkVG9rZW4gfHwgJycsXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gKG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl9vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgJ2NsaWVudElkJzogb3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICdob3N0Jzogb3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgJ3JlZGlyZWN0VXJpJzogb3B0aW9ucy5yZWRpcmVjdFVyaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3B0aW9ucyA9ICgpOiBDb2RlRmxvd09wdGlvbnMgPT4ge1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgfCBudWxsID0gZ2V0U3RvcmFnZSgpLmdldEl0ZW0oJ2djMl9vcHRpb25zJylcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHN0ciA/IEpTT04ucGFyc2Uoc3RyKSA6IHt9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsaWVudElkOiBvcHRpb25zPy5jbGllbnRJZCB8fCAnJyxcclxuICAgICAgICBob3N0OiBvcHRpb25zPy5ob3N0IHx8ICcnLFxyXG4gICAgICAgIHJlZGlyZWN0VXJpOiBvcHRpb25zPy5yZWRpcmVjdFVyaSB8fCAnJyxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZVN0cmluZyA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICByZXR1cm4gYnRvYShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKS5yZWR1Y2UoKGFjYywgYnl0ZSkgPT4gYWNjICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gICAgICAgIC5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhclRva2VucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfdG9rZW5zJylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFyT3B0aW9ucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfb3B0aW9ucycpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXROb25jZSA9ICgpOiBzdHJpbmd8bnVsbCA9PiB7XHJcbiAgICByZXR1cm4gPHN0cmluZz5nZXRTdG9yYWdlKCkuZ2V0SXRlbSgnZ2MyX25vbmNlJylcclxufVxyXG5leHBvcnQgY29uc3QgY2xlYXJOb25jZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfbm9uY2UnKVxyXG59XHJcblxyXG4iLCJpbXBvcnQge0NvZGVGbG93T3B0aW9ucywgR2V0RGV2aWNlQ29kZVJlc3BvbnNlLCBnZXROb25jZSwgR2V0VG9rZW5SZXNwb25zZSwgUGFzc3dvcmRGbG93T3B0aW9uc30gZnJvbSAnLi4vdXRpbC91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2MyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyB8IFBhc3N3b3JkRmxvd09wdGlvbnM7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHlwZSBndWFyZHMgdG8gY2hlY2sgaWYgb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMgb3IgUGFzc3dvcmRGbG93T3B0aW9uc1xyXG4gICAgcHJpdmF0ZSBpc0NvZGVGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiAncmVkaXJlY3RVcmknIGluIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUGFzc3dvcmRGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBQYXNzd29yZEZsb3dPcHRpb25zIHtcclxuICAgICAgICByZXR1cm4gJ3VzZXJuYW1lJyBpbiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5ob3N0fSR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID0gJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7J0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlfTtcclxuICAgICAgICBsZXQgcGF5bG9hZDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xyXG4gICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYm9keSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgYm9keTogcGF5bG9hZCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2VyclRleHR9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldERldmljZUNvZGUoKTogUHJvbWlzZTxHZXREZXZpY2VDb2RlUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLmRldmljZVVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aC9kZXZpY2VgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodGhpcy5idWlsZFVybChwYXRoKSwgJ1BPU1QnLCB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHBvbGxUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLnRva2VuVXJpID8/IGAke3RoaXMuaG9zdH0vYXBpL3Y0L29hdXRoYDtcclxuICAgICAgICBjb25zdCBnZXRUb2tlbiA9IGFzeW5jICgpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2UgfCBudWxsIHwgc3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRVcmwocGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jb2RlOiBkZXZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnZGV2aWNlX2NvZGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gSlNPTi5wYXJzZShlLm1lc3NhZ2Uuc3BsaXQoJzogJylbMV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciA9PT0gJ2F1dGhvcml6YXRpb25fcGVuZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJyb3JfZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBnZXRUb2tlbigpO1xyXG4gICAgICAgIHdoaWxlIChyZXNwb25zZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwgKiAxMTAwKSk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZ2V0VG9rZW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLm9wdGlvbnMuYXV0aFVyaSA/PyBgJHt0aGlzLmhvc3R9L2F1dGgvYFxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxyXG4gICAgICAgIC8vIEdldCBub25jZSBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBnZXROb25jZSgpXHJcbiAgICAgICAgLy8gQWRkIHBhcmFtZXRlcnMgY29uZGl0aW9uYWxseVxyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsIHRoaXMub3B0aW9ucy5jbGllbnRJZCk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3N0YXRlJywgc3RhdGUpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgY29kZUNoYWxsZW5nZSk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgnY29kZV9jaGFsbGVuZ2VfbWV0aG9kJywgJ1MyNTYnKTtcclxuICAgICAgICBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnbm9uY2UnLCBub25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9ubHkgYWRkIHNjb3BlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NvcGUpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnc2NvcGUnLCB0aGlzLm9wdGlvbnMuc2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7YmFzZX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Db2RlVG9rZW4oXHJcbiAgICAgICAgY29kZTogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgICAgICAgY29kZVZlcmlmaWVyOiBzdHJpbmcgfCBudWxsXHJcbiAgICApOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmkgPSB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVGbG93IG9wdGlvbnMgcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcclxuICAgICAgICAgICAgICAgIGNvZGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQYXNzd29yZFRva2VuKCk6IFByb21pc2U8R2V0VG9rZW5SZXNwb25zZT4ge1xyXG4gICAgICAgIGxldCB1c2VybmFtZSwgcGFzc3dvcmQsIGRhdGFiYXNlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXNzd29yZEZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLm9wdGlvbnMudXNlcm5hbWVcclxuICAgICAgICAgICAgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucGFzc3dvcmRcclxuICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3N3b3JkRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgZGF0YWJhc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFJlZnJlc2hUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHZXRUb2tlblJlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduT3V0VVJMKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmdcclxuICAgICAgICBpZiAodGhpcy5pc0NvZGVGbG93T3B0aW9ucyh0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xyXG4gICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nb3V0VXJpID8/IGAke3RoaXMuaG9zdH0vc2lnbm91dD8ke3BhcmFtcy50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL2djMi5zZXJ2aWNlcydcclxuaW1wb3J0IHtnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UsIGlzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5pbXBvcnQge0NvZGVGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9uc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5pbXBvcnQge2dldFN0b3JhZ2V9IGZyb20gJy4vdXRpbC9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29kZUZsb3cge1xyXG4gICAgb3B0aW9uczogQ29kZUZsb3dPcHRpb25zXHJcbiAgICBzZXJ2aWNlOiBHYzJTZXJ2aWNlXHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29kZUZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZGlyZWN0SGFuZGxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaFxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwpXHJcblxyXG4gICAgICAgIGNvbnN0IGVycm9yID0gcXVlcnlQYXJhbXMuZ2V0KCdlcnJvcicpXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZGlyZWN0OiAke3VybH1gKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29kZSA9IHF1ZXJ5UGFyYW1zLmdldCgnY29kZScpXHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBxdWVyeVBhcmFtcy5nZXQoJ3N0YXRlJylcclxuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBnZXRTdG9yYWdlKCkuZ2V0SXRlbSgnc3RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3NzaWJsZSBDU1JGIGF0dGFjay4gQWJvcnRpbmcgbG9naW4hJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBdXRob3JpemF0aW9uQ29kZVRva2VuKGNvZGUsIGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdjb2RlVmVyaWZpZXInKSlcclxuICAgICAgICAgICAgICAgIHNldFRva2Vucyh7YWNjZXNzVG9rZW46IGFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuOiByZWZyZXNoX3Rva2VuLCBpZFRva2VuOiBpZF90b2tlbn0pXHJcbiAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHtcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKCkucmVtb3ZlSXRlbSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgZ2V0U3RvcmFnZSgpLnJlbW92ZUl0ZW0oJ2NvZGVWZXJpZmllcicpXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIGFuZCBjb2RlIGZyb20gdGhlIHJlZGlyZWN0IHVybFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5kZWxldGUoJ2NvZGUnKVxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmRlbGV0ZSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBsb2Mub3JpZ2luICsgbG9jLnBhdGhuYW1lICsgKHBhcmFtcy5zaXplID4gMCA/ICc/JyArIHBhcmFtcy50b1N0cmluZygpIDogJycpXHJcbiAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCAnJywgbmV3VXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGlzTG9naW4odGhpcy5zZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2lnbkluKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlfSA9IGF3YWl0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSgpXHJcbiAgICAgICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oXCJzdGF0ZVwiLCBzdGF0ZSlcclxuICAgICAgICBnZXRTdG9yYWdlKCkuc2V0SXRlbShcImNvZGVWZXJpZmllclwiLCBjb2RlVmVyaWZpZXIpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoXHJcbiAgICAgICAgICAgIGNvZGVDaGFsbGVuZ2UsXHJcbiAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpZ25PdXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRTaWduT3V0VVJMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICBjbGVhck9wdGlvbnMoKVxyXG4gICAgICAgIGNsZWFyTm9uY2UoKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7R2MyU2VydmljZSx9IGZyb20gJy4vc2VydmljZXMvZ2MyLnNlcnZpY2VzJ1xyXG5pbXBvcnQge2lzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgUGFzc3dvcmRGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFzc3dvcmRGbG93IHtcclxuICAgIG9wdGlvbnM6IFBhc3N3b3JkRmxvd09wdGlvbnNcclxuICAgIHNlcnZpY2U6IEdjMlNlcnZpY2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNpZ25JbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRQYXNzd29yZFRva2VuKClcclxuICAgICAgICBzZXRUb2tlbnMoe2FjY2Vzc1Rva2VuOiBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbn0pXHJcbiAgICAgICAgc2V0T3B0aW9ucyh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICByZWRpcmVjdFVyaTogJydcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaWduT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRva2VucygpXHJcbiAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICBjbGVhck5vbmNlKClcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgTWFydGluIEjDuGdoIDxtaEBtYXBjZW50aWEuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAyMDEzLTIwMjQgTWFwQ2VudGlhIEFwU1xyXG4gKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvI0FHUEwgIEdOVSBBRkZFUk8gR0VORVJBTCBQVUJMSUMgTElDRU5TRSAzXHJcbiAqXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtnZXRPcHRpb25zLCBnZXRUb2tlbnMsIGlzTG9naW59IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7R2MyU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL2djMi5zZXJ2aWNlc1wiO1xyXG5cclxuY29uc3QgZ2V0SGVhZGVycyA9IGFzeW5jIChjb250ZW50VHlwZTogc3RyaW5nfG51bGwgPSAnYXBwbGljYXRpb24vanNvbicpOiBQcm9taXNlPGFueT49PiB7XHJcbiAgdHlwZSBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiBzdHJpbmcsXHJcbiAgICBDb29raWU6IHN0cmluZyxcclxuICAgIEF1dGhvcml6YXRpb246IHN0cmluZ3xudWxsLFxyXG4gICAgJ0NvbnRlbnQtVHlwZSc/OiBzdHJpbmdcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKClcclxuICBjb25zdCBzZXJ2aWNlID0gbmV3IEdjMlNlcnZpY2Uob3B0aW9ucylcclxuXHJcbiAgLy8gV2UgY2hlY2sgaXMgdG9rZW4gbmVlZHMgcmVmcmVzaGluZ1xyXG4gIGlmICghYXdhaXQgaXNMb2dpbihzZXJ2aWNlKSkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdJcyBub3QgbG9nZ2VkIGluJylcclxuICB9XHJcblxyXG4gIGNvbnN0IHthY2Nlc3NUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG5cclxuICBjb25zdCBoZWFkZXJzOiBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICBDb29raWU6ICdYREVCVUdfU0VTU0lPTj1YREVCVUdfRUNMSVBTRScsXHJcbiAgICBBdXRob3JpemF0aW9uOiBhY2Nlc3NUb2tlbiA/ICdCZWFyZXIgJyArIGFjY2Vzc1Rva2VuIDogbnVsbCxcclxuICB9XHJcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXHJcbiAgfVxyXG4gIHJldHVybiBoZWFkZXJzXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgZ2V0SGVhZGVyc1xyXG5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgIE1hcnRpbiBIw7hnaCA8bWhAbWFwY2VudGlhLmNvbT5cclxuICogQGNvcHlyaWdodCAgMjAxMy0yMDI0IE1hcENlbnRpYSBBcFNcclxuICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyNBR1BMICBHTlUgQUZGRVJPIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgM1xyXG4gKlxyXG4gKi9cclxuXHJcbmltcG9ydCBnZXRIZWFkZXJzIGZyb20gJy4vcmVxdWVzdC1oZWFkZXJzJ1xyXG5pbXBvcnQgTWV0aG9kIGZyb20gJy4uL2NvbW1vbi9odHRwLXZlcmJzJ1xyXG5pbXBvcnQge2dldE9wdGlvbnN9IGZyb20gJy4vdXRpbHMnXHJcblxyXG5leHBvcnQgY29uc3QgbWFrZSA9IGFzeW5jICh2ZXJzaW9uOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIG1ldGhvZDogTWV0aG9kLCBwYXlsb2FkPzogYW55LCBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbCA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoKVxyXG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlKVxyXG5cclxuICBsZXQgcmVxdWVzdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICByZWRpcmVjdDogJ21hbnVhbCdcclxuICB9XHJcbiAgaWYgKHBheWxvYWQpIHtcclxuICAgIHJlcXVlc3QuYm9keSA9IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSA6IHBheWxvYWRcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IGZldGNoKG9wdGlvbnMuaG9zdCArIGAvYXBpL3Yke3ZlcnNpb259LyR7cmVzb3VyY2V9YCwgcmVxdWVzdClcclxufVxyXG5leHBvcnQgZGVmYXVsdCBtYWtlXHJcbiIsImNvbnN0IGdldCA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGV4cGVjdGVkQ29kZTogbnVtYmVyKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICBsZXQgcmVzOiBhbnkgPSBudWxsXHJcbiAgICBsZXQgYm9keVRleHQgPSAnJ1xyXG5cclxuICAgIC8vIFJlYWQgdGhlIGJvZHkgb25seSBvbmNlIGFzIHRleHQuIFRoaXMgYXZvaWRzIFwiYm9keSB1c2VkIGFscmVhZHlcIiB3aXRoIG5vZGUtZmV0Y2guXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIEV2ZW4gZm9yIDIwNC8zMDMsIHRleHQoKSBpcyBzYWZlIGFuZCB3aWxsIHJldHVybiAnJyBmb3IgZW1wdHkgYm9kaWVzXHJcbiAgICAgICAgYm9keVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgYm9keSByZWFkIGVycm9yczsgd2UnbGwgcHJvY2VlZCB3aXRoIG51bGwvZW1wdHkgYm9keVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRyeSB0byBwYXJzZSBKU09OIGlmIHRoZXJlIGlzIGEgYm9keVxyXG4gICAgaWYgKGJvZHlUZXh0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShib2R5VGV4dClcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBKU09OOyBrZWVwIHJlcyBhcyBudWxsIGFuZCB1c2UgYm9keVRleHQgZm9yIGVycm9yIG1lc3NhZ2VzXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IGV4cGVjdGVkQ29kZSkge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IChyZXMgJiYgKHJlcy5tZXNzYWdlIHx8IHJlcy5lcnJvcikpIHx8IGJvZHlUZXh0IHx8IGBVbmV4cGVjdGVkIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZylcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgMjA0LzMwMywgcmVzIHdpbGwgYmUgbnVsbCAobm8gYm9keSksIHdoaWNoIGlzIGZpbmUgZm9yIGNhbGxlcnMgZXhwZWN0aW5nIG5vIGNvbnRlbnRcclxuICAgIHJldHVybiByZXNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuaW1wb3J0IHtTcWxSZXF1ZXN0LCBTUUxSZXNwb25zZX0gZnJvbSBcIi4vdHlwZXMvcGdUeXBlc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3FsIHtcclxuICAgIGFzeW5jIGV4ZWMocmVxdWVzdDogU3FsUmVxdWVzdCk6IFByb21pc2U8U1FMUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3FsYCwgJ1BPU1QnLCByZXF1ZXN0KVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcbmltcG9ydCB7UnBjUmVxdWVzdCwgUnBjUmVzcG9uc2V9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJwYyB7XHJcbiAgICBhc3luYyBjYWxsKHJlcXVlc3Q6IFJwY1JlcXVlc3QpOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYGNhbGxgLCAnUE9TVCcsIHJlcXVlc3QpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGEge1xyXG4gICAgYXN5bmMgcXVlcnkocmVsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnMycsIGBtZXRhLyR7cmVsfWAsICdHRVQnLCBudWxsKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2dldFRva2Vuc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIHtcclxuICAgIGlzQXV0aCgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnMoKVxyXG4gICAgICAgIHJldHVybiAhKCF0b2tlbnMuYWNjZXNzVG9rZW4gJiYgIXRva2Vucy5yZWZyZXNoVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRva2VucygpIHtcclxuICAgICAgICByZXR1cm4gZ2V0VG9rZW5zKClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2NsYWltcywgZ2V0VG9rZW5zfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFpbXMge1xyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VucyA9IGdldFRva2VucygpLmFjY2Vzc1Rva2VuXHJcbiAgICAgICAgcmV0dXJuIGNsYWltcyh0b2tlbnMpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJzIHtcclxuICAgIGFzeW5jIGdldCh1c2VyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGB1c2Vycy8ke3VzZXJ9YCwgJ0dFVCcsIG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7V3NPcHRpb25zLCBnZXRUb2tlbnN9IGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdzIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV3NPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdzT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VufSA9IGdldFRva2VucygpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ob3N0ICsgYC8/dG9rZW49YCArIGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB3cy5vbm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY29ubmVjdGVkIScpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgbWUub3B0aW9ucz8uY2FsbEJhY2soZXZlbnQuZGF0YSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gMyBzZWNvbmRzLi4uJywgZXZlbnQucmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIDMwMDApOyAvLyBUcnkgdG8gcmVjb25uZWN0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB3cy5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXQgZXJyb3Igb2JzZXJ2ZWQ6JywgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXQgb24gZXJyb3IgdG8gZW5zdXJlIGNsZWFuIHJlY29ubmVjdGlvblxyXG4gICAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XHJcbiAgICBhc3luYyBnZXQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3RhdHNgLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IG1ha2UgZnJvbSBcIi4vdXRpbC9tYWtlLXJlcXVlc3RcIjtcclxuaW1wb3J0IGdldCBmcm9tIFwiLi91dGlsL2dldC1yZXNwb25zZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVzIHtcclxuICAgIGFzeW5jIGdldChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlKHNjaGVtYTogc3RyaW5nLCB0YWJsZTogc3RyaW5nLCBwYXlsb2FkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGBzY2hlbWFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNjaGVtYSl9L3RhYmxlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0YWJsZSl9YCwgJ1BPU1QnLCBwYXlsb2FkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwYXRjaChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZywgcGF5bG9hZDogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc2NoZW1hcy8ke2VuY29kZVVSSUNvbXBvbmVudChzY2hlbWEpfS90YWJsZXMvJHtlbmNvZGVVUklDb21wb25lbnQodGFibGUpfWAsICdQQVRDSCcsIHBheWxvYWQpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnREVMRVRFJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDQpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IFJwYyBmcm9tIFwiLi9ScGNcIlxyXG5pbXBvcnQge1JwY1JlcXVlc3R9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIlxyXG5cclxudHlwZSBNZXRob2RzT2Y8VD4gPSB7XHJcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6IEEpID0+IFIgOiBuZXZlcjtcclxufTtcclxuXHJcbi8vIEltcGxlbWVudGF0aW9uIHNpZ25hdHVyZSAod2lkZSkg4oCUIG92ZXJsb2FkcyBhYm92ZSBjb250cm9sIHRoZSBwdWJsaWMgdHlwaW5nXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoPEsgZXh0ZW5kcyBrZXlvZiBhbnkgJiBzdHJpbmc+KG5hbWU6IEssIGFyZ3M6IG9iamVjdHxBcnJheTxvYmplY3Q+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vY29uc29sZS5sb2coXCJEaXNwYXRjaDpcIiwgbmFtZSwgYXJncyk7XHJcbiAgICAvLyByb3V0ZSB0byByZWFsIGltcGxlbWVudGF0aW9uczpcclxuICAgIGNvbnN0IHJwYyA9IG5ldyBScGMoKVxyXG4gICAgY29uc3QgcmVxdWVzdDogUnBjUmVxdWVzdCA9IHtcclxuICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxyXG4gICAgICAgIG1ldGhvZDogbmFtZSxcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwYXJhbXM6IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICB9XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMuY2FsbChyZXF1ZXN0KVxyXG4gICAgcmV0dXJuIHJlcy5yZXN1bHQuZGF0YVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGk8VD4oKTogTWV0aG9kc09mPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4gKGRpc3BhdGNoIGFzIGFueSkocHJvcCwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgKSBhcyB1bmtub3duIGFzIE1ldGhvZHNPZjxUPjtcclxufVxyXG4iXSwibmFtZXMiOlsiSW52YWxpZFRva2VuRXJyb3IiLCJiNjREZWNvZGVVbmljb2RlIiwic3RyIiwibSIsInAiLCJjb2RlIiwiYmFzZTY0VXJsRGVjb2RlIiwib3V0cHV0Iiwiand0RGVjb2RlIiwidG9rZW4iLCJvcHRpb25zIiwicG9zIiwicGFydCIsImRlY29kZWQiLCJlIiwiTWVtb3J5U3RvcmFnZSIsImtleSIsInZhbHVlIiwiY2FjaGVkIiwiZ2V0U3RvcmFnZSIsImciLCJnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UiLCJnZW5lcmF0ZVJhbmRvbVN0cmluZyIsImFycmF5IiwiZGVjIiwic2hhMjU2IiwicGxhaW4iLCJkYXRhIiwiYmFzZTY0dXJsRW5jb2RlIiwicGtjZUNoYWxsZW5nZUZyb21WZXJpZmllciIsInYiLCJoYXNoZWQiLCJzdGF0ZSIsImNvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJpc1Rva2VuRXhwaXJlZCIsImlzSnd0RXhwaXJlZCIsImV4cCIsImN1cnJlbnRUaW1lIiwiY2xhaW1zIiwiaXNMb2dpbiIsImdjMiIsImFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZ2V0VG9rZW5zIiwiY2xlYXJUb2tlbnMiLCJjbGVhck9wdGlvbnMiLCJzZXRUb2tlbnMiLCJ0b2tlbnMiLCJzZXRPcHRpb25zIiwiZ2V0T3B0aW9ucyIsImdldE5vbmNlIiwiY2xlYXJOb25jZSIsIkdjMlNlcnZpY2UiLCJwYXRoIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiaGVhZGVycyIsInBheWxvYWQiLCJyZXNwb25zZSIsImVyclRleHQiLCJkZXZpY2VDb2RlIiwiaW50ZXJ2YWwiLCJnZXRUb2tlbiIsImVyciIsInJlc29sdmUiLCJyZWRpcmVjdFVyaSIsImJhc2UiLCJwYXJhbXMiLCJub25jZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYXRhYmFzZSIsIkNvZGVGbG93IiwicXVlcnlQYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiaWRfdG9rZW4iLCJsb2MiLCJuZXdVcmwiLCJQYXNzd29yZEZsb3ciLCJnZXRIZWFkZXJzIiwic2VydmljZSIsIm1ha2UiLCJ2ZXJzaW9uIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwiZ2V0IiwiZXhwZWN0ZWRDb2RlIiwicmVzIiwiYm9keVRleHQiLCJtc2ciLCJTcWwiLCJScGMiLCJNZXRhIiwicmVsIiwiU3RhdHVzIiwiQ2xhaW1zIiwiVXNlcnMiLCJ1c2VyIiwiV3MiLCJtZSIsImNvbm5lY3QiLCJ3cyIsImV2ZW50IiwiX2EiLCJTdGF0cyIsIlRhYmxlcyIsInNjaGVtYSIsInRhYmxlIiwiZGlzcGF0Y2giLCJuYW1lIiwiYXJncyIsInJwYyIsImNyZWF0ZUFwaSIsIl90YXJnZXQiLCJwcm9wIl0sIm1hcHBpbmdzIjoiMk5BNENP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
|