@dbx-tools/shared-email-template 0.6.51 → 0.6.53

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 CHANGED
@@ -40,6 +40,36 @@ import { EmailDocument } from "@dbx-tools/shared-email-template";
40
40
  Node runtimes should pass this component to `@react-email/render`.
41
41
  `@dbx-tools/email` does that automatically for SMTP and local outbox delivery.
42
42
 
43
+ ## Bind A One-Time Code To Your Domain
44
+
45
+ Apple's AutoFill can tie a code to a specific website, so the keyboard offers it
46
+ only on the matching domain - which is what stops a code phished from one site
47
+ being autofilled into another. The format is `@<domain> #<code>` and iOS honours
48
+ it only as the message's **final** line, so it is a document-level `trailer` prop
49
+ rather than something a caller appends to `body` (the branded footer renders after
50
+ the body).
51
+
52
+ ```tsx
53
+ import { autofillTrailer, EmailDocument } from "@dbx-tools/shared-email-template";
54
+
55
+ <EmailDocument
56
+ subject="Your verification code"
57
+ body={"Your verification code is:\n\n## 123456"}
58
+ trailer={autofillTrailer("demo.apps.dbx.tools", "123456")}
59
+ />;
60
+ ```
61
+
62
+ `autofillTrailer()` normalizes a configured URL down to the bare host iOS matches
63
+ on (scheme, `www.`, port, path, and trailing dot are stripped) and returns
64
+ `undefined` when there is nothing to match - no domain, no code, or a hostless
65
+ value like `localhost`. Passing `undefined` renders no trailer, so a deployment
66
+ without a public domain simply omits it.
67
+
68
+ This is a strict upgrade on top of the conventional layout, never a replacement:
69
+ a prompt line followed by the bare code alone is what iOS, Gmail, Outlook, and
70
+ Android already detect heuristically. `@dbx-tools/email` accepts the built string
71
+ as a delivery option (`sendEmail(message, from, signal, { trailer })`).
72
+
43
73
  ## Reuse The Body Preview
44
74
 
45
75
  ```tsx
@@ -74,8 +104,8 @@ font, name, tagline, website, and fetchable logo URL.
74
104
 
75
105
  ## Modules
76
106
 
77
- - `.` - `EmailDocument`, `EmailCard`, `EmailBody`, brand types/defaults, and
78
- content normalization.
107
+ - `.` - `EmailDocument`, `EmailCard`, `EmailBody`, `autofillTrailer()`, brand
108
+ types/defaults, and content normalization.
79
109
 
80
110
  Pair this package with [`@dbx-tools/shared-email`](../email) for wire schemas,
81
111
  [`@dbx-tools/email`](../../node/email) for delivery, and
package/index.ts CHANGED
@@ -3,5 +3,5 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export * as template from "./src/template.tsx";
6
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
6
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
7
7
  export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
package/lib/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export * as template from "./src/template.tsx";
2
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.tsx";
2
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.tsx";
3
3
  export type { EmailBrand, ResolvedEmailBrand, EmailBodyProps, EmailDocumentProps } from "./src/template.tsx";
package/lib/index.js CHANGED
@@ -2,5 +2,5 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export * as template from "./src/template.js";
5
- export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, EmailCard, EmailDocument } from "./src/template.js";
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgdGVtcGxhdGUgZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHsgZW1haWxCcmFuZEZyb21Db250ZXh0LCBkZWZhdWx0RW1haWxCcmFuZCwgcmVzb2x2ZUVtYWlsQnJhbmQsIG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24sIEVtYWlsQm9keSwgRW1haWxDYXJkLCBFbWFpbERvY3VtZW50IH0gZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEJyYW5kLCBSZXNvbHZlZEVtYWlsQnJhbmQsIEVtYWlsQm9keVByb3BzLCBFbWFpbERvY3VtZW50UHJvcHMgfSBmcm9tIFwiLi9zcmMvdGVtcGxhdGUudHN4XCI7XG4iXX0=
5
+ export { emailBrandFromContext, defaultEmailBrand, resolveEmailBrand, normalizeEmailMarkdown, EmailBody, autofillTrailer, EmailCard, EmailDocument } from "./src/template.js";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIHRlbXBsYXRlIGZyb20gXCIuL3NyYy90ZW1wbGF0ZS50c3hcIjtcbmV4cG9ydCB7IGVtYWlsQnJhbmRGcm9tQ29udGV4dCwgZGVmYXVsdEVtYWlsQnJhbmQsIHJlc29sdmVFbWFpbEJyYW5kLCBub3JtYWxpemVFbWFpbE1hcmtkb3duLCBFbWFpbEJvZHksIGF1dG9maWxsVHJhaWxlciwgRW1haWxDYXJkLCBFbWFpbERvY3VtZW50IH0gZnJvbSBcIi4vc3JjL3RlbXBsYXRlLnRzeFwiO1xuZXhwb3J0IHR5cGUgeyBFbWFpbEJyYW5kLCBSZXNvbHZlZEVtYWlsQnJhbmQsIEVtYWlsQm9keVByb3BzLCBFbWFpbERvY3VtZW50UHJvcHMgfSBmcm9tIFwiLi9zcmMvdGVtcGxhdGUudHN4XCI7XG4iXX0=
@@ -5,6 +5,11 @@
5
5
  * the body component is reused directly by browser approval and compose views.
6
6
  * Both default to the repository brand while accepting a consumer override.
7
7
  *
8
+ * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
9
+ * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
10
+ * the message's final line - hence a document-level prop rather than something a
11
+ * caller can append to `body`.
12
+ *
8
13
  * @module
9
14
  */
10
15
  import { type BrandContext } from "@dbx-tools/shared-core";
@@ -46,7 +51,43 @@ export interface EmailDocumentProps extends EmailBodyProps {
46
51
  subject?: string;
47
52
  headers?: ReadonlyArray<readonly [string, string]>;
48
53
  footer?: string;
54
+ /**
55
+ * A machine-read line emitted as the very LAST line of both MIME parts, after
56
+ * the branded footer and outside the card.
57
+ *
58
+ * This exists for Apple's domain-bound one-time-code AutoFill, whose format is
59
+ * `@<domain> #<code>` and which iOS only honours when it is the final line of
60
+ * the message - so it cannot be appended to `body`, which the branded footer
61
+ * would then follow. Rendered as visible-but-quiet text rather than hidden
62
+ * (`display: none` content is a spam signal, and a client that ignores the
63
+ * convention should show something innocuous rather than nothing).
64
+ *
65
+ * See {@link autofillTrailer}, which builds the string.
66
+ */
67
+ trailer?: string;
49
68
  }
69
+ /**
70
+ * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
71
+ * when either part is missing.
72
+ *
73
+ * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
74
+ * offers the code only for the matching domain, which is what stops a code
75
+ * phished from one site being autofilled into another. Without it, iOS still
76
+ * detects a code heuristically from the conventional layout (prompt line, bare
77
+ * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
78
+ * strict upgrade on top of that baseline, never a replacement for it.
79
+ *
80
+ * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
81
+ * path, and a trailing dot are stripped, since iOS matches the host the site is
82
+ * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
83
+ * public host of a real deployment, and a trailer iOS will never match is just a
84
+ * confusing line in the email.
85
+ *
86
+ * @example
87
+ * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
88
+ * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
89
+ */
90
+ export declare const autofillTrailer: (domain: string | undefined, code: string | undefined) => string | undefined;
50
91
  /** Branded message card shared by the full document and browser previews. */
51
92
  export declare const EmailCard: ({ body, subject, headers, footer, brand: brandInput, }: EmailDocumentProps) => React.JSX.Element;
52
93
  /** Complete responsive, branded React Email document. */
@@ -6,6 +6,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  * the body component is reused directly by browser approval and compose views.
7
7
  * Both default to the repository brand while accepting a consumer override.
8
8
  *
9
+ * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
10
+ * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
11
+ * the message's final line - hence a document-level prop rather than something a
12
+ * caller can append to `body`.
13
+ *
9
14
  * @module
10
15
  */
11
16
  import { brand } from "@dbx-tools/shared-core";
@@ -124,6 +129,42 @@ export const EmailBody = ({ body, brand: brandInput }) => {
124
129
  },
125
130
  }, children: normalizeEmailMarkdown(body) }));
126
131
  };
132
+ /**
133
+ * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
134
+ * when either part is missing.
135
+ *
136
+ * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
137
+ * offers the code only for the matching domain, which is what stops a code
138
+ * phished from one site being autofilled into another. Without it, iOS still
139
+ * detects a code heuristically from the conventional layout (prompt line, bare
140
+ * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
141
+ * strict upgrade on top of that baseline, never a replacement for it.
142
+ *
143
+ * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
144
+ * path, and a trailing dot are stripped, since iOS matches the host the site is
145
+ * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
146
+ * public host of a real deployment, and a trailer iOS will never match is just a
147
+ * confusing line in the email.
148
+ *
149
+ * @example
150
+ * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
151
+ * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
152
+ */
153
+ export const autofillTrailer = (domain, code) => {
154
+ if (!domain || !code)
155
+ return undefined;
156
+ const host = domain
157
+ .trim()
158
+ .toLowerCase()
159
+ .replace(/^[a-z][a-z\d+.-]*:\/\//, "")
160
+ .replace(/^www\./, "")
161
+ .replace(/[/?#].*$/, "")
162
+ .replace(/\.$/, "")
163
+ .replace(/:\d+$/, "");
164
+ if (!host.includes("."))
165
+ return undefined;
166
+ return `@${host} #${code.trim()}`;
167
+ };
127
168
  function BrandMark({ theme }) {
128
169
  if (theme.logoUrl) {
129
170
  return (_jsx(Img, { src: theme.logoUrl, alt: theme.name, height: "34", style: { display: "block", height: "34px", width: "auto" } }));
@@ -180,6 +221,26 @@ export const EmailCard = ({ body, subject = "Message", headers, footer, brand: b
180
221
  textDecoration: "none",
181
222
  }, children: theme.name })) : null] }) })] }));
