aquameta-datum
Version:
Service layer for the Aquameta database API
243 lines (207 loc) • 21.7 kB
JavaScript
;
var _tape = _interopRequireDefault(require("tape"));
var _connection = _interopRequireDefault(require("../../query/connection.js"));
var _sinon = _interopRequireDefault(require("sinon"));
var _pg = _interopRequireDefault(require("@micburks/pg"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
(0, _tape.default)('#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.default.fake(fakeQuery),
connect: _sinon.default.fake(),
end: _sinon.default.fake()
};
_sinon.default.stub(_pg.default, '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 (0, _connection.default)(client, {});
t.deepEquals(user[0], fakeRow, 'returns data');
t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released');
_pg.default.Client.restore();
t.end();
});
(0, _tape.default)('#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.default.fake(fakeQuery),
connect: _sinon.default.fake(),
end: _sinon.default.fake()
};
_sinon.default.stub(_pg.default, 'Client').callsFake(config => {
t.is(config.user, 'anonymous', "doesn't alter user");
return clientAPI;
});
const result = await (0, _connection.default)({}, {});
t.deepEqual(result[0], fakeRow, 'returns data');
t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released');
_pg.default.Client.restore();
t.end();
});
(0, _tape.default)('#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.default.fake(fakeQuery),
connect: _sinon.default.fake(),
end: _sinon.default.fake()
};
_sinon.default.stub(_pg.default, 'Client').callsFake(config => {
t.is(config.user, 'anonymous', "doesn't alter user");
return clientAPI;
});
const client = {
rawSession: true,
sessionId: '123'
};
const result = await (0, _connection.default)(client, {});
t.deepEqual(result[0], fakeRow, 'still returns data');
t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released');
_pg.default.Client.restore();
t.end();
});
(0, _tape.default)('#connection - deals with error in running queries', async t => {
const fakeQuery = () => {
throw new Error('db connection failed');
};
const clientAPI = {
query: _sinon.default.fake(fakeQuery),
connect: _sinon.default.fake(),
end: _sinon.default.fake()
};
_sinon.default.stub(_pg.default, 'Client').callsFake(() => clientAPI);
const client = {
sessionId: '123'
};
const result = await (0, _connection.default)(client, {});
t.is(result, null, 'returns null');
t.is(clientAPI.connect.callCount, clientAPI.end.callCount, 'all clients are released');
_pg.default.Client.restore();
t.end();
});
(0, _tape.default)('#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.default.fake(fakeQuery),
connect: _sinon.default.fake(),
end: _sinon.default.fake()
};
_sinon.default.stub(_pg.default, 'Client').callsFake(() => clientAPI);
const client = {
sessionId,
version
};
await (0, _connection.default)(client, query);
_pg.default.Client.restore();
t.end();
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24uanMiXSwibmFtZXMiOlsidCIsImZha2VSb3ciLCJuYW1lIiwibG9nZ2VkSW4iLCJmYWtlUXVlcnkiLCJxdWVyeVN0cmluZyIsInRlc3QiLCJyb3dzIiwicmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzdWx0Iiwicm93Iiwicm9sZV9uYW1lIiwiY2xpZW50QVBJIiwicXVlcnkiLCJzaW5vbiIsImZha2UiLCJjb25uZWN0IiwiZW5kIiwic3R1YiIsInBnIiwiY2FsbHNGYWtlIiwiY29uZmlnIiwiaXMiLCJ1c2VyIiwiaG9zdCIsImNsaWVudCIsInNlc3Npb25JZCIsImNvbm5lY3Rpb24iLCJkZWVwRXF1YWxzIiwiY2FsbENvdW50IiwiQ2xpZW50IiwicmVzdG9yZSIsImZhaWwiLCJkZWVwRXF1YWwiLCJyYXdTZXNzaW9uIiwiRXJyb3IiLCJ2ZXJzaW9uIiwibWV0aG9kIiwidXJsIiwiYXJncyIsImxpbWl0IiwiZGF0YSIsImlkIl0sIm1hcHBpbmdzIjoiOztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsbUJBQUssYUFBTCxFQUFvQixNQUFNQSxDQUFOLElBQVc7QUFDN0IsUUFBTUMsT0FBTyxHQUFHO0FBQUNDLElBQUFBLElBQUksRUFBRTtBQUFQLEdBQWhCO0FBQ0EsTUFBSUMsUUFBUSxHQUFHLEtBQWY7O0FBRUEsUUFBTUMsU0FBUyxHQUFHQyxXQUFXLElBQUk7QUFDL0IsUUFBSSw2Q0FBNkNDLElBQTdDLENBQWtERCxXQUFsRCxDQUFKLEVBQW9FO0FBQ2xFRixNQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNBLGFBQU87QUFDTEksUUFBQUEsSUFBSSxFQUFFLENBQ0o7QUFDRUMsVUFBQUEsUUFBUSxFQUFFQyxJQUFJLENBQUNDLFNBQUwsQ0FBZTtBQUN2QkMsWUFBQUEsTUFBTSxFQUFFLENBQUM7QUFBQ0MsY0FBQUEsR0FBRyxFQUFFO0FBQUNDLGdCQUFBQSxTQUFTLEVBQUU7QUFBWjtBQUFOLGFBQUQ7QUFEZSxXQUFm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QUQ7QUFBWVUsSUFBQUE7QUFBWixHQUFmO0FBQ0EsUUFBTSx5QkFBV1gsTUFBWCxFQUFtQlosS0FBbkIsQ0FBTjs7QUFDQU0sY0FBR1csTUFBSCxDQUFVQyxPQUFWOztBQUNBakMsRUFBQUEsQ0FBQyxDQUFDbUIsR0FBRjtBQUNELENBNUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRlc3QgZnJvbSAndGFwZSc7XG5pbXBvcnQgY29ubmVjdGlvbiBmcm9tICcuLi8uLi9xdWVyeS9jb25uZWN0aW9uLmpzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgcGcgZnJvbSAnQG1pY2J1cmtzL3BnJztcblxudGVzdCgnI2Nvbm5lY3Rpb24nLCBhc3luYyB0ID0+IHtcbiAgY29uc3QgZmFrZVJvdyA9IHtuYW1lOiAnZmFrZS1uYW1lJ307XG4gIGxldCBsb2dnZWRJbiA9IGZhbHNlO1xuXG4gIGNvbnN0IGZha2VRdWVyeSA9IHF1ZXJ5U3RyaW5nID0+IHtcbiAgICBpZiAoL15zZWxlY3QgLiogcm9sZV9uYW1lIGZyb20gZW5kcG9pbnQuc2Vzc2lvbi8udGVzdChxdWVyeVN0cmluZykpIHtcbiAgICAgIGxvZ2dlZEluID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNwb25zZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICByZXN1bHQ6IFt7cm93OiB7cm9sZV9uYW1lOiAnbG9nZ2VkLWluLXVzZXInfX1dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvd3M6IFt7cmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtyZXN1bHQ6IFt7cm93OiBmYWtlUm93fV19KX1dLFxuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsaWVudEFQSSA9IHtcbiAgICBxdWVyeTogc2lub24uZmFrZShmYWtlUXVlcnkpLFxuICAgIGNvbm5lY3Q6IHNpbm9uLmZha2UoKSxcbiAgICBlbmQ6IHNpbm9uLmZha2UoKSxcbiAgfTtcbiAgc2lub24uc3R1YihwZywgJ0NsaWVudCcpLmNhbGxzRmFrZShjb25maWcgPT4ge1xuICAgIGlmIChsb2dnZWRJbikge1xuICAgICAgdC5pcyhcbiAgICAgICAgY29uZmlnLnVzZXIsXG4gICAgICAgICdsb2dnZWQtaW4tdXNlcicsXG4gICAgICAgICd1cGRhdGVzIGNvbmZpZyB0byB1c2UgbG9nZ2VkIGluIHVzZXInLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdC5pcyhjb25maWcudXNlciwgJ2Fub255bW91cycsICd1c2VzIGRlZmF1bHQgY29uZmlnJyk7XG4gICAgfVxuICAgIHQuaXMoY29uZmlnLmhvc3QsICdvdmVycmlkZS1ob3N0JywgJ21lcmdlcyBnaXZlbiBjbGllbnQgY29uZmlnJyk7XG5cbiAgICByZXR1cm4gY2xpZW50QVBJO1xuICB9KTtcblxuICBjb25zdCBjbGllbnQgPSB7XG4gICAgc2Vzc2lvbklkOiAnMTIzJyxcbiAgICBjb25uZWN0aW9uOiB7aG9zdDogJ292ZXJyaWRlLWhvc3QnfSxcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGNvbm5lY3Rpb24oY2xpZW50LCB7fSk7XG4gIHQuZGVlcEVxdWFscyh1c2VyWzBdLCBmYWtlUm93LCAncmV0dXJucyBkYXRhJyk7XG4gIHQuaXMoXG4gICAgY2xpZW50QVBJLmNvbm5lY3QuY2FsbENvdW50LFxuICAgIGNsaWVudEFQSS5lbmQuY2FsbENvdW50LFxuICAgICdhbGwgY2xpZW50cyBhcmUgcmVsZWFzZWQnLFxuICApO1xuXG4gIHBnLkNsaWVudC5yZXN0b3JlKCk7XG4gIHQuZW5kKCk7XG59KTtcblxudGVzdCgnI2Nvbm5lY3Rpb24gLSB3aXRob3V0IHNlc3Npb25JZCcsIGFzeW5jIHQgPT4ge1xuICBjb25zdCBmYWtlUm93ID0ge25hbWU6ICdmYWtlLW5hbWUnfTtcblxuICBjb25zdCBmYWtlUXVlcnkgPSBxdWVyeVN0cmluZyA9PiB7XG4gICAgaWYgKC9ec2VsZWN0IC4qIHJvbGVfbmFtZSBmcm9tIGVuZHBvaW50LnNlc3Npb24vLnRlc3QocXVlcnlTdHJpbmcpKSB7XG4gICAgICB0LmZhaWwoJ3RyaWVkIHRvIGxvZ2luJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNwb25zZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICByZXN1bHQ6IFt7cm93OiBmYWtlUm93fV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsaWVudEFQSSA9IHtcbiAgICBxdWVyeTogc2lub24uZmFrZShmYWtlUXVlcnkpLFxuICAgIGNvbm5lY3Q6IHNpbm9uLmZha2UoKSxcbiAgICBlbmQ6IHNpbm9uLmZha2UoKSxcbiAgfTtcbiAgc2lub24uc3R1YihwZywgJ0NsaWVudCcpLmNhbGxzRmFrZShjb25maWcgPT4ge1xuICAgIHQuaXMoY29uZmlnLnVzZXIsICdhbm9ueW1vdXMnLCBcImRvZXNuJ3QgYWx0ZXIgdXNlclwiKTtcblxuICAgIHJldHVybiBjbGllbnRBUEk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24oe30sIHt9KTtcbiAgdC5kZWVwRXF1YWwocmVzdWx0WzBdLCBmYWtlUm93LCAncmV0dXJucyBkYXRhJyk7XG4gIHQuaXMoXG4gICAgY2xpZW50QVBJLmNvbm5lY3QuY2FsbENvdW50LFxuICAgIGNsaWVudEFQSS5lbmQuY2FsbENvdW50LFxuICAgICdhbGwgY2xpZW50cyBhcmUgcmVsZWFzZWQnLFxuICApO1xuXG4gIHBnLkNsaWVudC5yZXN0b3JlKCk7XG4gIHQuZW5kKCk7XG59KTtcblxudGVzdCgnI2Nvbm5lY3Rpb24gLSB1c2VzIGFub255bW91cyBpZiBsb2dpbiBmYWlscycsIGFzeW5jIHQgPT4ge1xuICBjb25zdCBmYWtlUm93ID0ge25hbWU6ICdmYWtlLW5hbWUnfTtcblxuICBjb25zdCBmYWtlUXVlcnkgPSBxdWVyeVN0cmluZyA9PiB7XG4gICAgaWYgKC9ec2VsZWN0IC4qIHJvbGVfbmFtZSBmcm9tIGVuZHBvaW50LnNlc3Npb24vLnRlc3QocXVlcnlTdHJpbmcpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBbXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3dzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzcG9uc2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBbe3JvdzogZmFrZVJvd31dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGllbnRBUEkgPSB7XG4gICAgcXVlcnk6IHNpbm9uLmZha2UoZmFrZVF1ZXJ5KSxcbiAgICBjb25uZWN0OiBzaW5vbi5mYWtlKCksXG4gICAgZW5kOiBzaW5vbi5mYWtlKCksXG4gIH07XG4gIHNpbm9uLnN0dWIocGcsICdDbGllbnQnKS5jYWxsc0Zha2UoY29uZmlnID0+IHtcbiAgICB0LmlzKGNvbmZpZy51c2VyLCAnYW5vbnltb3VzJywgXCJkb2Vzbid0IGFsdGVyIHVzZXJcIik7XG5cbiAgICByZXR1cm4gY2xpZW50QVBJO1xuICB9KTtcblxuICBjb25zdCBjbGllbnQgPSB7cmF3U2Vzc2lvbjogdHJ1ZSwgc2Vzc2lvbklkOiAnMTIzJ307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24oY2xpZW50LCB7fSk7XG4gIHQuZGVlcEVxdWFsKHJlc3VsdFswXSwgZmFrZVJvdywgJ3N0aWxsIHJldHVybnMgZGF0YScpO1xuICB0LmlzKFxuICAgIGNsaWVudEFQSS5jb25uZWN0LmNhbGxDb3VudCxcbiAgICBjbGllbnRBUEkuZW5kLmNhbGxDb3VudCxcbiAgICAnYWxsIGNsaWVudHMgYXJlIHJlbGVhc2VkJyxcbiAgKTtcblxuICBwZy5DbGllbnQucmVzdG9yZSgpO1xuICB0LmVuZCgpO1xufSk7XG5cbnRlc3QoJyNjb25uZWN0aW9uIC0gZGVhbHMgd2l0aCBlcnJvciBpbiBydW5uaW5nIHF1ZXJpZXMnLCBhc3luYyB0ID0+IHtcbiAgY29uc3QgZmFrZVF1ZXJ5ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignZGIgY29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgfTtcbiAgY29uc3QgY2xpZW50QVBJID0ge1xuICAgIHF1ZXJ5OiBzaW5vbi5mYWtlKGZha2VRdWVyeSksXG4gICAgY29ubmVjdDogc2lub24uZmFrZSgpLFxuICAgIGVuZDogc2lub24uZmFrZSgpLFxuICB9O1xuICBzaW5vbi5zdHViKHBnLCAnQ2xpZW50JykuY2FsbHNGYWtlKCgpID0+IGNsaWVudEFQSSk7XG5cbiAgY29uc3QgY2xpZW50ID0ge3Nlc3Npb25JZDogJzEyMyd9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uKGNsaWVudCwge30pO1xuICB0LmlzKHJlc3VsdCwgbnVsbCwgJ3JldHVybnMgbnVsbCcpO1xuICB0LmlzKFxuICAgIGNsaWVudEFQSS5jb25uZWN0LmNhbGxDb3VudCxcbiAgICBjbGllbnRBUEkuZW5kLmNhbGxDb3VudCxcbiAgICAnYWxsIGNsaWVudHMgYXJlIHJlbGVhc2VkJyxcbiAgKTtcblxuICBwZy5DbGllbnQucmVzdG9yZSgpO1xuICB0LmVuZCgpO1xufSk7XG5cbnRlc3QoJyNjb25uZWN0aW9uIC0gcGFzc2VzIGFsbCBxdWVyeSBwYXJhbXMnLCBhc3luYyB0ID0+IHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gJzEyMyc7XG4gIGNvbnN0IHZlcnNpb24gPSAndjInO1xuICBjb25zdCBxdWVyeSA9IHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6ICcvd2lkZ2V0L2RlcGVuZGVuY3knLFxuICAgIGFyZ3M6IHtsaW1pdDogNX0sXG4gICAgZGF0YToge2lkOiAnOTk5J30sXG4gIH07XG5cbiAgY29uc3QgZmFrZVF1ZXJ5ID0gKHF1ZXJ5U3RyaW5nLCBhcmdzKSA9PiB7XG4gICAgaWYgKC9ec2VsZWN0IC4qIHJvbGVfbmFtZSBmcm9tIGVuZHBvaW50LnNlc3Npb24vLnRlc3QocXVlcnlTdHJpbmcpKSB7XG4gICAgICB0LmRlZXBFcXVhbChhcmdzLCBbc2Vzc2lvbklkXSk7XG4gICAgICByZXR1cm4ge3Jvd3M6IFt7cm9sZV9uYW1lOiAnbG9nZ2VkLWluLXVzZXInfV19O1xuICAgIH0gZWxzZSB7XG4gICAgICB0LmRlZXBFcXVhbChhcmdzLCBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHF1ZXJ5Lm1ldGhvZCxcbiAgICAgICAgcXVlcnkudXJsLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShxdWVyeS5hcmdzKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocXVlcnkuZGF0YSksXG4gICAgICBdKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNwb25zZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICByZXN1bHQ6IFtdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGllbnRBUEkgPSB7XG4gICAgcXVlcnk6IHNpbm9uLmZha2UoZmFrZVF1ZXJ5KSxcbiAgICBjb25uZWN0OiBzaW5vbi5mYWtlKCksXG4gICAgZW5kOiBzaW5vbi5mYWtlKCksXG4gIH07XG4gIHNpbm9uLnN0dWIocGcsICdDbGllbnQnKS5jYWxsc0Zha2UoKCkgPT4gY2xpZW50QVBJKTtcblxuICBjb25zdCBjbGllbnQgPSB7c2Vzc2lvbklkLCB2ZXJzaW9ufTtcbiAgYXdhaXQgY29ubmVjdGlvbihjbGllbnQsIHF1ZXJ5KTtcbiAgcGcuQ2xpZW50LnJlc3RvcmUoKTtcbiAgdC5lbmQoKTtcbn0pO1xuIl19