@dbx-tools/teams 0.6.72 → 0.6.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/src/auth.js +46 -18
- package/lib/src/builder.js +6 -5
- package/lib/src/config.js +5 -7
- package/package.json +4 -4
- package/src/auth.ts +59 -21
- package/src/builder.ts +5 -4
- package/src/config.ts +4 -6
package/README.md
CHANGED
|
@@ -167,7 +167,7 @@ environment variable.
|
|
|
167
167
|
builder targets. Defaults to `1.5` (what Teams supports).
|
|
168
168
|
- `webhookUrl` / `TEAMS_WEBHOOK_URL` - optional Teams incoming-webhook URL. When
|
|
169
169
|
unset, posting is disabled and the plugin only builds cards for a UI to
|
|
170
|
-
render. A value that is not an absolute URL fails config resolution.
|
|
170
|
+
render. A value that is not an absolute HTTPS URL fails config resolution.
|
|
171
171
|
- `agentPlugin` / `TEAMS_AGENT_PLUGIN` - registered name of the sibling plugin
|
|
172
172
|
whose agents answer a conversation turn. Defaults to `mastra`; set it when the
|
|
173
173
|
Mastra plugin is mounted under a `config.name` override.
|
package/lib/src/auth.js
CHANGED
|
@@ -78,7 +78,7 @@ export const resetTeamsAuth = () => {
|
|
|
78
78
|
keySet = undefined;
|
|
79
79
|
jwksUri = undefined;
|
|
80
80
|
keySetSource = undefined;
|
|
81
|
-
tokenCache
|
|
81
|
+
tokenCache.clear();
|
|
82
82
|
};
|
|
83
83
|
/**
|
|
84
84
|
* Discover the signing JWKS URI from the Bot Framework OpenID metadata.
|
|
@@ -157,29 +157,30 @@ const bearerToken = (authorization) => {
|
|
|
157
157
|
return null;
|
|
158
158
|
return value.trim() || null;
|
|
159
159
|
};
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
160
|
+
const tokenCache = new Map();
|
|
161
|
+
/** Wait for a shared refresh while preserving per-caller cancellation. */
|
|
162
|
+
function waitForToken(refresh, signal) {
|
|
163
|
+
if (!signal)
|
|
164
|
+
return refresh;
|
|
165
|
+
signal.throwIfAborted();
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
const onAbort = () => reject(signal.reason ?? new Error("Connector token request aborted"));
|
|
168
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
169
|
+
refresh.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** Fetch one Connector token without binding the shared refresh to one caller's signal. */
|
|
173
|
+
async function refreshConnectorToken(options, tenant, now) {
|
|
172
174
|
const body = new URLSearchParams({
|
|
173
175
|
grant_type: "client_credentials",
|
|
174
176
|
client_id: options.appId,
|
|
175
177
|
client_secret: options.appPassword,
|
|
176
178
|
scope: CONNECTOR_SCOPE,
|
|
177
179
|
});
|
|
178
|
-
const response = await fetch(LOGIN_TOKEN_URL(
|
|
180
|
+
const response = await fetch(LOGIN_TOKEN_URL(tenant), {
|
|
179
181
|
method: "POST",
|
|
180
182
|
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
181
183
|
body,
|
|
182
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
183
184
|
});
|
|
184
185
|
if (!response.ok) {
|
|
185
186
|
const detail = await response.text().catch(() => "");
|
|
@@ -190,9 +191,36 @@ export const connectorToken = async (options) => {
|
|
|
190
191
|
if (!token)
|
|
191
192
|
throw new Error("teams: token response carried no access_token");
|
|
192
193
|
const expiresIn = typeof payload.expires_in === "number" ? payload.expires_in : 3600;
|
|
193
|
-
tokenCache = { token, expiresAt: now + expiresIn * 1000 - TOKEN_SKEW_MS };
|
|
194
194
|
logger.debug("connector token refreshed", { expiresIn });
|
|
195
|
-
return token;
|
|
195
|
+
return { token, expiresAt: now + expiresIn * 1000 - TOKEN_SKEW_MS };
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Fetch (or reuse) a Connector API access token for the bot's own app
|
|
199
|
+
* registration.
|
|
200
|
+
*
|
|
201
|
+
* Cached until shortly before expiry: a Connector token is valid for ~1h, and
|
|
202
|
+
* re-fetching per reply would add a round trip to every turn.
|
|
203
|
+
*/
|
|
204
|
+
export const connectorToken = async (options) => {
|
|
205
|
+
const tenant = options.appTenantId ?? MULTI_TENANT;
|
|
206
|
+
const cacheKey = `${tenant}\0${options.appId}`;
|
|
207
|
+
const now = Date.now();
|
|
208
|
+
let entry = tokenCache.get(cacheKey);
|
|
209
|
+
if (!entry) {
|
|
210
|
+
entry = {};
|
|
211
|
+
tokenCache.set(cacheKey, entry);
|
|
212
|
+
}
|
|
213
|
+
if (entry.value && entry.value.expiresAt > now)
|
|
214
|
+
return entry.value.token;
|
|
215
|
+
entry.refresh ??= refreshConnectorToken(options, tenant, now)
|
|
216
|
+
.then((value) => {
|
|
217
|
+
entry.value = value;
|
|
218
|
+
return value;
|
|
219
|
+
})
|
|
220
|
+
.finally(() => {
|
|
221
|
+
entry.refresh = undefined;
|
|
222
|
+
});
|
|
223
|
+
return (await waitForToken(entry.refresh, options.signal)).token;
|
|
196
224
|
};
|
|
197
225
|
/**
|
|
198
226
|
* Host suffixes replies may be sent to when the token pins no `serviceUrl`.
|
|
@@ -229,4 +257,4 @@ export const isAllowedServiceUrl = (serviceUrl, tokenServiceUrl) => {
|
|
|
229
257
|
return false;
|
|
230
258
|
}
|
|
231
259
|
};
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBRXRFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQzlCLG1FQUFtRSxDQUFDO0FBRXRFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGVBQWUsR0FBRztJQUN0Qiw4QkFBOEI7SUFDOUIsK0RBQStEO0lBQy9ELDZFQUE2RTtDQUNyRSxDQUFDO0FBRVgsK0VBQStFO0FBQy9FLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FDekMscUNBQXFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsdUNBQXVDLENBQUM7QUFFaEUsMEVBQTBFO0FBQzFFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxJQUFJLE1BQXlELENBQUM7QUFFOUQsMkZBQTJGO0FBQzNGLElBQUksT0FBMkIsQ0FBQztBQUVoQyxzRkFBc0Y7QUFDdEYsSUFBSSxZQUFnQyxDQUFDO0FBRXJDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBUyxFQUFFO0lBQ3ZDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkIsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUNwQixZQUFZLEdBQUcsU0FBUyxDQUFD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SUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQzlELENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbmJvdW5kIGFuZCBvdXRib3VuZCBhdXRoZW50aWNhdGlvbiBmb3IgdGhlIFRlYW1zIG1lc3NhZ2luZyBlbmRwb2ludC5cbiAqXG4gKiBgUE9TVCAvYXBpL3RlYW1zL21lc3NhZ2VzYCBpcyBhIFBVQkxJQyBVUkwgLSBBenVyZSBCb3QgU2VydmljZSBjYWxscyBpdCBmcm9tXG4gKiB0aGUgaW50ZXJuZXQsIHNvIGl0IGNhbm5vdCBzaXQgYmVoaW5kIEFwcEtpdCdzIE9CTyBoZWFkZXJzIG9yIGEgd29ya3NwYWNlXG4gKiBsb2dpbi4gSXRzIG9ubHkgdHJ1c3QgYm91bmRhcnkgaXMgdGhlIEpXVCB0aGUgQm90IFNlcnZpY2Ugc2lnbnMgZWFjaCByZXF1ZXN0XG4gKiB3aXRoLCB3aGljaCBpcyB3aGF0IHRoaXMgbW9kdWxlIHZlcmlmaWVzOlxuICpcbiAqICAgMS4gZmV0Y2ggdGhlIEJvdCBGcmFtZXdvcmsgT3BlbklEIG1ldGFkYXRhIHRvIGRpc2NvdmVyIHRoZSBzaWduaW5nIEpXS1M7XG4gKiAgIDIuIHZlcmlmeSB0aGUgdG9rZW4ncyBzaWduYXR1cmUgYWdhaW5zdCB0aGF0IGtleSBzZXQ7XG4gKiAgIDMuIGNoZWNrIGBpc3N1ZXJgIGlzIGEga25vd24gQm90IFNlcnZpY2UgaXNzdWVyIGFuZCBgYXVkaWVuY2VgIGlzIGV4YWN0bHlcbiAqICAgICAgdGhpcyBib3QncyBhcHAgaWQuXG4gKlxuICogQWxsIHRocmVlIG1hdHRlci4gU2tpcHBpbmcgKDMpIGlzIHRoZSBjbGFzc2ljIGJvdCB2dWxuZXJhYmlsaXR5OiBhIHRva2VuIHRoZVxuICogQm90IFNlcnZpY2UgbGVnaXRpbWF0ZWx5IGlzc3VlZCBmb3IgYSBESUZGRVJFTlQgYm90IHN0aWxsIHZlcmlmaWVzIGFnYWluc3QgdGhlXG4gKiBzYW1lIEpXS1MsIHNvIHdpdGhvdXQgYW4gYXVkaWVuY2UgY2hlY2sgYW55b25lIHdpdGggdGhlaXIgb3duIGJvdCBjb3VsZCBkcml2ZVxuICogdGhpcyBhZ2VudC5cbiAqXG4gKiBUaGUgb3V0Ym91bmQgaGFsZiBpcyB0aGUgcmV2ZXJzZTogcmVwbGllcyBnbyB0byB0aGUgQ29ubmVjdG9yIEFQSSwgd2hpY2ggbmVlZHNcbiAqIGEgY2xpZW50LWNyZWRlbnRpYWxzIHRva2VuIGZvciB0aGUgYm90J3Mgb3duIGFwcCByZWdpc3RyYXRpb24uIEJvdGgga2V5IHNldHNcbiAqIGFuZCB0b2tlbnMgYXJlIGNhY2hlZCwgc2luY2UgYSBidXN5IGNoYW5uZWwgd291bGQgb3RoZXJ3aXNlIHJlLWZldGNoIG1ldGFkYXRhXG4gKiBvbiBldmVyeSB0dXJuLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNyZWF0ZVJlbW90ZUpXS1NldCwgand0VmVyaWZ5LCB0eXBlIEpXVFBheWxvYWQgfSBmcm9tIFwiam9zZVwiO1xuXG4vKipcbiAqIE9wZW5JRCBtZXRhZGF0YSBkb2N1bWVudCBmb3IgdG9rZW5zIHRoZSBCb3QgU2VydmljZSBzZW5kcyBhIGJvdCBpbiB0aGUgcHVibGljXG4gKiBjbG91ZC4gVGhlIEpXS1MgVVJJIGlzIHJlYWQgZnJvbSB0aGlzIGRvY3VtZW50IHJhdGhlciB0aGFuIGhhcmQtY29kZWQgc28gYSBrZXlcbiAqIHJvdGF0aW9uIG9uIE1pY3Jvc29mdCdzIHNpZGUgbmVlZHMgbm8gcmVsZWFzZSBoZXJlLlxuICpcbiAqIE92ZXJyaWRhYmxlIHBlciBjYWxsICh7QGxpbmsgVmVyaWZ5T3B0aW9ucy5tZXRhZGF0YVVybH0pIGJlY2F1c2UgYSBzb3ZlcmVpZ25cbiAqIGNsb3VkIChHQ0MgSGlnaCAvIERvRCkgcHVibGlzaGVzIGl0cyBvd24gbWV0YWRhdGEgZW5kcG9pbnQgLSBhbmQgYmVjYXVzZSBpdFxuICogbWFrZXMgdGhlIHZlcmlmaWVyIHRlc3RhYmxlIGFnYWluc3QgYSBsb2NhbCBrZXkgc2V0LlxuICovXG5leHBvcnQgY29uc3QgQk9UX09QRU5JRF9NRVRBREFUQSA9XG4gIFwiaHR0cHM6Ly9sb2dpbi5ib3RmcmFtZXdvcmsuY29tL3YxLy53ZWxsLWtub3duL29wZW5pZGNvbmZpZ3VyYXRpb25cIjtcblxuLyoqXG4gKiBBY2NlcHRlZCBgaXNzYCB2YWx1ZXMgb24gYW4gaW5ib3VuZCB0b2tlbi5cbiAqXG4gKiBUaGUgQm90IFNlcnZpY2UgaGFzIGlzc3VlZCB0b2tlbnMgdW5kZXIgc2V2ZXJhbCBpc3N1ZXJzIGFjcm9zcyBjaGFubmVsIGFuZFxuICogdGVuYW50IGNvbmZpZ3VyYXRpb25zLCBhbmQgYSBzaW5nbGUtdGVuYW50IGJvdCByZWNlaXZlcyB0aGUgdjIgRW50cmEgaXNzdWVyXG4gKiB3aXRoIGl0cyBvd24gdGVuYW50IGlkIHNwbGljZWQgaW4gKGhhbmRsZWQgYnkge0BsaW5rIGlzVHJ1c3RlZElzc3Vlcn0pLiBUaGVcbiAqIGZpeGVkIHNldCBjb3ZlcnMgdGhlIGNoYW5uZWwtaXNzdWVkIGNhc2VzLlxuICovXG5jb25zdCBUUlVTVEVEX0lTU1VFUlMgPSBbXG4gIFwiaHR0cHM6Ly9hcGkuYm90ZnJhbWV3b3JrLmNvbVwiLFxuICBcImh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q2ZDQ5NDIwLWYzOWItNGRmNy1hMWRjLWQ1OWE5MzU4NzFkYi9cIixcbiAgXCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vZDZkNDk0MjAtZjM5Yi00ZGY3LWExZGMtZDU5YTkzNTg3MWRiL3YyLjBcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBUb2tlbiBlbmRwb2ludCBpc3N1aW5nIHRoZSBDb25uZWN0b3IgY3JlZGVudGlhbHMgYW4gb3V0Ym91bmQgcmVwbHkgdXNlcy4gKi9cbmNvbnN0IExPR0lOX1RPS0VOX1VSTCA9ICh0ZW5hbnQ6IHN0cmluZykgPT5cbiAgYGh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8ke3RlbmFudH0vb2F1dGgyL3YyLjAvdG9rZW5gO1xuXG4vKipcbiAqIFNjb3BlIHJlcXVlc3RlZCBmb3IgYSBDb25uZWN0b3IgdG9rZW4uIGAuZGVmYXVsdGAgYXNrcyBmb3IgdGhlIGFwcCdzXG4gKiBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgcGVybWlzc2lvbnMsIHdoaWNoIGlzIHdoYXQgYSBib3QgcmVnaXN0cmF0aW9uIGdyYW50cy5cbiAqL1xuY29uc3QgQ09OTkVDVE9SX1NDT1BFID0gXCJodHRwczovL2FwaS5ib3RmcmFtZXdvcmsuY29tLy5kZWZhdWx0XCI7XG5cbi8qKiBUZW5hbnQgdXNlZCBmb3IgYSBtdWx0aS10ZW5hbnQgYm90LCB3aGljaCBoYXMgbm8gdGVuYW50IG9mIGl0cyBvd24uICovXG5jb25zdCBNVUxUSV9URU5BTlQgPSBcImJvdGZyYW1ld29yay5jb21cIjtcblxuLyoqXG4gKiBSZWZyZXNoIGFuIGFjY2VzcyB0b2tlbiB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIEJFRk9SRSBpdCBhY3R1YWxseSBleHBpcmVzLCBzb1xuICogYSB0b2tlbiBuZXZlciBleHBpcmVzIG1pZC1mbGlnaHQgYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSBDb25uZWN0b3IgY2FsbC5cbiAqL1xuY29uc3QgVE9LRU5fU0tFV19NUyA9IDYwXzAwMDtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInRlYW1zOmF1dGhcIik7XG5cbi8qKlxuICogTGF6aWx5LWNyZWF0ZWQsIGNhY2hlZCByZW1vdGUga2V5IHNldC4gYGNyZWF0ZVJlbW90ZUpXS1NldGAgaGFuZGxlcyBpdHMgb3duXG4gKiBrZXkgY2FjaGluZyBhbmQgcm90YXRpb24gKHJlLWZldGNoaW5nIG9ubHkgb24gYW4gdW5rbm93biBga2lkYCksIHNvIHRoaXMgaXNcbiAqIGNyZWF0ZWQgb25jZSBwZXIgcHJvY2VzcyByYXRoZXIgdGhhbiBwZXIgcmVxdWVzdC5cbiAqL1xubGV0IGtleVNldDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUmVtb3RlSldLU2V0PiB8IHVuZGVmaW5lZDtcblxuLyoqIENhY2hlZCBKV0tTIFVSSSBkaXNjb3ZlcmVkIGZyb20gdGhlIE9wZW5JRCBtZXRhZGF0YSBkb2N1bWVudCwga2V5ZWQgYnkgbWV0YWRhdGEgVVJMLiAqL1xubGV0IGp3a3NVcmk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqIE1ldGFkYXRhIFVSTCB0aGUgY2FjaGVkIGtleSBzZXQgd2FzIGJ1aWx0IGZyb20sIHNvIGFuIG92ZXJyaWRlIGJ1c3RzIHRoZSBjYWNoZS4gKi9cbmxldCBrZXlTZXRTb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqIFJlc2V0IGNhY2hlZCBhdXRoIHN0YXRlLiBUZXN0IHNlYW07IG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgY29udHJhY3QuICovXG5leHBvcnQgY29uc3QgcmVzZXRUZWFtc0F1dGggPSAoKTogdm9pZCA9PiB7XG4gIGtleVNldCA9IHVuZGVmaW5lZDtcbiAgandrc1VyaSA9IHVuZGVmaW5lZDtcbiAga2V5U2V0U291cmNlID0gdW5kZWZpbmVkO1xuICB0b2tlbkNhY2hlID0gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBEaXNjb3ZlciB0aGUgc2lnbmluZyBKV0tTIFVSSSBmcm9tIHRoZSBCb3QgRnJhbWV3b3JrIE9wZW5JRCBtZXRhZGF0YS5cbiAqXG4gKiBDYWNoZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzOiBpdCBpcyBhIHN0YWJsZSBwb2ludGVyLCBhbmQgdGhlIGtleVxuICogcm90YXRpb24gdGhhdCBhY3R1YWxseSBtYXR0ZXJzIGhhcHBlbnMgaW5zaWRlIHRoZSBrZXkgc2V0IGl0IG5hbWVzLlxuICovXG5jb25zdCBkaXNjb3Zlckp3a3NVcmkgPSBhc3luYyAobWV0YWRhdGFVcmw6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoandrc1VyaSAmJiBrZXlTZXRTb3VyY2UgPT09IG1ldGFkYXRhVXJsKSByZXR1cm4gandrc1VyaTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChtZXRhZGF0YVVybCwgeyAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGVhbXM6IGNvdWxkIG5vdCBmZXRjaCBCb3QgRnJhbWV3b3JrIE9wZW5JRCBtZXRhZGF0YSAoJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICB9XG4gIGNvbnN0IG1ldGFkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd2tzX3VyaT86IHVua25vd24gfTtcbiAgY29uc3QgdXJpID0gdHlwZW9mIG1ldGFkYXRhLmp3a3NfdXJpID09PSBcInN0cmluZ1wiID8gbWV0YWRhdGEuandrc191cmkgOiBudWxsO1xuICBpZiAoIXVyaSkgdGhyb3cgbmV3IEVycm9yKFwidGVhbXM6IEJvdCBGcmFtZXdvcmsgT3BlbklEIG1ldGFkYXRhIGNhcnJpZWQgbm8gandrc191cmlcIik7XG4gIGp3a3NVcmkgPSB1cmk7XG4gIGtleVNldFNvdXJjZSA9IG1ldGFkYXRhVXJsO1xuICByZXR1cm4gdXJpO1xufTtcblxuLyoqIFRoZSBrZXkgc2V0IGZvciB0aGUgZGlzY292ZXJlZCBKV0tTIFVSSSwgY3JlYXRlZCBvbmNlIGFuZCByZXVzZWQuICovXG5jb25zdCBzaWduaW5nS2V5cyA9IGFzeW5jIChcbiAgbWV0YWRhdGFVcmw6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlbW90ZUpXS1NldD4+ID0+IHtcbiAgaWYgKGtleVNldCAmJiBrZXlTZXRTb3VyY2UgPT09IG1ldGFkYXRhVXJsKSByZXR1cm4ga2V5U2V0O1xuICBjb25zdCB1cmkgPSBhd2FpdCBkaXNjb3Zlckp3a3NVcmkobWV0YWRhdGFVcmwsIHNpZ25hbCk7XG4gIGtleVNldCA9IGNyZWF0ZVJlbW90ZUpXS1NldChuZXcgVVJMKHVyaSkpO1xuICByZXR1cm4ga2V5U2V0O1xufTtcblxuLyoqXG4gKiBXaGV0aGVyIGBpc3N1ZXJgIGlzIG9uZSB0aGlzIGJvdCBhY2NlcHRzLlxuICpcbiAqIEEgc2luZ2xlLXRlbmFudCBib3QgcmVjZWl2ZXMgdG9rZW5zIGlzc3VlZCBieSBpdHMgT1dOIHRlbmFudCwgc28gdGhlXG4gKiBjb25maWd1cmVkIHRlbmFudCdzIHYyIGlzc3VlciBpcyBhY2NlcHRlZCBpbiBhZGRpdGlvbiB0byB0aGUgZml4ZWQgY2hhbm5lbFxuICogaXNzdWVycy5cbiAqL1xuY29uc3QgaXNUcnVzdGVkSXNzdWVyID0gKGlzc3Vlcjogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWlzc3VlcikgcmV0dXJuIGZhbHNlO1xuICBpZiAoKFRSVVNURURfSVNTVUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoaXNzdWVyKSkgcmV0dXJuIHRydWU7XG4gIGlmICghdGVuYW50SWQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChcbiAgICBpc3N1ZXIgPT09IGBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vJHt0ZW5hbnRJZH0vdjIuMGAgfHxcbiAgICBpc3N1ZXIgPT09IGBodHRwczovL3N0cy53aW5kb3dzLm5ldC8ke3RlbmFudElkfS9gXG4gICk7XG59O1xuXG4vKiogQSB2ZXJpZmllZCBpbmJvdW5kIEJvdCBGcmFtZXdvcmsgdG9rZW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWVkQm90VG9rZW4ge1xuICAvKiogVGhlIHRva2VuJ3MgY2xhaW1zLCBhZnRlciBzaWduYXR1cmUgLyBpc3N1ZXIgLyBhdWRpZW5jZSB2YWxpZGF0aW9uLiAqL1xuICBjbGFpbXM6IEpXVFBheWxvYWQ7XG4gIC8qKlxuICAgKiBUaGUgYHNlcnZpY2VVcmxgIHRoZSB0b2tlbiB3YXMgaXNzdWVkIGZvciwgd2hlbiBpdCBjYXJyaWVzIG9uZS4gQm90IFNlcnZpY2VcbiAgICogdG9rZW5zIGluY2x1ZGUgdGhpcyBjbGFpbTsgY29tcGFyaW5nIGl0IHRvIHRoZSBhY3Rpdml0eSdzIGBzZXJ2aWNlVXJsYCBpc1xuICAgKiB3aGF0IHN0b3BzIGEgdmFsaWQgdG9rZW4gYmVpbmcgcmVwbGF5ZWQgdG8gcmVkaXJlY3QgcmVwbGllcyBlbHNld2hlcmUuXG4gICAqL1xuICBzZXJ2aWNlVXJsPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHZlcmlmeUJvdFRva2VufS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5T3B0aW9ucyB7XG4gIC8qKiBUaGUgYm90J3MgYXBwIGlkOyB0aGUgT05MWSBhdWRpZW5jZSBhbiBpbmJvdW5kIHRva2VuIG1heSBjYXJyeS4gKi9cbiAgYXBwSWQ6IHN0cmluZztcbiAgLyoqIFRlbmFudCBvZiBhIHNpbmdsZS10ZW5hbnQgYm90LCB3aG9zZSBvd24gaXNzdWVyIGlzIHRoZW4gYWxzbyBhY2NlcHRlZC4gKi9cbiAgYXBwVGVuYW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcGVuSUQgbWV0YWRhdGEgZG9jdW1lbnQgbmFtaW5nIHRoZSBzaWduaW5nIGtleSBzZXQuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBCT1RfT1BFTklEX01FVEFEQVRBfTsgb3ZlcnJpZGUgZm9yIGEgc292ZXJlaWduIGNsb3VkLlxuICAgKi9cbiAgbWV0YWRhdGFVcmw/OiBzdHJpbmc7XG4gIC8qKiBDYW5jZWxzIHRoZSBtZXRhZGF0YSAvIEpXS1MgZmV0Y2ggd2l0aCB0aGUgcmVxdWVzdC4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoZSBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIG9uIGFuIGluYm91bmQgQm90IFNlcnZpY2UgcmVxdWVzdC5cbiAqXG4gKiBSZWplY3RzIChieSB0aHJvd2luZykgYSBtaXNzaW5nIC8gbWFsZm9ybWVkIGhlYWRlciwgYSBiYWQgc2lnbmF0dXJlLCBhblxuICogdW50cnVzdGVkIGlzc3Vlciwgb3IgYW4gYXVkaWVuY2UgdGhhdCBpcyBub3QgdGhpcyBib3QncyBgYXBwSWRgLiBUaGUgY2FsbGVyXG4gKiB0dXJucyBhIHRocm93IGludG8gYSA0MDEgLSBuZXZlciBpbnRvIGEgcHJvY2Vzc2VkIGFjdGl2aXR5LlxuICovXG5leHBvcnQgY29uc3QgdmVyaWZ5Qm90VG9rZW4gPSBhc3luYyAoXG4gIGF1dGhvcml6YXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVmVyaWZ5T3B0aW9ucyxcbik6IFByb21pc2U8VmVyaWZpZWRCb3RUb2tlbj4gPT4ge1xuICBjb25zdCB0b2tlbiA9IGJlYXJlclRva2VuKGF1dGhvcml6YXRpb24pO1xuICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJ0ZWFtczogcmVxdWVzdCBjYXJyaWVkIG5vIGJlYXJlciB0b2tlblwiKTtcblxuICBjb25zdCBrZXlzID0gYXdhaXQgc2lnbmluZ0tleXMob3B0aW9ucy5tZXRhZGF0YVVybCA/PyBCT1RfT1BFTklEX01FVEFEQVRBLCBvcHRpb25zLnNpZ25hbCk7XG4gIC8vIGBhdWRpZW5jZWAgaXMgZW5mb3JjZWQgYnkgdGhlIHZlcmlmaWVyIGl0c2VsZjogYSB0b2tlbiB0aGUgQm90IFNlcnZpY2VcbiAgLy8gaXNzdWVkIGZvciBzb21lb25lIGVsc2UncyBib3QgdmVyaWZpZXMgYWdhaW5zdCB0aGlzIHNhbWUgSldLUywgc28gdGhlXG4gIC8vIGF1ZGllbmNlIGNoZWNrIC0gbm90IHRoZSBzaWduYXR1cmUgLSBpcyB3aGF0IGJpbmRzIGEgcmVxdWVzdCB0byBUSElTIGJvdC5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBhd2FpdCBqd3RWZXJpZnkodG9rZW4sIGtleXMsIHsgYXVkaWVuY2U6IG9wdGlvbnMuYXBwSWQgfSk7XG5cbiAgaWYgKCFpc1RydXN0ZWRJc3N1ZXIocGF5bG9hZC5pc3MsIG9wdGlvbnMuYXBwVGVuYW50SWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0ZWFtczogdW50cnVzdGVkIHRva2VuIGlzc3VlciAnJHtwYXlsb2FkLmlzcyA/PyBcIm5vbmVcIn0nYCk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlVXJsID0gdHlwZW9mIHBheWxvYWQuc2VydmljZXVybCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQuc2VydmljZXVybCA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgY2xhaW1zOiBwYXlsb2FkLCAuLi4oc2VydmljZVVybCA/IHsgc2VydmljZVVybCB9IDoge30pIH07XG59O1xuXG4vKiogUmVhZCB0aGUgYmVhcmVyIHZhbHVlIG91dCBvZiBhbiBgQXV0aG9yaXphdGlvbmAgaGVhZGVyLiAqL1xuY29uc3QgYmVhcmVyVG9rZW4gPSAoYXV0aG9yaXphdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICghYXV0aG9yaXphdGlvbikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFtzY2hlbWUsIHZhbHVlXSA9IGF1dGhvcml6YXRpb24uc3BsaXQoL1xccysvLCAyKTtcbiAgaWYgKCF2YWx1ZSB8fCBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgIT09IFwiYmVhcmVyXCIpIHJldHVybiBudWxsO1xuICByZXR1cm4gdmFsdWUudHJpbSgpIHx8IG51bGw7XG59O1xuXG4vKiogQSBjYWNoZWQgQ29ubmVjdG9yIGFjY2VzcyB0b2tlbiBhbmQgdGhlIG1vbWVudCBpdCBzdG9wcyBiZWluZyB1c2FibGUuICovXG5pbnRlcmZhY2UgQ2FjaGVkVG9rZW4ge1xuICB0b2tlbjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxubGV0IHRva2VuQ2FjaGU6IENhY2hlZFRva2VuIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEZldGNoIChvciByZXVzZSkgYSBDb25uZWN0b3IgQVBJIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGJvdCdzIG93biBhcHBcbiAqIHJlZ2lzdHJhdGlvbi5cbiAqXG4gKiBDYWNoZWQgdW50aWwgc2hvcnRseSBiZWZvcmUgZXhwaXJ5OiBhIENvbm5lY3RvciB0b2tlbiBpcyB2YWxpZCBmb3IgfjFoLCBhbmRcbiAqIHJlLWZldGNoaW5nIHBlciByZXBseSB3b3VsZCBhZGQgYSByb3VuZCB0cmlwIHRvIGV2ZXJ5IHR1cm4uXG4gKi9cbmV4cG9ydCBjb25zdCBjb25uZWN0b3JUb2tlbiA9IGFzeW5jIChvcHRpb25zOiB7XG4gIGFwcElkOiBzdHJpbmc7XG4gIGFwcFBhc3N3b3JkOiBzdHJpbmc7XG4gIGFwcFRlbmFudElkPzogc3RyaW5nO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAodG9rZW5DYWNoZSAmJiB0b2tlbkNhY2hlLmV4cGlyZXNBdCA+IG5vdykgcmV0dXJuIHRva2VuQ2FjaGUudG9rZW47XG5cbiAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGdyYW50X3R5cGU6IFwiY2xpZW50X2NyZWRlbnRpYWxzXCIsXG4gICAgY2xpZW50X2lkOiBvcHRpb25zLmFwcElkLFxuICAgIGNsaWVudF9zZWNyZXQ6IG9wdGlvbnMuYXBwUGFzc3dvcmQsXG4gICAgc2NvcGU6IENPTk5FQ1RPUl9TQ09QRSxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goTE9HSU5fVE9LRU5fVVJMKG9wdGlvbnMuYXBwVGVuYW50SWQgPz8gTVVMVElfVEVOQU5UKSwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiIH0sXG4gICAgYm9keSxcbiAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBkZXRhaWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHRlYW1zOiBjb3VsZCBub3Qgb2J0YWluIGEgQ29ubmVjdG9yIHRva2VuICgke3Jlc3BvbnNlLnN0YXR1c30pICR7ZGV0YWlsfWAudHJpbSgpLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgYWNjZXNzX3Rva2VuPzogdW5rbm93bjsgZXhwaXJlc19pbj86IHVua25vd24gfTtcbiAgY29uc3QgdG9rZW4gPSB0eXBlb2YgcGF5bG9hZC5hY2Nlc3NfdG9rZW4gPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkLmFjY2Vzc190b2tlbiA6IG51bGw7XG4gIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihcInRlYW1zOiB0b2tlbiByZXNwb25zZSBjYXJyaWVkIG5vIGFjY2Vzc190b2tlblwiKTtcbiAgY29uc3QgZXhwaXJlc0luID0gdHlwZW9mIHBheWxvYWQuZXhwaXJlc19pbiA9PT0gXCJudW1iZXJcIiA/IHBheWxvYWQuZXhwaXJlc19pbiA6IDM2MDA7XG4gIHRva2VuQ2FjaGUgPSB7IHRva2VuLCBleHBpcmVzQXQ6IG5vdyArIGV4cGlyZXNJbiAqIDEwMDAgLSBUT0tFTl9TS0VXX01TIH07XG4gIGxvZ2dlci5kZWJ1ZyhcImNvbm5lY3RvciB0b2tlbiByZWZyZXNoZWRcIiwgeyBleHBpcmVzSW4gfSk7XG4gIHJldHVybiB0b2tlbjtcbn07XG5cbi8qKlxuICogSG9zdCBzdWZmaXhlcyByZXBsaWVzIG1heSBiZSBzZW50IHRvIHdoZW4gdGhlIHRva2VuIHBpbnMgbm8gYHNlcnZpY2VVcmxgLlxuICpcbiAqIGBzbWJhLnRyYWZmaWNtYW5hZ2VyLm5ldGAgaXMgdGhlIG9uZSB0aGF0IG1hdHRlcnMgaW4gcHJhY3RpY2U6IHRoYXQgaXMgd2hlcmVcbiAqIFRlYW1zIGl0c2VsZiBzZXJ2ZXMgdGhlIENvbm5lY3RvciBBUEkgZnJvbSAocGVyLXJlZ2lvbiwgZS5nLlxuICogYGh0dHBzOi8vc21iYS50cmFmZmljbWFuYWdlci5uZXQvYW1lci9gKSwgc28gb21pdHRpbmcgaXQgd291bGQgcmVqZWN0IGV2ZXJ5XG4gKiByZWFsIFRlYW1zIHJlcGx5LiBDb21wYXJlZCBhcyBkb3QtcHJlZml4ZWQgc3VmZml4ZXMgKG9yIGV4YWN0IG1hdGNoZXMpIHNvIGFcbiAqIGxvb2thbGlrZSBob3N0IGxpa2UgYGJvdGZyYW1ld29yay5jb20uYXR0YWNrZXIuZXhhbXBsZWAgY2Fubm90IHBhc3MuXG4gKi9cbmNvbnN0IEFMTE9XRURfU0VSVklDRV9IT1NUUyA9IFtcImJvdGZyYW1ld29yay5jb21cIiwgXCJ0cmFmZmljbWFuYWdlci5uZXRcIiwgXCJtaWNyb3NvZnQuY29tXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIFdoZXRoZXIgYHNlcnZpY2VVcmxgIGlzIG9uZSByZXBsaWVzIG1heSBiZSBzZW50IHRvLlxuICpcbiAqIE9ubHkgZXZlciB0aGUgaG9zdCB0aGUgdmVyaWZpZWQgdG9rZW4gd2FzIGlzc3VlZCBmb3IuIEEgQm90IFNlcnZpY2UgdG9rZW4gaXMgYVxuICogYmVhcmVyIGNyZWRlbnRpYWwsIHNvIGhvbm9yaW5nIHRoZSBgc2VydmljZVVybGAgZnJvbSB0aGUgcmVxdWVzdCBCT0RZIHdvdWxkXG4gKiBsZXQgYSByZXBsYXllZCB0b2tlbiBwb2ludCB0aGUgYm90J3MgYXV0aGVudGljYXRlZCByZXBsaWVzIChhbmQgaXRzIHRva2VuKSBhdFxuICogYW4gYXR0YWNrZXItY29udHJvbGxlZCBob3N0LiBXaGVuIHRoZSB0b2tlbiBjYXJyaWVzIG5vIGBzZXJ2aWNldXJsYCBjbGFpbSB0aGVcbiAqIGJvZHkgdmFsdWUgaXMgYWNjZXB0ZWQgYnV0IHJlc3RyaWN0ZWQgdG8gTWljcm9zb2Z0J3Mgb3duIGRvbWFpbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FsbG93ZWRTZXJ2aWNlVXJsID0gKHNlcnZpY2VVcmw6IHN0cmluZywgdG9rZW5TZXJ2aWNlVXJsPzogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0b2tlblNlcnZpY2VVcmwpIHJldHVybiBub3JtYWxpemUoc2VydmljZVVybCkgPT09IG5vcm1hbGl6ZSh0b2tlblNlcnZpY2VVcmwpO1xuICB0cnkge1xuICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKHNlcnZpY2VVcmwpO1xuICAgIGlmIChwcm90b2NvbCAhPT0gXCJodHRwczpcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhvc3QgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBBTExPV0VEX1NFUlZJQ0VfSE9TVFMuc29tZShcbiAgICAgIChhbGxvd2VkKSA9PiBob3N0ID09PSBhbGxvd2VkIHx8IGhvc3QuZW5kc1dpdGgoYC4ke2FsbG93ZWR9YCksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVqZWN0aW5nIHVucGFyc2VhYmxlIHNlcnZpY2VVcmxcIiwgeyBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuIl19
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBRXRFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQzlCLG1FQUFtRSxDQUFDO0FBRXRFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGVBQWUsR0FBRztJQUN0Qiw4QkFBOEI7SUFDOUIsK0RBQStEO0lBQy9ELDZFQUE2RTtDQUNyRSxDQUFDO0FBRVgsK0VBQStFO0FBQy9FLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FDekMscUNBQXFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbEU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsdUNBQXVDLENBQUM7QUFFaEUsMEVBQTBFO0FBQzFFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxJQUFJLE1BQXlELENBQUM7QUFFOUQsMkZBQTJGO0FBQzNGLElBQUksT0FBMkIsQ0FBQztBQUVoQyxzRkFBc0Y7QUFDdEYsSUFBSSxZQUFnQyxDQUFDO0FBRXJDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBUyxFQUFFO0lBQ3ZDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkIsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUNwQixZQUFZLEdBQUcsU0FBUyxDQUFD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QUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksUUFBUSxLQUFLLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQy9CLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5ib3VuZCBhbmQgb3V0Ym91bmQgYXV0aGVudGljYXRpb24gZm9yIHRoZSBUZWFtcyBtZXNzYWdpbmcgZW5kcG9pbnQuXG4gKlxuICogYFBPU1QgL2FwaS90ZWFtcy9tZXNzYWdlc2AgaXMgYSBQVUJMSUMgVVJMIC0gQXp1cmUgQm90IFNlcnZpY2UgY2FsbHMgaXQgZnJvbVxuICogdGhlIGludGVybmV0LCBzbyBpdCBjYW5ub3Qgc2l0IGJlaGluZCBBcHBLaXQncyBPQk8gaGVhZGVycyBvciBhIHdvcmtzcGFjZVxuICogbG9naW4uIEl0cyBvbmx5IHRydXN0IGJvdW5kYXJ5IGlzIHRoZSBKV1QgdGhlIEJvdCBTZXJ2aWNlIHNpZ25zIGVhY2ggcmVxdWVzdFxuICogd2l0aCwgd2hpY2ggaXMgd2hhdCB0aGlzIG1vZHVsZSB2ZXJpZmllczpcbiAqXG4gKiAgIDEuIGZldGNoIHRoZSBCb3QgRnJhbWV3b3JrIE9wZW5JRCBtZXRhZGF0YSB0byBkaXNjb3ZlciB0aGUgc2lnbmluZyBKV0tTO1xuICogICAyLiB2ZXJpZnkgdGhlIHRva2VuJ3Mgc2lnbmF0dXJlIGFnYWluc3QgdGhhdCBrZXkgc2V0O1xuICogICAzLiBjaGVjayBgaXNzdWVyYCBpcyBhIGtub3duIEJvdCBTZXJ2aWNlIGlzc3VlciBhbmQgYGF1ZGllbmNlYCBpcyBleGFjdGx5XG4gKiAgICAgIHRoaXMgYm90J3MgYXBwIGlkLlxuICpcbiAqIEFsbCB0aHJlZSBtYXR0ZXIuIFNraXBwaW5nICgzKSBpcyB0aGUgY2xhc3NpYyBib3QgdnVsbmVyYWJpbGl0eTogYSB0b2tlbiB0aGVcbiAqIEJvdCBTZXJ2aWNlIGxlZ2l0aW1hdGVseSBpc3N1ZWQgZm9yIGEgRElGRkVSRU5UIGJvdCBzdGlsbCB2ZXJpZmllcyBhZ2FpbnN0IHRoZVxuICogc2FtZSBKV0tTLCBzbyB3aXRob3V0IGFuIGF1ZGllbmNlIGNoZWNrIGFueW9uZSB3aXRoIHRoZWlyIG93biBib3QgY291bGQgZHJpdmVcbiAqIHRoaXMgYWdlbnQuXG4gKlxuICogVGhlIG91dGJvdW5kIGhhbGYgaXMgdGhlIHJldmVyc2U6IHJlcGxpZXMgZ28gdG8gdGhlIENvbm5lY3RvciBBUEksIHdoaWNoIG5lZWRzXG4gKiBhIGNsaWVudC1jcmVkZW50aWFscyB0b2tlbiBmb3IgdGhlIGJvdCdzIG93biBhcHAgcmVnaXN0cmF0aW9uLiBCb3RoIGtleSBzZXRzXG4gKiBhbmQgdG9rZW5zIGFyZSBjYWNoZWQsIHNpbmNlIGEgYnVzeSBjaGFubmVsIHdvdWxkIG90aGVyd2lzZSByZS1mZXRjaCBtZXRhZGF0YVxuICogb24gZXZlcnkgdHVybi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3IsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBjcmVhdGVSZW1vdGVKV0tTZXQsIGp3dFZlcmlmeSwgdHlwZSBKV1RQYXlsb2FkIH0gZnJvbSBcImpvc2VcIjtcblxuLyoqXG4gKiBPcGVuSUQgbWV0YWRhdGEgZG9jdW1lbnQgZm9yIHRva2VucyB0aGUgQm90IFNlcnZpY2Ugc2VuZHMgYSBib3QgaW4gdGhlIHB1YmxpY1xuICogY2xvdWQuIFRoZSBKV0tTIFVSSSBpcyByZWFkIGZyb20gdGhpcyBkb2N1bWVudCByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIHNvIGEga2V5XG4gKiByb3RhdGlvbiBvbiBNaWNyb3NvZnQncyBzaWRlIG5lZWRzIG5vIHJlbGVhc2UgaGVyZS5cbiAqXG4gKiBPdmVycmlkYWJsZSBwZXIgY2FsbCAoe0BsaW5rIFZlcmlmeU9wdGlvbnMubWV0YWRhdGFVcmx9KSBiZWNhdXNlIGEgc292ZXJlaWduXG4gKiBjbG91ZCAoR0NDIEhpZ2ggLyBEb0QpIHB1Ymxpc2hlcyBpdHMgb3duIG1ldGFkYXRhIGVuZHBvaW50IC0gYW5kIGJlY2F1c2UgaXRcbiAqIG1ha2VzIHRoZSB2ZXJpZmllciB0ZXN0YWJsZSBhZ2FpbnN0IGEgbG9jYWwga2V5IHNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IEJPVF9PUEVOSURfTUVUQURBVEEgPVxuICBcImh0dHBzOi8vbG9naW4uYm90ZnJhbWV3b3JrLmNvbS92MS8ud2VsbC1rbm93bi9vcGVuaWRjb25maWd1cmF0aW9uXCI7XG5cbi8qKlxuICogQWNjZXB0ZWQgYGlzc2AgdmFsdWVzIG9uIGFuIGluYm91bmQgdG9rZW4uXG4gKlxuICogVGhlIEJvdCBTZXJ2aWNlIGhhcyBpc3N1ZWQgdG9rZW5zIHVuZGVyIHNldmVyYWwgaXNzdWVycyBhY3Jvc3MgY2hhbm5lbCBhbmRcbiAqIHRlbmFudCBjb25maWd1cmF0aW9ucywgYW5kIGEgc2luZ2xlLXRlbmFudCBib3QgcmVjZWl2ZXMgdGhlIHYyIEVudHJhIGlzc3VlclxuICogd2l0aCBpdHMgb3duIHRlbmFudCBpZCBzcGxpY2VkIGluIChoYW5kbGVkIGJ5IHtAbGluayBpc1RydXN0ZWRJc3N1ZXJ9KS4gVGhlXG4gKiBmaXhlZCBzZXQgY292ZXJzIHRoZSBjaGFubmVsLWlzc3VlZCBjYXNlcy5cbiAqL1xuY29uc3QgVFJVU1RFRF9JU1NVRVJTID0gW1xuICBcImh0dHBzOi8vYXBpLmJvdGZyYW1ld29yay5jb21cIixcbiAgXCJodHRwczovL3N0cy53aW5kb3dzLm5ldC9kNmQ0OTQyMC1mMzliLTRkZjctYTFkYy1kNTlhOTM1ODcxZGIvXCIsXG4gIFwiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q2ZDQ5NDIwLWYzOWItNGRmNy1hMWRjLWQ1OWE5MzU4NzFkYi92Mi4wXCIsXG5dIGFzIGNvbnN0O1xuXG4vKiogVG9rZW4gZW5kcG9pbnQgaXNzdWluZyB0aGUgQ29ubmVjdG9yIGNyZWRlbnRpYWxzIGFuIG91dGJvdW5kIHJlcGx5IHVzZXMuICovXG5jb25zdCBMT0dJTl9UT0tFTl9VUkwgPSAodGVuYW50OiBzdHJpbmcpID0+XG4gIGBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vJHt0ZW5hbnR9L29hdXRoMi92Mi4wL3Rva2VuYDtcblxuLyoqXG4gKiBTY29wZSByZXF1ZXN0ZWQgZm9yIGEgQ29ubmVjdG9yIHRva2VuLiBgLmRlZmF1bHRgIGFza3MgZm9yIHRoZSBhcHAnc1xuICogc3RhdGljYWxseSBjb25maWd1cmVkIHBlcm1pc3Npb25zLCB3aGljaCBpcyB3aGF0IGEgYm90IHJlZ2lzdHJhdGlvbiBncmFudHMuXG4gKi9cbmNvbnN0IENPTk5FQ1RPUl9TQ09QRSA9IFwiaHR0cHM6Ly9hcGkuYm90ZnJhbWV3b3JrLmNvbS8uZGVmYXVsdFwiO1xuXG4vKiogVGVuYW50IHVzZWQgZm9yIGEgbXVsdGktdGVuYW50IGJvdCwgd2hpY2ggaGFzIG5vIHRlbmFudCBvZiBpdHMgb3duLiAqL1xuY29uc3QgTVVMVElfVEVOQU5UID0gXCJib3RmcmFtZXdvcmsuY29tXCI7XG5cbi8qKlxuICogUmVmcmVzaCBhbiBhY2Nlc3MgdG9rZW4gdGhpcyBtYW55IG1pbGxpc2Vjb25kcyBCRUZPUkUgaXQgYWN0dWFsbHkgZXhwaXJlcywgc29cbiAqIGEgdG9rZW4gbmV2ZXIgZXhwaXJlcyBtaWQtZmxpZ2h0IGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgQ29ubmVjdG9yIGNhbGwuXG4gKi9cbmNvbnN0IFRPS0VOX1NLRVdfTVMgPSA2MF8wMDA7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0ZWFtczphdXRoXCIpO1xuXG4vKipcbiAqIExhemlseS1jcmVhdGVkLCBjYWNoZWQgcmVtb3RlIGtleSBzZXQuIGBjcmVhdGVSZW1vdGVKV0tTZXRgIGhhbmRsZXMgaXRzIG93blxuICoga2V5IGNhY2hpbmcgYW5kIHJvdGF0aW9uIChyZS1mZXRjaGluZyBvbmx5IG9uIGFuIHVua25vd24gYGtpZGApLCBzbyB0aGlzIGlzXG4gKiBjcmVhdGVkIG9uY2UgcGVyIHByb2Nlc3MgcmF0aGVyIHRoYW4gcGVyIHJlcXVlc3QuXG4gKi9cbmxldCBrZXlTZXQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlbW90ZUpXS1NldD4gfCB1bmRlZmluZWQ7XG5cbi8qKiBDYWNoZWQgSldLUyBVUkkgZGlzY292ZXJlZCBmcm9tIHRoZSBPcGVuSUQgbWV0YWRhdGEgZG9jdW1lbnQsIGtleWVkIGJ5IG1ldGFkYXRhIFVSTC4gKi9cbmxldCBqd2tzVXJpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbi8qKiBNZXRhZGF0YSBVUkwgdGhlIGNhY2hlZCBrZXkgc2V0IHdhcyBidWlsdCBmcm9tLCBzbyBhbiBvdmVycmlkZSBidXN0cyB0aGUgY2FjaGUuICovXG5sZXQga2V5U2V0U291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXNldCBjYWNoZWQgYXV0aCBzdGF0ZS4gVGVzdCBzZWFtOyBub3QgcGFydCBvZiB0aGUgcHVibGljIGNvbnRyYWN0LiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0VGVhbXNBdXRoID0gKCk6IHZvaWQgPT4ge1xuICBrZXlTZXQgPSB1bmRlZmluZWQ7XG4gIGp3a3NVcmkgPSB1bmRlZmluZWQ7XG4gIGtleVNldFNvdXJjZSA9IHVuZGVmaW5lZDtcbiAgdG9rZW5DYWNoZS5jbGVhcigpO1xufTtcblxuLyoqXG4gKiBEaXNjb3ZlciB0aGUgc2lnbmluZyBKV0tTIFVSSSBmcm9tIHRoZSBCb3QgRnJhbWV3b3JrIE9wZW5JRCBtZXRhZGF0YS5cbiAqXG4gKiBDYWNoZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzOiBpdCBpcyBhIHN0YWJsZSBwb2ludGVyLCBhbmQgdGhlIGtleVxuICogcm90YXRpb24gdGhhdCBhY3R1YWxseSBtYXR0ZXJzIGhhcHBlbnMgaW5zaWRlIHRoZSBrZXkgc2V0IGl0IG5hbWVzLlxuICovXG5jb25zdCBkaXNjb3Zlckp3a3NVcmkgPSBhc3luYyAobWV0YWRhdGFVcmw6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoandrc1VyaSAmJiBrZXlTZXRTb3VyY2UgPT09IG1ldGFkYXRhVXJsKSByZXR1cm4gandrc1VyaTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChtZXRhZGF0YVVybCwgeyAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGVhbXM6IGNvdWxkIG5vdCBmZXRjaCBCb3QgRnJhbWV3b3JrIE9wZW5JRCBtZXRhZGF0YSAoJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICB9XG4gIGNvbnN0IG1ldGFkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd2tzX3VyaT86IHVua25vd24gfTtcbiAgY29uc3QgdXJpID0gdHlwZW9mIG1ldGFkYXRhLmp3a3NfdXJpID09PSBcInN0cmluZ1wiID8gbWV0YWRhdGEuandrc191cmkgOiBudWxsO1xuICBpZiAoIXVyaSkgdGhyb3cgbmV3IEVycm9yKFwidGVhbXM6IEJvdCBGcmFtZXdvcmsgT3BlbklEIG1ldGFkYXRhIGNhcnJpZWQgbm8gandrc191cmlcIik7XG4gIGp3a3NVcmkgPSB1cmk7XG4gIGtleVNldFNvdXJjZSA9IG1ldGFkYXRhVXJsO1xuICByZXR1cm4gdXJpO1xufTtcblxuLyoqIFRoZSBrZXkgc2V0IGZvciB0aGUgZGlzY292ZXJlZCBKV0tTIFVSSSwgY3JlYXRlZCBvbmNlIGFuZCByZXVzZWQuICovXG5jb25zdCBzaWduaW5nS2V5cyA9IGFzeW5jIChcbiAgbWV0YWRhdGFVcmw6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVJlbW90ZUpXS1NldD4+ID0+IHtcbiAgaWYgKGtleVNldCAmJiBrZXlTZXRTb3VyY2UgPT09IG1ldGFkYXRhVXJsKSByZXR1cm4ga2V5U2V0O1xuICBjb25zdCB1cmkgPSBhd2FpdCBkaXNjb3Zlckp3a3NVcmkobWV0YWRhdGFVcmwsIHNpZ25hbCk7XG4gIGtleVNldCA9IGNyZWF0ZVJlbW90ZUpXS1NldChuZXcgVVJMKHVyaSkpO1xuICByZXR1cm4ga2V5U2V0O1xufTtcblxuLyoqXG4gKiBXaGV0aGVyIGBpc3N1ZXJgIGlzIG9uZSB0aGlzIGJvdCBhY2NlcHRzLlxuICpcbiAqIEEgc2luZ2xlLXRlbmFudCBib3QgcmVjZWl2ZXMgdG9rZW5zIGlzc3VlZCBieSBpdHMgT1dOIHRlbmFudCwgc28gdGhlXG4gKiBjb25maWd1cmVkIHRlbmFudCdzIHYyIGlzc3VlciBpcyBhY2NlcHRlZCBpbiBhZGRpdGlvbiB0byB0aGUgZml4ZWQgY2hhbm5lbFxuICogaXNzdWVycy5cbiAqL1xuY29uc3QgaXNUcnVzdGVkSXNzdWVyID0gKGlzc3Vlcjogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWlzc3VlcikgcmV0dXJuIGZhbHNlO1xuICBpZiAoKFRSVVNURURfSVNTVUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoaXNzdWVyKSkgcmV0dXJuIHRydWU7XG4gIGlmICghdGVuYW50SWQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChcbiAgICBpc3N1ZXIgPT09IGBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vJHt0ZW5hbnRJZH0vdjIuMGAgfHxcbiAgICBpc3N1ZXIgPT09IGBodHRwczovL3N0cy53aW5kb3dzLm5ldC8ke3RlbmFudElkfS9gXG4gICk7XG59O1xuXG4vKiogQSB2ZXJpZmllZCBpbmJvdW5kIEJvdCBGcmFtZXdvcmsgdG9rZW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWVkQm90VG9rZW4ge1xuICAvKiogVGhlIHRva2VuJ3MgY2xhaW1zLCBhZnRlciBzaWduYXR1cmUgLyBpc3N1ZXIgLyBhdWRpZW5jZSB2YWxpZGF0aW9uLiAqL1xuICBjbGFpbXM6IEpXVFBheWxvYWQ7XG4gIC8qKlxuICAgKiBUaGUgYHNlcnZpY2VVcmxgIHRoZSB0b2tlbiB3YXMgaXNzdWVkIGZvciwgd2hlbiBpdCBjYXJyaWVzIG9uZS4gQm90IFNlcnZpY2VcbiAgICogdG9rZW5zIGluY2x1ZGUgdGhpcyBjbGFpbTsgY29tcGFyaW5nIGl0IHRvIHRoZSBhY3Rpdml0eSdzIGBzZXJ2aWNlVXJsYCBpc1xuICAgKiB3aGF0IHN0b3BzIGEgdmFsaWQgdG9rZW4gYmVpbmcgcmVwbGF5ZWQgdG8gcmVkaXJlY3QgcmVwbGllcyBlbHNld2hlcmUuXG4gICAqL1xuICBzZXJ2aWNlVXJsPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHZlcmlmeUJvdFRva2VufS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5T3B0aW9ucyB7XG4gIC8qKiBUaGUgYm90J3MgYXBwIGlkOyB0aGUgT05MWSBhdWRpZW5jZSBhbiBpbmJvdW5kIHRva2VuIG1heSBjYXJyeS4gKi9cbiAgYXBwSWQ6IHN0cmluZztcbiAgLyoqIFRlbmFudCBvZiBhIHNpbmdsZS10ZW5hbnQgYm90LCB3aG9zZSBvd24gaXNzdWVyIGlzIHRoZW4gYWxzbyBhY2NlcHRlZC4gKi9cbiAgYXBwVGVuYW50SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcGVuSUQgbWV0YWRhdGEgZG9jdW1lbnQgbmFtaW5nIHRoZSBzaWduaW5nIGtleSBzZXQuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBCT1RfT1BFTklEX01FVEFEQVRBfTsgb3ZlcnJpZGUgZm9yIGEgc292ZXJlaWduIGNsb3VkLlxuICAgKi9cbiAgbWV0YWRhdGFVcmw/OiBzdHJpbmc7XG4gIC8qKiBDYW5jZWxzIHRoZSBtZXRhZGF0YSAvIEpXS1MgZmV0Y2ggd2l0aCB0aGUgcmVxdWVzdC4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoZSBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIG9uIGFuIGluYm91bmQgQm90IFNlcnZpY2UgcmVxdWVzdC5cbiAqXG4gKiBSZWplY3RzIChieSB0aHJvd2luZykgYSBtaXNzaW5nIC8gbWFsZm9ybWVkIGhlYWRlciwgYSBiYWQgc2lnbmF0dXJlLCBhblxuICogdW50cnVzdGVkIGlzc3Vlciwgb3IgYW4gYXVkaWVuY2UgdGhhdCBpcyBub3QgdGhpcyBib3QncyBgYXBwSWRgLiBUaGUgY2FsbGVyXG4gKiB0dXJucyBhIHRocm93IGludG8gYSA0MDEgLSBuZXZlciBpbnRvIGEgcHJvY2Vzc2VkIGFjdGl2aXR5LlxuICovXG5leHBvcnQgY29uc3QgdmVyaWZ5Qm90VG9rZW4gPSBhc3luYyAoXG4gIGF1dGhvcml6YXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVmVyaWZ5T3B0aW9ucyxcbik6IFByb21pc2U8VmVyaWZpZWRCb3RUb2tlbj4gPT4ge1xuICBjb25zdCB0b2tlbiA9IGJlYXJlclRva2VuKGF1dGhvcml6YXRpb24pO1xuICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJ0ZWFtczogcmVxdWVzdCBjYXJyaWVkIG5vIGJlYXJlciB0b2tlblwiKTtcblxuICBjb25zdCBrZXlzID0gYXdhaXQgc2lnbmluZ0tleXMob3B0aW9ucy5tZXRhZGF0YVVybCA/PyBCT1RfT1BFTklEX01FVEFEQVRBLCBvcHRpb25zLnNpZ25hbCk7XG4gIC8vIGBhdWRpZW5jZWAgaXMgZW5mb3JjZWQgYnkgdGhlIHZlcmlmaWVyIGl0c2VsZjogYSB0b2tlbiB0aGUgQm90IFNlcnZpY2VcbiAgLy8gaXNzdWVkIGZvciBzb21lb25lIGVsc2UncyBib3QgdmVyaWZpZXMgYWdhaW5zdCB0aGlzIHNhbWUgSldLUywgc28gdGhlXG4gIC8vIGF1ZGllbmNlIGNoZWNrIC0gbm90IHRoZSBzaWduYXR1cmUgLSBpcyB3aGF0IGJpbmRzIGEgcmVxdWVzdCB0byBUSElTIGJvdC5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBhd2FpdCBqd3RWZXJpZnkodG9rZW4sIGtleXMsIHsgYXVkaWVuY2U6IG9wdGlvbnMuYXBwSWQgfSk7XG5cbiAgaWYgKCFpc1RydXN0ZWRJc3N1ZXIocGF5bG9hZC5pc3MsIG9wdGlvbnMuYXBwVGVuYW50SWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0ZWFtczogdW50cnVzdGVkIHRva2VuIGlzc3VlciAnJHtwYXlsb2FkLmlzcyA/PyBcIm5vbmVcIn0nYCk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlVXJsID0gdHlwZW9mIHBheWxvYWQuc2VydmljZXVybCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQuc2VydmljZXVybCA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgY2xhaW1zOiBwYXlsb2FkLCAuLi4oc2VydmljZVVybCA/IHsgc2VydmljZVVybCB9IDoge30pIH07XG59O1xuXG4vKiogUmVhZCB0aGUgYmVhcmVyIHZhbHVlIG91dCBvZiBhbiBgQXV0aG9yaXphdGlvbmAgaGVhZGVyLiAqL1xuY29uc3QgYmVhcmVyVG9rZW4gPSAoYXV0aG9yaXphdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICghYXV0aG9yaXphdGlvbikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFtzY2hlbWUsIHZhbHVlXSA9IGF1dGhvcml6YXRpb24uc3BsaXQoL1xccysvLCAyKTtcbiAgaWYgKCF2YWx1ZSB8fCBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgIT09IFwiYmVhcmVyXCIpIHJldHVybiBudWxsO1xuICByZXR1cm4gdmFsdWUudHJpbSgpIHx8IG51bGw7XG59O1xuXG4vKiogQSBjYWNoZWQgQ29ubmVjdG9yIGFjY2VzcyB0b2tlbiBhbmQgdGhlIG1vbWVudCBpdCBzdG9wcyBiZWluZyB1c2FibGUuICovXG5pbnRlcmZhY2UgQ2FjaGVkVG9rZW4ge1xuICB0b2tlbjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuLyoqIFBlci1ib3QgY2FjaGVkIHZhbHVlIHBsdXMgYSBzaGFyZWQgaW4tZmxpZ2h0IHJlZnJlc2guICovXG5pbnRlcmZhY2UgVG9rZW5DYWNoZUVudHJ5IHtcbiAgdmFsdWU/OiBDYWNoZWRUb2tlbjtcbiAgcmVmcmVzaD86IFByb21pc2U8Q2FjaGVkVG9rZW4+O1xufVxuXG5jb25zdCB0b2tlbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRva2VuQ2FjaGVFbnRyeT4oKTtcblxuLyoqIFdhaXQgZm9yIGEgc2hhcmVkIHJlZnJlc2ggd2hpbGUgcHJlc2VydmluZyBwZXItY2FsbGVyIGNhbmNlbGxhdGlvbi4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JUb2tlbihyZWZyZXNoOiBQcm9taXNlPENhY2hlZFRva2VuPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPENhY2hlZFRva2VuPiB7XG4gIGlmICghc2lnbmFsKSByZXR1cm4gcmVmcmVzaDtcbiAgc2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHJlamVjdChzaWduYWwucmVhc29uID8/IG5ldyBFcnJvcihcIkNvbm5lY3RvciB0b2tlbiByZXF1ZXN0IGFib3J0ZWRcIikpO1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHJlZnJlc2gudGhlbihyZXNvbHZlLCByZWplY3QpLmZpbmFsbHkoKCkgPT4gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KSk7XG4gIH0pO1xufVxuXG4vKiogRmV0Y2ggb25lIENvbm5lY3RvciB0b2tlbiB3aXRob3V0IGJpbmRpbmcgdGhlIHNoYXJlZCByZWZyZXNoIHRvIG9uZSBjYWxsZXIncyBzaWduYWwuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoQ29ubmVjdG9yVG9rZW4oXG4gIG9wdGlvbnM6IHsgYXBwSWQ6IHN0cmluZzsgYXBwUGFzc3dvcmQ6IHN0cmluZyB9LFxuICB0ZW5hbnQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIsXG4pOiBQcm9taXNlPENhY2hlZFRva2VuPiB7XG4gIGNvbnN0IGJvZHkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICBncmFudF90eXBlOiBcImNsaWVudF9jcmVkZW50aWFsc1wiLFxuICAgIGNsaWVudF9pZDogb3B0aW9ucy5hcHBJZCxcbiAgICBjbGllbnRfc2VjcmV0OiBvcHRpb25zLmFwcFBhc3N3b3JkLFxuICAgIHNjb3BlOiBDT05ORUNUT1JfU0NPUEUsXG4gIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKExPR0lOX1RPS0VOX1VSTCh0ZW5hbnQpLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSxcbiAgICBib2R5LFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGRldGFpbCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgdGVhbXM6IGNvdWxkIG5vdCBvYnRhaW4gYSBDb25uZWN0b3IgdG9rZW4gKCR7cmVzcG9uc2Uuc3RhdHVzfSkgJHtkZXRhaWx9YC50cmltKCksXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiB1bmtub3duOyBleHBpcmVzX2luPzogdW5rbm93biB9O1xuICBjb25zdCB0b2tlbiA9IHR5cGVvZiBwYXlsb2FkLmFjY2Vzc190b2tlbiA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQuYWNjZXNzX3Rva2VuIDogbnVsbDtcbiAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwidGVhbXM6IHRva2VuIHJlc3BvbnNlIGNhcnJpZWQgbm8gYWNjZXNzX3Rva2VuXCIpO1xuICBjb25zdCBleHBpcmVzSW4gPSB0eXBlb2YgcGF5bG9hZC5leHBpcmVzX2luID09PSBcIm51bWJlclwiID8gcGF5bG9hZC5leHBpcmVzX2luIDogMzYwMDtcbiAgbG9nZ2VyLmRlYnVnKFwiY29ubmVjdG9yIHRva2VuIHJlZnJlc2hlZFwiLCB7IGV4cGlyZXNJbiB9KTtcbiAgcmV0dXJuIHsgdG9rZW4sIGV4cGlyZXNBdDogbm93ICsgZXhwaXJlc0luICogMTAwMCAtIFRPS0VOX1NLRVdfTVMgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCAob3IgcmV1c2UpIGEgQ29ubmVjdG9yIEFQSSBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBib3QncyBvd24gYXBwXG4gKiByZWdpc3RyYXRpb24uXG4gKlxuICogQ2FjaGVkIHVudGlsIHNob3J0bHkgYmVmb3JlIGV4cGlyeTogYSBDb25uZWN0b3IgdG9rZW4gaXMgdmFsaWQgZm9yIH4xaCwgYW5kXG4gKiByZS1mZXRjaGluZyBwZXIgcmVwbHkgd291bGQgYWRkIGEgcm91bmQgdHJpcCB0byBldmVyeSB0dXJuLlxuICovXG5leHBvcnQgY29uc3QgY29ubmVjdG9yVG9rZW4gPSBhc3luYyAob3B0aW9uczoge1xuICBhcHBJZDogc3RyaW5nO1xuICBhcHBQYXNzd29yZDogc3RyaW5nO1xuICBhcHBUZW5hbnRJZD86IHN0cmluZztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGVuYW50ID0gb3B0aW9ucy5hcHBUZW5hbnRJZCA/PyBNVUxUSV9URU5BTlQ7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYCR7dGVuYW50fVxcMCR7b3B0aW9ucy5hcHBJZH1gO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBsZXQgZW50cnkgPSB0b2tlbkNhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghZW50cnkpIHtcbiAgICBlbnRyeSA9IHt9O1xuICAgIHRva2VuQ2FjaGUuc2V0KGNhY2hlS2V5LCBlbnRyeSk7XG4gIH1cbiAgaWYgKGVudHJ5LnZhbHVlICYmIGVudHJ5LnZhbHVlLmV4cGlyZXNBdCA+IG5vdykgcmV0dXJuIGVudHJ5LnZhbHVlLnRva2VuO1xuICBlbnRyeS5yZWZyZXNoID8/PSByZWZyZXNoQ29ubmVjdG9yVG9rZW4ob3B0aW9ucywgdGVuYW50LCBub3cpXG4gICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgZW50cnkucmVmcmVzaCA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgcmV0dXJuIChhd2FpdCB3YWl0Rm9yVG9rZW4oZW50cnkucmVmcmVzaCwgb3B0aW9ucy5zaWduYWwpKS50b2tlbjtcbn07XG5cbi8qKlxuICogSG9zdCBzdWZmaXhlcyByZXBsaWVzIG1heSBiZSBzZW50IHRvIHdoZW4gdGhlIHRva2VuIHBpbnMgbm8gYHNlcnZpY2VVcmxgLlxuICpcbiAqIGBzbWJhLnRyYWZmaWNtYW5hZ2VyLm5ldGAgaXMgdGhlIG9uZSB0aGF0IG1hdHRlcnMgaW4gcHJhY3RpY2U6IHRoYXQgaXMgd2hlcmVcbiAqIFRlYW1zIGl0c2VsZiBzZXJ2ZXMgdGhlIENvbm5lY3RvciBBUEkgZnJvbSAocGVyLXJlZ2lvbiwgZS5nLlxuICogYGh0dHBzOi8vc21iYS50cmFmZmljbWFuYWdlci5uZXQvYW1lci9gKSwgc28gb21pdHRpbmcgaXQgd291bGQgcmVqZWN0IGV2ZXJ5XG4gKiByZWFsIFRlYW1zIHJlcGx5LiBDb21wYXJlZCBhcyBkb3QtcHJlZml4ZWQgc3VmZml4ZXMgKG9yIGV4YWN0IG1hdGNoZXMpIHNvIGFcbiAqIGxvb2thbGlrZSBob3N0IGxpa2UgYGJvdGZyYW1ld29yay5jb20uYXR0YWNrZXIuZXhhbXBsZWAgY2Fubm90IHBhc3MuXG4gKi9cbmNvbnN0IEFMTE9XRURfU0VSVklDRV9IT1NUUyA9IFtcImJvdGZyYW1ld29yay5jb21cIiwgXCJ0cmFmZmljbWFuYWdlci5uZXRcIiwgXCJtaWNyb3NvZnQuY29tXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIFdoZXRoZXIgYHNlcnZpY2VVcmxgIGlzIG9uZSByZXBsaWVzIG1heSBiZSBzZW50IHRvLlxuICpcbiAqIE9ubHkgZXZlciB0aGUgaG9zdCB0aGUgdmVyaWZpZWQgdG9rZW4gd2FzIGlzc3VlZCBmb3IuIEEgQm90IFNlcnZpY2UgdG9rZW4gaXMgYVxuICogYmVhcmVyIGNyZWRlbnRpYWwsIHNvIGhvbm9yaW5nIHRoZSBgc2VydmljZVVybGAgZnJvbSB0aGUgcmVxdWVzdCBCT0RZIHdvdWxkXG4gKiBsZXQgYSByZXBsYXllZCB0b2tlbiBwb2ludCB0aGUgYm90J3MgYXV0aGVudGljYXRlZCByZXBsaWVzIChhbmQgaXRzIHRva2VuKSBhdFxuICogYW4gYXR0YWNrZXItY29udHJvbGxlZCBob3N0LiBXaGVuIHRoZSB0b2tlbiBjYXJyaWVzIG5vIGBzZXJ2aWNldXJsYCBjbGFpbSB0aGVcbiAqIGJvZHkgdmFsdWUgaXMgYWNjZXB0ZWQgYnV0IHJlc3RyaWN0ZWQgdG8gTWljcm9zb2Z0J3Mgb3duIGRvbWFpbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FsbG93ZWRTZXJ2aWNlVXJsID0gKHNlcnZpY2VVcmw6IHN0cmluZywgdG9rZW5TZXJ2aWNlVXJsPzogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0b2tlblNlcnZpY2VVcmwpIHJldHVybiBub3JtYWxpemUoc2VydmljZVVybCkgPT09IG5vcm1hbGl6ZSh0b2tlblNlcnZpY2VVcmwpO1xuICB0cnkge1xuICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKHNlcnZpY2VVcmwpO1xuICAgIGlmIChwcm90b2NvbCAhPT0gXCJodHRwczpcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhvc3QgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBBTExPV0VEX1NFUlZJQ0VfSE9TVFMuc29tZShcbiAgICAgIChhbGxvd2VkKSA9PiBob3N0ID09PSBhbGxvd2VkIHx8IGhvc3QuZW5kc1dpdGgoYC4ke2FsbG93ZWR9YCksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVqZWN0aW5nIHVucGFyc2VhYmxlIHNlcnZpY2VVcmxcIiwgeyBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuIl19
|
package/lib/src/builder.js
CHANGED
|
@@ -70,12 +70,13 @@ function actionElements(spec) {
|
|
|
70
70
|
* the `adaptivecards` package or post to a Teams incoming webhook.
|
|
71
71
|
*/
|
|
72
72
|
export function buildAdaptiveCard(spec) {
|
|
73
|
+
const validated = card.cardSpecSchema.parse(spec);
|
|
73
74
|
const body = [
|
|
74
|
-
...headingElements(
|
|
75
|
-
...textElements(
|
|
76
|
-
...factElements(
|
|
75
|
+
...headingElements(validated),
|
|
76
|
+
...textElements(validated),
|
|
77
|
+
...factElements(validated),
|
|
77
78
|
];
|
|
78
|
-
const actions = actionElements(
|
|
79
|
+
const actions = actionElements(validated);
|
|
79
80
|
const document = {
|
|
80
81
|
type: "AdaptiveCard",
|
|
81
82
|
$schema: card.ADAPTIVE_CARD_SCHEMA_URL,
|
|
@@ -93,4 +94,4 @@ export function buildAdaptiveCard(spec) {
|
|
|
93
94
|
export function buildCardResult(spec) {
|
|
94
95
|
return { title: spec.title, card: buildAdaptiveCard(spec) };
|
|
95
96
|
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUsvQyxtREFBbUQ7QUFDbkQsU0FBUyxlQUFlLENBQUMsSUFBbUI7SUFDMUMsTUFBTSxRQUFRLEdBQWtCO1FBQzlCO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2hCLElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFLFFBQVE7WUFDaEIsSUFBSSxFQUFFLElBQUk7U0FDWDtLQUNGLENBQUM7SUFDRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ25CLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLE1BQU07WUFDZixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsMkNBQTJDO0FBQzNDLFNBQVMsWUFBWSxDQUFDLElBQW1CO0lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxTQUFTLFlBQVksQ0FBQyxJQUFtQjtJQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEQsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDNUU7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxTQUFTLGNBQWMsQ0FBQyxJQUFtQjtJQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7S0FDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFtQjtJQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBa0I7UUFDMUIsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQzdCLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUMxQixHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7S0FDM0IsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxNQUFNLFFBQVEsR0FBc0I7UUFDbEMsSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0I7UUFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7UUFDbkMsSUFBSTtRQUNKLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzNDLENBQUM7SUFDRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBbUI7SUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBpbGUgYSBoaWdoLWxldmVsIHtAbGluayBjYXJkLkNhcmRTcGVjfSBpbnRvIGEgdmFsaWQgQWRhcHRpdmUgQ2FyZCAxLjVcbiAqIGRvY3VtZW50LiBUaGUgbW9kZWwgZHJhZnRzIHRoZSBzbWFsbCBzZW1hbnRpYyBzcGVjOyB0aGlzIGlzIHRoZSBzaW5nbGUgcGxhY2VcbiAqIHRoYXQgdHVybnMgaXQgaW50byB0aGUgZWxlbWVudCB0cmVlIHRoZSBgYWRhcHRpdmVjYXJkc2AgcmVuZGVyZXIgY29uc3VtZXMgYW5kXG4gKiBUZWFtcyBhY2NlcHRzLCBzbyBhIGNhcmQgaXMgd2VsbC1mb3JtZWQgYnkgY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGJ5IGhvcGluZ1xuICogdGhlIG1vZGVsIHByb2R1Y2VkIGNvcnJlY3Qgc2NoZW1hLlxuICpcbiAqIEVsZW1lbnQgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgY29uc2VydmF0aXZlOlxuICogLSB0aGUgdGl0bGUgaXMgYSBib2xkLCBsYXJnZSBgVGV4dEJsb2NrYDsgdGhlIHN1YnRpdGxlIGEgbGlnaHRlciBvbmU7XG4gKiAtIGJvZHkgdGV4dCBpcyBhIHdyYXBwaW5nIGBUZXh0QmxvY2tgIChUZWFtcyByZW5kZXJzIGl0cyBNYXJrZG93biBzdWJzZXQpO1xuICogLSBmYWN0cyBiZWNvbWUgYSBzaW5nbGUgYEZhY3RTZXRgICh0aGUgcmlnaHQgY29udHJvbCBmb3Iga2V5L3ZhbHVlIGRldGFpbCk7XG4gKiAtIGVhY2ggYWN0aW9uIGJlY29tZXMgYW4gYEFjdGlvbi5PcGVuVXJsYCAtIHRoZSBvbmUgYWN0aW9uIHNhZmUgdG8gcmVuZGVyIGluXG4gKiAgIGFueSBob3N0IHdpdGggbm8gYmFjayBlbmQgd2lyZWQgdXAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNhcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtdGVhbXNcIjtcblxuLyoqIEFuIEFkYXB0aXZlIENhcmQgZWxlbWVudCAobG9vc2VseSB0eXBlZDsgdGhlIGJ1aWxkZXIgb3ducyB0aGUgZXhhY3Qgc2hhcGVzKS4gKi9cbnR5cGUgQ2FyZEVsZW1lbnQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqIEJ1aWxkIHRoZSB0aXRsZSAvIHN1YnRpdGxlIGhlYWRpbmcgYmxvY2socykuICovXG5mdW5jdGlvbiBoZWFkaW5nRWxlbWVudHMoc3BlYzogY2FyZC5DYXJkU3BlYyk6IENhcmRFbGVtZW50W10ge1xuICBjb25zdCBlbGVtZW50czogQ2FyZEVsZW1lbnRbXSA9IFtcbiAgICB7XG4gICAgICB0eXBlOiBcIlRleHRCbG9ja1wiLFxuICAgICAgdGV4dDogc3BlYy50aXRsZSxcbiAgICAgIHNpemU6IFwiTGFyZ2VcIixcbiAgICAgIHdlaWdodDogXCJCb2xkZXJcIixcbiAgICAgIHdyYXA6IHRydWUsXG4gICAgfSxcbiAgXTtcbiAgaWYgKHNwZWMuc3VidGl0bGUpIHtcbiAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgIHR5cGU6IFwiVGV4dEJsb2NrXCIsXG4gICAgICB0ZXh0OiBzcGVjLnN1YnRpdGxlLFxuICAgICAgaXNTdWJ0bGU6IHRydWUsXG4gICAgICBzcGFjaW5nOiBcIk5vbmVcIixcbiAgICAgIHdyYXA6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG4vKiogQnVpbGQgdGhlIG9wdGlvbmFsIGJvZHkgYFRleHRCbG9ja2AuICovXG5mdW5jdGlvbiB0ZXh0RWxlbWVudHMoc3BlYzogY2FyZC5DYXJkU3BlYyk6IENhcmRFbGVtZW50W10ge1xuICBpZiAoIXNwZWMudGV4dCkgcmV0dXJuIFtdO1xuICByZXR1cm4gW3sgdHlwZTogXCJUZXh0QmxvY2tcIiwgdGV4dDogc3BlYy50ZXh0LCB3cmFwOiB0cnVlIH1dO1xufVxuXG4vKiogQnVpbGQgdGhlIG9wdGlvbmFsIGBGYWN0U2V0YCBmcm9tIHRoZSBzcGVjJ3MgZmFjdHMuICovXG5mdW5jdGlvbiBmYWN0RWxlbWVudHMoc3BlYzogY2FyZC5DYXJkU3BlYyk6IENhcmRFbGVtZW50W10ge1xuICBpZiAoIXNwZWMuZmFjdHMgfHwgc3BlYy5mYWN0cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0eXBlOiBcIkZhY3RTZXRcIixcbiAgICAgIGZhY3RzOiBzcGVjLmZhY3RzLm1hcCgoZmFjdCkgPT4gKHsgdGl0bGU6IGZhY3QudGl0bGUsIHZhbHVlOiBmYWN0LnZhbHVlIH0pKSxcbiAgICB9LFxuICBdO1xufVxuXG4vKiogQnVpbGQgdGhlIGBBY3Rpb24uT3BlblVybGAgYWN0aW9ucyBmcm9tIHRoZSBzcGVjJ3MgbGluayBidXR0b25zLiAqL1xuZnVuY3Rpb24gYWN0aW9uRWxlbWVudHMoc3BlYzogY2FyZC5DYXJkU3BlYyk6IENhcmRFbGVtZW50W10ge1xuICBpZiAoIXNwZWMuYWN0aW9ucyB8fCBzcGVjLmFjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIHJldHVybiBzcGVjLmFjdGlvbnMubWFwKChhY3Rpb24pID0+ICh7XG4gICAgdHlwZTogXCJBY3Rpb24uT3BlblVybFwiLFxuICAgIHRpdGxlOiBhY3Rpb24udGl0bGUsXG4gICAgdXJsOiBhY3Rpb24udXJsLFxuICB9KSk7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHNlbWFudGljIGNhcmQgc3BlYyBpbnRvIGEgZnVsbCBBZGFwdGl2ZSBDYXJkIGRvY3VtZW50LiBUaGUgcmVzdWx0XG4gKiB2YWxpZGF0ZXMgYWdhaW5zdCB7QGxpbmsgY2FyZC5hZGFwdGl2ZUNhcmRTY2hlbWF9IGFuZCBpcyByZWFkeSB0byByZW5kZXIgd2l0aFxuICogdGhlIGBhZGFwdGl2ZWNhcmRzYCBwYWNrYWdlIG9yIHBvc3QgdG8gYSBUZWFtcyBpbmNvbWluZyB3ZWJob29rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZGFwdGl2ZUNhcmQoc3BlYzogY2FyZC5DYXJkU3BlYyk6IGNhcmQuQWRhcHRpdmVDYXJkIHtcbiAgY29uc3QgdmFsaWRhdGVkID0gY2FyZC5jYXJkU3BlY1NjaGVtYS5wYXJzZShzcGVjKTtcbiAgY29uc3QgYm9keTogQ2FyZEVsZW1lbnRbXSA9IFtcbiAgICAuLi5oZWFkaW5nRWxlbWVudHModmFsaWRhdGVkKSxcbiAgICAuLi50ZXh0RWxlbWVudHModmFsaWRhdGVkKSxcbiAgICAuLi5mYWN0RWxlbWVudHModmFsaWRhdGVkKSxcbiAgXTtcbiAgY29uc3QgYWN0aW9ucyA9IGFjdGlvbkVsZW1lbnRzKHZhbGlkYXRlZCk7XG4gIGNvbnN0IGRvY3VtZW50OiBjYXJkLkFkYXB0aXZlQ2FyZCA9IHtcbiAgICB0eXBlOiBcIkFkYXB0aXZlQ2FyZFwiLFxuICAgICRzY2hlbWE6IGNhcmQuQURBUFRJVkVfQ0FSRF9TQ0hFTUFfVVJMLFxuICAgIHZlcnNpb246IGNhcmQuQURBUFRJVkVfQ0FSRF9WRVJTSU9OLFxuICAgIGJvZHksXG4gICAgLi4uKGFjdGlvbnMubGVuZ3RoID4gMCA/IHsgYWN0aW9ucyB9IDoge30pLFxuICB9O1xuICByZXR1cm4gZG9jdW1lbnQ7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHNwZWMgaW50byB0aGUgdG9vbC9yb3V0ZSByZXN1bHQgc2hhcGU6IHRoZSB2YWxpZGF0ZWQgQWRhcHRpdmUgQ2FyZFxuICogZG9jdW1lbnQgcGx1cyB0aGUgdGl0bGUgZWNob2VkIGJhY2sgZm9yIGEgY2FsbGVyIHRoYXQgd2FudHMgYSBsYWJlbCB3aXRob3V0XG4gKiByZS1yZWFkaW5nIHRoZSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2FyZFJlc3VsdChzcGVjOiBjYXJkLkNhcmRTcGVjKTogY2FyZC5DYXJkUmVzdWx0IHtcbiAgcmV0dXJuIHsgdGl0bGU6IHNwZWMudGl0bGUsIGNhcmQ6IGJ1aWxkQWRhcHRpdmVDYXJkKHNwZWMpIH07XG59XG4iXX0=
|
package/lib/src/config.js
CHANGED
|
@@ -105,7 +105,7 @@ export const TEAMS_CONFIG_SCHEMA = {
|
|
|
105
105
|
export function resolveTeamsConfig(overrides) {
|
|
106
106
|
const cardVersion = env.string(overrides?.cardVersion, CARD_VERSION_ENV) ?? card.ADAPTIVE_CARD_VERSION;
|
|
107
107
|
const webhookUrl = env.string(overrides?.webhookUrl, WEBHOOK_URL_ENV);
|
|
108
|
-
if (webhookUrl !== null && !
|
|
108
|
+
if (webhookUrl !== null && !isHttpsUrl(webhookUrl)) {
|
|
109
109
|
throw ValidationError.invalidValue(WEBHOOK_URL_ENV, webhookUrl, "an absolute https URL for the Teams webhook");
|
|
110
110
|
}
|
|
111
111
|
const agentPlugin = env.string(overrides?.agentPlugin, AGENT_PLUGIN_ENV) ?? DEFAULT_AGENT_PLUGIN;
|
|
@@ -124,15 +124,13 @@ export function resolveTeamsConfig(overrides) {
|
|
|
124
124
|
...object.optional("appTenantId", env.string(overrides?.appTenantId, APP_TENANT_ENVS)),
|
|
125
125
|
};
|
|
126
126
|
}
|
|
127
|
-
/** Whether `value` parses as an absolute URL. */
|
|
128
|
-
function
|
|
127
|
+
/** Whether `value` parses as an absolute HTTPS URL. */
|
|
128
|
+
function isHttpsUrl(value) {
|
|
129
129
|
try {
|
|
130
|
-
|
|
131
|
-
new URL(value);
|
|
132
|
-
return true;
|
|
130
|
+
return new URL(value).protocol === "https:";
|
|
133
131
|
}
|
|
134
132
|
catch {
|
|
135
133
|
return false;
|
|
136
134
|
}
|
|
137
135
|
}
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHL0MsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUM7QUFFbkQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQVUsQ0FBQztBQUV6RSwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSx3QkFBd0IsQ0FBVSxDQUFDO0FBRTNGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLHFCQUFxQixFQUFFLHlCQUF5QixDQUFVLENBQUM7QUFFM0Y7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLDZCQUE2QixDQUFDO0FBRXZFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztBQW1GN0Msa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFnQjtJQUM5QyxJQUFJLEVBQUUsUUFBUTtJQUNkLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUscURBQXFELGdCQUFnQixnQkFBZ0I7U0FDbkc7UUFDRCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSwyREFBMkQsZUFBZSxnQkFBZ0I7U0FDeEc7UUFDRCxXQUFXLEVBQUU7WUFDWCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxrRkFBa0YsZ0JBQWdCLGdCQUFnQjtTQUNoSTtRQUNELEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLG1HQUFtRyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtTQUMvSTtRQUNELFdBQVcsRUFBRTtZQUNYLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLGdGQUFnRixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1NBQ2xJO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsMkVBQTJFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1NBQzNIO1FBQ0Qsb0JBQW9CLEVBQUU7WUFDcEIsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQ1QsMkVBQTJFO2dCQUMzRSx3RUFBd0U7Z0JBQ3hFLGdCQUFnQix5QkFBeUIsZ0JBQWdCO1NBQzVEO0tBQ0Y7Q0FDRixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUE2QjtJQUM5RCxNQUFNLFdBQVcsR0FDZixHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDckYsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FDaEMsZUFBZSxFQUNmLFVBQVUsRUFDViw2Q0FBNkMsQ0FDOUMsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQztJQUNqRyw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzFGLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUM7SUFDMUYsT0FBTztRQUNMLFdBQVc7UUFDWCxXQUFXO1FBQ1gsb0JBQW9CO1FBQ3BCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDO1FBQzVDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDeEYsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7S0FDdkYsQ0FBQztBQUNKLENBQUM7QUFFRCxpREFBaUQ7QUFDakQsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxJQUFJLENBQUM7UUFDSCxrQ0FBa0M7UUFDbEMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgVGVhbXMgcGx1Z2luOiB0aGUgdHlwZWQge0BsaW5rIFRlYW1zUGx1Z2luQ29uZmlnfVxuICogKHRoZSBwbHVnaW4ncyBzbGljZSBvZiBBcHBLaXQgY29uZmlnKSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCwgYW5kIHtAbGluayByZXNvbHZlVGVhbXNDb25maWd9IHdoaWNoIGxheWVycyB0aGF0IGNvbmZpZ1xuICogb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cyBpbnRvIHRoZSBjb25jcmV0ZSB7QGxpbmsgUmVzb2x2ZWRUZWFtc0NvbmZpZ30gdGhlXG4gKiBydW50aW1lICsgdG9vbHMgcmVhZC5cbiAqXG4gKiBCdWlsZGluZyBhIGNhcmQgaXMgYSBwdXJlIHRyYW5zZm9ybSwgc28gdGhlIGNvbmZpZyBpcyBkZWxpYmVyYXRlbHkgc21hbGw6XG4gKiB0aGUgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uIHRoZSBidWlsZGVyIHRhcmdldHMsIGFuIG9wdGlvbmFsIFRlYW1zXG4gKiBpbmNvbWluZy13ZWJob29rIFVSTCBhIGRlcGxveW1lbnQgY2FuIHdpcmUgdXAgdG8gYWN0dWFsbHkgUE9TVCBjYXJkcyB0byBhXG4gKiBjaGFubmVsLCBhbmQgd2hpY2ggc2libGluZyBwbHVnaW4gb3ducyB0aGUgYWdlbnRzIHRoZSBjb252ZXJzYXRpb24gZW5kcG9pbnRcbiAqIGFuc3dlcnMgd2l0aC5cbiAqXG4gKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlIEF6dXJlIEJvdCByZWdpc3RyYXRpb24gYSByZWFsIFRlYW1zIGNoYW5uZWxcbiAqIG5lZWRzOiBgYXBwSWRgIC8gYGFwcFBhc3N3b3JkYCAodGhlIGJvdCdzIEVudHJhIGFwcGxpY2F0aW9uIGNyZWRlbnRpYWxzLCB1c2VkXG4gKiBib3RoIHRvIHZhbGlkYXRlIHRoZSBpbmJvdW5kIEpXVCBhdWRpZW5jZSBhbmQgdG8gZmV0Y2ggdGhlIG91dGJvdW5kIENvbm5lY3RvclxuICogdG9rZW4pIGFuZCBgYXBwVGVuYW50SWRgIChzZXQgb25seSBmb3IgYSBzaW5nbGUtdGVuYW50IGJvdCkuIFdoZW4gbm8gYGFwcElkYFxuICogaXMgY29uZmlndXJlZCB0aGUgYC9tZXNzYWdlc2AgZW5kcG9pbnQgc3RheXMgTU9VTlRFRCBidXQgcmVmdXNlcyBldmVyeVxuICogcmVxdWVzdCwgc28gYW4gdW5jb25maWd1cmVkIGRlcGxveW1lbnQgY2Fubm90IGFjY2lkZW50YWxseSBleHBvc2UgYW5cbiAqIHVuYXV0aGVudGljYXRlZCBib3QgZW5kcG9pbnQuXG4gKlxuICogRW52IGZhbGxiYWNrczogYFRFQU1TX0NBUkRfVkVSU0lPTmAsIGBURUFNU19XRUJIT09LX1VSTGAsXG4gKiBgVEVBTVNfQUdFTlRfUExVR0lOYCwgYFRFQU1TX0FQUF9JRGAsIGBURUFNU19BUFBfUEFTU1dPUkRgLFxuICogYFRFQU1TX0FQUF9URU5BTlRfSURgLiBUaGUgYE1JQ1JPU09GVF9BUFBfKmAgc3BlbGxpbmdzIHRoZSBCb3QgRnJhbWV3b3JrIFNES1xuICogdXNlcyBhcmUgYWNjZXB0ZWQgYXMgYWxpYXNlcyBzbyBhbiBleGlzdGluZyBib3QncyBlbnZpcm9ubWVudCBkcm9wcyBpblxuICogdW5jaGFuZ2VkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIHR5cGUgQmFzZVBsdWdpbkNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVudiwgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGNhcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtdGVhbXNcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTcgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcblxuLyoqIERlZGljYXRlZCBvdmVycmlkZSBmb3IgdGhlIEFkYXB0aXZlIENhcmQgc2NoZW1hIHZlcnNpb24gdGhlIGJ1aWxkZXIgdGFyZ2V0cy4gKi9cbmV4cG9ydCBjb25zdCBDQVJEX1ZFUlNJT05fRU5WID0gXCJURUFNU19DQVJEX1ZFUlNJT05cIjtcblxuLyoqIEVudmlyb25tZW50IG5hbWUgZm9yIGFuIG9wdGlvbmFsIFRlYW1zIGluY29taW5nLXdlYmhvb2sgVVJMLiAqL1xuZXhwb3J0IGNvbnN0IFdFQkhPT0tfVVJMX0VOViA9IFwiVEVBTVNfV0VCSE9PS19VUkxcIjtcblxuLyoqIEVudmlyb25tZW50IG5hbWUgb3ZlcnJpZGluZyB3aGljaCBzaWJsaW5nIHBsdWdpbiBwcm92aWRlcyB0aGUgYWdlbnRzLiAqL1xuZXhwb3J0IGNvbnN0IEFHRU5UX1BMVUdJTl9FTlYgPSBcIlRFQU1TX0FHRU5UX1BMVUdJTlwiO1xuXG4vKipcbiAqIEVudmlyb25tZW50IG5hbWVzIGZvciB0aGUgYm90J3MgRW50cmEgYXBwIGlkLCBpbiBwcmVjZWRlbmNlIG9yZGVyLiBUaGVcbiAqIGBNSUNST1NPRlRfQVBQX0lEYCBhbGlhcyBpcyB3aGF0IHRoZSBCb3QgRnJhbWV3b3JrIFNESyBhbmQgdGhlIEF6dXJlIHBvcnRhbCdzXG4gKiBnZW5lcmF0ZWQgc2V0dGluZ3MgdXNlLCBzbyBhbiBleGlzdGluZyBib3QgZGVwbG95bWVudCBuZWVkcyBubyBuZXcgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfSURfRU5WUyA9IFtcIlRFQU1TX0FQUF9JRFwiLCBcIk1JQ1JPU09GVF9BUFBfSURcIl0gYXMgY29uc3Q7XG5cbi8qKiBFbnZpcm9ubWVudCBuYW1lcyBmb3IgdGhlIGJvdCdzIGNsaWVudCBzZWNyZXQsIGluIHByZWNlZGVuY2Ugb3JkZXIuICovXG5leHBvcnQgY29uc3QgQVBQX1BBU1NXT1JEX0VOVlMgPSBbXCJURUFNU19BUFBfUEFTU1dPUkRcIiwgXCJNSUNST1NPRlRfQVBQX1BBU1NXT1JEXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIEVudmlyb25tZW50IG5hbWVzIGZvciB0aGUgYm90J3MgdGVuYW50LCBpbiBwcmVjZWRlbmNlIG9yZGVyLiBTZXQgb25seSBmb3IgYVxuICogc2luZ2xlLXRlbmFudCBib3Q7IGEgbXVsdGktdGVuYW50IGJvdCBsZWF2ZXMgaXQgdW5zZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfVEVOQU5UX0VOVlMgPSBbXCJURUFNU19BUFBfVEVOQU5UX0lEXCIsIFwiTUlDUk9TT0ZUX0FQUF9URU5BTlRfSURcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIHVuYXV0aGVudGljYXRlZC1tZXNzYWdpbmcgZXNjYXBlIGhhdGNoLiBOYW1lZFxuICogYFRFQU1TX0FMTE9XX1VOQVVUSEVOVElDQVRFRGAgKHJhdGhlciB0aGFuIHNvbWV0aGluZyBzb2Z0ZXIgbGlrZSBgVEVBTVNfREVWYClcbiAqIHNvIHdoYXQgaXQgZGlzYWJsZXMgaXMgdW5taXN0YWthYmxlIGluIGEgc2hlbGwgaGlzdG9yeSBvciBkZXBsb3kgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBBTExPV19VTkFVVEhFTlRJQ0FURURfRU5WID0gXCJURUFNU19BTExPV19VTkFVVEhFTlRJQ0FURURcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgcGx1Z2luIHRoZSBjb252ZXJzYXRpb24gZW5kcG9pbnQgYXNrcyBmb3IgYW5cbiAqIGFnZW50LiBgbWFzdHJhYCBpcyB0aGUgbmFtZSBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCByZWdpc3RlcnMgdW5kZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FHRU5UX1BMVUdJTiA9IFwibWFzdHJhXCI7XG5cbi8qKiBBcHBLaXQgY29uZmlnIGFjY2VwdGVkIGJ5IHRoZSBUZWFtcyBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFRlYW1zUGx1Z2luQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBBZGFwdGl2ZSBDYXJkIHNjaGVtYSB2ZXJzaW9uIHRoZSBidWlsZGVyIHRhcmdldHMuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBjYXJkLkFEQVBUSVZFX0NBUkRfVkVSU0lPTn0gKGBcIjEuNVwiYCwgd2hhdCBUZWFtcyBzdXBwb3J0cykuIEZhbGxzXG4gICAqIGJhY2sgdG8gYFRFQU1TX0NBUkRfVkVSU0lPTmAuXG4gICAqL1xuICBjYXJkVmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIFRlYW1zIGluY29taW5nLXdlYmhvb2sgVVJMLiBXaGVuIHNldCwgdGhlIHBsdWdpbidzIGBwb3N0Q2FyZGBcbiAgICogZXhwb3J0IC8gcm91dGUgcG9zdHMgdGhlIGNvbXBpbGVkIGNhcmQgdG8gdGhpcyBjaGFubmVsOyB3aGVuIHVuc2V0LFxuICAgKiBwb3N0aW5nIGlzIGRpc2FibGVkIGFuZCB0aGUgcGx1Z2luIG9ubHkgYnVpbGRzIGNhcmRzIGZvciB0aGUgVUkgdG8gcmVuZGVyLlxuICAgKiBGYWxscyBiYWNrIHRvIGBURUFNU19XRUJIT09LX1VSTGAuXG4gICAqL1xuICB3ZWJob29rVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBzaWJsaW5nIHBsdWdpbiB3aG9zZSBhZ2VudHMgYW5zd2VyIGEgY29udmVyc2F0aW9uXG4gICAqIHR1cm4uIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0FHRU5UX1BMVUdJTn0gKGBcIm1hc3RyYVwiYCk7IHNldCBpdCB3aGVuIHRoZVxuICAgKiBNYXN0cmEgcGx1Z2luIGlzIG1vdW50ZWQgdW5kZXIgYSBgY29uZmlnLm5hbWVgIG92ZXJyaWRlLiBGYWxscyBiYWNrIHRvXG4gICAqIGBURUFNU19BR0VOVF9QTFVHSU5gLlxuICAgKi9cbiAgYWdlbnRQbHVnaW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm90J3MgRW50cmEgYXBwbGljYXRpb24gKGNsaWVudCkgaWQgZnJvbSBpdHMgQXp1cmUgQm90IHJlZ2lzdHJhdGlvbi5cbiAgICogUmVxdWlyZWQgYmVmb3JlIGBQT1NUIC9hcGkvdGVhbXMvbWVzc2FnZXNgIHdpbGwgYWNjZXB0IGEgcmVxdWVzdDogaXQgaXMgdGhlXG4gICAqIGF1ZGllbmNlIGFuIGluYm91bmQgQm90IEZyYW1ld29yayB0b2tlbiBtdXN0IGNhcnJ5LCBhbmQgdGhlIGNsaWVudCBpZCB1c2VkXG4gICAqIHRvIGZldGNoIGFuIG91dGJvdW5kIENvbm5lY3RvciB0b2tlbi4gRmFsbHMgYmFjayB0byBgVEVBTVNfQVBQX0lEYCAvXG4gICAqIGBNSUNST1NPRlRfQVBQX0lEYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ2xpZW50IHNlY3JldCBmb3Ige0BsaW5rIGFwcElkfS4gTmVlZGVkIHRvIHNlbmQgcmVwbGllcyB0aHJvdWdoIHRoZVxuICAgKiBDb25uZWN0b3IgQVBJOyB3aXRob3V0IGl0IGluYm91bmQgYWN0aXZpdGllcyBzdGlsbCB2YWxpZGF0ZSBidXQgdGhlIGJvdFxuICAgKiBjYW5ub3QgYW5zd2VyLiBGYWxscyBiYWNrIHRvIGBURUFNU19BUFBfUEFTU1dPUkRgIC9cbiAgICogYE1JQ1JPU09GVF9BUFBfUEFTU1dPUkRgLlxuICAgKi9cbiAgYXBwUGFzc3dvcmQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUZW5hbnQgaWQgZm9yIGEgU0lOR0xFLXRlbmFudCBib3QgcmVnaXN0cmF0aW9uLiBMZWF2ZSB1bnNldCBmb3IgYVxuICAgKiBtdWx0aS10ZW5hbnQgYm90LiBGYWxscyBiYWNrIHRvIGBURUFNU19BUFBfVEVOQU5UX0lEYCAvXG4gICAqIGBNSUNST1NPRlRfQVBQX1RFTkFOVF9JRGAuXG4gICAqL1xuICBhcHBUZW5hbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcnZlIGBQT1NUIC9tZXNzYWdlc2Agd2l0aCBOTyBpbmJvdW5kIHRva2VuIHZhbGlkYXRpb24sIGFuZCByZXBseSBpbiB0aGVcbiAgICogSFRUUCByZXNwb25zZSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIENvbm5lY3RvciBBUEkuXG4gICAqXG4gICAqIFRoaXMgZXhpc3RzIHNvIHRoZSBtZXNzYWdpbmcgZW5kcG9pbnQgY2FuIGJlIGV4ZXJjaXNlZCBsb2NhbGx5IC0gYnkgdGhlXG4gICAqIGluLXJlcG8gcHJldmlldyBjaGF0LCBhIGBjdXJsYCwgb3IgdGhlIEJvdCBGcmFtZXdvcmsgRW11bGF0b3IgLSB3aXRob3V0IGFuXG4gICAqIEF6dXJlIEJvdCByZWdpc3RyYXRpb24uIEl0IHJlbW92ZXMgdGhlIGVuZHBvaW50J3MgT05MWSB0cnVzdCBib3VuZGFyeTogYW55XG4gICAqIGNhbGxlciB0aGF0IGNhbiByZWFjaCB0aGUgcm91dGUgY2FuIGRyaXZlIHRoZSBhZ2VudCBhbmQgcmVhZCBpdHMgYW5zd2Vycy5cbiAgICpcbiAgICogTmV2ZXIgZW5hYmxlIGl0IG9uIGEgZGVwbG95bWVudCByZWFjaGFibGUgZnJvbSB0aGUgaW50ZXJuZXQuIEl0IGlzIGlnbm9yZWRcbiAgICogdW5sZXNzIGBOT0RFX0VOVmAgaXMgYGRldmVsb3BtZW50YCAoc2VlIHtAbGluayByZXNvbHZlVGVhbXNDb25maWd9KSwgc28gYVxuICAgKiBwcm9kdWN0aW9uIGJ1aWxkIGNhbm5vdCBiZSB0YWxrZWQgaW50byBpdCBieSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbG9uZS5cbiAgICogRmFsbHMgYmFjayB0byBgVEVBTVNfQUxMT1dfVU5BVVRIRU5USUNBVEVEYC5cbiAgICovXG4gIGFsbG93VW5hdXRoZW50aWNhdGVkPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSBjb25jcmV0ZSBjb25maWcgdGhlIHJ1bnRpbWUgcmVhZHMsIGFmdGVyIGNvbmZpZyArIGVudiByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFRlYW1zQ29uZmlnIHtcbiAgLyoqIEFkYXB0aXZlIENhcmQgc2NoZW1hIHZlcnNpb24gdGhlIGJ1aWxkZXIgc3RhbXBzIG9udG8gZXZlcnkgZG9jdW1lbnQuICovXG4gIGNhcmRWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBUZWFtcyBpbmNvbWluZy13ZWJob29rIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBwb3N0aW5nIGlzIGRpc2FibGVkLiAqL1xuICB3ZWJob29rVXJsPzogc3RyaW5nO1xuICAvKiogUmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBwbHVnaW4gdGhlIGNvbnZlcnNhdGlvbiBlbmRwb2ludCByZXNvbHZlcyBhZ2VudHMgZnJvbS4gKi9cbiAgYWdlbnRQbHVnaW46IHN0cmluZztcbiAgLyoqIEJvdCBhcHAgKGNsaWVudCkgaWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gYm90IHJlZ2lzdHJhdGlvbiBpcyBjb25maWd1cmVkLiAqL1xuICBhcHBJZD86IHN0cmluZztcbiAgLyoqIEJvdCBjbGllbnQgc2VjcmV0LCBvciBgdW5kZWZpbmVkYCB3aGVuIHJlcGxpZXMgY2Fubm90IGJlIHNlbnQuICovXG4gIGFwcFBhc3N3b3JkPzogc3RyaW5nO1xuICAvKiogVGVuYW50IGlkIGZvciBhIHNpbmdsZS10ZW5hbnQgYm90LCBvciBgdW5kZWZpbmVkYCBmb3IgYSBtdWx0aS10ZW5hbnQgb25lLiAqL1xuICBhcHBUZW5hbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgYFBPU1QgL21lc3NhZ2VzYCBzZXJ2ZXMgdHVybnMgd2l0aCBOTyB0b2tlbiB2YWxpZGF0aW9uLiBTZWVcbiAgICoge0BsaW5rIFRlYW1zUGx1Z2luQ29uZmlnLmFsbG93VW5hdXRoZW50aWNhdGVkfS5cbiAgICovXG4gIGFsbG93VW5hdXRoZW50aWNhdGVkOiBib29sZWFuO1xufVxuXG4vKiogSlNPTiBTY2hlbWEgcHVibGlzaGVkIGluIHRoZSBwbHVnaW4gbWFuaWZlc3QgZm9yIHtAbGluayBUZWFtc1BsdWdpbkNvbmZpZ30uICovXG5leHBvcnQgY29uc3QgVEVBTVNfQ09ORklHX1NDSEVNQTogSlNPTlNjaGVtYTcgPSB7XG4gIHR5cGU6IFwib2JqZWN0XCIsXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgcHJvcGVydGllczoge1xuICAgIGNhcmRWZXJzaW9uOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBBZGFwdGl2ZSBDYXJkIHNjaGVtYSB2ZXJzaW9uIHRoZSBidWlsZGVyIHRhcmdldHMuICR7Q0FSRF9WRVJTSU9OX0VOVn0gb3ZlcnJpZGVzIGl0LmAsXG4gICAgfSxcbiAgICB3ZWJob29rVXJsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBPcHRpb25hbCBUZWFtcyBpbmNvbWluZy13ZWJob29rIFVSTCB1c2VkIHRvIHBvc3QgY2FyZHMuICR7V0VCSE9PS19VUkxfRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICB9LFxuICAgIGFnZW50UGx1Z2luOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBSZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHNpYmxpbmcgcGx1Z2luIHdob3NlIGFnZW50cyBhbnN3ZXIgYSBjb252ZXJzYXRpb24gdHVybi4gJHtBR0VOVF9QTFVHSU5fRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICB9LFxuICAgIGFwcElkOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBFbnRyYSBhcHAgKGNsaWVudCkgaWQgb2YgdGhlIEF6dXJlIEJvdCByZWdpc3RyYXRpb24uIFJlcXVpcmVkIGZvciB0aGUgVGVhbXMgbWVzc2FnaW5nIGVuZHBvaW50LiAke0FQUF9JRF9FTlZTWzBdfSBvdmVycmlkZXMgaXQuYCxcbiAgICB9LFxuICAgIGFwcFBhc3N3b3JkOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBDbGllbnQgc2VjcmV0IGZvciB0aGUgYm90IGFwcCBpZCwgdXNlZCB0byBmZXRjaCBhbiBvdXRib3VuZCBDb25uZWN0b3IgdG9rZW4uICR7QVBQX1BBU1NXT1JEX0VOVlNbMF19IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gICAgYXBwVGVuYW50SWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFRlbmFudCBpZCBmb3IgYSBzaW5nbGUtdGVuYW50IGJvdCByZWdpc3RyYXRpb247IHVuc2V0IGZvciBtdWx0aS10ZW5hbnQuICR7QVBQX1RFTkFOVF9FTlZTWzBdfSBvdmVycmlkZXMgaXQuYCxcbiAgICB9LFxuICAgIGFsbG93VW5hdXRoZW50aWNhdGVkOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlNlcnZlIHRoZSBUZWFtcyBtZXNzYWdpbmcgZW5kcG9pbnQgd2l0aCBOTyB0b2tlbiB2YWxpZGF0aW9uLCByZXBseWluZyBpbiBcIiArXG4gICAgICAgIFwidGhlIEhUVFAgcmVzcG9uc2UuIExvY2FsIGRldmVsb3BtZW50IG9ubHk7IGlnbm9yZWQgdW5sZXNzIE5PREVfRU5WIGlzIFwiICtcbiAgICAgICAgYGRldmVsb3BtZW50LiAke0FMTE9XX1VOQVVUSEVOVElDQVRFRF9FTlZ9IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIExheWVyIHRoZSBwbHVnaW4gY29uZmlnIG92ZXIgZW52aXJvbm1lbnQgZGVmYXVsdHMgaW50byB0aGUgY29uY3JldGUgY29uZmlnXG4gKiB0aGUgcnVudGltZSB1c2VzLiBGYWlscyBsb3VkbHkgb24gYSB3ZWJob29rIFVSTCB0aGF0IGlzIHByZXNlbnQgYnV0IG5vdCBhXG4gKiB2YWxpZCBhYnNvbHV0ZSBVUkwsIHNpbmNlIHRoYXQgaXMgYSBkZXBsb3ktdGltZSBtaXN0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlYW1zQ29uZmlnKG92ZXJyaWRlcz86IFRlYW1zUGx1Z2luQ29uZmlnKTogUmVzb2x2ZWRUZWFtc0NvbmZpZyB7XG4gIGNvbnN0IGNhcmRWZXJzaW9uID1cbiAgICBlbnYuc3RyaW5nKG92ZXJyaWRlcz8uY2FyZFZlcnNpb24sIENBUkRfVkVSU0lPTl9FTlYpID8/IGNhcmQuQURBUFRJVkVfQ0FSRF9WRVJTSU9OO1xuICBjb25zdCB3ZWJob29rVXJsID0gZW52LnN0cmluZyhvdmVycmlkZXM/LndlYmhvb2tVcmwsIFdFQkhPT0tfVVJMX0VOVik7XG4gIGlmICh3ZWJob29rVXJsICE9PSBudWxsICYmICFpc0Fic29sdXRlVXJsKHdlYmhvb2tVcmwpKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFdFQkhPT0tfVVJMX0VOVixcbiAgICAgIHdlYmhvb2tVcmwsXG4gICAgICBcImFuIGFic29sdXRlIGh0dHBzIFVSTCBmb3IgdGhlIFRlYW1zIHdlYmhvb2tcIixcbiAgICApO1xuICB9XG4gIGNvbnN0IGFnZW50UGx1Z2luID0gZW52LnN0cmluZyhvdmVycmlkZXM/LmFnZW50UGx1Z2luLCBBR0VOVF9QTFVHSU5fRU5WKSA/PyBERUZBVUxUX0FHRU5UX1BMVUdJTjtcbiAgLy8gVHdvIGluZGVwZW5kZW50IGNvbmRpdGlvbnMgbXVzdCBCT1RIIGhvbGQ6IHRoZSBvcGVyYXRvciBhc2tlZCBmb3IgaXQsIGFuZFxuICAvLyB0aGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQuIEdhdGluZyBvbiBgTk9ERV9FTlZgIGFzIHdlbGwgbWVhbnMgYSBzdHJheVxuICAvLyB2YXJpYWJsZSBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY2Fubm90IHNpbGVudGx5IGV4cG9zZSB0aGUgZW5kcG9pbnQuXG4gIGNvbnN0IHJlcXVlc3RlZCA9IGVudi5ib29sZWFuKG92ZXJyaWRlcz8uYWxsb3dVbmF1dGhlbnRpY2F0ZWQsIEFMTE9XX1VOQVVUSEVOVElDQVRFRF9FTlYpO1xuICBjb25zdCBhbGxvd1VuYXV0aGVudGljYXRlZCA9IHJlcXVlc3RlZCA9PT0gdHJ1ZSAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiO1xuICByZXR1cm4ge1xuICAgIGNhcmRWZXJzaW9uLFxuICAgIGFnZW50UGx1Z2luLFxuICAgIGFsbG93VW5hdXRoZW50aWNhdGVkLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcIndlYmhvb2tVcmxcIiwgd2ViaG9va1VybCksXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFwiYXBwSWRcIiwgZW52LnN0cmluZyhvdmVycmlkZXM/LmFwcElkLCBBUFBfSURfRU5WUykpLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcImFwcFBhc3N3b3JkXCIsIGVudi5zdHJpbmcob3ZlcnJpZGVzPy5hcHBQYXNzd29yZCwgQVBQX1BBU1NXT1JEX0VOVlMpKSxcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJhcHBUZW5hbnRJZFwiLCBlbnYuc3RyaW5nKG92ZXJyaWRlcz8uYXBwVGVuYW50SWQsIEFQUF9URU5BTlRfRU5WUykpLFxuICB9O1xufVxuXG4vKiogV2hldGhlciBgdmFsdWVgIHBhcnNlcyBhcyBhbiBhYnNvbHV0ZSBVUkwuICovXG5mdW5jdGlvbiBpc0Fic29sdXRlVXJsKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgbmV3IFVSTCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHL0MsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJELG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUM7QUFFbkQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQVUsQ0FBQztBQUV6RSwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSx3QkFBd0IsQ0FBVSxDQUFDO0FBRTNGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLHFCQUFxQixFQUFFLHlCQUF5QixDQUFVLENBQUM7QUFFM0Y7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLDZCQUE2QixDQUFDO0FBRXZFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztBQW1GN0Msa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFnQjtJQUM5QyxJQUFJLEVBQUUsUUFBUTtJQUNkLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsVUFB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QUFRLENBQUM7SUFDOUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBUZWFtcyBwbHVnaW46IHRoZSB0eXBlZCB7QGxpbmsgVGVhbXNQbHVnaW5Db25maWd9XG4gKiAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdCBjb25maWcpLCB0aGUgSlNPTiBTY2hlbWEgdGhlIG1hbmlmZXN0XG4gKiBwdWJsaXNoZXMgZm9yIGl0LCBhbmQge0BsaW5rIHJlc29sdmVUZWFtc0NvbmZpZ30gd2hpY2ggbGF5ZXJzIHRoYXQgY29uZmlnXG4gKiBvdmVyIGVudmlyb25tZW50IGRlZmF1bHRzIGludG8gdGhlIGNvbmNyZXRlIHtAbGluayBSZXNvbHZlZFRlYW1zQ29uZmlnfSB0aGVcbiAqIHJ1bnRpbWUgKyB0b29scyByZWFkLlxuICpcbiAqIEJ1aWxkaW5nIGEgY2FyZCBpcyBhIHB1cmUgdHJhbnNmb3JtLCBzbyB0aGUgY29uZmlnIGlzIGRlbGliZXJhdGVseSBzbWFsbDpcbiAqIHRoZSBBZGFwdGl2ZSBDYXJkIHZlcnNpb24gdGhlIGJ1aWxkZXIgdGFyZ2V0cywgYW4gb3B0aW9uYWwgVGVhbXNcbiAqIGluY29taW5nLXdlYmhvb2sgVVJMIGEgZGVwbG95bWVudCBjYW4gd2lyZSB1cCB0byBhY3R1YWxseSBQT1NUIGNhcmRzIHRvIGFcbiAqIGNoYW5uZWwsIGFuZCB3aGljaCBzaWJsaW5nIHBsdWdpbiBvd25zIHRoZSBhZ2VudHMgdGhlIGNvbnZlcnNhdGlvbiBlbmRwb2ludFxuICogYW5zd2VycyB3aXRoLlxuICpcbiAqIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSB0aGUgQXp1cmUgQm90IHJlZ2lzdHJhdGlvbiBhIHJlYWwgVGVhbXMgY2hhbm5lbFxuICogbmVlZHM6IGBhcHBJZGAgLyBgYXBwUGFzc3dvcmRgICh0aGUgYm90J3MgRW50cmEgYXBwbGljYXRpb24gY3JlZGVudGlhbHMsIHVzZWRcbiAqIGJvdGggdG8gdmFsaWRhdGUgdGhlIGluYm91bmQgSldUIGF1ZGllbmNlIGFuZCB0byBmZXRjaCB0aGUgb3V0Ym91bmQgQ29ubmVjdG9yXG4gKiB0b2tlbikgYW5kIGBhcHBUZW5hbnRJZGAgKHNldCBvbmx5IGZvciBhIHNpbmdsZS10ZW5hbnQgYm90KS4gV2hlbiBubyBgYXBwSWRgXG4gKiBpcyBjb25maWd1cmVkIHRoZSBgL21lc3NhZ2VzYCBlbmRwb2ludCBzdGF5cyBNT1VOVEVEIGJ1dCByZWZ1c2VzIGV2ZXJ5XG4gKiByZXF1ZXN0LCBzbyBhbiB1bmNvbmZpZ3VyZWQgZGVwbG95bWVudCBjYW5ub3QgYWNjaWRlbnRhbGx5IGV4cG9zZSBhblxuICogdW5hdXRoZW50aWNhdGVkIGJvdCBlbmRwb2ludC5cbiAqXG4gKiBFbnYgZmFsbGJhY2tzOiBgVEVBTVNfQ0FSRF9WRVJTSU9OYCwgYFRFQU1TX1dFQkhPT0tfVVJMYCxcbiAqIGBURUFNU19BR0VOVF9QTFVHSU5gLCBgVEVBTVNfQVBQX0lEYCwgYFRFQU1TX0FQUF9QQVNTV09SRGAsXG4gKiBgVEVBTVNfQVBQX1RFTkFOVF9JRGAuIFRoZSBgTUlDUk9TT0ZUX0FQUF8qYCBzcGVsbGluZ3MgdGhlIEJvdCBGcmFtZXdvcmsgU0RLXG4gKiB1c2VzIGFyZSBhY2NlcHRlZCBhcyBhbGlhc2VzIHNvIGFuIGV4aXN0aW5nIGJvdCdzIGVudmlyb25tZW50IGRyb3BzIGluXG4gKiB1bmNoYW5nZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZW52LCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgY2FyZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC10ZWFtc1wiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG4vKiogRGVkaWNhdGVkIG92ZXJyaWRlIGZvciB0aGUgQWRhcHRpdmUgQ2FyZCBzY2hlbWEgdmVyc2lvbiB0aGUgYnVpbGRlciB0YXJnZXRzLiAqL1xuZXhwb3J0IGNvbnN0IENBUkRfVkVSU0lPTl9FTlYgPSBcIlRFQU1TX0NBUkRfVkVSU0lPTlwiO1xuXG4vKiogRW52aXJvbm1lbnQgbmFtZSBmb3IgYW4gb3B0aW9uYWwgVGVhbXMgaW5jb21pbmctd2ViaG9vayBVUkwuICovXG5leHBvcnQgY29uc3QgV0VCSE9PS19VUkxfRU5WID0gXCJURUFNU19XRUJIT09LX1VSTFwiO1xuXG4vKiogRW52aXJvbm1lbnQgbmFtZSBvdmVycmlkaW5nIHdoaWNoIHNpYmxpbmcgcGx1Z2luIHByb3ZpZGVzIHRoZSBhZ2VudHMuICovXG5leHBvcnQgY29uc3QgQUdFTlRfUExVR0lOX0VOViA9IFwiVEVBTVNfQUdFTlRfUExVR0lOXCI7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgbmFtZXMgZm9yIHRoZSBib3QncyBFbnRyYSBhcHAgaWQsIGluIHByZWNlZGVuY2Ugb3JkZXIuIFRoZVxuICogYE1JQ1JPU09GVF9BUFBfSURgIGFsaWFzIGlzIHdoYXQgdGhlIEJvdCBGcmFtZXdvcmsgU0RLIGFuZCB0aGUgQXp1cmUgcG9ydGFsJ3NcbiAqIGdlbmVyYXRlZCBzZXR0aW5ncyB1c2UsIHNvIGFuIGV4aXN0aW5nIGJvdCBkZXBsb3ltZW50IG5lZWRzIG5vIG5ldyB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9JRF9FTlZTID0gW1wiVEVBTVNfQVBQX0lEXCIsIFwiTUlDUk9TT0ZUX0FQUF9JRFwiXSBhcyBjb25zdDtcblxuLyoqIEVudmlyb25tZW50IG5hbWVzIGZvciB0aGUgYm90J3MgY2xpZW50IHNlY3JldCwgaW4gcHJlY2VkZW5jZSBvcmRlci4gKi9cbmV4cG9ydCBjb25zdCBBUFBfUEFTU1dPUkRfRU5WUyA9IFtcIlRFQU1TX0FQUF9QQVNTV09SRFwiLCBcIk1JQ1JPU09GVF9BUFBfUEFTU1dPUkRcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgbmFtZXMgZm9yIHRoZSBib3QncyB0ZW5hbnQsIGluIHByZWNlZGVuY2Ugb3JkZXIuIFNldCBvbmx5IGZvciBhXG4gKiBzaW5nbGUtdGVuYW50IGJvdDsgYSBtdWx0aS10ZW5hbnQgYm90IGxlYXZlcyBpdCB1bnNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9URU5BTlRfRU5WUyA9IFtcIlRFQU1TX0FQUF9URU5BTlRfSURcIiwgXCJNSUNST1NPRlRfQVBQX1RFTkFOVF9JRFwiXSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCBuYW1lIGZvciB0aGUgdW5hdXRoZW50aWNhdGVkLW1lc3NhZ2luZyBlc2NhcGUgaGF0Y2guIE5hbWVkXG4gKiBgVEVBTVNfQUxMT1dfVU5BVVRIRU5USUNBVEVEYCAocmF0aGVyIHRoYW4gc29tZXRoaW5nIHNvZnRlciBsaWtlIGBURUFNU19ERVZgKVxuICogc28gd2hhdCBpdCBkaXNhYmxlcyBpcyB1bm1pc3Rha2FibGUgaW4gYSBzaGVsbCBoaXN0b3J5IG9yIGRlcGxveSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMTE9XX1VOQVVUSEVOVElDQVRFRF9FTlYgPSBcIlRFQU1TX0FMTE9XX1VOQVVUSEVOVElDQVRFRFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBwbHVnaW4gdGhlIGNvbnZlcnNhdGlvbiBlbmRwb2ludCBhc2tzIGZvciBhblxuICogYWdlbnQuIGBtYXN0cmFgIGlzIHRoZSBuYW1lIGBAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFgIHJlZ2lzdGVycyB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfUExVR0lOID0gXCJtYXN0cmFcIjtcblxuLyoqIEFwcEtpdCBjb25maWcgYWNjZXB0ZWQgYnkgdGhlIFRlYW1zIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVhbXNQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqXG4gICAqIEFkYXB0aXZlIENhcmQgc2NoZW1hIHZlcnNpb24gdGhlIGJ1aWxkZXIgdGFyZ2V0cy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIGNhcmQuQURBUFRJVkVfQ0FSRF9WRVJTSU9OfSAoYFwiMS41XCJgLCB3aGF0IFRlYW1zIHN1cHBvcnRzKS4gRmFsbHNcbiAgICogYmFjayB0byBgVEVBTVNfQ0FSRF9WRVJTSU9OYC5cbiAgICovXG4gIGNhcmRWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgVGVhbXMgaW5jb21pbmctd2ViaG9vayBVUkwuIFdoZW4gc2V0LCB0aGUgcGx1Z2luJ3MgYHBvc3RDYXJkYFxuICAgKiBleHBvcnQgLyByb3V0ZSBwb3N0cyB0aGUgY29tcGlsZWQgY2FyZCB0byB0aGlzIGNoYW5uZWw7IHdoZW4gdW5zZXQsXG4gICAqIHBvc3RpbmcgaXMgZGlzYWJsZWQgYW5kIHRoZSBwbHVnaW4gb25seSBidWlsZHMgY2FyZHMgZm9yIHRoZSBVSSB0byByZW5kZXIuXG4gICAqIEZhbGxzIGJhY2sgdG8gYFRFQU1TX1dFQkhPT0tfVVJMYC5cbiAgICovXG4gIHdlYmhvb2tVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHNpYmxpbmcgcGx1Z2luIHdob3NlIGFnZW50cyBhbnN3ZXIgYSBjb252ZXJzYXRpb25cbiAgICogdHVybi4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfUExVR0lOfSAoYFwibWFzdHJhXCJgKTsgc2V0IGl0IHdoZW4gdGhlXG4gICAqIE1hc3RyYSBwbHVnaW4gaXMgbW91bnRlZCB1bmRlciBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUuIEZhbGxzIGJhY2sgdG9cbiAgICogYFRFQU1TX0FHRU5UX1BMVUdJTmAuXG4gICAqL1xuICBhZ2VudFBsdWdpbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBib3QncyBFbnRyYSBhcHBsaWNhdGlvbiAoY2xpZW50KSBpZCBmcm9tIGl0cyBBenVyZSBCb3QgcmVnaXN0cmF0aW9uLlxuICAgKiBSZXF1aXJlZCBiZWZvcmUgYFBPU1QgL2FwaS90ZWFtcy9tZXNzYWdlc2Agd2lsbCBhY2NlcHQgYSByZXF1ZXN0OiBpdCBpcyB0aGVcbiAgICogYXVkaWVuY2UgYW4gaW5ib3VuZCBCb3QgRnJhbWV3b3JrIHRva2VuIG11c3QgY2FycnksIGFuZCB0aGUgY2xpZW50IGlkIHVzZWRcbiAgICogdG8gZmV0Y2ggYW4gb3V0Ym91bmQgQ29ubmVjdG9yIHRva2VuLiBGYWxscyBiYWNrIHRvIGBURUFNU19BUFBfSURgIC9cbiAgICogYE1JQ1JPU09GVF9BUFBfSURgLlxuICAgKi9cbiAgYXBwSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDbGllbnQgc2VjcmV0IGZvciB7QGxpbmsgYXBwSWR9LiBOZWVkZWQgdG8gc2VuZCByZXBsaWVzIHRocm91Z2ggdGhlXG4gICAqIENvbm5lY3RvciBBUEk7IHdpdGhvdXQgaXQgaW5ib3VuZCBhY3Rpdml0aWVzIHN0aWxsIHZhbGlkYXRlIGJ1dCB0aGUgYm90XG4gICAqIGNhbm5vdCBhbnN3ZXIuIEZhbGxzIGJhY2sgdG8gYFRFQU1TX0FQUF9QQVNTV09SRGAgL1xuICAgKiBgTUlDUk9TT0ZUX0FQUF9QQVNTV09SRGAuXG4gICAqL1xuICBhcHBQYXNzd29yZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRlbmFudCBpZCBmb3IgYSBTSU5HTEUtdGVuYW50IGJvdCByZWdpc3RyYXRpb24uIExlYXZlIHVuc2V0IGZvciBhXG4gICAqIG11bHRpLXRlbmFudCBib3QuIEZhbGxzIGJhY2sgdG8gYFRFQU1TX0FQUF9URU5BTlRfSURgIC9cbiAgICogYE1JQ1JPU09GVF9BUFBfVEVOQU5UX0lEYC5cbiAgICovXG4gIGFwcFRlbmFudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogU2VydmUgYFBPU1QgL21lc3NhZ2VzYCB3aXRoIE5PIGluYm91bmQgdG9rZW4gdmFsaWRhdGlvbiwgYW5kIHJlcGx5IGluIHRoZVxuICAgKiBIVFRQIHJlc3BvbnNlIGluc3RlYWQgb2YgdGhyb3VnaCB0aGUgQ29ubmVjdG9yIEFQSS5cbiAgICpcbiAgICogVGhpcyBleGlzdHMgc28gdGhlIG1lc3NhZ2luZyBlbmRwb2ludCBjYW4gYmUgZXhlcmNpc2VkIGxvY2FsbHkgLSBieSB0aGVcbiAgICogaW4tcmVwbyBwcmV2aWV3IGNoYXQsIGEgYGN1cmxgLCBvciB0aGUgQm90IEZyYW1ld29yayBFbXVsYXRvciAtIHdpdGhvdXQgYW5cbiAgICogQXp1cmUgQm90IHJlZ2lzdHJhdGlvbi4gSXQgcmVtb3ZlcyB0aGUgZW5kcG9pbnQncyBPTkxZIHRydXN0IGJvdW5kYXJ5OiBhbnlcbiAgICogY2FsbGVyIHRoYXQgY2FuIHJlYWNoIHRoZSByb3V0ZSBjYW4gZHJpdmUgdGhlIGFnZW50IGFuZCByZWFkIGl0cyBhbnN3ZXJzLlxuICAgKlxuICAgKiBOZXZlciBlbmFibGUgaXQgb24gYSBkZXBsb3ltZW50IHJlYWNoYWJsZSBmcm9tIHRoZSBpbnRlcm5ldC4gSXQgaXMgaWdub3JlZFxuICAgKiB1bmxlc3MgYE5PREVfRU5WYCBpcyBgZGV2ZWxvcG1lbnRgIChzZWUge0BsaW5rIHJlc29sdmVUZWFtc0NvbmZpZ30pLCBzbyBhXG4gICAqIHByb2R1Y3Rpb24gYnVpbGQgY2Fubm90IGJlIHRhbGtlZCBpbnRvIGl0IGJ5IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFsb25lLlxuICAgKiBGYWxscyBiYWNrIHRvIGBURUFNU19BTExPV19VTkFVVEhFTlRJQ0FURURgLlxuICAgKi9cbiAgYWxsb3dVbmF1dGhlbnRpY2F0ZWQ/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIGNvbmNyZXRlIGNvbmZpZyB0aGUgcnVudGltZSByZWFkcywgYWZ0ZXIgY29uZmlnICsgZW52IHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkVGVhbXNDb25maWcge1xuICAvKiogQWRhcHRpdmUgQ2FyZCBzY2hlbWEgdmVyc2lvbiB0aGUgYnVpbGRlciBzdGFtcHMgb250byBldmVyeSBkb2N1bWVudC4gKi9cbiAgY2FyZFZlcnNpb246IHN0cmluZztcbiAgLyoqIFRlYW1zIGluY29taW5nLXdlYmhvb2sgVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIHBvc3RpbmcgaXMgZGlzYWJsZWQuICovXG4gIHdlYmhvb2tVcmw/OiBzdHJpbmc7XG4gIC8qKiBSZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGUgY29udmVyc2F0aW9uIGVuZHBvaW50IHJlc29sdmVzIGFnZW50cyBmcm9tLiAqL1xuICBhZ2VudFBsdWdpbjogc3RyaW5nO1xuICAvKiogQm90IGFwcCAoY2xpZW50KSBpZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyBib3QgcmVnaXN0cmF0aW9uIGlzIGNvbmZpZ3VyZWQuICovXG4gIGFwcElkPzogc3RyaW5nO1xuICAvKiogQm90IGNsaWVudCBzZWNyZXQsIG9yIGB1bmRlZmluZWRgIHdoZW4gcmVwbGllcyBjYW5ub3QgYmUgc2VudC4gKi9cbiAgYXBwUGFzc3dvcmQ/OiBzdHJpbmc7XG4gIC8qKiBUZW5hbnQgaWQgZm9yIGEgc2luZ2xlLXRlbmFudCBib3QsIG9yIGB1bmRlZmluZWRgIGZvciBhIG11bHRpLXRlbmFudCBvbmUuICovXG4gIGFwcFRlbmFudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciBgUE9TVCAvbWVzc2FnZXNgIHNlcnZlcyB0dXJucyB3aXRoIE5PIHRva2VuIHZhbGlkYXRpb24uIFNlZVxuICAgKiB7QGxpbmsgVGVhbXNQbHVnaW5Db25maWcuYWxsb3dVbmF1dGhlbnRpY2F0ZWR9LlxuICAgKi9cbiAgYWxsb3dVbmF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgaW4gdGhlIHBsdWdpbiBtYW5pZmVzdCBmb3Ige0BsaW5rIFRlYW1zUGx1Z2luQ29uZmlnfS4gKi9cbmV4cG9ydCBjb25zdCBURUFNU19DT05GSUdfU0NIRU1BOiBKU09OU2NoZW1hNyA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgY2FyZFZlcnNpb246IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYEFkYXB0aXZlIENhcmQgc2NoZW1hIHZlcnNpb24gdGhlIGJ1aWxkZXIgdGFyZ2V0cy4gJHtDQVJEX1ZFUlNJT05fRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICB9LFxuICAgIHdlYmhvb2tVcmw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYE9wdGlvbmFsIFRlYW1zIGluY29taW5nLXdlYmhvb2sgVVJMIHVzZWQgdG8gcG9zdCBjYXJkcy4gJHtXRUJIT09LX1VSTF9FTlZ9IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gICAgYWdlbnRQbHVnaW46IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgc2libGluZyBwbHVnaW4gd2hvc2UgYWdlbnRzIGFuc3dlciBhIGNvbnZlcnNhdGlvbiB0dXJuLiAke0FHRU5UX1BMVUdJTl9FTlZ9IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gICAgYXBwSWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYEVudHJhIGFwcCAoY2xpZW50KSBpZCBvZiB0aGUgQXp1cmUgQm90IHJlZ2lzdHJhdGlvbi4gUmVxdWlyZWQgZm9yIHRoZSBUZWFtcyBtZXNzYWdpbmcgZW5kcG9pbnQuICR7QVBQX0lEX0VOVlNbMF19IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gICAgYXBwUGFzc3dvcmQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogYENsaWVudCBzZWNyZXQgZm9yIHRoZSBib3QgYXBwIGlkLCB1c2VkIHRvIGZldGNoIGFuIG91dGJvdW5kIENvbm5lY3RvciB0b2tlbi4gJHtBUFBfUEFTU1dPUkRfRU5WU1swXX0gb3ZlcnJpZGVzIGl0LmAsXG4gICAgfSxcbiAgICBhcHBUZW5hbnRJZDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGVuYW50IGlkIGZvciBhIHNpbmdsZS10ZW5hbnQgYm90IHJlZ2lzdHJhdGlvbjsgdW5zZXQgZm9yIG11bHRpLXRlbmFudC4gJHtBUFBfVEVOQU5UX0VOVlNbMF19IG92ZXJyaWRlcyBpdC5gLFxuICAgIH0sXG4gICAgYWxsb3dVbmF1dGhlbnRpY2F0ZWQ6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmUgdGhlIFRlYW1zIG1lc3NhZ2luZyBlbmRwb2ludCB3aXRoIE5PIHRva2VuIHZhbGlkYXRpb24sIHJlcGx5aW5nIGluIFwiICtcbiAgICAgICAgXCJ0aGUgSFRUUCByZXNwb25zZS4gTG9jYWwgZGV2ZWxvcG1lbnQgb25seTsgaWdub3JlZCB1bmxlc3MgTk9ERV9FTlYgaXMgXCIgK1xuICAgICAgICBgZGV2ZWxvcG1lbnQuICR7QUxMT1dfVU5BVVRIRU5USUNBVEVEX0VOVn0gb3ZlcnJpZGVzIGl0LmAsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogTGF5ZXIgdGhlIHBsdWdpbiBjb25maWcgb3ZlciBlbnZpcm9ubWVudCBkZWZhdWx0cyBpbnRvIHRoZSBjb25jcmV0ZSBjb25maWdcbiAqIHRoZSBydW50aW1lIHVzZXMuIEZhaWxzIGxvdWRseSBvbiBhIHdlYmhvb2sgVVJMIHRoYXQgaXMgcHJlc2VudCBidXQgbm90IGFcbiAqIHZhbGlkIGFic29sdXRlIFVSTCwgc2luY2UgdGhhdCBpcyBhIGRlcGxveS10aW1lIG1pc3Rha2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVhbXNDb25maWcob3ZlcnJpZGVzPzogVGVhbXNQbHVnaW5Db25maWcpOiBSZXNvbHZlZFRlYW1zQ29uZmlnIHtcbiAgY29uc3QgY2FyZFZlcnNpb24gPVxuICAgIGVudi5zdHJpbmcob3ZlcnJpZGVzPy5jYXJkVmVyc2lvbiwgQ0FSRF9WRVJTSU9OX0VOVikgPz8gY2FyZC5BREFQVElWRV9DQVJEX1ZFUlNJT047XG4gIGNvbnN0IHdlYmhvb2tVcmwgPSBlbnYuc3RyaW5nKG92ZXJyaWRlcz8ud2ViaG9va1VybCwgV0VCSE9PS19VUkxfRU5WKTtcbiAgaWYgKHdlYmhvb2tVcmwgIT09IG51bGwgJiYgIWlzSHR0cHNVcmwod2ViaG9va1VybCkpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgV0VCSE9PS19VUkxfRU5WLFxuICAgICAgd2ViaG9va1VybCxcbiAgICAgIFwiYW4gYWJzb2x1dGUgaHR0cHMgVVJMIGZvciB0aGUgVGVhbXMgd2ViaG9va1wiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYWdlbnRQbHVnaW4gPSBlbnYuc3RyaW5nKG92ZXJyaWRlcz8uYWdlbnRQbHVnaW4sIEFHRU5UX1BMVUdJTl9FTlYpID8/IERFRkFVTFRfQUdFTlRfUExVR0lOO1xuICAvLyBUd28gaW5kZXBlbmRlbnQgY29uZGl0aW9ucyBtdXN0IEJPVEggaG9sZDogdGhlIG9wZXJhdG9yIGFza2VkIGZvciBpdCwgYW5kXG4gIC8vIHRoaXMgaXMgYSBkZXZlbG9wbWVudCBidWlsZC4gR2F0aW5nIG9uIGBOT0RFX0VOVmAgYXMgd2VsbCBtZWFucyBhIHN0cmF5XG4gIC8vIHZhcmlhYmxlIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBjYW5ub3Qgc2lsZW50bHkgZXhwb3NlIHRoZSBlbmRwb2ludC5cbiAgY29uc3QgcmVxdWVzdGVkID0gZW52LmJvb2xlYW4ob3ZlcnJpZGVzPy5hbGxvd1VuYXV0aGVudGljYXRlZCwgQUxMT1dfVU5BVVRIRU5USUNBVEVEX0VOVik7XG4gIGNvbnN0IGFsbG93VW5hdXRoZW50aWNhdGVkID0gcmVxdWVzdGVkID09PSB0cnVlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCI7XG4gIHJldHVybiB7XG4gICAgY2FyZFZlcnNpb24sXG4gICAgYWdlbnRQbHVnaW4sXG4gICAgYWxsb3dVbmF1dGhlbnRpY2F0ZWQsXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFwid2ViaG9va1VybFwiLCB3ZWJob29rVXJsKSxcbiAgICAuLi5vYmplY3Qub3B0aW9uYWwoXCJhcHBJZFwiLCBlbnYuc3RyaW5nKG92ZXJyaWRlcz8uYXBwSWQsIEFQUF9JRF9FTlZTKSksXG4gICAgLi4ub2JqZWN0Lm9wdGlvbmFsKFwiYXBwUGFzc3dvcmRcIiwgZW52LnN0cmluZyhvdmVycmlkZXM/LmFwcFBhc3N3b3JkLCBBUFBfUEFTU1dPUkRfRU5WUykpLFxuICAgIC4uLm9iamVjdC5vcHRpb25hbChcImFwcFRlbmFudElkXCIsIGVudi5zdHJpbmcob3ZlcnJpZGVzPy5hcHBUZW5hbnRJZCwgQVBQX1RFTkFOVF9FTlZTKSksXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIGB2YWx1ZWAgcGFyc2VzIGFzIGFuIGFic29sdXRlIEhUVFBTIFVSTC4gKi9cbmZ1bmN0aW9uIGlzSHR0cHNVcmwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKS5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"repository": {
|
|
4
4
|
"type": "git",
|
|
5
5
|
"url": "git+https://github.com/reggie-db/dbx-tools.git",
|
|
6
|
-
"directory": "packages/node/teams"
|
|
6
|
+
"directory": "js-packages/node/teams"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "projen build",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@databricks/appkit": "^0.43.0",
|
|
29
|
-
"@dbx-tools/shared-core": "0.6.
|
|
30
|
-
"@dbx-tools/shared-teams": "0.6.
|
|
29
|
+
"@dbx-tools/shared-core": "0.6.74",
|
|
30
|
+
"@dbx-tools/shared-teams": "0.6.74",
|
|
31
31
|
"@mastra/core": "^1.47.0",
|
|
32
32
|
"jose": "^6.2.3",
|
|
33
33
|
"zod": "4.3.6"
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"./package.json": "./package.json"
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
|
-
"version": "0.6.
|
|
49
|
+
"version": "0.6.74",
|
|
50
50
|
"types": "./lib/index.d.ts",
|
|
51
51
|
"type": "module",
|
|
52
52
|
"exports": {
|
package/src/auth.ts
CHANGED
|
@@ -92,7 +92,7 @@ export const resetTeamsAuth = (): void => {
|
|
|
92
92
|
keySet = undefined;
|
|
93
93
|
jwksUri = undefined;
|
|
94
94
|
keySetSource = undefined;
|
|
95
|
-
tokenCache
|
|
95
|
+
tokenCache.clear();
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -212,35 +212,41 @@ interface CachedToken {
|
|
|
212
212
|
expiresAt: number;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
/** Per-bot cached value plus a shared in-flight refresh. */
|
|
216
|
+
interface TokenCacheEntry {
|
|
217
|
+
value?: CachedToken;
|
|
218
|
+
refresh?: Promise<CachedToken>;
|
|
219
|
+
}
|
|
216
220
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
}): Promise<string> => {
|
|
230
|
-
const now = Date.now();
|
|
231
|
-
if (tokenCache && tokenCache.expiresAt > now) return tokenCache.token;
|
|
221
|
+
const tokenCache = new Map<string, TokenCacheEntry>();
|
|
222
|
+
|
|
223
|
+
/** Wait for a shared refresh while preserving per-caller cancellation. */
|
|
224
|
+
function waitForToken(refresh: Promise<CachedToken>, signal?: AbortSignal): Promise<CachedToken> {
|
|
225
|
+
if (!signal) return refresh;
|
|
226
|
+
signal.throwIfAborted();
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
const onAbort = () => reject(signal.reason ?? new Error("Connector token request aborted"));
|
|
229
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
230
|
+
refresh.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
|
|
231
|
+
});
|
|
232
|
+
}
|
|
232
233
|
|
|
234
|
+
/** Fetch one Connector token without binding the shared refresh to one caller's signal. */
|
|
235
|
+
async function refreshConnectorToken(
|
|
236
|
+
options: { appId: string; appPassword: string },
|
|
237
|
+
tenant: string,
|
|
238
|
+
now: number,
|
|
239
|
+
): Promise<CachedToken> {
|
|
233
240
|
const body = new URLSearchParams({
|
|
234
241
|
grant_type: "client_credentials",
|
|
235
242
|
client_id: options.appId,
|
|
236
243
|
client_secret: options.appPassword,
|
|
237
244
|
scope: CONNECTOR_SCOPE,
|
|
238
245
|
});
|
|
239
|
-
const response = await fetch(LOGIN_TOKEN_URL(
|
|
246
|
+
const response = await fetch(LOGIN_TOKEN_URL(tenant), {
|
|
240
247
|
method: "POST",
|
|
241
248
|
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
242
249
|
body,
|
|
243
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
244
250
|
});
|
|
245
251
|
if (!response.ok) {
|
|
246
252
|
const detail = await response.text().catch(() => "");
|
|
@@ -252,9 +258,41 @@ export const connectorToken = async (options: {
|
|
|
252
258
|
const token = typeof payload.access_token === "string" ? payload.access_token : null;
|
|
253
259
|
if (!token) throw new Error("teams: token response carried no access_token");
|
|
254
260
|
const expiresIn = typeof payload.expires_in === "number" ? payload.expires_in : 3600;
|
|
255
|
-
tokenCache = { token, expiresAt: now + expiresIn * 1000 - TOKEN_SKEW_MS };
|
|
256
261
|
logger.debug("connector token refreshed", { expiresIn });
|
|
257
|
-
return token;
|
|
262
|
+
return { token, expiresAt: now + expiresIn * 1000 - TOKEN_SKEW_MS };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Fetch (or reuse) a Connector API access token for the bot's own app
|
|
267
|
+
* registration.
|
|
268
|
+
*
|
|
269
|
+
* Cached until shortly before expiry: a Connector token is valid for ~1h, and
|
|
270
|
+
* re-fetching per reply would add a round trip to every turn.
|
|
271
|
+
*/
|
|
272
|
+
export const connectorToken = async (options: {
|
|
273
|
+
appId: string;
|
|
274
|
+
appPassword: string;
|
|
275
|
+
appTenantId?: string;
|
|
276
|
+
signal?: AbortSignal;
|
|
277
|
+
}): Promise<string> => {
|
|
278
|
+
const tenant = options.appTenantId ?? MULTI_TENANT;
|
|
279
|
+
const cacheKey = `${tenant}\0${options.appId}`;
|
|
280
|
+
const now = Date.now();
|
|
281
|
+
let entry = tokenCache.get(cacheKey);
|
|
282
|
+
if (!entry) {
|
|
283
|
+
entry = {};
|
|
284
|
+
tokenCache.set(cacheKey, entry);
|
|
285
|
+
}
|
|
286
|
+
if (entry.value && entry.value.expiresAt > now) return entry.value.token;
|
|
287
|
+
entry.refresh ??= refreshConnectorToken(options, tenant, now)
|
|
288
|
+
.then((value) => {
|
|
289
|
+
entry.value = value;
|
|
290
|
+
return value;
|
|
291
|
+
})
|
|
292
|
+
.finally(() => {
|
|
293
|
+
entry.refresh = undefined;
|
|
294
|
+
});
|
|
295
|
+
return (await waitForToken(entry.refresh, options.signal)).token;
|
|
258
296
|
};
|
|
259
297
|
|
|
260
298
|
/**
|
package/src/builder.ts
CHANGED
|
@@ -76,12 +76,13 @@ function actionElements(spec: card.CardSpec): CardElement[] {
|
|
|
76
76
|
* the `adaptivecards` package or post to a Teams incoming webhook.
|
|
77
77
|
*/
|
|
78
78
|
export function buildAdaptiveCard(spec: card.CardSpec): card.AdaptiveCard {
|
|
79
|
+
const validated = card.cardSpecSchema.parse(spec);
|
|
79
80
|
const body: CardElement[] = [
|
|
80
|
-
...headingElements(
|
|
81
|
-
...textElements(
|
|
82
|
-
...factElements(
|
|
81
|
+
...headingElements(validated),
|
|
82
|
+
...textElements(validated),
|
|
83
|
+
...factElements(validated),
|
|
83
84
|
];
|
|
84
|
-
const actions = actionElements(
|
|
85
|
+
const actions = actionElements(validated);
|
|
85
86
|
const document: card.AdaptiveCard = {
|
|
86
87
|
type: "AdaptiveCard",
|
|
87
88
|
$schema: card.ADAPTIVE_CARD_SCHEMA_URL,
|
package/src/config.ts
CHANGED
|
@@ -200,7 +200,7 @@ export function resolveTeamsConfig(overrides?: TeamsPluginConfig): ResolvedTeams
|
|
|
200
200
|
const cardVersion =
|
|
201
201
|
env.string(overrides?.cardVersion, CARD_VERSION_ENV) ?? card.ADAPTIVE_CARD_VERSION;
|
|
202
202
|
const webhookUrl = env.string(overrides?.webhookUrl, WEBHOOK_URL_ENV);
|
|
203
|
-
if (webhookUrl !== null && !
|
|
203
|
+
if (webhookUrl !== null && !isHttpsUrl(webhookUrl)) {
|
|
204
204
|
throw ValidationError.invalidValue(
|
|
205
205
|
WEBHOOK_URL_ENV,
|
|
206
206
|
webhookUrl,
|
|
@@ -224,12 +224,10 @@ export function resolveTeamsConfig(overrides?: TeamsPluginConfig): ResolvedTeams
|
|
|
224
224
|
};
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
/** Whether `value` parses as an absolute URL. */
|
|
228
|
-
function
|
|
227
|
+
/** Whether `value` parses as an absolute HTTPS URL. */
|
|
228
|
+
function isHttpsUrl(value: string): boolean {
|
|
229
229
|
try {
|
|
230
|
-
|
|
231
|
-
new URL(value);
|
|
232
|
-
return true;
|
|
230
|
+
return new URL(value).protocol === "https:";
|
|
233
231
|
} catch {
|
|
234
232
|
return false;
|
|
235
233
|
}
|