182
223
  };
224
+ /**
225
+ * The machine-read trailer line, rendered LAST and outside the card.
226
+ *
227
+ * Deliberately the final element of `<Body>`: iOS only binds a code to a domain
228
+ * when `@<domain> #<code>` is the last line of the message, so nothing - not even
229
+ * the branded footer - may follow it. Styled small and muted rather than hidden,
230
+ * because `display: none` text is a spam-filter signal.
231
+ */
232
+ function AutofillTrailer({ trailer, theme, }) {
233
+ if (!trailer)
234
+ return null;
235
+ return (_jsx(Text, { style: {
236
+ color: theme.muted,
237
+ fontFamily: theme.fontFamily,
238
+ fontSize: "11px",
239
+ margin: "16px auto 0",
240
+ maxWidth: "620px",
241
+ textAlign: "center",
242
+ }, children: trailer }));
243
+ }
183
244
  /** Complete responsive, branded React Email document. */
184
245
  export const EmailDocument = (props) => {
185
246
  const theme = resolveEmailBrand(props.brand);
@@ -189,6 +250,6 @@ export const EmailDocument = (props) => {
189
250
  margin: 0,
190
251
  padding: "28px 12px",
191
252
  };
192
- return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }), _jsx(Body, { style: pageStyle, children: _jsx(EmailCard, { ...props }) })] }));
253
+ return (_jsxs(Html, { lang: "en", children: [_jsx(Head, {}), _jsx(Preview, { children: props.subject ?? "Message" }), _jsxs(Body, { style: pageStyle, children: [_jsx(EmailCard, { ...props }), _jsx(AutofillTrailer, { trailer: props.trailer, theme: theme })] })] }));
193
254
  };
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQXFCLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsRUFBRSxFQUNGLElBQUksRUFDSixHQUFHLEVBQ0gsSUFBSSxFQUNKLFFBQVEsRUFDUixPQUFPLEVBQ1AsR0FBRyxFQUNILE9BQU8sRUFDUCxJQUFJLEdBQ0wsTUFBTSx5QkFBeUIsQ0FBQztBQXFDakMsU0FBUyxvQkFBb0IsQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQXFCLEVBQWMsRUFBRTtJQUN6RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ25FLE9BQU87UUFDTCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzlCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDbEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUNsQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ3JDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTTtRQUM3QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTztRQUM5QixHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDekQsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUU5RixrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFrQixFQUFzQixFQUFFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ2xELE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUztRQUN0QyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUk7UUFDbkQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQ3pFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsVUFBVTtRQUN0RSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFDNUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLO1FBQzdELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTTtRQUNoRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTztRQUM1RCxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3ZELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRTtJQUM5RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUMsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkYsQ0FBQyxDQUFDO0FBUUYsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQWtCLEVBQUUsRUFBRTtJQUN2RSxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxPQUFPLENBQ0wsS0FBQyxRQUFRLElBQ1AsdUJBQXVCLEVBQUU7WUFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQ3ZCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixRQUFRLEVBQUUsTUFBTTtZQUNoQixVQUFVLEVBQUUsTUFBTTtTQUNuQixFQUNELG9CQUFvQixFQUFFO1lBQ3BCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFO1lBQ3hGLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFO1lBQzNGLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFO1lBQzNGLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUU7WUFDekIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO1lBQzNFLFVBQVUsRUFBRTtnQkFDVixlQUFlLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ2pDLFVBQVUsRUFBRSxhQUFhLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZDLFlBQVksRUFBRSxlQUFlO2dCQUM3QixLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ3ZCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixPQUFPLEVBQUUsV0FBVzthQUNyQjtZQUNELFVBQVUsRUFBRTtnQkFDVixlQUFlLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ2pDLFlBQVksRUFBRSxLQUFLO2dCQUNuQixLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ3ZCLFVBQVUsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQ3JELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsU0FBUzthQUNuQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxlQUFlLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ2pDLFlBQVksRUFBRSxNQUFNO2dCQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUk7Z0JBQ3JELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixVQUFVLEVBQUUsTUFBTTtnQkFDbEIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE9BQU8sRUFBRSxNQUFNO2FBQ2hCO1lBQ0QsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtZQUNuRCxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUNqRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQ3ZCLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQ3RFLEVBQUUsRUFBRTtnQkFDRixlQUFlLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQ2pDLE1BQU0sRUFBRSxhQUFhLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ25DLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixTQUFTLEVBQUUsTUFBTTthQUNsQjtZQUNELEVBQUUsRUFBRTtnQkFDRixNQUFNLEVBQUUsYUFBYSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNuQyxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsU0FBUyxFQUFFLE1BQU07YUFDbEI7U0FDRixZQUVBLHNCQUFzQixDQUFDLElBQUksQ0FBQyxHQUNwQixDQUNaLENBQUM7QUFDSixDQUFDLENBQUM7QUFTRixTQUFTLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBaUM7SUFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUNMLEtBQUMsR0FBRyxJQUNGLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFDZixNQUFNLEVBQUMsSUFBSSxFQUNYLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQzFELENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLENBQ0wsS0FBQyxJQUFJLElBQ0gsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3JCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsYUFBYSxFQUFFLFFBQVE7WUFDdkIsTUFBTSxFQUFFLENBQUM7U0FDVixZQUVBLEtBQUssQ0FBQyxJQUFJLEdBQ04sQ0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQ3ZCLE9BQU8sRUFDUCxLQUFLLEdBSU47SUFDQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsQyxPQUFPLENBQ0wsS0FBQyxPQUFPLElBQ04sS0FBSyxFQUFFO1lBQ0wsZUFBZSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE9BQU8sRUFBRSxXQUFXO1NBQ3JCLFlBRUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUMvQixNQUFDLEdBQUcsZUFDRixLQUFDLE1BQU0sSUFDTCxLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO3dCQUNsQixRQUFRLEVBQUUsTUFBTTt3QkFDaEIsVUFBVSxFQUFFLEdBQUc7d0JBQ2YsT0FBTyxFQUFFLGdCQUFnQjt3QkFDekIsS0FBSyxFQUFFLE1BQU07cUJBQ2QsWUFFQSxLQUFLLEdBQ0MsRUFDVCxLQUFDLE1BQU0sSUFBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFDM0UsS0FBSyxHQUNDLEtBZEQsR0FBRyxLQUFLLElBQUksS0FBSyxFQUFFLENBZXZCLENBQ1AsQ0FBQyxHQUNNLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsRUFDeEIsSUFBSSxFQUNKLE9BQU8sR0FBRyxTQUFTLEVBQ25CLE9BQU8sRUFDUCxNQUFNLEVBQ04sS0FBSyxFQUFFLFVBQVUsR0FDRSxFQUFFLEVBQUU7SUFDdkIsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsT0FBTyxDQUNMLE1BQUMsU0FBUyxJQUNSLEtBQUssRUFBRTtZQUNMLGVBQWUsRUFBRSxLQUFLLENBQUMsT0FBTztZQUM5QixNQUFNLEVBQUUsYUFBYSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ25DLFlBQVksRUFBRSxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxnQ0FBZ0M7WUFDM0MsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLGFBRUQsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUNyRSxLQUFDLFNBQVMsSUFBQyxLQUFLLEVBQUUsS0FBSyxHQUFJLEdBQ25CLEVBQ1YsTUFBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQzNDLEtBQUMsT0FBTyxJQUNOLEtBQUssRUFBRTs0QkFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLFVBQVU7NEJBQ3ZCLFFBQVEsRUFBRSxNQUFNOzRCQUNoQixhQUFhLEVBQUUsUUFBUTs0QkFDdkIsVUFBVSxFQUFFLEtBQUs7NEJBQ2pCLE1BQU0sRUFBRSxVQUFVO3lCQUNuQixZQUVBLE9BQU8sR0FDQSxFQUNWLEtBQUMsZUFBZSxJQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBSSxFQUNuRCxLQUFDLFNBQVMsSUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUksSUFDL0IsRUFDVixLQUFDLEVBQUUsSUFBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUksRUFDdkQsS0FBQyxPQUFPLElBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQzNDLE1BQUMsSUFBSSxJQUNILEtBQUssRUFBRTt3QkFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0JBQ2xCLFFBQVEsRUFBRSxNQUFNO3dCQUNoQixVQUFVLEVBQUUsTUFBTTt3QkFDbEIsTUFBTSxFQUFFLENBQUM7cUJBQ1YsYUFFQSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQzVCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2YsS0FBQyxJQUFJLElBQ0gsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQ25CLEtBQUssRUFBRTtnQ0FDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0NBQ25CLGNBQWMsRUFBRSxNQUFNOzZCQUN2QixZQUVBLEtBQUssQ0FBQyxJQUFJLEdBQ04sQ0FDUixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQ0gsR0FDQyxJQUNBLENBQ2IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUF5QixFQUFFLEVBQUU7SUFDekQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUF3QjtRQUNyQyxlQUFlLEVBQUUsS0FBSyxDQUFDLFVBQVU7UUFDakMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLFdBQVc7S0FDckIsQ0FBQztJQUNGLE9BQU8sQ0FDTCxNQUFDLElBQUksSUFBQyxJQUFJLEVBQUMsSUFBSSxhQUNiLEtBQUMsSUFBSSxLQUFHLEVBQ1IsS0FBQyxPQUFPLGNBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEdBQVcsRUFDL0MsS0FBQyxJQUFJLElBQUMsS0FBSyxFQUFFLFNBQVMsWUFDcEIsS0FBQyxTQUFTLE9BQUssS0FBSyxHQUFJLEdBQ25CLElBQ0YsQ0FDUixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbml2ZXJzYWwgUmVhY3QgRW1haWwgcHJlc2VudGF0aW9uIGZvciBkYngtdG9vbHMgZW1haWwgZmxvd3MuXG4gKlxuICogVGhlIGRvY3VtZW50IGNvbXBvbmVudCByZW5kZXJzIG9uIHRoZSBzZXJ2ZXIgdGhyb3VnaCBgQHJlYWN0LWVtYWlsL3JlbmRlcmA7XG4gKiB0aGUgYm9keSBjb21wb25lbnQgaXMgcmV1c2VkIGRpcmVjdGx5IGJ5IGJyb3dzZXIgYXBwcm92YWwgYW5kIGNvbXBvc2Ugdmlld3MuXG4gKiBCb3RoIGRlZmF1bHQgdG8gdGhlIHJlcG9zaXRvcnkgYnJhbmQgd2hpbGUgYWNjZXB0aW5nIGEgY29uc3VtZXIgb3ZlcnJpZGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBicmFuZCwgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQm9keSxcbiAgQ29sdW1uLFxuICBDb250YWluZXIsXG4gIEhlYWQsXG4gIEhlYWRpbmcsXG4gIEhyLFxuICBIdG1sLFxuICBJbWcsXG4gIExpbmssXG4gIE1hcmtkb3duLFxuICBQcmV2aWV3LFxuICBSb3csXG4gIFNlY3Rpb24sXG4gIFRleHQsXG59IGZyb20gXCJAcmVhY3QtZW1haWwvY29tcG9uZW50c1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8qKiBFbWFpbC1zYWZlIGJyYW5kIHZhbHVlcyB1c2VkIGJ5IHRoZSBSZWFjdCBFbWFpbCB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCcmFuZCB7XG4gIGFjY2VudDogc3RyaW5nO1xuICBvbkFjY2VudD86IHN0cmluZztcbiAgZm9udEZhbWlseTogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBsb2dvVXJsPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzdXJmYWNlPzogc3RyaW5nO1xuICBmb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBtdXRlZD86IHN0cmluZztcbiAgYm9yZGVyPzogc3RyaW5nO1xuICB0YWdsaW5lPzogc3RyaW5nO1xuICB3ZWJzaXRlPzogc3RyaW5nO1xufVxuXG4vKiogQ29tcGxldGUgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIHRoZSBkYngtdG9vbHMgZGVmYXVsdCBicmFuZC4gKi9cbmV4cG9ydCB0eXBlIFJlc29sdmVkRW1haWxCcmFuZCA9IFJlcXVpcmVkPFxuICBQaWNrPFxuICAgIEVtYWlsQnJhbmQsXG4gICAgfCBcImFjY2VudFwiXG4gICAgfCBcIm9uQWNjZW50XCJcbiAgICB8IFwiZm9udEZhbWlseVwiXG4gICAgfCBcIm5hbWVcIlxuICAgIHwgXCJiYWNrZ3JvdW5kXCJcbiAgICB8IFwic3VyZmFjZVwiXG4gICAgfCBcImZvcmVncm91bmRcIlxuICAgIHwgXCJtdXRlZFwiXG4gICAgfCBcImJvcmRlclwiXG4gICAgfCBcInRhZ2xpbmVcIlxuICA+XG4+ICZcbiAgUGljazxFbWFpbEJyYW5kLCBcImxvZ29VcmxcIiB8IFwid2Vic2l0ZVwiPjtcblxuZnVuY3Rpb24gaXNSZW5kZXJhYmxlSW1hZ2VVcmwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgL14oPzpodHRwcz86fGRhdGE6fGNpZDopL2kudGVzdCh2YWx1ZSk7XG59XG5cbi8qKiBQcm9qZWN0IGEgcG9ydGFibGUgYnJhbmQgY29udGV4dCBpbnRvIGVtYWlsLXNhZmUgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IGVtYWlsQnJhbmRGcm9tQ29udGV4dCA9IChjb250ZXh0OiBCcmFuZENvbnRleHQpOiBFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbG9nbyA9IGNvbnRleHQuYXNzZXRzLmxvZ28uZGFyayA/PyBjb250ZXh0LmFzc2V0cy5sb2dvLmxpZ2h0O1xuICByZXR1cm4ge1xuICAgIGFjY2VudDogY29udGV4dC5jb2xvcnMucHJpbWFyeSxcbiAgICBvbkFjY2VudDogXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogY29udGV4dC50eXBvZ3JhcGh5LnNhbnMsXG4gICAgbmFtZTogY29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IGNvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogY29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBjb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IGNvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBjb250ZXh0LnRhZ2xpbmUsXG4gICAgd2Vic2l0ZTogY29udGV4dC5saW5rcy53ZWJzaXRlLFxuICAgIC4uLihpc1JlbmRlcmFibGVJbWFnZVVybChsb2dvKSA/IHsgbG9nb1VybDogbG9nbyB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIFRoZSByZXBvc2l0b3J5IGJyYW5kIHVzZWQgYnkgZXZlcnkgZW1haWwgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbi4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RW1haWxCcmFuZDogRW1haWxCcmFuZCA9IGVtYWlsQnJhbmRGcm9tQ29udGV4dChicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0KTtcblxuLyoqIE1lcmdlIGEgcGFydGlhbCBjb25zdW1lciBicmFuZCBvdmVyIHRoZSByZXBvc2l0b3J5IGRlZmF1bHQuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUVtYWlsQnJhbmQgPSAoaW5wdXQ/OiBFbWFpbEJyYW5kKTogUmVzb2x2ZWRFbWFpbEJyYW5kID0+IHtcbiAgY29uc3QgbWVyZ2VkID0geyAuLi5kZWZhdWx0RW1haWxCcmFuZCwgLi4uaW5wdXQgfTtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IG1lcmdlZC5hY2NlbnQsXG4gICAgb25BY2NlbnQ6IG1lcmdlZC5vbkFjY2VudCA/PyBcIiNmZmZmZmZcIixcbiAgICBmb250RmFtaWx5OiBtZXJnZWQuZm9udEZhbWlseSxcbiAgICBuYW1lOiBtZXJnZWQubmFtZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0Lm5hbWUsXG4gICAgYmFja2dyb3VuZDogbWVyZ2VkLmJhY2tncm91bmQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuc3VyZmFjZSxcbiAgICBzdXJmYWNlOiBtZXJnZWQuc3VyZmFjZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5iYWNrZ3JvdW5kLFxuICAgIGZvcmVncm91bmQ6IG1lcmdlZC5mb3JlZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmZvcmVncm91bmQsXG4gICAgbXV0ZWQ6IG1lcmdlZC5tdXRlZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5tdXRlZCxcbiAgICBib3JkZXI6IG1lcmdlZC5ib3JkZXIgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYm9yZGVyLFxuICAgIHRhZ2xpbmU6IG1lcmdlZC50YWdsaW5lID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudGFnbGluZSxcbiAgICAuLi4obWVyZ2VkLmxvZ29VcmwgPyB7IGxvZ29Vcmw6IG1lcmdlZC5sb2dvVXJsIH0gOiB7fSksXG4gICAgLi4uKG1lcmdlZC53ZWJzaXRlID8geyB3ZWJzaXRlOiBtZXJnZWQud2Vic2l0ZSB9IDoge30pLFxuICB9O1xufTtcblxuLyoqIE5vcm1hbGl6ZSBpbmRlbnRhdGlvbiBpbiBhdXRob3JlZCBjb250ZW50IHdpdGhvdXQgY29uc3RyYWluaW5nIGl0cyBzdHJ1Y3R1cmUuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplRW1haWxNYXJrZG93biA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICB3aGlsZSAobGluZXNbMF0/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMuc2hpZnQoKTtcbiAgd2hpbGUgKGxpbmVzLmF0KC0xKT8udHJpbSgpID09PSBcIlwiKSBsaW5lcy5wb3AoKTtcbiAgY29uc3Qgbm9uQmxhbmsgPSBsaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpLmxlbmd0aCA+IDApO1xuICBjb25zdCBpbmRlbnQgPSBub25CbGFuay5yZWR1Y2UoKG1pbmltdW0sIGxpbmUpID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IGxpbmUubWF0Y2goL15cXHMqLyk/LlswXS5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gTWF0aC5taW4obWluaW11bSwgd2lkdGgpO1xuICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRlbnQpIHx8IGluZGVudCA9PT0gMCkgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoTWF0aC5taW4oaW5kZW50LCBsaW5lLmxlbmd0aCkpKS5qb2luKFwiXFxuXCIpO1xufTtcblxuLyoqIFByb3BzIGZvciB0aGUgcmV1c2FibGUgbWVzc2FnZS1ib2R5IGNvbXBvbmVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxCb2R5UHJvcHMge1xuICBib2R5OiBzdHJpbmc7XG4gIGJyYW5kPzogRW1haWxCcmFuZDtcbn1cblxuLyoqIFJlbmRlciByaWNoIG1lc3NhZ2UgY29udGVudCB3aXRoIGVtYWlsLWNsaWVudC1zYWZlIGlubGluZSBzdHlsZXMuICovXG5leHBvcnQgY29uc3QgRW1haWxCb2R5ID0gKHsgYm9keSwgYnJhbmQ6IGJyYW5kSW5wdXQgfTogRW1haWxCb2R5UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8TWFya2Rvd25cbiAgICAgIG1hcmtkb3duQ29udGFpbmVyU3R5bGVzPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBmb250U2l6ZTogXCIxNXB4XCIsXG4gICAgICAgIGxpbmVIZWlnaHQ6IFwiMS42NVwiLFxuICAgICAgfX1cbiAgICAgIG1hcmtkb3duQ3VzdG9tU3R5bGVzPXt7XG4gICAgICAgIGgxOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIzMHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS4yXCIsIG1hcmdpbjogXCIwIDAgMjBweFwiIH0sXG4gICAgICAgIGgyOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIyM3B4XCIsIGxpbmVIZWlnaHQ6IFwiMS4zXCIsIG1hcmdpbjogXCIyOHB4IDAgMTJweFwiIH0sXG4gICAgICAgIGgzOiB7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxOHB4XCIsIGxpbmVIZWlnaHQ6IFwiMS40XCIsIG1hcmdpbjogXCIyNHB4IDAgMTBweFwiIH0sXG4gICAgICAgIHA6IHsgbWFyZ2luOiBcIjAgMCAxNnB4XCIgfSxcbiAgICAgICAgbGluazogeyBjb2xvcjogdGhlbWUuYWNjZW50LCBmb250V2VpZ2h0OiA2MDAsIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgICAgIGJsb2NrUXVvdGU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyTGVmdDogYDRweCBzb2xpZCAke3RoZW1lLmFjY2VudH1gLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIwIDEwcHggMTBweCAwXCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgbWFyZ2luOiBcIjIwcHggMFwiLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMTRweCAxOHB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVJbmxpbmU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjJweCA1cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgY29kZUJsb2NrOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgICAgY29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgICAgZm9udEZhbWlseTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC50eXBvZ3JhcGh5Lm1vbm8sXG4gICAgICAgICAgZm9udFNpemU6IFwiMTNweFwiLFxuICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE2cHhcIixcbiAgICAgICAgfSxcbiAgICAgICAgaHI6IHsgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiBcIjI4cHggMFwiIH0sXG4gICAgICAgIGltYWdlOiB7IGJvcmRlclJhZGl1czogXCIxMHB4XCIsIGhlaWdodDogXCJhdXRvXCIsIG1heFdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICBsaTogeyBtYXJnaW46IFwiNnB4IDBcIiB9LFxuICAgICAgICB0YWJsZTogeyBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLCBtYXJnaW46IFwiMjBweCAwXCIsIHdpZHRoOiBcIjEwMCVcIiB9LFxuICAgICAgICB0aDoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgICAgdGQ6IHtcbiAgICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjlweCAxMnB4XCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge25vcm1hbGl6ZUVtYWlsTWFya2Rvd24oYm9keSl9XG4gICAgPC9NYXJrZG93bj5cbiAgKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIGNvbXBsZXRlIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbERvY3VtZW50UHJvcHMgZXh0ZW5kcyBFbWFpbEJvZHlQcm9wcyB7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIHN0cmluZ10+O1xuICBmb290ZXI/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIEJyYW5kTWFyayh7IHRoZW1lIH06IHsgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZCB9KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKHRoZW1lLmxvZ29VcmwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEltZ1xuICAgICAgICBzcmM9e3RoZW1lLmxvZ29Vcmx9XG4gICAgICAgIGFsdD17dGhlbWUubmFtZX1cbiAgICAgICAgaGVpZ2h0PVwiMzRcIlxuICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiBcImJsb2NrXCIsIGhlaWdodDogXCIzNHB4XCIsIHdpZHRoOiBcImF1dG9cIiB9fVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5vbkFjY2VudCxcbiAgICAgICAgZm9udFNpemU6IFwiMjBweFwiLFxuICAgICAgICBmb250V2VpZ2h0OiA4MDAsXG4gICAgICAgIGxldHRlclNwYWNpbmc6IFwiLTAuM3B4XCIsXG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3RoZW1lLm5hbWV9XG4gICAgPC9UZXh0PlxuICApO1xufVxuXG5mdW5jdGlvbiBFbnZlbG9wZUhlYWRlcnMoe1xuICBoZWFkZXJzLFxuICB0aGVtZSxcbn06IHtcbiAgaGVhZGVyczogRW1haWxEb2N1bWVudFByb3BzW1wiaGVhZGVyc1wiXTtcbiAgdGhlbWU6IFJlc29sdmVkRW1haWxCcmFuZDtcbn0pIHtcbiAgaWYgKCFoZWFkZXJzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFxuICAgIDxTZWN0aW9uXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxMHB4XCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjE0cHggMTZweFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7aGVhZGVycy5tYXAoKFtsYWJlbCwgdmFsdWVdKSA9PiAoXG4gICAgICAgIDxSb3cga2V5PXtgJHtsYWJlbH06JHt2YWx1ZX1gfT5cbiAgICAgICAgICA8Q29sdW1uXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogNzAwLFxuICAgICAgICAgICAgICBwYWRkaW5nOiBcIjNweCAxMnB4IDNweCAwXCIsXG4gICAgICAgICAgICAgIHdpZHRoOiBcIjcwcHhcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICAgIDxDb2x1bW4gc3R5bGU9e3sgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsIGZvbnRTaXplOiBcIjEzcHhcIiwgcGFkZGluZzogXCIzcHggMFwiIH19PlxuICAgICAgICAgICAge3ZhbHVlfVxuICAgICAgICAgIDwvQ29sdW1uPlxuICAgICAgICA8L1Jvdz5cbiAgICAgICkpfVxuICAgIDwvU2VjdGlvbj5cbiAgKTtcbn1cblxuLyoqIEJyYW5kZWQgbWVzc2FnZSBjYXJkIHNoYXJlZCBieSB0aGUgZnVsbCBkb2N1bWVudCBhbmQgYnJvd3NlciBwcmV2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBFbWFpbENhcmQgPSAoe1xuICBib2R5LFxuICBzdWJqZWN0ID0gXCJNZXNzYWdlXCIsXG4gIGhlYWRlcnMsXG4gIGZvb3RlcixcbiAgYnJhbmQ6IGJyYW5kSW5wdXQsXG59OiBFbWFpbERvY3VtZW50UHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSByZXNvbHZlRW1haWxCcmFuZChicmFuZElucHV0KTtcbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnN1cmZhY2UsXG4gICAgICAgIGJvcmRlcjogYDFweCBzb2xpZCAke3RoZW1lLmJvcmRlcn1gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTZweFwiLFxuICAgICAgICBib3hTaGFkb3c6IFwiMCA4cHggMzBweCByZ2JhKDI3LDQ5LDU3LDAuMDgpXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLmZvbnRGYW1pbHksXG4gICAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogdGhlbWUuYWNjZW50LCBwYWRkaW5nOiBcIjIycHggMzBweFwiIH19PlxuICAgICAgICA8QnJhbmRNYXJrIHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICAgIDxTZWN0aW9uIHN0eWxlPXt7IHBhZGRpbmc6IFwiMzRweCAzNHB4IDI0cHhcIiB9fT5cbiAgICAgICAgPEhlYWRpbmdcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgY29sb3I6IHRoZW1lLmZvcmVncm91bmQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIyOHB4XCIsXG4gICAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjVweFwiLFxuICAgICAgICAgICAgbGluZUhlaWdodDogXCIxLjJcIixcbiAgICAgICAgICAgIG1hcmdpbjogXCIwIDAgMjRweFwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7c3ViamVjdH1cbiAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICA8RW52ZWxvcGVIZWFkZXJzIGhlYWRlcnM9e2hlYWRlcnN9IHRoZW1lPXt0aGVtZX0gLz5cbiAgICAgICAgPEVtYWlsQm9keSBib2R5PXtib2R5fSBicmFuZD17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8SHIgc3R5bGU9e3sgYm9yZGVyQ29sb3I6IHRoZW1lLmJvcmRlciwgbWFyZ2luOiAwIH19IC8+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjIwcHggMzRweCAyNnB4XCIgfX0+XG4gICAgICAgIDxUZXh0XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS41NVwiLFxuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7Zm9vdGVyID8/IHRoZW1lLnRhZ2xpbmV9e1wiIFwifVxuICAgICAgICAgIHt0aGVtZS53ZWJzaXRlID8gKFxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj17dGhlbWUud2Vic2l0ZX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUuYWNjZW50LFxuICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3RoZW1lLm5hbWV9XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvU2VjdGlvbj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKTtcbn07XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvQm9keT5cbiAgICA8L0h0bWw+XG4gICk7XG59O1xuIl19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsT0FBTyxFQUFFLEtBQUssRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxFQUFFLEVBQ0YsSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLEVBQ0osUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsT0FBTyxFQUNQLElBQUksR0FDTCxNQUFNLHlCQUF5QixDQUFDO0FBcUNqQyxTQUFTLG9CQUFvQixDQUFDLEtBQXlCO0lBQ3JELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBcUIsRUFBYyxFQUFFO0lBQ3pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbkUsT0FBTztRQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDOUIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUNuQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTztRQUNsQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVO1FBQ2xDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVU7UUFD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TUFBTSxFQUFFLENBQUM7UUFDVCxPQUFPLEVBQUUsV0FBVztLQUNyQixDQUFDO0lBQ0YsT0FBTyxDQUNMLE1BQUMsSUFBSSxJQUFDLElBQUksRUFBQyxJQUFJLGFBQ2IsS0FBQyxJQUFJLEtBQUcsRUFDUixLQUFDLE9BQU8sY0FBRSxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsR0FBVyxFQUMvQyxNQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsU0FBUyxhQUNwQixLQUFDLFNBQVMsT0FBSyxLQUFLLEdBQUksRUFDeEIsS0FBQyxlQUFlLElBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBSSxJQUNwRCxJQUNGLENBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pdmVyc2FsIFJlYWN0IEVtYWlsIHByZXNlbnRhdGlvbiBmb3IgZGJ4LXRvb2xzIGVtYWlsIGZsb3dzLlxuICpcbiAqIFRoZSBkb2N1bWVudCBjb21wb25lbnQgcmVuZGVycyBvbiB0aGUgc2VydmVyIHRocm91Z2ggYEByZWFjdC1lbWFpbC9yZW5kZXJgO1xuICogdGhlIGJvZHkgY29tcG9uZW50IGlzIHJldXNlZCBkaXJlY3RseSBieSBicm93c2VyIGFwcHJvdmFsIGFuZCBjb21wb3NlIHZpZXdzLlxuICogQm90aCBkZWZhdWx0IHRvIHRoZSByZXBvc2l0b3J5IGJyYW5kIHdoaWxlIGFjY2VwdGluZyBhIGNvbnN1bWVyIG92ZXJyaWRlLlxuICpcbiAqIHtAbGluayBhdXRvZmlsbFRyYWlsZXJ9ICsgdGhlIGRvY3VtZW50J3MgYHRyYWlsZXJgIHByb3AgY292ZXIgQXBwbGUnc1xuICogZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdoaWNoIHJlcXVpcmVzIGBAPGRvbWFpbj4gIzxjb2RlPmAgdG8gYmVcbiAqIHRoZSBtZXNzYWdlJ3MgZmluYWwgbGluZSAtIGhlbmNlIGEgZG9jdW1lbnQtbGV2ZWwgcHJvcCByYXRoZXIgdGhhbiBzb21ldGhpbmcgYVxuICogY2FsbGVyIGNhbiBhcHBlbmQgdG8gYGJvZHlgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYnJhbmQsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIEJvZHksXG4gIENvbHVtbixcbiAgQ29udGFpbmVyLFxuICBIZWFkLFxuICBIZWFkaW5nLFxuICBIcixcbiAgSHRtbCxcbiAgSW1nLFxuICBMaW5rLFxuICBNYXJrZG93bixcbiAgUHJldmlldyxcbiAgUm93LFxuICBTZWN0aW9uLFxuICBUZXh0LFxufSBmcm9tIFwiQHJlYWN0LWVtYWlsL2NvbXBvbmVudHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG4vKiogRW1haWwtc2FmZSBicmFuZCB2YWx1ZXMgdXNlZCBieSB0aGUgUmVhY3QgRW1haWwgdGVtcGxhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQnJhbmQge1xuICBhY2NlbnQ6IHN0cmluZztcbiAgb25BY2NlbnQ/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbG9nb1VybD86IHN0cmluZztcbiAgYmFja2dyb3VuZD86IHN0cmluZztcbiAgc3VyZmFjZT86IHN0cmluZztcbiAgZm9yZWdyb3VuZD86IHN0cmluZztcbiAgbXV0ZWQ/OiBzdHJpbmc7XG4gIGJvcmRlcj86IHN0cmluZztcbiAgdGFnbGluZT86IHN0cmluZztcbiAgd2Vic2l0ZT86IHN0cmluZztcbn1cblxuLyoqIENvbXBsZXRlIHZhbHVlcyBhZnRlciBhcHBseWluZyB0aGUgZGJ4LXRvb2xzIGRlZmF1bHQgYnJhbmQuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlZEVtYWlsQnJhbmQgPSBSZXF1aXJlZDxcbiAgUGljazxcbiAgICBFbWFpbEJyYW5kLFxuICAgIHwgXCJhY2NlbnRcIlxuICAgIHwgXCJvbkFjY2VudFwiXG4gICAgfCBcImZvbnRGYW1pbHlcIlxuICAgIHwgXCJuYW1lXCJcbiAgICB8IFwiYmFja2dyb3VuZFwiXG4gICAgfCBcInN1cmZhY2VcIlxuICAgIHwgXCJmb3JlZ3JvdW5kXCJcbiAgICB8IFwibXV0ZWRcIlxuICAgIHwgXCJib3JkZXJcIlxuICAgIHwgXCJ0YWdsaW5lXCJcbiAgPlxuPiAmXG4gIFBpY2s8RW1haWxCcmFuZCwgXCJsb2dvVXJsXCIgfCBcIndlYnNpdGVcIj47XG5cbmZ1bmN0aW9uIGlzUmVuZGVyYWJsZUltYWdlVXJsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIC9eKD86aHR0cHM/OnxkYXRhOnxjaWQ6KS9pLnRlc3QodmFsdWUpO1xufVxuXG4vKiogUHJvamVjdCBhIHBvcnRhYmxlIGJyYW5kIGNvbnRleHQgaW50byBlbWFpbC1zYWZlIHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCBlbWFpbEJyYW5kRnJvbUNvbnRleHQgPSAoY29udGV4dDogQnJhbmRDb250ZXh0KTogRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IGxvZ28gPSBjb250ZXh0LmFzc2V0cy5sb2dvLmRhcmsgPz8gY29udGV4dC5hc3NldHMubG9nby5saWdodDtcbiAgcmV0dXJuIHtcbiAgICBhY2NlbnQ6IGNvbnRleHQuY29sb3JzLnByaW1hcnksXG4gICAgb25BY2NlbnQ6IFwiI2ZmZmZmZlwiLFxuICAgIGZvbnRGYW1pbHk6IGNvbnRleHQudHlwb2dyYXBoeS5zYW5zLFxuICAgIG5hbWU6IGNvbnRleHQubmFtZSxcbiAgICBiYWNrZ3JvdW5kOiBjb250ZXh0LmNvbG9ycy5zdXJmYWNlLFxuICAgIHN1cmZhY2U6IGNvbnRleHQuY29sb3JzLmJhY2tncm91bmQsXG4gICAgZm9yZWdyb3VuZDogY29udGV4dC5jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICBtdXRlZDogY29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBjb250ZXh0LmNvbG9ycy5ib3JkZXIsXG4gICAgdGFnbGluZTogY29udGV4dC50YWdsaW5lLFxuICAgIHdlYnNpdGU6IGNvbnRleHQubGlua3Mud2Vic2l0ZSxcbiAgICAuLi4oaXNSZW5kZXJhYmxlSW1hZ2VVcmwobG9nbykgPyB7IGxvZ29Vcmw6IGxvZ28gfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBUaGUgcmVwb3NpdG9yeSBicmFuZCB1c2VkIGJ5IGV2ZXJ5IGVtYWlsIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4uICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEVtYWlsQnJhbmQ6IEVtYWlsQnJhbmQgPSBlbWFpbEJyYW5kRnJvbUNvbnRleHQoYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dCk7XG5cbi8qKiBNZXJnZSBhIHBhcnRpYWwgY29uc3VtZXIgYnJhbmQgb3ZlciB0aGUgcmVwb3NpdG9yeSBkZWZhdWx0LiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVFbWFpbEJyYW5kID0gKGlucHV0PzogRW1haWxCcmFuZCk6IFJlc29sdmVkRW1haWxCcmFuZCA9PiB7XG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4uZGVmYXVsdEVtYWlsQnJhbmQsIC4uLmlucHV0IH07XG4gIHJldHVybiB7XG4gICAgYWNjZW50OiBtZXJnZWQuYWNjZW50LFxuICAgIG9uQWNjZW50OiBtZXJnZWQub25BY2NlbnQgPz8gXCIjZmZmZmZmXCIsXG4gICAgZm9udEZhbWlseTogbWVyZ2VkLmZvbnRGYW1pbHksXG4gICAgbmFtZTogbWVyZ2VkLm5hbWUgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICAgIGJhY2tncm91bmQ6IG1lcmdlZC5iYWNrZ3JvdW5kID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLnN1cmZhY2UsXG4gICAgc3VyZmFjZTogbWVyZ2VkLnN1cmZhY2UgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMuYmFja2dyb3VuZCxcbiAgICBmb3JlZ3JvdW5kOiBtZXJnZWQuZm9yZWdyb3VuZCA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LmNvbG9ycy5mb3JlZ3JvdW5kLFxuICAgIG11dGVkOiBtZXJnZWQubXV0ZWQgPz8gYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5jb2xvcnMubXV0ZWQsXG4gICAgYm9yZGVyOiBtZXJnZWQuYm9yZGVyID8/IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQuY29sb3JzLmJvcmRlcixcbiAgICB0YWdsaW5lOiBtZXJnZWQudGFnbGluZSA/PyBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnRhZ2xpbmUsXG4gICAgLi4uKG1lcmdlZC5sb2dvVXJsID8geyBsb2dvVXJsOiBtZXJnZWQubG9nb1VybCB9IDoge30pLFxuICAgIC4uLihtZXJnZWQud2Vic2l0ZSA/IHsgd2Vic2l0ZTogbWVyZ2VkLndlYnNpdGUgfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8qKiBOb3JtYWxpemUgaW5kZW50YXRpb24gaW4gYXV0aG9yZWQgY29udGVudCB3aXRob3V0IGNvbnN0cmFpbmluZyBpdHMgc3RydWN0dXJlLiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUVtYWlsTWFya2Rvd24gPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgd2hpbGUgKGxpbmVzWzBdPy50cmltKCkgPT09IFwiXCIpIGxpbmVzLnNoaWZ0KCk7XG4gIHdoaWxlIChsaW5lcy5hdCgtMSk/LnRyaW0oKSA9PT0gXCJcIikgbGluZXMucG9wKCk7XG4gIGNvbnN0IG5vbkJsYW5rID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgY29uc3QgaW5kZW50ID0gbm9uQmxhbmsucmVkdWNlKChtaW5pbXVtLCBsaW5lKSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoID8/IDA7XG4gICAgcmV0dXJuIE1hdGgubWluKG1pbmltdW0sIHdpZHRoKTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZW50KSB8fCBpbmRlbnQgPT09IDApIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKE1hdGgubWluKGluZGVudCwgbGluZS5sZW5ndGgpKSkuam9pbihcIlxcblwiKTtcbn07XG5cbi8qKiBQcm9wcyBmb3IgdGhlIHJldXNhYmxlIG1lc3NhZ2UtYm9keSBjb21wb25lbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQm9keVByb3BzIHtcbiAgYm9keTogc3RyaW5nO1xuICBicmFuZD86IEVtYWlsQnJhbmQ7XG59XG5cbi8qKiBSZW5kZXIgcmljaCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBlbWFpbC1jbGllbnQtc2FmZSBpbmxpbmUgc3R5bGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsQm9keSA9ICh7IGJvZHksIGJyYW5kOiBicmFuZElucHV0IH06IEVtYWlsQm9keVByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPE1hcmtkb3duXG4gICAgICBtYXJrZG93bkNvbnRhaW5lclN0eWxlcz17e1xuICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTVweFwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNjVcIixcbiAgICAgIH19XG4gICAgICBtYXJrZG93bkN1c3RvbVN0eWxlcz17e1xuICAgICAgICBoMTogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMzBweFwiLCBsaW5lSGVpZ2h0OiBcIjEuMlwiLCBtYXJnaW46IFwiMCAwIDIwcHhcIiB9LFxuICAgICAgICBoMjogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMjNweFwiLCBsaW5lSGVpZ2h0OiBcIjEuM1wiLCBtYXJnaW46IFwiMjhweCAwIDEycHhcIiB9LFxuICAgICAgICBoMzogeyBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCwgZm9udFNpemU6IFwiMThweFwiLCBsaW5lSGVpZ2h0OiBcIjEuNFwiLCBtYXJnaW46IFwiMjRweCAwIDEwcHhcIiB9LFxuICAgICAgICBwOiB7IG1hcmdpbjogXCIwIDAgMTZweFwiIH0sXG4gICAgICAgIGxpbms6IHsgY29sb3I6IHRoZW1lLmFjY2VudCwgZm9udFdlaWdodDogNjAwLCB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIiB9LFxuICAgICAgICBibG9ja1F1b3RlOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlckxlZnQ6IGA0cHggc29saWQgJHt0aGVtZS5hY2NlbnR9YCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMCAxMHB4IDEwcHggMFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgIG1hcmdpbjogXCIyMHB4IDBcIixcbiAgICAgICAgICBwYWRkaW5nOiBcIjE0cHggMThweFwiLFxuICAgICAgICB9LFxuICAgICAgICBjb2RlSW5saW5lOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICBjb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBmb250RmFtaWx5OiBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0LnR5cG9ncmFwaHkubW9ubyxcbiAgICAgICAgICBmb250U2l6ZTogXCIxM3B4XCIsXG4gICAgICAgICAgcGFkZGluZzogXCIycHggNXB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVCbG9jazoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuZm9yZWdyb3VuZCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICAgIGNvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGJyYW5kLmRlZmF1bHRCcmFuZENvbnRleHQudHlwb2dyYXBoeS5tb25vLFxuICAgICAgICAgIGZvbnRTaXplOiBcIjEzcHhcIixcbiAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICBtYXJnaW46IFwiMjBweCAwXCIsXG4gICAgICAgICAgcGFkZGluZzogXCIxNnB4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGhyOiB7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogXCIyOHB4IDBcIiB9LFxuICAgICAgICBpbWFnZTogeyBib3JkZXJSYWRpdXM6IFwiMTBweFwiLCBoZWlnaHQ6IFwiYXV0b1wiLCBtYXhXaWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgbGk6IHsgbWFyZ2luOiBcIjZweCAwXCIgfSxcbiAgICAgICAgdGFibGU6IHsgYm9yZGVyQ29sbGFwc2U6IFwiY29sbGFwc2VcIiwgbWFyZ2luOiBcIjIwcHggMFwiLCB3aWR0aDogXCIxMDAlXCIgfSxcbiAgICAgICAgdGg6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmJhY2tncm91bmQsXG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHRkOiB7XG4gICAgICAgICAgYm9yZGVyOiBgMXB4IHNvbGlkICR7dGhlbWUuYm9yZGVyfWAsXG4gICAgICAgICAgcGFkZGluZzogXCI5cHggMTJweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtub3JtYWxpemVFbWFpbE1hcmtkb3duKGJvZHkpfVxuICAgIDwvTWFya2Rvd24+XG4gICk7XG59O1xuXG4vKiogUHJvcHMgZm9yIHRoZSBjb21wbGV0ZSBSZWFjdCBFbWFpbCBkb2N1bWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxEb2N1bWVudFByb3BzIGV4dGVuZHMgRW1haWxCb2R5UHJvcHMge1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPjtcbiAgZm9vdGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBtYWNoaW5lLXJlYWQgbGluZSBlbWl0dGVkIGFzIHRoZSB2ZXJ5IExBU1QgbGluZSBvZiBib3RoIE1JTUUgcGFydHMsIGFmdGVyXG4gICAqIHRoZSBicmFuZGVkIGZvb3RlciBhbmQgb3V0c2lkZSB0aGUgY2FyZC5cbiAgICpcbiAgICogVGhpcyBleGlzdHMgZm9yIEFwcGxlJ3MgZG9tYWluLWJvdW5kIG9uZS10aW1lLWNvZGUgQXV0b0ZpbGwsIHdob3NlIGZvcm1hdCBpc1xuICAgKiBgQDxkb21haW4+ICM8Y29kZT5gIGFuZCB3aGljaCBpT1Mgb25seSBob25vdXJzIHdoZW4gaXQgaXMgdGhlIGZpbmFsIGxpbmUgb2ZcbiAgICogdGhlIG1lc3NhZ2UgLSBzbyBpdCBjYW5ub3QgYmUgYXBwZW5kZWQgdG8gYGJvZHlgLCB3aGljaCB0aGUgYnJhbmRlZCBmb290ZXJcbiAgICogd291bGQgdGhlbiBmb2xsb3cuIFJlbmRlcmVkIGFzIHZpc2libGUtYnV0LXF1aWV0IHRleHQgcmF0aGVyIHRoYW4gaGlkZGVuXG4gICAqIChgZGlzcGxheTogbm9uZWAgY29udGVudCBpcyBhIHNwYW0gc2lnbmFsLCBhbmQgYSBjbGllbnQgdGhhdCBpZ25vcmVzIHRoZVxuICAgKiBjb252ZW50aW9uIHNob3VsZCBzaG93IHNvbWV0aGluZyBpbm5vY3VvdXMgcmF0aGVyIHRoYW4gbm90aGluZykuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgYXV0b2ZpbGxUcmFpbGVyfSwgd2hpY2ggYnVpbGRzIHRoZSBzdHJpbmcuXG4gICAqL1xuICB0cmFpbGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFwcGxlJ3MgZG9tYWluLWJvdW5kIEF1dG9GaWxsIHRyYWlsZXIsIGBAPGRvbWFpbj4gIzxjb2RlPmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGVpdGhlciBwYXJ0IGlzIG1pc3NpbmcuXG4gKlxuICogaU9TIHJlYWRzIHRoaXMgdG8gYmluZCBhIGNvZGUgdG8gYSBzcGVjaWZpYyBXRUJTSVRFOiB3aXRoIGl0LCB0aGUga2V5Ym9hcmRcbiAqIG9mZmVycyB0aGUgY29kZSBvbmx5IGZvciB0aGUgbWF0Y2hpbmcgZG9tYWluLCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgY29kZVxuICogcGhpc2hlZCBmcm9tIG9uZSBzaXRlIGJlaW5nIGF1dG9maWxsZWQgaW50byBhbm90aGVyLiBXaXRob3V0IGl0LCBpT1Mgc3RpbGxcbiAqIGRldGVjdHMgYSBjb2RlIGhldXJpc3RpY2FsbHkgZnJvbSB0aGUgY29udmVudGlvbmFsIGxheW91dCAocHJvbXB0IGxpbmUsIGJhcmVcbiAqIGNvZGUgYWxvbmUgb24gdGhlIG5leHQgbGluZSksIGFzIGRvIEdtYWlsLCBPdXRsb29rLCBhbmQgQW5kcm9pZCAtIHNvIHRoaXMgaXMgYVxuICogc3RyaWN0IHVwZ3JhZGUgb24gdG9wIG9mIHRoYXQgYmFzZWxpbmUsIG5ldmVyIGEgcmVwbGFjZW1lbnQgZm9yIGl0LlxuICpcbiAqIFRoZSBkb21haW4gaXMgbm9ybWFsaXplZCB0byBiYXJlIGhvc3QgZm9ybTogYSBzY2hlbWUsIGEgYHd3dy5gIHByZWZpeCwgYW55XG4gKiBwYXRoLCBhbmQgYSB0cmFpbGluZyBkb3QgYXJlIHN0cmlwcGVkLCBzaW5jZSBpT1MgbWF0Y2hlcyB0aGUgaG9zdCB0aGUgc2l0ZSBpc1xuICogc2VydmVkIGZyb20uIEEgZG9tYWluIHdpdGggbm8gZG90IChgbG9jYWxob3N0YCkgaXMgcmVqZWN0ZWQgLSBpdCBjYW5ub3QgYmUgdGhlXG4gKiBwdWJsaWMgaG9zdCBvZiBhIHJlYWwgZGVwbG95bWVudCwgYW5kIGEgdHJhaWxlciBpT1Mgd2lsbCBuZXZlciBtYXRjaCBpcyBqdXN0IGFcbiAqIGNvbmZ1c2luZyBsaW5lIGluIHRoZSBlbWFpbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYXV0b2ZpbGxUcmFpbGVyKFwiZGVtby5hcHBzLmRieC50b29sc1wiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZGVtby5hcHBzLmRieC50b29scyAjMTIzNDU2XCJcbiAqIGF1dG9maWxsVHJhaWxlcihcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2FwcFwiLCBcIjEyMzQ1NlwiKTsgLy8gXCJAZXhhbXBsZS5jb20gIzEyMzQ1NlwiXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRvZmlsbFRyYWlsZXIgPSAoXG4gIGRvbWFpbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWRvbWFpbiB8fCAhY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaG9zdCA9IGRvbWFpblxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9eW2Etel1bYS16XFxkKy4tXSo6XFwvXFwvLywgXCJcIilcbiAgICAucmVwbGFjZSgvXnd3d1xcLi8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1svPyNdLiokLywgXCJcIilcbiAgICAucmVwbGFjZSgvXFwuJC8sIFwiXCIpXG4gICAgLnJlcGxhY2UoLzpcXGQrJC8sIFwiXCIpO1xuICBpZiAoIWhvc3QuaW5jbHVkZXMoXCIuXCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYEAke2hvc3R9ICMke2NvZGUudHJpbSgpfWA7XG59O1xuXG5mdW5jdGlvbiBCcmFuZE1hcmsoeyB0aGVtZSB9OiB7IHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQgfSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICh0aGVtZS5sb2dvVXJsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxJbWdcbiAgICAgICAgc3JjPXt0aGVtZS5sb2dvVXJsfVxuICAgICAgICBhbHQ9e3RoZW1lLm5hbWV9XG4gICAgICAgIGhlaWdodD1cIjM0XCJcbiAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogXCJibG9ja1wiLCBoZWlnaHQ6IFwiMzRweFwiLCB3aWR0aDogXCJhdXRvXCIgfX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxUZXh0XG4gICAgICBzdHlsZT17e1xuICAgICAgICBjb2xvcjogdGhlbWUub25BY2NlbnQsXG4gICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcbiAgICAgICAgZm9udFdlaWdodDogODAwLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiBcIi0wLjNweFwiLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHt0aGVtZS5uYW1lfVxuICAgIDwvVGV4dD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRW52ZWxvcGVIZWFkZXJzKHtcbiAgaGVhZGVycyxcbiAgdGhlbWUsXG59OiB7XG4gIGhlYWRlcnM6IEVtYWlsRG9jdW1lbnRQcm9wc1tcImhlYWRlcnNcIl07XG4gIHRoZW1lOiBSZXNvbHZlZEVtYWlsQnJhbmQ7XG59KSB7XG4gIGlmICghaGVhZGVycz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8U2VjdGlvblxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5iYWNrZ3JvdW5kLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgcGFkZGluZzogXCIxNHB4IDE2cHhcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAge2hlYWRlcnMubWFwKChbbGFiZWwsIHZhbHVlXSkgPT4gKFxuICAgICAgICA8Um93IGtleT17YCR7bGFiZWx9OiR7dmFsdWV9YH0+XG4gICAgICAgICAgPENvbHVtblxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLm11dGVkLFxuICAgICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIzcHggMTJweCAzcHggMFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCI3MHB4XCIsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgICA8Q29sdW1uIHN0eWxlPXt7IGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLCBmb250U2l6ZTogXCIxM3B4XCIsIHBhZGRpbmc6IFwiM3B4IDBcIiB9fT5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgPC9Sb3c+XG4gICAgICApKX1cbiAgICA8L1NlY3Rpb24+XG4gICk7XG59XG5cbi8qKiBCcmFuZGVkIG1lc3NhZ2UgY2FyZCBzaGFyZWQgYnkgdGhlIGZ1bGwgZG9jdW1lbnQgYW5kIGJyb3dzZXIgcHJldmlld3MuICovXG5leHBvcnQgY29uc3QgRW1haWxDYXJkID0gKHtcbiAgYm9keSxcbiAgc3ViamVjdCA9IFwiTWVzc2FnZVwiLFxuICBoZWFkZXJzLFxuICBmb290ZXIsXG4gIGJyYW5kOiBicmFuZElucHV0LFxufTogRW1haWxEb2N1bWVudFByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gcmVzb2x2ZUVtYWlsQnJhbmQoYnJhbmRJbnB1dCk7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lclxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5zdXJmYWNlLFxuICAgICAgICBib3JkZXI6IGAxcHggc29saWQgJHt0aGVtZS5ib3JkZXJ9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjE2cHhcIixcbiAgICAgICAgYm94U2hhZG93OiBcIjAgOHB4IDMwcHggcmdiYSgyNyw0OSw1NywwLjA4KVwiLFxuICAgICAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgICAgICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gICAgICAgIG1heFdpZHRoOiBcIjYyMHB4XCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmFjY2VudCwgcGFkZGluZzogXCIyMnB4IDMwcHhcIiB9fT5cbiAgICAgICAgPEJyYW5kTWFyayB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgICA8U2VjdGlvbiBzdHlsZT17eyBwYWRkaW5nOiBcIjM0cHggMzRweCAyNHB4XCIgfX0+XG4gICAgICAgIDxIZWFkaW5nXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5mb3JlZ3JvdW5kLFxuICAgICAgICAgICAgZm9udFNpemU6IFwiMjhweFwiLFxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogXCItMC41cHhcIixcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMS4yXCIsXG4gICAgICAgICAgICBtYXJnaW46IFwiMCAwIDI0cHhcIixcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3N1YmplY3R9XG4gICAgICAgIDwvSGVhZGluZz5cbiAgICAgICAgPEVudmVsb3BlSGVhZGVycyBoZWFkZXJzPXtoZWFkZXJzfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICAgIDxFbWFpbEJvZHkgYm9keT17Ym9keX0gYnJhbmQ9e3RoZW1lfSAvPlxuICAgICAgPC9TZWN0aW9uPlxuICAgICAgPEhyIHN0eWxlPXt7IGJvcmRlckNvbG9yOiB0aGVtZS5ib3JkZXIsIG1hcmdpbjogMCB9fSAvPlxuICAgICAgPFNlY3Rpb24gc3R5bGU9e3sgcGFkZGluZzogXCIyMHB4IDM0cHggMjZweFwiIH19PlxuICAgICAgICA8VGV4dFxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBjb2xvcjogdGhlbWUubXV0ZWQsXG4gICAgICAgICAgICBmb250U2l6ZTogXCIxMnB4XCIsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjEuNTVcIixcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge2Zvb3RlciA/PyB0aGVtZS50YWdsaW5lfXtcIiBcIn1cbiAgICAgICAgICB7dGhlbWUud2Vic2l0ZSA/IChcbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e3RoZW1lLndlYnNpdGV9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgY29sb3I6IHRoZW1lLmFjY2VudCxcbiAgICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJub25lXCIsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aGVtZS5uYW1lfVxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L1NlY3Rpb24+XG4gICAgPC9Db250YWluZXI+XG4gICk7XG59O1xuXG4vKipcbiAqIFRoZSBtYWNoaW5lLXJlYWQgdHJhaWxlciBsaW5lLCByZW5kZXJlZCBMQVNUIGFuZCBvdXRzaWRlIHRoZSBjYXJkLlxuICpcbiAqIERlbGliZXJhdGVseSB0aGUgZmluYWwgZWxlbWVudCBvZiBgPEJvZHk+YDogaU9TIG9ubHkgYmluZHMgYSBjb2RlIHRvIGEgZG9tYWluXG4gKiB3aGVuIGBAPGRvbWFpbj4gIzxjb2RlPmAgaXMgdGhlIGxhc3QgbGluZSBvZiB0aGUgbWVzc2FnZSwgc28gbm90aGluZyAtIG5vdCBldmVuXG4gKiB0aGUgYnJhbmRlZCBmb290ZXIgLSBtYXkgZm9sbG93IGl0LiBTdHlsZWQgc21hbGwgYW5kIG11dGVkIHJhdGhlciB0aGFuIGhpZGRlbixcbiAqIGJlY2F1c2UgYGRpc3BsYXk6IG5vbmVgIHRleHQgaXMgYSBzcGFtLWZpbHRlciBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIEF1dG9maWxsVHJhaWxlcih7XG4gIHRyYWlsZXIsXG4gIHRoZW1lLFxufToge1xuICB0cmFpbGVyPzogc3RyaW5nO1xuICB0aGVtZTogUmVzb2x2ZWRFbWFpbEJyYW5kO1xufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghdHJhaWxlcikgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoXG4gICAgPFRleHRcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5tdXRlZCxcbiAgICAgICAgZm9udEZhbWlseTogdGhlbWUuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IFwiMTFweFwiLFxuICAgICAgICBtYXJnaW46IFwiMTZweCBhdXRvIDBcIixcbiAgICAgICAgbWF4V2lkdGg6IFwiNjIwcHhcIixcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7dHJhaWxlcn1cbiAgICA8L1RleHQ+XG4gICk7XG59XG5cbi8qKiBDb21wbGV0ZSByZXNwb25zaXZlLCBicmFuZGVkIFJlYWN0IEVtYWlsIGRvY3VtZW50LiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRG9jdW1lbnQgPSAocHJvcHM6IEVtYWlsRG9jdW1lbnRQcm9wcykgPT4ge1xuICBjb25zdCB0aGVtZSA9IHJlc29sdmVFbWFpbEJyYW5kKHByb3BzLmJyYW5kKTtcbiAgY29uc3QgcGFnZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUuYmFja2dyb3VuZCxcbiAgICBmb250RmFtaWx5OiB0aGVtZS5mb250RmFtaWx5LFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiBcIjI4cHggMTJweFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxIdG1sIGxhbmc9XCJlblwiPlxuICAgICAgPEhlYWQgLz5cbiAgICAgIDxQcmV2aWV3Pntwcm9wcy5zdWJqZWN0ID8/IFwiTWVzc2FnZVwifTwvUHJldmlldz5cbiAgICAgIDxCb2R5IHN0eWxlPXtwYWdlU3R5bGV9PlxuICAgICAgICA8RW1haWxDYXJkIHsuLi5wcm9wc30gLz5cbiAgICAgICAgPEF1dG9maWxsVHJhaWxlciB0cmFpbGVyPXtwcm9wcy50cmFpbGVyfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICA8L0JvZHk+XG4gICAgPC9IdG1sPlxuICApO1xufTtcbiJdfQ==
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "typescript": "^5.9.3"
25
25
  },
