@uengage.io/platform-sdk 0.9.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/business/client.js +3 -36
- package/dist/business/index.d.ts +1 -1
- package/dist/business/index.js +1 -1
- package/dist/business/schema.d.ts +161 -4
- package/dist/business/schema.js +17 -2
- package/dist/client.d.ts +51 -9
- package/dist/client.js +81 -23
- package/dist/http.d.ts +22 -0
- package/dist/http.js +39 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/token-source.d.ts +24 -0
- package/dist/token-source.js +65 -1
- package/dist/zones/client.d.ts +51 -0
- package/dist/zones/client.js +156 -0
- package/dist/zones/index.d.ts +2 -0
- package/dist/zones/index.js +7 -0
- package/dist/zones/schema.d.ts +104 -0
- package/dist/zones/schema.js +16 -0
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createClient = createClient;
|
|
4
4
|
const client_1 = require("./audit/client");
|
|
5
5
|
const client_2 = require("./business/client");
|
|
6
|
+
const client_3 = require("./zones/client");
|
|
6
7
|
const auth_1 = require("./auth");
|
|
7
8
|
const token_source_1 = require("./token-source");
|
|
8
9
|
const errors_1 = require("./errors");
|
|
@@ -31,10 +32,18 @@ function buildClient(input) {
|
|
|
31
32
|
auth,
|
|
32
33
|
actorVia: input.actorVia ?? input.serviceId,
|
|
33
34
|
});
|
|
35
|
+
const zonesClient = (0, client_3.createZonesClient)({ baseUrl, fetchFn: input.fetchFn, auth });
|
|
34
36
|
return {
|
|
35
37
|
business: businessClient,
|
|
36
38
|
audit: auditClient,
|
|
39
|
+
zones: zonesClient,
|
|
37
40
|
auth: auth_1.auth,
|
|
41
|
+
getAccessToken: async () => {
|
|
42
|
+
if (!tokenSourceState) {
|
|
43
|
+
throw new errors_1.ConfigError('getAccessToken: no auth mode configured. Pass {serviceId, serviceSecret} | {authToken} | {session}.');
|
|
44
|
+
}
|
|
45
|
+
return (0, token_source_1.getAccessToken)(tokenSourceState);
|
|
46
|
+
},
|
|
38
47
|
};
|
|
39
48
|
}
|
|
40
49
|
const AUTH_MODE_FIELDS = [
|
|
@@ -42,7 +51,8 @@ const AUTH_MODE_FIELDS = [
|
|
|
42
51
|
'serviceSecret',
|
|
43
52
|
'scope',
|
|
44
53
|
'authToken',
|
|
45
|
-
'
|
|
54
|
+
'session',
|
|
55
|
+
'tokens',
|
|
46
56
|
];
|
|
47
57
|
/**
|
|
48
58
|
* Merge env-derived defaults with the caller's explicit input. Any
|
|
@@ -64,7 +74,8 @@ function mergeWithEnv(input) {
|
|
|
64
74
|
serviceSecret: input.serviceSecret ?? envForMerge.serviceSecret,
|
|
65
75
|
scope: input.scope ?? envForMerge.scope,
|
|
66
76
|
authToken: input.authToken ?? envForMerge.authToken,
|
|
67
|
-
|
|
77
|
+
session: input.session ?? envForMerge.session,
|
|
78
|
+
tokens: input.tokens,
|
|
68
79
|
actorVia: input.actorVia ?? envForMerge.actorVia,
|
|
69
80
|
expiryBufferMs: input.expiryBufferMs ?? envForMerge.expiryBufferMs,
|
|
70
81
|
fetchFn: input.fetchFn,
|
|
@@ -77,6 +88,11 @@ function readEnvDefaults() {
|
|
|
77
88
|
return {};
|
|
78
89
|
const e = process.env ?? {};
|
|
79
90
|
const expiry = e.UENGAGE_EXPIRY_BUFFER_MS ? Number(e.UENGAGE_EXPIRY_BUFFER_MS) : undefined;
|
|
91
|
+
// UENGAGE_SESSION_ID + UENGAGE_SESSION_TOKEN must be paired; either alone is ignored
|
|
92
|
+
// so an env-only setup never produces a half-configured session.
|
|
93
|
+
const session = e.UENGAGE_SESSION_ID && e.UENGAGE_SESSION_TOKEN
|
|
94
|
+
? { id: e.UENGAGE_SESSION_ID, token: e.UENGAGE_SESSION_TOKEN }
|
|
95
|
+
: undefined;
|
|
80
96
|
return {
|
|
81
97
|
baseUrl: e.UENGAGE_BASE_URL,
|
|
82
98
|
authBaseUrl: e.UENGAGE_AUTH_BASE_URL,
|
|
@@ -85,7 +101,7 @@ function readEnvDefaults() {
|
|
|
85
101
|
serviceSecret: e.UENGAGE_SERVICE_SECRET,
|
|
86
102
|
scope: e.UENGAGE_SCOPE,
|
|
87
103
|
authToken: e.UENGAGE_AUTH_TOKEN,
|
|
88
|
-
|
|
104
|
+
session,
|
|
89
105
|
actorVia: e.UENGAGE_ACTOR_VIA,
|
|
90
106
|
expiryBufferMs: Number.isFinite(expiry) ? expiry : undefined,
|
|
91
107
|
};
|
|
@@ -100,46 +116,78 @@ function withoutAuthFields(c) {
|
|
|
100
116
|
serviceSecret: undefined,
|
|
101
117
|
scope: undefined,
|
|
102
118
|
authToken: undefined,
|
|
103
|
-
|
|
119
|
+
session: undefined,
|
|
120
|
+
tokens: undefined,
|
|
104
121
|
};
|
|
105
122
|
}
|
|
106
123
|
function assertExactlyOneAuthMode(input) {
|
|
107
124
|
const modes = [];
|
|
108
125
|
if (input.authToken !== undefined)
|
|
109
126
|
modes.push('authToken');
|
|
110
|
-
if (input.
|
|
111
|
-
modes.push('
|
|
127
|
+
if (input.session !== undefined)
|
|
128
|
+
modes.push('session');
|
|
129
|
+
if (input.tokens !== undefined)
|
|
130
|
+
modes.push('tokens');
|
|
112
131
|
if (input.serviceId !== undefined || input.serviceSecret !== undefined) {
|
|
113
132
|
modes.push('serviceId+serviceSecret');
|
|
114
133
|
}
|
|
115
134
|
if (modes.length > 1) {
|
|
116
135
|
throw new errors_1.ConfigError(`createClient: pick exactly one auth mode. Got ${modes.join(', ')}. ` +
|
|
117
|
-
'Use one of {serviceId, serviceSecret} | {authToken} | {
|
|
136
|
+
'Use one of {serviceId, serviceSecret} | {authToken} | {session} | {tokens}.');
|
|
118
137
|
}
|
|
119
138
|
// Zero modes is allowed — caller may want a fully-anonymous client for
|
|
120
139
|
// public endpoints. The first request that needs auth will surface a
|
|
121
140
|
// ConfigError downstream.
|
|
122
141
|
}
|
|
123
142
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
143
|
+
* Probe the business `legacy_session` grant first, fall back to customer
|
|
144
|
+
* on `invalid_grant`. Either surface mints a JWT — the SDK doesn't care
|
|
145
|
+
* which side answered.
|
|
146
|
+
*
|
|
147
|
+
* Why probe both: `id` (numeric) overlaps users.userId vs
|
|
148
|
+
* addo_contacts_mapping.id/contactId. Callers usually don't know which
|
|
149
|
+
* table their (id, token) pair belongs to.
|
|
126
150
|
*/
|
|
127
|
-
async function
|
|
128
|
-
const
|
|
151
|
+
async function exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn) {
|
|
152
|
+
const body = new URLSearchParams({
|
|
153
|
+
grant_type: 'legacy_session',
|
|
154
|
+
id: String(session.id),
|
|
155
|
+
token: session.token,
|
|
156
|
+
}).toString();
|
|
157
|
+
const businessRes = await fetchFn(`${authBaseUrl}/oauth/token`, {
|
|
129
158
|
method: 'POST',
|
|
130
159
|
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
131
|
-
body
|
|
132
|
-
grant_type: 'session_token',
|
|
133
|
-
session_token: sessionToken,
|
|
134
|
-
}).toString(),
|
|
160
|
+
body,
|
|
135
161
|
});
|
|
136
|
-
if (
|
|
137
|
-
|
|
138
|
-
|
|
162
|
+
if (businessRes.ok) {
|
|
163
|
+
return parseAccessToken(businessRes);
|
|
164
|
+
}
|
|
165
|
+
if (await isInvalidGrant(businessRes)) {
|
|
166
|
+
const customerRes = await fetchFn(`${customerAuthBaseUrl}/oauth/token`, {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
169
|
+
body,
|
|
170
|
+
});
|
|
171
|
+
if (customerRes.ok) {
|
|
172
|
+
return parseAccessToken(customerRes);
|
|
173
|
+
}
|
|
174
|
+
const text = await customerRes.text().catch(() => '');
|
|
175
|
+
throw new errors_1.AuthenticationError(`legacy_session exchange failed on both surfaces: customer HTTP ${customerRes.status} ${text}`);
|
|
139
176
|
}
|
|
177
|
+
const text = await businessRes.text().catch(() => '');
|
|
178
|
+
throw new errors_1.AuthenticationError(`legacy_session exchange failed: HTTP ${businessRes.status} ${text}`);
|
|
179
|
+
}
|
|
180
|
+
async function isInvalidGrant(res) {
|
|
181
|
+
if (res.status !== 400)
|
|
182
|
+
return false;
|
|
183
|
+
const cloned = res.clone();
|
|
184
|
+
const json = (await cloned.json().catch(() => ({})));
|
|
185
|
+
return json.error === 'invalid_grant';
|
|
186
|
+
}
|
|
187
|
+
async function parseAccessToken(res) {
|
|
140
188
|
const json = (await res.json());
|
|
141
189
|
if (!json.access_token) {
|
|
142
|
-
throw new errors_1.ConfigError('
|
|
190
|
+
throw new errors_1.ConfigError('legacy_session exchange response missing access_token');
|
|
143
191
|
}
|
|
144
192
|
return json.access_token;
|
|
145
193
|
}
|
|
@@ -152,12 +200,12 @@ function resolveTokenSource(input, baseUrl) {
|
|
|
152
200
|
}
|
|
153
201
|
return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.authToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
154
202
|
}
|
|
155
|
-
if (input.
|
|
203
|
+
if (input.session !== undefined) {
|
|
156
204
|
const customerAuthBaseUrl = input.customerAuthBaseUrl ?? `${baseUrl}/auth/customer`;
|
|
157
|
-
const
|
|
205
|
+
const session = input.session;
|
|
158
206
|
return (0, token_source_1.makeTokenSourceState)({
|
|
159
207
|
kind: 'callback',
|
|
160
|
-
getToken: () =>
|
|
208
|
+
getToken: () => exchangeLegacySession(session, authBaseUrl, customerAuthBaseUrl, fetchFn),
|
|
161
209
|
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
162
210
|
}
|
|
163
211
|
if (input.serviceId && input.serviceSecret) {
|
|
@@ -169,6 +217,16 @@ function resolveTokenSource(input, baseUrl) {
|
|
|
169
217
|
scope: input.scope,
|
|
170
218
|
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
171
219
|
}
|
|
220
|
+
if (input.tokens) {
|
|
221
|
+
return (0, token_source_1.makeTokenSourceState)({
|
|
222
|
+
kind: 'access-refresh-pair',
|
|
223
|
+
accessToken: input.tokens.accessToken,
|
|
224
|
+
refreshToken: input.tokens.refreshToken,
|
|
225
|
+
expiresAt: Date.now() + input.tokens.expiresIn * 1000,
|
|
226
|
+
clientId: input.tokens.clientId,
|
|
227
|
+
onRotate: input.tokens.onRotate,
|
|
228
|
+
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
229
|
+
}
|
|
172
230
|
return undefined;
|
|
173
231
|
}
|
|
174
232
|
function warnIfBrowserSecret(config) {
|
|
@@ -182,4 +240,4 @@ function warnIfBrowserSecret(config) {
|
|
|
182
240
|
'Use `authToken` (a Bearer obtained via OAuth) or `sessionToken` instead.');
|
|
183
241
|
}
|
|
184
242
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWtGQSxvQ0FJQztBQXRGRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLGlDQUErQztBQUMvQyxpREFBNkU7QUFDN0UscUNBQTREO0FBc0U1RCxNQUFNLGdCQUFnQixHQUFHLGlDQUFpQyxDQUFDO0FBRTNEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFFBQXNCLEVBQUU7SUFDbkQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFtQjtJQUN0QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDO0lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELE1BQU0sSUFBSSxHQUE2QixnQkFBZ0I7UUFDckQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUU7UUFDbkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVkLE1BQU0sY0FBYyxHQUFHLElBQUEsNkJBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RixNQUFNLFdBQVcsR0FBRyxJQUFBLDBCQUFpQixFQUFDO1FBQ3BDLE9BQU87UUFDUCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsSUFBSTtRQUNKLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxTQUFTO0tBQzVDLENBQUMs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LEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE1BQW9CO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLFVBQWlELENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU87SUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FDVixtRkFBbUY7WUFDakYsK0RBQStEO1lBQy9ELDBFQUEwRSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgYXV0aCBhcyBhdXRoTmFtZXNwYWNlIH0gZnJvbSAnLi9hdXRoJztcbmltcG9ydCB7IG1ha2VUb2tlblNvdXJjZVN0YXRlLCB0eXBlIFRva2VuU291cmNlU3RhdGUgfSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5pbXBvcnQgeyBDb25maWdFcnJvciwgQXV0aGVudGljYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1BdXRoIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgY29uZmlnIGZvciBgY3JlYXRlQ2xpZW50KC4uLilgLlxuICpcbiAqIGBjcmVhdGVDbGllbnQoKWAgKG5vIGFyZ3MpIHJlYWRzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhbmRhcmRcbiAqIGBVRU5HQUdFXypgIGVudmlyb25tZW50IHZhcmlhYmxlcyDigJQgY29udmVuaWVudCBmb3IgTGFtYmRhcyB0aGF0XG4gKiBhbHJlYWR5IGhhdmUgdGhlaXIgY29uZmlnIGluamVjdGVkIGJ5IHRoZSBkZXBsb3kgc3RhY2suIEFueSBmaWVsZFxuICogcGFzc2VkIGV4cGxpY2l0bHkgb3ZlcnJpZGVzIHRoZSBtYXRjaGluZyBlbnYgZGVmYXVsdCBmb3IgdGhhdCBvbmVcbiAqIGNhbGwgb25seSAobm8gc2hhcmVkIG11dGFibGUgc3RhdGUsIG5vIHNpbmdsZXRvbikuXG4gKlxuICogQXV0aC1tb2RlIGZpZWxkcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBQaWNrIG9uZTpcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscy5cbiAqICAgLSBgYXV0aFRva2VuYCAgICAgICAgICAgICAgICAgICAgc3RhdGljIEJlYXJlciB0b2tlbiwgb3IgYXN5bmNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgdGhhdCByZXR1cm5zIG9uZS5cbiAqICAgLSBgc2Vzc2lvblRva2VuYCAgICAgICAgICAgICAgICAgbGVnYWN5IGN1c3RvbWVyIHNlc3Npb24gdG9rZW47IHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREsgZXhjaGFuZ2VzIGl0IHZpYSB0aGUgY3VzdG9tZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aCBzdXJmYWNlIGFuZCBjYWNoZXMgdGhlIEpXVC5cbiAqXG4gKiBQYXNzaW5nIG1vcmUgdGhhbiBvbmUgZXhwbGljaXRseSBpcyBhIGBDb25maWdFcnJvcmAuIFBhc3NpbmcgYW55IG9uZVxuICogb2YgdGhlbSBzdXBwcmVzc2VzIGV2ZXJ5IGVudi1kZXJpdmVkIGF1dGggZGVmYXVsdCwgc28gYSBjYWxsZXInc1xuICogZXhwbGljaXQgb3ZlcnJpZGUgaXMgbmV2ZXIgc2lsZW50bHkgbWVyZ2VkIHdpdGggZW52IGNyZWRlbnRpYWxzIG9mXG4gKiBhIGRpZmZlcmVudCBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBdXRoIHN1cmZhY2UgYmFzZSB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgZmlyc3QgY2xpZW50X2NyZWRlbnRpYWxzXG4gICAqIG1pbnQuIERlZmF1bHRzIHRvIGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgLlxuICAgKi9cbiAgYXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b21lciBhdXRoIHN1cmZhY2UgYmFzZSB1c2VkIGJ5IGBzZXNzaW9uVG9rZW5gIGV4Y2hhbmdlcy5cbiAgICogRGVmYXVsdHMgdG8gYCR7YmFzZVVybH0vYXV0aC9jdXN0b21lcmAuXG4gICAqL1xuICBjdXN0b21lckF1dGhCYXNlVXJsPzogc3RyaW5nO1xuXG4gIC8vIOKUgOKUgOKUgCBBdXRoIG1vZGVzIChtdXR1YWxseSBleGNsdXNpdmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogT0F1dGgyIGBjbGllbnRfY3JlZGVudGlhbHNgIGNsaWVudElkLiBQYWlyIHdpdGggYHNlcnZpY2VTZWNyZXRgLiAqL1xuICBzZXJ2aWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBPQXV0aDIgYGNsaWVudF9jcmVkZW50aWFsc2AgY2xpZW50U2VjcmV0LiBQYWlyIHdpdGggYHNlcnZpY2VJZGAuICovXG4gIHNlcnZpY2VTZWNyZXQ/OiBzdHJpbmc7XG4gIC8qKiBTcGFjZS1zZXBhcmF0ZWQgc2NvcGUgbGlzdCB0byByZXF1ZXN0IHdoZW4gbWludGluZyB2aWEgY2xpZW50X2NyZWRlbnRpYWxzLiAqL1xuICBzY29wZT86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBCZWFyZXIgSldULCBvciBhc3luYyBjYWxsYmFjayB0aGF0IHJldHVybnMgb25lLiAqL1xuICBhdXRoVG9rZW4/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KTtcbiAgLyoqXG4gICAqIExlZ2FjeSB1RW5nYWdlIHNlc3Npb24gdG9rZW4gKGZyb20gYGFkZG9fY29udGFjdHNfbWFwcGluZy50b2tlbmApLlxuICAgKiBUaGUgU0RLIFBPU1RzIGl0IHRvIGBjdXN0b21lckF1dGhCYXNlVXJsYCB0byBtaW50IGEgSldULCBjYWNoZXMgdGhlXG4gICAqIHJlc3VsdCwgYW5kIHJlLWV4Y2hhbmdlcyBvbiA0MDEgLyBjYWNoZSBtaXNzLlxuICAgKi9cbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGlkZW50aWZpZXIgdGhlIGF1ZGl0IGNsaWVudCBzaG91bGQgc3RhbXAgaW50byBgYWN0b3IudmlhYFxuICAgKiBvbiBlbWl0dGVkIGV2ZW50cy4gRGVmYXVsdHMgdG8gYHNlcnZpY2VJZGAgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAgKiBhdWRpdCBgcmVjb3JkKClgIGNhbGxzIGxvZyBhbiBlcnJvciBhbmQgZHJvcCB0aGUgZXZlbnQuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgZXhwaXJ5QnVmZmVyTXM/OiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1DbGllbnQge1xuICBidXNpbmVzczogQnVzaW5lc3NDbGllbnQ7XG4gIGF1ZGl0OiBBdWRpdENsaWVudDtcbiAgYXV0aDogdHlwZW9mIGF1dGhOYW1lc3BhY2U7XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50LiBXaXRoIG5vIGFyZ3MsIHJlYWRzIGBVRU5HQUdFXypgXG4gKiBlbnYgdmFyczsgZXhwbGljaXQgZmllbGRzIG92ZXJyaWRlIHBlciBjYWxsLiBFYWNoIGNhbGwgZ2V0cyBpdHMgb3duXG4gKiBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZSBkb2VzIG5vdFxuICogc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2VXaXRoRW52KGlucHV0KTtcbiAgd2FybklmQnJvd3NlclNlY3JldChtZXJnZWQpO1xuICByZXR1cm4gYnVpbGRDbGllbnQobWVyZ2VkKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGllbnQoaW5wdXQ6IENsaWVudENvbmZpZyk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgYmFzZVVybCA9IGlucHV0LmJhc2VVcmwgPz8gREVGQVVMVF9CQVNFX1VSTDtcbiAgY29uc3QgdG9rZW5Tb3VyY2VTdGF0ZSA9IHJlc29sdmVUb2tlblNvdXJjZShpbnB1dCwgYmFzZVVybCk7XG4gIGNvbnN0IGF1dGg6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCA9IHRva2VuU291cmNlU3RhdGVcbiAgICA/IHsgdHlwZTogJ3Rva2VuLXNvdXJjZScsIHN0YXRlOiB0b2tlblNvdXJjZVN0YXRlIH1cbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBidXNpbmVzc0NsaWVudCA9IGNyZWF0ZUJ1c2luZXNzQ2xpZW50KHsgYmFzZVVybCwgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiwgYXV0aCB9KTtcbiAgY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVBdWRpdENsaWVudCh7XG4gICAgYmFzZVVybCxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICAgIGF1dGgsXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGlucHV0LnNlcnZpY2VJZCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBidXNpbmVzczogYnVzaW5lc3NDbGllbnQsXG4gICAgYXVkaXQ6IGF1ZGl0Q2xpZW50LFxuICAgIGF1dGg6IGF1dGhOYW1lc3BhY2UsXG4gIH07XG59XG5cbmNvbnN0IEFVVEhfTU9ERV9GSUVMRFMgPSBbXG4gICdzZXJ2aWNlSWQnLFxuICAnc2VydmljZVNlY3JldCcsXG4gICdzY29wZScsXG4gICdhdXRoVG9rZW4nLFxuICAnc2Vzc2lvblRva2VuJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWVyZ2UgZW52LWRlcml2ZWQgZGVmYXVsdHMgd2l0aCB0aGUgY2FsbGVyJ3MgZXhwbGljaXQgaW5wdXQuIEFueVxuICogZXhwbGljaXQgYXV0aC1tb2RlIGZpZWxkIHN1cHByZXNzZXMgKmFsbCogZW52LWRlcml2ZWQgYXV0aCBkZWZhdWx0cyxcbiAqIHNvIGFuIGV4cGxpY2l0IGB7YXV0aFRva2VufWAgb3ZlcnJpZGUgZG9lc24ndCBhY2NpZGVudGFsbHkgaW5oZXJpdFxuICogYHNlcnZpY2VJZGAvYHNlcnZpY2VTZWNyZXRgIGZyb20gZW52LiBOb24tYXV0aCBmaWVsZHMgZmFsbCB0aHJvdWdoXG4gKiBub3JtYWxseSAoY2FsbGVyIGBiYXNlVXJsYCBvdmVycmlkZXMgZW52IGJhc2VVcmw7IGFic2VudCBpbnB1dCBrZWVwc1xuICogZW52IGJhc2VVcmwpLlxuICovXG5mdW5jdGlvbiBtZXJnZVdpdGhFbnYoaW5wdXQ6IENsaWVudENvbmZpZyk6IENsaWVudENvbmZpZyB7XG4gIGNvbnN0IGVudiA9IHJlYWRFbnZEZWZhdWx0cygpO1xuICBjb25zdCBpbnB1dEhhc0F1dGggPSBpbnB1dEhhc0F1dGhNb2RlKGlucHV0KTtcbiAgY29uc3QgZW52Rm9yTWVyZ2UgPSBpbnB1dEhhc0F1dGggPyB3aXRob3V0QXV0aEZpZWxkcyhlbnYpIDogZW52O1xuXG4gIGNvbnN0IG1lcmdlZDogQ2xpZW50Q29uZmlnID0ge1xuICAgIGJhc2VVcmw6IGlucHV0LmJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYmFzZVVybCxcbiAgICBhdXRoQmFzZVVybDogaW5wdXQuYXV0aEJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuYXV0aEJhc2VVcmwsXG4gICAgY3VzdG9tZXJBdXRoQmFzZVVybDogaW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBlbnZGb3JNZXJnZS5jdXN0b21lckF1dGhCYXNlVXJsLFxuICAgIHNlcnZpY2VJZDogaW5wdXQuc2VydmljZUlkID8/IGVudkZvck1lcmdlLnNlcnZpY2VJZCxcbiAgICBzZXJ2aWNlU2VjcmV0OiBpbnB1dC5zZXJ2aWNlU2VjcmV0ID8/IGVudkZvck1lcmdlLnNlcnZpY2VTZWNyZXQsXG4gICAgc2NvcGU6IGlucHV0LnNjb3BlID8/IGVudkZvck1lcmdlLnNjb3BlLFxuICAgIGF1dGhUb2tlbjogaW5wdXQuYXV0aFRva2VuID8/IGVudkZvck1lcmdlLmF1dGhUb2tlbixcbiAgICBzZXNzaW9uVG9rZW46IGlucHV0LnNlc3Npb25Ub2tlbiA/PyBlbnZGb3JNZXJnZS5zZXNzaW9uVG9rZW4sXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGVudkZvck1lcmdlLmFjdG9yVmlhLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcyA/PyBlbnZGb3JNZXJnZS5leHBpcnlCdWZmZXJNcyxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICB9O1xuICBhc3NlcnRFeGFjdGx5T25lQXV0aE1vZGUobWVyZ2VkKTtcbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gcmVhZEVudkRlZmF1bHRzKCk6IENsaWVudENvbmZpZyB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fTtcbiAgY29uc3QgZSA9IChwcm9jZXNzIGFzIHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9KS5lbnYgPz8ge307XG4gIGNvbnN0IGV4cGlyeSA9IGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TID8gTnVtYmVyKGUuVUVOR0FHRV9FWFBJUllfQlVGRkVSX01TKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlLlVFTkdBR0VfQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9BVVRIX0JBU0VfVVJMLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9DVVNUT01FUl9BVVRIX0JBU0VfVVJMLFxuICAgIHNlcnZpY2VJZDogZS5VRU5HQUdFX1NFUlZJQ0VfSUQsXG4gICAgc2VydmljZVNlY3JldDogZS5VRU5HQUdFX1NFUlZJQ0VfU0VDUkVULFxuICAgIHNjb3BlOiBlLlVFTkdBR0VfU0NPUEUsXG4gICAgYXV0aFRva2VuOiBlLlVFTkdBR0VfQVVUSF9UT0tFTixcbiAgICBzZXNzaW9uVG9rZW46IGUuVUVOR0FHRV9TRVNTSU9OX1RPS0VOLFxuICAgIGFjdG9yVmlhOiBlLlVFTkdBR0VfQUNUT1JfVklBLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBOdW1iZXIuaXNGaW5pdGUoZXhwaXJ5KSA/IChleHBpcnkgYXMgbnVtYmVyKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5wdXRIYXNBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBBVVRIX01PREVfRklFTERTLnNvbWUoKGYpID0+IGlucHV0W2ZdICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0QXV0aEZpZWxkcyhjOiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmMsXG4gICAgc2VydmljZUlkOiB1bmRlZmluZWQsXG4gICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgIHNjb3BlOiB1bmRlZmluZWQsXG4gICAgYXV0aFRva2VuOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEV4YWN0bHlPbmVBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IG1vZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoaW5wdXQuYXV0aFRva2VuICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ2F1dGhUb2tlbicpO1xuICBpZiAoaW5wdXQuc2Vzc2lvblRva2VuICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ3Nlc3Npb25Ub2tlbicpO1xuICBpZiAoaW5wdXQuc2VydmljZUlkICE9PSB1bmRlZmluZWQgfHwgaW5wdXQuc2VydmljZVNlY3JldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZXMucHVzaCgnc2VydmljZUlkK3NlcnZpY2VTZWNyZXQnKTtcbiAgfVxuICBpZiAobW9kZXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgIGBjcmVhdGVDbGllbnQ6IHBpY2sgZXhhY3RseSBvbmUgYXV0aCBtb2RlLiBHb3QgJHttb2Rlcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdVc2Ugb25lIG9mIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvblRva2VufS4nLFxuICAgICk7XG4gIH1cbiAgLy8gWmVybyBtb2RlcyBpcyBhbGxvd2VkIOKAlCBjYWxsZXIgbWF5IHdhbnQgYSBmdWxseS1hbm9ueW1vdXMgY2xpZW50IGZvclxuICAvLyBwdWJsaWMgZW5kcG9pbnRzLiBUaGUgZmlyc3QgcmVxdWVzdCB0aGF0IG5lZWRzIGF1dGggd2lsbCBzdXJmYWNlIGFcbiAgLy8gQ29uZmlnRXJyb3IgZG93bnN0cmVhbS5cbn1cblxuLyoqXG4gKiBQT1NUIHRvIHRoZSBjdXN0b21lciBhdXRoIHN1cmZhY2UgdG8gZXhjaGFuZ2UgYSBsZWdhY3kgc2Vzc2lvblxuICogdG9rZW4gZm9yIGEgZnJlc2ggYWNjZXNzIHRva2VuLiBVc2VkIGJ5IGBjcmVhdGVDbGllbnQoeyBzZXNzaW9uVG9rZW4gfSlgLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGNoYW5nZVNlc3Npb25Ub2tlbihcbiAgc2Vzc2lvblRva2VuOiBzdHJpbmcsXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw6IHN0cmluZyxcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hGbihgJHtjdXN0b21lckF1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgZ3JhbnRfdHlwZTogJ3Nlc3Npb25fdG9rZW4nLFxuICAgICAgc2Vzc2lvbl90b2tlbjogc2Vzc2lvblRva2VuLFxuICAgIH0pLnRvU3RyaW5nKCksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICcnKTtcbiAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihgc2Vzc2lvbi10b2tlbiBleGNoYW5nZSBmYWlsZWQ6IEhUVFAgJHtyZXMuc3RhdHVzfSAke3RleHR9YCk7XG4gIH1cbiAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGFjY2Vzc190b2tlbj86IHN0cmluZyB9O1xuICBpZiAoIWpzb24uYWNjZXNzX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdzZXNzaW9uLXRva2VuIGV4Y2hhbmdlIHJlc3BvbnNlIG1pc3NpbmcgYWNjZXNzX3Rva2VuJyk7XG4gIH1cbiAgcmV0dXJuIGpzb24uYWNjZXNzX3Rva2VuO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQ6IENsaWVudENvbmZpZywgYmFzZVVybDogc3RyaW5nKTogVG9rZW5Tb3VyY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGF1dGhCYXNlVXJsID0gaW5wdXQuYXV0aEJhc2VVcmwgPz8gYCR7YmFzZVVybH0vYXV0aC9idXNpbmVzc2A7XG4gIGNvbnN0IGZldGNoRm4gPSBpbnB1dC5mZXRjaEZuID8/IChnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCk7XG5cbiAgaWYgKGlucHV0LmF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hdXRoVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICAgIHsga2luZDogJ3N0YXRpYy1zdHJpbmcnLCB0b2tlbjogaW5wdXQuYXV0aFRva2VuIH0sXG4gICAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7IGtpbmQ6ICdjYWxsYmFjaycsIGdldFRva2VuOiBpbnB1dC5hdXRoVG9rZW4gfSxcbiAgICAgIHsgZXhwaXJ5QnVmZmVyTXM6IGlucHV0LmV4cGlyeUJ1ZmZlck1zLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuIH0sXG4gICAgKTtcbiAgfVxuICBpZiAoaW5wdXQuc2Vzc2lvblRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBjdXN0b21lckF1dGhCYXNlVXJsID0gaW5wdXQuY3VzdG9tZXJBdXRoQmFzZVVybCA/PyBgJHtiYXNlVXJsfS9hdXRoL2N1c3RvbWVyYDtcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBpbnB1dC5zZXNzaW9uVG9rZW47XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnY2FsbGJhY2snLFxuICAgICAgICBnZXRUb2tlbjogKCkgPT4gZXhjaGFuZ2VTZXNzaW9uVG9rZW4oc2Vzc2lvblRva2VuLCBjdXN0b21lckF1dGhCYXNlVXJsLCBmZXRjaEZuKSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlcnZpY2VJZCAmJiBpbnB1dC5zZXJ2aWNlU2VjcmV0KSB7XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscycsXG4gICAgICAgIGNsaWVudElkOiBpbnB1dC5zZXJ2aWNlSWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCxcbiAgICAgICAgYXV0aEJhc2VVcmwsXG4gICAgICAgIHNjb3BlOiBpbnB1dC5zY29wZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3VlbmdhZ2UtcGxhdGZvcm0tc2RrXSBzZXJ2aWNlU2VjcmV0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBicm93c2VyIGVudmlyb25tZW50cy4gJyArXG4gICAgICAgICdTZXJ2aWNlIGNyZWRlbnRpYWxzIGluIGJyb3dzZXIgYnVuZGxlcyBhcmUgcHVibGljbHkgdmlzaWJsZS4gJyArXG4gICAgICAgICdVc2UgYGF1dGhUb2tlbmAgKGEgQmVhcmVyIG9idGFpbmVkIHZpYSBPQXV0aCkgb3IgYHNlc3Npb25Ub2tlbmAgaW5zdGVhZC4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZIQSxvQ0FJQztBQWpJRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLDJDQUFxRTtBQUNyRSxpQ0FBK0M7QUFDL0MsaURBSXdCO0FBQ3hCLHFDQUE0RDtBQTRHNUQsTUFBTSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUUzRDs7Ozs7R0FLRztBQUNILFNBQWdCLFlBQVksQ0FBQyxRQUFzQixFQUFFO0lBQ25ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBbUI7SUFDdEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztJQUNsRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxNQUFNLElBQUksR0FBNkIsZ0JBQWdCO1FBQ3JELENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1FBQ25ELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxNQUFNLGNBQWMsR0FBRyxJQUFBLDZCQUFvQixFQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkYsTUFBTSxXQUFXLEdBQUcsSUFBQSwwQkFBaUIsRUFBQztRQUNwQyxPQUFPO1FBQ1AsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLElBQUk7UUFDSixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsU0FB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RUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUk7WUFDckQsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUMvQixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1NBQ2hDLEVBQ0QsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE1BQW9CO0lBQy9DLE1BQU0sQ0FBQyxHQUFHLFVBQWlELENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU87SUFDdkIsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FDVixtRkFBbUY7WUFDakYsK0RBQStEO1lBQy9ELDBFQUEwRSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlWm9uZXNDbGllbnQsIHR5cGUgWm9uZXNDbGllbnQgfSBmcm9tICcuL3pvbmVzL2NsaWVudCc7XG5pbXBvcnQgeyBhdXRoIGFzIGF1dGhOYW1lc3BhY2UgfSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0IHtcbiAgZ2V0QWNjZXNzVG9rZW4gYXMgcmVzb2x2ZUFjY2Vzc1Rva2VuLFxuICBtYWtlVG9rZW5Tb3VyY2VTdGF0ZSxcbiAgdHlwZSBUb2tlblNvdXJjZVN0YXRlLFxufSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5pbXBvcnQgeyBDb25maWdFcnJvciwgQXV0aGVudGljYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1BdXRoIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgY29uZmlnIGZvciBgY3JlYXRlQ2xpZW50KC4uLilgLlxuICpcbiAqIGBjcmVhdGVDbGllbnQoKWAgKG5vIGFyZ3MpIHJlYWRzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3RhbmRhcmRcbiAqIGBVRU5HQUdFXypgIGVudmlyb25tZW50IHZhcmlhYmxlcyDigJQgY29udmVuaWVudCBmb3IgTGFtYmRhcyB0aGF0XG4gKiBhbHJlYWR5IGhhdmUgdGhlaXIgY29uZmlnIGluamVjdGVkIGJ5IHRoZSBkZXBsb3kgc3RhY2suIEFueSBmaWVsZFxuICogcGFzc2VkIGV4cGxpY2l0bHkgb3ZlcnJpZGVzIHRoZSBtYXRjaGluZyBlbnYgZGVmYXVsdCBmb3IgdGhhdCBvbmVcbiAqIGNhbGwgb25seSAobm8gc2hhcmVkIG11dGFibGUgc3RhdGUsIG5vIHNpbmdsZXRvbikuXG4gKlxuICogQXV0aC1tb2RlIGZpZWxkcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBQaWNrIG9uZTpcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscy5cbiAqICAgLSBgYXV0aFRva2VuYCAgICAgICAgICAgICAgICAgICAgc3RhdGljIEJlYXJlciB0b2tlbiwgb3IgYXN5bmNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgdGhhdCByZXR1cm5zIG9uZS5cbiAqICAgLSBgc2Vzc2lvbjoge2lkLCB0b2tlbn1gICAgICAgICAgbGVnYWN5IHVFbmdhZ2UgKGlkLCBhcGlUb2tlbikgL1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWQsIGFkZG9fY29udGFjdHNfbWFwcGluZy50b2tlbilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpci4gVGhlIFNESyBwcm9iZXMgdGhlIGJ1c2luZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgKHVzZXJzKSBmaXJzdCwgZmFsbHMgYmFja1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3VzdG9tZXIgc3VyZmFjZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkb19jb250YWN0c19tYXBwaW5nKSBpZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3MgcHJvYmUgcmV0dXJuc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgaW52YWxpZF9ncmFudGAsIGFuZCBjYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBKV1QuXG4gKlxuICogUGFzc2luZyBtb3JlIHRoYW4gb25lIGV4cGxpY2l0bHkgaXMgYSBgQ29uZmlnRXJyb3JgLiBQYXNzaW5nIGFueSBvbmVcbiAqIG9mIHRoZW0gc3VwcHJlc3NlcyBldmVyeSBlbnYtZGVyaXZlZCBhdXRoIGRlZmF1bHQsIHNvIGEgY2FsbGVyJ3NcbiAqIGV4cGxpY2l0IG92ZXJyaWRlIGlzIG5ldmVyIHNpbGVudGx5IG1lcmdlZCB3aXRoIGVudiBjcmVkZW50aWFscyBvZlxuICogYSBkaWZmZXJlbnQgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRDb25maWcge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogQXV0aCBzdXJmYWNlIGJhc2UgdXNlZCB0byBib290c3RyYXAgdGhlIGZpcnN0IGNsaWVudF9jcmVkZW50aWFsc1xuICAgKiBtaW50LiBEZWZhdWx0cyB0byBgJHtiYXNlVXJsfS9hdXRoL2J1c2luZXNzYC5cbiAgICovXG4gIGF1dGhCYXNlVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tZXIgYXV0aCBzdXJmYWNlIGJhc2UgdXNlZCBieSBgc2Vzc2lvbmAgZXhjaGFuZ2VzLiBEZWZhdWx0cyB0b1xuICAgKiBgJHtiYXNlVXJsfS9hdXRoL2N1c3RvbWVyYC5cbiAgICovXG4gIGN1c3RvbWVyQXV0aEJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLy8g4pSA4pSA4pSAIEF1dGggbW9kZXMgKG11dHVhbGx5IGV4Y2x1c2l2ZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBPQXV0aDIgYGNsaWVudF9jcmVkZW50aWFsc2AgY2xpZW50SWQuIFBhaXIgd2l0aCBgc2VydmljZVNlY3JldGAuICovXG4gIHNlcnZpY2VJZD86IHN0cmluZztcbiAgLyoqIE9BdXRoMiBgY2xpZW50X2NyZWRlbnRpYWxzYCBjbGllbnRTZWNyZXQuIFBhaXIgd2l0aCBgc2VydmljZUlkYC4gKi9cbiAgc2VydmljZVNlY3JldD86IHN0cmluZztcbiAgLyoqIFNwYWNlLXNlcGFyYXRlZCBzY29wZSBsaXN0IHRvIHJlcXVlc3Qgd2hlbiBtaW50aW5nIHZpYSBjbGllbnRfY3JlZGVudGlhbHMuICovXG4gIHNjb3BlPzogc3RyaW5nO1xuICAvKiogU3RhdGljIEJlYXJlciBKV1QsIG9yIGFzeW5jIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBvbmUuICovXG4gIGF1dGhUb2tlbj86IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4pO1xuICAvKipcbiAgICogTGVnYWN5IHVFbmdhZ2UgKGlkLCB0b2tlbikgcGFpci4gYGlkYCBpcyBgdXNlcnMudXNlcklkYCBmb3Igc3RhZmZcbiAgICogdXNlcnMgKG1hdGNoZWQgdmlhIHRoZSBidXNpbmVzcyBzdXJmYWNlKSBvclxuICAgKiBgYWRkb19jb250YWN0c19tYXBwaW5nLmlkYC9gY29udGFjdElkYCBmb3IgY3VzdG9tZXJzIChtYXRjaGVkIHZpYVxuICAgKiB0aGUgY3VzdG9tZXIgc3VyZmFjZSkuIFRoZSBTREsgcHJvYmVzIHRoZSBidXNpbmVzcyBzdXJmYWNlIGZpcnN0XG4gICAqIGFuZCBmYWxscyBiYWNrIHRvIGN1c3RvbWVyIG9uIGBpbnZhbGlkX2dyYW50YC5cbiAgICovXG4gIHNlc3Npb24/OiB7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHRva2VuOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIGAoYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbilgIHBhaXIgZnJvbSBhIGZpbmlzaGVkIGxvZ2luIGZsb3dcbiAgICogKGBhdXRoLmxvZ2luV2l0aFBhc3N3b3JkKC4uLilgLCBgYXV0aC52ZXJpZnlPdHAoLi4uKWAsIGV0YykuIFRoZVxuICAgKiBTREsgdXNlcyB0aGUgYWNjZXNzIHRva2VuIHVudGlsIGl0IGV4cGlyZXMsIHRoZW4gcm90YXRlcyB2aWFcbiAgICogYGF1dGgucmVmcmVzaCguLi4pYCB0cmFuc3BhcmVudGx5LiBgb25Sb3RhdGVgIGZpcmVzIGFmdGVyIGV2ZXJ5XG4gICAqIHJvdGF0aW9uIHNvIGNhbGxlcnMgY2FuIHBlcnNpc3QgdGhlIG5ldyBwYWlyLlxuICAgKi9cbiAgdG9rZW5zPzoge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgLyoqIEFjY2VzcyB0b2tlbiBUVEwgKHNlY29uZHMpLCBhcyByZXR1cm5lZCBieSB0aGUgYXV0aCBzdXJmYWNlLiAqL1xuICAgIGV4cGlyZXNJbjogbnVtYmVyO1xuICAgIC8qKiBPQXV0aCBjbGllbnQgaWQgdXNlZCBkdXJpbmcgdGhlIG9yaWdpbmFsIGxvZ2luIChyZXF1aXJlZCBieSB0aGUgcmVmcmVzaCBoYW5kbGVyKS4gKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIG9uUm90YXRlPzogKHBhaXI6IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICAgIGV4cGlyZXNBdDogbnVtYmVyO1xuICAgIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGlkZW50aWZpZXIgdGhlIGF1ZGl0IGNsaWVudCBzaG91bGQgc3RhbXAgaW50byBgYWN0b3IudmlhYFxuICAgKiBvbiBlbWl0dGVkIGV2ZW50cy4gRGVmYXVsdHMgdG8gYHNlcnZpY2VJZGAgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAgKiBhdWRpdCBgcmVjb3JkKClgIGNhbGxzIGxvZyBhbiBlcnJvciBhbmQgZHJvcCB0aGUgZXZlbnQuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgZXhwaXJ5QnVmZmVyTXM/OiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1DbGllbnQge1xuICBidXNpbmVzczogQnVzaW5lc3NDbGllbnQ7XG4gIGF1ZGl0OiBBdWRpdENsaWVudDtcbiAgem9uZXM6IFpvbmVzQ2xpZW50O1xuICBhdXRoOiB0eXBlb2YgYXV0aE5hbWVzcGFjZTtcbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGN1cnJlbnQgYWNjZXNzIHRva2VuLCBtaW50aW5nIHZpYSB0aGUgY29uZmlndXJlZCBhdXRoXG4gICAqIG1vZGUgaWYgdGhlIGNhY2hlIGlzIGNvbGQuIFVzZWZ1bCBmb3IgYGF1dGgudmVyaWZ5QWNjZXNzVG9rZW4oLi4uKWBcbiAgICogcm91bmQtdHJpcHMgYW5kIGZvciBjYWxsZXJzIHRoYXQgd2FudCB0byBsb2cgLyBmb3J3YXJkIHRoZSBiZWFyZXJcbiAgICogdG8gYSBkb3duc3RyZWFtIHNlcnZpY2UuXG4gICAqXG4gICAqIFRocm93cyBgQ29uZmlnRXJyb3JgIHdoZW4gdGhlIGNsaWVudCB3YXMgYnVpbHQgd2l0aCBubyBhdXRoIG1vZGUuXG4gICAqL1xuICBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50LiBXaXRoIG5vIGFyZ3MsIHJlYWRzIGBVRU5HQUdFXypgXG4gKiBlbnYgdmFyczsgZXhwbGljaXQgZmllbGRzIG92ZXJyaWRlIHBlciBjYWxsLiBFYWNoIGNhbGwgZ2V0cyBpdHMgb3duXG4gKiBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZSBkb2VzIG5vdFxuICogc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2VXaXRoRW52KGlucHV0KTtcbiAgd2FybklmQnJvd3NlclNlY3JldChtZXJnZWQpO1xuICByZXR1cm4gYnVpbGRDbGllbnQobWVyZ2VkKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGllbnQoaW5wdXQ6IENsaWVudENvbmZpZyk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgY29uc3QgYmFzZVVybCA9IGlucHV0LmJhc2VVcmwgPz8gREVGQVVMVF9CQVNFX1VSTDtcbiAgY29uc3QgdG9rZW5Tb3VyY2VTdGF0ZSA9IHJlc29sdmVUb2tlblNvdXJjZShpbnB1dCwgYmFzZVVybCk7XG4gIGNvbnN0IGF1dGg6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCA9IHRva2VuU291cmNlU3RhdGVcbiAgICA/IHsgdHlwZTogJ3Rva2VuLXNvdXJjZScsIHN0YXRlOiB0b2tlblNvdXJjZVN0YXRlIH1cbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBidXNpbmVzc0NsaWVudCA9IGNyZWF0ZUJ1c2luZXNzQ2xpZW50KHsgYmFzZVVybCwgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiwgYXV0aCB9KTtcbiAgY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVBdWRpdENsaWVudCh7XG4gICAgYmFzZVVybCxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICAgIGF1dGgsXG4gICAgYWN0b3JWaWE6IGlucHV0LmFjdG9yVmlhID8/IGlucHV0LnNlcnZpY2VJZCxcbiAgfSk7XG4gIGNvbnN0IHpvbmVzQ2xpZW50ID0gY3JlYXRlWm9uZXNDbGllbnQoeyBiYXNlVXJsLCBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLCBhdXRoIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYnVzaW5lc3M6IGJ1c2luZXNzQ2xpZW50LFxuICAgIGF1ZGl0OiBhdWRpdENsaWVudCxcbiAgICB6b25lczogem9uZXNDbGllbnQsXG4gICAgYXV0aDogYXV0aE5hbWVzcGFjZSxcbiAgICBnZXRBY2Nlc3NUb2tlbjogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0b2tlblNvdXJjZVN0YXRlKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgICAgICAnZ2V0QWNjZXNzVG9rZW46IG5vIGF1dGggbW9kZSBjb25maWd1cmVkLiBQYXNzIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvbn0uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlQWNjZXNzVG9rZW4odG9rZW5Tb3VyY2VTdGF0ZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgQVVUSF9NT0RFX0ZJRUxEUyA9IFtcbiAgJ3NlcnZpY2VJZCcsXG4gICdzZXJ2aWNlU2VjcmV0JyxcbiAgJ3Njb3BlJyxcbiAgJ2F1dGhUb2tlbicsXG4gICdzZXNzaW9uJyxcbiAgJ3Rva2VucycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1lcmdlIGVudi1kZXJpdmVkIGRlZmF1bHRzIHdpdGggdGhlIGNhbGxlcidzIGV4cGxpY2l0IGlucHV0LiBBbnlcbiAqIGV4cGxpY2l0IGF1dGgtbW9kZSBmaWVsZCBzdXBwcmVzc2VzICphbGwqIGVudi1kZXJpdmVkIGF1dGggZGVmYXVsdHMsXG4gKiBzbyBhbiBleHBsaWNpdCBge2F1dGhUb2tlbn1gIG92ZXJyaWRlIGRvZXNuJ3QgYWNjaWRlbnRhbGx5IGluaGVyaXRcbiAqIGBzZXJ2aWNlSWRgL2BzZXJ2aWNlU2VjcmV0YCBmcm9tIGVudi4gTm9uLWF1dGggZmllbGRzIGZhbGwgdGhyb3VnaFxuICogbm9ybWFsbHkgKGNhbGxlciBgYmFzZVVybGAgb3ZlcnJpZGVzIGVudiBiYXNlVXJsOyBhYnNlbnQgaW5wdXQga2VlcHNcbiAqIGVudiBiYXNlVXJsKS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VXaXRoRW52KGlucHV0OiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICBjb25zdCBlbnYgPSByZWFkRW52RGVmYXVsdHMoKTtcbiAgY29uc3QgaW5wdXRIYXNBdXRoID0gaW5wdXRIYXNBdXRoTW9kZShpbnB1dCk7XG4gIGNvbnN0IGVudkZvck1lcmdlID0gaW5wdXRIYXNBdXRoID8gd2l0aG91dEF1dGhGaWVsZHMoZW52KSA6IGVudjtcblxuICBjb25zdCBtZXJnZWQ6IENsaWVudENvbmZpZyA9IHtcbiAgICBiYXNlVXJsOiBpbnB1dC5iYXNlVXJsID8/IGVudkZvck1lcmdlLmJhc2VVcmwsXG4gICAgYXV0aEJhc2VVcmw6IGlucHV0LmF1dGhCYXNlVXJsID8/IGVudkZvck1lcmdlLmF1dGhCYXNlVXJsLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGlucHV0LmN1c3RvbWVyQXV0aEJhc2VVcmwgPz8gZW52Rm9yTWVyZ2UuY3VzdG9tZXJBdXRoQmFzZVVybCxcbiAgICBzZXJ2aWNlSWQ6IGlucHV0LnNlcnZpY2VJZCA/PyBlbnZGb3JNZXJnZS5zZXJ2aWNlSWQsXG4gICAgc2VydmljZVNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCA/PyBlbnZGb3JNZXJnZS5zZXJ2aWNlU2VjcmV0LFxuICAgIHNjb3BlOiBpbnB1dC5zY29wZSA/PyBlbnZGb3JNZXJnZS5zY29wZSxcbiAgICBhdXRoVG9rZW46IGlucHV0LmF1dGhUb2tlbiA/PyBlbnZGb3JNZXJnZS5hdXRoVG9rZW4sXG4gICAgc2Vzc2lvbjogaW5wdXQuc2Vzc2lvbiA/PyBlbnZGb3JNZXJnZS5zZXNzaW9uLFxuICAgIHRva2VuczogaW5wdXQudG9rZW5zLFxuICAgIGFjdG9yVmlhOiBpbnB1dC5hY3RvclZpYSA/PyBlbnZGb3JNZXJnZS5hY3RvclZpYSxcbiAgICBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMgPz8gZW52Rm9yTWVyZ2UuZXhwaXJ5QnVmZmVyTXMsXG4gICAgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbixcbiAgfTtcbiAgYXNzZXJ0RXhhY3RseU9uZUF1dGhNb2RlKG1lcmdlZCk7XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRFbnZEZWZhdWx0cygpOiBDbGllbnRDb25maWcge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSByZXR1cm4ge307XG4gIGNvbnN0IGUgPSAocHJvY2VzcyBhcyB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSkuZW52ID8/IHt9O1xuICBjb25zdCBleHBpcnkgPSBlLlVFTkdBR0VfRVhQSVJZX0JVRkZFUl9NUyA/IE51bWJlcihlLlVFTkdBR0VfRVhQSVJZX0JVRkZFUl9NUykgOiB1bmRlZmluZWQ7XG4gIC8vIFVFTkdBR0VfU0VTU0lPTl9JRCArIFVFTkdBR0VfU0VTU0lPTl9UT0tFTiBtdXN0IGJlIHBhaXJlZDsgZWl0aGVyIGFsb25lIGlzIGlnbm9yZWRcbiAgLy8gc28gYW4gZW52LW9ubHkgc2V0dXAgbmV2ZXIgcHJvZHVjZXMgYSBoYWxmLWNvbmZpZ3VyZWQgc2Vzc2lvbi5cbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgZS5VRU5HQUdFX1NFU1NJT05fSUQgJiYgZS5VRU5HQUdFX1NFU1NJT05fVE9LRU5cbiAgICAgID8geyBpZDogZS5VRU5HQUdFX1NFU1NJT05fSUQsIHRva2VuOiBlLlVFTkdBR0VfU0VTU0lPTl9UT0tFTiB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlLlVFTkdBR0VfQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9BVVRIX0JBU0VfVVJMLFxuICAgIGN1c3RvbWVyQXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9DVVNUT01FUl9BVVRIX0JBU0VfVVJMLFxuICAgIHNlcnZpY2VJZDogZS5VRU5HQUdFX1NFUlZJQ0VfSUQsXG4gICAgc2VydmljZVNlY3JldDogZS5VRU5HQUdFX1NFUlZJQ0VfU0VDUkVULFxuICAgIHNjb3BlOiBlLlVFTkdBR0VfU0NPUEUsXG4gICAgYXV0aFRva2VuOiBlLlVFTkdBR0VfQVVUSF9UT0tFTixcbiAgICBzZXNzaW9uLFxuICAgIGFjdG9yVmlhOiBlLlVFTkdBR0VfQUNUT1JfVklBLFxuICAgIGV4cGlyeUJ1ZmZlck1zOiBOdW1iZXIuaXNGaW5pdGUoZXhwaXJ5KSA/IChleHBpcnkgYXMgbnVtYmVyKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5wdXRIYXNBdXRoTW9kZShpbnB1dDogQ2xpZW50Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBBVVRIX01PREVfRklFTERTLnNvbWUoKGYpID0+IGlucHV0W2ZdICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0QXV0aEZpZWxkcyhjOiBDbGllbnRDb25maWcpOiBDbGllbnRDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmMsXG4gICAgc2VydmljZUlkOiB1bmRlZmluZWQsXG4gICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgIHNjb3BlOiB1bmRlZmluZWQsXG4gICAgYXV0aFRva2VuOiB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbjogdW5kZWZpbmVkLFxuICAgIHRva2VuczogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRFeGFjdGx5T25lQXV0aE1vZGUoaW5wdXQ6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBtb2Rlczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGlucHV0LmF1dGhUb2tlbiAhPT0gdW5kZWZpbmVkKSBtb2Rlcy5wdXNoKCdhdXRoVG9rZW4nKTtcbiAgaWYgKGlucHV0LnNlc3Npb24gIT09IHVuZGVmaW5lZCkgbW9kZXMucHVzaCgnc2Vzc2lvbicpO1xuICBpZiAoaW5wdXQudG9rZW5zICE9PSB1bmRlZmluZWQpIG1vZGVzLnB1c2goJ3Rva2VucycpO1xuICBpZiAoaW5wdXQuc2VydmljZUlkICE9PSB1bmRlZmluZWQgfHwgaW5wdXQuc2VydmljZVNlY3JldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZXMucHVzaCgnc2VydmljZUlkK3NlcnZpY2VTZWNyZXQnKTtcbiAgfVxuICBpZiAobW9kZXMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBDb25maWdFcnJvcihcbiAgICAgIGBjcmVhdGVDbGllbnQ6IHBpY2sgZXhhY3RseSBvbmUgYXV0aCBtb2RlLiBHb3QgJHttb2Rlcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdVc2Ugb25lIG9mIHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9IHwge2F1dGhUb2tlbn0gfCB7c2Vzc2lvbn0gfCB7dG9rZW5zfS4nLFxuICAgICk7XG4gIH1cbiAgLy8gWmVybyBtb2RlcyBpcyBhbGxvd2VkIOKAlCBjYWxsZXIgbWF5IHdhbnQgYSBmdWxseS1hbm9ueW1vdXMgY2xpZW50IGZvclxuICAvLyBwdWJsaWMgZW5kcG9pbnRzLiBUaGUgZmlyc3QgcmVxdWVzdCB0aGF0IG5lZWRzIGF1dGggd2lsbCBzdXJmYWNlIGFcbiAgLy8gQ29uZmlnRXJyb3IgZG93bnN0cmVhbS5cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgYnVzaW5lc3MgYGxlZ2FjeV9zZXNzaW9uYCBncmFudCBmaXJzdCwgZmFsbCBiYWNrIHRvIGN1c3RvbWVyXG4gKiBvbiBgaW52YWxpZF9ncmFudGAuIEVpdGhlciBzdXJmYWNlIG1pbnRzIGEgSldUIOKAlCB0aGUgU0RLIGRvZXNuJ3QgY2FyZVxuICogd2hpY2ggc2lkZSBhbnN3ZXJlZC5cbiAqXG4gKiBXaHkgcHJvYmUgYm90aDogYGlkYCAobnVtZXJpYykgb3ZlcmxhcHMgdXNlcnMudXNlcklkIHZzXG4gKiBhZGRvX2NvbnRhY3RzX21hcHBpbmcuaWQvY29udGFjdElkLiBDYWxsZXJzIHVzdWFsbHkgZG9uJ3Qga25vdyB3aGljaFxuICogdGFibGUgdGhlaXIgKGlkLCB0b2tlbikgcGFpciBiZWxvbmdzIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGNoYW5nZUxlZ2FjeVNlc3Npb24oXG4gIHNlc3Npb246IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdG9rZW46IHN0cmluZyB9LFxuICBhdXRoQmFzZVVybDogc3RyaW5nLFxuICBjdXN0b21lckF1dGhCYXNlVXJsOiBzdHJpbmcsXG4gIGZldGNoRm46IHR5cGVvZiBmZXRjaCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJvZHkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICBncmFudF90eXBlOiAnbGVnYWN5X3Nlc3Npb24nLFxuICAgIGlkOiBTdHJpbmcoc2Vzc2lvbi5pZCksXG4gICAgdG9rZW46IHNlc3Npb24udG9rZW4sXG4gIH0pLnRvU3RyaW5nKCk7XG5cbiAgY29uc3QgYnVzaW5lc3NSZXMgPSBhd2FpdCBmZXRjaEZuKGAke2F1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgIGJvZHksXG4gIH0pO1xuICBpZiAoYnVzaW5lc3NSZXMub2spIHtcbiAgICByZXR1cm4gcGFyc2VBY2Nlc3NUb2tlbihidXNpbmVzc1Jlcyk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzSW52YWxpZEdyYW50KGJ1c2luZXNzUmVzKSkge1xuICAgIGNvbnN0IGN1c3RvbWVyUmVzID0gYXdhaXQgZmV0Y2hGbihgJHtjdXN0b21lckF1dGhCYXNlVXJsfS9vYXV0aC90b2tlbmAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gICAgaWYgKGN1c3RvbWVyUmVzLm9rKSB7XG4gICAgICByZXR1cm4gcGFyc2VBY2Nlc3NUb2tlbihjdXN0b21lclJlcyk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCBjdXN0b21lclJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKFxuICAgICAgYGxlZ2FjeV9zZXNzaW9uIGV4Y2hhbmdlIGZhaWxlZCBvbiBib3RoIHN1cmZhY2VzOiBjdXN0b21lciBIVFRQICR7Y3VzdG9tZXJSZXMuc3RhdHVzfSAke3RleHR9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHRleHQgPSBhd2FpdCBidXNpbmVzc1Jlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihcbiAgICBgbGVnYWN5X3Nlc3Npb24gZXhjaGFuZ2UgZmFpbGVkOiBIVFRQICR7YnVzaW5lc3NSZXMuc3RhdHVzfSAke3RleHR9YCxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNJbnZhbGlkR3JhbnQocmVzOiBSZXNwb25zZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocmVzLnN0YXR1cyAhPT0gNDAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNsb25lZCA9IHJlcy5jbG9uZSgpO1xuICBjb25zdCBqc29uID0gKGF3YWl0IGNsb25lZC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIGpzb24uZXJyb3IgPT09ICdpbnZhbGlkX2dyYW50Jztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VBY2Nlc3NUb2tlbihyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGFjY2Vzc190b2tlbj86IHN0cmluZyB9O1xuICBpZiAoIWpzb24uYWNjZXNzX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdsZWdhY3lfc2Vzc2lvbiBleGNoYW5nZSByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICB9XG4gIHJldHVybiBqc29uLmFjY2Vzc190b2tlbjtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRva2VuU291cmNlKGlucHV0OiBDbGllbnRDb25maWcsIGJhc2VVcmw6IHN0cmluZyk6IFRva2VuU291cmNlU3RhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdXRoQmFzZVVybCA9IGlucHV0LmF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgO1xuICBjb25zdCBmZXRjaEZuID0gaW5wdXQuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpO1xuXG4gIGlmIChpbnB1dC5hdXRoVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQuYXV0aFRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAgICB7IGtpbmQ6ICdzdGF0aWMtc3RyaW5nJywgdG9rZW46IGlucHV0LmF1dGhUb2tlbiB9LFxuICAgICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAgeyBraW5kOiAnY2FsbGJhY2snLCBnZXRUb2tlbjogaW5wdXQuYXV0aFRva2VuIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlc3Npb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGN1c3RvbWVyQXV0aEJhc2VVcmwgPSBpbnB1dC5jdXN0b21lckF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvY3VzdG9tZXJgO1xuICAgIGNvbnN0IHNlc3Npb24gPSBpbnB1dC5zZXNzaW9uO1xuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ2NhbGxiYWNrJyxcbiAgICAgICAgZ2V0VG9rZW46ICgpID0+IGV4Y2hhbmdlTGVnYWN5U2Vzc2lvbihzZXNzaW9uLCBhdXRoQmFzZVVybCwgY3VzdG9tZXJBdXRoQmFzZVVybCwgZmV0Y2hGbiksXG4gICAgICB9LFxuICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICApO1xuICB9XG4gIGlmIChpbnB1dC5zZXJ2aWNlSWQgJiYgaW5wdXQuc2VydmljZVNlY3JldCkge1xuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ3NlcnZpY2UtY3JlZGVudGlhbHMnLFxuICAgICAgICBjbGllbnRJZDogaW5wdXQuc2VydmljZUlkLFxuICAgICAgICBjbGllbnRTZWNyZXQ6IGlucHV0LnNlcnZpY2VTZWNyZXQsXG4gICAgICAgIGF1dGhCYXNlVXJsLFxuICAgICAgICBzY29wZTogaW5wdXQuc2NvcGUsXG4gICAgICB9LFxuICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICApO1xuICB9XG4gIGlmIChpbnB1dC50b2tlbnMpIHtcbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7XG4gICAgICAgIGtpbmQ6ICdhY2Nlc3MtcmVmcmVzaC1wYWlyJyxcbiAgICAgICAgYWNjZXNzVG9rZW46IGlucHV0LnRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBpbnB1dC50b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBpbnB1dC50b2tlbnMuZXhwaXJlc0luICogMTAwMCxcbiAgICAgICAgY2xpZW50SWQ6IGlucHV0LnRva2Vucy5jbGllbnRJZCxcbiAgICAgICAgb25Sb3RhdGU6IGlucHV0LnRva2Vucy5vblJvdGF0ZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3VlbmdhZ2UtcGxhdGZvcm0tc2RrXSBzZXJ2aWNlU2VjcmV0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBicm93c2VyIGVudmlyb25tZW50cy4gJyArXG4gICAgICAgICdTZXJ2aWNlIGNyZWRlbnRpYWxzIGluIGJyb3dzZXIgYnVuZGxlcyBhcmUgcHVibGljbHkgdmlzaWJsZS4gJyArXG4gICAgICAgICdVc2UgYGF1dGhUb2tlbmAgKGEgQmVhcmVyIG9idGFpbmVkIHZpYSBPQXV0aCkgb3IgYHNlc3Npb25Ub2tlbmAgaW5zdGVhZC4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/http.d.ts
CHANGED
|
@@ -22,3 +22,25 @@ export interface SignedHeaderParams {
|
|
|
22
22
|
* and refreshes on expiry / 401
|
|
23
23
|
*/
|
|
24
24
|
export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Promise<Record<string, string>>;
|
|
25
|
+
export interface SendRequestParams {
|
|
26
|
+
method: string;
|
|
27
|
+
/** URL pathname only, without query string. Must match `c.req.path` server-side. */
|
|
28
|
+
path: string;
|
|
29
|
+
/** Fully-qualified URL the fetch is sent to (base + path + querystring). */
|
|
30
|
+
url: string;
|
|
31
|
+
/** Raw JSON body string, or undefined for none. */
|
|
32
|
+
body?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Send a request with the SDK's standard 401-retry-once behaviour.
|
|
36
|
+
*
|
|
37
|
+
* Only retries when auth is `token-source`, since that's the case
|
|
38
|
+
* where the cached token may have expired server-side. HMAC and
|
|
39
|
+
* static bearer 401s mean the auth is misconfigured and a retry
|
|
40
|
+
* would just fail again. Bubble the response so the caller surfaces it.
|
|
41
|
+
*
|
|
42
|
+
* Shared by every namespace client (business, audit, zones, ...) so
|
|
43
|
+
* the retry semantics are uniform. Lifted out of `business/client.ts`
|
|
44
|
+
* with no behaviour change.
|
|
45
|
+
*/
|
|
46
|
+
export declare function sendWithAuthRetry(config: PlatformConfig, params: SendRequestParams): Promise<Response>;
|
package/dist/http.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildHeaders = buildHeaders;
|
|
4
|
+
exports.sendWithAuthRetry = sendWithAuthRetry;
|
|
4
5
|
const node_crypto_1 = require("node:crypto");
|
|
5
6
|
const token_source_1 = require("./token-source");
|
|
6
7
|
const version_1 = require("./version");
|
|
@@ -40,4 +41,41 @@ async function buildHeaders(config, params) {
|
|
|
40
41
|
headers['authorization'] = `Bearer ${token}`;
|
|
41
42
|
return headers;
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Send a request with the SDK's standard 401-retry-once behaviour.
|
|
46
|
+
*
|
|
47
|
+
* Only retries when auth is `token-source`, since that's the case
|
|
48
|
+
* where the cached token may have expired server-side. HMAC and
|
|
49
|
+
* static bearer 401s mean the auth is misconfigured and a retry
|
|
50
|
+
* would just fail again. Bubble the response so the caller surfaces it.
|
|
51
|
+
*
|
|
52
|
+
* Shared by every namespace client (business, audit, zones, ...) so
|
|
53
|
+
* the retry semantics are uniform. Lifted out of `business/client.ts`
|
|
54
|
+
* with no behaviour change.
|
|
55
|
+
*/
|
|
56
|
+
async function sendWithAuthRetry(config, params) {
|
|
57
|
+
const headers = await buildHeaders(config, {
|
|
58
|
+
method: params.method,
|
|
59
|
+
path: params.path,
|
|
60
|
+
body: params.body,
|
|
61
|
+
});
|
|
62
|
+
const res = await config.fetchFn(params.url, {
|
|
63
|
+
method: params.method,
|
|
64
|
+
headers,
|
|
65
|
+
body: params.body,
|
|
66
|
+
});
|
|
67
|
+
if (res.status !== 401 || config.auth?.type !== 'token-source')
|
|
68
|
+
return res;
|
|
69
|
+
(0, token_source_1.invalidateToken)(config.auth.state);
|
|
70
|
+
const retryHeaders = await buildHeaders(config, {
|
|
71
|
+
method: params.method,
|
|
72
|
+
path: params.path,
|
|
73
|
+
body: params.body,
|
|
74
|
+
});
|
|
75
|
+
return config.fetchFn(params.url, {
|
|
76
|
+
method: params.method,
|
|
77
|
+
headers: retryHeaders,
|
|
78
|
+
body: params.body,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9DQXVCQztBQXdCRCw4Q0EwQkM7QUF2R0QsNkNBQXlDO0FBRXpDLGlEQUFpRTtBQUNqRSx1Q0FBd0M7QUFVeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUFzQixFQUN0QixNQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBMkI7UUFDdEMsWUFBWSxFQUFFLHdCQUF3QixxQkFBVyxFQUFFO0tBQ3BELENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztJQUM1RSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFakMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLDZCQUFjLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztJQUM3QyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBWUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLE1BQXNCLEVBQ3RCLE1BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sRUFBRTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUMzQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTztRQUNQLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLGNBQWM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMzRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiwgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdFBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogRnVsbHktcXVhbGlmaWVkIFVSTCB0aGUgZmV0Y2ggaXMgc2VudCB0byAoYmFzZSArIHBhdGggKyBxdWVyeXN0cmluZykuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS4gKi9cbiAgYm9keT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZW5kIGEgcmVxdWVzdCB3aXRoIHRoZSBTREsncyBzdGFuZGFyZCA0MDEtcmV0cnktb25jZSBiZWhhdmlvdXIuXG4gKlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGUuIEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uIEJ1YmJsZSB0aGUgcmVzcG9uc2Ugc28gdGhlIGNhbGxlciBzdXJmYWNlcyBpdC5cbiAqXG4gKiBTaGFyZWQgYnkgZXZlcnkgbmFtZXNwYWNlIGNsaWVudCAoYnVzaW5lc3MsIGF1ZGl0LCB6b25lcywgLi4uKSBzb1xuICogdGhlIHJldHJ5IHNlbWFudGljcyBhcmUgdW5pZm9ybS4gTGlmdGVkIG91dCBvZiBgYnVzaW5lc3MvY2xpZW50LnRzYFxuICogd2l0aCBubyBiZWhhdmlvdXIgY2hhbmdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFdpdGhBdXRoUmV0cnkoXG4gIGNvbmZpZzogUGxhdGZvcm1Db25maWcsXG4gIHBhcmFtczogU2VuZFJlcXVlc3RQYXJhbXMsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSB8fCBjb25maWcuYXV0aD8udHlwZSAhPT0gJ3Rva2VuLXNvdXJjZScpIHJldHVybiByZXM7XG4gIGludmFsaWRhdGVUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGNvbnN0IHJldHJ5SGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICByZXR1cm4gY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzOiByZXRyeUhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xufVxuIl19
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
exports.createClient = exports.DEFAULT_BASE_URL = exports.auth = void 0;
|
|
18
18
|
__exportStar(require("./audit"), exports);
|
|
19
19
|
__exportStar(require("./business"), exports);
|
|
20
|
+
__exportStar(require("./zones"), exports);
|
|
20
21
|
__exportStar(require("./errors"), exports);
|
|
21
22
|
var auth_1 = require("./auth");
|
|
22
23
|
Object.defineProperty(exports, "auth", { enumerable: true, get: function () { return auth_1.auth; } });
|
|
@@ -24,4 +25,4 @@ var config_1 = require("./config");
|
|
|
24
25
|
Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return config_1.DEFAULT_BASE_URL; } });
|
|
25
26
|
var client_1 = require("./client");
|
|
26
27
|
Object.defineProperty(exports, "createClient", { enumerable: true, get: function () { return client_1.createClient; } });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsNkNBQTJCO0FBQzNCLDBDQUF3QjtBQUN4QiwyQ0FBeUI7QUFDekIsK0JBQThCO0FBQXJCLDRGQUFBLElBQUksT0FBQTtBQVFiLG1DQU1rQjtBQURoQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUVsQixtQ0FBZ0Y7QUFBdkUsc0dBQUEsWUFBWSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hdWRpdCc7XG5leHBvcnQgKiBmcm9tICcuL2J1c2luZXNzJztcbmV4cG9ydCAqIGZyb20gJy4vem9uZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuZXhwb3J0IHsgYXV0aCB9IGZyb20gJy4vYXV0aCc7XG5leHBvcnQgdHlwZSB7XG4gIFBrY2VQYWlyLFxuICBBdXRob3JpemVVcmxJbnB1dCxcbiAgRXhjaGFuZ2VDb2RlSW5wdXQsXG4gIFJlZnJlc2hJbnB1dCxcbiAgVG9rZW5QYWlyLFxufSBmcm9tICcuL2F1dGgnO1xuZXhwb3J0IHtcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWcsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbiAgREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0IHsgY3JlYXRlQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZywgdHlwZSBQbGF0Zm9ybUNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbiJdfQ==
|
package/dist/token-source.d.ts
CHANGED
|
@@ -26,6 +26,30 @@ export type TokenSource = {
|
|
|
26
26
|
clientSecret: string;
|
|
27
27
|
authBaseUrl: string;
|
|
28
28
|
scope?: string;
|
|
29
|
+
} | {
|
|
30
|
+
/**
|
|
31
|
+
* Caller hands the SDK a `(accessToken, refreshToken)` pair from
|
|
32
|
+
* a finished login flow (`auth.loginWithPassword(...)`,
|
|
33
|
+
* `auth.verifyOtp(...)`, etc). The SDK serves the access token
|
|
34
|
+
* until it expires, then rotates via `auth.refresh(...)`.
|
|
35
|
+
*
|
|
36
|
+
* `clientId` is the OAuth client id used during the original
|
|
37
|
+
* login — required by the refresh handler. `onRotate` is an
|
|
38
|
+
* optional hook the caller can use to persist the new pair
|
|
39
|
+
* (cookie, secure storage, etc) — fired with every successful
|
|
40
|
+
* rotation.
|
|
41
|
+
*/
|
|
42
|
+
kind: 'access-refresh-pair';
|
|
43
|
+
accessToken: string;
|
|
44
|
+
refreshToken: string;
|
|
45
|
+
/** Initial expiry timestamp (ms since epoch). Re-derived from each new access token. */
|
|
46
|
+
expiresAt: number;
|
|
47
|
+
clientId: string;
|
|
48
|
+
onRotate?: (pair: {
|
|
49
|
+
accessToken: string;
|
|
50
|
+
refreshToken: string;
|
|
51
|
+
expiresAt: number;
|
|
52
|
+
}) => void | Promise<void>;
|
|
29
53
|
};
|
|
30
54
|
export interface TokenSourceState {
|
|
31
55
|
source: TokenSource;
|
package/dist/token-source.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.makeTokenSourceState = makeTokenSourceState;
|
|
4
37
|
exports.getAccessToken = getAccessToken;
|
|
@@ -98,6 +131,37 @@ async function mintToken(state) {
|
|
|
98
131
|
expiresAt: ttl > 0 ? Date.now() + ttl : Date.now() + 5 * 60 * 1000,
|
|
99
132
|
};
|
|
100
133
|
}
|
|
134
|
+
case 'access-refresh-pair': {
|
|
135
|
+
// First call: serve the seed access token if it hasn't expired.
|
|
136
|
+
// Subsequent calls (or on a stale seed) rotate via auth.refresh().
|
|
137
|
+
const source = state.source;
|
|
138
|
+
if (Date.now() + state.expiryBufferMs < source.expiresAt) {
|
|
139
|
+
return { token: source.accessToken, expiresAt: source.expiresAt };
|
|
140
|
+
}
|
|
141
|
+
// Dynamic import keeps `auth` out of the bundle when this kind isn't used.
|
|
142
|
+
const { refresh } = await Promise.resolve().then(() => __importStar(require('./auth/refresh')));
|
|
143
|
+
const tokens = await refresh({
|
|
144
|
+
accessToken: source.accessToken,
|
|
145
|
+
refreshToken: source.refreshToken,
|
|
146
|
+
clientId: source.clientId,
|
|
147
|
+
});
|
|
148
|
+
if (!tokens.refreshToken) {
|
|
149
|
+
throw new errors_1.ConfigError('refresh response missing refresh_token; cannot rotate again');
|
|
150
|
+
}
|
|
151
|
+
const expiresAt = Date.now() + tokens.expiresIn * 1000;
|
|
152
|
+
// Mutate the source in place so subsequent rotations carry the new pair.
|
|
153
|
+
source.accessToken = tokens.accessToken;
|
|
154
|
+
source.refreshToken = tokens.refreshToken;
|
|
155
|
+
source.expiresAt = expiresAt;
|
|
156
|
+
if (source.onRotate) {
|
|
157
|
+
await source.onRotate({
|
|
158
|
+
accessToken: tokens.accessToken,
|
|
159
|
+
refreshToken: tokens.refreshToken,
|
|
160
|
+
expiresAt,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return { token: tokens.accessToken, expiresAt };
|
|
164
|
+
}
|
|
101
165
|
}
|
|
102
166
|
}
|
|
103
167
|
function base64(s) {
|
|
@@ -108,4 +172,4 @@ function base64(s) {
|
|
|
108
172
|
// eslint-disable-next-line no-undef
|
|
109
173
|
return btoa(s);
|
|
110
174
|
}
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJDQSxvREFTQztBQU9ELHdDQXNCQztBQU1ELDBDQUVDO0FBekZELHFDQUEwRDtBQUMxRCwwQ0FBMEM7QUF3QzFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLFNBQWdCLG9CQUFvQixDQUNsQyxNQUFtQixFQUNuQixVQUErRCxFQUFFO0lBRWpFLE9BQU87UUFDTCxNQUFNO1FBQ04sY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQXdCO1FBQ2xFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFLLFVBQVUsQ0FBQyxLQUFzQjtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQXVCO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsS0FBdUI7SUFDckQsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDM0IsQ0FBQztBQUVELEtBQUssVUFBVSxTQUFTLENBQUMsS0FBdUI7SUFDOUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLElBQUksMEJBQWlCLENBQ3pCLHFGQUFxRixDQUN0RixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDekIsZ0VBQWdFO2dCQUNoRSwrREFBK0Q7Z0JBQy9ELFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO2FBQ25FLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztnQkFDTCxLQUFLO2dCQUNMLFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO2FBQ2xFLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxjQUFjLEVBQUU7Z0JBQ3pFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsbUNBQW1DO29CQUNuRCxhQUFhLEVBQUUsU0FBUyxLQUFLLEVBQUU7aUJBQ2hDO2dCQUNELElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxvQkFBVyxDQUFDLHdDQUF3QyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQW1ELENBQUM7WUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLG9CQUFXLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUMxQyxPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDeEIsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUk7YUFDbkUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLENBQVM7SUFDdkIsc0VBQXNFO0lBQ3RFLDhEQUE4RDtJQUM5RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRixvQ0FBb0M7SUFDcEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ0Vycm9yLCBUb2tlbkV4cGlyZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGdldEV4cGlyeSB9IGZyb20gJy4vYXV0aC9pc3N1ZXInO1xuXG4vKipcbiAqIEhvdyB0aGUgU0RLIGdldHMgYSBmcmVzaCBhY2Nlc3MgdG9rZW4uIFRocmVlIHNoYXBlcyBwZXIgdGhlIGJyaWVmOlxuICpcbiAqICAgLSBgc3RhdGljLXN0cmluZ2Ag4oCUIGNhbGxlciBoYW5kcyBpbiBhIHRva2VuIHN0cmluZy4gVXNlZCB1bnRpbCBpdHNcbiAqICAgICBgZXhwYCBoYXMgcGFzc2VkOyBvbiBleHBpcnkgd2UgdGhyb3cgYFRva2VuRXhwaXJlZEVycm9yYCByYXRoZXJcbiAqICAgICB0aGFuIHRyeSB0byByZWZyZXNoICh0aGUgU0RLIGhhcyBubyB3YXkgdG8gcmVmcmVzaCBhIHN0YXRpY1xuICogICAgIGV4dGVybmFsbHktc3VwcGxpZWQgdG9rZW4pLlxuICpcbiAqICAgLSBgY2FsbGJhY2tgIOKAlCBjYWxsZXIgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGUgU0RLIGNhbGxzIG9uIG1pc3NcbiAqICAgICBhbmQgb24gNDAxIGludmFsaWRhdGlvbi4gVGhlIGNvbnN1bWVyJ3MgbG9naWMgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgcmVmcmVzaDsgdGhlIFNESyBqdXN0IGNhY2hlcyB0aGUgcmVzdWx0IGJldHdlZW4gaW52b2NhdGlvbnMuXG4gKlxuICogICAtIGBzZXJ2aWNlLWNyZWRlbnRpYWxzYCDigJQgYGNsaWVudF9pZGAgKyBgY2xpZW50X3NlY3JldGAgZm9yIHRoZVxuICogICAgIE9BdXRoMiBgY2xpZW50X2NyZWRlbnRpYWxzYCBncmFudC4gU0RLIG1pbnRzICsgY2FjaGVzOyBvblxuICogICAgIGV4cGlyeSBpdCByZS1taW50cyB3aXRoIHRoZSBzYW1lIGNyZWRlbnRpYWxzLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblNvdXJjZSA9XG4gIHwgeyBraW5kOiAnc3RhdGljLXN0cmluZyc7IHRva2VuOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2NhbGxiYWNrJzsgZ2V0VG9rZW46ICgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB9XG4gIHwge1xuICAgICAga2luZDogJ3NlcnZpY2UtY3JlZGVudGlhbHMnO1xuICAgICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgICAgYXV0aEJhc2VVcmw6IHN0cmluZztcbiAgICAgIHNjb3BlPzogc3RyaW5nO1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Tb3VyY2VTdGF0ZSB7XG4gIHNvdXJjZTogVG9rZW5Tb3VyY2U7XG4gIGNhY2hlZD86IHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfTtcbiAgLyoqIFJlZnJlc2ggZGVkdXA6IGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgZmV0Y2guICovXG4gIGluZmxpZ2h0PzogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+O1xuICAvKiogQnVmZmVyIChtcykgYmVmb3JlIGBleHBgIGF0IHdoaWNoIHdlIHRyZWF0IGEgdG9rZW4gYXMgZXhwaXJlZC4gKi9cbiAgZXhwaXJ5QnVmZmVyTXM6IG51bWJlcjtcbiAgLyoqIFVzZWQgb25seSBieSB0aGUgc2VydmljZS1jcmVkZW50aWFscyBwYXRoLiAqL1xuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7XG59XG5cbmNvbnN0IERFRkFVTFRfRVhQSVJZX0JVRkZFUl9NUyA9IDUwMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgc291cmNlOiBUb2tlblNvdXJjZSxcbiAgb3B0aW9uczogeyBleHBpcnlCdWZmZXJNcz86IG51bWJlcjsgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaCB9ID0ge30sXG4pOiBUb2tlblNvdXJjZVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2UsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IG9wdGlvbnMuZXhwaXJ5QnVmZmVyTXMgPz8gREVGQVVMVF9FWFBJUllfQlVGRkVSX01TLFxuICAgIGZldGNoRm46IG9wdGlvbnMuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZyZXNoIGFjY2VzcyB0b2tlbiwgdXNpbmcgdGhlIGNhY2hlIHdoZW4gd2FybS4gQ29uY3VycmVudFxuICogY2FsbGVycyBkdXJpbmcgYSByZWZyZXNoIHNoYXJlIHRoZSBpbi1mbGlnaHQgUHJvbWlzZSBzbyB3ZSBkb24ndFxuICogc3RhbXBlZGUgdGhlIGF1dGggc2VydmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoc3RhdGUuY2FjaGVkICYmIHN0YXRlLmNhY2hlZC5leHBpcmVzQXQgPiBub3cgKyBzdGF0ZS5leHBpcnlCdWZmZXJNcykge1xuICAgIHJldHVybiBzdGF0ZS5jYWNoZWQudG9rZW47XG4gIH1cbiAgaWYgKHN0YXRlLmluZmxpZ2h0KSB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCBzdGF0ZS5pbmZsaWdodDtcbiAgICByZXR1cm4gZnJlc2gudG9rZW47XG4gIH1cbiAgY29uc3QgaW5mbGlnaHQgPSBtaW50VG9rZW4oc3RhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgIHN0YXRlLmNhY2hlZCA9IHJlcztcbiAgICBzdGF0ZS5pbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgc3RhdGUuaW5mbGlnaHQgPSBpbmZsaWdodDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IGluZmxpZ2h0O1xuICAgIHJldHVybiBmcmVzaC50b2tlbjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuaW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogRHJvcCB0aGUgY2FjaGVkIHRva2VuLiBUaGUgbmV4dCBgZ2V0QWNjZXNzVG9rZW5gIHdpbGwgbWludCBvclxuICogcmUtZmV0Y2guIENhbGxlZCBieSB0aGUgcmVxdWVzdCBsYXllciBvbiA0MDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiB2b2lkIHtcbiAgc3RhdGUuY2FjaGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaW50VG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4ge1xuICBzd2l0Y2ggKHN0YXRlLnNvdXJjZS5raW5kKSB7XG4gICAgY2FzZSAnc3RhdGljLXN0cmluZyc6IHtcbiAgICAgIGNvbnN0IGV4cCA9IGdldEV4cGlyeShzdGF0ZS5zb3VyY2UudG9rZW4pO1xuICAgICAgaWYgKGV4cCAhPT0gbnVsbCAmJiBleHAgKiAxMDAwIDwgRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAnc3RhdGljIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZDsgY29uc3VtZXIgbXVzdCB1cGRhdGUgdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggdG9rZW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHN0YXRlLnNvdXJjZS50b2tlbixcbiAgICAgICAgLy8gTm8gYGV4cGA/IFRyZWF0IGFzIG9wYXF1ZSBub24tZXhwaXJpbmc7IGNhY2hlIGZvciAxaCB0byBhdm9pZFxuICAgICAgICAvLyByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcgZm9yZXZlciBpbiBjYXNlIHRoZSBpc3N1ZXIgcm90YXRlcy5cbiAgICAgICAgZXhwaXJlc0F0OiBleHAgIT09IG51bGwgPyBleHAgKiAxMDAwIDogRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnY2FsbGJhY2snOiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHN0YXRlLnNvdXJjZS5nZXRUb2tlbigpO1xuICAgICAgY29uc3QgZXhwID0gZ2V0RXhwaXJ5KHRva2VuKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cCAhPT0gbnVsbCA/IGV4cCAqIDEwMDAgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3NlcnZpY2UtY3JlZGVudGlhbHMnOiB7XG4gICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnIH0pO1xuICAgICAgaWYgKHN0YXRlLnNvdXJjZS5zY29wZSkgYm9keS5zZXQoJ3Njb3BlJywgc3RhdGUuc291cmNlLnNjb3BlKTtcbiAgICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0KGAke3N0YXRlLnNvdXJjZS5jbGllbnRJZH06JHtzdGF0ZS5zb3VyY2UuY2xpZW50U2VjcmV0fWApO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3RhdGUuZmV0Y2hGbihgJHtzdGF0ZS5zb3VyY2UuYXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoYGNsaWVudF9jcmVkZW50aWFscyBtaW50IGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNfaW4/OiBudW1iZXIgfTtcbiAgICAgIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdhdXRoIHNlcnZlciByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gKGpzb24uZXhwaXJlc19pbiA/PyAwKSAqIDEwMDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjoganNvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdHRsID4gMCA/IERhdGUubm93KCkgKyB0dGwgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBXb3JrcyBpbiBOb2RlIGFuZCBicm93c2VyIChCdWZmZXIgaXMgcG9seWZpbGxlZCB2aWEgQHR5cGVzL25vZGUgYW5kXG4gIC8vIG1vc3QgYnVuZGxlcnM7IGJ0b2EgaXMgYSBmYWxsYmFjayBmb3IgZW52cyB3aXRob3V0IEJ1ZmZlcikuXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIEJ1ZmZlci5mcm9tKHMsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuIGJ0b2Eocyk7XG59XG4iXX0=
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9FQSxvREFTQztBQU9ELHdDQXNCQztBQU1ELDBDQUVDO0FBbEhELHFDQUEwRDtBQUMxRCwwQ0FBMEM7QUFpRTFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLFNBQWdCLG9CQUFvQixDQUNsQyxNQUFtQixFQUNuQixVQUErRCxFQUFFO0lBRWpFLE9BQU87UUFDTCxNQUFNO1FBQ04sY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQXdCO1FBQ2xFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFLLFVBQVUsQ0FBQyxLQUFzQjtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQXVCO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzNCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsS0FBdUI7SUFDckQsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDM0IsQ0FBQztBQUVELEtBQUssVUFBVSxTQUFTLENBQUMsS0FBdUI7SUFDOUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLElBQUksMEJBQWlCLENBQ3pCLHFGQUFxRixDQUN0RixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDekIsZ0VBQWdFO2dCQUNoRSwrREFBK0Q7Z0JBQy9ELFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO2FBQ25FLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztnQkFDTCxLQUFLO2dCQUNMLFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO2FBQ2xFLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxjQUFjLEVBQUU7Z0JBQ3pFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsbUNBQW1DO29CQUNuRCxhQUFhLEVBQUUsU0FBUyxLQUFLLEVBQUU7aUJBQ2hDO2dCQUNELElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxvQkFBVyxDQUFDLHdDQUF3QyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQW1ELENBQUM7WUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLG9CQUFXLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUMxQyxPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDeEIsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUk7YUFDbkUsQ0FBQztRQUNKLENBQUM7UUFDRCxLQUFLLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUMzQixnRUFBZ0U7WUFDaEUsbUVBQW1FO1lBQ25FLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLENBQUM7WUFDRCwyRUFBMkU7WUFDM0UsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLHdEQUFhLGdCQUFnQixHQUFDLENBQUM7WUFDbkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUM7Z0JBQzNCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO2dCQUNqQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxJQUFJLG9CQUFXLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUN2RixDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3ZELHlFQUF5RTtZQUN6RSxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDeEMsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwQixNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUM7b0JBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztvQkFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO29CQUNqQyxTQUFTO2lCQUNWLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsQ0FBUztJQUN2QixzRUFBc0U7SUFDdEUsOERBQThEO0lBQzlELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BGLG9DQUFvQztJQUNwQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnRXJyb3IsIFRva2VuRXhwaXJlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0RXhwaXJ5IH0gZnJvbSAnLi9hdXRoL2lzc3Vlcic7XG5cbi8qKlxuICogSG93IHRoZSBTREsgZ2V0cyBhIGZyZXNoIGFjY2VzcyB0b2tlbi4gVGhyZWUgc2hhcGVzIHBlciB0aGUgYnJpZWY6XG4gKlxuICogICAtIGBzdGF0aWMtc3RyaW5nYCDigJQgY2FsbGVyIGhhbmRzIGluIGEgdG9rZW4gc3RyaW5nLiBVc2VkIHVudGlsIGl0c1xuICogICAgIGBleHBgIGhhcyBwYXNzZWQ7IG9uIGV4cGlyeSB3ZSB0aHJvdyBgVG9rZW5FeHBpcmVkRXJyb3JgIHJhdGhlclxuICogICAgIHRoYW4gdHJ5IHRvIHJlZnJlc2ggKHRoZSBTREsgaGFzIG5vIHdheSB0byByZWZyZXNoIGEgc3RhdGljXG4gKiAgICAgZXh0ZXJuYWxseS1zdXBwbGllZCB0b2tlbikuXG4gKlxuICogICAtIGBjYWxsYmFja2Ag4oCUIGNhbGxlciBzdXBwbGllcyBhIGZ1bmN0aW9uIHRoZSBTREsgY2FsbHMgb24gbWlzc1xuICogICAgIGFuZCBvbiA0MDEgaW52YWxpZGF0aW9uLiBUaGUgY29uc3VtZXIncyBsb2dpYyBpcyByZXNwb25zaWJsZSBmb3JcbiAqICAgICByZWZyZXNoOyB0aGUgU0RLIGp1c3QgY2FjaGVzIHRoZSByZXN1bHQgYmV0d2VlbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiAgIC0gYHNlcnZpY2UtY3JlZGVudGlhbHNgIOKAlCBgY2xpZW50X2lkYCArIGBjbGllbnRfc2VjcmV0YCBmb3IgdGhlXG4gKiAgICAgT0F1dGgyIGBjbGllbnRfY3JlZGVudGlhbHNgIGdyYW50LiBTREsgbWludHMgKyBjYWNoZXM7IG9uXG4gKiAgICAgZXhwaXJ5IGl0IHJlLW1pbnRzIHdpdGggdGhlIHNhbWUgY3JlZGVudGlhbHMuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuU291cmNlID1cbiAgfCB7IGtpbmQ6ICdzdGF0aWMtc3RyaW5nJzsgdG9rZW46IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnY2FsbGJhY2snOyBnZXRUb2tlbjogKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IH1cbiAgfCB7XG4gICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscyc7XG4gICAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgICBhdXRoQmFzZVVybDogc3RyaW5nO1xuICAgICAgc2NvcGU/OiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIC8qKlxuICAgICAgICogQ2FsbGVyIGhhbmRzIHRoZSBTREsgYSBgKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pYCBwYWlyIGZyb21cbiAgICAgICAqIGEgZmluaXNoZWQgbG9naW4gZmxvdyAoYGF1dGgubG9naW5XaXRoUGFzc3dvcmQoLi4uKWAsXG4gICAgICAgKiBgYXV0aC52ZXJpZnlPdHAoLi4uKWAsIGV0YykuIFRoZSBTREsgc2VydmVzIHRoZSBhY2Nlc3MgdG9rZW5cbiAgICAgICAqIHVudGlsIGl0IGV4cGlyZXMsIHRoZW4gcm90YXRlcyB2aWEgYGF1dGgucmVmcmVzaCguLi4pYC5cbiAgICAgICAqXG4gICAgICAgKiBgY2xpZW50SWRgIGlzIHRoZSBPQXV0aCBjbGllbnQgaWQgdXNlZCBkdXJpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgKiBsb2dpbiDigJQgcmVxdWlyZWQgYnkgdGhlIHJlZnJlc2ggaGFuZGxlci4gYG9uUm90YXRlYCBpcyBhblxuICAgICAgICogb3B0aW9uYWwgaG9vayB0aGUgY2FsbGVyIGNhbiB1c2UgdG8gcGVyc2lzdCB0aGUgbmV3IHBhaXJcbiAgICAgICAqIChjb29raWUsIHNlY3VyZSBzdG9yYWdlLCBldGMpIOKAlCBmaXJlZCB3aXRoIGV2ZXJ5IHN1Y2Nlc3NmdWxcbiAgICAgICAqIHJvdGF0aW9uLlxuICAgICAgICovXG4gICAgICBraW5kOiAnYWNjZXNzLXJlZnJlc2gtcGFpcic7XG4gICAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gICAgICAvKiogSW5pdGlhbCBleHBpcnkgdGltZXN0YW1wIChtcyBzaW5jZSBlcG9jaCkuIFJlLWRlcml2ZWQgZnJvbSBlYWNoIG5ldyBhY2Nlc3MgdG9rZW4uICovXG4gICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgICBvblJvdGF0ZT86IChwYWlyOiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Tb3VyY2VTdGF0ZSB7XG4gIHNvdXJjZTogVG9rZW5Tb3VyY2U7XG4gIGNhY2hlZD86IHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfTtcbiAgLyoqIFJlZnJlc2ggZGVkdXA6IGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgZmV0Y2guICovXG4gIGluZmxpZ2h0PzogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+O1xuICAvKiogQnVmZmVyIChtcykgYmVmb3JlIGBleHBgIGF0IHdoaWNoIHdlIHRyZWF0IGEgdG9rZW4gYXMgZXhwaXJlZC4gKi9cbiAgZXhwaXJ5QnVmZmVyTXM6IG51bWJlcjtcbiAgLyoqIFVzZWQgb25seSBieSB0aGUgc2VydmljZS1jcmVkZW50aWFscyBwYXRoLiAqL1xuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7XG59XG5cbmNvbnN0IERFRkFVTFRfRVhQSVJZX0JVRkZFUl9NUyA9IDUwMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgc291cmNlOiBUb2tlblNvdXJjZSxcbiAgb3B0aW9uczogeyBleHBpcnlCdWZmZXJNcz86IG51bWJlcjsgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaCB9ID0ge30sXG4pOiBUb2tlblNvdXJjZVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2UsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IG9wdGlvbnMuZXhwaXJ5QnVmZmVyTXMgPz8gREVGQVVMVF9FWFBJUllfQlVGRkVSX01TLFxuICAgIGZldGNoRm46IG9wdGlvbnMuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZyZXNoIGFjY2VzcyB0b2tlbiwgdXNpbmcgdGhlIGNhY2hlIHdoZW4gd2FybS4gQ29uY3VycmVudFxuICogY2FsbGVycyBkdXJpbmcgYSByZWZyZXNoIHNoYXJlIHRoZSBpbi1mbGlnaHQgUHJvbWlzZSBzbyB3ZSBkb24ndFxuICogc3RhbXBlZGUgdGhlIGF1dGggc2VydmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoc3RhdGUuY2FjaGVkICYmIHN0YXRlLmNhY2hlZC5leHBpcmVzQXQgPiBub3cgKyBzdGF0ZS5leHBpcnlCdWZmZXJNcykge1xuICAgIHJldHVybiBzdGF0ZS5jYWNoZWQudG9rZW47XG4gIH1cbiAgaWYgKHN0YXRlLmluZmxpZ2h0KSB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCBzdGF0ZS5pbmZsaWdodDtcbiAgICByZXR1cm4gZnJlc2gudG9rZW47XG4gIH1cbiAgY29uc3QgaW5mbGlnaHQgPSBtaW50VG9rZW4oc3RhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgIHN0YXRlLmNhY2hlZCA9IHJlcztcbiAgICBzdGF0ZS5pbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgc3RhdGUuaW5mbGlnaHQgPSBpbmZsaWdodDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IGluZmxpZ2h0O1xuICAgIHJldHVybiBmcmVzaC50b2tlbjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuaW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogRHJvcCB0aGUgY2FjaGVkIHRva2VuLiBUaGUgbmV4dCBgZ2V0QWNjZXNzVG9rZW5gIHdpbGwgbWludCBvclxuICogcmUtZmV0Y2guIENhbGxlZCBieSB0aGUgcmVxdWVzdCBsYXllciBvbiA0MDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiB2b2lkIHtcbiAgc3RhdGUuY2FjaGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaW50VG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4ge1xuICBzd2l0Y2ggKHN0YXRlLnNvdXJjZS5raW5kKSB7XG4gICAgY2FzZSAnc3RhdGljLXN0cmluZyc6IHtcbiAgICAgIGNvbnN0IGV4cCA9IGdldEV4cGlyeShzdGF0ZS5zb3VyY2UudG9rZW4pO1xuICAgICAgaWYgKGV4cCAhPT0gbnVsbCAmJiBleHAgKiAxMDAwIDwgRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAnc3RhdGljIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZDsgY29uc3VtZXIgbXVzdCB1cGRhdGUgdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggdG9rZW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHN0YXRlLnNvdXJjZS50b2tlbixcbiAgICAgICAgLy8gTm8gYGV4cGA/IFRyZWF0IGFzIG9wYXF1ZSBub24tZXhwaXJpbmc7IGNhY2hlIGZvciAxaCB0byBhdm9pZFxuICAgICAgICAvLyByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcgZm9yZXZlciBpbiBjYXNlIHRoZSBpc3N1ZXIgcm90YXRlcy5cbiAgICAgICAgZXhwaXJlc0F0OiBleHAgIT09IG51bGwgPyBleHAgKiAxMDAwIDogRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnY2FsbGJhY2snOiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHN0YXRlLnNvdXJjZS5nZXRUb2tlbigpO1xuICAgICAgY29uc3QgZXhwID0gZ2V0RXhwaXJ5KHRva2VuKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cCAhPT0gbnVsbCA/IGV4cCAqIDEwMDAgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3NlcnZpY2UtY3JlZGVudGlhbHMnOiB7XG4gICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnIH0pO1xuICAgICAgaWYgKHN0YXRlLnNvdXJjZS5zY29wZSkgYm9keS5zZXQoJ3Njb3BlJywgc3RhdGUuc291cmNlLnNjb3BlKTtcbiAgICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0KGAke3N0YXRlLnNvdXJjZS5jbGllbnRJZH06JHtzdGF0ZS5zb3VyY2UuY2xpZW50U2VjcmV0fWApO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3RhdGUuZmV0Y2hGbihgJHtzdGF0ZS5zb3VyY2UuYXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoYGNsaWVudF9jcmVkZW50aWFscyBtaW50IGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNfaW4/OiBudW1iZXIgfTtcbiAgICAgIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdhdXRoIHNlcnZlciByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gKGpzb24uZXhwaXJlc19pbiA/PyAwKSAqIDEwMDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjoganNvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdHRsID4gMCA/IERhdGUubm93KCkgKyB0dGwgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ2FjY2Vzcy1yZWZyZXNoLXBhaXInOiB7XG4gICAgICAvLyBGaXJzdCBjYWxsOiBzZXJ2ZSB0aGUgc2VlZCBhY2Nlc3MgdG9rZW4gaWYgaXQgaGFzbid0IGV4cGlyZWQuXG4gICAgICAvLyBTdWJzZXF1ZW50IGNhbGxzIChvciBvbiBhIHN0YWxlIHNlZWQpIHJvdGF0ZSB2aWEgYXV0aC5yZWZyZXNoKCkuXG4gICAgICBjb25zdCBzb3VyY2UgPSBzdGF0ZS5zb3VyY2U7XG4gICAgICBpZiAoRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zIDwgc291cmNlLmV4cGlyZXNBdCkge1xuICAgICAgICByZXR1cm4geyB0b2tlbjogc291cmNlLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQ6IHNvdXJjZS5leHBpcmVzQXQgfTtcbiAgICAgIH1cbiAgICAgIC8vIER5bmFtaWMgaW1wb3J0IGtlZXBzIGBhdXRoYCBvdXQgb2YgdGhlIGJ1bmRsZSB3aGVuIHRoaXMga2luZCBpc24ndCB1c2VkLlxuICAgICAgY29uc3QgeyByZWZyZXNoIH0gPSBhd2FpdCBpbXBvcnQoJy4vYXV0aC9yZWZyZXNoJyk7XG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHtcbiAgICAgICAgYWNjZXNzVG9rZW46IHNvdXJjZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzb3VyY2UucmVmcmVzaFRva2VuLFxuICAgICAgICBjbGllbnRJZDogc291cmNlLmNsaWVudElkLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXRva2Vucy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdyZWZyZXNoIHJlc3BvbnNlIG1pc3NpbmcgcmVmcmVzaF90b2tlbjsgY2Fubm90IHJvdGF0ZSBhZ2FpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHRva2Vucy5leHBpcmVzSW4gKiAxMDAwO1xuICAgICAgLy8gTXV0YXRlIHRoZSBzb3VyY2UgaW4gcGxhY2Ugc28gc3Vic2VxdWVudCByb3RhdGlvbnMgY2FycnkgdGhlIG5ldyBwYWlyLlxuICAgICAgc291cmNlLmFjY2Vzc1Rva2VuID0gdG9rZW5zLmFjY2Vzc1Rva2VuO1xuICAgICAgc291cmNlLnJlZnJlc2hUb2tlbiA9IHRva2Vucy5yZWZyZXNoVG9rZW47XG4gICAgICBzb3VyY2UuZXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICAgICAgaWYgKHNvdXJjZS5vblJvdGF0ZSkge1xuICAgICAgICBhd2FpdCBzb3VyY2Uub25Sb3RhdGUoe1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGV4cGlyZXNBdCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0b2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLCBleHBpcmVzQXQgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0KHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFdvcmtzIGluIE5vZGUgYW5kIGJyb3dzZXIgKEJ1ZmZlciBpcyBwb2x5ZmlsbGVkIHZpYSBAdHlwZXMvbm9kZSBhbmRcbiAgLy8gbW9zdCBidW5kbGVyczsgYnRvYSBpcyBhIGZhbGxiYWNrIGZvciBlbnZzIHdpdGhvdXQgQnVmZmVyKS5cbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gQnVmZmVyLmZyb20ocywgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICByZXR1cm4gYnRvYShzKTtcbn1cbiJdfQ==
|