@riddance/deploy
Version:
96 lines • 17.2 kB
JavaScript
import { jsonResponse, okResponse } from '@riddance/fetch';
import { randomUUID } from 'node:crypto';
import { isDeepStrictEqual } from 'node:util';
import { awsRequest, isNotFound } from '../lite.js';
export async function syncTriggers(env, prefix, service, functions, reflection, region, account, apiGatewayId) {
const currentTriggers = await getTriggers(env, prefix, service, functions);
await Promise.all(reflection.http.map(async (fn) => {
const trigger = currentTriggers.find(t => t.name === fn.name);
if (!trigger) {
const statement = makeStatementData(region, account, apiGatewayId, functions.find(f => f.name === fn.name)?.id ?? '', fn);
await addTrigger(env, prefix, service, fn.name, randomUUID(), statement);
return;
}
const statement = makeStatementData(region, account, apiGatewayId, trigger.id, fn);
let exists = false;
if (trigger.statements) {
for (const { Sid, ...data } of trigger.statements) {
if (isDeepStrictEqual(data, statement)) {
if (exists) {
await deleteTrigger(env, prefix, service, fn.name, Sid);
}
else {
exists = true;
}
}
else {
await deleteTrigger(env, prefix, service, fn.name, Sid);
}
}
}
if (!exists) {
await addTrigger(env, prefix, service, fn.name, randomUUID(), statement);
}
}));
}
export async function getTriggers(env, prefix, service, functions) {
return await Promise.all(functions.map(async (fn) => {
try {
return {
id: fn.id,
name: fn.name,
statements: JSON.parse((await jsonResponse(awsRequest(env, 'GET', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${fn.name}/policy/`), 'Error getting triggers.')).Policy).Statement,
};
}
catch (e) {
if (isNotFound(e)) {
return {
id: fn.id,
name: fn.name,
};
}
throw e;
}
}));
}
async function addTrigger(env, prefix, service, name, id, statement) {
const arn = statement.Condition.ArnLike['AWS:SourceArn'];
console.log(`adding trigger ${id} to lambda ${name}`);
console.log(` from ${arn}`);
await okResponse(awsRequest(env, 'POST', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${name}/policy/`, {
StatementId: id,
Action: statement.Action,
Principal: statement.Principal.Service,
SourceArn: arn,
}), 'Error adding triggers.');
}
async function deleteTrigger(env, prefix, service, name, id) {
console.log(`deleting trigger ${id} from ${name}`);
await okResponse(awsRequest(env, 'DELETE', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${name}/policy/${id}`), 'Error deleting triggers.');
}
function makeStatementData(region, account, apiGatewayId, functionId, fn) {
if (!region || !account) {
throw new Error('Weird');
}
let p = 0;
return {
Action: 'lambda:InvokeFunction',
Effect: 'Allow',
Principal: {
Service: 'apigateway.amazonaws.com',
},
Resource: functionId,
Condition: {
ArnLike: {
'AWS:SourceArn': `arn:aws:execute-api:${region}:${account}:${apiGatewayId}/*/*/${trimTrailingSlash(fn.pathPattern.replaceAll('*', () => `{p${++p}}`))}`,
},
},
};
}
function trimTrailingSlash(pathPattern) {
if (pathPattern.endsWith('/')) {
return pathPattern.slice(0, -1);
}
return pathPattern;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmlnZ2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzdDLE9BQU8sRUFBWSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTdELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUM5QixHQUFhLEVBQ2IsTUFBYyxFQUNkLE9BQWUsRUFDZixTQUF5QyxFQUN6QyxVQUFzQixFQUN0QixNQUEwQixFQUMxQixPQUEyQixFQUMzQixZQUFvQjtJQUVwQixNQUFNLGVBQWUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMxRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLEVBQUUsRUFBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FDL0IsTUFBTSxFQUNOLE9BQU8sRUFDUCxZQUFZLEVBQ1osU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2pELEVBQUUsQ0FDTCxDQUFBO1lBQ0Qs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RSxVQUFVO1FBQ3BCLFNBQVMsRUFBRTtZQUNQLE9BQU8sRUFBRTtnQkFDTCxlQUFlLEVBQUUsdUJBQXVCLE1BQU0sSUFBSSxPQUFPLElBQUksWUFBWSxRQUFRLGlCQUFpQixDQUM5RixFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQ3BELEVBQUU7YUFDTjtTQUNKO0tBQ0osQ0FBQTtBQUNMLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFdBQW1CO0lBQzFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25SZXNwb25zZSwgb2tSZXNwb25zZSB9IGZyb20gJ0ByaWRkYW5jZS9mZXRjaCdcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tICdAcmlkZGFuY2UvaG9zdC9yZWZsZWN0J1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IHsgaXNEZWVwU3RyaWN0RXF1YWwgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBMb2NhbEVudiwgYXdzUmVxdWVzdCwgaXNOb3RGb3VuZCB9IGZyb20gJy4uL2xpdGUuanMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jVHJpZ2dlcnMoXG4gICAgZW52OiBMb2NhbEVudixcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgcmVmbGVjdGlvbjogUmVmbGVjdGlvbixcbiAgICByZWdpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY2NvdW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYXBpR2F0ZXdheUlkOiBzdHJpbmcsXG4pIHtcbiAgICBjb25zdCBjdXJyZW50VHJpZ2dlcnMgPSBhd2FpdCBnZXRUcmlnZ2VycyhlbnYsIHByZWZpeCwgc2VydmljZSwgZnVuY3Rpb25zKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZWZsZWN0aW9uLmh0dHAubWFwKGFzeW5jIGZuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjdXJyZW50VHJpZ2dlcnMuZmluZCh0ID0+IHQubmFtZSA9PT0gZm4ubmFtZSlcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IG1ha2VTdGF0ZW1lbnREYXRhKFxuICAgICAgICAgICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgIGFwaUdhdGV3YXlJZCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZuLm5hbWUpPy5pZCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFkZFRyaWdnZXIoZW52LCBwcmVmaXgsIHNlcnZpY2UsIGZuLm5hbWUsIHJhbmRvbVVVSUQoKSwgc3RhdGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50ID0gbWFrZVN0YXRlbWVudERhdGEocmVnaW9uLCBhY2NvdW50LCBhcGlHYXRld2F5SWQsIHRyaWdnZXIuaWQsIGZuKVxuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlXG4gICAgICAgICAgICBpZiAodHJpZ2dlci5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IFNpZCwgLi4uZGF0YSB9IG9mIHRyaWdnZXIuc3RhdGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWVwU3RyaWN0RXF1YWwoZGF0YSwgc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZVRyaWdnZXIoZW52LCBwcmVmaXgsIHNlcnZpY2UsIGZuLm5hbWUsIFNpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlVHJpZ2dlcihlbnYsIHByZWZpeCwgc2VydmljZSwgZm4ubmFtZSwgU2lkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRUcmlnZ2VyKGVudiwgcHJlZml4LCBzZXJ2aWNlLCBmbi5uYW1lLCByYW5kb21VVUlEKCksIHN0YXRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKVxufVxuXG5leHBvcnQgdHlwZSBBd3NUcmlnZ2VyID0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjb25maWc/OiB7XG4gICAgICAgIG1ldGhvZDogc3RyaW5nXG4gICAgICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmdcbiAgICB9XG4gICAgc3RhdGVtZW50cz86IEF3c1N0YXRlbWVudFtdXG59XG5cbnR5cGUgQXdzU3RhdGVtZW50ID0ge1xuICAgIFNpZDogc3RyaW5nXG4gICAgRWZmZWN0OiBzdHJpbmdcbiAgICBQcmluY2lwYWw6IHsgU2VydmljZTogc3RyaW5nIH1cbiAgICBBY3Rpb246IHN0cmluZ1xuICAgIFJlc291cmNlOiBzdHJpbmdcbiAgICBDb25kaXRpb246IHVua25vd25cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRyaWdnZXJzKFxuICAgIGVudjogTG9jYWxFbnYsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgc2VydmljZTogc3RyaW5nLFxuICAgIGZ1bmN0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdLFxuKTogUHJvbWlzZTxBd3NUcmlnZ2VyW10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZ1bmN0aW9ucy5tYXAoYXN5bmMgZm4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZm4uaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZuLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHM6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBqc29uUmVzcG9uc2U8eyBQb2xpY3k6IHN0cmluZyB9PihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3c1JlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHRVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW1iZGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtwcmVmaXh9LSR7c2VydmljZX0tJHtmbi5uYW1lfS9wb2xpY3kvYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZ2V0dGluZyB0cmlnZ2Vycy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5Qb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICApIGFzIHsgU3RhdGVtZW50OiBBd3NTdGF0ZW1lbnRbXSB9XG4gICAgICAgICAgICAgICAgICAgICkuU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb3RGb3VuZChlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGZuLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkVHJpZ2dlcihcbiAgICBlbnY6IExvY2FsRW52LFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIHNlcnZpY2U6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VTdGF0ZW1lbnREYXRhPixcbikge1xuICAgIGNvbnN0IGFybiA9IHN0YXRlbWVudC5Db25kaXRpb24uQXJuTGlrZVsnQVdTOlNvdXJjZUFybiddXG4gICAgY29uc29sZS5sb2coYGFkZGluZyB0cmlnZ2VyICR7aWR9IHRvIGxhbWJkYSAke25hbWV9YClcbiAgICBjb25zb2xlLmxvZyhgICBmcm9tICR7YXJufWApXG4gICAgYXdhaXQgb2tSZXNwb25zZShcbiAgICAgICAgYXdzUmVxdWVzdChcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgICdQT1NUJyxcbiAgICAgICAgICAgICdsYW1iZGEnLFxuICAgICAgICAgICAgYC8yMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke3ByZWZpeH0tJHtzZXJ2aWNlfS0ke25hbWV9L3BvbGljeS9gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFN0YXRlbWVudElkOiBpZCxcbiAgICAgICAgICAgICAgICBBY3Rpb246IHN0YXRlbWVudC5BY3Rpb24sXG4gICAgICAgICAgICAgICAgUHJpbmNpcGFsOiBzdGF0ZW1lbnQuUHJpbmNpcGFsLlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgU291cmNlQXJuOiBhcm4sXG4gICAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICAnRXJyb3IgYWRkaW5nIHRyaWdnZXJzLicsXG4gICAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVUcmlnZ2VyKFxuICAgIGVudjogTG9jYWxFbnYsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgc2VydmljZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuKSB7XG4gICAgY29uc29sZS5sb2coYGRlbGV0aW5nIHRyaWdnZXIgJHtpZH0gZnJvbSAke25hbWV9YClcbiAgICBhd2FpdCBva1Jlc3BvbnNlKFxuICAgICAgICBhd3NSZXF1ZXN0KFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgJ0RFTEVURScsXG4gICAgICAgICAgICAnbGFtYmRhJyxcbiAgICAgICAgICAgIGAvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtwcmVmaXh9LSR7c2VydmljZX0tJHtuYW1lfS9wb2xpY3kvJHtpZH1gLFxuICAgICAgICApLFxuICAgICAgICAnRXJyb3IgZGVsZXRpbmcgdHJpZ2dlcnMuJyxcbiAgICApXG59XG5cbmZ1bmN0aW9uIG1ha2VTdGF0ZW1lbnREYXRhKFxuICAgIHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhcGlHYXRld2F5SWQ6IHN0cmluZyxcbiAgICBmdW5jdGlvbklkOiBzdHJpbmcsXG4gICAgZm46IHtcbiAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgIG1ldGhvZDogc3RyaW5nXG4gICAgICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmdcbiAgICB9LFxuKSB7XG4gICAgaWYgKCFyZWdpb24gfHwgIWFjY291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWlyZCcpXG4gICAgfVxuICAgIGxldCBwID0gMFxuICAgIHJldHVybiB7XG4gICAgICAgIEFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgUHJpbmNpcGFsOiB7XG4gICAgICAgICAgICBTZXJ2aWNlOiAnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgfSxcbiAgICAgICAgUmVzb3VyY2U6IGZ1bmN0aW9uSWQsXG4gICAgICAgIENvbmRpdGlvbjoge1xuICAgICAgICAgICAgQXJuTGlrZToge1xuICAgICAgICAgICAgICAgICdBV1M6U291cmNlQXJuJzogYGFybjphd3M6ZXhlY3V0ZS1hcGk6JHtyZWdpb259OiR7YWNjb3VudH06JHthcGlHYXRld2F5SWR9LyovKi8ke3RyaW1UcmFpbGluZ1NsYXNoKFxuICAgICAgICAgICAgICAgICAgICBmbi5wYXRoUGF0dGVybi5yZXBsYWNlQWxsKCcqJywgKCkgPT4gYHtwJHsrK3B9fWApLFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChwYXRoUGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHBhdGhQYXR0ZXJuLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgcmV0dXJuIHBhdGhQYXR0ZXJuLnNsaWNlKDAsIC0xKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aFBhdHRlcm5cbn1cbiJdfQ==