diff --git a/extension/chrome/elements/attachment_preview.ts b/extension/chrome/elements/attachment_preview.ts
index b8e03510a73..00e7d8a062a 100644
--- a/extension/chrome/elements/attachment_preview.ts
+++ b/extension/chrome/elements/attachment_preview.ts
@@ -98,10 +98,8 @@ View.run(
const extension = nameSplit[nameSplit.length - 1].toLowerCase();
if (['jpg', 'jpeg', 'png', 'gif'].includes(extension)) {
return 'img';
- } else if (extension === 'txt') {
- return 'txt';
- } else if (extension === 'pdf') {
- return 'pdf';
+ } else if (['txt', 'pdf'].includes(extension)) {
+ return extension as AttachmentType;
}
return undefined;
};
diff --git a/extension/js/common/api/email-provider/gmail/gmail-parser.ts b/extension/js/common/api/email-provider/gmail/gmail-parser.ts
index b47a80d8fe3..79270eadc80 100644
--- a/extension/js/common/api/email-provider/gmail/gmail-parser.ts
+++ b/extension/js/common/api/email-provider/gmail/gmail-parser.ts
@@ -154,43 +154,44 @@ export class GmailParser {
internalResults: Attachment[] = [],
{ pgpEncryptedIndex }: { pgpEncryptedIndex?: number } = {}
) => {
- if (msgOrPayloadOrPart.hasOwnProperty('payload')) {
- internalMsgId = (msgOrPayloadOrPart as GmailRes.GmailMsg).id;
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- GmailParser.findAttachments((msgOrPayloadOrPart as GmailRes.GmailMsg).payload!, internalMsgId, internalResults);
+ if ('payload' in msgOrPayloadOrPart && msgOrPayloadOrPart.payload) {
+ internalMsgId = msgOrPayloadOrPart.id;
+ GmailParser.findAttachments(msgOrPayloadOrPart.payload, internalMsgId, internalResults);
}
- if (msgOrPayloadOrPart.hasOwnProperty('parts')) {
- const payload = msgOrPayloadOrPart as GmailRes.GmailMsg$payload;
- const contentType = payload.headers?.find(x => x.name.toLowerCase() === 'content-type');
- const parts = payload.parts!; // eslint-disable-line @typescript-eslint/no-non-null-assertion
- // are we dealing with a PGP/MIME encrypted message?
- const pgpEncrypted = Boolean(
- parts.length === 2 &&
- contentType?.value?.startsWith('multipart/encrypted') &&
- (contentType.value.includes('protocol="application/pgp-encrypted"') || parts[0].mimeType === 'application/pgp-encrypted')
- );
- for (const [i, part] of parts.entries()) {
- GmailParser.findAttachments(part, internalMsgId, internalResults, {
- pgpEncryptedIndex: pgpEncrypted ? i : undefined,
- });
+ if ('parts' in msgOrPayloadOrPart) {
+ const contentType = msgOrPayloadOrPart.headers?.find(header => header.name.toLowerCase() === 'content-type');
+ const parts = msgOrPayloadOrPart.parts ?? [];
+ const hasMultipartAlternativePart = parts.find(part => part.mimeType === 'multipart/alternative');
+ // ignore plain inline attachments
+ if (!contentType?.value.startsWith('multipart/related') || !hasMultipartAlternativePart) {
+ // are we dealing with a PGP/MIME encrypted message?
+ const pgpEncrypted = Boolean(
+ parts.length === 2 &&
+ contentType?.value.startsWith('multipart/encrypted') &&
+ (contentType.value.includes('protocol="application/pgp-encrypted"') || parts[0].mimeType === 'application/pgp-encrypted')
+ );
+ for (const [i, part] of parts.entries()) {
+ GmailParser.findAttachments(part, internalMsgId, internalResults, {
+ pgpEncryptedIndex: pgpEncrypted ? i : undefined,
+ });
+ }
}
}
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
- if (msgOrPayloadOrPart.hasOwnProperty('body') && (msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part).body!.hasOwnProperty('attachmentId')) {
- const payload = msgOrPayloadOrPart as GmailRes.GmailMsg$payload;
+ if ('body' in msgOrPayloadOrPart && msgOrPayloadOrPart.body?.hasOwnProperty('attachmentId')) {
+ const payload = msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part;
const treatAs = Attachment.treatAsForPgpEncryptedAttachments(payload.mimeType, pgpEncryptedIndex);
+ const inline = (GmailParser.findHeader(payload, 'content-disposition') || '').toLowerCase().startsWith('inline');
internalResults.push(
new Attachment({
msgId: internalMsgId,
- id: (msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part).body!.attachmentId,
- length: (msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part).body!.size,
- name: (msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part).filename,
- type: (msgOrPayloadOrPart as GmailRes.GmailMsg$payload$part).mimeType,
+ id: payload.body?.attachmentId ?? '',
+ length: payload.body?.size ?? 0,
+ name: payload.filename,
+ type: payload.mimeType,
treatAs,
- inline: (GmailParser.findHeader(msgOrPayloadOrPart, 'content-disposition') || '').toLowerCase().startsWith('inline'),
+ inline,
})
);
- /* eslint-enable @typescript-eslint/no-non-null-assertion */
}
return internalResults;
};
diff --git a/extension/js/common/core/attachment.ts b/extension/js/common/core/attachment.ts
index 8b611457ce3..25909141051 100644
--- a/extension/js/common/core/attachment.ts
+++ b/extension/js/common/core/attachment.ts
@@ -148,15 +148,6 @@ export class Attachment {
);
};
- public isPrivateKey = (): boolean => {
- return (
- Boolean(this.name.match(/(cryptup|flowcrypt)-backup-([a-z0-9]+(?:\-[A-F0-9]{40})?)\.(key|asc)$/g)) ||
- (/\.(asc|key)$/.test(this.name) &&
- this.hasData() &&
- Buf.with(this.getData().subarray(0, 100)).toUtfStr().includes('-----BEGIN PGP PRIVATE KEY BLOCK-----'))
- );
- };
-
public hasData = () => {
return this.bytes instanceof Uint8Array;
};
@@ -178,7 +169,7 @@ export class Attachment {
throw new Error('Attachment has no data set');
};
- public isAttachmentAnImage = () => {
+ public isImage = () => {
return this.type.startsWith('image/') || this.type.startsWith('img/');
};
@@ -201,9 +192,9 @@ export class Attachment {
}
}
return 'signature';
- } else if (this.inline && this.isAttachmentAnImage()) {
+ } else if (this.inline && this.isImage()) {
return 'inlineImage';
- } else if (!this.name && !this.isAttachmentAnImage() && this.type !== 'application/octet-stream' && this.type !== 'multipart/mixed') {
+ } else if (!this.name && !this.isImage() && !['application/octet-stream', 'multipart/mixed', 'message/global'].includes(this.type)) {
// this.name may be '' or undefined - catch either
return this.length < 100 ? 'hidden' : 'encryptedMsg';
} else if (this.name === 'msg.asc' && this.length < 100 && this.type === 'application/pgp-encrypted') {
@@ -222,11 +213,10 @@ export class Attachment {
} else if (this.isPrivateKey()) {
return 'privateKey';
} else {
- // && !Attachment.encryptedMsgNames.includes(this.name) -- already checked above
const isAmbiguousAscFile = this.name.endsWith('.asc'); // ambiguous .asc name
const isAmbiguousNonameFile = !this.name || this.name === 'noname'; // may not even be OpenPGP related
- if (!this.inline && this.length < 100000 && (isAmbiguousAscFile || isAmbiguousNonameFile) && !this.isAttachmentAnImage()) {
- if (isAmbiguousNonameFile && this.type === 'application/octet-stream') {
+ if (!this.inline && this.length < 100000 && (isAmbiguousAscFile || isAmbiguousNonameFile) && !this.isImage()) {
+ if (isAmbiguousNonameFile && ['application/octet-stream', 'message/global'].includes(this.type)) {
return 'plainFile';
}
return this.hasData() ? 'maybePgp' : 'needChunk';
@@ -239,6 +229,12 @@ export class Attachment {
return this.type === 'application/pgp-encrypted' && this.name.length === 0 && this.getData().toUtfStr() === 'Version: 1';
};
+ public shouldBeHidden = () => {
+ return (
+ this.type === 'application/pgp-keys' || this.isPublicKey() || this.inline || Attachment.encryptedMsgNames.some(filename => this.name.includes(filename))
+ );
+ };
+
public isExecutableFile = () => {
return [
'ade',
@@ -296,4 +292,13 @@ export class Attachment {
'xll',
].some(exeFileExtension => this.name.endsWith('.' + exeFileExtension));
};
+
+ private isPrivateKey = (): boolean => {
+ return (
+ Boolean(this.name.match(/(cryptup|flowcrypt)-backup-([a-z0-9]+(?:\-[A-F0-9]{40})?)\.(key|asc)$/g)) ||
+ (/\.(asc|key)$/.test(this.name) &&
+ this.hasData() &&
+ Buf.with(this.getData().subarray(0, 100)).toUtfStr().includes('-----BEGIN PGP PRIVATE KEY BLOCK-----'))
+ );
+ };
}
diff --git a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts
index 1a4ecfde027..a691c7be657 100644
--- a/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts
+++ b/extension/js/content_scripts/webmail/gmail/gmail-element-replacer.ts
@@ -59,7 +59,7 @@ export class GmailElementReplacer extends WebmailElementReplacer {
settingsBtnContainer: 'div.aeH > div > .fY',
standardComposeRecipient: 'div.az9 span[email][data-hovercard-id]',
numberOfAttachments: '.aVW',
- numberOfAttachmentsDigit: '.aVW span:first-child',
+ numberOfAttachmentsLabel: '.aVW span:first-child',
attachmentsButtons: '.aZi',
draftsList: '.ae4',
};
@@ -475,16 +475,6 @@ export class GmailElementReplacer extends WebmailElementReplacer {
}
};
- private isAttachmentHideable = (attachment: Attachment, renderStatus: string) => {
- return (
- renderStatus === 'hidden' ||
- attachment.type === 'application/pgp-keys' ||
- attachment.isPublicKey() ||
- attachment.inline ||
- Attachment.encryptedMsgNames.some(filename => attachment.name.includes(filename))
- );
- };
-
private processAttachments = async (
msgId: string,
attachments: Attachment[],
@@ -519,7 +509,7 @@ export class GmailElementReplacer extends WebmailElementReplacer {
messageInfo,
skipGoogleDrive
);
- if (this.isAttachmentHideable(a, renderStatus)) {
+ if (renderStatus === 'hidden' || a.shouldBeHidden()) {
nRenderedAttachments--;
}
}
@@ -528,22 +518,14 @@ export class GmailElementReplacer extends WebmailElementReplacer {
$(this.sel.attachmentsButtons).hide();
}
if (nRenderedAttachments === 0) {
+ attachmentsContainerInner.parents(this.sel.attachmentsContainerOuter).first().hide();
$(this.sel.attachmentsContainerOuter).children('.hp').hide();
if ($('.pgp_block').length === 0) {
attachmentsContainerInner.parents(this.sel.attachmentsContainerOuter).first().hide();
}
} else {
- const elementsToClone = ['span.a2H', 'div.a2b'];
- const scannedByGmailLabel = $(elementsToClone[0]).first().clone();
- const scannedByGmailPopover = $(elementsToClone[1]).first().clone(true);
- // for uniformity reasons especially when Google used "One" for single attachment and numeric representation for multiple.
- const gmailAttachmentLabelReplacement = $(
- `${nRenderedAttachments} ${nRenderedAttachments > 1 ? 'Attachments' : 'Attachment'}`
- );
- attachmentsContainerInner.parent().find(this.sel.numberOfAttachments).empty();
- gmailAttachmentLabelReplacement.appendTo(attachmentsContainerInner.parent().find(this.sel.numberOfAttachments));
- scannedByGmailLabel.appendTo(attachmentsContainerInner.parent().find(this.sel.numberOfAttachments));
- scannedByGmailPopover.appendTo(attachmentsContainerInner.parent().find(this.sel.numberOfAttachments));
+ const attachmentsLabel = nRenderedAttachments > 1 ? `${nRenderedAttachments} Attachments` : 'One Attachment';
+ attachmentsContainerInner.parent().find(this.sel.numberOfAttachmentsLabel).text(attachmentsLabel);
attachmentsContainerInner.parent().find(this.sel.numberOfAttachments).show();
}
if (!skipGoogleDrive) {
diff --git a/package-lock.json b/package-lock.json
index b7d8ab58d20..2c4bfa0d4cc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -186,9 +186,9 @@
}
},
"node_modules/@csstools/css-parser-algorithms": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz",
- "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz",
+ "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==",
"dev": true,
"funding": [
{
@@ -205,13 +205,13 @@
"node": ">=18"
},
"peerDependencies": {
- "@csstools/css-tokenizer": "^3.0.1"
+ "@csstools/css-tokenizer": "^3.0.2"
}
},
"node_modules/@csstools/css-tokenizer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz",
- "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz",
+ "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==",
"dev": true,
"funding": [
{
@@ -353,6 +353,7 @@
"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
"integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
@@ -421,6 +422,7 @@
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
"integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
@@ -454,6 +456,7 @@
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
"integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
@@ -469,9 +472,9 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
- "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz",
+ "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -818,6 +821,7 @@
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz",
"integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"debug": "^4.3.6",
"extract-zip": "^2.0.1",
@@ -853,7 +857,8 @@
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/chai": {
"version": "4.3.19",
@@ -877,6 +882,7 @@
"resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.278.tgz",
"integrity": "sha512-PDIJodOu7o54PpSOYLybPW/MDZBCjM1TKgf31I3Q/qaEbNpIH09rOM3tSEH3N7Q+FAqb1933LhF8ksUPYeQLNg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/filesystem": "*",
"@types/har-format": "*"
@@ -945,6 +951,7 @@
"resolved": "https://registry.npmjs.org/@types/mailparser/-/mailparser-3.4.5.tgz",
"integrity": "sha512-EPERBp7fLeFZh7tS2X36MF7jawUx3Y6/0rXciZah3CTYgwLi3e0kpGUJ6FOmUabgzis/U1g+3/JzrVWbWIOGjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*",
"iconv-lite": "^0.6.3"
@@ -958,9 +965,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.7.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz",
- "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==",
+ "version": "22.7.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz",
+ "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -971,7 +978,8 @@
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/sizzle": {
"version": "2.3.8",
@@ -1008,6 +1016,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz",
"integrity": "sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.10.0",
@@ -1041,6 +1050,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz",
"integrity": "sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/scope-manager": "8.10.0",
"@typescript-eslint/types": "8.10.0",
@@ -1069,6 +1079,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz",
"integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.10.0",
"@typescript-eslint/visitor-keys": "8.10.0"
@@ -1086,6 +1097,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz",
"integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@typescript-eslint/typescript-estree": "8.10.0",
"@typescript-eslint/utils": "8.10.0",
@@ -1110,6 +1122,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz",
"integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -1123,6 +1136,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz",
"integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/types": "8.10.0",
"@typescript-eslint/visitor-keys": "8.10.0",
@@ -1151,6 +1165,7 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -1160,6 +1175,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -1175,6 +1191,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz",
"integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.10.0",
@@ -1197,6 +1214,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz",
"integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.10.0",
"eslint-visitor-keys": "^3.4.3"
@@ -1214,6 +1232,7 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -1489,9 +1508,9 @@
}
},
"node_modules/acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
+ "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
"dev": true,
"license": "MIT",
"bin": {
@@ -2432,6 +2451,7 @@
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
"integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"tslib": "^2.0.1"
},
@@ -2546,7 +2566,8 @@
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
"integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/balanced-match": {
"version": "1.0.2",
@@ -2560,6 +2581,7 @@
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz",
"integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true
},
"node_modules/bare-fs": {
@@ -2567,6 +2589,7 @@
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz",
"integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
"dependencies": {
"bare-events": "^2.0.0",
@@ -2579,6 +2602,7 @@
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz",
"integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true
},
"node_modules/bare-path": {
@@ -2586,6 +2610,7 @@
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz",
"integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
"dependencies": {
"bare-os": "^2.1.0"
@@ -2596,6 +2621,7 @@
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.1.tgz",
"integrity": "sha512-Vm8kAeOcfzHPTH8sq0tHBnUqYrkXdroaBVVylqFT4cF5wnMfKEIxxy2jIGu2zKVNl9P8MAP9XBWwXJ9N2+jfEw==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
"dependencies": {
"streamx": "^2.20.0"
@@ -2627,6 +2653,7 @@
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
"integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.0.0"
}
@@ -2863,6 +2890,7 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@@ -2955,9 +2983,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001667",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
- "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
+ "version": "1.0.30001669",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz",
+ "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==",
"dev": true,
"funding": [
{
@@ -3175,6 +3203,7 @@
"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz",
"integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"mitt": "3.0.1",
"urlpattern-polyfill": "10.0.0",
@@ -3579,6 +3608,7 @@
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 12.0.0"
}
@@ -3777,6 +3807,7 @@
"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
"integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12 || >=16"
}
@@ -3803,6 +3834,7 @@
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz",
"integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"mdn-data": "2.10.0",
"source-map-js": "^1.0.1"
@@ -3855,6 +3887,7 @@
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
"integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 14"
}
@@ -4116,6 +4149,7 @@
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
"integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ast-types": "^0.13.4",
"escodegen": "^2.1.0",
@@ -4154,7 +4188,8 @@
"version": "0.0.1354347",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz",
"integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/dir-glob": {
"version": "3.0.1",
@@ -4296,9 +4331,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.32",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz",
- "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==",
+ "version": "1.5.41",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz",
+ "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==",
"dev": true,
"license": "ISC",
"peer": true
@@ -4494,6 +4529,7 @@
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
@@ -4515,6 +4551,7 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
"integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.11.0",
@@ -4597,6 +4634,7 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.3.tgz",
"integrity": "sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"@es-joy/jsdoccomment": "~0.49.0",
"are-docs-informative": "^0.0.2",
@@ -4912,6 +4950,7 @@
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
"get-stream": "^5.1.0",
@@ -4932,6 +4971,7 @@
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
@@ -4960,7 +5000,8 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-glob": {
"version": "3.3.2",
@@ -5011,11 +5052,11 @@
}
},
"node_modules/fast-uri": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz",
- "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
"dev": true,
- "license": "MIT"
+ "license": "BSD-3-Clause"
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
@@ -5460,9 +5501,9 @@
}
},
"node_modules/get-east-asian-width": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
- "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5520,6 +5561,7 @@
"resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz",
"integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"basic-ftp": "^5.0.2",
"data-uri-to-buffer": "^6.0.2",
@@ -5689,9 +5731,9 @@
}
},
"node_modules/google-auth-library": {
- "version": "9.14.1",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.1.tgz",
- "integrity": "sha512-Rj+PMjoNFGFTmtItH7gHfbHpGVSb3vmnGK3nwNBqxQF9NoBpttSZI/rc0WiM63ma2uGDQtYEkMHkK9U6937NiA==",
+ "version": "9.14.2",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.2.tgz",
+ "integrity": "sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -5927,6 +5969,7 @@
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"agent-base": "^7.1.0",
"debug": "^4.3.4"
@@ -6165,6 +6208,7 @@
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"jsbn": "1.1.0",
"sprintf-js": "^1.1.3"
@@ -6585,13 +6629,15 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/jsdoc-type-pratt-parser": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
"integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12.0.0"
}
@@ -7145,6 +7191,7 @@
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": ">=12"
}
@@ -7329,7 +7376,8 @@
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz",
"integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==",
- "dev": true
+ "dev": true,
+ "license": "CC0-1.0"
},
"node_modules/mem": {
"version": "9.0.2",
@@ -7530,7 +7578,8 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/mkdirp": {
"version": "3.0.1",
@@ -7575,9 +7624,9 @@
}
},
"node_modules/nan": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz",
- "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==",
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz",
+ "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==",
"dev": true,
"license": "MIT",
"optional": true
@@ -7620,6 +7669,7 @@
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
@@ -8161,6 +8211,7 @@
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz",
"integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@tootallnate/quickjs-emscripten": "^0.23.0",
"agent-base": "^7.0.2",
@@ -8180,6 +8231,7 @@
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
"integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"degenerator": "^5.0.0",
"netmask": "^2.0.2"
@@ -8284,26 +8336,26 @@
}
},
"node_modules/parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz",
+ "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "entities": "^4.4.0"
+ "entities": "^4.5.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5-htmlparser2-tree-adapter": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
- "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "domhandler": "^5.0.2",
+ "domhandler": "^5.0.3",
"parse5": "^7.0.0"
},
"funding": {
@@ -8424,9 +8476,9 @@
"license": "MIT"
},
"node_modules/picocolors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
- "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/picomatch": {
@@ -8897,6 +8949,7 @@
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.4.0"
}
@@ -8926,6 +8979,7 @@
"resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz",
"integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"agent-base": "^7.0.2",
"debug": "^4.3.4",
@@ -8944,7 +8998,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/pump": {
"version": "3.0.2",
@@ -8999,6 +9054,7 @@
"integrity": "sha512-l+Fgo8SVFSd51STtq2crz8t1Y3VXowsuR4zfR64qDOn6oggz7YIZauWiNR4IJjczQ6nvFs3S4cgng55/nesxTQ==",
"dev": true,
"hasInstallScript": true,
+ "license": "Apache-2.0",
"dependencies": {
"@puppeteer/browsers": "2.4.0",
"chromium-bidi": "0.8.0",
@@ -9019,6 +9075,7 @@
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.6.0.tgz",
"integrity": "sha512-se1bhgUpR9C529SgHGr/eyT92mYyQPAhA2S9pGtGrVG2xob9qE6Pbp7TlqiSPlnnY1lINqhn6/67EwkdzOmKqQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@puppeteer/browsers": "2.4.0",
"chromium-bidi": "0.8.0",
@@ -9082,7 +9139,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/quick-format-unescaped": {
"version": "4.0.4",
@@ -9899,6 +9957,7 @@
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
@@ -9909,6 +9968,7 @@
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
"integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
@@ -9923,6 +9983,7 @@
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
"integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"agent-base": "^7.1.1",
"debug": "^4.3.4",
@@ -9933,9 +9994,9 @@
}
},
"node_modules/sonic-boom": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz",
- "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz",
+ "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10036,7 +10097,8 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/squire-rte": {
"version": "2.3.2",
@@ -10072,6 +10134,7 @@
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz",
"integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-fifo": "^1.3.2",
"queue-tick": "^1.0.1",
@@ -10222,6 +10285,7 @@
"url": "https://github.com/sponsors/stylelint"
}
],
+ "license": "MIT",
"dependencies": {
"@csstools/css-parser-algorithms": "^3.0.1",
"@csstools/css-tokenizer": "^3.0.1",
@@ -10405,6 +10469,7 @@
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
@@ -10414,6 +10479,7 @@
"resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
"integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
@@ -10490,7 +10556,7 @@
"node": ">=8"
}
},
- "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": {
+ "node_modules/stylelint/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
@@ -10603,15 +10669,16 @@
"version": "11.14.4",
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.4.tgz",
"integrity": "sha512-8QMzjxCuinwm18EK5AtYvuhP+lRMRxTWVXy8om9wGlULsXSI4TD29kyih3VYrSXMMBlD4EShFvNC7slhTC7j0w==",
+ "license": "MIT",
"funding": {
"type": "individual",
"url": "https://github.com/sponsors/limonte"
}
},
"node_modules/synckit": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
- "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==",
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
+ "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10906,6 +10973,7 @@
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
"integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"pump": "^3.0.0",
"tar-stream": "^3.1.5"
@@ -10920,6 +10988,7 @@
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"b4a": "^1.6.4",
"fast-fifo": "^1.2.0",
@@ -10951,9 +11020,9 @@
}
},
"node_modules/terser": {
- "version": "5.34.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz",
- "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==",
+ "version": "5.36.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
+ "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
@@ -11018,7 +11087,8 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz",
"integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/text-table": {
"version": "0.2.0",
@@ -11158,6 +11228,7 @@
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=16"
},
@@ -11166,9 +11237,9 @@
}
},
"node_modules/tslib": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
- "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
"dev": true,
"license": "0BSD"
},
@@ -11212,7 +11283,8 @@
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
"integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/typedarray": {
"version": "0.0.6",
@@ -11226,6 +11298,7 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"dev": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -11239,6 +11312,7 @@
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.10.0.tgz",
"integrity": "sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.10.0",
"@typescript-eslint/parser": "8.10.0",
@@ -11269,6 +11343,7 @@
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"buffer": "^5.2.1",
"through": "^2.3.8"
@@ -11278,7 +11353,8 @@
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/universalify": {
"version": "2.0.1",
@@ -11389,7 +11465,8 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
"integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/util-deprecate": {
"version": "1.0.2",
@@ -12193,6 +12270,7 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
"integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
diff --git a/test/source/mock/google/exported-messages/message-export-191e2735a1cc08c4.json b/test/source/mock/google/exported-messages/message-export-191e2735a1cc08c4.json
new file mode 100644
index 00000000000..7d3cb1e1ad6
--- /dev/null
+++ b/test/source/mock/google/exported-messages/message-export-191e2735a1cc08c4.json
@@ -0,0 +1,231 @@
+{
+ "acctEmail": "flowcrypt.compatibility@gmail.com",
+ "full": {
+ "id": "191e2735a1cc08c4",
+ "threadId": "191e2735a1cc08c4",
+ "labelIds": ["INBOX"],
+ "snippet": "Address not found Your message wasn't delivered to some.test@flowcrypt.com because the address couldn't be found, or is unable to receive mail. LEARN MORE The response was: The email account",
+ "payload": {
+ "partId": "",
+ "mimeType": "multipart/report",
+ "filename": "",
+ "headers": [
+ {
+ "name": "X-Gm-Message-State",
+ "value": "AOJu0YzgTUR27IAdzxGSbpIMaIosovuRpdxOifXgx3TN2Y0YqZCMOtPL YK+TFxTwJ9z5FSpijFLf/OCKRO5wiSp8qflADNHUjDBS120iv1wGWQ0StxuUN4Swrg=="
+ },
+ {
+ "name": "Content-Type",
+ "value": "multipart/report; boundary=\"0000000000007b6f940621d4756e\"; report-type=delivery-status"
+ },
+ {
+ "name": "To",
+ "value": "flowcrypt.compatibility@gmail.com"
+ },
+ {
+ "name": "Auto-Submitted",
+ "value": "auto-replied"
+ },
+ {
+ "name": "Date",
+ "value": "Wed, 11 Sep 2024 02:17:28 -0700 (PDT)"
+ },
+ {
+ "name": "From",
+ "value": "sender@domain.com"
+ },
+ {
+ "name": "Subject",
+ "value": "Delivery Status Notification (Failure)"
+ },
+ {
+ "name": "References",
+ "value": ""
+ },
+ {
+ "name": "In-Reply-To",
+ "value": ""
+ }
+ ],
+ "body": {
+ "size": 0
+ },
+ "parts": [
+ {
+ "partId": "0",
+ "mimeType": "multipart/related",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "multipart/related; boundary=\"0000000000007b6fc80621d4756f\""
+ }
+ ],
+ "body": {
+ "size": 0
+ },
+ "parts": [
+ {
+ "partId": "0.0",
+ "mimeType": "multipart/alternative",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "multipart/alternative; boundary=\"0000000000007b6fca0621d47570\""
+ }
+ ],
+ "body": {
+ "size": 0
+ },
+ "parts": [
+ {
+ "partId": "0.0.0",
+ "mimeType": "text/plain",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "text/plain; charset=\"UTF-8\""
+ }
+ ],
+ "body": {
+ "size": 468,
+ "data": "CioqIEFkZHJlc3Mgbm90IGZvdW5kICoqCgpZb3VyIG1lc3NhZ2Ugd2Fzbid0IGRlbGl2ZXJlZCB0byBzb21lLnRlc3RAZmxvd2NyeXB0LmNvbSBiZWNhdXNlIHRoZSBhZGRyZXNzIGNvdWxkbid0IGJlIGZvdW5kLCBvciBpcyB1bmFibGUgdG8gcmVjZWl2ZSBtYWlsLgoKTGVhcm4gbW9yZSBoZXJlOiBodHRwczovL3N1cHBvcnQuZ29vZ2xlLmNvbS9tYWlsLz9wPU5vU3VjaFVzZXIKClRoZSByZXNwb25zZSB3YXM6CgpUaGUgZW1haWwgYWNjb3VudCB0aGF0IHlvdSB0cmllZCB0byByZWFjaCBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIHRyeSBkb3VibGUtY2hlY2tpbmcgdGhlIHJlY2lwaWVudCdzIGVtYWlsIGFkZHJlc3MgZm9yIHR5cG9zIG9yIHVubmVjZXNzYXJ5IHNwYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIGh0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL21haWwvP3A9Tm9TdWNoVXNlcgo="
+ }
+ },
+ {
+ "partId": "0.0.1",
+ "mimeType": "text/html",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "text/html; charset=\"UTF-8\""
+ }
+ ],
+ "body": {
+ "size": 1726,
+ "data": "CjxodG1sPgo8aGVhZD4KPHN0eWxlPgoqIHsKZm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwp9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cjx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJlbWFpbC13cmFwcGVyIiBzdHlsZT0icGFkZGluZy10b3A6MzJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7Ij48dGJvZHk+Cjx0cj48dGQ+Cjx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+PHRib2R5Pgo8dHI+PHRkIHN0eWxlPSJtYXgtd2lkdGg6NTYwcHg7cGFkZGluZzoyNHB4IDI0cHggMzJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Ym9yZGVyOjFweCBzb2xpZCAjZTBlMGUwO2JvcmRlci1yYWRpdXM6MnB4Ij4KPGltZyBzdHlsZT0icGFkZGluZzowIDI0cHggMTZweCAwO2Zsb2F0OmxlZnQiIHdpZHRoPTcyIGhlaWdodD03MiBhbHQ9IkVycm9yIEljb24iIHNyYz0iY2lkOmljb24ucG5nIj4KPHRhYmxlIHN0eWxlPSJtaW4td2lkdGg6MjcycHg7cGFkZGluZy10b3A6OHB4Ij48dGJvZHk+Cjx0cj48dGQ+PGgyIHN0eWxlPSJmb250LXNpemU6MjBweDtjb2xvcjojMjEyMTIxO2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luOjAiPgpBZGRyZXNzIG5vdCBmb3VuZAo8L2gyPjwvdGQ+PC90cj4KPHRyPjx0ZCBzdHlsZT0icGFkZGluZy10b3A6MjBweDtjb2xvcjojNzU3NTc1O2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmxlZnQiPgpZb3VyIG1lc3NhZ2Ugd2Fzbid0IGRlbGl2ZXJlZCB0byA8YSBzdHlsZT0nY29sb3I6IzIxMjEyMTt0ZXh0LWRlY29yYXRpb246bm9uZSc+PGI+c29tZS50ZXN0QGZsb3djcnlwdC5jb208L2I+PC9hPiBiZWNhdXNlIHRoZSBhZGRyZXNzIGNvdWxkbid0IGJlIGZvdW5kLCBvciBpcyB1bmFibGUgdG8gcmVjZWl2ZSBtYWlsLgo8L3RkPjwvdHI+Cjx0cj48dGQgc3R5bGU9InBhZGRpbmctdG9wOjI0cHg7Y29sb3I6IzQyODVGNDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246bGVmdCI+CjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSIgaHJlZj0iaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vbWFpbC8/cD1Ob1N1Y2hVc2VyIj5MRUFSTiBNT1JFPC9hPgo8L3RkPjwvdHI+CjwvdGJvZHk+PC90YWJsZT4KPC90ZD48L3RyPgo8L3Rib2R5PjwvdGFibGU+CjwvdGQ+PC90cj4KPHRyIHN0eWxlPSJib3JkZXI6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Zm9udC1zaXplOjEyLjhweDt3aWR0aDo5MCUiPgo8dGQgYWxpZ249ImxlZnQiIHN0eWxlPSJwYWRkaW5nOjQ4cHggMTBweCI+ClRoZSByZXNwb25zZSB3YXM6PGJyLz4KPHAgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+ClRoZSBlbWFpbCBhY2NvdW50IHRoYXQgeW91IHRyaWVkIHRvIHJlYWNoIGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgdHJ5IGRvdWJsZS1jaGVja2luZyB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcyBmb3IgdHlwb3Mgb3IgdW5uZWNlc3Nhcnkgc3BhY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ28gdG8gaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vbWFpbC8/cD1Ob1N1Y2hVc2VyCjwvcD4KPC90ZD4KPC90cj4KPC90Ym9keT48L3RhYmxlPgo8L2JvZHk+CjwvaHRtbD4K"
+ }
+ }
+ ]
+ },
+ {
+ "partId": "0.1",
+ "mimeType": "image/png",
+ "filename": "icon.png",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "image/png; name=\"icon.png\""
+ },
+ {
+ "name": "Content-Disposition",
+ "value": "attachment; filename=\"icon.png\""
+ },
+ {
+ "name": "Content-Transfer-Encoding",
+ "value": "base64"
+ },
+ {
+ "name": "Content-ID",
+ "value": ""
+ }
+ ],
+ "body": {
+ "attachmentId": "ANGjdJ8zObN8jOVfNv1HVRU08CoKr0Ana-qfEGw2MzRG6iNDj3MtCDoEK5s3E4czjlHghYdMGu2xYXPxxrbbCN2xSyqsoivJMDeE8cXQPTQYR8vMx6ih1qKirAGElfNgPRptmBiQTqbYgVXwvWnupzwEDqmp9kbIQAhR9ZHKs587VBMROx44HLC4O_jKRXnt5JJmKHv5rGlpvizphrXVemP8JKBgSZEbbTGnwbgqUaRJEMgle3HCEc50KJupnVpS1sIndhSlNfH_6hFeOutHD2BfUYgIrBiSIKcPq0kdWJkAg9X6nY6ip3iISD-mfXDaZwjgAKeluoxoINJvqjKcQ5PwRiBbObKy61oawUYEDGqWYB19wjuR1D_h_7ms12sfES7q2jCdp6v9KKTO_kn1",
+ "size": 1450
+ }
+ }
+ ]
+ },
+ {
+ "partId": "1",
+ "mimeType": "message/delivery-status",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "message/delivery-status"
+ }
+ ],
+ "body": {
+ "size": 0
+ },
+ "parts": [
+ {
+ "partId": "1.0",
+ "mimeType": "text/plain",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Reporting-MTA",
+ "value": "dns; googlemail.com"
+ },
+ {
+ "name": "Received-From-MTA",
+ "value": "dns; 3JmDhZgsJDakONURg.MNWRbeJUNX.LXVUJdaNWc.YRccNeJUNX.LXV@maestro.bounces.google.com"
+ },
+ {
+ "name": "Arrival-Date",
+ "value": "Wed, 11 Sep 2024 02:17:27 -0700 (PDT)"
+ },
+ {
+ "name": "X-Original-Message-ID",
+ "value": ""
+ }
+ ],
+ "body": {
+ "size": 385,
+ "data": "RmluYWwtUmVjaXBpZW50OiByZmM4MjI7IGxhdXJlbnQucGl0dGVAdmFsZW8uY29tDQpBY3Rpb246IGZhaWxlZA0KU3RhdHVzOiA1LjEuMw0KRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyBUaGUgZW1haWwgYWNjb3VudCB0aGF0IHlvdSB0cmllZCB0byByZWFjaCBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIHRyeSBkb3VibGUtY2hlY2tpbmcgdGhlIHJlY2lwaWVudCdzIGVtYWlsIGFkZHJlc3MgZm9yIHR5cG9zIG9yIHVubmVjZXNzYXJ5IHNwYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIGh0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL21haWwvP3A9Tm9TdWNoVXNlcg0KTGFzdC1BdHRlbXB0LURhdGU6IFdlZCwgMTEgU2VwIDIwMjQgMDI6MTc6MjggLTA3MDAgKFBEVCkNCg=="
+ }
+ }
+ ]
+ },
+ {
+ "partId": "2",
+ "mimeType": "message/global",
+ "filename": "",
+ "headers": [
+ {
+ "name": "Content-Type",
+ "value": "message/global"
+ },
+ {
+ "name": "Content-Transfer-Encoding",
+ "value": "quoted-printable"
+ }
+ ],
+ "body": {
+ "attachmentId": "ANGjdJ_dhUxPK-Ftqbti7HXGkUcthQoyePZPgX4GBfWROUyke6EDVQ1TVcHdaXMxn5ij34W_9fNZDlW4FanOtTxUEa0zWlmzMzJpxVmYhlah1WMBani7q7SPQtfOkbk4FHVkVgr-0_zOyBs2awz97hcvs2-ytfPzxqU6h4fPX4dqZxAOXFUZBXtrr3iDX17GSB_uWa28NB5SAgAh0fIZAulW8sRXb0bIvzCAAeh2LyHaHswcdNDC_K6FROLllicn6a5G2ofFoa2Fx1WXsN4XfNmflFDsNqjzlLfO2o05_valNPbGVs3UHi_yiNHo-GxDlm6gAJkBA8yRLaAw4S54XdYQnqDFIRpYL5RxpovV9TAhN8OUf7JuoQxqzjR6LYs",
+ "size": 5378
+ }
+ }
+ ]
+ },
+ "sizeEstimate": 20334,
+ "historyId": "235729",
+ "internalDate": "1726046248000"
+ },
+ "attachments": {
+ "ANGjdJ8zObN8jOVfNv1HVRU08CoKr0Ana-qfEGw2MzRG6iNDj3MtCDoEK5s3E4czjlHghYdMGu2xYXPxxrbbCN2xSyqsoivJMDeE8cXQPTQYR8vMx6ih1qKirAGElfNgPRptmBiQTqbYgVXwvWnupzwEDqmp9kbIQAhR9ZHKs587VBMROx44HLC4O_jKRXnt5JJmKHv5rGlpvizphrXVemP8JKBgSZEbbTGnwbgqUaRJEMgle3HCEc50KJupnVpS1sIndhSlNfH_6hFeOutHD2BfUYgIrBiSIKcPq0kdWJkAg9X6nY6ip3iISD-mfXDaZwjgAKeluoxoINJvqjKcQ5PwRiBbObKy61oawUYEDGqWYB19wjuR1D_h_7ms12sfES7q2jCdp6v9KKTO_kn1": {
+ "data": "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABTdJREFUeNrsnD9sFEcUh5-PRMqZyA0SPhAUQAQFUkyTgiBASARo6QApqVIkfdxGFJFSgGhJAUIiBaQB0ZIOKVCkwUgURjIg2fxL4kS-YDvkbC_388bi8N16Z4_d7J_5PsniuD3fyePP772ZeTsDQRAYQL_UGAJAIEAgQCBAIAAEAgQCBAIEAkAgyJT3Mv-Eq7vYK8mTE-MDRCAghQECAeRQA5V2ZOpmg5vDx3NPzRbmGRMEcmTrEbNNB8zWfRD-f_Efs2e3zCZvMjaksBg27TfbcuSNPEKP9ZyuAQKtHX2O9ncNgWC57umMPKvRNb0GEKgnLoUyxTQCrcns0_6uIRAs8_hGf9cQCJZpTpjdO2f25_03z-mxntM1eLtsZAgiUtX4JcaBCAQIBAgECARQ8CJaG5jab4J4pm4WZmO3OALVh802fIwcLkyPkcKAGggAgQCBAIEAgQCBABAIEAjKA_1AnahhbO5FdOOYVsrrDbPBYcYKgf5D2wLaV3p-22xh1u17tO3S-DTcvxvagUDeivPgx_a_95J_73w7Sj26Hn4pKo2MehuV_KyBJM6d0f7k6RKx_R63vvL2tmf_ItDdM2ZTP6f7nkp9Y2fDx1v9akmpIU-KSCLVUghUQfSLzVKeTklbLxGoctw_nzC5rw8L5KRNbkpnKq6pgSqEClzNnFzY-XnYWrt6VpVk1vbwWvg-RKCKMOUwQ1LEOXA-_MX3mpJvGDHb265xtnzmFoUK1HaKQGlMtePYM-q2KKjXuaS1NJYIEKgI8jhEgqHt4cqyKy53j3hyHz2bqSLp2o2LbJ7MxKovkGqXteoWpaOk96O9_yF_dF7NwlS36AuIQIBA5celQK4PIxBE4LLzrtoLgaALdSy6CJRkWQCBPGLsTHznomZ9nszUECgJ2ml3WWHe-QVFNPSQx6UdZNtxr9pbEShNeTTz8mQXHoHSlke7-Z-c9m6VGoHSkEfs_trLW3wQKApN1V3lGfnGu2Z6BFoLtYCs3GWBPAiUCLVh_HoaeRCoT9R873KLM_IgUBfapnCpe5AHgXry4pf412ihEHkQqCdxd5VqrcezhUIESsJMTJ-PdthpZ0WgyNlXXPHc2Mc4IVAELl2Gnh8mhUDvCkfbIVAkcbf_aOoO3fMKhqAD3frTa4quwpn0hUDOkQhIYYBAgECAQAAU0QlYObl-5Ug8NcprZkZxjUCxRPVA6zmtEXHCBykskrhjgHXN09PoEcgFl4M4H11jnBAoApcj6ZoPGScEAgTKApcDoTw5sgWB-sGlz1n90IBAPdE6j1o21PfcC11jLagL1oFWRyGlKU3pOxcSJQ7NZAjkhHp_uG2HFAYIBAgECASAQIBAgECAQAAIBOkxEARBtp9wdVfAMOfIifEBIhCQwgCBABAI0oV2jhxZ-nfBatuPZfgBCy0Eqqo8c01b-uu51XZvzOgDWoHNTGR-pCwpLEd5svuAZXlO2uErPyEQ8hRWHgRCHmqg0sjTnLalv6crJQ8C_U8stqNO0I4-VZOHFIY8COS1PGL2ybd5yUMKK7s8zYmLdujyd3n-nESgcsvzZd4_KwIhDwIhT35QA6UyE1qyxZnfvJMHgdKS549JC1qvvJOHFIY8CFR5eV5OXimqPAhUdHnmfx-zgxdOFXkoqIGKKs_cswnb_8Oeog8HEai48nxUhiFBIORBIOShBioskkbySCLkIQIhDwIhj28p7FApR6b1qlEbHGpkO_rr6215vi_zH1r2x7tApSGFAQIBAgECAQIBIBAgECAQIBBALK8FGADCTxYrr-EVJgAAAABJRU5ErkJggg",
+ "size": 1450
+ },
+ "ANGjdJ_dhUxPK-Ftqbti7HXGkUcthQoyePZPgX4GBfWROUyke6EDVQ1TVcHdaXMxn5ij34W_9fNZDlW4FanOtTxUEa0zWlmzMzJpxVmYhlah1WMBani7q7SPQtfOkbk4FHVkVgr-0_zOyBs2awz97hcvs2-ytfPzxqU6h4fPX4dqZxAOXFUZBXtrr3iDX17GSB_uWa28NB5SAgAh0fIZAulW8sRXb0bIvzCAAeh2LyHaHswcdNDC_K6FROLllicn6a5G2ofFoa2Fx1WXsN4XfNmflFDsNqjzlLfO2o05_valNPbGVs3UHi_yiNHo-GxDlm6gAJkBA8yRLaAw4S54XdYQnqDFIRpYL5RxpovV9TAhN8OUf7JuoQxqzjR6LYs": {
+ "data": "WC1SZWNlaXZlZDogYnkgMjAwMjphMDU6NjYwMjo2ZDE0OmIwOjgyYzpmNDNmOmJhZmUgd2l0aCBTTVRQIGlkIGNhMThlMjM2MGY0YWMtODJjZjQzZmJkMzdtcjEwNzA1MDgyMzlmLjguMTcyNjA0NjI0NzM0MzsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI3IC0wNzAwIChQRFQpClJldHVybi1QYXRoOiA8M0ptRGhaZ3NKRGFrT05VUmcuTU5XUmJlSlVOWC5MWFZVSmRhTldjLllSY2NOZUpVTlguTFhWQG1hZXN0cm8uYm91bmNlcy5nb29nbGUuY29tPgpSZWNlaXZlZDogZnJvbSBtYWlsLXNvci1mNjkuZ29vZ2xlLmNvbSAobWFpbC1zb3ItZjY5Lmdvb2dsZS5jb20uIFsyMDkuODUuMjIwLjY5XSkKICAgICAgICBieSBteC5nb29nbGUuY29tIHdpdGggU01UUFMgaWQgODkyNmM2ZGExY2I5Zi00ZDIwZWRjMDUwNnNvcjUxMTAwMzE3My42LjIwMjQuMDkuMTEuMDIuMTcuMjcKICAgICAgICBmb3IgPGZsb3djcnlwdC5jb21wYXRpYmlsaXR5QGdtYWlsLmNvbT4KICAgICAgICAoR29vZ2xlIFRyYW5zcG9ydCBTZWN1cml0eSk7CiAgICAgICAgV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyNyAtMDcwMCAoUERUKQpSZWNlaXZlZC1TUEY6IHBhc3MgKGdvb2dsZS5jb206IGRvbWFpbiBvZiAzam1kaHpnc2pkYWtvbnVyZy5tbndyYmVqdW54Lmx4dnVqZGFud2MueXJjY25lanVueC5seHZAbWFlc3Ryby5ib3VuY2VzLmdvb2dsZS5jb20gZGVzaWduYXRlcyAyMDkuODUuMjIwLjY5IGFzIHBlcm1pdHRlZCBzZW5kZXIpIGNsaWVudC1pcD0yMDkuODUuMjIwLjY5OwpNSU1FLVZlcnNpb246IDEuMApYLVJlY2VpdmVkOiBieSAyMDAyOmEwNTo2ZTAyOjFhNjU6YjA6M2EwOjU1NjY6YmRhNSB3aXRoIFNNVFAgaWQKIGU5ZTE0YTU1OGY4YWItM2EwNTc0NWYwMjZtcjEyNTcyNjc1NWFiLjkuMTcyNjA0NjI0Njg3MzsgV2VkLCAxMSBTZXAgMjAyNAogMDI6MTc6MjYgLTA3MDAgKFBEVCkKTWVzc2FnZS1JRDogPGF1dG9nZW4tamF2YS04MDVjOTIwNS0zM2I5LTQ3ZmUtYTRlNS1jNzk5YWQ2NmVmZThAZ29vZ2xlLmNvbT4KRGF0ZTogV2VkLCAxMSBTZXAgMjAyNCAwOToxNzoyNiArMDAwMApTdWJqZWN0OiA9P1VURi04P1E/UG9ydGFpbF9kZV9jeWJlcnNlY3VyaXQ9QzM9QTlfbG9jYWxfPTJGX0xvY2FsX2N5YmVyc2VjdXJpdD89Cgk9P1VURi04P1E/eV9wb3J0YWxfPTI4bGF1cmVudD0yRXBpdHRlPTQwdmFsZW89MkVjb209Mjk/PQpGcm9tOiBmbG93Y3J5cHQuY29tcGF0aWJpbGl0eUBnbWFpbC5jb20KVG86IHNvbWUudGVzdEBmbG93Y3J5cHQuY29tCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iMDAwMDAwMDAwMDAwNjk0OTFhMDYyMWQ0NzVmZSIKCi0tLS0tIE1lc3NhZ2UgdHJ1bmNhdGVkIC0tLS0t",
+ "size": 5378
+ }
+ },
+ "raw": {
+ "id": "191e2735a1cc08c4",
+ "threadId": "191e2735a1cc08c4",
+ "labelIds": ["INBOX"],
+ "snippet": "Address not found Your message wasn't delivered to some.test@flowcrypt.com because the address couldn't be found, or is unable to receive mail. LEARN MORE The response was: The email account",
+ "sizeEstimate": 20334,
+ "raw": "RGVsaXZlcmVkLVRvOiBmbG93Y3J5cHQuY29tcGF0aWJpbGl0eUBnbWFpbC5jb20KUmVjZWl2ZWQ6IGJ5IDIwMDI6YTk4OjlhODM6MDpiMDoyMGU6MTRmNDo0Yzk2IHdpdGggU01UUCBpZCBwM2NzcDE4NjcxOWVpYzsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI5IC0wNzAwIChQRFQpClgtUmVjZWl2ZWQ6IGJ5IDIwMDI6YTA1OjYyMGE6NDVhNjpiMDo3YTk6YmYzMTpkYmM5IHdpdGggU01UUCBpZCBhZjc5Y2QxM2JlMzU3LTdhOWJmMzFkZWE5bXI5MzExNTAwODVhLjQuMTcyNjA0NjI0ODg3NTsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI4IC0wNzAwIChQRFQpClJldHVybi1QYXRoOiA8PgpSZWNlaXZlZDogZnJvbSBtYWlsLXNvci1mNjkuZ29vZ2xlLmNvbSAobWFpbC1zb3ItZjY5Lmdvb2dsZS5jb20uIFsyMDkuODUuMjIwLjY5XSkKICAgICAgICBieSBteC5nb29nbGUuY29tIHdpdGggU01UUFMgaWQgYWY3OWNkMTNiZTM1Ny03YTlhN2EyZGE1N3NvcjY4NzIxOTE4NWEuMTMuMjAyNC4wOS4xMS4wMi4xNy4yOAogICAgICAgIGZvciA8Zmxvd2NyeXB0LmNvbXBhdGliaWxpdHlAZ21haWwuY29tPgogICAgICAgIChHb29nbGUgVHJhbnNwb3J0IFNlY3VyaXR5KTsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI4IC0wNzAwIChQRFQpClJlY2VpdmVkLVNQRjogbm9uZSAoZ29vZ2xlLmNvbTogbWFpbC1zb3ItZjY5Lmdvb2dsZS5jb20gZG9lcyBub3QgZGVzaWduYXRlIHBlcm1pdHRlZCBzZW5kZXIgaG9zdHMpIGNsaWVudC1pcD0yMDkuODUuMjIwLjY5OwpBdXRoZW50aWNhdGlvbi1SZXN1bHRzOiBteC5nb29nbGUuY29tOwogICAgICAgZGtpbT1wYXNzIGhlYWRlci5pPUBnb29nbGVtYWlsLmNvbSBoZWFkZXIucz0yMDIzMDYwMSBoZWFkZXIuYj1iR0Z5U0JIRDsKICAgICAgIGFyYz1wYXNzIChpPTEgZGtpbT1wYXNzIGRrZG9tYWluPWdvb2dsZW1haWwuY29tIGRtYXJjPXBhc3MgZnJvbWRvbWFpbj1nb29nbGVtYWlsLmNvbSk7CiAgICAgICBzcGY9bm9uZSAoZ29vZ2xlLmNvbTogbWFpbC1zb3ItZjY5Lmdvb2dsZS5jb20gZG9lcyBub3QgZGVzaWduYXRlIHBlcm1pdHRlZCBzZW5kZXIgaG9zdHMpIHNtdHAuaGVsbz1tYWlsLXNvci1mNjkuZ29vZ2xlLmNvbTsKICAgICAgIGRtYXJjPXBhc3MgKHA9UVVBUkFOVElORSBzcD1RVUFSQU5USU5FIGRpcz1OT05FKSBoZWFkZXIuZnJvbT1nb29nbGVtYWlsLmNvbTsKICAgICAgIGRhcmE9ZmFpbCBoZWFkZXIuaT1AZ21haWwuY29tClgtUmVjZWl2ZWQ6IGJ5IDIwMDI6YTA1OjYyMGE6MjhkMzpiMDo3YTk6YmFkMDo0NTVkIHdpdGggU01UUCBpZCBhZjc5Y2QxM2JlMzU3LTdhOWJhZDA0OTZhbXIxMTk0MzMwNjg1YS4zMC4xNzI2MDQ2MjQ4NjYxOwogICAgICAgIFdlZCwgMTEgU2VwIDIwMjQgMDI6MTc6MjggLTA3MDAgKFBEVCkKUmVjZWl2ZWQ6IGJ5IDIwMDI6YWU5OmUzMDE6MDpiMDo3YTk6YjVlYTphODRhIHdpdGggU01UUCBpZCBhZjc5Y2QxM2JlMzU3LTdhOWI1ZWFhYThhYW0xOTI5ODY0ODVhLjAKICAgICAgICAgV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyOCAtMDcwMCAoUERUKQpYLUdvb2dsZS1TbXRwLVNvdXJjZTogQUdIVCtJSDNHWDJHK05DUzlhbUc2VERGai9WVzN2bTVaOVBON0toSjR2ZFF4VHJhME1MaTlRcENuY0RxckdpSGRvc3h4R1BLbTB0VApYLVJlY2VpdmVkOiBieSAyMDAyOmEwNTo2MjBhOjJhMGM6YjA6N2E5Ojg0YjU6MTRlMiB3aXRoIFNNVFAgaWQgYWY3OWNkMTNiZTM1Ny03YTk5NzM3YWEyY21yMjMxNjAzNzg4NWEuNDAuMTcyNjA0NjI0ODQ0MTsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI4IC0wNzAwIChQRFQpClJldHVybi1QYXRoOiA8PgpSZWNlaXZlZDogZnJvbSBtYWlsLWlvMS14ZDQ0Lmdvb2dsZS5jb20gKG1haWwtaW8xLXhkNDQuZ29vZ2xlLmNvbS4gWzI2MDc6ZjhiMDo0ODY0OjIwOjpkNDRdKQogICAgICAgIGJ5IGdtci1teC5nb29nbGUuY29tIHdpdGggRVNNVFBTIGlkIGFmNzljZDEzYmUzNTctN2E5YTc5NDg1NWNzaTMzOTczODg1YS4yLjIwMjQuMDkuMTEuMDIuMTcuMjgKICAgICAgICBmb3IgPDNKbURoWmdzSkRha09OVVJnLk1OV1JiZUpVTlguTFhWVUpkYU5XYy5ZUmNjTmVKVU5YLkxYVkBtYWVzdHJvLmJvdW5jZXMuZ29vZ2xlLmNvbT4KICAgICAgICAodmVyc2lvbj1UTFMxXzMgY2lwaGVyPVRMU19BRVNfMTI4X0dDTV9TSEEyNTYgYml0cz0xMjgvMTI4KTsKICAgICAgICBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI4IC0wNzAwIChQRFQpClJlY2VpdmVkLVNQRjogbm9uZSAoZ29vZ2xlLmNvbTogbWFpbC1pbzEteGQ0NC5nb29nbGUuY29tIGRvZXMgbm90IGRlc2lnbmF0ZSBwZXJtaXR0ZWQgc2VuZGVyIGhvc3RzKSBjbGllbnQtaXA9MjYwNzpmOGIwOjQ4NjQ6MjA6OmQ0NDsKUmVjZWl2ZWQ6IGJ5IG1haWwtaW8xLXhkNDQuZ29vZ2xlLmNvbSB3aXRoIFNNVFAgaWQgY2ExOGUyMzYwZjRhYy04MmFhYjY3OWI3YnNvMTY1NTg2MTM5Zi4wCiAgICAgICAgZm9yIDwzSm1EaFpnc0pEYWtPTlVSZy5NTldSYmVKVU5YLkxYVlVKZGFOV2MuWVJjY05lSlVOWC5MWFZAbWFlc3Ryby5ib3VuY2VzLmdvb2dsZS5jb20+OyBXZWQsIDExIFNlcCAyMDI0IDAyOjE3OjI4IC0wNzAwIChQRFQpClgtUmVjZWl2ZWQ6IGJ5IDIwMDI6YTA1OjY2MDI6NmQxNDpiMDo4MmM6ZjQzZjpiYWZlIHdpdGggU01UUCBpZCBjYTE4ZTIzNjBmNGFjLTgyY2Y0M2ZiZDM3bXIxMDcwNTExMjM5Zi44LjE3MjYwNDYyNDgwNzI7CiAgICAgICAgV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyOCAtMDcwMCAoUERUKQpDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA3YjZmOTQwNjIxZDQ3NTZlIjsgcmVwb3J0LXR5cGU9ZGVsaXZlcnktc3RhdHVzClRvOiAzSm1EaFpnc0pEYWtPTlVSZy5NTldSYmVKVU5YLkxYVlVKZGFOV2MuWVJjY05lSlVOWC5MWFZAbWFlc3Ryby5ib3VuY2VzLmdvb2dsZS5jb20KUmVjZWl2ZWQ6IGJ5IDIwMDI6YTA1OjY2MDI6NmQxNDpiMDo4MmM6ZjQzZjpiYWZlIHdpdGggU01UUCBpZAogY2ExOGUyMzYwZjRhYy04MmNmNDNmYmQzN21yMTA4MzYzOTYzOWYuODsgV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyOCAtMDcwMCAoUERUKQpSZXR1cm4tUGF0aDogPD4KQXV0by1TdWJtaXR0ZWQ6IGF1dG8tcmVwbGllZApNZXNzYWdlLUlEOiA8NjZlMTYwMjguMDUwYTAyMjAuZWJjOWYuYjU1Zi5HTVJAbXguZ29vZ2xlLmNvbT4KRGF0ZTogV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyOCAtMDcwMCAoUERUKQpGcm9tOiBNYWlsIERlbGl2ZXJ5IFN1YnN5c3RlbSA8bWFpbGVyLWRhZW1vbkBnb29nbGVtYWlsLmNvbT4KU3ViamVjdDogRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiAoRmFpbHVyZSkKUmVmZXJlbmNlczogPGF1dG9nZW4tamF2YS04MDVjOTIwNS0zM2I5LTQ3ZmUtYTRlNS1jNzk5YWQ2NmVmZThAZ29vZ2xlLmNvbT4KSW4tUmVwbHktVG86IDxhdXRvZ2VuLWphdmEtODA1YzkyMDUtMzNiOS00N2ZlLWE0ZTUtYzc5OWFkNjZlZmU4QGdvb2dsZS5jb20+ClgtRmFpbGVkLVJlY2lwaWVudHM6IHNvbWUudGVzdEBmbG93Y3J5cHQuY29tCgotLTAwMDAwMDAwMDAwMDdiNmY5NDA2MjFkNDc1NmUKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9IjAwMDAwMDAwMDAwMDdiNmZjODA2MjFkNDc1NmYiCgotLTAwMDAwMDAwMDAwMDdiNmZjODA2MjFkNDc1NmYKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA3YjZmY2EwNjIxZDQ3NTcwIgoKLS0wMDAwMDAwMDAwMDA3YjZmY2EwNjIxZDQ3NTcwCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiCgoKKiogQWRkcmVzcyBub3QgZm91bmQgKioKCllvdXIgbWVzc2FnZSB3YXNuJ3QgZGVsaXZlcmVkIHRvIHNvbWUudGVzdEBmbG93Y3J5cHQuY29tIGJlY2F1c2UgdGhlIGFkZHJlc3MgY291bGRuJ3QgYmUgZm91bmQsIG9yIGlzIHVuYWJsZSB0byByZWNlaXZlIG1haWwuCgpMZWFybiBtb3JlIGhlcmU6IGh0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL21haWwvP3A9Tm9TdWNoVXNlcgoKVGhlIHJlc3BvbnNlIHdhczoKClRoZSBlbWFpbCBhY2NvdW50IHRoYXQgeW91IHRyaWVkIHRvIHJlYWNoIGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgdHJ5IGRvdWJsZS1jaGVja2luZyB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcyBmb3IgdHlwb3Mgb3IgdW5uZWNlc3Nhcnkgc3BhY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ28gdG8gaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vbWFpbC8/cD1Ob1N1Y2hVc2VyCgotLTAwMDAwMDAwMDAwMDdiNmZjYTA2MjFkNDc1NzAKQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9IlVURi04IgoKCjxodG1sPgo8aGVhZD4KPHN0eWxlPgoqIHsKZm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwp9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cjx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJlbWFpbC13cmFwcGVyIiBzdHlsZT0icGFkZGluZy10b3A6MzJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7Ij48dGJvZHk+Cjx0cj48dGQ+Cjx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+PHRib2R5Pgo8dHI+PHRkIHN0eWxlPSJtYXgtd2lkdGg6NTYwcHg7cGFkZGluZzoyNHB4IDI0cHggMzJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Ym9yZGVyOjFweCBzb2xpZCAjZTBlMGUwO2JvcmRlci1yYWRpdXM6MnB4Ij4KPGltZyBzdHlsZT0icGFkZGluZzowIDI0cHggMTZweCAwO2Zsb2F0OmxlZnQiIHdpZHRoPTcyIGhlaWdodD03MiBhbHQ9IkVycm9yIEljb24iIHNyYz0iY2lkOmljb24ucG5nIj4KPHRhYmxlIHN0eWxlPSJtaW4td2lkdGg6MjcycHg7cGFkZGluZy10b3A6OHB4Ij48dGJvZHk+Cjx0cj48dGQ+PGgyIHN0eWxlPSJmb250LXNpemU6MjBweDtjb2xvcjojMjEyMTIxO2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luOjAiPgpBZGRyZXNzIG5vdCBmb3VuZAo8L2gyPjwvdGQ+PC90cj4KPHRyPjx0ZCBzdHlsZT0icGFkZGluZy10b3A6MjBweDtjb2xvcjojNzU3NTc1O2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmxlZnQiPgpZb3VyIG1lc3NhZ2Ugd2Fzbid0IGRlbGl2ZXJlZCB0byA8YSBzdHlsZT0nY29sb3I6IzIxMjEyMTt0ZXh0LWRlY29yYXRpb246bm9uZSc+PGI+c29tZS50ZXN0QGZsb3djcnlwdC5jb208L2I+PC9hPiBiZWNhdXNlIHRoZSBhZGRyZXNzIGNvdWxkbid0IGJlIGZvdW5kLCBvciBpcyB1bmFibGUgdG8gcmVjZWl2ZSBtYWlsLgo8L3RkPjwvdHI+Cjx0cj48dGQgc3R5bGU9InBhZGRpbmctdG9wOjI0cHg7Y29sb3I6IzQyODVGNDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246bGVmdCI+CjxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZSIgaHJlZj0iaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vbWFpbC8/cD1Ob1N1Y2hVc2VyIj5MRUFSTiBNT1JFPC9hPgo8L3RkPjwvdHI+CjwvdGJvZHk+PC90YWJsZT4KPC90ZD48L3RyPgo8L3Rib2R5PjwvdGFibGU+CjwvdGQ+PC90cj4KPHRyIHN0eWxlPSJib3JkZXI6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Zm9udC1zaXplOjEyLjhweDt3aWR0aDo5MCUiPgo8dGQgYWxpZ249ImxlZnQiIHN0eWxlPSJwYWRkaW5nOjQ4cHggMTBweCI+ClRoZSByZXNwb25zZSB3YXM6PGJyLz4KPHAgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSI+ClRoZSBlbWFpbCBhY2NvdW50IHRoYXQgeW91IHRyaWVkIHRvIHJlYWNoIGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgdHJ5IGRvdWJsZS1jaGVja2luZyB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcyBmb3IgdHlwb3Mgb3IgdW5uZWNlc3Nhcnkgc3BhY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ28gdG8gaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vbWFpbC8/cD1Ob1N1Y2hVc2VyCjwvcD4KPC90ZD4KPC90cj4KPC90Ym9keT48L3RhYmxlPgo8L2JvZHk+CjwvaHRtbD4KCi0tMDAwMDAwMDAwMDAwN2I2ZmNhMDYyMWQ0NzU3MC0tCi0tMDAwMDAwMDAwMDAwN2I2ZmM4MDYyMWQ0NzU2ZgpDb250ZW50LVR5cGU6IGltYWdlL3BuZzsgbmFtZT0iaWNvbi5wbmciCkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJpY29uLnBuZyIKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CkNvbnRlbnQtSUQ6IDxpY29uLnBuZz4KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKQUFBQUNRQ0FZQUFBRG5SdUs0QUFBQUNYQklXWE1BQUJZbEFBQVdKUUZKVWlUd0FBQUEKR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQlRkSlJFRlVlTnJzbkQ5c0ZFY1VoNStQUk1xWgp5QTBTUGhBVVFBUUZVa3lUZ2lCQVNBUm82UUFwcVZJa2ZkeEdGSkZTZ0doSkFVSWlCYVFCMFpJT0tWQ2t3VWdVUmpJZzJmeEw0a1MrCllEdmtiQy8zODhiaThOMTZaNC9kN0ovNVBzbml1RDNmeWVQUDc3MlplVHNEUVJBWVFML1VHQUpBSUVBZ1FDQkFJQUFFQWdRQ0JBSUUKQWtBZ3lKVDNNditFcTd2WUs4bVRFK01EUkNBZ2hRRUNBZVJRQTVWMlpPcG1nNXZEeDNOUHpSYm1HUk1FY21UckViTk5COHpXZlJEKwpmL0VmczJlM3pDWnZNamFrc0JnMjdUZmJjdVNOUEVLUDlaeXVBUUt0SFgyTzluY05nV0M1N3VtTVBLdlJOYjBHRUtnbkxvVXl4VFFDCnJjbnMwLzZ1SVJBczgvaEdmOWNRQ0pacFRwamRPMmYyNS8wM3orbXhudE0xZUx0c1pBZ2lVdFg0SmNhQkNBUUlCQWdFQ0FSUThDSmEKRzVqYWI0SjRwbTRXWm1PM09BTFZoODAyZkl3Y0xreVBrY0tBR2dnQWdRQ0JBSUVBZ1FDQkFCQUlFQWpLQS8xQW5haGhiTzVGZE9PWQpWc3JyRGJQQlljWUtnZjVEMndMYVYzcCsyMnhoMXUxN3RPM1MrRFRjdnh2YWdVRGVpdlBneC9hLzk1Si83M3c3U2oyNkhuNHBLbzJNCmVodVYvS3lCSk02ZDBmN2s2Ukt4L1I2M3Z2TDJ0bWYvSXREZE0yWlRQNmY3bmtwOVkyZkR4MXY5YWttcElVK0tTQ0xWVWdoVVFmU0wKelZLZVRrbGJMeEdvY3R3L256QzVydzhMNUtSTmJrcG5LcTZwZ1NxRUNsek5uRnpZK1huWVdydDZWcFZrMXZid1d2ZytSS0NLTU9VdwpRMUxFT1hBKy9NWDNtcEp2R0RIYjI2NXh0bnptRm9VSzFIYUtRR2xNdGVQWU0rcTJLS2pYdWFTMU5KWUlFS2dJOGpoRWdxSHQ0Y3F5Ckt5NTNqM2h5SHoyYnFTTHAybzJMYko3TXhLb3ZrR3FYdGVvV3BhT2s5Nk85L3lGL2RGN053bFMzNkF1SVFJQkE1Y2VsUUs0UEl4QkUKNExMenJ0b0xnYUFMZFN5NkNKUmtXUUNCUEdMc1RIem5vbVo5bnN6VUVDZ0oybWwzV1dIZStRVkZOUFNReDZVZFpOdHhyOXBiRVNoTgplVFR6OG1RWEhvSFNsa2U3K1orYzltNlZHb0hTa0Vmcy90ckxXM3dRS0FwTjFWM2xHZm5HdTJaNkJGb0x0WUNzM0dXQlBBaVVDTFZoCi9Ib2FlUkNvVDlSODczS0xNL0lnVUJmYXBuQ3BlNUFIZ1hyeTRwZjQxMmloRUhrUXFDZHhkNVZxcmNlemhVSUVTc0pNVEorUGR0aHAKWjBXZ3lObFhYUEhjMk1jNElWQUVMbDJHbmg4bWhVRHZDa2ZiSVZBa2NiZi9hT29PM2ZNS2hxQUQzZnJUYTRxdXdwbjBoVURPa1FoSQpZWUJBZ0VDQVFBQVUwUWxZT2JsKzVVZzhOY3ByWmtaeGpVQ3hSUFZBNnptdEVYSENCeWtza3JoamdIWE4wOVBvRWNnRmw0TTRIMTFqCm5CQW9BcGNqNlpvUEdTY0VBZ1RLQXBjRG9UdzVzZ1dCK3NHbHoxbjkwSUJBUGRFNmoxbzIxUGZjQzExakxhZ0wxb0ZXUnlHbEtVM3AKT3hjU0pRN05aQWpraEhwL3VHMkhGQVlJQkFnRUNBU0FRSUJBZ0VDQVFBQUlCT2t4RUFSQnRwOXdkVmZBTU9mSWlmRUJJaENRd2dDQgpBQkFJMG9WMmpoeForbmZCYXR1UFpmZ0JDeTBFcXFvOGMwMWIrdXU1MVhadnpPZ0RXb0hOVEdSK3BDd3BMRWQ1c3Z1QVpYbE8ydUVyClB5RVE4aFJXSGdSQ0htcWcwc2pUbkxhbHY2Y3JKUThDL1U4c3RxTk8wSTQrVlpPSEZJWThDT1MxUEdMMnliZDV5VU1LSzdzOHpZbUwKZHVqeWQzbituRVNnY3N2elpkNC9Ld0loRHdJaFQzNVFBNlV5RTFxeXhabmZ2Sk1IZ2RLUzU0OUpDMXF2dkpPSEZJWThDRlI1ZVY1TwpYaW1xUEFoVWRIbm1meCt6Z3hkT0ZYa29xSUdLS3MvY3N3bmIvOE9lb2c4SEVhaTQ4bnhVaGlGQklPUkJJT1NoQmlvc2trYnlTQ0xrCklRSWhEd0loajI4cDdGQXBSNmIxcWxFYkhHcGtPL3JyNjIxNXZpL3pIMXIyeDd0QXBTR0ZBUUlCQWdFQ0FRSUJJQkFnRUNBUUlCQkEKTEs4RkdBRENUeFlycitFVkpnQUFBQUJKUlU1RXJrSmdnZz09Ci0tMDAwMDAwMDAwMDAwN2I2ZmM4MDYyMWQ0NzU2Zi0tCi0tMDAwMDAwMDAwMDAwN2I2Zjk0MDYyMWQ0NzU2ZQpDb250ZW50LVR5cGU6IG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzCgpBcnJpdmFsLURhdGU6IFdlZCwgMTEgU2VwIDIwMjQgMDI6MTc6MjcgLTA3MDAgKFBEVCkKWC1PcmlnaW5hbC1NZXNzYWdlLUlEOiA8YXV0b2dlbi1qYXZhLTgwNWM5MjA1LTMzYjktNDdmZS1hNGU1LWM3OTlhZDY2ZWZlOEBnb29nbGUuY29tPgoKRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHNvbWUudGVzdEBmbG93Y3J5cHQuY29tCkFjdGlvbjogZmFpbGVkClN0YXR1czogNS4xLjMKRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyBUaGUgZW1haWwgYWNjb3VudCB0aGF0IHlvdSB0cmllZCB0byByZWFjaCBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIHRyeSBkb3VibGUtY2hlY2tpbmcgdGhlIHJlY2lwaWVudCdzIGVtYWlsIGFkZHJlc3MgZm9yIHR5cG9zIG9yIHVubmVjZXNzYXJ5IHNwYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIGh0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL21haWwvP3A9Tm9TdWNoVXNlcgpMYXN0LUF0dGVtcHQtRGF0ZTogV2VkLCAxMSBTZXAgMjAyNCAwMjoxNzoyOCAtMDcwMCAoUERUKQoKLS0wMDAwMDAwMDAwMDA3YjZmOTQwNjIxZDQ3NTZlCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9nbG9iYWwKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQoKWC1SZWNlaXZlZDogYnkgMjAwMjphMDU6NjYwMjo2ZDE0OmIwOjgyYzpmNDNmOmJhZmUgd2l0aCBTTVRQIGlkIGNhMThlMjM2MGY0PQphYy04MmNmNDNmYmQzN21yMTA3MDUwODIzOWYuOC4xNzI2MDQ2MjQ3MzQzOwogICAgICAgIFdlZCwgMTEgU2VwIDIwMjQgMDI6MTc6MjcgLTA3MDAgKFBEVCkKTUlNRS1WZXJzaW9uOiAxLjAKWC1SZWNlaXZlZDogYnkgMjAwMjphMDU6NmUwMjoxYTY1OmIwOjNhMDo1NTY2OmJkYTUgd2l0aCBTTVRQIGlkCiBlOWUxNGE1NThmOGFiLTNhMDU3NDVmMDI2bXIxMjU3MjY3NTVhYi45LjE3MjYwNDYyNDY4NzM7IFdlZCwgMTEgU2VwIDIwMjQKIDAyOjE3OjI2IC0wNzAwIChQRFQpCk1lc3NhZ2UtSUQ6IDxhdXRvZ2VuLWphdmEtODA1YzkyMDUtMzNiOS00N2ZlLWE0ZTUtYzc5OWFkNjZlZmU4QGdvb2dsZS5jb20+CkRhdGU6IFdlZCwgMTEgU2VwIDIwMjQgMDk6MTc6MjYgKzAwMDAKU3ViamVjdDogRGVsaXZlcnkgVGVzdApGcm9tOiBmbG93Y3J5cHQuY29tcGF0aWJpbGl0eUBnbWFpbC5jb20KVG86IHNvbWUudGVzdEBmbG93Y3J5cHQuY29tCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0zRCIwMDAwMDAwMDAwMDA2OTQ5MWEwNjIxZDQ3NT0KZmUiCgotLS0tLSBNZXNzYWdlIHRydW5jYXRlZCAtLS0tLQotLTAwMDAwMDAwMDAwMDdiNmY5NDA2MjFkNDc1NmUtLQo=",
+ "historyId": "235729",
+ "internalDate": "1726046248000"
+ }
+}
diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts
index bd2e4df9034..c5a28ba6ae8 100644
--- a/test/source/tests/compose.ts
+++ b/test/source/tests/compose.ts
@@ -569,7 +569,7 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te
await inboxPage.close();
// test the pubkeys we copied
const contact = await dbPage.page.evaluate(async () => {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/return-await
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return
return await (window as any).ContactStore.getOneWithAllPubkeys(undefined, 'manualcopypgp@flowcrypt.com');
});
expect(contact.sortedPubkeys.length).to.equal(2);
diff --git a/test/source/tests/decrypt.ts b/test/source/tests/decrypt.ts
index 64cf59a3f28..ed8d82ce50d 100644
--- a/test/source/tests/decrypt.ts
+++ b/test/source/tests/decrypt.ts
@@ -2031,7 +2031,8 @@ XZ8r4OC6sguP/yozWlkG+7dDxsgKQVBENeG6Lw==
testWithBrowser(async (t, browser) => {
const threadId1 = '18adb91ebf3ba7b9'; // email attachment "noname" with type img/
const threadId2 = '18afaa4118afeb62'; // email attachment "noname" with type application/octet-stream
- const threadId3 = '18b7f6a2b00ad967'; // a password-protected message that is also public key encrypted with noname attachment
+ const threadId3 = '191e2735a1cc08c4'; // email attachment "noname" with type message/global
+ const threadId4 = '18b7f6a2b00ad967'; // a password-protected message that is also public key encrypted with noname attachment
const { acctEmail } = await BrowserRecipe.setupCommonAcctWithAttester(t, browser, 'compatibility');
const inboxPage1 = await browser.newExtensionPage(t, `chrome/settings/inbox/inbox.htm?acctEmail=${acctEmail}&threadId=${threadId1}`);
await inboxPage1.notPresent('iframe.pgp_block');
@@ -2042,11 +2043,17 @@ XZ8r4OC6sguP/yozWlkG+7dDxsgKQVBENeG6Lw==
expect(await inboxPage2.isElementPresent('@container-attachments')).to.be.true;
await inboxPage2.close();
const inboxPage3 = await browser.newExtensionPage(t, `chrome/settings/inbox/inbox.htm?acctEmail=${acctEmail}&threadId=${threadId3}`);
- const pgpBlock = await inboxPage3.getFrame(['pgp_block.htm']);
- await inboxPage3.notPresent('@container-attachments');
- expect(await inboxPage3.isElementPresent('iframe.pgp_block')).to.equal(true);
- expect(await pgpBlock.isElementPresent('@pgp-encryption')).to.equal(true);
+ await inboxPage3.notPresent('iframe.pgp_block');
+ const attachmentsContainer = await inboxPage3.waitAny('@container-attachments');
+ const attachments = await attachmentsContainer.$$('.pgp_attachment');
+ expect(attachments.length).to.equal(1);
await inboxPage3.close();
+ const inboxPage4 = await browser.newExtensionPage(t, `chrome/settings/inbox/inbox.htm?acctEmail=${acctEmail}&threadId=${threadId4}`);
+ const pgpBlock = await inboxPage4.getFrame(['pgp_block.htm']);
+ await inboxPage4.notPresent('@container-attachments');
+ expect(await inboxPage4.isElementPresent('iframe.pgp_block')).to.equal(true);
+ expect(await pgpBlock.isElementPresent('@pgp-encryption')).to.equal(true);
+ await inboxPage4.close();
})
);
diff --git a/test/source/tests/settings.ts b/test/source/tests/settings.ts
index f3712c7a563..ef8c22ecee2 100644
--- a/test/source/tests/settings.ts
+++ b/test/source/tests/settings.ts
@@ -1099,7 +1099,7 @@ export const defineSettingsTests = (testVariant: TestVariant, testWithBrowser: T
);
// test the pubkey in the storage
const oldContact = await dbPage.page.evaluate(async acctEmail => {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/return-await
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
return await (window as any).ContactStore.getOneWithAllPubkeys(undefined, acctEmail);
}, acctEmail);
expect(oldContact.sortedPubkeys.length).to.equal(1);
@@ -1122,7 +1122,7 @@ export const defineSettingsTests = (testVariant: TestVariant, testWithBrowser: T
await myKeyFrame.waitAndClick('@action-fix-and-import-key');
// test the pubkey in the storage
const expectedOldContact = await dbPage.page.evaluate(async acctEmail => {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/return-await
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
return await (window as any).ContactStore.getOneWithAllPubkeys(undefined, acctEmail);
}, acctEmail);
expect(expectedOldContact.sortedPubkeys.length).to.equal(1);
@@ -1142,7 +1142,7 @@ export const defineSettingsTests = (testVariant: TestVariant, testWithBrowser: T
});
// test the pubkey in the storage
const newContact = await dbPage.page.evaluate(async acctEmail => {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/return-await
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
return await (window as any).ContactStore.getOneWithAllPubkeys(undefined, acctEmail);
}, acctEmail);
expect(newContact.sortedPubkeys.length).to.equal(1);