@dbx-tools/email 0.6.53 → 0.6.55
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 +74 -43
- package/index.ts +2 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -1
- package/lib/src/config.d.ts +25 -6
- package/lib/src/config.js +29 -13
- package/lib/src/outbox.d.ts +1 -3
- package/lib/src/outbox.js +2 -5
- package/lib/src/plugin.d.ts +0 -9
- package/lib/src/plugin.js +1 -10
- package/lib/src/sender.d.ts +48 -9
- package/lib/src/sender.js +63 -15
- package/lib/src/transport.d.ts +18 -8
- package/lib/src/transport.js +8 -5
- package/package.json +4 -4
- package/src/config.ts +53 -13
- package/src/outbox.ts +0 -4
- package/src/plugin.ts +0 -9
- package/src/sender.ts +68 -18
- package/src/transport.ts +25 -12
package/lib/src/plugin.d.ts
CHANGED
|
@@ -121,11 +121,6 @@ export declare class EmailPlugin extends Plugin<EmailPluginConfig> implements To
|
|
|
121
121
|
* Send a message immediately from `from` through the shared
|
|
122
122
|
* transport, bypassing the approval flow. For agent-driven sends
|
|
123
123
|
* use {@link emailTool} instead.
|
|
124
|
-
*
|
|
125
|
-
* `options` carries delivery-time concerns that are deliberately NOT part of
|
|
126
|
-
* the message schema an agent fills in - see {@link SendEmailOptions}. The
|
|
127
|
-
* agent tool path never supplies them, which is the point: a trailer is
|
|
128
|
-
* derived from the deployment's own domain, not from model output.
|
|
129
124
|
*/
|
|
130
125
|
sendEmail: (message: EmailMessage, from: string, signal?: AbortSignal, options?: SendEmailOptions) => Promise<EmailResult>;
|
|
131
126
|
/**
|
|
@@ -147,10 +142,6 @@ export declare class EmailPlugin extends Plugin<EmailPluginConfig> implements To
|
|
|
147
142
|
* `from` is not pinned. The interceptor chain is applied inside
|
|
148
143
|
* {@link sendEmail} through the executor installed at setup, so this must
|
|
149
144
|
* not wrap it again.
|
|
150
|
-
*
|
|
151
|
-
* `options` is forwarded untouched so every caller of this plugin reaches the
|
|
152
|
-
* same shared template features the module-level {@link sendEmail} does; the
|
|
153
|
-
* agent tool path simply omits it.
|
|
154
145
|
*/
|
|
155
146
|
private send;
|
|
156
147
|
/** Run the sender-options lookup through the plugin's interceptor chain. */
|
package/lib/src/plugin.js
CHANGED
|
@@ -192,11 +192,6 @@ export class EmailPlugin extends Plugin {
|
|
|
192
192
|
* Send a message immediately from `from` through the shared
|
|
193
193
|
* transport, bypassing the approval flow. For agent-driven sends
|
|
194
194
|
* use {@link emailTool} instead.
|
|
195
|
-
*
|
|
196
|
-
* `options` carries delivery-time concerns that are deliberately NOT part of
|
|
197
|
-
* the message schema an agent fills in - see {@link SendEmailOptions}. The
|
|
198
|
-
* agent tool path never supplies them, which is the point: a trailer is
|
|
199
|
-
* derived from the deployment's own domain, not from model output.
|
|
200
195
|
*/
|
|
201
196
|
sendEmail: (message, from, signal, options) => this.send(message, from, signal, options),
|
|
202
197
|
/**
|
|
@@ -223,10 +218,6 @@ export class EmailPlugin extends Plugin {
|
|
|
223
218
|
* `from` is not pinned. The interceptor chain is applied inside
|
|
224
219
|
* {@link sendEmail} through the executor installed at setup, so this must
|
|
225
220
|
* not wrap it again.
|
|
226
|
-
*
|
|
227
|
-
* `options` is forwarded untouched so every caller of this plugin reaches the
|
|
228
|
-
* same shared template features the module-level {@link sendEmail} does; the
|
|
229
|
-
* agent tool path simply omits it.
|
|
230
221
|
*/
|
|
231
222
|
async send(message, from, signal, options) {
|
|
232
223
|
return sendEmail(message, from ?? this.resolveSender(), signal, options);
|
|
@@ -316,4 +307,4 @@ function unwrap(result) {
|
|
|
316
307
|
* ```
|
|
317
308
|
*/
|
|
318
309
|
export const email = toPlugin(EmailPlugin);
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FLaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsS0FBSyxJQUFJLFNBQVMsR0FJbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsNEVBQTRFO0FBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUV6QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRW5DOzs7Ozs7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QUFFLENBQUM7SUFDbEMsT0FBTyxlQUFlLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxNQUFjLEVBQUUsT0FBZTtJQUNwRCxJQUFJLE1BQU0sS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxJQUFJLE1BQU0sS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELElBQUksTUFBTSxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE9BQU8sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsTUFBTSxDQUFJLE1BQTBCO0lBQzNDLElBQUksTUFBTSxDQUFDLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDbEMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgZW1haWxgKSB0aGF0IG93bnMgdGhlIFNNVFAgcnVudGltZVxuICogZm9yIG91dGJvdW5kIG1haWwuIFJlZ2lzdGVyaW5nIGl0IHZhbGlkYXRlcyB0aGUgU01UUCBjb25maWd1cmF0aW9uXG4gKiBhbmQgdmVyaWZpZXMgY29ubmVjdGl2aXR5IGF0IHN0YXJ0dXAsIHNvIGEgYmFkIGhvc3QgLyBjcmVkZW50aWFsXG4gKiBzdXJmYWNlcyBpbiB0aGUgYm9vdCBsb2dzIGluc3RlYWQgb2Ygb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQsIGFuZFxuICogaW5zdGFsbHMgdGhpcyBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBhcyB0aGUgcnVudGltZSdzIGV4ZWN1dG9yIHNvIGV2ZXJ5XG4gKiBzZW5kIHBpY2tzIHVwIEFwcEtpdCdzIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi5cbiAqXG4gKiBUaGUgcGx1Z2luIGlzIGFsc28gYSBgVG9vbFByb3ZpZGVyYCwgc28gYW4gQXBwS2l0IGFnZW50IGNhbiByZWFjaCBhblxuICogYGVtYWlsLnNlbmRgIHRvb2wgZGlyZWN0bHk7IHRoZSB7QGxpbmsgZW1haWxUb29sfSBleHBvcnQgaXMgdGhlIHNhbWVcbiAqIGNhcGFiaWxpdHkgZm9yIGEgTWFzdHJhIGFnZW50LiBCb3RoIHNoYXJlIHRoZSB0cmFuc3BvcnQgcHJpbWVkIGhlcmUsXG4gKiBhbmQge0BsaW5rIHNlbmRFbWFpbH0gaXMgYXZhaWxhYmxlIHRvIG5vbi1hZ2VudCBjYWxsZXJzLlxuICpcbiAqIENvbmZpZ3VyYXRpb24gaXMgdGhlIG1hbmlmZXN0LXB1Ymxpc2hlZCB7QGxpbmsgRW1haWxQbHVnaW5Db25maWd9XG4gKiAoU01UUCBob3N0L3BvcnQvY3JlZGVudGlhbHMsIHNlbmRlciBkb21haW4gb3IgZXhwbGljaXQgYGZyb21gLCB0aGVcbiAqIHNlbmRlciBwb2xpY3ksIGFuZCBhbiBvcHRpb25hbCBgYWxsb3dlZFNlbmRlcnNgIHJlc3RyaWN0aW9uKSwgd2l0aFxuICogdW5wcmVmaXhlZCBgU01UUF8qYCAvIGBFTUFJTF8qYCBlbnZpcm9ubWVudCBmYWxsYmFja3MuXG4gKlxuICogVGhlIHBsdWdpbiBtb3VudHMgb25lIHJvdXRlIHVuZGVyIGl0cyBiYXNlIHBhdGggKGAvYXBpL2VtYWlsYCk6XG4gKiBgR0VUIC9zZW5kZXJzYCByZXR1cm5zIHRoZSBwZXJtaXR0ZWQgYEZyb21gIG9wdGlvbnMgZm9yIHRoZSBjYWxsaW5nXG4gKiB1c2VyLCBzbyBhIGNvbXBvc2UgVUkgY2FuIG9mZmVyIHRoZW0gaW4gYSBkcm9wZG93bi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQXBwS2l0RXJyb3IsXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZW1haWwgYXMgZW1haWxXaXJlLFxuICB0eXBlIEVtYWlsTWVzc2FnZSxcbiAgdHlwZSBFbWFpbFJlc3VsdCxcbiAgdHlwZSBFbWFpbFNlbmRlcnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHsgRU1BSUxfQ09ORklHX1NDSEVNQSwgdHlwZSBFbWFpbFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgRU1BSUxfU0VOREVSU19TRVRUSU5HUywgRU1BSUxfVkVSSUZZX1NFVFRJTkdTIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGlzU2VuZGVyQWxsb3dlZCwgbGlzdFNlbmRlck9wdGlvbnMsIHJlc29sdmVTZW5kZXJBZGRyZXNzIH0gZnJvbSBcIi4vc2VuZGVyLnRzXCI7XG5pbXBvcnQgeyBTRU5EX0VNQUlMX0RFU0NSSVBUSU9OIH0gZnJvbSBcIi4vdG9vbC50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW1haWxSdW50aW1lLFxuICByZXNldEVtYWlsUnVudGltZSxcbiAgc2VuZEVtYWlsLFxuICB0eXBlIFNlbmRFbWFpbE9wdGlvbnMsXG4gIHNldEVtYWlsRXhlY3V0b3IsXG4gIHZlcmlmeUVtYWlsVHJhbnNwb3J0LFxufSBmcm9tIFwiLi90cmFuc3BvcnQudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlICh1bmRlciBgL2FwaS9lbWFpbGApIGZvciB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwLiAqL1xuY29uc3QgU0VOREVSU19ST1VURSA9IFwiL3NlbmRlcnNcIjtcblxuLyoqIFJlZ2lzdHJ5IGtleSBvZiB0aGUgYWdlbnQgdG9vbCwgd2hpY2ggYWdlbnRzIGFkZHJlc3MgYXMgYGVtYWlsLnNlbmRgLiAqL1xuY29uc3QgU0VORF9UT09MID0gXCJzZW5kXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbFwiKTtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgY29uZmlndXJlcyBhbmQgdmVyaWZpZXMgdGhlIFNNVFAgdHJhbnNwb3J0IHVzZWQgYnlcbiAqIHRoZSBgc2VuZF9lbWFpbGAgdG9vbCwgYW5kIGV4cG9zZXMgc2VuZGluZyBhcyBhbiBBcHBLaXQgYWdlbnQgdG9vbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgcGx1Z2luIGFzIGVtYWlsUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgZW1haWxQbHVnaW4uZW1haWwoe1xuICogICAgICAgc210cDogeyBob3N0OiBcInNtdHAuZXhhbXBsZS5jb21cIiwgdXNlcjogXCJhcGlrZXlcIiwgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlNNVFBfS0VZIH0sXG4gKiAgICAgICBkb21haW46IFwibWFpbC5leGFtcGxlLmNvbVwiLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEVtYWlsUGx1Z2luQ29uZmlnPiBpbXBsZW1lbnRzIFRvb2xQcm92aWRlciB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRW1haWxcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VuZHMgYXBwcm92YWwtZ2F0ZWQgZW1haWwgb3ZlciBTTVRQLCB3aXRoIHRoZSBzZW5kZXIgZGVyaXZlZCBmcm9tIFwiICtcbiAgICAgIFwidGhlIG9uLWJlaGFsZi1vZiB1c2VyJ3MgYWRkcmVzcyBvbiBhIGNvbmZpZ3VyZWQgZG9tYWluLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBFTUFJTF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZW1haWxcIj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuXG4gICAqXG4gICAqIE5vdCBgYXV0b0luaGVyaXRhYmxlYDogYSBzZW5kIGlzIGlycmV2ZXJzaWJsZSBhbmQgbGVhdmVzIHRoZSB3b3Jrc3BhY2UsXG4gICAqIHNvIGl0IG11c3Qgb25seSBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZVxuICAgKiBzZW5kZXIgcG9saWN5IHRoYXQgY29tZXMgd2l0aCBpdC5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xzOiBUb29sUmVnaXN0cnkgPSB7XG4gICAgW1NFTkRfVE9PTF06IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFNFTkRfRU1BSUxfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IGVtYWlsV2lyZS5lbWFpbE1lc3NhZ2VTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+XG4gICAgICAgIHRoaXMuc2VuZChlbWFpbFdpcmUuZW1haWxNZXNzYWdlU2NoZW1hLnBhcnNlKGFyZ3MpLCB1bmRlZmluZWQsIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqXG4gICAqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIHRoaXMgcGx1Z2luJ3MgY29uZmlnIChvdmVyIGVudiksIHJvdXRlIHRoZVxuICAgKiB0b29scycgc2VuZHMgdGhyb3VnaCB0aGlzIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLCBhbmQgbG9nIHRoZVxuICAgKiBlZmZlY3RpdmUgc2VuZGVyIHBvbGljeSBzbyBhbiBhY3RpdmUgcmVzdHJpY3Rpb24gaXMgb2J2aW91cyBhdCBib290LiBJblxuICAgKiBTTVRQIG1vZGUsIGZhaWwgc2V0dXAgd2hlbiB0aGUgdHJhbnNwb3J0IGNhbm5vdCBiZSB2ZXJpZmllZDogYSBiYWQgaG9zdFxuICAgKiBvciBjcmVkZW50aWFsIGlzIGEgZGVwbG95LXRpbWUgbWlzdGFrZSBhbmQgc2hvdWxkIHN0b3AgdGhlIGFwcCByYXRoZXJcbiAgICogdGhhbiB3YWl0IGZvciBhIHVzZXIgdG8gYXBwcm92ZSBhIHNlbmQgdGhhdCBjYW5ub3Qgd29yay4gV2l0aCBubyBTTVRQXG4gICAqIGNyZWRlbnRpYWxzIHRoZSBydW50aW1lIGlzIGluIGZpbGUvb3V0Ym94IG1vZGUgKG9ubHkgd2hlblxuICAgKiBgRU1BSUxfT1VUQk9YX01PREVgIGlzIHNldCksIGxvZ2dlZCBsb3VkbHkgaGVyZSBzbyBpdCBpcyBvYnZpb3VzIG1haWxcbiAgICogaXMgYmVpbmcgd3JpdHRlbiB0byBkaXNrIHJhdGhlciB0aGFuIHNlbnQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRyYW5zcG9ydGVyLCBjb25maWcgfSA9IGdldEVtYWlsUnVudGltZSh0aGlzLmNvbmZpZyk7XG4gICAgc2V0RW1haWxFeGVjdXRvcigoZm4sIHNldHRpbmdzKSA9PiB0aGlzLmV4ZWN1dGUoZm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3QgcG9saWN5ID0ge1xuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBzZW5kZXJQb2xpY3k6IGNvbmZpZy5zZW5kZXJQb2xpY3ksXG4gICAgICByZXN0cmljdGVkOiBjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCxcbiAgICAgIC4uLihjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCA/IHsgYWxsb3dlZFNlbmRlcnM6IGNvbmZpZy5hbGxvd2VkU2VuZGVycyB9IDoge30pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvdXRib3g6ZW5hYmxlZFwiLCB7XG4gICAgICAgIGRpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgcmVhc29uOiBcIm5vIFNNVFAgY3JlZGVudGlhbHMgY29uZmlndXJlZDsgZW1haWxzIGFyZSB3cml0dGVuIHRvIGRpc2sgaW5zdGVhZCBvZiBzZW50XCIsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgcG9saWN5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoc2lnbmFsKSA9PiB2ZXJpZnlFbWFpbFRyYW5zcG9ydCh0cmFuc3BvcnRlciwgc2lnbmFsKSxcbiAgICAgIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyxcbiAgICApO1xuICAgIGlmICghdmVyaWZpZWQub2spIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInNtdHA6dW52ZXJpZmllZFwiLCB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgc3RhdHVzOiB2ZXJpZmllZC5zdGF0dXMsXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZC5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICAgIFwiU01UUFwiLFxuICAgICAgICBgQ291bGQgbm90IHZlcmlmeSAke2NvbmZpZy5ob3N0fToke2NvbmZpZy5wb3J0fS4gQ2hlY2sgU01UUF9IT1NULCBTTVRQX1BPUlQsIFNNVFBfU0VDVVJFLCBhbmQgdGhlIGNyZWRlbnRpYWxzLCBvciBzZXQgRU1BSUxfT1VUQk9YX01PREU9MSBmb3IgbG9jYWwgb3V0Ym94IHRlc3RpbmcuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgLi4ucG9saWN5LFxuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wuIElkZW1wb3RlbnQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0RW1haWxSdW50aW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIG9ubHkgaW52b2tlcyB0aGlzIGhvb2sgLVxuICAgKiBpdCBuZXZlciBjYWxscyB7QGxpbmsgc2h1dGRvd259IC0gc28gdGhlIFNNVFAgcG9vbCBpcyBjbG9zZWQgZnJvbSBoZXJlIG9yXG4gICAqIGl0IGxlYWtzIGF0IFNJR1RFUk0uIFRoZSB0ZWFyZG93biBpcyBzeW5jaHJvbm91cyBhbmQgaWRlbXBvdGVudCwgc28gdGhlXG4gICAqIHVuLWF3YWl0ZWQgY2FsbCBjb3N0cyBub3RoaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwIHNvIFVJIGNvbXBvc2Ugdmlld3MgY2FuIHBvcHVsYXRlIGFcbiAgICogYEZyb21gIGRyb3Bkb3duIGZyb20gdGhlIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdC4gTW91bnRlZCB1bmRlciB0aGVcbiAgICogcGx1Z2luIGJhc2UgcGF0aCwgaS5lLiBgR0VUIC9hcGkvZW1haWwvc2VuZGVyc2AuIFJ1bnMgaW4gdGhlIE9CT1xuICAgKiB1c2VyIHNjb3BlIHNvIGRvbWFpbiB3aWxkY2FyZHMgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWxsZXIncyBvd25cbiAgICogbG9jYWwgcGFydC5cbiAgICpcbiAgICogT0JPIGlzIHVzZWQgb25seSBXSEVOIHRoZSByZXF1ZXN0IGNhbiBzdXBwb3J0IGl0LiBgYXNVc2VyKHJlcSlgIHRocm93c1xuICAgKiBgQXV0aGVudGljYXRpb25FcnJvcmAgb3V0c2lkZSBgTk9ERV9FTlY9ZGV2ZWxvcG1lbnRgIGlmIHRoZSByZXF1ZXN0IGNhcnJpZXNcbiAgICogbm8gZm9yd2FyZGVkIE9CTyB0b2tlbiwgYW5kIEFwcEtpdCBkb2VzIG5vdCBjYXRjaCBhIHJlamVjdGlvbiByYWlzZWQgaW5zaWRlXG4gICAqIGEgaGFuZGxlciAtIHNvIHVuY29uZGl0aW9uYWxseSB3cmFwcGluZyB0aGlzIHJvdXRlIHRha2VzIHRoZSBwcm9jZXNzIGRvd25cbiAgICogZm9yIGEgY2FsbGVyIHRoYXQgYXV0aGVudGljYXRlZCBzb21lIG90aGVyIHdheSAoYSBgQGRieC10b29scy9jbGktdHVubmVsYFxuICAgKiBPVFAgc2Vzc2lvbiwgYSBoZWFsdGggcHJvYmUsIGEgbG9jYWwgYGN1cmxgKS4gVGhlIHVzZXIgY29udGV4dCBpcyBvbmx5IGV2ZXJcbiAgICogYW4gRU5SSUNITUVOVCBoZXJlOiB3aXRob3V0IGl0LCB3aWxkY2FyZCBzZW5kZXJzIHNpbXBseSBleHBhbmQgYWdhaW5zdCBub1xuICAgKiBsb2NhbCBwYXJ0LiBEZWdyYWRpbmcgdG8gdGhlIHNlcnZpY2UgY29udGV4dCB0aGVyZWZvcmUgYW5zd2VycyBjb3JyZWN0bHlcbiAgICogaW5zdGVhZCBvZiBmYWlsaW5nLCBhbmQgYSBmcm9udC1kb29yIHJlcXVlc3QgaXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzYW1lIHJ1bGUgYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBpZGVudGl0eWAgbW9kdWxlIGFwcGxpZXMgaW5cbiAgICogYFwiYXV0b1wiYCBtb2RlOyB0aGUgaGVhZGVyIGNoZWNrIGlzIGlubGluZWQgcmF0aGVyIHRoYW4gdGFraW5nIGEgZGVwZW5kZW5jeVxuICAgKiBvbiB0aGF0IHBhY2thZ2UgZm9yIG9uZSBwcmVkaWNhdGUuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibGlzdFNlbmRlcnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFNFTkRFUlNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2JvVG9rZW4gPSBzdHJpbmcudHJpbVRvTnVsbChyZXEuaGVhZGVyKHRva2VuLkFDQ0VTU19UT0tFTl9IRUFERVIpKTtcbiAgICAgICAgY29uc3Qgc2NvcGVkID0gb2JvVG9rZW4gPT09IG51bGwgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NvcGVkLmV4ZWN1dGVMaXN0U2VuZGVycygpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogU2VuZCBhIG1lc3NhZ2UgaW1tZWRpYXRlbHkgZnJvbSBgZnJvbWAgdGhyb3VnaCB0aGUgc2hhcmVkXG4gICAgICAgKiB0cmFuc3BvcnQsIGJ5cGFzc2luZyB0aGUgYXBwcm92YWwgZmxvdy4gRm9yIGFnZW50LWRyaXZlbiBzZW5kc1xuICAgICAgICogdXNlIHtAbGluayBlbWFpbFRvb2x9IGluc3RlYWQuXG4gICAgICAgKlxuICAgICAgICogYG9wdGlvbnNgIGNhcnJpZXMgZGVsaXZlcnktdGltZSBjb25jZXJucyB0aGF0IGFyZSBkZWxpYmVyYXRlbHkgTk9UIHBhcnQgb2ZcbiAgICAgICAqIHRoZSBtZXNzYWdlIHNjaGVtYSBhbiBhZ2VudCBmaWxscyBpbiAtIHNlZSB7QGxpbmsgU2VuZEVtYWlsT3B0aW9uc30uIFRoZVxuICAgICAgICogYWdlbnQgdG9vbCBwYXRoIG5ldmVyIHN1cHBsaWVzIHRoZW0sIHdoaWNoIGlzIHRoZSBwb2ludDogYSB0cmFpbGVyIGlzXG4gICAgICAgKiBkZXJpdmVkIGZyb20gdGhlIGRlcGxveW1lbnQncyBvd24gZG9tYWluLCBub3QgZnJvbSBtb2RlbCBvdXRwdXQuXG4gICAgICAgKi9cbiAgICAgIHNlbmRFbWFpbDogKFxuICAgICAgICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gICAgICAgIGZyb206IHN0cmluZyxcbiAgICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgICAgIG9wdGlvbnM/OiBTZW5kRW1haWxPcHRpb25zLFxuICAgICAgKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4gPT4gdGhpcy5zZW5kKG1lc3NhZ2UsIGZyb20sIHNpZ25hbCwgb3B0aW9ucyksXG4gICAgICAvKipcbiAgICAgICAqIFNlbmRlciBvcHRpb25zIGZvciB0aGUgY3VycmVudCB1c2VyICh0aGUgYEdFVCAvc2VuZGVyc2AgcGF5bG9hZCkuXG4gICAgICAgKiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yIE9CTyBzY29waW5nLlxuICAgICAgICovXG4gICAgICBsaXN0U2VuZGVyczogYXN5bmMgKCk6IFByb21pc2U8RW1haWxTZW5kZXJzPiA9PiB1bndyYXAoYXdhaXQgdGhpcy5leGVjdXRlTGlzdFNlbmRlcnMoKSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbC4gQXJndW1lbnRzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdFxuICAgKiB0aGUgdG9vbCdzIHNjaGVtYSBmaXJzdCwgYW5kIGEgdmFsaWRhdGlvbiBmYWlsdXJlIGNvbWVzIGJhY2sgYXMgYW5cbiAgICogTExNLWZyaWVuZGx5IHN0cmluZyBzbyB0aGUgbW9kZWwgY2FuIGNvcnJlY3QgaXRzZWxmIG9uIHRoZSBuZXh0IHR1cm4uXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnRUb29sKG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZyb21SZWdpc3RyeSh0aGlzLnRvb2xzLCBuYW1lLCBhcmdzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgb25lIG1lc3NhZ2UsIHJlc29sdmluZyB0aGUgc2VuZGVyIGZvciB0aGUgY2FsbGVyIGluIHNjb3BlIHdoZW5cbiAgICogYGZyb21gIGlzIG5vdCBwaW5uZWQuIFRoZSBpbnRlcmNlcHRvciBjaGFpbiBpcyBhcHBsaWVkIGluc2lkZVxuICAgKiB7QGxpbmsgc2VuZEVtYWlsfSB0aHJvdWdoIHRoZSBleGVjdXRvciBpbnN0YWxsZWQgYXQgc2V0dXAsIHNvIHRoaXMgbXVzdFxuICAgKiBub3Qgd3JhcCBpdCBhZ2Fpbi5cbiAgICpcbiAgICogYG9wdGlvbnNgIGlzIGZvcndhcmRlZCB1bnRvdWNoZWQgc28gZXZlcnkgY2FsbGVyIG9mIHRoaXMgcGx1Z2luIHJlYWNoZXMgdGhlXG4gICAqIHNhbWUgc2hhcmVkIHRlbXBsYXRlIGZlYXR1cmVzIHRoZSBtb2R1bGUtbGV2ZWwge0BsaW5rIHNlbmRFbWFpbH0gZG9lczsgdGhlXG4gICAqIGFnZW50IHRvb2wgcGF0aCBzaW1wbHkgb21pdHMgaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoXG4gICAgbWVzc2FnZTogRW1haWxNZXNzYWdlLFxuICAgIGZyb206IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBvcHRpb25zPzogU2VuZEVtYWlsT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4ge1xuICAgIHJldHVybiBzZW5kRW1haWwobWVzc2FnZSwgZnJvbSA/PyB0aGlzLnJlc29sdmVTZW5kZXIoKSwgc2lnbmFsLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBSdW4gdGhlIHNlbmRlci1vcHRpb25zIGxvb2t1cCB0aHJvdWdoIHRoZSBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi4gKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGlzdFNlbmRlcnMoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8RW1haWxTZW5kZXJzPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4gdGhpcy5saXN0U2VuZGVycygpLCBFTUFJTF9TRU5ERVJTX1NFVFRJTkdTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBgRnJvbWAgb3B0aW9ucyBvZmZlcmVkIHRvIHRoZSBjdXJyZW50IHVzZXI6IHRoZSBjb25jcmV0ZVxuICAgKiBhZGRyZXNzZXMgdGhlIGVmZmVjdGl2ZSBhbGxvdy1saXN0IHBlcm1pdHMgKGRvbWFpbiB3aWxkY2FyZHMgZXhwYW5kZWRcbiAgICogYWdhaW5zdCB0aGUgT0JPIHVzZXIncyBsb2NhbCBwYXJ0KSwgdGhlIGRlZmF1bHQgYW1vbmcgdGhlbSwgYW5kXG4gICAqIHdoZXRoZXIgdGhlIGxpc3QgaXMgYW4gZW5mb3JjZWQgcmVzdHJpY3Rpb24uIFNlZVxuICAgKiB7QGxpbmsgbGlzdFNlbmRlck9wdGlvbnN9LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0U2VuZGVycygpOiBQcm9taXNlPEVtYWlsU2VuZGVycz4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRFbWFpbFJ1bnRpbWUoKTtcbiAgICBjb25zdCBzZW5kZXJzID0gbGlzdFNlbmRlck9wdGlvbnMoY29uZmlnLCBjdXJyZW50VXNlckVtYWlsKCkpO1xuICAgIC8vIFByZWZlciB0aGUgYWRkcmVzcyBhIHNlbmQgd291bGQgYWN0dWFsbHkgZGVmYXVsdCB0bzsgZmFsbCBiYWNrIHRvXG4gICAgLy8gdGhlIGZpcnN0IG9mZmVyZWQgb3B0aW9uIHdoZW4gdGhhdCBjYW4ndCBiZSByZXNvbHZlZCAvIHBlcm1pdHRlZC5cbiAgICBsZXQgZGVmYXVsdFNlbmRlciA9IHNlbmRlcnNbMF07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlU2VuZGVyKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChpc1NlbmRlckFsbG93ZWQocmVzb2x2ZWQsIGNvbmZpZy5hbGxvd2VkU2VuZGVycykpIGRlZmF1bHRTZW5kZXIgPSByZXNvbHZlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgdGhlIGZpcnN0IG9mZmVyZWQgb3B0aW9uIChvciBub25lKSBhcyB0aGUgZGVmYXVsdC5cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRlcnMsXG4gICAgICAuLi4oZGVmYXVsdFNlbmRlciA/IHsgZGVmYXVsdFNlbmRlciB9IDoge30pLFxuICAgICAgcmVzdHJpY3RlZDogY29uZmlnLmFsbG93ZWRTZW5kZXJzLmxlbmd0aCA+IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYEZyb21gIGEgc2VuZCBkZWZhdWx0cyB0byBmb3IgdGhlIGNhbGxlciBpbiBzY29wZS4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2VuZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVTZW5kZXJBZGRyZXNzKGdldEVtYWlsUnVudGltZSgpLmNvbmZpZywgY3VycmVudFVzZXJFbWFpbCgpKTtcbiAgfVxufVxuXG4vKiogVGhlIE9CTyB1c2VyJ3MgYWRkcmVzcywgb3IgdW5kZWZpbmVkIG91dHNpZGUgYSB1c2VyIGNvbnRleHQuICovXG5mdW5jdGlvbiBjdXJyZW50VXNlckVtYWlsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgcmV0dXJuIFwiaXNVc2VyQ29udGV4dFwiIGluIGN0eCA/IGN0eC51c2VyRW1haWwgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmUtcmFpc2UgYSBmYWlsZWQgZXhlY3V0aW9uIGFzIHRoZSBBcHBLaXQgZXJyb3IgY2xhc3MgdGhhdCBhbHJlYWR5IGNhcnJpZXNcbiAqIHRoZSBzdGF0dXMgQXBwS2l0IHJlc29sdmVkLCBzbyBhIHByb2dyYW1tYXRpYyBjYWxsZXIgc2VlcyB0aGUgc2FtZSA0MDAgL1xuICogNDAxIC8gNTAzIGFuIEhUVFAgY2FsbGVyIHdvdWxkLlxuICovXG5mdW5jdGlvbiB0b0FwcEtpdEVycm9yKHN0YXR1czogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBBcHBLaXRFcnJvciB7XG4gIGlmIChzdGF0dXMgPT09IDQwMCkgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSk7XG4gIGlmIChzdGF0dXMgPT09IDQwMSkgcmV0dXJuIG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKG1lc3NhZ2UpO1xuICBpZiAoc3RhdHVzID09PSA1MDMpIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gbmV3IEV4ZWN1dGlvbkVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFN1cmZhY2UgYSBmYWlsZWQge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gdG8gYSBwcm9ncmFtbWF0aWMgY2FsbGVyIGFzIGFcbiAqIHRocm93LiBIVFRQIGhhbmRsZXJzIG1hcCBgc3RhdHVzYCBvbnRvIHRoZSByZXNwb25zZSBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiB1bndyYXA8VD4ocmVzdWx0OiBFeGVjdXRpb25SZXN1bHQ8VD4pOiBUIHtcbiAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB0aHJvdyB0b0FwcEtpdEVycm9yKHJlc3VsdC5zdGF0dXMsIHJlc3VsdC5tZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBicmFuZCwgcGx1Z2luIGFzIGVtYWlsUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgZW1haWxQbHVnaW4uZW1haWwoe1xuICogICAgICAgZG9tYWluOiBcIm1haWwuZXhhbXBsZS5jb21cIixcbiAqICAgICAgIGFsbG93ZWRTZW5kZXJzOiBbXCIqQG1haWwuZXhhbXBsZS5jb21cIl0sXG4gKiAgICAgICBicmFuZDogYnJhbmQuZGVmYXVsdEVtYWlsQnJhbmQsXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgZW1haWwgPSB0b1BsdWdpbihFbWFpbFBsdWdpbik7XG4iXX0=
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsR0FLaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsS0FBSyxJQUFJLFNBQVMsR0FJbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsZ0JBQWdCLEVBQ2hCLG9CQUFvQixHQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLCtFQUErRTtBQUMvRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsNEVBQTRFO0FBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUV6QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxNQUF5QjtJQUN4RCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLE9BQU87UUFDcEIsV0FBVyxFQUNULHFFQUFxRTtZQUNyRSx5REFBeUQ7UUFDM0QsU0FBUyxFQUFFLE1BQU07UUFDakIsU0FBUyxFQUFFO1lBQ1QsUUFBUSxFQUFFLEVBQUU7WUFDWixRQUFRLEVBQUUsRUFBRTtTQUNiO1FBQ0QsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFO0tBQ04sQ0FBQztJQUVwQzs7Ozs7Ozs7OztPQVVHO0lBQ2MsS0FBSyxHQUFpQjtRQUNyQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQztZQUN0QixXQUFXLEVBQUUsc0JBQXNCO1lBQ25DLE1BQU0sRUFBRSxTQUFTLENBQUMsa0JBQWtCO1lBQ3BDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1lBQzNELGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDO1NBQ3pFLENBQUM7S0FDSCxDQUFDO0lBRUY7Ozs7Ozs7Ozs7T0FVRztJQUNNLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzVDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3ZGLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDNUIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNsQixNQUFNLEVBQUUsNEVBQTRFO2FBQ3JGLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUNqQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEVBQzNELHFCQUFxQixDQUN0QixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFO2dCQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU87YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsTUFBTSxFQUNOLG9CQUFvQixNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLHNIQUFzSCxDQUNySyxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25CLEdBQUcsTUFBTTtZQUNULElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLFFBQVE7UUFDWixpQkFBaUIsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNNLHFCQUFxQjtRQUM1QixLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5QixLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ00sWUFBWSxDQUFDLE1BQWtCO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksRUFBRSxhQUFhO1lBQ25CLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLGFBQWE7WUFDbkIsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxNQUFNLE1BQU0sR0FBRyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUMxRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTztZQUNMOzs7O2VBSUc7WUFDSCxTQUFTLEVBQUUsQ0FDVCxPQUFxQixFQUNyQixJQUFZLEVBQ1osTUFBb0IsRUFDcEIsT0FBMEIsRUFDSixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDcEU7OztlQUdHO1lBQ0gsV0FBVyxFQUFFLEtBQUssSUFBMkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQ3hGLENBQUM7SUFDSixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLGFBQWE7UUFDWCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLE1BQW9CO1FBQ3RFLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxJQUFJLENBQ2hCLE9BQXFCLEVBQ3JCLElBQXdCLEVBQ3hCLE1BQW9CLEVBQ3BCLE9BQTBCO1FBRTFCLE9BQU8sU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsNEVBQTRFO0lBQ3BFLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzlELG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQ2pGLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwwREFBMEQ7UUFDNUQsQ0FBQztRQUNELE9BQU87WUFDTCxPQUFPO1lBQ1AsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQsNkRBQTZEO0lBQ3JELGFBQWE7UUFDbkIsT0FBTyxvQkFBb0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7O0FBR0gsbUVBQW1FO0FBQ25FLFNBQVMsZ0JBQWdCO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsT0FBTyxlQUFlLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxNQUFjLEVBQUUsT0FBZTtJQUNwRCxJQUFJLE1BQU0sS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxJQUFJLE1BQU0sS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELElBQUksTUFBTSxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE9BQU8sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsTUFBTSxDQUFJLE1BQTBCO0lBQzNDLElBQUksTUFBTSxDQUFDLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDbEMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgZW1haWxgKSB0aGF0IG93bnMgdGhlIFNNVFAgcnVudGltZVxuICogZm9yIG91dGJvdW5kIG1haWwuIFJlZ2lzdGVyaW5nIGl0IHZhbGlkYXRlcyB0aGUgU01UUCBjb25maWd1cmF0aW9uXG4gKiBhbmQgdmVyaWZpZXMgY29ubmVjdGl2aXR5IGF0IHN0YXJ0dXAsIHNvIGEgYmFkIGhvc3QgLyBjcmVkZW50aWFsXG4gKiBzdXJmYWNlcyBpbiB0aGUgYm9vdCBsb2dzIGluc3RlYWQgb2Ygb24gdGhlIGZpcnN0IGFwcHJvdmVkIHNlbmQsIGFuZFxuICogaW5zdGFsbHMgdGhpcyBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBhcyB0aGUgcnVudGltZSdzIGV4ZWN1dG9yIHNvIGV2ZXJ5XG4gKiBzZW5kIHBpY2tzIHVwIEFwcEtpdCdzIHJldHJ5IC8gdGltZW91dCAvIHRlbGVtZXRyeSBjaGFpbi5cbiAqXG4gKiBUaGUgcGx1Z2luIGlzIGFsc28gYSBgVG9vbFByb3ZpZGVyYCwgc28gYW4gQXBwS2l0IGFnZW50IGNhbiByZWFjaCBhblxuICogYGVtYWlsLnNlbmRgIHRvb2wgZGlyZWN0bHk7IHRoZSB7QGxpbmsgZW1haWxUb29sfSBleHBvcnQgaXMgdGhlIHNhbWVcbiAqIGNhcGFiaWxpdHkgZm9yIGEgTWFzdHJhIGFnZW50LiBCb3RoIHNoYXJlIHRoZSB0cmFuc3BvcnQgcHJpbWVkIGhlcmUsXG4gKiBhbmQge0BsaW5rIHNlbmRFbWFpbH0gaXMgYXZhaWxhYmxlIHRvIG5vbi1hZ2VudCBjYWxsZXJzLlxuICpcbiAqIENvbmZpZ3VyYXRpb24gaXMgdGhlIG1hbmlmZXN0LXB1Ymxpc2hlZCB7QGxpbmsgRW1haWxQbHVnaW5Db25maWd9XG4gKiAoU01UUCBob3N0L3BvcnQvY3JlZGVudGlhbHMsIHNlbmRlciBkb21haW4gb3IgZXhwbGljaXQgYGZyb21gLCB0aGVcbiAqIHNlbmRlciBwb2xpY3ksIGFuZCBhbiBvcHRpb25hbCBgYWxsb3dlZFNlbmRlcnNgIHJlc3RyaWN0aW9uKSwgd2l0aFxuICogdW5wcmVmaXhlZCBgU01UUF8qYCAvIGBFTUFJTF8qYCBlbnZpcm9ubWVudCBmYWxsYmFja3MuXG4gKlxuICogVGhlIHBsdWdpbiBtb3VudHMgb25lIHJvdXRlIHVuZGVyIGl0cyBiYXNlIHBhdGggKGAvYXBpL2VtYWlsYCk6XG4gKiBgR0VUIC9zZW5kZXJzYCByZXR1cm5zIHRoZSBwZXJtaXR0ZWQgYEZyb21gIG9wdGlvbnMgZm9yIHRoZSBjYWxsaW5nXG4gKiB1c2VyLCBzbyBhIGNvbXBvc2UgVUkgY2FuIG9mZmVyIHRoZW0gaW4gYSBkcm9wZG93bi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHR5cGUgQXBwS2l0RXJyb3IsXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZW1haWwgYXMgZW1haWxXaXJlLFxuICB0eXBlIEVtYWlsTWVzc2FnZSxcbiAgdHlwZSBFbWFpbFJlc3VsdCxcbiAgdHlwZSBFbWFpbFNlbmRlcnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1lbWFpbFwiO1xuaW1wb3J0IHsgRU1BSUxfQ09ORklHX1NDSEVNQSwgdHlwZSBFbWFpbFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgRU1BSUxfU0VOREVSU19TRVRUSU5HUywgRU1BSUxfVkVSSUZZX1NFVFRJTkdTIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGlzU2VuZGVyQWxsb3dlZCwgbGlzdFNlbmRlck9wdGlvbnMsIHJlc29sdmVTZW5kZXJBZGRyZXNzIH0gZnJvbSBcIi4vc2VuZGVyLnRzXCI7XG5pbXBvcnQgeyBTRU5EX0VNQUlMX0RFU0NSSVBUSU9OIH0gZnJvbSBcIi4vdG9vbC50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW1haWxSdW50aW1lLFxuICByZXNldEVtYWlsUnVudGltZSxcbiAgc2VuZEVtYWlsLFxuICB0eXBlIFNlbmRFbWFpbE9wdGlvbnMsXG4gIHNldEVtYWlsRXhlY3V0b3IsXG4gIHZlcmlmeUVtYWlsVHJhbnNwb3J0LFxufSBmcm9tIFwiLi90cmFuc3BvcnQudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlICh1bmRlciBgL2FwaS9lbWFpbGApIGZvciB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwLiAqL1xuY29uc3QgU0VOREVSU19ST1VURSA9IFwiL3NlbmRlcnNcIjtcblxuLyoqIFJlZ2lzdHJ5IGtleSBvZiB0aGUgYWdlbnQgdG9vbCwgd2hpY2ggYWdlbnRzIGFkZHJlc3MgYXMgYGVtYWlsLnNlbmRgLiAqL1xuY29uc3QgU0VORF9UT09MID0gXCJzZW5kXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbFwiKTtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgY29uZmlndXJlcyBhbmQgdmVyaWZpZXMgdGhlIFNNVFAgdHJhbnNwb3J0IHVzZWQgYnlcbiAqIHRoZSBgc2VuZF9lbWFpbGAgdG9vbCwgYW5kIGV4cG9zZXMgc2VuZGluZyBhcyBhbiBBcHBLaXQgYWdlbnQgdG9vbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgcGx1Z2luIGFzIGVtYWlsUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgZW1haWxQbHVnaW4uZW1haWwoe1xuICogICAgICAgc210cDogeyBob3N0OiBcInNtdHAuZXhhbXBsZS5jb21cIiwgdXNlcjogXCJhcGlrZXlcIiwgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlNNVFBfS0VZIH0sXG4gKiAgICAgICBkb21haW46IFwibWFpbC5leGFtcGxlLmNvbVwiLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEVtYWlsUGx1Z2luQ29uZmlnPiBpbXBsZW1lbnRzIFRvb2xQcm92aWRlciB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImVtYWlsXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRW1haWxcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VuZHMgYXBwcm92YWwtZ2F0ZWQgZW1haWwgb3ZlciBTTVRQLCB3aXRoIHRoZSBzZW5kZXIgZGVyaXZlZCBmcm9tIFwiICtcbiAgICAgIFwidGhlIG9uLWJlaGFsZi1vZiB1c2VyJ3MgYWRkcmVzcyBvbiBhIGNvbmZpZ3VyZWQgZG9tYWluLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBFTUFJTF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZW1haWxcIj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuXG4gICAqXG4gICAqIE5vdCBgYXV0b0luaGVyaXRhYmxlYDogYSBzZW5kIGlzIGlycmV2ZXJzaWJsZSBhbmQgbGVhdmVzIHRoZSB3b3Jrc3BhY2UsXG4gICAqIHNvIGl0IG11c3Qgb25seSBhcHBlYXIgaW4gYW4gYWdlbnQgdGhhdCBhc2tlZCBmb3IgaXQgYW5kIGFjY2VwdGVkIHRoZVxuICAgKiBzZW5kZXIgcG9saWN5IHRoYXQgY29tZXMgd2l0aCBpdC5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xzOiBUb29sUmVnaXN0cnkgPSB7XG4gICAgW1NFTkRfVE9PTF06IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFNFTkRfRU1BSUxfREVTQ1JJUFRJT04sXG4gICAgICBzY2hlbWE6IGVtYWlsV2lyZS5lbWFpbE1lc3NhZ2VTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+XG4gICAgICAgIHRoaXMuc2VuZChlbWFpbFdpcmUuZW1haWxNZXNzYWdlU2NoZW1hLnBhcnNlKGFyZ3MpLCB1bmRlZmluZWQsIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqXG4gICAqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIHRoaXMgcGx1Z2luJ3MgY29uZmlnIChvdmVyIGVudiksIHJvdXRlIHRoZVxuICAgKiB0b29scycgc2VuZHMgdGhyb3VnaCB0aGlzIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLCBhbmQgbG9nIHRoZVxuICAgKiBlZmZlY3RpdmUgc2VuZGVyIHBvbGljeSBzbyBhbiBhY3RpdmUgcmVzdHJpY3Rpb24gaXMgb2J2aW91cyBhdCBib290LiBJblxuICAgKiBTTVRQIG1vZGUsIGZhaWwgc2V0dXAgd2hlbiB0aGUgdHJhbnNwb3J0IGNhbm5vdCBiZSB2ZXJpZmllZDogYSBiYWQgaG9zdFxuICAgKiBvciBjcmVkZW50aWFsIGlzIGEgZGVwbG95LXRpbWUgbWlzdGFrZSBhbmQgc2hvdWxkIHN0b3AgdGhlIGFwcCByYXRoZXJcbiAgICogdGhhbiB3YWl0IGZvciBhIHVzZXIgdG8gYXBwcm92ZSBhIHNlbmQgdGhhdCBjYW5ub3Qgd29yay4gV2l0aCBubyBTTVRQXG4gICAqIGNyZWRlbnRpYWxzIHRoZSBydW50aW1lIGlzIGluIGZpbGUvb3V0Ym94IG1vZGUgKG9ubHkgd2hlblxuICAgKiBgRU1BSUxfT1VUQk9YX01PREVgIGlzIHNldCksIGxvZ2dlZCBsb3VkbHkgaGVyZSBzbyBpdCBpcyBvYnZpb3VzIG1haWxcbiAgICogaXMgYmVpbmcgd3JpdHRlbiB0byBkaXNrIHJhdGhlciB0aGFuIHNlbnQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRyYW5zcG9ydGVyLCBjb25maWcgfSA9IGdldEVtYWlsUnVudGltZSh0aGlzLmNvbmZpZyk7XG4gICAgc2V0RW1haWxFeGVjdXRvcigoZm4sIHNldHRpbmdzKSA9PiB0aGlzLmV4ZWN1dGUoZm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3QgcG9saWN5ID0ge1xuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBzZW5kZXJQb2xpY3k6IGNvbmZpZy5zZW5kZXJQb2xpY3ksXG4gICAgICByZXN0cmljdGVkOiBjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCxcbiAgICAgIC4uLihjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCA/IHsgYWxsb3dlZFNlbmRlcnM6IGNvbmZpZy5hbGxvd2VkU2VuZGVycyB9IDoge30pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5tb2RlID09PSBcImZpbGVcIikge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvdXRib3g6ZW5hYmxlZFwiLCB7XG4gICAgICAgIGRpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgcmVhc29uOiBcIm5vIFNNVFAgY3JlZGVudGlhbHMgY29uZmlndXJlZDsgZW1haWxzIGFyZSB3cml0dGVuIHRvIGRpc2sgaW5zdGVhZCBvZiBzZW50XCIsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgcG9saWN5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoc2lnbmFsKSA9PiB2ZXJpZnlFbWFpbFRyYW5zcG9ydCh0cmFuc3BvcnRlciwgc2lnbmFsKSxcbiAgICAgIEVNQUlMX1ZFUklGWV9TRVRUSU5HUyxcbiAgICApO1xuICAgIGlmICghdmVyaWZpZWQub2spIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInNtdHA6dW52ZXJpZmllZFwiLCB7XG4gICAgICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgICAgc3RhdHVzOiB2ZXJpZmllZC5zdGF0dXMsXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZC5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICAgIFwiU01UUFwiLFxuICAgICAgICBgQ291bGQgbm90IHZlcmlmeSAke2NvbmZpZy5ob3N0fToke2NvbmZpZy5wb3J0fS4gQ2hlY2sgU01UUF9IT1NULCBTTVRQX1BPUlQsIFNNVFBfU0VDVVJFLCBhbmQgdGhlIGNyZWRlbnRpYWxzLCBvciBzZXQgRU1BSUxfT1VUQk9YX01PREU9MSBmb3IgbG9jYWwgb3V0Ym94IHRlc3RpbmcuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgLi4ucG9saWN5LFxuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHNlY3VyZTogY29uZmlnLnNlY3VyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgU01UUCBjb25uZWN0aW9uIHBvb2wuIElkZW1wb3RlbnQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0RW1haWxSdW50aW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIG9ubHkgaW52b2tlcyB0aGlzIGhvb2sgLVxuICAgKiBpdCBuZXZlciBjYWxscyB7QGxpbmsgc2h1dGRvd259IC0gc28gdGhlIFNNVFAgcG9vbCBpcyBjbG9zZWQgZnJvbSBoZXJlIG9yXG4gICAqIGl0IGxlYWtzIGF0IFNJR1RFUk0uIFRoZSB0ZWFyZG93biBpcyBzeW5jaHJvbm91cyBhbmQgaWRlbXBvdGVudCwgc28gdGhlXG4gICAqIHVuLWF3YWl0ZWQgY2FsbCBjb3N0cyBub3RoaW5nLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwIHNvIFVJIGNvbXBvc2Ugdmlld3MgY2FuIHBvcHVsYXRlIGFcbiAgICogYEZyb21gIGRyb3Bkb3duIGZyb20gdGhlIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdC4gTW91bnRlZCB1bmRlciB0aGVcbiAgICogcGx1Z2luIGJhc2UgcGF0aCwgaS5lLiBgR0VUIC9hcGkvZW1haWwvc2VuZGVyc2AuIFJ1bnMgaW4gdGhlIE9CT1xuICAgKiB1c2VyIHNjb3BlIHNvIGRvbWFpbiB3aWxkY2FyZHMgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWxsZXIncyBvd25cbiAgICogbG9jYWwgcGFydC5cbiAgICpcbiAgICogT0JPIGlzIHVzZWQgb25seSBXSEVOIHRoZSByZXF1ZXN0IGNhbiBzdXBwb3J0IGl0LiBgYXNVc2VyKHJlcSlgIHRocm93c1xuICAgKiBgQXV0aGVudGljYXRpb25FcnJvcmAgb3V0c2lkZSBgTk9ERV9FTlY9ZGV2ZWxvcG1lbnRgIGlmIHRoZSByZXF1ZXN0IGNhcnJpZXNcbiAgICogbm8gZm9yd2FyZGVkIE9CTyB0b2tlbiwgYW5kIEFwcEtpdCBkb2VzIG5vdCBjYXRjaCBhIHJlamVjdGlvbiByYWlzZWQgaW5zaWRlXG4gICAqIGEgaGFuZGxlciAtIHNvIHVuY29uZGl0aW9uYWxseSB3cmFwcGluZyB0aGlzIHJvdXRlIHRha2VzIHRoZSBwcm9jZXNzIGRvd25cbiAgICogZm9yIGEgY2FsbGVyIHRoYXQgYXV0aGVudGljYXRlZCBzb21lIG90aGVyIHdheSAoYSBgQGRieC10b29scy9jbGktdHVubmVsYFxuICAgKiBPVFAgc2Vzc2lvbiwgYSBoZWFsdGggcHJvYmUsIGEgbG9jYWwgYGN1cmxgKS4gVGhlIHVzZXIgY29udGV4dCBpcyBvbmx5IGV2ZXJcbiAgICogYW4gRU5SSUNITUVOVCBoZXJlOiB3aXRob3V0IGl0LCB3aWxkY2FyZCBzZW5kZXJzIHNpbXBseSBleHBhbmQgYWdhaW5zdCBub1xuICAgKiBsb2NhbCBwYXJ0LiBEZWdyYWRpbmcgdG8gdGhlIHNlcnZpY2UgY29udGV4dCB0aGVyZWZvcmUgYW5zd2VycyBjb3JyZWN0bHlcbiAgICogaW5zdGVhZCBvZiBmYWlsaW5nLCBhbmQgYSBmcm9udC1kb29yIHJlcXVlc3QgaXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzYW1lIHJ1bGUgYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBpZGVudGl0eWAgbW9kdWxlIGFwcGxpZXMgaW5cbiAgICogYFwiYXV0b1wiYCBtb2RlOyB0aGUgaGVhZGVyIGNoZWNrIGlzIGlubGluZWQgcmF0aGVyIHRoYW4gdGFraW5nIGEgZGVwZW5kZW5jeVxuICAgKiBvbiB0aGF0IHBhY2thZ2UgZm9yIG9uZSBwcmVkaWNhdGUuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibGlzdFNlbmRlcnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFNFTkRFUlNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2JvVG9rZW4gPSBzdHJpbmcudHJpbVRvTnVsbChyZXEuaGVhZGVyKHRva2VuLkFDQ0VTU19UT0tFTl9IRUFERVIpKTtcbiAgICAgICAgY29uc3Qgc2NvcGVkID0gb2JvVG9rZW4gPT09IG51bGwgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NvcGVkLmV4ZWN1dGVMaXN0U2VuZGVycygpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogU2VuZCBhIG1lc3NhZ2UgaW1tZWRpYXRlbHkgZnJvbSBgZnJvbWAgdGhyb3VnaCB0aGUgc2hhcmVkXG4gICAgICAgKiB0cmFuc3BvcnQsIGJ5cGFzc2luZyB0aGUgYXBwcm92YWwgZmxvdy4gRm9yIGFnZW50LWRyaXZlbiBzZW5kc1xuICAgICAgICogdXNlIHtAbGluayBlbWFpbFRvb2x9IGluc3RlYWQuXG4gICAgICAgKi9cbiAgICAgIHNlbmRFbWFpbDogKFxuICAgICAgICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gICAgICAgIGZyb206IHN0cmluZyxcbiAgICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgICAgIG9wdGlvbnM/OiBTZW5kRW1haWxPcHRpb25zLFxuICAgICAgKTogUHJvbWlzZTxFbWFpbFJlc3VsdD4gPT4gdGhpcy5zZW5kKG1lc3NhZ2UsIGZyb20sIHNpZ25hbCwgb3B0aW9ucyksXG4gICAgICAvKipcbiAgICAgICAqIFNlbmRlciBvcHRpb25zIGZvciB0aGUgY3VycmVudCB1c2VyICh0aGUgYEdFVCAvc2VuZGVyc2AgcGF5bG9hZCkuXG4gICAgICAgKiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yIE9CTyBzY29waW5nLlxuICAgICAgICovXG4gICAgICBsaXN0U2VuZGVyczogYXN5bmMgKCk6IFByb21pc2U8RW1haWxTZW5kZXJzPiA9PiB1bndyYXAoYXdhaXQgdGhpcy5leGVjdXRlTGlzdFNlbmRlcnMoKSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKipcbiAgICogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbC4gQXJndW1lbnRzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdFxuICAgKiB0aGUgdG9vbCdzIHNjaGVtYSBmaXJzdCwgYW5kIGEgdmFsaWRhdGlvbiBmYWlsdXJlIGNvbWVzIGJhY2sgYXMgYW5cbiAgICogTExNLWZyaWVuZGx5IHN0cmluZyBzbyB0aGUgbW9kZWwgY2FuIGNvcnJlY3QgaXRzZWxmIG9uIHRoZSBuZXh0IHR1cm4uXG4gICAqL1xuICBhc3luYyBleGVjdXRlQWdlbnRUb29sKG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZyb21SZWdpc3RyeSh0aGlzLnRvb2xzLCBuYW1lLCBhcmdzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgb25lIG1lc3NhZ2UsIHJlc29sdmluZyB0aGUgc2VuZGVyIGZvciB0aGUgY2FsbGVyIGluIHNjb3BlIHdoZW5cbiAgICogYGZyb21gIGlzIG5vdCBwaW5uZWQuIFRoZSBpbnRlcmNlcHRvciBjaGFpbiBpcyBhcHBsaWVkIGluc2lkZVxuICAgKiB7QGxpbmsgc2VuZEVtYWlsfSB0aHJvdWdoIHRoZSBleGVjdXRvciBpbnN0YWxsZWQgYXQgc2V0dXAsIHNvIHRoaXMgbXVzdFxuICAgKiBub3Qgd3JhcCBpdCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZChcbiAgICBtZXNzYWdlOiBFbWFpbE1lc3NhZ2UsXG4gICAgZnJvbTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIG9wdGlvbnM/OiBTZW5kRW1haWxPcHRpb25zLFxuICApOiBQcm9taXNlPEVtYWlsUmVzdWx0PiB7XG4gICAgcmV0dXJuIHNlbmRFbWFpbChtZXNzYWdlLCBmcm9tID8/IHRoaXMucmVzb2x2ZVNlbmRlcigpLCBzaWduYWwsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIFJ1biB0aGUgc2VuZGVyLW9wdGlvbnMgbG9va3VwIHRocm91Z2ggdGhlIHBsdWdpbidzIGludGVyY2VwdG9yIGNoYWluLiAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0U2VuZGVycygpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxFbWFpbFNlbmRlcnM+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShhc3luYyAoKSA9PiB0aGlzLmxpc3RTZW5kZXJzKCksIEVNQUlMX1NFTkRFUlNfU0VUVElOR1MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGBGcm9tYCBvcHRpb25zIG9mZmVyZWQgdG8gdGhlIGN1cnJlbnQgdXNlcjogdGhlIGNvbmNyZXRlXG4gICAqIGFkZHJlc3NlcyB0aGUgZWZmZWN0aXZlIGFsbG93LWxpc3QgcGVybWl0cyAoZG9tYWluIHdpbGRjYXJkcyBleHBhbmRlZFxuICAgKiBhZ2FpbnN0IHRoZSBPQk8gdXNlcidzIGxvY2FsIHBhcnQpLCB0aGUgZGVmYXVsdCBhbW9uZyB0aGVtLCBhbmRcbiAgICogd2hldGhlciB0aGUgbGlzdCBpcyBhbiBlbmZvcmNlZCByZXN0cmljdGlvbi4gU2VlXG4gICAqIHtAbGluayBsaXN0U2VuZGVyT3B0aW9uc30uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RTZW5kZXJzKCk6IFByb21pc2U8RW1haWxTZW5kZXJzPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldEVtYWlsUnVudGltZSgpO1xuICAgIGNvbnN0IHNlbmRlcnMgPSBsaXN0U2VuZGVyT3B0aW9ucyhjb25maWcsIGN1cnJlbnRVc2VyRW1haWwoKSk7XG4gICAgLy8gUHJlZmVyIHRoZSBhZGRyZXNzIGEgc2VuZCB3b3VsZCBhY3R1YWxseSBkZWZhdWx0IHRvOyBmYWxsIGJhY2sgdG9cbiAgICAvLyB0aGUgZmlyc3Qgb2ZmZXJlZCBvcHRpb24gd2hlbiB0aGF0IGNhbid0IGJlIHJlc29sdmVkIC8gcGVybWl0dGVkLlxuICAgIGxldCBkZWZhdWx0U2VuZGVyID0gc2VuZGVyc1swXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVTZW5kZXIoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGlzU2VuZGVyQWxsb3dlZChyZXNvbHZlZCwgY29uZmlnLmFsbG93ZWRTZW5kZXJzKSkgZGVmYXVsdFNlbmRlciA9IHJlc29sdmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2VlcCB0aGUgZmlyc3Qgb2ZmZXJlZCBvcHRpb24gKG9yIG5vbmUpIGFzIHRoZSBkZWZhdWx0LlxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZGVycyxcbiAgICAgIC4uLihkZWZhdWx0U2VuZGVyID8geyBkZWZhdWx0U2VuZGVyIH0gOiB7fSksXG4gICAgICByZXN0cmljdGVkOiBjb25maWcuYWxsb3dlZFNlbmRlcnMubGVuZ3RoID4gMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBgRnJvbWAgYSBzZW5kIGRlZmF1bHRzIHRvIGZvciB0aGUgY2FsbGVyIGluIHNjb3BlLiAqL1xuICBwcml2YXRlIHJlc29sdmVTZW5kZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVNlbmRlckFkZHJlc3MoZ2V0RW1haWxSdW50aW1lKCkuY29uZmlnLCBjdXJyZW50VXNlckVtYWlsKCkpO1xuICB9XG59XG5cbi8qKiBUaGUgT0JPIHVzZXIncyBhZGRyZXNzLCBvciB1bmRlZmluZWQgb3V0c2lkZSBhIHVzZXIgY29udGV4dC4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRVc2VyRW1haWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICByZXR1cm4gXCJpc1VzZXJDb250ZXh0XCIgaW4gY3R4ID8gY3R4LnVzZXJFbWFpbCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZS1yYWlzZSBhIGZhaWxlZCBleGVjdXRpb24gYXMgdGhlIEFwcEtpdCBlcnJvciBjbGFzcyB0aGF0IGFscmVhZHkgY2Fycmllc1xuICogdGhlIHN0YXR1cyBBcHBLaXQgcmVzb2x2ZWQsIHNvIGEgcHJvZ3JhbW1hdGljIGNhbGxlciBzZWVzIHRoZSBzYW1lIDQwMCAvXG4gKiA0MDEgLyA1MDMgYW4gSFRUUCBjYWxsZXIgd291bGQuXG4gKi9cbmZ1bmN0aW9uIHRvQXBwS2l0RXJyb3Ioc3RhdHVzOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZyk6IEFwcEtpdEVycm9yIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDAwKSByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgaWYgKHN0YXR1cyA9PT0gNDAxKSByZXR1cm4gbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3IobWVzc2FnZSk7XG4gIGlmIChzdGF0dXMgPT09IDUwMykgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBuZXcgRXhlY3V0aW9uRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogU3VyZmFjZSBhIGZhaWxlZCB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSB0byBhIHByb2dyYW1tYXRpYyBjYWxsZXIgYXMgYVxuICogdGhyb3cuIEhUVFAgaGFuZGxlcnMgbWFwIGBzdGF0dXNgIG9udG8gdGhlIHJlc3BvbnNlIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIHVud3JhcDxUPihyZXN1bHQ6IEV4ZWN1dGlvblJlc3VsdDxUPik6IFQge1xuICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIHRocm93IHRvQXBwS2l0RXJyb3IocmVzdWx0LnN0YXR1cywgcmVzdWx0Lm1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBlbWFpbCBwbHVnaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGJyYW5kLCBwbHVnaW4gYXMgZW1haWxQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9lbWFpbFwiO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBlbWFpbFBsdWdpbi5lbWFpbCh7XG4gKiAgICAgICBkb21haW46IFwibWFpbC5leGFtcGxlLmNvbVwiLFxuICogICAgICAgYWxsb3dlZFNlbmRlcnM6IFtcIipAbWFpbC5leGFtcGxlLmNvbVwiXSxcbiAqICAgICAgIGJyYW5kOiBicmFuZC5kZWZhdWx0RW1haWxCcmFuZCxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBlbWFpbCA9IHRvUGx1Z2luKEVtYWlsUGx1Z2luKTtcbiJdfQ==
|
package/lib/src/sender.d.ts
CHANGED
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
* The default `From` re-homes the local part (everything before `@`) of
|
|
6
6
|
* the OBO email on the configured sending domain, so `alice@databricks.com`
|
|
7
7
|
* through a domain of `mail.example.com` goes out as
|
|
8
|
-
* `alice@mail.example.com`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `alice@mail.example.com`. Nothing has to be configured for that beyond the
|
|
9
|
+
* domain: a fixed `from` is an OVERRIDE, not a requirement. The file/outbox
|
|
10
|
+
* fallback (no domain) keeps the user's address verbatim so test artifacts land
|
|
11
|
+
* under a recognizable folder.
|
|
12
|
+
*
|
|
13
|
+
* A send with NO user in scope is SYSTEM mail - a sign-in code, a password
|
|
14
|
+
* reset, an alert - and goes from the do-not-reply address instead
|
|
15
|
+
* ({@link resolveSystemSenderAddress}), because a recipient cannot usefully
|
|
16
|
+
* reply to a machine and a human's address on machine mail invites them to try.
|
|
11
17
|
*
|
|
12
18
|
* The resolved `From` is then constrained to the effective allow-list: a
|
|
13
19
|
* pattern is either an exact address (`user@domain.com`), a domain wildcard
|
|
@@ -20,10 +26,11 @@
|
|
|
20
26
|
*
|
|
21
27
|
* @module
|
|
22
28
|
*/
|
|
23
|
-
import type { ResolvedEmailConfig } from "./config.ts";
|
|
29
|
+
import type { ResolvedEmailConfig, ResolvedSender } from "./config.ts";
|
|
24
30
|
/**
|
|
25
|
-
* Re-home
|
|
26
|
-
*
|
|
31
|
+
* Re-home a user's local part on `domain`. Throws when no usable local part is
|
|
32
|
+
* available; callers with no user in scope want
|
|
33
|
+
* {@link resolveSystemSenderAddress} instead of a fixed `from`.
|
|
27
34
|
*/
|
|
28
35
|
export declare function deriveSenderAddress(userEmail: string | undefined, domain: string): string;
|
|
29
36
|
/**
|
|
@@ -50,11 +57,42 @@ export declare function isSenderAllowed(from: string, patterns: string[]): boole
|
|
|
50
57
|
* the address was derived server-side or chosen in a UI.
|
|
51
58
|
*/
|
|
52
59
|
export declare function assertSenderAllowed(from: string, patterns: string[]): void;
|
|
60
|
+
/**
|
|
61
|
+
* Local part of the default do-not-reply sender, used for mail that no user
|
|
62
|
+
* asked for and nobody can reply to.
|
|
63
|
+
*/
|
|
64
|
+
export declare const SYSTEM_SENDER_LOCAL_PART = "no-reply";
|
|
65
|
+
/** The sender fields {@link systemSenderAddress} reads, resolved or raw. */
|
|
66
|
+
type SenderSource = Pick<ResolvedSender, "systemFrom" | "domain" | "from">;
|
|
67
|
+
/**
|
|
68
|
+
* The address SYSTEM mail sends from, or undefined when nothing configured
|
|
69
|
+
* yields one: an explicit {@link ResolvedSender.systemFrom} wins, else
|
|
70
|
+
* `no-reply@<domain>`, else the fixed `from`.
|
|
71
|
+
*
|
|
72
|
+
* `no-reply@<domain>` outranks a configured `from` on purpose. A fixed `from` is
|
|
73
|
+
* typically a person or a team address chosen for mail a HUMAN sent, and a
|
|
74
|
+
* verification code arriving from it invites a reply nobody reads. Set
|
|
75
|
+
* `systemFrom` / EMAIL_SYSTEM_FROM to name the address explicitly (a monitored
|
|
76
|
+
* `support@`, a differently-spelled `donotreply@`).
|
|
77
|
+
*
|
|
78
|
+
* Returns undefined rather than throwing so config resolution can fold the
|
|
79
|
+
* result into the sender allow-list before any send happens.
|
|
80
|
+
*/
|
|
81
|
+
export declare function systemSenderAddress(source: SenderSource): string | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* The `From` for a send with no user in scope. Throws when no sender source is
|
|
84
|
+
* configured at all, which in SMTP mode {@link resolveEmailConfig} has already
|
|
85
|
+
* ruled out - so this only fires for an outbox with nothing configured.
|
|
86
|
+
*/
|
|
87
|
+
export declare function resolveSystemSenderAddress(config: ResolvedEmailConfig): string;
|
|
53
88
|
/**
|
|
54
89
|
* Resolve the `From` address for a send from the resolved config and the
|
|
55
|
-
* current OBO user
|
|
56
|
-
*
|
|
57
|
-
*
|
|
90
|
+
* current OBO user.
|
|
91
|
+
*
|
|
92
|
+
* With a user in scope: an explicit `from` wins, then `<local>@<domain>`, then
|
|
93
|
+
* (file/outbox mode only) the user's email verbatim. With NO user the send is
|
|
94
|
+
* system mail, so it goes from {@link resolveSystemSenderAddress}. Throws when
|
|
95
|
+
* none of those yield an address.
|
|
58
96
|
*/
|
|
59
97
|
export declare function resolveSenderAddress(config: ResolvedEmailConfig, userEmail: string | undefined): string;
|
|
60
98
|
/**
|
|
@@ -69,3 +107,4 @@ export declare function resolveSenderAddress(config: ResolvedEmailConfig, userEm
|
|
|
69
107
|
* ordered first.
|
|
70
108
|
*/
|
|
71
109
|
export declare function listSenderOptions(config: ResolvedEmailConfig, userEmail: string | undefined): string[];
|
|
110
|
+
export {};
|
package/lib/src/sender.js
CHANGED
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
* The default `From` re-homes the local part (everything before `@`) of
|
|
6
6
|
* the OBO email on the configured sending domain, so `alice@databricks.com`
|
|
7
7
|
* through a domain of `mail.example.com` goes out as
|
|
8
|
-
* `alice@mail.example.com`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `alice@mail.example.com`. Nothing has to be configured for that beyond the
|
|
9
|
+
* domain: a fixed `from` is an OVERRIDE, not a requirement. The file/outbox
|
|
10
|
+
* fallback (no domain) keeps the user's address verbatim so test artifacts land
|
|
11
|
+
* under a recognizable folder.
|
|
12
|
+
*
|
|
13
|
+
* A send with NO user in scope is SYSTEM mail - a sign-in code, a password
|
|
14
|
+
* reset, an alert - and goes from the do-not-reply address instead
|
|
15
|
+
* ({@link resolveSystemSenderAddress}), because a recipient cannot usefully
|
|
16
|
+
* reply to a machine and a human's address on machine mail invites them to try.
|
|
11
17
|
*
|
|
12
18
|
* The resolved `From` is then constrained to the effective allow-list: a
|
|
13
19
|
* pattern is either an exact address (`user@domain.com`), a domain wildcard
|
|
@@ -21,11 +27,12 @@
|
|
|
21
27
|
* @module
|
|
22
28
|
*/
|
|
23
29
|
import { ConfigurationError, ValidationError } from "@databricks/appkit";
|
|
24
|
-
import { log, net } from "@dbx-tools/shared-core";
|
|
30
|
+
import { log, net, string } from "@dbx-tools/shared-core";
|
|
25
31
|
const logger = log.logger("email/sender");
|
|
26
32
|
/**
|
|
27
|
-
* Re-home
|
|
28
|
-
*
|
|
33
|
+
* Re-home a user's local part on `domain`. Throws when no usable local part is
|
|
34
|
+
* available; callers with no user in scope want
|
|
35
|
+
* {@link resolveSystemSenderAddress} instead of a fixed `from`.
|
|
29
36
|
*/
|
|
30
37
|
export function deriveSenderAddress(userEmail, domain) {
|
|
31
38
|
const local = userEmail?.split("@")[0]?.trim();
|
|
@@ -89,21 +96,62 @@ export function assertSenderAllowed(from, patterns) {
|
|
|
89
96
|
logger.warn("sender:denied", { from, allowedSenders: patterns });
|
|
90
97
|
throw ValidationError.invalidValue("from", from, "an address permitted by the configured sender allow-list");
|
|
91
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Local part of the default do-not-reply sender, used for mail that no user
|
|
101
|
+
* asked for and nobody can reply to.
|
|
102
|
+
*/
|
|
103
|
+
export const SYSTEM_SENDER_LOCAL_PART = "no-reply";
|
|
104
|
+
/**
|
|
105
|
+
* The address SYSTEM mail sends from, or undefined when nothing configured
|
|
106
|
+
* yields one: an explicit {@link ResolvedSender.systemFrom} wins, else
|
|
107
|
+
* `no-reply@<domain>`, else the fixed `from`.
|
|
108
|
+
*
|
|
109
|
+
* `no-reply@<domain>` outranks a configured `from` on purpose. A fixed `from` is
|
|
110
|
+
* typically a person or a team address chosen for mail a HUMAN sent, and a
|
|
111
|
+
* verification code arriving from it invites a reply nobody reads. Set
|
|
112
|
+
* `systemFrom` / EMAIL_SYSTEM_FROM to name the address explicitly (a monitored
|
|
113
|
+
* `support@`, a differently-spelled `donotreply@`).
|
|
114
|
+
*
|
|
115
|
+
* Returns undefined rather than throwing so config resolution can fold the
|
|
116
|
+
* result into the sender allow-list before any send happens.
|
|
117
|
+
*/
|
|
118
|
+
export function systemSenderAddress(source) {
|
|
119
|
+
const explicit = string.trimToNull(source.systemFrom);
|
|
120
|
+
if (explicit)
|
|
121
|
+
return explicit;
|
|
122
|
+
const domain = string.trimToNull(source.domain);
|
|
123
|
+
if (domain)
|
|
124
|
+
return `${SYSTEM_SENDER_LOCAL_PART}@${domain}`;
|
|
125
|
+
return string.trimToNull(source.from) ?? undefined;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The `From` for a send with no user in scope. Throws when no sender source is
|
|
129
|
+
* configured at all, which in SMTP mode {@link resolveEmailConfig} has already
|
|
130
|
+
* ruled out - so this only fires for an outbox with nothing configured.
|
|
131
|
+
*/
|
|
132
|
+
export function resolveSystemSenderAddress(config) {
|
|
133
|
+
const address = systemSenderAddress(config);
|
|
134
|
+
if (address)
|
|
135
|
+
return address;
|
|
136
|
+
throw ConfigurationError.resourceNotFound("Email sender address", "Set `domain` / EMAIL_DOMAIN to send system mail as no-reply@<domain>, or `systemFrom` / EMAIL_SYSTEM_FROM to name the address.");
|
|
137
|
+
}
|
|
92
138
|
/**
|
|
93
139
|
* Resolve the `From` address for a send from the resolved config and the
|
|
94
|
-
* current OBO user
|
|
95
|
-
*
|
|
96
|
-
*
|
|
140
|
+
* current OBO user.
|
|
141
|
+
*
|
|
142
|
+
* With a user in scope: an explicit `from` wins, then `<local>@<domain>`, then
|
|
143
|
+
* (file/outbox mode only) the user's email verbatim. With NO user the send is
|
|
144
|
+
* system mail, so it goes from {@link resolveSystemSenderAddress}. Throws when
|
|
145
|
+
* none of those yield an address.
|
|
97
146
|
*/
|
|
98
147
|
export function resolveSenderAddress(config, userEmail) {
|
|
148
|
+
const email = string.trimToNull(userEmail);
|
|
149
|
+
if (!email)
|
|
150
|
+
return resolveSystemSenderAddress(config);
|
|
99
151
|
if (config.from)
|
|
100
152
|
return config.from;
|
|
101
153
|
if (config.domain)
|
|
102
|
-
return deriveSenderAddress(
|
|
103
|
-
const email = userEmail?.trim();
|
|
104
|
-
if (!email) {
|
|
105
|
-
throw ConfigurationError.resourceNotFound("Email sender address", "Set `from` / EMAIL_FROM, set `domain` / EMAIL_DOMAIN, or run on behalf of a user.");
|
|
106
|
-
}
|
|
154
|
+
return deriveSenderAddress(email, config.domain);
|
|
107
155
|
return email;
|
|
108
156
|
}
|
|
109
157
|
/**
|
|
@@ -149,4 +197,4 @@ export function listSenderOptions(config, userEmail) {
|
|
|
149
197
|
}
|
|
150
198
|
return options;
|
|
151
199
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJbEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsU0FBNkIsRUFBRSxNQUFjO0lBQy9FLE1BQU0sS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMseUJBQXlCLEVBQ3pCLCtFQUErRSxDQUNoRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sR0FBRyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQWtDO0lBQ3BFLE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsbUJBQW1CLENBQUMsT0FBZTtJQUMxQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RCxJQUFJLENBQUMsT0FBTyxDQUFDLFFB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RUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCx1RUFBdUU7SUFDekUsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLEtBQUssR0FBRztZQUFFLFNBQVMsQ0FBQyx3Q0FBd0M7UUFDdkUsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyRSxJQUFJLEtBQUs7Z0JBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZW5kZXItYWRkcmVzcyBwb2xpY3k6IHR1cm4gdGhlIG9uLWJlaGFsZi1vZiB1c2VyJ3MgZW1haWwgaW50byBhblxuICogb3V0Ym91bmQgYEZyb21gLCBhbmQgKG9wdGlvbmFsbHkpIHJlc3RyaWN0IHdoaWNoIGFkZHJlc3NlcyBtYXkgc2VuZC5cbiAqXG4gKiBUaGUgZGVmYXVsdCBgRnJvbWAgcmUtaG9tZXMgdGhlIGxvY2FsIHBhcnQgKGV2ZXJ5dGhpbmcgYmVmb3JlIGBAYCkgb2ZcbiAqIHRoZSBPQk8gZW1haWwgb24gdGhlIGNvbmZpZ3VyZWQgc2VuZGluZyBkb21haW4sIHNvIGBhbGljZUBkYXRhYnJpY2tzLmNvbWBcbiAqIHRocm91Z2ggYSBkb21haW4gb2YgYG1haWwuZXhhbXBsZS5jb21gIGdvZXMgb3V0IGFzXG4gKiBgYWxpY2VAbWFpbC5leGFtcGxlLmNvbWAuIEFuIGV4cGxpY2l0IGBmcm9tYCBzaG9ydC1jaXJjdWl0cyB0aGF0OyB0aGVcbiAqIGZpbGUvb3V0Ym94IGZhbGxiYWNrIChubyBkb21haW4pIGtlZXBzIHRoZSB1c2VyJ3MgYWRkcmVzcyB2ZXJiYXRpbSBzb1xuICogdGVzdCBhcnRpZmFjdHMgbGFuZCB1bmRlciBhIHJlY29nbml6YWJsZSBmb2xkZXIuXG4gKlxuICogVGhlIHJlc29sdmVkIGBGcm9tYCBpcyB0aGVuIGNvbnN0cmFpbmVkIHRvIHRoZSBlZmZlY3RpdmUgYWxsb3ctbGlzdDogYVxuICogcGF0dGVybiBpcyBlaXRoZXIgYW4gZXhhY3QgYWRkcmVzcyAoYHVzZXJAZG9tYWluLmNvbWApLCBhIGRvbWFpbiB3aWxkY2FyZFxuICogKGAqQGRvbWFpbi5jb21gIG9yIHRoZSBiYXJlIGBkb21haW4uY29tYCwgbWF0Y2hpbmcgYW55IGxvY2FsIHBhcnQgb24gdGhhdFxuICogZG9tYWluKSwgb3IgYCpgIChhbnkpLiBUaGlzIG1vZHVsZSBvbmx5IG1hdGNoZXMgcGF0dGVybnM7IHdoaWNoIHBhdHRlcm5zXG4gKiBhcHBseSBpcyBkZWNpZGVkIGJ5IHRoZSBjb25maWd1cmVkIHNlbmRlciBwb2xpY3kgaW4gYC4vY29uZmlnYCwgd2hpY2hcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGBcImFsbG93bGlzdFwiYCBtb2RlIGZpbGxzIGFuIGVtcHR5IGxpc3QgaW4gZnJvbSB0aGVcbiAqIHNlbmRlciBzb3VyY2UuIHtAbGluayBsaXN0U2VuZGVyT3B0aW9uc30gZXhwYW5kcyB0aGUgZWZmZWN0aXZlIGxpc3QgaW50b1xuICogdGhlIGNvbmNyZXRlIGFkZHJlc3NlcyBhIFVJIGRyb3Bkb3duIGNhbiBvZmZlciBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRFbWFpbENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZW1haWwvc2VuZGVyXCIpO1xuXG4vKipcbiAqIFJlLWhvbWUgdGhlIE9CTyB1c2VyJ3MgbG9jYWwgcGFydCBvbiBgZG9tYWluYC4gVGhyb3dzIHdoZW4gbm8gdXNhYmxlXG4gKiBsb2NhbCBwYXJ0IGlzIGF2YWlsYWJsZSAoZS5nLiBhIHNlcnZpY2UtY29udGV4dCBjYWxsIHdpdGggbm8gdXNlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTZW5kZXJBZGRyZXNzKHVzZXJFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBkb21haW46IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvY2FsID0gdXNlckVtYWlsPy5zcGxpdChcIkBcIilbMF0/LnRyaW0oKTtcbiAgaWYgKCFsb2NhbCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJPbi1iZWhhbGYtb2YgdXNlciBlbWFpbFwiLFxuICAgICAgXCJTZXQgYGZyb21gIC8gRU1BSUxfRlJPTSB0byBzZW5kIGZyb20gYSBmaXhlZCBhZGRyZXNzIGluc3RlYWQgb2YgZGVyaXZpbmcgb25lLlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke2xvY2FsfUAke2RvbWFpbn1gO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHNlbmRlciBhbGxvdy1saXN0IGZyb20gY29uZmlnIChhIGBzdHJpbmdbXWApIG9yIGFuIGVudiB2YXJcbiAqIChhIENTViAvIHdoaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZykuIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkXG4gKiB7QGxpbmsgbmV0LnBhcnNlRW1haWxzfSBzbyBhbGxvdy1saXN0IHBhdHRlcm5zIGFyZSByZWFkIGV4YWN0bHlcbiAqIGxpa2UgcmVjaXBpZW50IGxpc3RzIGVsc2V3aGVyZTogZW50cmllcyBhcmUgdHJpbW1lZCwgbG93ZXItY2FzZWQgKHNvXG4gKiBtYXRjaGluZyBpbiB7QGxpbmsgaXNTZW5kZXJBbGxvd2VkfSBpcyBjYXNlLWluc2Vuc2l0aXZlKSwgYW5kXG4gKiBkZS1kdXBsaWNhdGVkOyBlbXB0aWVzIGFyZSBkcm9wcGVkLiBBbiBlbXB0eSByZXN1bHQgbWVhbnMgXCJub1xuICogcmVzdHJpY3Rpb25cIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxsb3dlZFNlbmRlcnMocmF3OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5ldC5wYXJzZUVtYWlscyhyYXcsIHsgbG93ZXJjYXNlOiB0cnVlIH0pO1xufVxuXG4vKiogVGhlIGBAZG9tYWluYCBzdWZmaXggYSB3aWxkY2FyZCAvIGJhcmUtZG9tYWluIHBhdHRlcm4gbWF0Y2hlcywgZWxzZSBudWxsLiAqL1xuZnVuY3Rpb24gcGF0dGVybkRvbWFpblN1ZmZpeChwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIipAXCIpKSByZXR1cm4gYEAke3BhdHRlcm4uc2xpY2UoMil9YDtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKFwiQFwiKSkgcmV0dXJuIGBAJHtwYXR0ZXJufWA7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogV2hldGhlciBgYWRkcmVzc2AgKGFscmVhZHkgbG93ZXItY2FzZWQpIHNhdGlzZmllcyBhIHNpbmdsZSBwYXR0ZXJuLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oYWRkcmVzczogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IFwiKlwiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3Qgc3VmZml4ID0gcGF0dGVybkRvbWFpblN1ZmZpeChwYXR0ZXJuKTtcbiAgaWYgKHN1ZmZpeCkgcmV0dXJuIGFkZHJlc3MubGVuZ3RoID4gc3VmZml4Lmxlbmd0aCAmJiBhZGRyZXNzLmVuZHNXaXRoKHN1ZmZpeCk7XG4gIHJldHVybiBhZGRyZXNzID09PSBwYXR0ZXJuO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYGZyb21gIGlzIHBlcm1pdHRlZCBieSB0aGUgYWxsb3ctbGlzdC4gQW4gZW1wdHkgKG9yIGFic2VudClcbiAqIGFsbG93LWxpc3QgcGVybWl0cyBldmVyeXRoaW5nOiB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfSBpcyB3aGF0IHR1cm5zXG4gKiB0aGUgY29uZmlndXJlZCB7QGxpbmsgU2VuZGVyUG9saWN5fSBpbnRvIGNvbmNyZXRlIHBhdHRlcm5zLCBzbyBhbiBlbXB0eVxuICogbGlzdCBoZXJlIG1lYW5zIHRoZSBwb2xpY3kgaGFkIG5vdGhpbmcgdG8gbmFycm93IHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZW5kZXJBbGxvd2VkKGZyb206IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBjb25zdCBhZGRyZXNzID0gZnJvbS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IG1hdGNoZXNQYXR0ZXJuKGFkZHJlc3MsIHBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBUaHJvdyB3aGVuIGBmcm9tYCBpcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhbGxvdy1saXN0LiBOby1vcCB3aGVuIHRoZVxuICogYWxsb3ctbGlzdCBpcyBlbXB0eS4gVGhlIHNpbmdsZSBlbmZvcmNlbWVudCBwb2ludCBmb3IgdGhlIHJlc3RyaWN0aW9uXG4gKiAoY2FsbGVkIGZyb20ge0BsaW5rIHNlbmRFbWFpbH0pLCBzbyBldmVyeSBzZW5kIHBhdGggaXMgY292ZXJlZCB3aGV0aGVyXG4gKiB0aGUgYWRkcmVzcyB3YXMgZGVyaXZlZCBzZXJ2ZXItc2lkZSBvciBjaG9zZW4gaW4gYSBVSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNlbmRlckFsbG93ZWQoZnJvbTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGlzU2VuZGVyQWxsb3dlZChmcm9tLCBwYXR0ZXJucykpIHJldHVybjtcbiAgLy8gVGhlIHRocm93biBtZXNzYWdlIG5hbWVzIHRoZSBmaWVsZCBvbmx5OyB0aGUgcGF0dGVybnMgYXJlIHBvbGljeSBkZXRhaWxcbiAgLy8gdGhhdCBiZWxvbmdzIGluIHRoZSBvcGVyYXRvcidzIGxvZ3MsIG5vdCBpbiBhIGNsaWVudCBvciBtb2RlbCByZXNwb25zZS5cbiAgbG9nZ2VyLndhcm4oXCJzZW5kZXI6ZGVuaWVkXCIsIHsgZnJvbSwgYWxsb3dlZFNlbmRlcnM6IHBhdHRlcm5zIH0pO1xuICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgIFwiZnJvbVwiLFxuICAgIGZyb20sXG4gICAgXCJhbiBhZGRyZXNzIHBlcm1pdHRlZCBieSB0aGUgY29uZmlndXJlZCBzZW5kZXIgYWxsb3ctbGlzdFwiLFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGBGcm9tYCBhZGRyZXNzIGZvciBhIHNlbmQgZnJvbSB0aGUgcmVzb2x2ZWQgY29uZmlnIGFuZCB0aGVcbiAqIGN1cnJlbnQgT0JPIHVzZXI6IGV4cGxpY2l0IGBmcm9tYCB3aW5zLCB0aGVuIGA8bG9jYWw+QDxkb21haW4+YCwgdGhlblxuICogKGZpbGUvb3V0Ym94IG1vZGUgb25seSkgdGhlIHVzZXIncyBlbWFpbCB2ZXJiYXRpbS4gVGhyb3dzIHdoZW4gbm9uZSBvZlxuICogdGhvc2UgeWllbGQgYW4gYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZW5kZXJBZGRyZXNzKFxuICBjb25maWc6IFJlc29sdmVkRW1haWxDb25maWcsXG4gIHVzZXJFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5mcm9tKSByZXR1cm4gY29uZmlnLmZyb207XG4gIGlmIChjb25maWcuZG9tYWluKSByZXR1cm4gZGVyaXZlU2VuZGVyQWRkcmVzcyh1c2VyRW1haWwsIGNvbmZpZy5kb21haW4pO1xuICBjb25zdCBlbWFpbCA9IHVzZXJFbWFpbD8udHJpbSgpO1xuICBpZiAoIWVtYWlsKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBcIkVtYWlsIHNlbmRlciBhZGRyZXNzXCIsXG4gICAgICBcIlNldCBgZnJvbWAgLyBFTUFJTF9GUk9NLCBzZXQgYGRvbWFpbmAgLyBFTUFJTF9ET01BSU4sIG9yIHJ1biBvbiBiZWhhbGYgb2YgYSB1c2VyLlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGVtYWlsO1xufVxuXG4vKipcbiAqIEV4cGFuZCB0aGUgcmVzb2x2ZWQgY29uZmlnJ3MgYWxsb3ctbGlzdCBpbnRvIHRoZSBjb25jcmV0ZSBgRnJvbWBcbiAqIGFkZHJlc3NlcyBvZmZlcmVkIHRvIHRoZSBjdXJyZW50IHVzZXIgLSB0aGUgZGF0YSBhIFVJIHNlbmRlciBkcm9wZG93blxuICogcmVuZGVycy4gRXhhY3QtYWRkcmVzcyBwYXR0ZXJucyBwYXNzIHRocm91Z2g7IGRvbWFpbiB3aWxkY2FyZHNcbiAqIChgKkBkb21haW4uY29tYCAvIGJhcmUgYGRvbWFpbi5jb21gKSBhcmUgY29uY3JldGl6ZWQgYXNcbiAqIGA8dXNlci1sb2NhbD5APGRvbWFpbj5gIGFuZCBkcm9wcGVkIHdoZW4gbm8gT0JPIHVzZXIgbG9jYWwgcGFydCBpc1xuICogYXZhaWxhYmxlLiBXaGVuIG5vIGFsbG93LWxpc3QgaXMgY29uZmlndXJlZCwgdGhlIHNpbmdsZSBkZWZhdWx0IHNlbmRlclxuICogKHtAbGluayByZXNvbHZlU2VuZGVyQWRkcmVzc30pIGlzIHJldHVybmVkIHdoZW4gaXQgY2FuIGJlIHJlc29sdmVkLFxuICogZWxzZSBhbiBlbXB0eSBsaXN0LiBUaGUgZGVmYXVsdCByZXNvbHZlZCBzZW5kZXIsIHdoZW4gcGVybWl0dGVkLCBpc1xuICogb3JkZXJlZCBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZW5kZXJPcHRpb25zKFxuICBjb25maWc6IFJlc29sdmVkRW1haWxDb25maWcsXG4gIHVzZXJFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXR0ZXJucyA9IGNvbmZpZy5hbGxvd2VkU2VuZGVycyA/PyBbXTtcbiAgY29uc3QgbG9jYWwgPSB1c2VyRW1haWw/LnNwbGl0KFwiQFwiKVswXT8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFkZCA9IChhZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkID0+IHtcbiAgICBpZiAoYWRkcmVzcyAmJiAhb3B0aW9ucy5pbmNsdWRlcyhhZGRyZXNzKSkgb3B0aW9ucy5wdXNoKGFkZHJlc3MpO1xuICB9O1xuXG4gIC8vIFN1cmZhY2UgdGhlIGFkZHJlc3MgYSBzZW5kIHdvdWxkIHVzZSBieSBkZWZhdWx0IGZpcnN0LCB3aGVuIGl0IGNhblxuICAvLyBiZSByZXNvbHZlZCBhbmQgdGhlIGFsbG93LWxpc3QgKGlmIGFueSkgcGVybWl0cyBpdC5cbiAgdHJ5IHtcbiAgICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVTZW5kZXJBZGRyZXNzKGNvbmZpZywgdXNlckVtYWlsKTtcbiAgICBpZiAoaXNTZW5kZXJBbGxvd2VkKGZhbGxiYWNrLCBwYXR0ZXJucykpIGFkZChmYWxsYmFjay50b0xvd2VyQ2FzZSgpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gZGVmYXVsdCByZXNvbHZhYmxlIChlLmcuIGZpbGUgbW9kZSB3aXRoIG5vIHVzZXIgLyBkb21haW4gLyBmcm9tKS5cbiAgfVxuXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGlmIChwYXR0ZXJuID09PSBcIipcIikgY29udGludWU7IC8vIFwiYW55XCIgY2FuJ3QgYmUgZW51bWVyYXRlZCBhcyBhIGNob2ljZVxuICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIqQFwiKSB8fCAhcGF0dGVybi5pbmNsdWRlcyhcIkBcIikpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHBhdHRlcm4uc3RhcnRzV2l0aChcIipAXCIpID8gcGF0dGVybi5zbGljZSgyKSA6IHBhdHRlcm47XG4gICAgICBpZiAobG9jYWwpIGFkZChgJHtsb2NhbH1AJHtkb21haW59YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZChwYXR0ZXJuKTsgLy8gZXhhY3QgYWRkcmVzc1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cbiJdfQ==
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTFELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUE2QixFQUFFLE1BQWM7SUFDL0UsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2Qyx5QkFBeUIsRUFDekIsK0VBQStFLENBQ2hGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxHQUFHLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBa0M7SUFDcEUsT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsU0FBUyxtQkFBbUIsQ0FBQyxPQUFlO0lBQzFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUyxjQUFjLENBQUMsT0FBZSxFQUFFLE9BQWU7SUFDdEQsSUFBSSxPQUFPLEtBQUssR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTTtRQUFFLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUUsT0FBTyxPQUFPLEtBQUssT0FBTyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWSxFQUFFLFFBQWtCO0lBQzlELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsUUFBa0I7SUFDbEUsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUFFLE9BQU87SUFDNUMsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRSxNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQ2hDLE1BQU0sRUFDTixJQUFJLEVBQ0osMERBQTBELENBQzNELENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsVUFBVSxDQUFDO0FBS25EOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBb0I7SUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEQsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsSUFBSSxNQUFNO1FBQUUsT0FBTyxHQUFHLHdCQUF3QixJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQzNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ3JELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLE1BQTJCO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzVCLE1BQU0sa0JBQWtCLENBQUMsZ0JBQWdCLENBQ3ZDLHNCQUFzQixFQUN0QixnSUFBZ0ksQ0FDakksQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsTUFBMkIsRUFDM0IsU0FBNkI7SUFFN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsSUFBSSxNQUFNLENBQUMsSUFBSTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE1BQTJCLEVBQzNCLFNBQTZCO0lBRTdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQzdDLE1BQU0sS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBMkIsRUFBUSxFQUFFO1FBQ2hELElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQztJQUVGLHFFQUFxRTtJQUNyRSxzREFBc0Q7SUFDdEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7WUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHVFQUF1RTtJQUN6RSxDQUFDO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLE9BQU8sS0FBSyxHQUFHO1lBQUUsU0FBUyxDQUFDLHdDQUF3QztRQUN2RSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JFLElBQUksS0FBSztnQkFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlbmRlci1hZGRyZXNzIHBvbGljeTogdHVybiB0aGUgb24tYmVoYWxmLW9mIHVzZXIncyBlbWFpbCBpbnRvIGFuXG4gKiBvdXRib3VuZCBgRnJvbWAsIGFuZCAob3B0aW9uYWxseSkgcmVzdHJpY3Qgd2hpY2ggYWRkcmVzc2VzIG1heSBzZW5kLlxuICpcbiAqIFRoZSBkZWZhdWx0IGBGcm9tYCByZS1ob21lcyB0aGUgbG9jYWwgcGFydCAoZXZlcnl0aGluZyBiZWZvcmUgYEBgKSBvZlxuICogdGhlIE9CTyBlbWFpbCBvbiB0aGUgY29uZmlndXJlZCBzZW5kaW5nIGRvbWFpbiwgc28gYGFsaWNlQGRhdGFicmlja3MuY29tYFxuICogdGhyb3VnaCBhIGRvbWFpbiBvZiBgbWFpbC5leGFtcGxlLmNvbWAgZ29lcyBvdXQgYXNcbiAqIGBhbGljZUBtYWlsLmV4YW1wbGUuY29tYC4gTm90aGluZyBoYXMgdG8gYmUgY29uZmlndXJlZCBmb3IgdGhhdCBiZXlvbmQgdGhlXG4gKiBkb21haW46IGEgZml4ZWQgYGZyb21gIGlzIGFuIE9WRVJSSURFLCBub3QgYSByZXF1aXJlbWVudC4gVGhlIGZpbGUvb3V0Ym94XG4gKiBmYWxsYmFjayAobm8gZG9tYWluKSBrZWVwcyB0aGUgdXNlcidzIGFkZHJlc3MgdmVyYmF0aW0gc28gdGVzdCBhcnRpZmFjdHMgbGFuZFxuICogdW5kZXIgYSByZWNvZ25pemFibGUgZm9sZGVyLlxuICpcbiAqIEEgc2VuZCB3aXRoIE5PIHVzZXIgaW4gc2NvcGUgaXMgU1lTVEVNIG1haWwgLSBhIHNpZ24taW4gY29kZSwgYSBwYXNzd29yZFxuICogcmVzZXQsIGFuIGFsZXJ0IC0gYW5kIGdvZXMgZnJvbSB0aGUgZG8tbm90LXJlcGx5IGFkZHJlc3MgaW5zdGVhZFxuICogKHtAbGluayByZXNvbHZlU3lzdGVtU2VuZGVyQWRkcmVzc30pLCBiZWNhdXNlIGEgcmVjaXBpZW50IGNhbm5vdCB1c2VmdWxseVxuICogcmVwbHkgdG8gYSBtYWNoaW5lIGFuZCBhIGh1bWFuJ3MgYWRkcmVzcyBvbiBtYWNoaW5lIG1haWwgaW52aXRlcyB0aGVtIHRvIHRyeS5cbiAqXG4gKiBUaGUgcmVzb2x2ZWQgYEZyb21gIGlzIHRoZW4gY29uc3RyYWluZWQgdG8gdGhlIGVmZmVjdGl2ZSBhbGxvdy1saXN0OiBhXG4gKiBwYXR0ZXJuIGlzIGVpdGhlciBhbiBleGFjdCBhZGRyZXNzIChgdXNlckBkb21haW4uY29tYCksIGEgZG9tYWluIHdpbGRjYXJkXG4gKiAoYCpAZG9tYWluLmNvbWAgb3IgdGhlIGJhcmUgYGRvbWFpbi5jb21gLCBtYXRjaGluZyBhbnkgbG9jYWwgcGFydCBvbiB0aGF0XG4gKiBkb21haW4pLCBvciBgKmAgKGFueSkuIFRoaXMgbW9kdWxlIG9ubHkgbWF0Y2hlcyBwYXR0ZXJuczsgd2hpY2ggcGF0dGVybnNcbiAqIGFwcGx5IGlzIGRlY2lkZWQgYnkgdGhlIGNvbmZpZ3VyZWQgc2VuZGVyIHBvbGljeSBpbiBgLi9jb25maWdgLCB3aGljaFxuICogdW5kZXIgdGhlIGRlZmF1bHQgYFwiYWxsb3dsaXN0XCJgIG1vZGUgZmlsbHMgYW4gZW1wdHkgbGlzdCBpbiBmcm9tIHRoZVxuICogc2VuZGVyIHNvdXJjZS4ge0BsaW5rIGxpc3RTZW5kZXJPcHRpb25zfSBleHBhbmRzIHRoZSBlZmZlY3RpdmUgbGlzdCBpbnRvXG4gKiB0aGUgY29uY3JldGUgYWRkcmVzc2VzIGEgVUkgZHJvcGRvd24gY2FuIG9mZmVyIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgbmV0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkRW1haWxDb25maWcsIFJlc29sdmVkU2VuZGVyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJlbWFpbC9zZW5kZXJcIik7XG5cbi8qKlxuICogUmUtaG9tZSBhIHVzZXIncyBsb2NhbCBwYXJ0IG9uIGBkb21haW5gLiBUaHJvd3Mgd2hlbiBubyB1c2FibGUgbG9jYWwgcGFydCBpc1xuICogYXZhaWxhYmxlOyBjYWxsZXJzIHdpdGggbm8gdXNlciBpbiBzY29wZSB3YW50XG4gKiB7QGxpbmsgcmVzb2x2ZVN5c3RlbVNlbmRlckFkZHJlc3N9IGluc3RlYWQgb2YgYSBmaXhlZCBgZnJvbWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTZW5kZXJBZGRyZXNzKHVzZXJFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBkb21haW46IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvY2FsID0gdXNlckVtYWlsPy5zcGxpdChcIkBcIilbMF0/LnRyaW0oKTtcbiAgaWYgKCFsb2NhbCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJPbi1iZWhhbGYtb2YgdXNlciBlbWFpbFwiLFxuICAgICAgXCJTZXQgYGZyb21gIC8gRU1BSUxfRlJPTSB0byBzZW5kIGZyb20gYSBmaXhlZCBhZGRyZXNzIGluc3RlYWQgb2YgZGVyaXZpbmcgb25lLlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke2xvY2FsfUAke2RvbWFpbn1gO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHNlbmRlciBhbGxvdy1saXN0IGZyb20gY29uZmlnIChhIGBzdHJpbmdbXWApIG9yIGFuIGVudiB2YXJcbiAqIChhIENTViAvIHdoaXRlc3BhY2Utc2VwYXJhdGVkIHN0cmluZykuIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkXG4gKiB7QGxpbmsgbmV0LnBhcnNlRW1haWxzfSBzbyBhbGxvdy1saXN0IHBhdHRlcm5zIGFyZSByZWFkIGV4YWN0bHlcbiAqIGxpa2UgcmVjaXBpZW50IGxpc3RzIGVsc2V3aGVyZTogZW50cmllcyBhcmUgdHJpbW1lZCwgbG93ZXItY2FzZWQgKHNvXG4gKiBtYXRjaGluZyBpbiB7QGxpbmsgaXNTZW5kZXJBbGxvd2VkfSBpcyBjYXNlLWluc2Vuc2l0aXZlKSwgYW5kXG4gKiBkZS1kdXBsaWNhdGVkOyBlbXB0aWVzIGFyZSBkcm9wcGVkLiBBbiBlbXB0eSByZXN1bHQgbWVhbnMgXCJub1xuICogcmVzdHJpY3Rpb25cIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxsb3dlZFNlbmRlcnMocmF3OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5ldC5wYXJzZUVtYWlscyhyYXcsIHsgbG93ZXJjYXNlOiB0cnVlIH0pO1xufVxuXG4vKiogVGhlIGBAZG9tYWluYCBzdWZmaXggYSB3aWxkY2FyZCAvIGJhcmUtZG9tYWluIHBhdHRlcm4gbWF0Y2hlcywgZWxzZSBudWxsLiAqL1xuZnVuY3Rpb24gcGF0dGVybkRvbWFpblN1ZmZpeChwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aChcIipAXCIpKSByZXR1cm4gYEAke3BhdHRlcm4uc2xpY2UoMil9YDtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKFwiQFwiKSkgcmV0dXJuIGBAJHtwYXR0ZXJufWA7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogV2hldGhlciBgYWRkcmVzc2AgKGFscmVhZHkgbG93ZXItY2FzZWQpIHNhdGlzZmllcyBhIHNpbmdsZSBwYXR0ZXJuLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4oYWRkcmVzczogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IFwiKlwiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3Qgc3VmZml4ID0gcGF0dGVybkRvbWFpblN1ZmZpeChwYXR0ZXJuKTtcbiAgaWYgKHN1ZmZpeCkgcmV0dXJuIGFkZHJlc3MubGVuZ3RoID4gc3VmZml4Lmxlbmd0aCAmJiBhZGRyZXNzLmVuZHNXaXRoKHN1ZmZpeCk7XG4gIHJldHVybiBhZGRyZXNzID09PSBwYXR0ZXJuO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYGZyb21gIGlzIHBlcm1pdHRlZCBieSB0aGUgYWxsb3ctbGlzdC4gQW4gZW1wdHkgKG9yIGFic2VudClcbiAqIGFsbG93LWxpc3QgcGVybWl0cyBldmVyeXRoaW5nOiB7QGxpbmsgcmVzb2x2ZUVtYWlsQ29uZmlnfSBpcyB3aGF0IHR1cm5zXG4gKiB0aGUgY29uZmlndXJlZCB7QGxpbmsgU2VuZGVyUG9saWN5fSBpbnRvIGNvbmNyZXRlIHBhdHRlcm5zLCBzbyBhbiBlbXB0eVxuICogbGlzdCBoZXJlIG1lYW5zIHRoZSBwb2xpY3kgaGFkIG5vdGhpbmcgdG8gbmFycm93IHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZW5kZXJBbGxvd2VkKGZyb206IHN0cmluZywgcGF0dGVybnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBjb25zdCBhZGRyZXNzID0gZnJvbS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IG1hdGNoZXNQYXR0ZXJuKGFkZHJlc3MsIHBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBUaHJvdyB3aGVuIGBmcm9tYCBpcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhbGxvdy1saXN0LiBOby1vcCB3aGVuIHRoZVxuICogYWxsb3ctbGlzdCBpcyBlbXB0eS4gVGhlIHNpbmdsZSBlbmZvcmNlbWVudCBwb2ludCBmb3IgdGhlIHJlc3RyaWN0aW9uXG4gKiAoY2FsbGVkIGZyb20ge0BsaW5rIHNlbmRFbWFpbH0pLCBzbyBldmVyeSBzZW5kIHBhdGggaXMgY292ZXJlZCB3aGV0aGVyXG4gKiB0aGUgYWRkcmVzcyB3YXMgZGVyaXZlZCBzZXJ2ZXItc2lkZSBvciBjaG9zZW4gaW4gYSBVSS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNlbmRlckFsbG93ZWQoZnJvbTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGlzU2VuZGVyQWxsb3dlZChmcm9tLCBwYXR0ZXJucykpIHJldHVybjtcbiAgLy8gVGhlIHRocm93biBtZXNzYWdlIG5hbWVzIHRoZSBmaWVsZCBvbmx5OyB0aGUgcGF0dGVybnMgYXJlIHBvbGljeSBkZXRhaWxcbiAgLy8gdGhhdCBiZWxvbmdzIGluIHRoZSBvcGVyYXRvcidzIGxvZ3MsIG5vdCBpbiBhIGNsaWVudCBvciBtb2RlbCByZXNwb25zZS5cbiAgbG9nZ2VyLndhcm4oXCJzZW5kZXI6ZGVuaWVkXCIsIHsgZnJvbSwgYWxsb3dlZFNlbmRlcnM6IHBhdHRlcm5zIH0pO1xuICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgIFwiZnJvbVwiLFxuICAgIGZyb20sXG4gICAgXCJhbiBhZGRyZXNzIHBlcm1pdHRlZCBieSB0aGUgY29uZmlndXJlZCBzZW5kZXIgYWxsb3ctbGlzdFwiLFxuICApO1xufVxuXG4vKipcbiAqIExvY2FsIHBhcnQgb2YgdGhlIGRlZmF1bHQgZG8tbm90LXJlcGx5IHNlbmRlciwgdXNlZCBmb3IgbWFpbCB0aGF0IG5vIHVzZXJcbiAqIGFza2VkIGZvciBhbmQgbm9ib2R5IGNhbiByZXBseSB0by5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9TRU5ERVJfTE9DQUxfUEFSVCA9IFwibm8tcmVwbHlcIjtcblxuLyoqIFRoZSBzZW5kZXIgZmllbGRzIHtAbGluayBzeXN0ZW1TZW5kZXJBZGRyZXNzfSByZWFkcywgcmVzb2x2ZWQgb3IgcmF3LiAqL1xudHlwZSBTZW5kZXJTb3VyY2UgPSBQaWNrPFJlc29sdmVkU2VuZGVyLCBcInN5c3RlbUZyb21cIiB8IFwiZG9tYWluXCIgfCBcImZyb21cIj47XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgU1lTVEVNIG1haWwgc2VuZHMgZnJvbSwgb3IgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBjb25maWd1cmVkXG4gKiB5aWVsZHMgb25lOiBhbiBleHBsaWNpdCB7QGxpbmsgUmVzb2x2ZWRTZW5kZXIuc3lzdGVtRnJvbX0gd2lucywgZWxzZVxuICogYG5vLXJlcGx5QDxkb21haW4+YCwgZWxzZSB0aGUgZml4ZWQgYGZyb21gLlxuICpcbiAqIGBuby1yZXBseUA8ZG9tYWluPmAgb3V0cmFua3MgYSBjb25maWd1cmVkIGBmcm9tYCBvbiBwdXJwb3NlLiBBIGZpeGVkIGBmcm9tYCBpc1xuICogdHlwaWNhbGx5IGEgcGVyc29uIG9yIGEgdGVhbSBhZGRyZXNzIGNob3NlbiBmb3IgbWFpbCBhIEhVTUFOIHNlbnQsIGFuZCBhXG4gKiB2ZXJpZmljYXRpb24gY29kZSBhcnJpdmluZyBmcm9tIGl0IGludml0ZXMgYSByZXBseSBub2JvZHkgcmVhZHMuIFNldFxuICogYHN5c3RlbUZyb21gIC8gRU1BSUxfU1lTVEVNX0ZST00gdG8gbmFtZSB0aGUgYWRkcmVzcyBleHBsaWNpdGx5IChhIG1vbml0b3JlZFxuICogYHN1cHBvcnRAYCwgYSBkaWZmZXJlbnRseS1zcGVsbGVkIGBkb25vdHJlcGx5QGApLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHJhdGhlciB0aGFuIHRocm93aW5nIHNvIGNvbmZpZyByZXNvbHV0aW9uIGNhbiBmb2xkIHRoZVxuICogcmVzdWx0IGludG8gdGhlIHNlbmRlciBhbGxvdy1saXN0IGJlZm9yZSBhbnkgc2VuZCBoYXBwZW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3lzdGVtU2VuZGVyQWRkcmVzcyhzb3VyY2U6IFNlbmRlclNvdXJjZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gc3RyaW5nLnRyaW1Ub051bGwoc291cmNlLnN5c3RlbUZyb20pO1xuICBpZiAoZXhwbGljaXQpIHJldHVybiBleHBsaWNpdDtcbiAgY29uc3QgZG9tYWluID0gc3RyaW5nLnRyaW1Ub051bGwoc291cmNlLmRvbWFpbik7XG4gIGlmIChkb21haW4pIHJldHVybiBgJHtTWVNURU1fU0VOREVSX0xPQ0FMX1BBUlR9QCR7ZG9tYWlufWA7XG4gIHJldHVybiBzdHJpbmcudHJpbVRvTnVsbChzb3VyY2UuZnJvbSkgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBgRnJvbWAgZm9yIGEgc2VuZCB3aXRoIG5vIHVzZXIgaW4gc2NvcGUuIFRocm93cyB3aGVuIG5vIHNlbmRlciBzb3VyY2UgaXNcbiAqIGNvbmZpZ3VyZWQgYXQgYWxsLCB3aGljaCBpbiBTTVRQIG1vZGUge0BsaW5rIHJlc29sdmVFbWFpbENvbmZpZ30gaGFzIGFscmVhZHlcbiAqIHJ1bGVkIG91dCAtIHNvIHRoaXMgb25seSBmaXJlcyBmb3IgYW4gb3V0Ym94IHdpdGggbm90aGluZyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVN5c3RlbVNlbmRlckFkZHJlc3MoY29uZmlnOiBSZXNvbHZlZEVtYWlsQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgYWRkcmVzcyA9IHN5c3RlbVNlbmRlckFkZHJlc3MoY29uZmlnKTtcbiAgaWYgKGFkZHJlc3MpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICBcIkVtYWlsIHNlbmRlciBhZGRyZXNzXCIsXG4gICAgXCJTZXQgYGRvbWFpbmAgLyBFTUFJTF9ET01BSU4gdG8gc2VuZCBzeXN0ZW0gbWFpbCBhcyBuby1yZXBseUA8ZG9tYWluPiwgb3IgYHN5c3RlbUZyb21gIC8gRU1BSUxfU1lTVEVNX0ZST00gdG8gbmFtZSB0aGUgYWRkcmVzcy5cIixcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBgRnJvbWAgYWRkcmVzcyBmb3IgYSBzZW5kIGZyb20gdGhlIHJlc29sdmVkIGNvbmZpZyBhbmQgdGhlXG4gKiBjdXJyZW50IE9CTyB1c2VyLlxuICpcbiAqIFdpdGggYSB1c2VyIGluIHNjb3BlOiBhbiBleHBsaWNpdCBgZnJvbWAgd2lucywgdGhlbiBgPGxvY2FsPkA8ZG9tYWluPmAsIHRoZW5cbiAqIChmaWxlL291dGJveCBtb2RlIG9ubHkpIHRoZSB1c2VyJ3MgZW1haWwgdmVyYmF0aW0uIFdpdGggTk8gdXNlciB0aGUgc2VuZCBpc1xuICogc3lzdGVtIG1haWwsIHNvIGl0IGdvZXMgZnJvbSB7QGxpbmsgcmVzb2x2ZVN5c3RlbVNlbmRlckFkZHJlc3N9LiBUaHJvd3Mgd2hlblxuICogbm9uZSBvZiB0aG9zZSB5aWVsZCBhbiBhZGRyZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlbmRlckFkZHJlc3MoXG4gIGNvbmZpZzogUmVzb2x2ZWRFbWFpbENvbmZpZyxcbiAgdXNlckVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBlbWFpbCA9IHN0cmluZy50cmltVG9OdWxsKHVzZXJFbWFpbCk7XG4gIGlmICghZW1haWwpIHJldHVybiByZXNvbHZlU3lzdGVtU2VuZGVyQWRkcmVzcyhjb25maWcpO1xuICBpZiAoY29uZmlnLmZyb20pIHJldHVybiBjb25maWcuZnJvbTtcbiAgaWYgKGNvbmZpZy5kb21haW4pIHJldHVybiBkZXJpdmVTZW5kZXJBZGRyZXNzKGVtYWlsLCBjb25maWcuZG9tYWluKTtcbiAgcmV0dXJuIGVtYWlsO1xufVxuXG4vKipcbiAqIEV4cGFuZCB0aGUgcmVzb2x2ZWQgY29uZmlnJ3MgYWxsb3ctbGlzdCBpbnRvIHRoZSBjb25jcmV0ZSBgRnJvbWBcbiAqIGFkZHJlc3NlcyBvZmZlcmVkIHRvIHRoZSBjdXJyZW50IHVzZXIgLSB0aGUgZGF0YSBhIFVJIHNlbmRlciBkcm9wZG93blxuICogcmVuZGVycy4gRXhhY3QtYWRkcmVzcyBwYXR0ZXJucyBwYXNzIHRocm91Z2g7IGRvbWFpbiB3aWxkY2FyZHNcbiAqIChgKkBkb21haW4uY29tYCAvIGJhcmUgYGRvbWFpbi5jb21gKSBhcmUgY29uY3JldGl6ZWQgYXNcbiAqIGA8dXNlci1sb2NhbD5APGRvbWFpbj5gIGFuZCBkcm9wcGVkIHdoZW4gbm8gT0JPIHVzZXIgbG9jYWwgcGFydCBpc1xuICogYXZhaWxhYmxlLiBXaGVuIG5vIGFsbG93LWxpc3QgaXMgY29uZmlndXJlZCwgdGhlIHNpbmdsZSBkZWZhdWx0IHNlbmRlclxuICogKHtAbGluayByZXNvbHZlU2VuZGVyQWRkcmVzc30pIGlzIHJldHVybmVkIHdoZW4gaXQgY2FuIGJlIHJlc29sdmVkLFxuICogZWxzZSBhbiBlbXB0eSBsaXN0LiBUaGUgZGVmYXVsdCByZXNvbHZlZCBzZW5kZXIsIHdoZW4gcGVybWl0dGVkLCBpc1xuICogb3JkZXJlZCBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZW5kZXJPcHRpb25zKFxuICBjb25maWc6IFJlc29sdmVkRW1haWxDb25maWcsXG4gIHVzZXJFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXR0ZXJucyA9IGNvbmZpZy5hbGxvd2VkU2VuZGVycyA/PyBbXTtcbiAgY29uc3QgbG9jYWwgPSB1c2VyRW1haWw/LnNwbGl0KFwiQFwiKVswXT8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFkZCA9IChhZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkID0+IHtcbiAgICBpZiAoYWRkcmVzcyAmJiAhb3B0aW9ucy5pbmNsdWRlcyhhZGRyZXNzKSkgb3B0aW9ucy5wdXNoKGFkZHJlc3MpO1xuICB9O1xuXG4gIC8vIFN1cmZhY2UgdGhlIGFkZHJlc3MgYSBzZW5kIHdvdWxkIHVzZSBieSBkZWZhdWx0IGZpcnN0LCB3aGVuIGl0IGNhblxuICAvLyBiZSByZXNvbHZlZCBhbmQgdGhlIGFsbG93LWxpc3QgKGlmIGFueSkgcGVybWl0cyBpdC5cbiAgdHJ5IHtcbiAgICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVTZW5kZXJBZGRyZXNzKGNvbmZpZywgdXNlckVtYWlsKTtcbiAgICBpZiAoaXNTZW5kZXJBbGxvd2VkKGZhbGxiYWNrLCBwYXR0ZXJucykpIGFkZChmYWxsYmFjay50b0xvd2VyQ2FzZSgpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gZGVmYXVsdCByZXNvbHZhYmxlIChlLmcuIGZpbGUgbW9kZSB3aXRoIG5vIHVzZXIgLyBkb21haW4gLyBmcm9tKS5cbiAgfVxuXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGlmIChwYXR0ZXJuID09PSBcIipcIikgY29udGludWU7IC8vIFwiYW55XCIgY2FuJ3QgYmUgZW51bWVyYXRlZCBhcyBhIGNob2ljZVxuICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIqQFwiKSB8fCAhcGF0dGVybi5pbmNsdWRlcyhcIkBcIikpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHBhdHRlcm4uc3RhcnRzV2l0aChcIipAXCIpID8gcGF0dGVybi5zbGljZSgyKSA6IHBhdHRlcm47XG4gICAgICBpZiAobG9jYWwpIGFkZChgJHtsb2NhbH1AJHtkb21haW59YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZChwYXR0ZXJuKTsgLy8gZXhhY3QgYWRkcmVzc1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cbiJdfQ==
|
package/lib/src/transport.d.ts
CHANGED
|
@@ -89,18 +89,28 @@ export declare function verifyEmailTransport(transporter: Transporter | undefine
|
|
|
89
89
|
* Delivery-time options that are NOT part of the message a model composes.
|
|
90
90
|
*
|
|
91
91
|
* Deliberately separate from {@link EmailMessage}: that schema is the agent
|
|
92
|
-
* tool's input, so anything added to it becomes a field a model can set.
|
|
93
|
-
*
|
|
94
|
-
* line, and its content is derived from the deployment's own domain), so it is
|
|
95
|
-
* the caller's to supply, never the model's.
|
|
92
|
+
* tool's input, so anything added to it becomes a field a model can set. These
|
|
93
|
+
* describe how a message is DELIVERED, so they are the caller's to supply.
|
|
96
94
|
*/
|
|
97
95
|
export interface SendEmailOptions {
|
|
98
96
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
97
|
+
* An explicit `text/plain` alternative, replacing the one generated from the
|
|
98
|
+
* React Email tree. The HTML part is untouched, so the recipient still gets the
|
|
99
|
+
* full branded template.
|
|
100
|
+
*
|
|
101
|
+
* This exists because the generated text part is a RENDERING of the HTML: it
|
|
102
|
+
* carries the brand header and footer, and it turns CSS margin into blank
|
|
103
|
+
* lines. That is fine for prose and wrong for content a machine parses. A
|
|
104
|
+
* one-time-code email is the case in point - clients look for the code on the
|
|
105
|
+
* line immediately after the prompt, and a styled `<h2>` code lands two blank
|
|
106
|
+
* lines below it, so autofill stops being offered even though the HTML looks
|
|
107
|
+
* perfect. Supplying the text part directly keeps the nice template AND the
|
|
108
|
+
* layout those clients expect.
|
|
109
|
+
*
|
|
110
|
+
* Keep the same information in both parts; a text alternative that disagrees
|
|
111
|
+
* with the HTML reads as phishing to spam filters.
|
|
102
112
|
*/
|
|
103
|
-
|
|
113
|
+
text?: string;
|
|
104
114
|
}
|
|
105
115
|
/**
|
|
106
116
|
* Send (SMTP mode) or persist (file/outbox mode) one message from the
|