UNPKG

aquameta-datum

Version:

Service layer for the Aquameta database API

215 lines (205 loc) 21.5 kB
import test from 'tape'; import connection from '../../query/connection.js'; import sinon from 'sinon'; import pg from '@micburks/pg'; test('#connection', async t => { const fakeRow = { name: 'fake-name' }; let loggedIn = false; const fakeQuery = queryString => { if (/^select .* role_name from endpoint.session/.test(queryString)) { loggedIn = true; return { rows: [{ response: JSON.stringify({ result: [{ row: { role_name: 'logged-in-user' } }] }) }] }; } else { return { rows: [{ response: JSON.stringify({ result: [{ row: fakeRow }] }) }] }; } }; const clientAPI = { query: sinon.fake(fakeQuery), connect: sinon.fake(), end: sinon.fake() }; sinon.stub(pg, 'Client').callsFake(config => { if (loggedIn) { t.is(config.user, 'logged-in-user', 'updates config to use logged in user'); } else { t.is(config.user, 'anonymous', 'uses default config'); } t.is(config.host, 'override-host', 'merges given client config'); return clientAPI; }); const client = { sessionId: '123', connection: { host: 'override-host' } }; const user = await connection(client, {}); t.deepEquals(user[0], fakeRow, 'returns data'); t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released'); pg.Client.restore(); t.end(); }); test('#connection - without sessionId', async t => { const fakeRow = { name: 'fake-name' }; const fakeQuery = queryString => { if (/^select .* role_name from endpoint.session/.test(queryString)) { t.fail('tried to login'); } else { return { rows: [{ response: JSON.stringify({ result: [{ row: fakeRow }] }) }] }; } }; const clientAPI = { query: sinon.fake(fakeQuery), connect: sinon.fake(), end: sinon.fake() }; sinon.stub(pg, 'Client').callsFake(config => { t.is(config.user, 'anonymous', "doesn't alter user"); return clientAPI; }); const result = await connection({}, {}); t.deepEqual(result[0], fakeRow, 'returns data'); t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released'); pg.Client.restore(); t.end(); }); test('#connection - uses anonymous if login fails', async t => { const fakeRow = { name: 'fake-name' }; const fakeQuery = queryString => { if (/^select .* role_name from endpoint.session/.test(queryString)) { return { rows: [{ response: JSON.stringify({ result: [] }) }] }; } else { return { rows: [{ response: JSON.stringify({ result: [{ row: fakeRow }] }) }] }; } }; const clientAPI = { query: sinon.fake(fakeQuery), connect: sinon.fake(), end: sinon.fake() }; sinon.stub(pg, 'Client').callsFake(config => { t.is(config.user, 'anonymous', "doesn't alter user"); return clientAPI; }); const client = { rawSession: true, sessionId: '123' }; const result = await connection(client, {}); t.deepEqual(result[0], fakeRow, 'still returns data'); t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released'); pg.Client.restore(); t.end(); }); test('#connection - deals with error in running queries', async t => { const fakeQuery = () => { throw new Error('db connection failed'); }; const clientAPI = { query: sinon.fake(fakeQuery), connect: sinon.fake(), end: sinon.fake() }; sinon.stub(pg, 'Client').callsFake(() => clientAPI); const client = { sessionId: '123' }; const result = await connection(client, {}); t.is(result, null, 'returns null'); t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released'); pg.Client.restore(); t.end(); }); test('#connection - passes all query params', async t => { const sessionId = '123'; const version = 'v2'; const query = { method: 'POST', url: '/widget/dependency', args: { limit: 5 }, data: { id: '999' } }; const fakeQuery = (queryString, args) => { if (/^select .* role_name from endpoint.session/.test(queryString)) { t.deepEqual(args, [sessionId]); return { rows: [{ role_name: 'logged-in-user' }] }; } else { t.deepEqual(args, [version, query.method, query.url, JSON.stringify(query.args), JSON.stringify(query.data)]); return { rows: [{ response: JSON.stringify({ result: [] }) }] }; } }; const clientAPI = { query: sinon.fake(fakeQuery), connect: sinon.fake(), end: sinon.fake() }; sinon.stub(pg, 'Client').callsFake(() => clientAPI); const client = { sessionId, version }; await connection(client, query); pg.Client.restore(); t.end(); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24uanMiXSwibmFtZXMiOlsidGVzdCIsImNvbm5lY3Rpb24iLCJzaW5vbiIsInBnIiwidCIsImZha2VSb3ciLCJuYW1lIiwibG9nZ2VkSW4iLCJmYWtlUXVlcnkiLCJxdWVyeVN0cmluZyIsInJvd3MiLCJyZXNwb25zZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXN1bHQiLCJyb3ciLCJyb2xlX25hbWUiLCJjbGllbnRBUEkiLCJxdWVyeSIsImZha2UiLCJjb25uZWN0IiwiZW5kIiwic3R1YiIsImNhbGxzRmFrZSIsImNvbmZpZyIsImlzIiwidXNlciIsImhvc3QiLCJjbGllbnQiLCJzZXNzaW9uSWQiLCJkZWVwRXF1YWxzIiwiY2FsbENvdW50IiwiQ2xpZW50IiwicmVzdG9yZSIsImZhaWwiLCJkZWVwRXF1YWwiLCJyYXdTZXNzaW9uIiwiRXJyb3IiLCJ2ZXJzaW9uIiwibWV0aG9kIiwidXJsIiwiYXJncyIsImxpbWl0IiwiZGF0YSIsImlkIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxJQUFQLE1BQWlCLE1BQWpCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QiwyQkFBdkI7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLE9BQWxCO0FBQ0EsT0FBT0MsRUFBUCxNQUFlLGNBQWY7QUFFQUgsSUFBSSxDQUFDLGFBQUQsRUFBZ0IsTUFBTUksQ0FBTixJQUFXO0FBQzdCLFFBQU1DLE9BQU8sR0FBRztBQUFDQyxJQUFBQSxJQUFJLEVBQUU7QUFBUCxHQUFoQjtBQUNBLE1BQUlDLFFBQVEsR0FBRyxLQUFmOztBQUVBLFFBQU1DLFNBQVMsR0FBR0MsV0FBVyxJQUFJO0FBQy9CLFFBQUksNkNBQTZDVCxJQUE3QyxDQUFrRFMsV0FBbEQsQ0FBSixFQUFvRTtBQUNsRUYsTUFBQUEsUUFBUSxHQUFHLElBQVg7QUFDQSxhQUFPO0FBQ0xHLFFBQUFBLElBQUksRUFBRSxDQUNKO0FBQ0VDLFVBQUFBLFFBQVEsRUFBRUMsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDdkJDLFlB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QUU7QUFEZSxXQUFmO0FBRFosU0FESTtBQURELE9BQVA7QUFTRDtBQUNGLEdBdEJEOztBQXVCQSxRQUFNRyxTQUFTLEdBQUc7QUFDaEJDLElBQUFBLEtBQUssRUFBRWhCLEtBQUssQ0FBQ2lCLElBQU4sQ0FBV1gsU0FBWCxDQURTO0FBRWhCWSxJQUFBQSxPQUFPLEVBQUVsQixLQUFLLENBQUNpQixJQUFOLEVBRk87QUFHaEJFLElBQUFBLEdBQUcsRUFBRW5CLEtBQUssQ0FBQ2lCLElBQU47QUFIVyxHQUFsQjtBQUtBakIsRUFBQUEsS0FBSyxDQUFDb0IsSUFBTixDQUFXbkIsRUFBWCxFQUFlLFFBQWYsRUFBeUJvQixTQUF6QixDQUFtQyxNQUFNTixTQUF6QztBQUVBLFFBQU1XLE1BQU0sR0FBRztBQUFDQyxJQUFBQSxTQUFEO0FBQVlTLElBQUFBO0FBQVosR0FBZjtBQUNBLFFBQU1yQyxVQUFVLENBQUMyQixNQUFELEVBQVNWLEtBQVQsQ0FBaEI7QUFDQWYsRUFBQUEsRUFBRSxDQUFDNkIsTUFBSCxDQUFVQyxPQUFWO0FBQ0E3QixFQUFBQSxDQUFDLENBQUNpQixHQUFGO0FBQ0QsQ0E1Q0csQ0FBSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0IGZyb20gJ3RhcGUnO1xuaW1wb3J0IGNvbm5lY3Rpb24gZnJvbSAnLi4vLi4vcXVlcnkvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHBnIGZyb20gJ0BtaWNidXJrcy9wZyc7XG5cbnRlc3QoJyNjb25uZWN0aW9uJywgYXN5bmMgdCA9PiB7XG4gIGNvbnN0IGZha2VSb3cgPSB7bmFtZTogJ2Zha2UtbmFtZSd9O1xuICBsZXQgbG9nZ2VkSW4gPSBmYWxzZTtcblxuICBjb25zdCBmYWtlUXVlcnkgPSBxdWVyeVN0cmluZyA9PiB7XG4gICAgaWYgKC9ec2VsZWN0IC4qIHJvbGVfbmFtZSBmcm9tIGVuZHBvaW50LnNlc3Npb24vLnRlc3QocXVlcnlTdHJpbmcpKSB7XG4gICAgICBsb2dnZWRJbiA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBbe3Jvdzoge3JvbGVfbmFtZTogJ2xvZ2dlZC1pbi11c2VyJ319XSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbe3Jlc3BvbnNlOiBKU09OLnN0cmluZ2lmeSh7cmVzdWx0OiBbe3JvdzogZmFrZVJvd31dfSl9XSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGllbnRBUEkgPSB7XG4gICAgcXVlcnk6IHNpbm9uLmZha2UoZmFrZVF1ZXJ5KSxcbiAgICBjb25uZWN0OiBzaW5vbi5mYWtlKCksXG4gICAgZW5kOiBzaW5vbi5mYWtlKCksXG4gIH07XG4gIHNpbm9uLnN0dWIocGcsICdDbGllbnQnKS5jYWxsc0Zha2UoY29uZmlnID0+IHtcbiAgICBpZiAobG9nZ2VkSW4pIHtcbiAgICAgIHQuaXMoXG4gICAgICAgIGNvbmZpZy51c2VyLFxuICAgICAgICAnbG9nZ2VkLWluLXVzZXInLFxuICAgICAgICAndXBkYXRlcyBjb25maWcgdG8gdXNlIGxvZ2dlZCBpbiB1c2VyJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQuaXMoY29uZmlnLnVzZXIsICdhbm9ueW1vdXMnLCAndXNlcyBkZWZhdWx0IGNvbmZpZycpO1xuICAgIH1cbiAgICB0LmlzKGNvbmZpZy5ob3N0LCAnb3ZlcnJpZGUtaG9zdCcsICdtZXJnZXMgZ2l2ZW4gY2xpZW50IGNvbmZpZycpO1xuXG4gICAgcmV0dXJuIGNsaWVudEFQSTtcbiAgfSk7XG5cbiAgY29uc3QgY2xpZW50ID0ge1xuICAgIHNlc3Npb25JZDogJzEyMycsXG4gICAgY29ubmVjdGlvbjoge2hvc3Q6ICdvdmVycmlkZS1ob3N0J30sXG4gIH07XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBjb25uZWN0aW9uKGNsaWVudCwge30pO1xuICB0LmRlZXBFcXVhbHModXNlclswXSwgZmFrZVJvdywgJ3JldHVybnMgZGF0YScpO1xuICB0LmlzKFxuICAgIGNsaWVudEFQSS5jb25uZWN0LmNhbGxDb3VudCxcbiAgICBjbGllbnRBUEkuZW5kLmNhbGxDb3VudCxcbiAgICAnYWxsIGNsaWVudHMgYXJlIHJlbGVhc2VkJyxcbiAgKTtcblxuICBwZy5DbGllbnQucmVzdG9yZSgpO1xuICB0LmVuZCgpO1xufSk7XG5cbnRlc3QoJyNjb25uZWN0aW9uIC0gd2l0aG91dCBzZXNzaW9uSWQnLCBhc3luYyB0ID0+IHtcbiAgY29uc3QgZmFrZVJvdyA9IHtuYW1lOiAnZmFrZS1uYW1lJ307XG5cbiAgY29uc3QgZmFrZVF1ZXJ5ID0gcXVlcnlTdHJpbmcgPT4ge1xuICAgIGlmICgvXnNlbGVjdCAuKiByb2xlX25hbWUgZnJvbSBlbmRwb2ludC5zZXNzaW9uLy50ZXN0KHF1ZXJ5U3RyaW5nKSkge1xuICAgICAgdC5mYWlsKCd0cmllZCB0byBsb2dpbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBbe3JvdzogZmFrZVJvd31dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGllbnRBUEkgPSB7XG4gICAgcXVlcnk6IHNpbm9uLmZha2UoZmFrZVF1ZXJ5KSxcbiAgICBjb25uZWN0OiBzaW5vbi5mYWtlKCksXG4gICAgZW5kOiBzaW5vbi5mYWtlKCksXG4gIH07XG4gIHNpbm9uLnN0dWIocGcsICdDbGllbnQnKS5jYWxsc0Zha2UoY29uZmlnID0+IHtcbiAgICB0LmlzKGNvbmZpZy51c2VyLCAnYW5vbnltb3VzJywgXCJkb2Vzbid0IGFsdGVyIHVzZXJcIik7XG5cbiAgICByZXR1cm4gY2xpZW50QVBJO1xuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uKHt9LCB7fSk7XG4gIHQuZGVlcEVxdWFsKHJlc3VsdFswXSwgZmFrZVJvdywgJ3JldHVybnMgZGF0YScpO1xuICB0LmlzKFxuICAgIGNsaWVudEFQSS5jb25uZWN0LmNhbGxDb3VudCxcbiAgICBjbGllbnRBUEkuZW5kLmNhbGxDb3VudCxcbiAgICAnYWxsIGNsaWVudHMgYXJlIHJlbGVhc2VkJyxcbiAgKTtcblxuICBwZy5DbGllbnQucmVzdG9yZSgpO1xuICB0LmVuZCgpO1xufSk7XG5cbnRlc3QoJyNjb25uZWN0aW9uIC0gdXNlcyBhbm9ueW1vdXMgaWYgbG9naW4gZmFpbHMnLCBhc3luYyB0ID0+IHtcbiAgY29uc3QgZmFrZVJvdyA9IHtuYW1lOiAnZmFrZS1uYW1lJ307XG5cbiAgY29uc3QgZmFrZVF1ZXJ5ID0gcXVlcnlTdHJpbmcgPT4ge1xuICAgIGlmICgvXnNlbGVjdCAuKiByb2xlX25hbWUgZnJvbSBlbmRwb2ludC5zZXNzaW9uLy50ZXN0KHF1ZXJ5U3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcm93czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHJlc3VsdDogW10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcm93czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHJlc3VsdDogW3tyb3c6IGZha2VSb3d9XSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xpZW50QVBJID0ge1xuICAgIHF1ZXJ5OiBzaW5vbi5mYWtlKGZha2VRdWVyeSksXG4gICAgY29ubmVjdDogc2lub24uZmFrZSgpLFxuICAgIGVuZDogc2lub24uZmFrZSgpLFxuICB9O1xuICBzaW5vbi5zdHViKHBnLCAnQ2xpZW50JykuY2FsbHNGYWtlKGNvbmZpZyA9PiB7XG4gICAgdC5pcyhjb25maWcudXNlciwgJ2Fub255bW91cycsIFwiZG9lc24ndCBhbHRlciB1c2VyXCIpO1xuXG4gICAgcmV0dXJuIGNsaWVudEFQSTtcbiAgfSk7XG5cbiAgY29uc3QgY2xpZW50ID0ge3Jhd1Nlc3Npb246IHRydWUsIHNlc3Npb25JZDogJzEyMyd9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uKGNsaWVudCwge30pO1xuICB0LmRlZXBFcXVhbChyZXN1bHRbMF0sIGZha2VSb3csICdzdGlsbCByZXR1cm5zIGRhdGEnKTtcbiAgdC5pcyhcbiAgICBjbGllbnRBUEkuY29ubmVjdC5jYWxsQ291bnQsXG4gICAgY2xpZW50QVBJLmVuZC5jYWxsQ291bnQsXG4gICAgJ2FsbCBjbGllbnRzIGFyZSByZWxlYXNlZCcsXG4gICk7XG5cbiAgcGcuQ2xpZW50LnJlc3RvcmUoKTtcbiAgdC5lbmQoKTtcbn0pO1xuXG50ZXN0KCcjY29ubmVjdGlvbiAtIGRlYWxzIHdpdGggZXJyb3IgaW4gcnVubmluZyBxdWVyaWVzJywgYXN5bmMgdCA9PiB7XG4gIGNvbnN0IGZha2VRdWVyeSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RiIGNvbm5lY3Rpb24gZmFpbGVkJyk7XG4gIH07XG4gIGNvbnN0IGNsaWVudEFQSSA9IHtcbiAgICBxdWVyeTogc2lub24uZmFrZShmYWtlUXVlcnkpLFxuICAgIGNvbm5lY3Q6IHNpbm9uLmZha2UoKSxcbiAgICBlbmQ6IHNpbm9uLmZha2UoKSxcbiAgfTtcbiAgc2lub24uc3R1YihwZywgJ0NsaWVudCcpLmNhbGxzRmFrZSgoKSA9PiBjbGllbnRBUEkpO1xuXG4gIGNvbnN0IGNsaWVudCA9IHtzZXNzaW9uSWQ6ICcxMjMnfTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbihjbGllbnQsIHt9KTtcbiAgdC5pcyhyZXN1bHQsIG51bGwsICdyZXR1cm5zIG51bGwnKTtcbiAgdC5pcyhcbiAgICBjbGllbnRBUEkuY29ubmVjdC5jYWxsQ291bnQsXG4gICAgY2xpZW50QVBJLmVuZC5jYWxsQ291bnQsXG4gICAgJ2FsbCBjbGllbnRzIGFyZSByZWxlYXNlZCcsXG4gICk7XG5cbiAgcGcuQ2xpZW50LnJlc3RvcmUoKTtcbiAgdC5lbmQoKTtcbn0pO1xuXG50ZXN0KCcjY29ubmVjdGlvbiAtIHBhc3NlcyBhbGwgcXVlcnkgcGFyYW1zJywgYXN5bmMgdCA9PiB7XG4gIGNvbnN0IHNlc3Npb25JZCA9ICcxMjMnO1xuICBjb25zdCB2ZXJzaW9uID0gJ3YyJztcbiAgY29uc3QgcXVlcnkgPSB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgdXJsOiAnL3dpZGdldC9kZXBlbmRlbmN5JyxcbiAgICBhcmdzOiB7bGltaXQ6IDV9LFxuICAgIGRhdGE6IHtpZDogJzk5OSd9LFxuICB9O1xuXG4gIGNvbnN0IGZha2VRdWVyeSA9IChxdWVyeVN0cmluZywgYXJncykgPT4ge1xuICAgIGlmICgvXnNlbGVjdCAuKiByb2xlX25hbWUgZnJvbSBlbmRwb2ludC5zZXNzaW9uLy50ZXN0KHF1ZXJ5U3RyaW5nKSkge1xuICAgICAgdC5kZWVwRXF1YWwoYXJncywgW3Nlc3Npb25JZF0pO1xuICAgICAgcmV0dXJuIHtyb3dzOiBbe3JvbGVfbmFtZTogJ2xvZ2dlZC1pbi11c2VyJ31dfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdC5kZWVwRXF1YWwoYXJncywgW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBxdWVyeS5tZXRob2QsXG4gICAgICAgIHF1ZXJ5LnVybCxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocXVlcnkuYXJncyksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHF1ZXJ5LmRhdGEpLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBbXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xpZW50QVBJID0ge1xuICAgIHF1ZXJ5OiBzaW5vbi5mYWtlKGZha2VRdWVyeSksXG4gICAgY29ubmVjdDogc2lub24uZmFrZSgpLFxuICAgIGVuZDogc2lub24uZmFrZSgpLFxuICB9O1xuICBzaW5vbi5zdHViKHBnLCAnQ2xpZW50JykuY2FsbHNGYWtlKCgpID0+IGNsaWVudEFQSSk7XG5cbiAgY29uc3QgY2xpZW50ID0ge3Nlc3Npb25JZCwgdmVyc2lvbn07XG4gIGF3YWl0IGNvbm5lY3Rpb24oY2xpZW50LCBxdWVyeSk7XG4gIHBnLkNsaWVudC5yZXN0b3JlKCk7XG4gIHQuZW5kKCk7XG59KTtcbiJdfQ==