@dbx-tools/email 0.6.45 → 0.6.48
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 +43 -25
- package/index.ts +1 -2
- package/lib/index.d.ts +1 -2
- package/lib/index.js +2 -2
- package/lib/src/brand.d.ts +5 -42
- package/lib/src/brand.js +5 -39
- package/lib/src/config.d.ts +6 -7
- package/lib/src/config.js +25 -20
- package/lib/src/defaults.d.ts +1 -1
- package/lib/src/defaults.js +2 -2
- package/lib/src/email-html.d.ts +14 -49
- package/lib/src/email-html.js +20 -141
- package/lib/src/markdown.d.ts +4 -22
- package/lib/src/markdown.js +11 -79
- package/lib/src/outbox.js +2 -2
- package/lib/src/tool.d.ts +1 -1
- package/lib/src/tool.js +5 -7
- package/lib/src/transport.d.ts +2 -2
- package/lib/src/transport.js +30 -36
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -9
- package/src/brand.ts +9 -59
- package/src/config.ts +29 -25
- package/src/defaults.ts +1 -1
- package/src/email-html.ts +23 -164
- package/src/markdown.ts +12 -92
- package/src/outbox.ts +1 -1
- package/src/tool.ts +4 -6
- package/src/transport.ts +28 -35
- package/src/juice.d.ts +0 -17
package/lib/src/transport.js
CHANGED
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
*
|
|
22
22
|
* @module
|
|
23
23
|
*/
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { ConfigurationError, ExecutionError, ValidationError, } from "@databricks/appkit";
|
|
25
|
+
import { execution, log } from "@dbx-tools/shared-core";
|
|
26
26
|
import nodemailer from "nodemailer";
|
|
27
27
|
import { resolveEmailConfig } from "./config.js";
|
|
28
28
|
import { EMAIL_SEND_SETTINGS, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENT_COUNT, MAX_ATTACHMENTS_TOTAL_BYTES, MAX_BODY_CHARS, } from "./defaults.js";
|
|
29
|
-
import {
|
|
29
|
+
import { renderEmail } from "./email-html.js";
|
|
30
30
|
import { writeOutboxEmail } from "./outbox.js";
|
|
31
31
|
import { assertSenderAllowed } from "./sender.js";
|
|
32
32
|
const logger = log.logger("email/transport");
|
|
@@ -35,18 +35,7 @@ const logger = log.logger("email/transport");
|
|
|
35
35
|
* directly, mapping a throw onto the same {@link ExecutionResult} shape so
|
|
36
36
|
* call sites branch on `ok` either way.
|
|
37
37
|
*/
|
|
38
|
-
const directExecute =
|
|
39
|
-
try {
|
|
40
|
-
return { ok: true, data: await fn() };
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
return {
|
|
44
|
-
ok: false,
|
|
45
|
-
status: err instanceof AppKitError ? err.statusCode : 500,
|
|
46
|
-
message: error.errorMessage(err),
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
};
|
|
38
|
+
const directExecute = execution.directExecutor();
|
|
50
39
|
let runtime;
|
|
51
40
|
/**
|
|
52
41
|
* Return the shared runtime, building it on first use by resolving
|
|
@@ -113,19 +102,23 @@ export function resetEmailRuntime() {
|
|
|
113
102
|
*/
|
|
114
103
|
export async function executeWrite(operation, settings, fn, signal) {
|
|
115
104
|
const { execute } = getEmailRuntime();
|
|
116
|
-
|
|
117
|
-
if (result.ok)
|
|
118
|
-
return result.data;
|
|
119
|
-
// A caller that cancelled is not a failure worth reporting as one.
|
|
120
|
-
if (signal?.aborted)
|
|
121
|
-
throw ExecutionError.canceled();
|
|
122
|
-
logger.warn("execution-failed", {
|
|
105
|
+
return execution.run({
|
|
123
106
|
operation,
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
107
|
+
settings,
|
|
108
|
+
execute,
|
|
109
|
+
fn,
|
|
110
|
+
signal,
|
|
111
|
+
canceled: ExecutionError.canceled,
|
|
112
|
+
failed: (failure) => {
|
|
113
|
+
logger.warn("execution-failed", {
|
|
114
|
+
operation: failure.operation,
|
|
115
|
+
status: failure.status,
|
|
116
|
+
error: failure.message,
|
|
117
|
+
});
|
|
118
|
+
return new ExecutionError(`email: ${failure.operation} failed`, {
|
|
119
|
+
context: { operation: failure.operation, status: failure.status },
|
|
120
|
+
});
|
|
121
|
+
},
|
|
129
122
|
});
|
|
130
123
|
}
|
|
131
124
|
/**
|
|
@@ -256,16 +249,17 @@ async function dispatch(message, from, signal) {
|
|
|
256
249
|
throw ConfigurationError.invalidConnection("SMTP", "No transport was built for the resolved configuration.");
|
|
257
250
|
}
|
|
258
251
|
const attachments = toMailAttachments(message.attachments);
|
|
252
|
+
const rendered = await renderEmail({
|
|
253
|
+
subject: message.subject,
|
|
254
|
+
body: message.body,
|
|
255
|
+
brand: config.brand,
|
|
256
|
+
});
|
|
259
257
|
const info = await abortable(transporter.sendMail({
|
|
260
258
|
from,
|
|
261
259
|
to: message.to,
|
|
262
260
|
subject: message.subject,
|
|
263
|
-
text:
|
|
264
|
-
html:
|
|
265
|
-
subject: message.subject,
|
|
266
|
-
body: message.body,
|
|
267
|
-
...(config.brand ? { brand: config.brand } : {}),
|
|
268
|
-
}),
|
|
261
|
+
text: rendered.text,
|
|
262
|
+
html: rendered.html,
|
|
269
263
|
...(message.cc && message.cc.length > 0 ? { cc: message.cc } : {}),
|
|
270
264
|
...(message.bcc && message.bcc.length > 0 ? { bcc: message.bcc } : {}),
|
|
271
265
|
...(attachments ? { attachments } : {}),
|
|
@@ -281,8 +275,8 @@ async function dispatch(message, from, signal) {
|
|
|
281
275
|
* Send (SMTP mode) or persist (file/outbox mode) one message from the
|
|
282
276
|
* resolved `from` address. `to` (and optional `cc` / `bcc`) each accept
|
|
283
277
|
* one or more addresses, and `attachments` are forwarded as files. The
|
|
284
|
-
* body is
|
|
285
|
-
*
|
|
278
|
+
* body is rendered by React Email into matching plain-text and HTML MIME
|
|
279
|
+
* alternatives, and the outbox embeds the
|
|
286
280
|
* rendered HTML in a document. In file mode the returned `messageId` is
|
|
287
281
|
* the path written. Throws when `to` carries no recipient, when the body
|
|
288
282
|
* or attachments exceed the plugin's caps, or when `from` is not permitted
|
|
@@ -300,4 +294,4 @@ export async function sendEmail(message, from, signal) {
|
|
|
300
294
|
assertSenderAllowed(from, getEmailRuntime().config.allowedSenders);
|
|
301
295
|
return executeWrite("send", EMAIL_SEND_SETTINGS, (executeSignal) => dispatch(message, from, executeSignal), signal);
|
|
302
296
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxlQUFlLEdBRWhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0QsT0FBTyxVQUFzRCxNQUFNLFlBQVksQ0FBQztBQUNoRixPQUFPLEVBQUUsa0JBQWtCLEVBQW9ELE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0IsY0FBYyxHQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQW9CN0M7Ozs7R0FJRztBQUNILE1BQU0sYUFBYSxHQUFrQixLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDaEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE9BQU87WUFDTCxFQUFFLEVBQUUsS0FBSztZQUNULE1BQU0sRUFBRSxHQUFHLFlBQVksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFH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QUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkUsT0FBTyxZQUFZLENBQ2pCLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUN6RCxNQUFNLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBlbWFpbCBydW50aW1lOiBhIGxhemlseS1idWlsdCwgcHJvY2Vzcy13aWRlIGRpc3BhdGNoZXIgcGx1cyBpdHNcbiAqIHJlc29sdmVkIGNvbmZpZywgYW5kIHtAbGluayBzZW5kRW1haWx9IHdoaWNoIHNlbmRzIG9uZVxuICoge0BsaW5rIEVtYWlsTWVzc2FnZX0gdGhyb3VnaCBpdC4gSW4gU01UUCBtb2RlIHRoZSBydW50aW1lIGhvbGRzIGFcbiAqIG1lbW9pemVkIG5vZGVtYWlsZXIgdHJhbnNwb3J0IChzaGFyZWQgYnkgdGhlIHBsdWdpbidzIHNldHVwIGFuZCB0aGVcbiAqIGFnZW50IHRvb2wsIHNvIHRoZXkgcmV1c2Ugb25lIGNvbm5lY3Rpb24gcG9vbCk7IGluIGZpbGUvb3V0Ym94IG1vZGUgaXRcbiAqIGhvbGRzIG5vIHRyYW5zcG9ydCBhbmQge0BsaW5rIHNlbmRFbWFpbH0gd3JpdGVzIEhUTUwgdG8gZGlzayBpbnN0ZWFkLlxuICogVGhlIGZpcnN0IGNhbGxlciAobm9ybWFsbHkgdGhlIHBsdWdpbiBhdCBzZXR1cCkgcHJpbWVzIGl0IHdpdGggdGhlXG4gKiBwbHVnaW4ncyBjb25maWc7IGxhdGVyIGNhbGxlcnMgcmV1c2UgaXQuXG4gKlxuICogVGhlIHJ1bnRpbWUgYWxzbyBjYXJyaWVzIHRoZSB7QGxpbmsgRW1haWxFeGVjdXRvcn0gZXZlcnkgb3V0Ym91bmQgc2VuZCBydW5zXG4gKiB0aHJvdWdoLiBUaGUgcGx1Z2luIGluc3RhbGxzIGl0cyBvd24gYGV4ZWN1dGUoKWAgdGhlcmUgYXQgc2V0dXAsIHdoaWNoIGlzXG4gKiBob3cgdGhlIE1hc3RyYSB0b29sIC0gYSBwbGFpbiBmdW5jdGlvbiB3aXRoIG5vIHBsdWdpbiBpbnN0YW5jZSBpbiBzY29wZSAtXG4gKiBzdGlsbCBnZXRzIEFwcEtpdCdzIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi4gV2l0aG91dCBhIHJlZ2lzdGVyZWRcbiAqIHBsdWdpbiAoYSBkaXJlY3QgY2FsbCBmcm9tIGEgc2NyaXB0IG9yIGEgdGVzdCkgdGhlIHNlbmQgc3RpbGwgcnVucywganVzdFxuICogd2l0aG91dCBpbnRlcmNlcHRvcnMuXG4gKlxuICogRXZlcnkgZW50cnkgcG9pbnQgdGFrZXMgYW4gb3B0aW9uYWwge0BsaW5rIEFib3J0U2lnbmFsfSBzbyB0aGUgcGx1Z2luJ3NcbiAqIGBleGVjdXRlKClgIHRpbWVvdXQgYW5kIGEgY2xpZW50IGRpc2Nvbm5lY3QgYm90aCBzdG9wIHRoZSBjYWxsZXIgd2FpdGluZ1xuICogb24gU01UUC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQXBwS2l0RXJyb3IsXG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRW1haWxBdHRhY2htZW50LCBFbWFpbE1lc3NhZ2UsIEVtYWlsUmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgbm9kZW1haWxlciwgeyB0eXBlIFNlbmRNYWlsT3B0aW9ucywgdHlwZSBUcmFuc3BvcnRlciB9IGZyb20gXCJub2RlbWFpbGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW1haWxDb25maWcsIHR5cGUgRW1haWxQbHVnaW5Db25maWcsIHR5cGUgUmVzb2x2ZWRFbWFpbENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgRU1BSUxfU0VORF9TRVRUSU5HUyxcbiAgTUFYX0FUVEFDSE1FTlRfQllURVMsXG4gIE1BWF9BVFRBQ0hNRU5UX0NPVU5ULFxuICBNQVhfQVRUQUNITUVOVFNfVE9UQUxfQllURVMsXG4gIE1BWF9CT0RZX0NIQVJTLFxuICB0eXBlIEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MsXG59IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyByZW5kZXJFbWFpbEh0bWwgfSBmcm9tIFwiLi9lbWFpbC1odG1sLnRzXCI7XG5pbXBvcnQgeyB3cml0ZU91dGJveEVtYWlsIH0gZnJvbSBcIi4vb3V0Ym94LnRzXCI7XG5pbXBvcnQgeyBhc3NlcnRTZW5kZXJBbGxvd2VkIH0gZnJvbSBcIi4vc2VuZGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbC90cmFuc3BvcnRcIik7XG5cbi8qKlxuICogUnVucyBvbmUgb3V0Ym91bmQgc2VuZCB0aHJvdWdoIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluLiBNYXRjaGVzXG4gKiBgUGx1Z2luLmV4ZWN1dGUoKWAsIHdoaWNoIG5ldmVyIHRocm93czogYSBmYWlsdXJlIGNvbWVzIGJhY2sgYXNcbiAqIGB7IG9rOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IHR5cGUgRW1haWxFeGVjdXRvciA9IDxUPihcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2V0dGluZ3M6IEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIFRoZSBzaGFyZWQgZGlzcGF0Y2hlciwgaXRzIHJlc29sdmVkIGNvbmZpZywgYW5kIHRoZSBzZW5kIGV4ZWN1dG9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbFJ1bnRpbWUge1xuICAvKiogUHJlc2VudCBvbmx5IGluIFNNVFAgbW9kZS4gKi9cbiAgdHJhbnNwb3J0ZXI/OiBUcmFuc3BvcnRlcjtcbiAgY29uZmlnOiBSZXNvbHZlZEVtYWlsQ29uZmlnO1xuICBleGVjdXRlOiBFbWFpbEV4ZWN1dG9yO1xufVxuXG4vKipcbiAqIEV4ZWN1dG9yIHVzZWQgdW50aWwgKG9yIHVubGVzcykgdGhlIHBsdWdpbiBpbnN0YWxscyBpdHMgb3duOiBydW4gdGhlIHNlbmRcbiAqIGRpcmVjdGx5LCBtYXBwaW5nIGEgdGhyb3cgb250byB0aGUgc2FtZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBzaGFwZSBzb1xuICogY2FsbCBzaXRlcyBicmFuY2ggb24gYG9rYCBlaXRoZXIgd2F5LlxuICovXG5jb25zdCBkaXJlY3RFeGVjdXRlOiBFbWFpbEV4ZWN1dG9yID0gYXN5bmMgKGZuKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IGF3YWl0IGZuKCkgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIHN0YXR1czogZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIuc3RhdHVzQ29kZSA6IDUwMCxcbiAgICAgIG1lc3NhZ2U6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH07XG4gIH1cbn07XG5cbmxldCBydW50aW1lOiBFbWFpbFJ1bnRpbWUgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzaGFyZWQgcnVudGltZSwgYnVpbGRpbmcgaXQgb24gZmlyc3QgdXNlIGJ5IHJlc29sdmluZ1xuICogYG92ZXJyaWRlc2Agb3ZlciB0aGUgZW52aXJvbm1lbnQgKGBTTVRQX0hPU1RgLCBgU01UUF9QT1JUYCxcbiAqIGBTTVRQX1NFQ1VSRWAsIGBTTVRQX1VTRVJgLCBgU01UUF9QQVNTV09SRGAsIGBFTUFJTF9ET01BSU5gLFxuICogYEVNQUlMX0ZST01gLCBgRU1BSUxfQUxMT1dFRF9TRU5ERVJTYCwgYEVNQUlMX1NFTkRFUl9QT0xJQ1lgLFxuICogYEVNQUlMX09VVEJPWF9NT0RFYCwgYEVNQUlMX09VVEJPWF9ESVJgKSB0aHJvdWdoXG4gKiB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfS4gV2l0aCBTTVRQIGNyZWRlbnRpYWxzIHByZXNlbnQgaXQgaG9sZHMgYVxuICogbm9kZW1haWxlciB0cmFuc3BvcnQgYW5kIGl0cyBjb25uZWN0aW9uIHBvb2w7IG90aGVyd2lzZSBpdCBpcyBpblxuICogZmlsZS9vdXRib3ggbW9kZSBhbmQgaG9sZHMgbm9uZS5cbiAqXG4gKiBgb3ZlcnJpZGVzYCBpcyByZWFkIG9ubHkgb24gdGhlIGNhbGwgdGhhdCBidWlsZHMgdGhlIHJ1bnRpbWUsIHNvIHByaW1lIGl0XG4gKiBmcm9tIHRoZSBwbHVnaW4ncyBjb25maWcgYXQgc2V0dXA7IGxhdGVyIGNhbGxlcnMgKHRoZSB0b29sJ3MgYGV4ZWN1dGVgLFxuICogdGhlIHNlbmRlci1vcHRpb25zIHJvdXRlKSBwYXNzIG5vdGhpbmcgYW5kIGdldCB0aGUgc2FtZSBpbnN0YW5jZS4gVGhyb3dzXG4gKiB3aGF0ZXZlciB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfSB0aHJvd3MgZm9yIGFuIHVudXNhYmxlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWFpbFJ1bnRpbWUob3ZlcnJpZGVzPzogRW1haWxQbHVnaW5Db25maWcpOiBFbWFpbFJ1bnRpbWUge1xuICBpZiAoIXJ1bnRpbWUpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRW1haWxDb25maWcob3ZlcnJpZGVzKTtcbiAgICBydW50aW1lID0ge1xuICAgICAgY29uZmlnLFxuICAgICAgZXhlY3V0ZTogZGlyZWN0RXhlY3V0ZSxcbiAgICAgIC4uLihjb25maWcubW9kZSA9PT0gXCJzbXRwXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0cmFuc3BvcnRlcjogbm9kZW1haWxlci5jcmVhdGVUcmFuc3BvcnQoe1xuICAgICAgICAgICAgICBob3N0OiBjb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICAgICAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICAgICAgICAgICAgYXV0aDogY29uZmlnLmF1dGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZXhlY3V0b3Igb3V0Ym91bmQgc2VuZHMgcnVuIHRocm91Z2guIFRoZSBwbHVnaW4gY2FsbHMgdGhpcyBhdFxuICogc2V0dXAgd2l0aCBpdHMgb3duIGBleGVjdXRlKClgOyBhIHNlY29uZCBjYWxsIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBvbmUsIHNvXG4gKiBhIHJlLXJlZ2lzdGVyZWQgcGx1Z2luIGRvZXMgbm90IGxlYXZlIHRoZSB0b29scyBib3VuZCB0byBhIGRlYWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFbWFpbEV4ZWN1dG9yKGV4ZWN1dGU6IEVtYWlsRXhlY3V0b3IpOiB2b2lkIHtcbiAgZ2V0RW1haWxSdW50aW1lKCkuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKlxuICogRHJvcCB0aGUgbWVtb2l6ZWQgcnVudGltZSwgY2xvc2luZyB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wsIHNvIHRoZSBuZXh0XG4gKiB7QGxpbmsgZ2V0RW1haWxSdW50aW1lfSByZWJ1aWxkcyBpdCBmcm9tIGZyZXNoIGNvbmZpZyBhbmQgc3RvcHMgY2FsbGluZ1xuICogdGhyb3VnaCBhIHRvcm4tZG93biBwbHVnaW4ncyBgZXhlY3V0ZSgpYC4gSWRlbXBvdGVudCwgYW5kIHRoZSBwbHVnaW4nc1xuICogYHNodXRkb3duKClgIGhvb2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEVtYWlsUnVudGltZSgpOiB2b2lkIHtcbiAgcnVudGltZT8udHJhbnNwb3J0ZXI/LmNsb3NlKCk7XG4gIHJ1bnRpbWUgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIG9uZSBub24taWRlbXBvdGVudCB3cml0ZSB0aHJvdWdoIHRoZSBzaGFyZWQgZXhlY3V0b3IgYW5kIHVud3JhcCBpdC5cbiAqXG4gKiBgZXhlY3V0ZSgpYCBuZXZlciB0aHJvd3MsIHNvIGEgZmFpbGVkIHNlbmQgYXJyaXZlcyBhcyBgeyBvazogZmFsc2UgfWAgd2l0aCBhXG4gKiBzdGF0dXMgdGhlIGludGVyY2VwdG9ycyBhbHJlYWR5IHNhbml0aXplZDsgaXQgaXMgbG9nZ2VkIGhlcmUgYW5kIHJlLXJhaXNlZFxuICogYXMgYSBzdGFibGUge0BsaW5rIEV4ZWN1dGlvbkVycm9yfSBzbyBhbiB1cHN0cmVhbSBtZXNzYWdlIG5ldmVyIGJlY29tZXMgdGhlXG4gKiBjYWxsZXIncyBlcnJvciB0ZXh0LiBgc2lnbmFsYCBpcyB0aGUgY2FsbGVyJ3Mgb3duIGNhbmNlbGxhdGlvbiAoYW4gYWdlbnRcbiAqIHJ1biwgYSByZXF1ZXN0IHRlYXJkb3duKTsgaXQgaXMgbWVyZ2VkIHdpdGggdGhlIHNpZ25hbCB0aGUgdGltZW91dFxuICogaW50ZXJjZXB0b3Igc3VwcGxpZXMgc28gZWl0aGVyIG9uZSB1bndpbmRzIHRoZSBJL08uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlV3JpdGU8VD4oXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogRW1haWxFeGVjdXRpb25TZXR0aW5ncyxcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgeyBleGVjdXRlIH0gPSBnZXRFbWFpbFJ1bnRpbWUoKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZShcbiAgICAoZXhlY3V0ZVNpZ25hbCkgPT4gZm4oYXN5bmMuY29tYmluZUFib3J0U2lnbmFscyhleGVjdXRlU2lnbmFsLCBzaWduYWwpKSxcbiAgICBzZXR0aW5ncyxcbiAgKTtcbiAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAvLyBBIGNhbGxlciB0aGF0IGNhbmNlbGxlZCBpcyBub3QgYSBmYWlsdXJlIHdvcnRoIHJlcG9ydGluZyBhcyBvbmUuXG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IEV4ZWN1dGlvbkVycm9yLmNhbmNlbGVkKCk7XG4gIGxvZ2dlci53YXJuKFwiZXhlY3V0aW9uLWZhaWxlZFwiLCB7XG4gICAgb3BlcmF0aW9uLFxuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gIH0pO1xuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYGVtYWlsOiAke29wZXJhdGlvbn0gZmFpbGVkYCwge1xuICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbiBhbmQgdGVhciBkb3duIG9uZSBTTVRQIGNvbm5lY3Rpb24gdG8gcHJvdmUgdGhlIGhvc3QsIHBvcnQsIGFuZFxuICogY3JlZGVudGlhbHMgd29yay4gQ2FsbGVkIGF0IHBsdWdpbiBzZXR1cCBzbyBhIGJhZCByZWxheSBzaG93cyB1cCBpbiB0aGVcbiAqIGJvb3QgbG9ncyByYXRoZXIgdGhhbiBvbiB0aGUgZmlyc3QgYXBwcm92ZWQgc2VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUVtYWlsVHJhbnNwb3J0KFxuICB0cmFuc3BvcnRlcjogVHJhbnNwb3J0ZXIgfCB1bmRlZmluZWQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghdHJhbnNwb3J0ZXIpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIlNNVFBcIixcbiAgICAgIFwiVGhlIHJ1bnRpbWUgcmVzb2x2ZWQgdG8gb3V0Ym94IG1vZGUsIHNvIHRoZXJlIGlzIG5vIHRyYW5zcG9ydCB0byB2ZXJpZnkuXCIsXG4gICAgKTtcbiAgfVxuICBhd2FpdCBhYm9ydGFibGUodHJhbnNwb3J0ZXIudmVyaWZ5KCksIHNpZ25hbCk7XG59XG5cbi8qKlxuICogU3RvcCBhd2FpdGluZyBgcHJvbWlzZWAgYXMgc29vbiBhcyBgc2lnbmFsYCBhYm9ydHMuIG5vZGVtYWlsZXIgZXhwb3NlcyBub1xuICogY2FuY2VsbGF0aW9uIGhvb2ssIHNvIHRoZSBTTVRQIGNvbnZlcnNhdGlvbiBpdHNlbGYgZmluaXNoZXMgb24gaXRzIG93blxuICogY29ubmVjdGlvbjsgd2hhdCB1bndpbmRzIGlzIHRoZSBjYWxsZXIgYW5kIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBvZiBpdC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRhYmxlPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBwcm9taXNlO1xuICBzaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgLy8gVGhlIGxpc3RlbmVyIGlzIGRldGFjaGVkIG9uY2UgdGhlIHJhY2Ugc2V0dGxlcyBzbyBhIGxvbmctbGl2ZWQgcnVuIHNpZ25hbFxuICAvLyBkb2VzIG5vdCBhY2N1bXVsYXRlIG9uZSBwZXIgc2VuZC5cbiAgY29uc3QgbGlzdGVuZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGFib3J0ZWQgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24pLCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiBsaXN0ZW5lci5zaWduYWwsXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtwcm9taXNlLCBhYm9ydGVkXSkuZmluYWxseSgoKSA9PiBsaXN0ZW5lci5hYm9ydCgpKTtcbn1cblxuLyoqIFRoZSBjb21tYS1qb2luZWQgcmVjaXBpZW50IHN0cmluZyBlY2hvZWQgYmFjayBpbiB7QGxpbmsgRW1haWxSZXN1bHR9LiAqL1xuZnVuY3Rpb24gcmVjaXBpZW50RWNobyh0bzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gdG8uam9pbihcIiwgXCIpO1xufVxuXG4vKipcbiAqIE5vZGUgYnVmZmVyIGVuY29kaW5ncyBhIHdpcmUgYXR0YWNobWVudCBtYXkgbmFtZSBmb3IgaXRzIGlubGluZSBgY29udGVudGAuXG4gKiBBbnl0aGluZyBlbHNlIGlzIG1lYXN1cmVkIGFzIFVURi04LCB3aGljaCBvdmVyLWNvdW50cyByYXRoZXIgdGhhbiBsZXR0aW5nXG4gKiBhbiB1bnJlY29nbml6ZWQgZW5jb2Rpbmcgc2xpcCBwYXN0IHRoZSBzaXplIGNhcC5cbiAqL1xuY29uc3QgQ09OVEVOVF9FTkNPRElOR1M6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJhc2NpaVwiLFxuICBcImJhc2U2NFwiLFxuICBcImJhc2U2NHVybFwiLFxuICBcImJpbmFyeVwiLFxuICBcImhleFwiLFxuICBcImxhdGluMVwiLFxuICBcInVjczJcIixcbiAgXCJ1Y3MtMlwiLFxuICBcInV0ZjhcIixcbiAgXCJ1dGYtOFwiLFxuICBcInV0ZjE2bGVcIixcbiAgXCJ1dGYtMTZsZVwiLFxuXSk7XG5cbi8qKlxuICogRGVjb2RlZCBieXRlIHNpemUgb2Ygb25lIGF0dGFjaG1lbnQncyBpbmxpbmUgY29udGVudC4gQSBgcGF0aGAgYXR0YWNobWVudFxuICogY29udHJpYnV0ZXMgbm90aGluZzogbm9kZW1haWxlciBzdHJlYW1zIGl0LCBzbyBpdHMgYnl0ZXMgbmV2ZXIgc2l0IGluIHRoaXNcbiAqIHByb2Nlc3MgYW5kIGNhbm5vdCBiZSBtZWFzdXJlZCBoZXJlLlxuICovXG5mdW5jdGlvbiBhdHRhY2htZW50Qnl0ZXMoYXR0YWNobWVudDogRW1haWxBdHRhY2htZW50KTogbnVtYmVyIHtcbiAgY29uc3QgeyBjb250ZW50LCBlbmNvZGluZyB9ID0gYXR0YWNobWVudDtcbiAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIGNvbnN0IGRlY2xhcmVkID0gZW5jb2Rpbmc/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICBkZWNsYXJlZCAmJiBDT05URU5UX0VOQ09ESU5HUy5oYXMoZGVjbGFyZWQpID8gKGRlY2xhcmVkIGFzIEJ1ZmZlckVuY29kaW5nKSA6IFwidXRmOFwiO1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgcmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIFJlamVjdCBhIG1lc3NhZ2Ugd2hvc2UgYm9keSBvciBhdHRhY2htZW50cyBleGNlZWQgdGhlIHBsdWdpbidzIGNhcHMuIFRoZVxuICogYm9keSBhbmQgYXR0YWNobWVudCBsaXN0IGFycml2ZSBmcm9tIGEgbW9kZWwsIHNvIHRoZXkgYXJlIHVuYm91bmRlZCB1bnRpbFxuICogc29tZXRoaW5nIGJvdW5kcyB0aGVtOyBtb3N0IFNNVFAgcmVsYXlzIGFsc28gcmVqZWN0IGFuIG92ZXJzaXplZCBtZXNzYWdlXG4gKiBvbmx5IGFmdGVyIHRoZSB3aG9sZSBwYXlsb2FkIGhhcyBiZWVuIHVwbG9hZGVkLlxuICovXG5mdW5jdGlvbiBhc3NlcnRNZXNzYWdlV2l0aGluQ2FwcyhtZXNzYWdlOiBFbWFpbE1lc3NhZ2UpOiB2b2lkIHtcbiAgaWYgKG1lc3NhZ2UuYm9keS5sZW5ndGggPiBNQVhfQk9EWV9DSEFSUykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICBcImJvZHlcIixcbiAgICAgIG1lc3NhZ2UuYm9keS5sZW5ndGgsXG4gICAgICBgYXQgbW9zdCAke01BWF9CT0RZX0NIQVJTfSBjaGFyYWN0ZXJzYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyA/PyBbXTtcbiAgaWYgKGF0dGFjaG1lbnRzLmxlbmd0aCA+IE1BWF9BVFRBQ0hNRU5UX0NPVU5UKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiYXR0YWNobWVudHNcIixcbiAgICAgIGF0dGFjaG1lbnRzLmxlbmd0aCxcbiAgICAgIGBhdCBtb3N0ICR7TUFYX0FUVEFDSE1FTlRfQ09VTlR9IGZpbGVzYCxcbiAgICApO1xuICB9XG4gIGxldCB0b3RhbCA9IDA7XG4gIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBhdHRhY2htZW50cykge1xuICAgIGNvbnN0IGJ5dGVzID0gYXR0YWNobWVudEJ5dGVzKGF0dGFjaG1lbnQpO1xuICAgIGlmIChieXRlcyA+IE1BWF9BVFRBQ0hNRU5UX0JZVEVTKSB7XG4gICAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgICBcImF0dGFjaG1lbnRzW10uY29udGVudFwiLFxuICAgICAgICBieXRlcyxcbiAgICAgICAgYGF0IG1vc3QgJHtNQVhfQVRUQUNITUVOVF9CWVRFU30gYnl0ZXMgcGVyIGZpbGVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdG90YWwgKz0gYnl0ZXM7XG4gIH1cbiAgaWYgKHRvdGFsID4gTUFYX0FUVEFDSE1FTlRTX1RPVEFMX0JZVEVTKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiYXR0YWNobWVudHNcIixcbiAgICAgIHRvdGFsLFxuICAgICAgYGF0IG1vc3QgJHtNQVhfQVRUQUNITUVOVFNfVE9UQUxfQllURVN9IGJ5dGVzIGFjcm9zcyBhbGwgZmlsZXNgLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXAgdGhlIHdpcmUtZm9ybWF0IHtAbGluayBFbWFpbEF0dGFjaG1lbnR9cyBvbnRvIG5vZGVtYWlsZXInc1xuICogYXR0YWNobWVudCBzaGFwZSwgZHJvcHBpbmcgdW5zZXQgb3B0aW9uYWwga2V5cyBzbyBub2RlbWFpbGVyIGFwcGxpZXNcbiAqIGl0cyBvd24gZGVmYXVsdHMgKHV0Zi04IGVuY29kaW5nLCBmaWxlbmFtZS1pbmZlcnJlZCBjb250ZW50IHR5cGUpLiBUaGVcbiAqIHdpcmUgZmllbGRzIGFyZSBhIGRlbGliZXJhdGUgc3Vic2V0IG9mIG5vZGVtYWlsZXIncywgc28gdGhpcyBpcyBhXG4gKiBzdHJhaWdodCBzdHJ1Y3R1cmFsIHBhc3MtdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gdG9NYWlsQXR0YWNobWVudHMoXG4gIGF0dGFjaG1lbnRzOiBFbWFpbEF0dGFjaG1lbnRbXSB8IHVuZGVmaW5lZCxcbik6IFNlbmRNYWlsT3B0aW9uc1tcImF0dGFjaG1lbnRzXCJdIHtcbiAgaWYgKCFhdHRhY2htZW50cyB8fCBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBhdHRhY2htZW50cy5tYXAoKGF0dCkgPT4gKHtcbiAgICBmaWxlbmFtZTogYXR0LmZpbGVuYW1lLFxuICAgIC4uLihhdHQuY29udGVudCAhPT0gdW5kZWZpbmVkID8geyBjb250ZW50OiBhdHQuY29udGVudCB9IDoge30pLFxuICAgIC4uLihhdHQuZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IHsgZW5jb2Rpbmc6IGF0dC5lbmNvZGluZyB9IDoge30pLFxuICAgIC4uLihhdHQucGF0aCAhPT0gdW5kZWZpbmVkID8geyBwYXRoOiBhdHQucGF0aCB9IDoge30pLFxuICAgIC4uLihhdHQuY29udGVudFR5cGUgIT09IHVuZGVmaW5lZCA/IHsgY29udGVudFR5cGU6IGF0dC5jb250ZW50VHlwZSB9IDoge30pLFxuICB9KSk7XG59XG5cbi8qKlxuICogSGFuZCBvbmUgYWxyZWFkeS12YWxpZGF0ZWQgbWVzc2FnZSB0byBTTVRQLCBvciB3cml0ZSBpdCB0byB0aGUgb3V0Ym94IHdoZW5cbiAqIG5vIGNyZWRlbnRpYWxzIGFyZSBjb25maWd1cmVkLiBUaGUgaGFsZiBvZiBhIHNlbmQgdGhhdCBwZXJmb3JtcyBJL08sIHNvIGl0XG4gKiBpcyB3aGF0IHJ1bnMgaW5zaWRlIHRoZSBpbnRlcmNlcHRvciBjaGFpbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2goXG4gIG1lc3NhZ2U6IEVtYWlsTWVzc2FnZSxcbiAgZnJvbTogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW1haWxSZXN1bHQ+IHtcbiAgY29uc3QgeyBjb25maWcsIHRyYW5zcG9ydGVyIH0gPSBnZXRFbWFpbFJ1bnRpbWUoKTtcbiAgY29uc3QgcmVjaXBpZW50ID0gcmVjaXBpZW50RWNobyhtZXNzYWdlLnRvKTtcbiAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmIChjb25maWcubW9kZSA9PT0gXCJmaWxlXCIpIHtcbiAgICBjb25zdCBwYXRoID0gYXdhaXQgd3JpdGVPdXRib3hFbWFpbChtZXNzYWdlLCBmcm9tLCBjb25maWcub3V0RGlyLCBjb25maWcuYnJhbmQpO1xuICAgIHJldHVybiB7IHNlbnQ6IHRydWUsIHJlY2lwaWVudCwgZnJvbSwgbWVzc2FnZUlkOiBwYXRoIH07XG4gIH1cblxuICBpZiAoIXRyYW5zcG9ydGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJTTVRQXCIsXG4gICAgICBcIk5vIHRyYW5zcG9ydCB3YXMgYnVpbHQgZm9yIHRoZSByZXNvbHZlZCBjb25maWd1cmF0aW9uLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0YWNobWVudHMgPSB0b01haWxBdHRhY2htZW50cyhtZXNzYWdlLmF0dGFjaG1lbnRzKTtcbiAgY29uc3QgaW5mbyA9IGF3YWl0IGFib3J0YWJsZShcbiAgICB0cmFuc3BvcnRlci5zZW5kTWFpbCh7XG4gICAgICBmcm9tLFxuICAgICAgdG86IG1lc3NhZ2UudG8sXG4gICAgICBzdWJqZWN0OiBtZXNzYWdlLnN1YmplY3QsXG4gICAgICB0ZXh0OiBtZXNzYWdlLmJvZHksXG4gICAgICBodG1sOiByZW5kZXJFbWFpbEh0bWwoe1xuICAgICAgICBzdWJqZWN0OiBtZXNzYWdlLnN1YmplY3QsXG4gICAgICAgIGJvZHk6IG1lc3NhZ2UuYm9keSxcbiAgICAgICAgLi4uKGNvbmZpZy5icmFuZCA/IHsgYnJhbmQ6IGNvbmZpZy5icmFuZCB9IDoge30pLFxuICAgICAgfSksXG4gICAgICAuLi4obWVzc2FnZS5jYyAmJiBtZXNzYWdlLmNjLmxlbmd0aCA+IDAgPyB7IGNjOiBtZXNzYWdlLmNjIH0gOiB7fSksXG4gICAgICAuLi4obWVzc2FnZS5iY2MgJiYgbWVzc2FnZS5iY2MubGVuZ3RoID4gMCA/IHsgYmNjOiBtZXNzYWdlLmJjYyB9IDoge30pLFxuICAgICAgLi4uKGF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgIH0pLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBzZW50OiB0cnVlLFxuICAgIHJlY2lwaWVudCxcbiAgICBmcm9tLFxuICAgIC4uLihpbmZvLm1lc3NhZ2VJZCA/IHsgbWVzc2FnZUlkOiBpbmZvLm1lc3NhZ2VJZCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFNlbmQgKFNNVFAgbW9kZSkgb3IgcGVyc2lzdCAoZmlsZS9vdXRib3ggbW9kZSkgb25lIG1lc3NhZ2UgZnJvbSB0aGVcbiAqIHJlc29sdmVkIGBmcm9tYCBhZGRyZXNzLiBgdG9gIChhbmQgb3B0aW9uYWwgYGNjYCAvIGBiY2NgKSBlYWNoIGFjY2VwdFxuICogb25lIG9yIG1vcmUgYWRkcmVzc2VzLCBhbmQgYGF0dGFjaG1lbnRzYCBhcmUgZm9yd2FyZGVkIGFzIGZpbGVzLiBUaGVcbiAqIGJvZHkgaXMgbWFya2Rvd246IFNNVFAgc2VuZHMgaXQgYXMgYm90aCBhIHBsYWluLXRleHQgcGFydCAodGhlIHJhd1xuICogc291cmNlKSBhbmQgYW4gSFRNTCBwYXJ0IChyZW5kZXJlZCksIGFuZCB0aGUgb3V0Ym94IGVtYmVkcyB0aGVcbiAqIHJlbmRlcmVkIEhUTUwgaW4gYSBkb2N1bWVudC4gSW4gZmlsZSBtb2RlIHRoZSByZXR1cm5lZCBgbWVzc2FnZUlkYCBpc1xuICogdGhlIHBhdGggd3JpdHRlbi4gVGhyb3dzIHdoZW4gYHRvYCBjYXJyaWVzIG5vIHJlY2lwaWVudCwgd2hlbiB0aGUgYm9keVxuICogb3IgYXR0YWNobWVudHMgZXhjZWVkIHRoZSBwbHVnaW4ncyBjYXBzLCBvciB3aGVuIGBmcm9tYCBpcyBub3QgcGVybWl0dGVkXG4gKiBieSB0aGUgZWZmZWN0aXZlIHNlbmRlciBhbGxvdy1saXN0LlxuICpcbiAqIFRoZSByZWNpcGllbnQsIGNhcCwgYW5kIHNlbmRlciBjaGVja3MgcnVuIGJlZm9yZSB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gc29cbiAqIHRoZWlyIHNwZWNpZmljIHN0YXR1cyBhbmQgYWN0aW9uYWJsZSBtZXNzYWdlIHJlYWNoIHRoZSBjYWxsZXIgaW5zdGVhZCBvZlxuICogdGhlIGNoYWluJ3Mgc3RhYmxlIGZhaWx1cmUgdGV4dC4gYHNpZ25hbGAgY2FuY2VscyB0aGUgc2VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICBpZiAobWVzc2FnZS50by5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IubWlzc2luZ0ZpZWxkKFwidG9cIik7XG4gIH1cbiAgYXNzZXJ0TWVzc2FnZVdpdGhpbkNhcHMobWVzc2FnZSk7XG4gIGFzc2VydFNlbmRlckFsbG93ZWQoZnJvbSwgZ2V0RW1haWxSdW50aW1lKCkuY29uZmlnLmFsbG93ZWRTZW5kZXJzKTtcbiAgcmV0dXJuIGV4ZWN1dGVXcml0ZShcbiAgICBcInNlbmRcIixcbiAgICBFTUFJTF9TRU5EX1NFVFRJTkdTLFxuICAgIChleGVjdXRlU2lnbmFsKSA9PiBkaXNwYXRjaChtZXNzYWdlLCBmcm9tLCBleGVjdXRlU2lnbmFsKSxcbiAgICBzaWduYWwsXG4gICk7XG59XG4iXX0=
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGVBQWUsR0FFaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE9BQU8sVUFBc0QsTUFBTSxZQUFZLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFvRCxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FFZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFvQjdDOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUEwQixDQUFDO0FBRXpFLElBQUksT0FBaUMsQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsU0FBNkI7SUFDM0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHO1lBQ1IsTUFBTTtZQUNOLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLEdBQUcsQ0FBQyxNQUFN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QUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN4QyxDQUFDLEVBQ0YsTUFBTSxDQUNQLENBQUM7SUFDRixPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTO1FBQ1QsSUFBSTtRQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLE9BQXFCLEVBQ3JCLElBQVksRUFDWixNQUFvQjtJQUVwQixJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuRSxPQUFPLFlBQVksQ0FDakIsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQ3pELE1BQU0sQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGVtYWlsIHJ1bnRpbWU6IGEgbGF6aWx5LWJ1aWx0LCBwcm9jZXNzLXdpZGUgZGlzcGF0Y2hlciBwbHVzIGl0c1xuICogcmVzb2x2ZWQgY29uZmlnLCBhbmQge0BsaW5rIHNlbmRFbWFpbH0gd2hpY2ggc2VuZHMgb25lXG4gKiB7QGxpbmsgRW1haWxNZXNzYWdlfSB0aHJvdWdoIGl0LiBJbiBTTVRQIG1vZGUgdGhlIHJ1bnRpbWUgaG9sZHMgYVxuICogbWVtb2l6ZWQgbm9kZW1haWxlciB0cmFuc3BvcnQgKHNoYXJlZCBieSB0aGUgcGx1Z2luJ3Mgc2V0dXAgYW5kIHRoZVxuICogYWdlbnQgdG9vbCwgc28gdGhleSByZXVzZSBvbmUgY29ubmVjdGlvbiBwb29sKTsgaW4gZmlsZS9vdXRib3ggbW9kZSBpdFxuICogaG9sZHMgbm8gdHJhbnNwb3J0IGFuZCB7QGxpbmsgc2VuZEVtYWlsfSB3cml0ZXMgSFRNTCB0byBkaXNrIGluc3RlYWQuXG4gKiBUaGUgZmlyc3QgY2FsbGVyIChub3JtYWxseSB0aGUgcGx1Z2luIGF0IHNldHVwKSBwcmltZXMgaXQgd2l0aCB0aGVcbiAqIHBsdWdpbidzIGNvbmZpZzsgbGF0ZXIgY2FsbGVycyByZXVzZSBpdC5cbiAqXG4gKiBUaGUgcnVudGltZSBhbHNvIGNhcnJpZXMgdGhlIHtAbGluayBFbWFpbEV4ZWN1dG9yfSBldmVyeSBvdXRib3VuZCBzZW5kIHJ1bnNcbiAqIHRocm91Z2guIFRoZSBwbHVnaW4gaW5zdGFsbHMgaXRzIG93biBgZXhlY3V0ZSgpYCB0aGVyZSBhdCBzZXR1cCwgd2hpY2ggaXNcbiAqIGhvdyB0aGUgTWFzdHJhIHRvb2wgLSBhIHBsYWluIGZ1bmN0aW9uIHdpdGggbm8gcGx1Z2luIGluc3RhbmNlIGluIHNjb3BlIC1cbiAqIHN0aWxsIGdldHMgQXBwS2l0J3MgcmV0cnkgLyB0aW1lb3V0IC8gdGVsZW1ldHJ5IGNoYWluLiBXaXRob3V0IGEgcmVnaXN0ZXJlZFxuICogcGx1Z2luIChhIGRpcmVjdCBjYWxsIGZyb20gYSBzY3JpcHQgb3IgYSB0ZXN0KSB0aGUgc2VuZCBzdGlsbCBydW5zLCBqdXN0XG4gKiB3aXRob3V0IGludGVyY2VwdG9ycy5cbiAqXG4gKiBFdmVyeSBlbnRyeSBwb2ludCB0YWtlcyBhbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRTaWduYWx9IHNvIHRoZSBwbHVnaW4nc1xuICogYGV4ZWN1dGUoKWAgdGltZW91dCBhbmQgYSBjbGllbnQgZGlzY29ubmVjdCBib3RoIHN0b3AgdGhlIGNhbGxlciB3YWl0aW5nXG4gKiBvbiBTTVRQLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjdXRpb24sIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEVtYWlsQXR0YWNobWVudCwgRW1haWxNZXNzYWdlLCBFbWFpbFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IG5vZGVtYWlsZXIsIHsgdHlwZSBTZW5kTWFpbE9wdGlvbnMsIHR5cGUgVHJhbnNwb3J0ZXIgfSBmcm9tIFwibm9kZW1haWxlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZUVtYWlsQ29uZmlnLCB0eXBlIEVtYWlsUGx1Z2luQ29uZmlnLCB0eXBlIFJlc29sdmVkRW1haWxDb25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIEVNQUlMX1NFTkRfU0VUVElOR1MsXG4gIE1BWF9BVFRBQ0hNRU5UX0JZVEVTLFxuICBNQVhfQVRUQUNITUVOVF9DT1VOVCxcbiAgTUFYX0FUVEFDSE1FTlRTX1RPVEFMX0JZVEVTLFxuICBNQVhfQk9EWV9DSEFSUyxcbiAgdHlwZSBFbWFpbEV4ZWN1dGlvblNldHRpbmdzLFxufSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgcmVuZGVyRW1haWwgfSBmcm9tIFwiLi9lbWFpbC1odG1sLnRzXCI7XG5pbXBvcnQgeyB3cml0ZU91dGJveEVtYWlsIH0gZnJvbSBcIi4vb3V0Ym94LnRzXCI7XG5pbXBvcnQgeyBhc3NlcnRTZW5kZXJBbGxvd2VkIH0gZnJvbSBcIi4vc2VuZGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbC90cmFuc3BvcnRcIik7XG5cbi8qKlxuICogUnVucyBvbmUgb3V0Ym91bmQgc2VuZCB0aHJvdWdoIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluLiBNYXRjaGVzXG4gKiBgUGx1Z2luLmV4ZWN1dGUoKWAsIHdoaWNoIG5ldmVyIHRocm93czogYSBmYWlsdXJlIGNvbWVzIGJhY2sgYXNcbiAqIGB7IG9rOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IHR5cGUgRW1haWxFeGVjdXRvciA9IDxUPihcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2V0dGluZ3M6IEVtYWlsRXhlY3V0aW9uU2V0dGluZ3MsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFQ+PjtcblxuLyoqIFRoZSBzaGFyZWQgZGlzcGF0Y2hlciwgaXRzIHJlc29sdmVkIGNvbmZpZywgYW5kIHRoZSBzZW5kIGV4ZWN1dG9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbFJ1bnRpbWUge1xuICAvKiogUHJlc2VudCBvbmx5IGluIFNNVFAgbW9kZS4gKi9cbiAgdHJhbnNwb3J0ZXI/OiBUcmFuc3BvcnRlcjtcbiAgY29uZmlnOiBSZXNvbHZlZEVtYWlsQ29uZmlnO1xuICBleGVjdXRlOiBFbWFpbEV4ZWN1dG9yO1xufVxuXG4vKipcbiAqIEV4ZWN1dG9yIHVzZWQgdW50aWwgKG9yIHVubGVzcykgdGhlIHBsdWdpbiBpbnN0YWxscyBpdHMgb3duOiBydW4gdGhlIHNlbmRcbiAqIGRpcmVjdGx5LCBtYXBwaW5nIGEgdGhyb3cgb250byB0aGUgc2FtZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBzaGFwZSBzb1xuICogY2FsbCBzaXRlcyBicmFuY2ggb24gYG9rYCBlaXRoZXIgd2F5LlxuICovXG5jb25zdCBkaXJlY3RFeGVjdXRlID0gZXhlY3V0aW9uLmRpcmVjdEV4ZWN1dG9yPEVtYWlsRXhlY3V0aW9uU2V0dGluZ3M+KCk7XG5cbmxldCBydW50aW1lOiBFbWFpbFJ1bnRpbWUgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzaGFyZWQgcnVudGltZSwgYnVpbGRpbmcgaXQgb24gZmlyc3QgdXNlIGJ5IHJlc29sdmluZ1xuICogYG92ZXJyaWRlc2Agb3ZlciB0aGUgZW52aXJvbm1lbnQgKGBTTVRQX0hPU1RgLCBgU01UUF9QT1JUYCxcbiAqIGBTTVRQX1NFQ1VSRWAsIGBTTVRQX1VTRVJgLCBgU01UUF9QQVNTV09SRGAsIGBFTUFJTF9ET01BSU5gLFxuICogYEVNQUlMX0ZST01gLCBgRU1BSUxfQUxMT1dFRF9TRU5ERVJTYCwgYEVNQUlMX1NFTkRFUl9QT0xJQ1lgLFxuICogYEVNQUlMX09VVEJPWF9NT0RFYCwgYEVNQUlMX09VVEJPWF9ESVJgKSB0aHJvdWdoXG4gKiB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfS4gV2l0aCBTTVRQIGNyZWRlbnRpYWxzIHByZXNlbnQgaXQgaG9sZHMgYVxuICogbm9kZW1haWxlciB0cmFuc3BvcnQgYW5kIGl0cyBjb25uZWN0aW9uIHBvb2w7IG90aGVyd2lzZSBpdCBpcyBpblxuICogZmlsZS9vdXRib3ggbW9kZSBhbmQgaG9sZHMgbm9uZS5cbiAqXG4gKiBgb3ZlcnJpZGVzYCBpcyByZWFkIG9ubHkgb24gdGhlIGNhbGwgdGhhdCBidWlsZHMgdGhlIHJ1bnRpbWUsIHNvIHByaW1lIGl0XG4gKiBmcm9tIHRoZSBwbHVnaW4ncyBjb25maWcgYXQgc2V0dXA7IGxhdGVyIGNhbGxlcnMgKHRoZSB0b29sJ3MgYGV4ZWN1dGVgLFxuICogdGhlIHNlbmRlci1vcHRpb25zIHJvdXRlKSBwYXNzIG5vdGhpbmcgYW5kIGdldCB0aGUgc2FtZSBpbnN0YW5jZS4gVGhyb3dzXG4gKiB3aGF0ZXZlciB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfSB0aHJvd3MgZm9yIGFuIHVudXNhYmxlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWFpbFJ1bnRpbWUob3ZlcnJpZGVzPzogRW1haWxQbHVnaW5Db25maWcpOiBFbWFpbFJ1bnRpbWUge1xuICBpZiAoIXJ1bnRpbWUpIHtcbiAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRW1haWxDb25maWcob3ZlcnJpZGVzKTtcbiAgICBydW50aW1lID0ge1xuICAgICAgY29uZmlnLFxuICAgICAgZXhlY3V0ZTogZGlyZWN0RXhlY3V0ZSxcbiAgICAgIC4uLihjb25maWcubW9kZSA9PT0gXCJzbXRwXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0cmFuc3BvcnRlcjogbm9kZW1haWxlci5jcmVhdGVUcmFuc3BvcnQoe1xuICAgICAgICAgICAgICBob3N0OiBjb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICAgICAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICAgICAgICAgICAgYXV0aDogY29uZmlnLmF1dGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJ1bnRpbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZXhlY3V0b3Igb3V0Ym91bmQgc2VuZHMgcnVuIHRocm91Z2guIFRoZSBwbHVnaW4gY2FsbHMgdGhpcyBhdFxuICogc2V0dXAgd2l0aCBpdHMgb3duIGBleGVjdXRlKClgOyBhIHNlY29uZCBjYWxsIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBvbmUsIHNvXG4gKiBhIHJlLXJlZ2lzdGVyZWQgcGx1Z2luIGRvZXMgbm90IGxlYXZlIHRoZSB0b29scyBib3VuZCB0byBhIGRlYWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFbWFpbEV4ZWN1dG9yKGV4ZWN1dGU6IEVtYWlsRXhlY3V0b3IpOiB2b2lkIHtcbiAgZ2V0RW1haWxSdW50aW1lKCkuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKlxuICogRHJvcCB0aGUgbWVtb2l6ZWQgcnVudGltZSwgY2xvc2luZyB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wsIHNvIHRoZSBuZXh0XG4gKiB7QGxpbmsgZ2V0RW1haWxSdW50aW1lfSByZWJ1aWxkcyBpdCBmcm9tIGZyZXNoIGNvbmZpZyBhbmQgc3RvcHMgY2FsbGluZ1xuICogdGhyb3VnaCBhIHRvcm4tZG93biBwbHVnaW4ncyBgZXhlY3V0ZSgpYC4gSWRlbXBvdGVudCwgYW5kIHRoZSBwbHVnaW4nc1xuICogYHNodXRkb3duKClgIGhvb2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEVtYWlsUnVudGltZSgpOiB2b2lkIHtcbiAgcnVudGltZT8udHJhbnNwb3J0ZXI/LmNsb3NlKCk7XG4gIHJ1bnRpbWUgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUnVuIG9uZSBub24taWRlbXBvdGVudCB3cml0ZSB0aHJvdWdoIHRoZSBzaGFyZWQgZXhlY3V0b3IgYW5kIHVud3JhcCBpdC5cbiAqXG4gKiBgZXhlY3V0ZSgpYCBuZXZlciB0aHJvd3MsIHNvIGEgZmFpbGVkIHNlbmQgYXJyaXZlcyBhcyBgeyBvazogZmFsc2UgfWAgd2l0aCBhXG4gKiBzdGF0dXMgdGhlIGludGVyY2VwdG9ycyBhbHJlYWR5IHNhbml0aXplZDsgaXQgaXMgbG9nZ2VkIGhlcmUgYW5kIHJlLXJhaXNlZFxuICogYXMgYSBzdGFibGUge0BsaW5rIEV4ZWN1dGlvbkVycm9yfSBzbyBhbiB1cHN0cmVhbSBtZXNzYWdlIG5ldmVyIGJlY29tZXMgdGhlXG4gKiBjYWxsZXIncyBlcnJvciB0ZXh0LiBgc2lnbmFsYCBpcyB0aGUgY2FsbGVyJ3Mgb3duIGNhbmNlbGxhdGlvbiAoYW4gYWdlbnRcbiAqIHJ1biwgYSByZXF1ZXN0IHRlYXJkb3duKTsgaXQgaXMgbWVyZ2VkIHdpdGggdGhlIHNpZ25hbCB0aGUgdGltZW91dFxuICogaW50ZXJjZXB0b3Igc3VwcGxpZXMgc28gZWl0aGVyIG9uZSB1bndpbmRzIHRoZSBJL08uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlV3JpdGU8VD4oXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogRW1haWxFeGVjdXRpb25TZXR0aW5ncyxcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgeyBleGVjdXRlIH0gPSBnZXRFbWFpbFJ1bnRpbWUoKTtcbiAgcmV0dXJuIGV4ZWN1dGlvbi5ydW4oe1xuICAgIG9wZXJhdGlvbixcbiAgICBzZXR0aW5ncyxcbiAgICBleGVjdXRlLFxuICAgIGZuLFxuICAgIHNpZ25hbCxcbiAgICBjYW5jZWxlZDogRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQsXG4gICAgZmFpbGVkOiAoZmFpbHVyZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBmYWlsdXJlLm9wZXJhdGlvbixcbiAgICAgICAgc3RhdHVzOiBmYWlsdXJlLnN0YXR1cyxcbiAgICAgICAgZXJyb3I6IGZhaWx1cmUubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgZW1haWw6ICR7ZmFpbHVyZS5vcGVyYXRpb259IGZhaWxlZGAsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IGZhaWx1cmUub3BlcmF0aW9uLCBzdGF0dXM6IGZhaWx1cmUuc3RhdHVzIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVuIGFuZCB0ZWFyIGRvd24gb25lIFNNVFAgY29ubmVjdGlvbiB0byBwcm92ZSB0aGUgaG9zdCwgcG9ydCwgYW5kXG4gKiBjcmVkZW50aWFscyB3b3JrLiBDYWxsZWQgYXQgcGx1Z2luIHNldHVwIHNvIGEgYmFkIHJlbGF5IHNob3dzIHVwIGluIHRoZVxuICogYm9vdCBsb2dzIHJhdGhlciB0aGFuIG9uIHRoZSBmaXJzdCBhcHByb3ZlZCBzZW5kLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RW1haWxUcmFuc3BvcnQoXG4gIHRyYW5zcG9ydGVyOiBUcmFuc3BvcnRlciB8IHVuZGVmaW5lZCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0cmFuc3BvcnRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiU01UUFwiLFxuICAgICAgXCJUaGUgcnVudGltZSByZXNvbHZlZCB0byBvdXRib3ggbW9kZSwgc28gdGhlcmUgaXMgbm8gdHJhbnNwb3J0IHRvIHZlcmlmeS5cIixcbiAgICApO1xuICB9XG4gIGF3YWl0IGFib3J0YWJsZSh0cmFuc3BvcnRlci52ZXJpZnkoKSwgc2lnbmFsKTtcbn1cblxuLyoqXG4gKiBTdG9wIGF3YWl0aW5nIGBwcm9taXNlYCBhcyBzb29uIGFzIGBzaWduYWxgIGFib3J0cy4gbm9kZW1haWxlciBleHBvc2VzIG5vXG4gKiBjYW5jZWxsYXRpb24gaG9vaywgc28gdGhlIFNNVFAgY29udmVyc2F0aW9uIGl0c2VsZiBmaW5pc2hlcyBvbiBpdHMgb3duXG4gKiBjb25uZWN0aW9uOyB3aGF0IHVud2luZHMgaXMgdGhlIGNhbGxlciBhbmQgZXZlcnl0aGluZyBkb3duc3RyZWFtIG9mIGl0LlxuICovXG5mdW5jdGlvbiBhYm9ydGFibGU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8VD4ge1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIHByb21pc2U7XG4gIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAvLyBUaGUgbGlzdGVuZXIgaXMgZGV0YWNoZWQgb25jZSB0aGUgcmFjZSBzZXR0bGVzIHNvIGEgbG9uZy1saXZlZCBydW4gc2lnbmFsXG4gIC8vIGRvZXMgbm90IGFjY3VtdWxhdGUgb25lIHBlciBzZW5kLlxuICBjb25zdCBsaXN0ZW5lciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgYWJvcnRlZCA9IG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PiB7XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiByZWplY3Qoc2lnbmFsLnJlYXNvbiksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IGxpc3RlbmVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3Byb21pc2UsIGFib3J0ZWRdKS5maW5hbGx5KCgpID0+IGxpc3RlbmVyLmFib3J0KCkpO1xufVxuXG4vKiogVGhlIGNvbW1hLWpvaW5lZCByZWNpcGllbnQgc3RyaW5nIGVjaG9lZCBiYWNrIGluIHtAbGluayBFbWFpbFJlc3VsdH0uICovXG5mdW5jdGlvbiByZWNpcGllbnRFY2hvKHRvOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0by5qb2luKFwiLCBcIik7XG59XG5cbi8qKlxuICogTm9kZSBidWZmZXIgZW5jb2RpbmdzIGEgd2lyZSBhdHRhY2htZW50IG1heSBuYW1lIGZvciBpdHMgaW5saW5lIGBjb250ZW50YC5cbiAqIEFueXRoaW5nIGVsc2UgaXMgbWVhc3VyZWQgYXMgVVRGLTgsIHdoaWNoIG92ZXItY291bnRzIHJhdGhlciB0aGFuIGxldHRpbmdcbiAqIGFuIHVucmVjb2duaXplZCBlbmNvZGluZyBzbGlwIHBhc3QgdGhlIHNpemUgY2FwLlxuICovXG5jb25zdCBDT05URU5UX0VOQ09ESU5HUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcImFzY2lpXCIsXG4gIFwiYmFzZTY0XCIsXG4gIFwiYmFzZTY0dXJsXCIsXG4gIFwiYmluYXJ5XCIsXG4gIFwiaGV4XCIsXG4gIFwibGF0aW4xXCIsXG4gIFwidWNzMlwiLFxuICBcInVjcy0yXCIsXG4gIFwidXRmOFwiLFxuICBcInV0Zi04XCIsXG4gIFwidXRmMTZsZVwiLFxuICBcInV0Zi0xNmxlXCIsXG5dKTtcblxuLyoqXG4gKiBEZWNvZGVkIGJ5dGUgc2l6ZSBvZiBvbmUgYXR0YWNobWVudCdzIGlubGluZSBjb250ZW50LiBBIGBwYXRoYCBhdHRhY2htZW50XG4gKiBjb250cmlidXRlcyBub3RoaW5nOiBub2RlbWFpbGVyIHN0cmVhbXMgaXQsIHNvIGl0cyBieXRlcyBuZXZlciBzaXQgaW4gdGhpc1xuICogcHJvY2VzcyBhbmQgY2Fubm90IGJlIG1lYXN1cmVkIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaG1lbnRCeXRlcyhhdHRhY2htZW50OiBFbWFpbEF0dGFjaG1lbnQpOiBudW1iZXIge1xuICBjb25zdCB7IGNvbnRlbnQsIGVuY29kaW5nIH0gPSBhdHRhY2htZW50O1xuICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgY29uc3QgZGVjbGFyZWQgPSBlbmNvZGluZz8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPVxuICAgIGRlY2xhcmVkICYmIENPTlRFTlRfRU5DT0RJTkdTLmhhcyhkZWNsYXJlZCkgPyAoZGVjbGFyZWQgYXMgQnVmZmVyRW5jb2RpbmcpIDogXCJ1dGY4XCI7XG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChjb250ZW50LCByZXNvbHZlZCk7XG59XG5cbi8qKlxuICogUmVqZWN0IGEgbWVzc2FnZSB3aG9zZSBib2R5IG9yIGF0dGFjaG1lbnRzIGV4Y2VlZCB0aGUgcGx1Z2luJ3MgY2Fwcy4gVGhlXG4gKiBib2R5IGFuZCBhdHRhY2htZW50IGxpc3QgYXJyaXZlIGZyb20gYSBtb2RlbCwgc28gdGhleSBhcmUgdW5ib3VuZGVkIHVudGlsXG4gKiBzb21ldGhpbmcgYm91bmRzIHRoZW07IG1vc3QgU01UUCByZWxheXMgYWxzbyByZWplY3QgYW4gb3ZlcnNpemVkIG1lc3NhZ2VcbiAqIG9ubHkgYWZ0ZXIgdGhlIHdob2xlIHBheWxvYWQgaGFzIGJlZW4gdXBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE1lc3NhZ2VXaXRoaW5DYXBzKG1lc3NhZ2U6IEVtYWlsTWVzc2FnZSk6IHZvaWQge1xuICBpZiAobWVzc2FnZS5ib2R5Lmxlbmd0aCA+IE1BWF9CT0RZX0NIQVJTKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgIFwiYm9keVwiLFxuICAgICAgbWVzc2FnZS5ib2R5Lmxlbmd0aCxcbiAgICAgIGBhdCBtb3N0ICR7TUFYX0JPRFlfQ0hBUlN9IGNoYXJhY3RlcnNgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzID8/IFtdO1xuICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID4gTUFYX0FUVEFDSE1FTlRfQ09VTlQpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJhdHRhY2htZW50c1wiLFxuICAgICAgYXR0YWNobWVudHMubGVuZ3RoLFxuICAgICAgYGF0IG1vc3QgJHtNQVhfQVRUQUNITUVOVF9DT1VOVH0gZmlsZXNgLFxuICAgICk7XG4gIH1cbiAgbGV0IHRvdGFsID0gMDtcbiAgZm9yIChjb25zdCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBhdHRhY2htZW50Qnl0ZXMoYXR0YWNobWVudCk7XG4gICAgaWYgKGJ5dGVzID4gTUFYX0FUVEFDSE1FTlRfQllURVMpIHtcbiAgICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXG4gICAgICAgIFwiYXR0YWNobWVudHNbXS5jb250ZW50XCIsXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICBgYXQgbW9zdCAke01BWF9BVFRBQ0hNRU5UX0JZVEVTfSBieXRlcyBwZXIgZmlsZWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0b3RhbCArPSBieXRlcztcbiAgfVxuICBpZiAodG90YWwgPiBNQVhfQVRUQUNITUVOVFNfVE9UQUxfQllURVMpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJhdHRhY2htZW50c1wiLFxuICAgICAgdG90YWwsXG4gICAgICBgYXQgbW9zdCAke01BWF9BVFRBQ0hNRU5UU19UT1RBTF9CWVRFU30gYnl0ZXMgYWNyb3NzIGFsbCBmaWxlc2AsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE1hcCB0aGUgd2lyZS1mb3JtYXQge0BsaW5rIEVtYWlsQXR0YWNobWVudH1zIG9udG8gbm9kZW1haWxlcidzXG4gKiBhdHRhY2htZW50IHNoYXBlLCBkcm9wcGluZyB1bnNldCBvcHRpb25hbCBrZXlzIHNvIG5vZGVtYWlsZXIgYXBwbGllc1xuICogaXRzIG93biBkZWZhdWx0cyAodXRmLTggZW5jb2RpbmcsIGZpbGVuYW1lLWluZmVycmVkIGNvbnRlbnQgdHlwZSkuIFRoZVxuICogd2lyZSBmaWVsZHMgYXJlIGEgZGVsaWJlcmF0ZSBzdWJzZXQgb2Ygbm9kZW1haWxlcidzLCBzbyB0aGlzIGlzIGFcbiAqIHN0cmFpZ2h0IHN0cnVjdHVyYWwgcGFzcy10aHJvdWdoLlxuICovXG5mdW5jdGlvbiB0b01haWxBdHRhY2htZW50cyhcbiAgYXR0YWNobWVudHM6IEVtYWlsQXR0YWNobWVudFtdIHwgdW5kZWZpbmVkLFxuKTogU2VuZE1haWxPcHRpb25zW1wiYXR0YWNobWVudHNcIl0ge1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGF0dGFjaG1lbnRzLm1hcCgoYXR0KSA9PiAoe1xuICAgIGZpbGVuYW1lOiBhdHQuZmlsZW5hbWUsXG4gICAgLi4uKGF0dC5jb250ZW50ICE9PSB1bmRlZmluZWQgPyB7IGNvbnRlbnQ6IGF0dC5jb250ZW50IH0gOiB7fSksXG4gICAgLi4uKGF0dC5lbmNvZGluZyAhPT0gdW5kZWZpbmVkID8geyBlbmNvZGluZzogYXR0LmVuY29kaW5nIH0gOiB7fSksXG4gICAgLi4uKGF0dC5wYXRoICE9PSB1bmRlZmluZWQgPyB7IHBhdGg6IGF0dC5wYXRoIH0gOiB7fSksXG4gICAgLi4uKGF0dC5jb250ZW50VHlwZSAhPT0gdW5kZWZpbmVkID8geyBjb250ZW50VHlwZTogYXR0LmNvbnRlbnRUeXBlIH0gOiB7fSksXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBIYW5kIG9uZSBhbHJlYWR5LXZhbGlkYXRlZCBtZXNzYWdlIHRvIFNNVFAsIG9yIHdyaXRlIGl0IHRvIHRoZSBvdXRib3ggd2hlblxuICogbm8gY3JlZGVudGlhbHMgYXJlIGNvbmZpZ3VyZWQuIFRoZSBoYWxmIG9mIGEgc2VuZCB0aGF0IHBlcmZvcm1zIEkvTywgc28gaXRcbiAqIGlzIHdoYXQgcnVucyBpbnNpZGUgdGhlIGludGVyY2VwdG9yIGNoYWluLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNwYXRjaChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICBjb25zdCB7IGNvbmZpZywgdHJhbnNwb3J0ZXIgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRFY2hvKG1lc3NhZ2UudG8pO1xuICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgIGNvbnN0IHBhdGggPSBhd2FpdCB3cml0ZU91dGJveEVtYWlsKG1lc3NhZ2UsIGZyb20sIGNvbmZpZy5vdXREaXIsIGNvbmZpZy5icmFuZCk7XG4gICAgcmV0dXJuIHsgc2VudDogdHJ1ZSwgcmVjaXBpZW50LCBmcm9tLCBtZXNzYWdlSWQ6IHBhdGggfTtcbiAgfVxuXG4gIGlmICghdHJhbnNwb3J0ZXIpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIlNNVFBcIixcbiAgICAgIFwiTm8gdHJhbnNwb3J0IHdhcyBidWlsdCBmb3IgdGhlIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRhY2htZW50cyA9IHRvTWFpbEF0dGFjaG1lbnRzKG1lc3NhZ2UuYXR0YWNobWVudHMpO1xuICBjb25zdCByZW5kZXJlZCA9IGF3YWl0IHJlbmRlckVtYWlsKHtcbiAgICBzdWJqZWN0OiBtZXNzYWdlLnN1YmplY3QsXG4gICAgYm9keTogbWVzc2FnZS5ib2R5LFxuICAgIGJyYW5kOiBjb25maWcuYnJhbmQsXG4gIH0pO1xuICBjb25zdCBpbmZvID0gYXdhaXQgYWJvcnRhYmxlKFxuICAgIHRyYW5zcG9ydGVyLnNlbmRNYWlsKHtcbiAgICAgIGZyb20sXG4gICAgICB0bzogbWVzc2FnZS50byxcbiAgICAgIHN1YmplY3Q6IG1lc3NhZ2Uuc3ViamVjdCxcbiAgICAgIHRleHQ6IHJlbmRlcmVkLnRleHQsXG4gICAgICBodG1sOiByZW5kZXJlZC5odG1sLFxuICAgICAgLi4uKG1lc3NhZ2UuY2MgJiYgbWVzc2FnZS5jYy5sZW5ndGggPiAwID8geyBjYzogbWVzc2FnZS5jYyB9IDoge30pLFxuICAgICAgLi4uKG1lc3NhZ2UuYmNjICYmIG1lc3NhZ2UuYmNjLmxlbmd0aCA+IDAgPyB7IGJjYzogbWVzc2FnZS5iY2MgfSA6IHt9KSxcbiAgICAgIC4uLihhdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICB9KSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiB7XG4gICAgc2VudDogdHJ1ZSxcbiAgICByZWNpcGllbnQsXG4gICAgZnJvbSxcbiAgICAuLi4oaW5mby5tZXNzYWdlSWQgPyB7IG1lc3NhZ2VJZDogaW5mby5tZXNzYWdlSWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTZW5kIChTTVRQIG1vZGUpIG9yIHBlcnNpc3QgKGZpbGUvb3V0Ym94IG1vZGUpIG9uZSBtZXNzYWdlIGZyb20gdGhlXG4gKiByZXNvbHZlZCBgZnJvbWAgYWRkcmVzcy4gYHRvYCAoYW5kIG9wdGlvbmFsIGBjY2AgLyBgYmNjYCkgZWFjaCBhY2NlcHRcbiAqIG9uZSBvciBtb3JlIGFkZHJlc3NlcywgYW5kIGBhdHRhY2htZW50c2AgYXJlIGZvcndhcmRlZCBhcyBmaWxlcy4gVGhlXG4gKiBib2R5IGlzIHJlbmRlcmVkIGJ5IFJlYWN0IEVtYWlsIGludG8gbWF0Y2hpbmcgcGxhaW4tdGV4dCBhbmQgSFRNTCBNSU1FXG4gKiBhbHRlcm5hdGl2ZXMsIGFuZCB0aGUgb3V0Ym94IGVtYmVkcyB0aGVcbiAqIHJlbmRlcmVkIEhUTUwgaW4gYSBkb2N1bWVudC4gSW4gZmlsZSBtb2RlIHRoZSByZXR1cm5lZCBgbWVzc2FnZUlkYCBpc1xuICogdGhlIHBhdGggd3JpdHRlbi4gVGhyb3dzIHdoZW4gYHRvYCBjYXJyaWVzIG5vIHJlY2lwaWVudCwgd2hlbiB0aGUgYm9keVxuICogb3IgYXR0YWNobWVudHMgZXhjZWVkIHRoZSBwbHVnaW4ncyBjYXBzLCBvciB3aGVuIGBmcm9tYCBpcyBub3QgcGVybWl0dGVkXG4gKiBieSB0aGUgZWZmZWN0aXZlIHNlbmRlciBhbGxvdy1saXN0LlxuICpcbiAqIFRoZSByZWNpcGllbnQsIGNhcCwgYW5kIHNlbmRlciBjaGVja3MgcnVuIGJlZm9yZSB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gc29cbiAqIHRoZWlyIHNwZWNpZmljIHN0YXR1cyBhbmQgYWN0aW9uYWJsZSBtZXNzYWdlIHJlYWNoIHRoZSBjYWxsZXIgaW5zdGVhZCBvZlxuICogdGhlIGNoYWluJ3Mgc3RhYmxlIGZhaWx1cmUgdGV4dC4gYHNpZ25hbGAgY2FuY2VscyB0aGUgc2VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbChcbiAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICBmcm9tOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICBpZiAobWVzc2FnZS50by5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IubWlzc2luZ0ZpZWxkKFwidG9cIik7XG4gIH1cbiAgYXNzZXJ0TWVzc2FnZVdpdGhpbkNhcHMobWVzc2FnZSk7XG4gIGFzc2VydFNlbmRlckFsbG93ZWQoZnJvbSwgZ2V0RW1haWxSdW50aW1lKCkuY29uZmlnLmFsbG93ZWRTZW5kZXJzKTtcbiAgcmV0dXJuIGV4ZWN1dGVXcml0ZShcbiAgICBcInNlbmRcIixcbiAgICBFTUFJTF9TRU5EX1NFVFRJTkdTLFxuICAgIChleGVjdXRlU2lnbmFsKSA9PiBkaXNwYXRjaChtZXNzYWdlLCBmcm9tLCBleGVjdXRlU2lnbmFsKSxcbiAgICBzaWduYWwsXG4gICk7XG59XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/brand.ts","../src/config.ts","../src/defaults.ts","../src/email-html.ts","../src/
|
|
1
|
+
{"root":["../src/brand.ts","../src/config.ts","../src/defaults.ts","../src/email-html.ts","../src/markdown.ts","../src/outbox.ts","../src/plugin.ts","../src/sender.ts","../src/tool.ts","../src/transport.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -27,14 +27,16 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "^0.43.0",
|
|
30
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
-
"@dbx-tools/shared-email": "0.6.
|
|
30
|
+
"@dbx-tools/shared-core": "0.6.48",
|
|
31
|
+
"@dbx-tools/shared-email": "0.6.48",
|
|
32
|
+
"@dbx-tools/shared-email-template": "0.6.48",
|
|
32
33
|
"@mastra/core": "^1.47.0",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
34
|
+
"@react-email/render": "^2.1.0",
|
|
35
|
+
"nodemailer": "^7.0.13",
|
|
36
|
+
"react": "^19.2.4",
|
|
37
|
+
"react-dom": "^19.2.4"
|
|
36
38
|
},
|
|
37
|
-
"main": "index.
|
|
39
|
+
"main": "./lib/index.js",
|
|
38
40
|
"license": "UNLICENSED",
|
|
39
41
|
"publishConfig": {
|
|
40
42
|
"access": "public",
|
|
@@ -48,11 +50,14 @@
|
|
|
48
50
|
"./package.json": "./package.json"
|
|
49
51
|
}
|
|
50
52
|
},
|
|
51
|
-
"version": "0.6.
|
|
52
|
-
"types": "index.ts",
|
|
53
|
+
"version": "0.6.48",
|
|
54
|
+
"types": "./lib/index.d.ts",
|
|
53
55
|
"type": "module",
|
|
54
56
|
"exports": {
|
|
55
|
-
".":
|
|
57
|
+
".": {
|
|
58
|
+
"types": "./lib/index.d.ts",
|
|
59
|
+
"default": "./lib/index.js"
|
|
60
|
+
},
|
|
56
61
|
"./package.json": "./package.json"
|
|
57
62
|
},
|
|
58
63
|
"files": [
|
package/src/brand.ts
CHANGED
|
@@ -1,64 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* small, email-safe slice of a brand a message actually needs - an accent
|
|
4
|
-
* color, a font stack, a display name, and an optional logo image - and
|
|
5
|
-
* {@link emailBrandFromContext} derives it from the portable `BrandContext`
|
|
6
|
-
* shared across the UI and libraries.
|
|
2
|
+
* Email brand compatibility exports.
|
|
7
3
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* by inlining these values at render time. A logo is only emitted when it's
|
|
11
|
-
* a fetchable `http(s):` or `data:` URL - a package-export path (the default
|
|
12
|
-
* asset form) can't resolve in an inbox, so it's dropped rather than shown
|
|
13
|
-
* as a broken image.
|
|
4
|
+
* The universal brand contract and defaults live with the shared React Email
|
|
5
|
+
* template so Node delivery and browser previews cannot drift.
|
|
14
6
|
*
|
|
15
7
|
* @module
|
|
16
8
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
/** Text and logo color rendered on the accent band. Defaults to white. */
|
|
24
|
-
onAccent?: string;
|
|
25
|
-
/** Body font stack. */
|
|
26
|
-
fontFamily: string;
|
|
27
|
-
/** Product/display name, used as the header text and the logo `alt`. */
|
|
28
|
-
name?: string;
|
|
29
|
-
/**
|
|
30
|
-
* Logo image rendered in the header band. Only an `http(s):` or `data:`
|
|
31
|
-
* URL renders; other values (e.g. a package-export path) are ignored,
|
|
32
|
-
* since they can't load in a mail client.
|
|
33
|
-
*/
|
|
34
|
-
logoUrl?: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Whether `value` is an image reference a mail client can actually load. */
|
|
38
|
-
function isRenderableImageUrl(value: string | undefined): value is string {
|
|
39
|
-
return typeof value === "string" && /^(?:https?:|data:)/i.test(value);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Derive the email-safe {@link EmailBrand} from a full brand context: the
|
|
44
|
-
* primary color as the accent, the sans font stack, the display name, and
|
|
45
|
-
* the dark-surface logo (the header band is dark) when it's a renderable URL.
|
|
46
|
-
*/
|
|
47
|
-
export function emailBrandFromContext(context: BrandContext): EmailBrand {
|
|
48
|
-
const logo = context.assets.logo.dark ?? context.assets.logo.light;
|
|
49
|
-
return {
|
|
50
|
-
accent: context.colors.primary,
|
|
51
|
-
onAccent: "#ffffff",
|
|
52
|
-
fontFamily: context.typography.sans,
|
|
53
|
-
name: context.name,
|
|
54
|
-
...(isRenderableImageUrl(logo) ? { logoUrl: logo } : {}),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* The dbx-tools brand as an {@link EmailBrand}, ready to pass to the email
|
|
60
|
-
* plugin (`email({ brand: defaultEmailBrand })`). Convenience so a consumer
|
|
61
|
-
* needs only `@dbx-tools/email`, not the shared brand context, for the
|
|
62
|
-
* common case of the default brand.
|
|
63
|
-
*/
|
|
64
|
-
export const defaultEmailBrand: EmailBrand = emailBrandFromContext(brand.defaultBrandContext);
|
|
9
|
+
export {
|
|
10
|
+
defaultEmailBrand,
|
|
11
|
+
emailBrandFromContext,
|
|
12
|
+
resolveEmailBrand,
|
|
13
|
+
} from "@dbx-tools/shared-email-template";
|
|
14
|
+
export type { EmailBrand, ResolvedEmailBrand } from "@dbx-tools/shared-email-template";
|
package/src/config.ts
CHANGED
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { resolve } from "node:path";
|
|
27
27
|
import { ConfigurationError, ValidationError, type BasePluginConfig } from "@databricks/appkit";
|
|
28
|
-
import { object } from "@dbx-tools/shared-core";
|
|
28
|
+
import { env, object } from "@dbx-tools/shared-core";
|
|
29
29
|
import type { JSONSchema7 } from "json-schema";
|
|
30
|
-
import type
|
|
30
|
+
import { defaultEmailBrand, type EmailBrand } from "./brand.ts";
|
|
31
31
|
import { parseAllowedSenders } from "./sender.ts";
|
|
32
32
|
|
|
33
33
|
/** SMTP submission port used when none is configured. */
|
|
@@ -108,10 +108,9 @@ export interface EmailPluginConfig extends BasePluginConfig {
|
|
|
108
108
|
*/
|
|
109
109
|
senderPolicy?: SenderPolicy;
|
|
110
110
|
/**
|
|
111
|
-
* Optional brand styling
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* `BrandContext`.
|
|
111
|
+
* Optional brand styling applied to every rendered message. Omit to use the
|
|
112
|
+
* repository's dbx-tools brand. Pass {@link emailBrandFromContext} to derive
|
|
113
|
+
* a custom value from a shared `BrandContext`.
|
|
115
114
|
*/
|
|
116
115
|
brand?: EmailBrand;
|
|
117
116
|
}
|
|
@@ -131,8 +130,8 @@ interface ResolvedSender {
|
|
|
131
130
|
allowedSenders: string[];
|
|
132
131
|
/** The restriction mode the allow-list was resolved under. */
|
|
133
132
|
senderPolicy: SenderPolicy;
|
|
134
|
-
/** Brand styling applied to rendered HTML
|
|
135
|
-
brand
|
|
133
|
+
/** Brand styling applied to rendered HTML. */
|
|
134
|
+
brand: EmailBrand;
|
|
136
135
|
}
|
|
137
136
|
|
|
138
137
|
/** Resolved config for real SMTP delivery. */
|
|
@@ -207,7 +206,7 @@ export const EMAIL_CONFIG_SCHEMA: JSONSchema7 = {
|
|
|
207
206
|
brand: {
|
|
208
207
|
type: "object",
|
|
209
208
|
description:
|
|
210
|
-
"Brand styling
|
|
209
|
+
"Brand styling applied to every React Email message. Omit to use the dbx-tools brand.",
|
|
211
210
|
properties: {
|
|
212
211
|
accent: {
|
|
213
212
|
type: "string",
|
|
@@ -230,6 +229,13 @@ export const EMAIL_CONFIG_SCHEMA: JSONSchema7 = {
|
|
|
230
229
|
description:
|
|
231
230
|
"Logo image for the header band. Only an http(s): or data: URL renders; other values are dropped because a mail client cannot load them.",
|
|
232
231
|
},
|
|
232
|
+
background: { type: "string", description: "Inbox canvas color." },
|
|
233
|
+
surface: { type: "string", description: "Message-card color." },
|
|
234
|
+
foreground: { type: "string", description: "Primary text color." },
|
|
235
|
+
muted: { type: "string", description: "Secondary text color." },
|
|
236
|
+
border: { type: "string", description: "Border and divider color." },
|
|
237
|
+
tagline: { type: "string", description: "Footer product line." },
|
|
238
|
+
website: { type: "string", description: "Optional footer website URL." },
|
|
233
239
|
},
|
|
234
240
|
required: ["accent", "fontFamily"],
|
|
235
241
|
},
|
|
@@ -238,13 +244,12 @@ export const EMAIL_CONFIG_SCHEMA: JSONSchema7 = {
|
|
|
238
244
|
|
|
239
245
|
/** Parse the `SMTP_SECURE` env / config flag, defaulting by port. */
|
|
240
246
|
function resolveSecure(flag: boolean | undefined, port: number): boolean {
|
|
241
|
-
|
|
242
|
-
return object.toBoolean(process.env.SMTP_SECURE) ?? port === IMPLICIT_TLS_SMTP_PORT;
|
|
247
|
+
return env.boolean(flag, "SMTP_SECURE") ?? port === IMPLICIT_TLS_SMTP_PORT;
|
|
243
248
|
}
|
|
244
249
|
|
|
245
250
|
/** Parse the `EMAIL_SENDER_POLICY` env / config value, defaulting to deny-by-default. */
|
|
246
251
|
function resolveSenderPolicy(policy: SenderPolicy | undefined): SenderPolicy {
|
|
247
|
-
const raw = policy ??
|
|
252
|
+
const raw = policy ?? env.text("EMAIL_SENDER_POLICY")?.toLowerCase();
|
|
248
253
|
if (raw === "unrestricted") return "unrestricted";
|
|
249
254
|
if (raw === undefined || raw === "" || raw === "allowlist") return "allowlist";
|
|
250
255
|
throw ValidationError.invalidValue("senderPolicy", raw, '"allowlist" or "unrestricted"');
|
|
@@ -266,7 +271,7 @@ function impliedSenderPatterns(domain: string | undefined, from: string | undefi
|
|
|
266
271
|
|
|
267
272
|
/** Whether `EMAIL_OUTBOX_MODE` explicitly opts into the file/outbox fallback. */
|
|
268
273
|
function isOutboxModeEnabled(): boolean {
|
|
269
|
-
return
|
|
274
|
+
return env.boolean(undefined, "EMAIL_OUTBOX_MODE") ?? false;
|
|
270
275
|
}
|
|
271
276
|
|
|
272
277
|
const SMTP_REQUIRED_FIELDS = ["SMTP_HOST", "SMTP_USER", "SMTP_PASSWORD"] as const;
|
|
@@ -301,25 +306,25 @@ function missingSmtpFields(
|
|
|
301
306
|
*/
|
|
302
307
|
export function resolveEmailConfig(config: EmailPluginConfig = {}): ResolvedEmailConfig {
|
|
303
308
|
const smtp = config.smtp ?? {};
|
|
304
|
-
const host = smtp.host ??
|
|
305
|
-
const user = smtp.user ??
|
|
306
|
-
const pass = smtp.password ??
|
|
307
|
-
const domain = config.domain ??
|
|
308
|
-
const from = config.from ??
|
|
309
|
+
const host = env.string(smtp.host, "SMTP_HOST") ?? undefined;
|
|
310
|
+
const user = env.string(smtp.user, "SMTP_USER") ?? undefined;
|
|
311
|
+
const pass = env.string(smtp.password, "SMTP_PASSWORD") ?? undefined;
|
|
312
|
+
const domain = env.string(config.domain, "EMAIL_DOMAIN") ?? undefined;
|
|
313
|
+
const from = env.string(config.from, "EMAIL_FROM") ?? undefined;
|
|
309
314
|
const senderPolicy = resolveSenderPolicy(config.senderPolicy);
|
|
310
315
|
const configuredSenders = parseAllowedSenders(
|
|
311
|
-
config.allowedSenders ??
|
|
316
|
+
config.allowedSenders ?? env.text("EMAIL_ALLOWED_SENDERS") ?? undefined,
|
|
312
317
|
);
|
|
313
318
|
const allowedSenders =
|
|
314
319
|
configuredSenders.length > 0 || senderPolicy === "unrestricted"
|
|
315
320
|
? configuredSenders
|
|
316
321
|
: impliedSenderPatterns(domain, from);
|
|
317
322
|
const sender: ResolvedSender = {
|
|
318
|
-
...(domain
|
|
319
|
-
...(from
|
|
323
|
+
...object.optional("domain", domain),
|
|
324
|
+
...object.optional("from", from),
|
|
320
325
|
allowedSenders,
|
|
321
326
|
senderPolicy,
|
|
322
|
-
|
|
327
|
+
brand: config.brand ?? defaultEmailBrand,
|
|
323
328
|
};
|
|
324
329
|
|
|
325
330
|
const hasAllSmtp = Boolean(host && user && pass);
|
|
@@ -336,8 +341,7 @@ export function resolveEmailConfig(config: EmailPluginConfig = {}): ResolvedEmai
|
|
|
336
341
|
"Set EMAIL_DOMAIN to derive <user-local-part>@<domain>, or EMAIL_FROM for a fixed address.",
|
|
337
342
|
);
|
|
338
343
|
}
|
|
339
|
-
const
|
|
340
|
-
const port = Number.isFinite(portRaw) && portRaw ? Number(portRaw) : DEFAULT_SMTP_PORT;
|
|
344
|
+
const port = env.positiveInt(smtp.port, "SMTP_PORT", DEFAULT_SMTP_PORT);
|
|
341
345
|
return {
|
|
342
346
|
mode: "smtp",
|
|
343
347
|
host: host!,
|
|
@@ -356,7 +360,7 @@ export function resolveEmailConfig(config: EmailPluginConfig = {}): ResolvedEmai
|
|
|
356
360
|
}
|
|
357
361
|
|
|
358
362
|
const outDir = resolve(
|
|
359
|
-
config.outDir
|
|
363
|
+
env.string(config.outDir, "EMAIL_OUTBOX_DIR") ?? resolve(process.cwd(), "tmp"),
|
|
360
364
|
);
|
|
361
365
|
return { mode: "file", outDir, ...sender };
|
|
362
366
|
}
|
package/src/defaults.ts
CHANGED
|
@@ -50,7 +50,7 @@ export const MAX_ATTACHMENTS_TOTAL_BYTES = 20_971_520;
|
|
|
50
50
|
/** Largest number of attachments accepted on one message. */
|
|
51
51
|
export const MAX_ATTACHMENT_COUNT = 20;
|
|
52
52
|
|
|
53
|
-
/** Largest
|
|
53
|
+
/** Largest email body accepted, in characters. */
|
|
54
54
|
export const MAX_BODY_CHARS = 200_000;
|
|
55
55
|
|
|
56
56
|
/** Execution settings for a send (SMTP dispatch or an outbox write). */
|