UNPKG

emailjs-imap-client

Version:
466 lines (455 loc) 58.6 kB
"use strict"; var _hoodiecrowImap = _interopRequireDefault(require("hoodiecrow-imap")); var _ = _interopRequireWildcard(require("..")); var _commandParser = require("./command-parser"); var _commandBuilder = require("./command-builder"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-unused-expressions */ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; describe('browserbox integration tests', () => { let imap; const port = 10000; let server; beforeEach(done => { // start imap test server var options = { // debug: true, plugins: ['STARTTLS', 'X-GM-EXT-1'], secureConnection: false, storage: { INBOX: { messages: [{ raw: 'Subject: hello 1\r\n\r\nWorld 1!' }, { raw: 'Subject: hello 2\r\n\r\nWorld 2!', flags: ['\\Seen'] }, { raw: 'Subject: hello 3\r\n\r\nWorld 3!', uid: 555 }, { raw: 'From: sender name <sender@example.com>\r\nTo: Receiver name <receiver@example.com>\r\nSubject: hello 4\r\nMessage-Id: <abcde>\r\nDate: Fri, 13 Sep 2013 15:01:00 +0300\r\n\r\nWorld 4!' }, { raw: 'Subject: hello 5\r\n\r\nWorld 5!', flags: ['$MyFlag', '\\Deleted'], uid: 557 }, { raw: 'Subject: hello 6\r\n\r\nWorld 6!' }, { raw: 'Subject: hello 7\r\n\r\nWorld 7!', uid: 600 }] }, '': { separator: '/', folders: { '[Gmail]': { flags: ['\\Noselect'], folders: { 'All Mail': { 'special-use': '\\All' }, Drafts: { 'special-use': '\\Drafts' }, Important: { 'special-use': '\\Important' }, 'Sent Mail': { 'special-use': '\\Sent' }, Spam: { 'special-use': '\\Junk' }, Starred: { 'special-use': '\\Flagged' }, Trash: { 'special-use': '\\Trash' }, A: { messages: [{}] }, B: { messages: [{}] } } } } } } }; server = (0, _hoodiecrowImap.default)(options); server.listen(port, done); }); afterEach(done => { server.close(done); }); describe('Connection tests', () => { var insecureServer; beforeEach(done => { // start imap test server var options = { // debug: true, plugins: [], secureConnection: false }; insecureServer = (0, _hoodiecrowImap.default)(options); insecureServer.listen(port + 2, done); }); afterEach(done => { insecureServer.close(done); }); it('should use STARTTLS by default', () => { imap = new _.default('127.0.0.1', port, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false }); return imap.connect().then(() => { expect(imap.client.secureMode).to.be.true; }).then(() => { return imap.close(); }); }); it('should ignore STARTTLS', () => { imap = new _.default('127.0.0.1', port, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false, ignoreTLS: true }); return imap.connect().then(() => { expect(imap.client.secureMode).to.be.false; }).then(() => { return imap.close(); }); }); it('should fail connecting to non-STARTTLS host', () => { imap = new _.default('127.0.0.1', port + 2, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false, requireTLS: true }); return imap.connect().catch(err => { expect(err).to.exist; }); }); it('should connect to non secure host', () => { imap = new _.default('127.0.0.1', port + 2, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false }); return imap.connect().then(() => { expect(imap.client.secureMode).to.be.false; }).then(() => { return imap.close(); }); }); it('should fail authentication', done => { imap = new _.default('127.0.0.1', port + 2, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'invalid', pass: 'invalid' }, useSecureTransport: false }); imap.connect().then(() => { expect(imap.client.secureMode).to.be.false; }).catch(() => { done(); }); }); }); describe('Post login tests', () => { beforeEach(() => { imap = new _.default('127.0.0.1', port, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false }); return imap.connect().then(() => { return imap.selectMailbox('[Gmail]/Spam'); }); }); afterEach(() => { return imap.close(); }); describe('#listMailboxes', () => { it('should succeed', () => { return imap.listMailboxes().then(mailboxes => { expect(mailboxes).to.exist; }); }); }); describe('#listMessages', () => { it('should succeed', () => { return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure', 'body.peek[]']).then(messages => { expect(messages).to.not.be.empty; }); }); }); describe('#upload', () => { it('should succeed', () => { var msgCount; return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']).then(messages => { expect(messages).to.not.be.empty; msgCount = messages.length; }).then(() => { return imap.upload('inbox', 'MIME-Version: 1.0\r\nDate: Wed, 9 Jul 2014 15:07:47 +0200\r\nDelivered-To: test@test.com\r\nMessage-ID: <CAHftYYQo=5fqbtnv-DazXhL2j5AxVP1nWarjkztn-N9SV91Z2w@mail.gmail.com>\r\nSubject: test\r\nFrom: Test Test <test@test.com>\r\nTo: Test Test <test@test.com>\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\ntest', { flags: ['\\Seen', '\\Answered', '\\$MyFlag'] }); }).then(() => { return imap.listMessages('inbox', '1:*', ['uid', 'flags', 'envelope', 'bodystructure']); }).then(messages => { expect(messages.length).to.equal(msgCount + 1); }); }); }); describe('#search', () => { it('should return a sequence number', () => { return imap.search('inbox', { header: ['subject', 'hello 3'] }).then(result => { expect(result).to.deep.equal([3]); }); }); it('should return an uid', () => { return imap.search('inbox', { header: ['subject', 'hello 3'] }, { byUid: true }).then(result => { expect(result).to.deep.equal([555]); }); }); it('should work with complex queries', () => { return imap.search('inbox', { header: ['subject', 'hello'], seen: true }).then(result => { expect(result).to.deep.equal([2]); }); }); }); describe('#setFlags', () => { it('should set flags for a message', () => { return imap.setFlags('inbox', '1', ['\\Seen', '$MyFlag']).then(result => { expect(result).to.deep.equal([{ '#': 1, flags: ['\\Seen', '$MyFlag'] }]); }); }); it('should add flags to a message', () => { return imap.setFlags('inbox', '2', { add: ['$MyFlag'] }).then(result => { expect(result).to.deep.equal([{ '#': 2, flags: ['\\Seen', '$MyFlag'] }]); }); }); it('should remove flags from a message', () => { return imap.setFlags('inbox', '557', { remove: ['\\Deleted'] }, { byUid: true }).then(result => { expect(result).to.deep.equal([{ '#': 5, flags: ['$MyFlag'], uid: 557 }]); }); }); it('should not return anything on silent mode', () => { return imap.setFlags('inbox', '1', ['$MyFlag2'], { silent: true }).then(result => { expect(result).to.deep.equal([]); }); }); }); describe('#store', () => { it('should add labels for a message', () => { return imap.store('inbox', '1', '+X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { expect(result).to.deep.equal([{ '#': 1, 'x-gm-labels': ['\\Inbox', '\\Sent', '\\Junk'] }]); }); }); it('should set labels for a message', () => { return imap.store('inbox', '1', 'X-GM-LABELS', ['\\Sent', '\\Junk']).then(result => { expect(result).to.deep.equal([{ '#': 1, 'x-gm-labels': ['\\Sent', '\\Junk'] }]); }); }); it('should remove labels from a message', () => { return imap.store('inbox', '1', '-X-GM-LABELS', ['\\Sent', '\\Inbox']).then(result => { expect(result).to.deep.equal([{ '#': 1, 'x-gm-labels': [] }]); }); }); }); describe('#deleteMessages', () => { it('should delete a message', () => { var initialInfo; var expungeNotified = new Promise((resolve, reject) => { imap.onupdate = function (mb, type /*, data */ ) { try { expect(mb).to.equal('inbox'); expect(type).to.equal('expunge'); resolve(); } catch (err) { reject(err); } }; }); return imap.selectMailbox('inbox').then(info => { initialInfo = info; return imap.deleteMessages('inbox', 557, { byUid: true }); }).then(() => { return imap.selectMailbox('inbox'); }).then(resultInfo => { expect(initialInfo.exists - 1 === resultInfo.exists).to.be.true; }).then(() => expungeNotified); }); }); describe('#copyMessages', () => { it('should copy a message', () => { return imap.copyMessages('inbox', 555, '[Gmail]/Trash', { byUid: true }).then(() => { return imap.selectMailbox('[Gmail]/Trash'); }).then(info => { expect(info.exists).to.equal(1); }); }); }); describe('#moveMessages', () => { it('should move a message', () => { var initialInfo; return imap.selectMailbox('inbox').then(info => { initialInfo = info; return imap.moveMessages('inbox', 555, '[Gmail]/Spam', { byUid: true }); }).then(() => { return imap.selectMailbox('[Gmail]/Spam'); }).then(info => { expect(info.exists).to.equal(1); return imap.selectMailbox('inbox'); }).then(resultInfo => { expect(initialInfo.exists).to.not.equal(resultInfo.exists); }); }); }); describe('precheck', () => { it('should handle precheck error correctly', () => { // simulates a broken search command var search = (query, options = {}) => { var command = (0, _commandBuilder.buildSEARCHCommand)(query, options); return imap.exec(command, 'SEARCH', { precheck: () => Promise.reject(new Error('FOO')) }).then(response => (0, _commandParser.parseSEARCH)(response)); }; return imap.selectMailbox('inbox').then(() => search({ header: ['subject', 'hello 3'] })).catch(err => { expect(err.message).to.equal('FOO'); return imap.selectMailbox('[Gmail]/Spam'); }); }); it('should select correct mailboxes in prechecks on concurrent calls', () => { return imap.selectMailbox('[Gmail]/A').then(() => { return Promise.all([imap.selectMailbox('[Gmail]/B'), imap.setFlags('[Gmail]/A', '1', ['\\Seen'])]); }).then(() => { return imap.listMessages('[Gmail]/A', '1:1', ['flags']); }).then(messages => { expect(messages.length).to.equal(1); expect(messages[0].flags).to.deep.equal(['\\Seen']); }); }); it('should send precheck commands in correct order on concurrent calls', () => { return Promise.all([imap.setFlags('[Gmail]/A', '1', ['\\Seen']), imap.setFlags('[Gmail]/B', '1', ['\\Seen'])]).then(() => { return imap.listMessages('[Gmail]/A', '1:1', ['flags']); }).then(messages => { expect(messages.length).to.equal(1); expect(messages[0].flags).to.deep.equal(['\\Seen']); }).then(() => { return imap.listMessages('[Gmail]/B', '1:1', ['flags']); }).then(messages => { expect(messages.length).to.equal(1); expect(messages[0].flags).to.deep.equal(['\\Seen']); }); }); }); }); describe('Timeout', () => { beforeEach(() => { imap = new _.default('127.0.0.1', port, { logLevel: _.LOG_LEVEL_NONE, auth: { user: 'testuser', pass: 'testpass' }, useSecureTransport: false }); return imap.connect().then(() => { // remove the ondata event to simulate 100% packet loss and make the socket time out after 10ms imap.client.timeoutSocketLowerBound = 10; imap.client.timeoutSocketMultiplier = 0; imap.client.socket.ondata = () => {}; }); }); it('should timeout', done => { imap.onerror = () => { done(); }; imap.selectMailbox('inbox').catch(() => {}); }); it('should reject all pending commands on timeout', () => { let rejectionCount = 0; return Promise.all([imap.selectMailbox('INBOX').catch(err => { expect(err).to.exist; rejectionCount++; }), imap.listMessages('INBOX', '1:*', ['body.peek[]']).catch(err => { expect(err).to.exist; rejectionCount++; })]).then(() => { expect(rejectionCount).to.equal(2); }); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQtaW50ZWdyYXRpb24uanMiXSwibmFtZXMiOlsicHJvY2VzcyIsImVudiIsIk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQiLCJkZXNjcmliZSIsImltYXAiLCJwb3J0Iiwic2VydmVyIiwiYmVmb3JlRWFjaCIsImRvbmUiLCJvcHRpb25zIiwicGx1Z2lucyIsInNlY3VyZUNvbm5lY3Rpb24iLCJzdG9yYWdlIiwiSU5CT1giLCJtZXNzYWdlcyIsInJhdyIsImZsYWdzIiwidWlkIiwic2VwYXJhdG9yIiwiZm9sZGVycyIsIkRyYWZ0cyIsIkltcG9ydGFudCIsIlNwYW0iLCJTdGFycmVkIiwiVHJhc2giLCJBIiwiQiIsImxpc3RlbiIsImFmdGVyRWFjaCIsImNsb3NlIiwiaW5zZWN1cmVTZXJ2ZXIiLCJpdCIsIkltYXBDbGllbnQiLCJsb2dMZXZlbCIsImF1dGgiLCJ1c2VyIiwicGFzcyIsInVzZVNlY3VyZVRyYW5zcG9ydCIsImNvbm5lY3QiLCJ0aGVuIiwiZXhwZWN0IiwiY2xpZW50Iiwic2VjdXJlTW9kZSIsInRvIiwiYmUiLCJ0cnVlIiwiaWdub3JlVExTIiwiZmFsc2UiLCJyZXF1aXJlVExTIiwiY2F0Y2giLCJlcnIiLCJleGlzdCIsInNlbGVjdE1haWxib3giLCJsaXN0TWFpbGJveGVzIiwibWFpbGJveGVzIiwibGlzdE1lc3NhZ2VzIiwibm90IiwiZW1wdHkiLCJtc2dDb3VudCIsImxlbmd0aCIsInVwbG9hZCIsImVxdWFsIiwic2VhcmNoIiwiaGVhZGVyIiwicmVzdWx0IiwiZGVlcCIsImJ5VWlkIiwic2VlbiIsInNldEZsYWdzIiwiYWRkIiwicmVtb3ZlIiwic2lsZW50Iiwic3RvcmUiLCJpbml0aWFsSW5mbyIsImV4cHVuZ2VOb3RpZmllZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib251cGRhdGUiLCJtYiIsInR5cGUiLCJpbmZvIiwiZGVsZXRlTWVzc2FnZXMiLCJyZXN1bHRJbmZvIiwiZXhpc3RzIiwiY29weU1lc3NhZ2VzIiwibW92ZU1lc3NhZ2VzIiwicXVlcnkiLCJjb21tYW5kIiwiZXhlYyIsInByZWNoZWNrIiwiRXJyb3IiLCJyZXNwb25zZSIsIm1lc3NhZ2UiLCJhbGwiLCJ0aW1lb3V0U29ja2V0TG93ZXJCb3VuZCIsInRpbWVvdXRTb2NrZXRNdWx0aXBsaWVyIiwic29ja2V0Iiwib25kYXRhIiwib25lcnJvciIsInJlamVjdGlvbkNvdW50Il0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUxBO0FBT0FBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyw0QkFBWixHQUEyQyxHQUEzQztBQUVBQyxRQUFRLENBQUMsOEJBQUQsRUFBaUMsTUFBTTtBQUM3QyxNQUFJQyxJQUFKO0FBQ0EsUUFBTUMsSUFBSSxHQUFHLEtBQWI7QUFDQSxNQUFJQyxNQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBRUMsSUFBRCxJQUFVO0FBQ25CO0FBQ0EsUUFBSUMsT0FBTyxHQUFHO0FBQ1o7QUFDQUMsTUFBQUEsT0FBTyxFQUFFLENBQUMsVUFBRCxFQUFhLFlBQWIsQ0FGRztBQUdaQyxNQUFBQSxnQkFBZ0IsRUFBRSxLQUhOO0FBSVpDLE1BQUFBLE9BQU8sRUFBRTtBQUNQQyxRQUFBQSxLQUFLLEVBQUU7QUFDTEMsVUFBQUEsUUFBUSxFQUFFLENBQ1I7QUFBRUMsWUFBQUEsR0FBRyxFQUFFO0FBQVAsV0FEUSxFQUVSO0FBQUVBLFlBQUFBLEdBQUcsRUFBRSxrQ0FBUDtBQUEyQ0MsWUFBQUEsS0FBSyxFQUFFLENBQUMsUUFBRDtBQUFsRCxXQUZRLEVBR1I7QUFBRUQsWUFBQUEsR0FBRyxFQUFFLGtDQUFQO0FBQTJDRSxZQUFBQSxHQUFHLEVBQUU7QUFBaEQsV0FIUSxFQUlSO0FBQUVGLFlBQUFBLEdBQUcsRUFBRTtBQUFQLFdBSlEsRUFLUjtBQUFFQSxZQUFBQSxHQUFHLEVBQUUsa0NBQVA7QUFBMkNDLFlBQUFBLEtBQUssRUFBRSxDQUFDLFNBQUQsRUFBWSxXQUFaLENBQWxEO0FBQTRFQyxZ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QU07QUFDWkMsUUFBQUEsTUFBTSxDQUFDNEQsY0FBRCxDQUFOLENBQXVCekQsRUFBdkIsQ0FBMEJrQixLQUExQixDQUFnQyxDQUFoQztBQUNELE9BZE0sQ0FBUDtBQWVELEtBakJDLENBQUY7QUFrQkQsR0EzQ08sQ0FBUjtBQTRDRCxDQXBkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG5cbmltcG9ydCBob29kaWVjcm93IGZyb20gJ2hvb2RpZWNyb3ctaW1hcCdcbmltcG9ydCBJbWFwQ2xpZW50LCB7IExPR19MRVZFTF9OT05FIGFzIGxvZ0xldmVsIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyBwYXJzZVNFQVJDSCB9IGZyb20gJy4vY29tbWFuZC1wYXJzZXInXG5pbXBvcnQgeyBidWlsZFNFQVJDSENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcidcblxucHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJ1xuXG5kZXNjcmliZSgnYnJvd3NlcmJveCBpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgbGV0IGltYXBcbiAgY29uc3QgcG9ydCA9IDEwMDAwXG4gIGxldCBzZXJ2ZXJcblxuICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgLy8gc3RhcnQgaW1hcCB0ZXN0IHNlcnZlclxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICBwbHVnaW5zOiBbJ1NUQVJUVExTJywgJ1gtR00tRVhULTEnXSxcbiAgICAgIHNlY3VyZUNvbm5lY3Rpb246IGZhbHNlLFxuICAgICAgc3RvcmFnZToge1xuICAgICAgICBJTkJPWDoge1xuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDFcXHJcXG5cXHJcXG5Xb3JsZCAxIScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gMlxcclxcblxcclxcbldvcmxkIDIhJywgZmxhZ3M6IFsnXFxcXFNlZW4nXSB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyAzXFxyXFxuXFxyXFxuV29ybGQgMyEnLCB1aWQ6IDU1NSB9LFxuICAgICAgICAgICAgeyByYXc6ICdGcm9tOiBzZW5kZXIgbmFtZSA8c2VuZGVyQGV4YW1wbGUuY29tPlxcclxcblRvOiBSZWNlaXZlciBuYW1lIDxyZWNlaXZlckBleGFtcGxlLmNvbT5cXHJcXG5TdWJqZWN0OiBoZWxsbyA0XFxyXFxuTWVzc2FnZS1JZDogPGFiY2RlPlxcclxcbkRhdGU6IEZyaSwgMTMgU2VwIDIwMTMgMTU6MDE6MDAgKzAzMDBcXHJcXG5cXHJcXG5Xb3JsZCA0IScgfSxcbiAgICAgICAgICAgIHsgcmF3OiAnU3ViamVjdDogaGVsbG8gNVxcclxcblxcclxcbldvcmxkIDUhJywgZmxhZ3M6IFsnJE15RmxhZycsICdcXFxcRGVsZXRlZCddLCB1aWQ6IDU1NyB9LFxuICAgICAgICAgICAgeyByYXc6ICdTdWJqZWN0OiBoZWxsbyA2XFxyXFxuXFxyXFxuV29ybGQgNiEnIH0sXG4gICAgICAgICAgICB7IHJhdzogJ1N1YmplY3Q6IGhlbGxvIDdcXHJcXG5cXHJcXG5Xb3JsZCA3IScsIHVpZDogNjAwIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgICcnOiB7XG4gICAgICAgICAgc2VwYXJhdG9yOiAnLycsXG4gICAgICAgICAgZm9sZGVyczoge1xuICAgICAgICAgICAgJ1tHbWFpbF0nOiB7XG4gICAgICAgICAgICAgIGZsYWdzOiBbJ1xcXFxOb3NlbGVjdCddLFxuICAgICAgICAgICAgICBmb2xkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FsbCBNYWlsJzogeyAnc3BlY2lhbC11c2UnOiAnXFxcXEFsbCcgfSxcbiAgICAgICAgICAgICAgICBEcmFmdHM6IHsgJ3NwZWNpYWwtdXNlJzogJ1xcXFxEcmFmdHMnIH0sXG4gICAgICAgICAgICAgICAgSW1wb3J0YW50OiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSW1wb3J0YW50JyB9LFxuICAgICAgICAgICAgICAgICdTZW50IE1haWwnOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcU2VudCcgfSxcbiAgICAgICAgICAgICAgICBTcGFtOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcSnVuaycgfSxcbiAgICAgICAgICAgICAgICBTdGFycmVkOiB7ICdzcGVjaWFsLXVzZSc6ICdcXFxcRmxhZ2dlZCcgfSxcbiAgICAgICAgICAgICAgICBUcmFzaDogeyAnc3BlY2lhbC11c2UnOiAnXFxcXFRyYXNoJyB9LFxuICAgICAgICAgICAgICAgIEE6IHsgbWVzc2FnZXM6IFt7fV0gfSxcbiAgICAgICAgICAgICAgICBCOiB7IG1lc3NhZ2VzOiBbe31dIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGRvbmUpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKGRvbmUpXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ0Nvbm5lY3Rpb24gdGVzdHMnLCAoKSA9PiB7XG4gICAgdmFyIGluc2VjdXJlU2VydmVyXG5cbiAgICBiZWZvcmVFYWNoKChkb25lKSA9PiB7XG4gICAgICAvLyBzdGFydCBpbWFwIHRlc3Qgc2VydmVyXG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgICBzZWN1cmVDb25uZWN0aW9uOiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpbnNlY3VyZVNlcnZlciA9IGhvb2RpZWNyb3cob3B0aW9ucylcbiAgICAgIGluc2VjdXJlU2VydmVyLmxpc3Rlbihwb3J0ICsgMiwgZG9uZSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKChkb25lKSA9PiB7XG4gICAgICBpbnNlY3VyZVNlcnZlci5jbG9zZShkb25lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIHVzZSBTVEFSVFRMUyBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0LCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2VcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLnRydWVcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5jbG9zZSgpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBTVEFSVFRMUycsICgpID0+IHtcbiAgICAgIGltYXAgPSBuZXcgSW1hcENsaWVudCgnMTI3LjAuMC4xJywgcG9ydCwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlLFxuICAgICAgICBpZ25vcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuY2xvc2UoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGNvbm5lY3RpbmcgdG8gbm9uLVNUQVJUVExTIGhvc3QnLCAoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ3Rlc3R1c2VyJyxcbiAgICAgICAgICBwYXNzOiAndGVzdHBhc3MnXG4gICAgICAgIH0sXG4gICAgICAgIHVzZVNlY3VyZVRyYW5zcG9ydDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVUTFM6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBpbWFwLmNvbm5lY3QoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGV4cGVjdChlcnIpLnRvLmV4aXN0XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGNvbm5lY3QgdG8gbm9uIHNlY3VyZSBob3N0JywgKCkgPT4ge1xuICAgICAgaW1hcCA9IG5ldyBJbWFwQ2xpZW50KCcxMjcuMC4wLjEnLCBwb3J0ICsgMiwge1xuICAgICAgICBsb2dMZXZlbCxcbiAgICAgICAgYXV0aDoge1xuICAgICAgICAgIHVzZXI6ICd0ZXN0dXNlcicsXG4gICAgICAgICAgcGFzczogJ3Rlc3RwYXNzJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gaW1hcC5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChpbWFwLmNsaWVudC5zZWN1cmVNb2RlKS50by5iZS5mYWxzZVxuICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG91bGQgZmFpbCBhdXRoZW50aWNhdGlvbicsIChkb25lKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQgKyAyLCB7XG4gICAgICAgIGxvZ0xldmVsLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgdXNlcjogJ2ludmFsaWQnLFxuICAgICAgICAgIHBhc3M6ICdpbnZhbGlkJ1xuICAgICAgICB9LFxuICAgICAgICB1c2VTZWN1cmVUcmFuc3BvcnQ6IGZhbHNlXG4gICAgICB9KVxuXG4gICAgICBpbWFwLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KGltYXAuY2xpZW50LnNlY3VyZU1vZGUpLnRvLmJlLmZhbHNlXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7IGRvbmUoKSB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ1Bvc3QgbG9naW4gdGVzdHMnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpbWFwID0gbmV3IEltYXBDbGllbnQoJzEyNy4wLjAuMScsIHBvcnQsIHtcbiAgICAgICAgbG9nTGV2ZWwsXG4gICAgICAgIGF1dGg6IHtcbiAgICAgICAgICB1c2VyOiAndGVzdHVzZXInLFxuICAgICAgICAgIHBhc3M6ICd0ZXN0cGFzcydcbiAgICAgICAgfSxcbiAgICAgICAgdXNlU2VjdXJlVHJhbnNwb3J0OiBmYWxzZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGltYXAuY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWxlY3RNYWlsYm94KCdbR21haWxdL1NwYW0nKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHJldHVybiBpbWFwLmNsb3NlKClcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyNsaXN0TWFpbGJveGVzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWFpbGJveGVzKCkudGhlbigobWFpbGJveGVzKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KG1haWxib3hlcykudG8uZXhpc3RcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjbGlzdE1lc3NhZ2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5saXN0TWVzc2FnZXMoJ2luYm94JywgJzE6KicsIFsndWlkJywgJ2ZsYWdzJywgJ2VudmVsb3BlJywgJ2JvZHlzdHJ1Y3R1cmUnLCAnYm9keS5wZWVrW10nXSkudGhlbigobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICBleHBlY3QobWVzc2FnZXMpLnRvLm5vdC5iZS5lbXB0eVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJyN1cGxvYWQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQnLCAoKSA9PiB7XG4gICAgICAgIHZhciBtc2dDb3VudFxuXG4gICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcykudG8ubm90LmJlLmVtcHR5XG4gICAgICAgICAgbXNnQ291bnQgPSBtZXNzYWdlcy5sZW5ndGhcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGltYXAudXBsb2FkKCdpbmJveCcsICdNSU1FLVZlcnNpb246IDEuMFxcclxcbkRhdGU6IFdlZCwgOSBKdWwgMjAxNCAxNTowNzo0NyArMDIwMFxcclxcbkRlbGl2ZXJlZC1UbzogdGVzdEB0ZXN0LmNvbVxcclxcbk1lc3NhZ2UtSUQ6IDxDQUhmdFlZUW89NWZxYnRudi1EYXpYaEwyajVBeFZQMW5XYXJqa3p0bi1OOVNWOTFaMndAbWFpbC5nbWFpbC5jb20+XFxyXFxuU3ViamVjdDogdGVzdFxcclxcbkZyb206IFRlc3QgVGVzdCA8dGVzdEB0ZXN0LmNvbT5cXHJcXG5UbzogVGVzdCBUZXN0IDx0ZXN0QHRlc3QuY29tPlxcclxcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxcclxcblxcclxcbnRlc3QnLCB7XG4gICAgICAgICAgICBmbGFnczogWydcXFxcU2VlbicsICdcXFxcQW5zd2VyZWQnLCAnXFxcXCRNeUZsYWcnXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBpbWFwLmxpc3RNZXNzYWdlcygnaW5ib3gnLCAnMToqJywgWyd1aWQnLCAnZmxhZ3MnLCAnZW52ZWxvcGUnLCAnYm9keXN0cnVjdHVyZSddKVxuICAgICAgICB9KS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIGV4cGVjdChtZXNzYWdlcy5sZW5ndGgpLnRvLmVxdWFsKG1zZ0NvdW50ICsgMSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcjc2VhcmNoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzZXF1ZW5jZSBudW1iZXInLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNlYXJjaCgnaW5ib3gnLCB7XG4gICAgICAgICAgaGVhZGVyOiBbJ3N1YmplY3QnLCAnaGVsbG8gMyddXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzNdKVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gdWlkJywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaW1hcC5zZWFyY2goJ2luYm94Jywge1xuICAgICAgICAgIGhlYWRlcjogWydzdWJqZWN0JywgJ2hlbGxvIDMnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbNTU1XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdzaG91bGQgd29yayB3aXRoIGNvbXBsZXggcXVlcmllcycsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2VhcmNoKCdpbmJveCcsIHtcbiAgICAgICAgICBoZWFkZXI6IFsnc3ViamVjdCcsICdoZWxsbyddLFxuICAgICAgICAgIHNlZW46IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbMl0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnI3NldEZsYWdzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzZXQgZmxhZ3MgZm9yIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzEnLCBbJ1xcXFxTZWVuJywgJyRNeUZsYWcnXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAxLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIGFkZCBmbGFncyB0byBhIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBpbWFwLnNldEZsYWdzKCdpbmJveCcsICcyJywge1xuICAgICAgICAgIGFkZDogWyckTXlGbGFnJ11cbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiAyLFxuICAgICAgICAgICAgZmxhZ3M6IFsnXFxcXFNlZW4nLCAnJE15RmxhZyddXG4gICAgICAgICAgfV0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBmbGFncyBmcm9tIGEgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGltYXAuc2V0RmxhZ3MoJ2luYm94JywgJzU1NycsIHtcbiAgICAgICAgICByZW1vdmU6IFsnXFxcXERlbGV0ZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYnlVaWQ6IHRydWVcbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgICAgICAgJyMnOiA1LFxuICAgICAgICAgICAgZmxhZ3M6IFsnJE15RmxhZyddLFxuICAgICAgI