ness
Version:
✪ No-effort static sites deployed to your AWS account.
135 lines • 16.5 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Destroy = void 0;
const react_1 = __importStar(require("react"));
const ink_1 = require("ink");
const Task_1 = require("./Task");
const context_1 = require("../context");
const aws_1 = require("../providers/aws");
const events = __importStar(require("../utils/events"));
const csp_1 = require("../utils/csp");
const Destroy = () => {
const context = (0, react_1.useContext)(context_1.NessContext);
const { settings } = context;
const { domain, dir, csp } = settings || {};
const [error, setError] = (0, react_1.useState)();
const track = async (event, detail = '') => {
await events.emit({
event,
command: 'destroy',
detail,
domain: domain || '',
options: settings || {},
});
};
const handleError = async (stack, error) => {
const reason = await (0, aws_1.getCloudFormationFailureReason)((0, context_1.getStackId)(stack));
setError(`${error}${reason ? `:\n\n${reason}` : ''}`);
};
const destroy = async () => {
track('started');
const webStack = (0, context_1.getStackId)('web');
const webStackOutputs = await (0, aws_1.getCloudFormationStackOutputs)(webStack);
if (!webStackOutputs) {
setError("Couldn't find site. Are you sure you've deployed (from this branch)?");
return Task_1.TaskState.Failure;
}
try {
await (0, aws_1.clearS3Bucket)(webStackOutputs.BucketName);
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
}
// We first have to deploy the web stack without the certificate so that it
// removes the dependency on the alias stack.
const stack = await (0, aws_1.getStack)('web', {
DomainName: domain,
RedirectSubDomainNameWithDot: (settings === null || settings === void 0 ? void 0 : settings.redirectWww) ? 'www.' : undefined,
DefaultRootObject: settings === null || settings === void 0 ? void 0 : settings.indexDocument,
DefaultErrorObject: (settings === null || settings === void 0 ? void 0 : settings.spa) ? settings === null || settings === void 0 ? void 0 : settings.indexDocument : settings === null || settings === void 0 ? void 0 : settings.errorDocument,
DefaultErrorResponseCode: (settings === null || settings === void 0 ? void 0 : settings.spa) ? '200' : '404',
IncludeCloudFrontAlias: 'false',
ContentSecurityPolicy: csp && csp !== 'auto' ? csp : await (0, csp_1.generateCsp)(dir),
});
await (0, aws_1.deployStack)({ stack });
try {
await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('alias'));
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
handleError('alias', 'Unable to delete site');
return Task_1.TaskState.Failure;
}
// We first have to delete so that it goes to DELETE_FAILED, then we can
// specify the resources to retain (the edge lambdas)
try {
await (0, aws_1.deleteCloudFormationStack)(webStack);
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
}
try {
await (0, aws_1.deleteCloudFormationStack)(webStack, ['ViewerRequestFunction', 'OriginResponseFunction']);
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
handleError('web', 'Unable to delete site');
return Task_1.TaskState.Failure;
}
try {
await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('domain'));
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
handleError('domain', 'Unable to delete site');
return Task_1.TaskState.Failure;
}
try {
await (0, aws_1.deleteCloudFormationStack)((0, context_1.getStackId)('support'));
}
catch (error) {
if (error instanceof Error) {
track('error', error.message);
}
handleError('support', 'Unable to delete site');
return Task_1.TaskState.Failure;
}
track('finished');
return Task_1.TaskState.Success;
};
return (react_1.default.createElement(ink_1.Box, { flexDirection: 'column' },
react_1.default.createElement(Task_1.Task, { name: 'Destroying site', note: '\u2615 this could take a while', action: destroy }),
error && (react_1.default.createElement(ink_1.Box, { paddingTop: 1 },
react_1.default.createElement(ink_1.Text, { color: 'red' }, error)))));
};
exports.Destroy = Destroy;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL0Rlc3Ryb3kudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUQ7QUFDakQsNkJBQTZCO0FBQzdCLGlDQUFzQztBQUN0Qyx3Q0FBa0Q7QUFDbEQsMENBT3lCO0FBQ3pCLHdEQUF5QztBQUN6QyxzQ0FBd0M7QUFFakMsTUFBTSxPQUFPLEdBQTRCLEdBQUcsRUFBRTtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGtCQUFVLEVBQUMscUJBQVcsQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxPQUFPLENBQUE7SUFDMUIsTUFBTSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFDLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUV6QyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUEsZ0JBQVEsR0FBVSxDQUFBO0lBRTVDLE1BQU0sS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFO1FBQ2pELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQztZQUNoQixLQUFLO1lBQ0wsT0FBTyxFQUFFLFNBQVM7WUFDbEIsTUFBTTtZQUNOLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRTtZQUNwQixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUU7U0FDeEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQThCLEVBQUMsSUFBQSxvQkFBVSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUE7SUFFRCxNQUFNLE9BQU8sR0FBNkIsS0FBSyxJQUFJLEVBQUU7UUFDbkQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUEsb0JBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQTtRQUVsQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUEsbUNBQTZCLEVBQUMsUUFBUSxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQixRQUFRLENBQUMsc0VBQXNFLENBQUMsQ0FBQTtZQUNoRixPQUFPLGdCQUFTLENBQUMsT0FBTyxDQUFBO1NBQ3pCO1FBRUQsSUFBSTtZQUNGLE1BQU0sSUFBQSxtQkFBYSxFQUFDLGVBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7U0FDakQ7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtnQkFDMUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDOUI7U0FDRjtRQUVELDJFQUEyRTtRQUMzRSw2Q0FBNkM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLGNBQVEsRUFBQyxLQUFLLEVBQUU7WUFDbEMsVUFBVSxFQUFFLE1BQU07WUFDbEIsNEJBQTRCLEVBQUUsQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDeEUsaUJBQWlCLEVBQUUsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLGFBQWE7WUFDMUMsa0JBQWtCLEVBQUUsQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsYUFBYTtZQUNyRix3QkFBd0IsRUFBRSxDQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSztZQUN2RCxzQkFBc0IsRUFBRSxPQUFPO1lBQy9CLHFCQUFxQixFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBQSxpQkFBVyxFQUFDLEdBQUksQ0FBQztTQUM3RSxDQUFDLENBQUE7UUFFRixNQUFNLElBQUEsaUJBQVcsRUFBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFMUIsSUFBSTtZQUNGLE1BQU0sSUFBQSwrQkFBeUIsRUFBQyxJQUFBLG9CQUFVLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtTQUNyRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO2dCQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUM5QjtZQUNELFdBQVcsQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtZQUM3QyxPQUFPLGdCQUFTLENBQUMsT0FBTyxDQUFBO1NBQ3pCO1FBRUQsd0VBQXdFO1FBQ3hFLHFEQUFxRDtRQUNyRCxJQUFJO1lBQ0YsTUFBTSxJQUFBLCtCQUF5QixFQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzFDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7Z0JBQzFCLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQzlCO1NBQ0Y7UUFFRCxJQUFJO1lBQ0YsTUFBTSxJQUFBLCtCQUF5QixFQUFDLFFBQVEsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQTtTQUMvRjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO2dCQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUM5QjtZQUNELFdBQVcsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtZQUMzQyxPQUFPLGdCQUFTLENBQUMsT0FBTyxDQUFBO1NBQ3pCO1FBRUQsSUFBSTtZQUNGLE1BQU0sSUFBQSwrQkFBeUIsRUFBQyxJQUFBLG9CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtTQUN0RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO2dCQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUM5QjtZQUNELFdBQVcsQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtZQUM5QyxPQUFPLGdCQUFTLENBQUMsT0FBTyxDQUFBO1NBQ3pCO1FBRUQsSUFBSTtZQUNGLE1BQU0sSUFBQSwrQkFBeUIsRUFBQyxJQUFBLG9CQUFVLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtTQUN2RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO2dCQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUM5QjtZQUNELFdBQVcsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtZQUMvQyxPQUFPLGdCQUFTLENBQUMsT0FBTyxDQUFBO1NBQ3pCO1FBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWpCLE9BQU8sZ0JBQVMsQ0FBQyxPQUFPLENBQUE7SUFDMUIsQ0FBQyxDQUFBO0lBRUQsT0FBTyxDQUNMLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUTtRQUN6Qiw4QkFBQyxXQUFJLElBQUMsSUFBSSxFQUFDLGlCQUFpQixFQUFDLElBQUksRUFBQyxnQ0FBMkIsRUFBQyxNQUFNLEVBQUUsT0FBTyxHQUFJO1FBRWhGLEtBQUssSUFBSSxDQUNSLDhCQUFDLFNBQUcsSUFBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQiw4QkFBQyxVQUFJLElBQUMsS0FBSyxFQUFDLEtBQUssSUFBRSxLQUFLLENBQVEsQ0FDNUIsQ0FDUCxDQUNHLENBQ1AsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQXpIWSxRQUFBLE9BQU8sV0F5SG5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7dXNlQ29udGV4dCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtCb3gsIFRleHR9IGZyb20gJ2luaydcbmltcG9ydCB7VGFzaywgVGFza1N0YXRlfSBmcm9tICcuL1Rhc2snXG5pbXBvcnQge2dldFN0YWNrSWQsIE5lc3NDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0J1xuaW1wb3J0IHtcbiAgY2xlYXJTM0J1Y2tldCxcbiAgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgZGVwbG95U3RhY2ssXG4gIGdldENsb3VkRm9ybWF0aW9uRmFpbHVyZVJlYXNvbixcbiAgZ2V0Q2xvdWRGb3JtYXRpb25TdGFja091dHB1dHMsXG4gIGdldFN0YWNrLFxufSBmcm9tICcuLi9wcm92aWRlcnMvYXdzJ1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJy4uL3V0aWxzL2V2ZW50cydcbmltcG9ydCB7Z2VuZXJhdGVDc3B9IGZyb20gJy4uL3V0aWxzL2NzcCdcblxuZXhwb3J0IGNvbnN0IERlc3Ryb3k6IFJlYWN0LkZ1bmN0aW9uQ29tcG9uZW50ID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChOZXNzQ29udGV4dClcbiAgY29uc3Qge3NldHRpbmdzfSA9IGNvbnRleHRcbiAgY29uc3Qge2RvbWFpbiwgZGlyLCBjc3B9ID0gc2V0dGluZ3MgfHwge31cblxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZz4oKVxuXG4gIGNvbnN0IHRyYWNrID0gYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGRldGFpbCA9ICcnKSA9PiB7XG4gICAgYXdhaXQgZXZlbnRzLmVtaXQoe1xuICAgICAgZXZlbnQsXG4gICAgICBjb21tYW5kOiAnZGVzdHJveScsXG4gICAgICBkZXRhaWwsXG4gICAgICBkb21haW46IGRvbWFpbiB8fCAnJyxcbiAgICAgIG9wdGlvbnM6IHNldHRpbmdzIHx8IHt9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBoYW5kbGVFcnJvciA9IGFzeW5jIChzdGFjazogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVhc29uID0gYXdhaXQgZ2V0Q2xvdWRGb3JtYXRpb25GYWlsdXJlUmVhc29uKGdldFN0YWNrSWQoc3RhY2spKVxuICAgIHNldEVycm9yKGAke2Vycm9yfSR7cmVhc29uID8gYDpcXG5cXG4ke3JlYXNvbn1gIDogJyd9YClcbiAgfVxuXG4gIGNvbnN0IGRlc3Ryb3k6ICgpID0+IFByb21pc2U8VGFza1N0YXRlPiA9IGFzeW5jICgpID0+IHtcbiAgICB0cmFjaygnc3RhcnRlZCcpXG5cbiAgICBjb25zdCB3ZWJTdGFjayA9IGdldFN0YWNrSWQoJ3dlYicpXG5cbiAgICBjb25zdCB3ZWJTdGFja091dHB1dHMgPSBhd2FpdCBnZXRDbG91ZEZvcm1hdGlvblN0YWNrT3V0cHV0cyh3ZWJTdGFjaylcbiAgICBpZiAoIXdlYlN0YWNrT3V0cHV0cykge1xuICAgICAgc2V0RXJyb3IoXCJDb3VsZG4ndCBmaW5kIHNpdGUuIEFyZSB5b3Ugc3VyZSB5b3UndmUgZGVwbG95ZWQgKGZyb20gdGhpcyBicmFuY2gpP1wiKVxuICAgICAgcmV0dXJuIFRhc2tTdGF0ZS5GYWlsdXJlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsZWFyUzNCdWNrZXQod2ViU3RhY2tPdXRwdXRzIS5CdWNrZXROYW1lKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGZpcnN0IGhhdmUgdG8gZGVwbG95IHRoZSB3ZWIgc3RhY2sgd2l0aG91dCB0aGUgY2VydGlmaWNhdGUgc28gdGhhdCBpdFxuICAgIC8vIHJlbW92ZXMgdGhlIGRlcGVuZGVuY3kgb24gdGhlIGFsaWFzIHN0YWNrLlxuICAgIGNvbnN0IHN0YWNrID0gYXdhaXQgZ2V0U3RhY2soJ3dlYicsIHtcbiAgICAgIERvbWFpbk5hbWU6IGRvbWFpbixcbiAgICAgIFJlZGlyZWN0U3ViRG9tYWluTmFtZVdpdGhEb3Q6IHNldHRpbmdzPy5yZWRpcmVjdFd3dyA/ICd3d3cuJyA6IHVuZGVmaW5lZCxcbiAgICAgIERlZmF1bHRSb290T2JqZWN0OiBzZXR0aW5ncz8uaW5kZXhEb2N1bWVudCxcbiAgICAgIERlZmF1bHRFcnJvck9iamVjdDogc2V0dGluZ3M/LnNwYSA/IHNldHRpbmdzPy5pbmRleERvY3VtZW50IDogc2V0dGluZ3M/LmVycm9yRG9jdW1lbnQsXG4gICAgICBEZWZhdWx0RXJyb3JSZXNwb25zZUNvZGU6IHNldHRpbmdzPy5zcGEgPyAnMjAwJyA6ICc0MDQnLFxuICAgICAgSW5jbHVkZUNsb3VkRnJvbnRBbGlhczogJ2ZhbHNlJyxcbiAgICAgIENvbnRlbnRTZWN1cml0eVBvbGljeTogY3NwICYmIGNzcCAhPT0gJ2F1dG8nID8gY3NwIDogYXdhaXQgZ2VuZXJhdGVDc3AoZGlyISksXG4gICAgfSlcblxuICAgIGF3YWl0IGRlcGxveVN0YWNrKHtzdGFja30pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayhnZXRTdGFja0lkKCdhbGlhcycpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgICAgaGFuZGxlRXJyb3IoJ2FsaWFzJywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICAvLyBXZSBmaXJzdCBoYXZlIHRvIGRlbGV0ZSBzbyB0aGF0IGl0IGdvZXMgdG8gREVMRVRFX0ZBSUxFRCwgdGhlbiB3ZSBjYW5cbiAgICAvLyBzcGVjaWZ5IHRoZSByZXNvdXJjZXMgdG8gcmV0YWluICh0aGUgZWRnZSBsYW1iZGFzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKHdlYlN0YWNrKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0cmFjaygnZXJyb3InLCBlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKHdlYlN0YWNrLCBbJ1ZpZXdlclJlcXVlc3RGdW5jdGlvbicsICdPcmlnaW5SZXNwb25zZUZ1bmN0aW9uJ10pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRyYWNrKCdlcnJvcicsIGVycm9yLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgICBoYW5kbGVFcnJvcignd2ViJywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlQ2xvdWRGb3JtYXRpb25TdGFjayhnZXRTdGFja0lkKCdkb21haW4nKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdHJhY2soJ2Vycm9yJywgZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIGhhbmRsZUVycm9yKCdkb21haW4nLCAnVW5hYmxlIHRvIGRlbGV0ZSBzaXRlJylcbiAgICAgIHJldHVybiBUYXNrU3RhdGUuRmFpbHVyZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVDbG91ZEZvcm1hdGlvblN0YWNrKGdldFN0YWNrSWQoJ3N1cHBvcnQnKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdHJhY2soJ2Vycm9yJywgZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIGhhbmRsZUVycm9yKCdzdXBwb3J0JywgJ1VuYWJsZSB0byBkZWxldGUgc2l0ZScpXG4gICAgICByZXR1cm4gVGFza1N0YXRlLkZhaWx1cmVcbiAgICB9XG5cbiAgICB0cmFjaygnZmluaXNoZWQnKVxuXG4gICAgcmV0dXJuIFRhc2tTdGF0ZS5TdWNjZXNzXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj0nY29sdW1uJz5cbiAgICAgIDxUYXNrIG5hbWU9J0Rlc3Ryb3lpbmcgc2l0ZScgbm90ZT0n4piVIHRoaXMgY291bGQgdGFrZSBhIHdoaWxlJyBhY3Rpb249e2Rlc3Ryb3l9IC8+XG5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxCb3ggcGFkZGluZ1RvcD17MX0+XG4gICAgICAgICAgPFRleHQgY29sb3I9J3JlZCc+e2Vycm9yfTwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG4iXX0=