26
26
  "dependencies": {
27
- "@dbx-tools/shared-core": "0.6.51",
27
+ "@dbx-tools/shared-core": "0.6.53",
28
28
  "@react-email/components": "^1.0.12",
29
29
  "react": "^19.2.4"
30
30
  },
@@ -42,7 +42,7 @@
42
42
  "./package.json": "./package.json"
43
43
  }
44
44
  },
45
- "version": "0.6.51",
45
+ "version": "0.6.53",
46
46
  "types": "./lib/index.d.ts",
47
47
  "type": "module",
48
48
  "exports": {
package/src/template.tsx CHANGED
@@ -5,6 +5,11 @@
5
5
  * the body component is reused directly by browser approval and compose views.
6
6
  * Both default to the repository brand while accepting a consumer override.
7
7
  *
8
+ * {@link autofillTrailer} + the document's `trailer` prop cover Apple's
9
+ * domain-bound one-time-code AutoFill, which requires `@<domain> #<code>` to be
10
+ * the message's final line - hence a document-level prop rather than something a
11
+ * caller can append to `body`.
12
+ *
8
13
  * @module
9
14
  */
10
15
  import { brand, type BrandContext } from "@dbx-tools/shared-core";
@@ -195,8 +200,60 @@ export interface EmailDocumentProps extends EmailBodyProps {
195
200
  subject?: string;
196
201
  headers?: ReadonlyArray<readonly [string, string]>;
197
202
  footer?: string;
203
+ /**
204
+ * A machine-read line emitted as the very LAST line of both MIME parts, after
205
+ * the branded footer and outside the card.
206
+ *
207
+ * This exists for Apple's domain-bound one-time-code AutoFill, whose format is
208
+ * `@<domain> #<code>` and which iOS only honours when it is the final line of
209
+ * the message - so it cannot be appended to `body`, which the branded footer
210
+ * would then follow. Rendered as visible-but-quiet text rather than hidden
211
+ * (`display: none` content is a spam signal, and a client that ignores the
212
+ * convention should show something innocuous rather than nothing).
213
+ *
214
+ * See {@link autofillTrailer}, which builds the string.
215
+ */
216
+ trailer?: string;
198
217
  }
199
218
 
219
+ /**
220
+ * Apple's domain-bound AutoFill trailer, `@<domain> #<code>`, or `undefined`
221
+ * when either part is missing.
222
+ *
223
+ * iOS reads this to bind a code to a specific WEBSITE: with it, the keyboard
224
+ * offers the code only for the matching domain, which is what stops a code
225
+ * phished from one site being autofilled into another. Without it, iOS still
226
+ * detects a code heuristically from the conventional layout (prompt line, bare
227
+ * code alone on the next line), as do Gmail, Outlook, and Android - so this is a
228
+ * strict upgrade on top of that baseline, never a replacement for it.
229
+ *
230
+ * The domain is normalized to bare host form: a scheme, a `www.` prefix, any
231
+ * path, and a trailing dot are stripped, since iOS matches the host the site is
232
+ * served from. A domain with no dot (`localhost`) is rejected - it cannot be the
233
+ * public host of a real deployment, and a trailer iOS will never match is just a
234
+ * confusing line in the email.
235
+ *
236
+ * @example
237
+ * autofillTrailer("demo.apps.dbx.tools", "123456"); // "@demo.apps.dbx.tools #123456"
238
+ * autofillTrailer("https://www.example.com/app", "123456"); // "@example.com #123456"
239
+ */
240
+ export const autofillTrailer = (
241
+ domain: string | undefined,
242
+ code: string | undefined,
243
+ ): string | undefined => {
244
+ if (!domain || !code) return undefined;
245
+ const host = domain
246
+ .trim()
247
+ .toLowerCase()
248
+ .replace(/^[a-z][a-z\d+.-]*:\/\//, "")
249
+ .replace(/^www\./, "")
250
+ .replace(/[/?#].*$/, "")
251
+ .replace(/\.$/, "")
252
+ .replace(/:\d+$/, "");
253
+ if (!host.includes(".")) return undefined;
254
+ return `@${host} #${code.trim()}`;
255
+ };
256
+
200
257
  function BrandMark({ theme }: { theme: ResolvedEmailBrand }): React.ReactNode {
201
258
  if (theme.logoUrl) {
202
259
  return (
@@ -330,6 +387,38 @@ export const EmailCard = ({
330
387
  );
331
388
  };
332
389
 
390
+ /**
391
+ * The machine-read trailer line, rendered LAST and outside the card.
392
+ *
393
+ * Deliberately the final element of `<Body>`: iOS only binds a code to a domain
394
+ * when `@<domain> #<code>` is the last line of the message, so nothing - not even
395
+ * the branded footer - may follow it. Styled small and muted rather than hidden,
396
+ * because `display: none` text is a spam-filter signal.
397
+ */
398
+ function AutofillTrailer({
399
+ trailer,
400
+ theme,
401
+ }: {
402
+ trailer?: string;
403
+ theme: ResolvedEmailBrand;
404
+ }): React.ReactNode {
405
+ if (!trailer) return null;
406
+ return (
407
+ <Text
408
+ style={{
409
+ color: theme.muted,
410
+ fontFamily: theme.fontFamily,
411
+ fontSize: "11px",
412
+ margin: "16px auto 0",
413
+ maxWidth: "620px",
414
+ textAlign: "center",
415
+ }}
416
+ >
417
+ {trailer}
418
+ </Text>
419
+ );
420
+ }
421
+
333
422
  /** Complete responsive, branded React Email document. */
334
423
  export const EmailDocument = (props: EmailDocumentProps) => {
335
424
  const theme = resolveEmailBrand(props.brand);
@@ -345,6 +434,7 @@ export const EmailDocument = (props: EmailDocumentProps) => {
345
434
  <Preview>{props.subject ?? "Message"}</Preview>
346
435
  <Body style={pageStyle}>
347
436
  <EmailCard {...props} />
437
+ <AutofillTrailer trailer={props.trailer} theme={theme} />
348
438
  </Body>
349
439
  </Html>
350
440
  );