UNPKG

json-ts

Version:

Automatically generate Typescript Definition files or Flow types from JSON input

156 lines 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ts = require("typescript"); var needsQuotes = require("needsquotes"); function walk(sourceFile, initial) { if (initial === void 0) { initial = []; } var stack = initial.slice(); var elementStack = initial.slice(); function push(element) { var parent = elementStack[elementStack.length - 1]; var siblings = (parent && parent.body) ? parent.body : stack; siblings.push(element); } eachProp(sourceFile); return stack; function addFromArrayElement(incoming) { switch (incoming.kind) { case ts.SyntaxKind.NullKeyword: case ts.SyntaxKind.TrueKeyword: case ts.SyntaxKind.FalseKeyword: case ts.SyntaxKind.NumericLiteral: case ts.SyntaxKind.StringLiteral: { push(literalTypeFromArrayElement(incoming, incoming.kind)); break; } case ts.SyntaxKind.PrefixUnaryExpression: { push(literalTypeFromArrayElement(incoming, ts.SyntaxKind.NumericLiteral)); break; } case ts.SyntaxKind.ObjectLiteralExpression: { var elem = { kind: ts.SyntaxKind.ObjectLiteralExpression, _kind: "ObjectLiteralExpression", interfaceCandidate: true, body: [], }; push(elem); elementStack.push(elem); eachProp(incoming.properties); elementStack.pop(); break; } case ts.SyntaxKind.ArrayLiteralExpression: { var elem = { kind: ts.SyntaxKind.ArrayLiteralExpression, _kind: "ArrayLiteralExpression", body: [], }; push(elem); elementStack.push(elem); eachProp(incoming.elements); elementStack.pop(); break; } } } function eachProp(properties) { properties.forEach(function (prop) { if (!prop.initializer) { return addFromArrayElement(prop); } else { switch (prop.initializer.kind) { case ts.SyntaxKind.TrueKeyword: case ts.SyntaxKind.FalseKeyword: case ts.SyntaxKind.NullKeyword: case ts.SyntaxKind.StringLiteral: case ts.SyntaxKind.NumericLiteral: { push(literalTypeFromProp(prop, prop.initializer.kind)); break; } case ts.SyntaxKind.PrefixUnaryExpression: { push(literalTypeFromProp(prop, ts.SyntaxKind.NumericLiteral)); break; } case ts.SyntaxKind.ObjectLiteralExpression: { var quotes = needsQuotes(prop.name.text).needsQuotes; var interfaceCandidate = (quotes === false); var elem = { name: prop.name.text, body: [], interfaceCandidate: interfaceCandidate, kind: ts.SyntaxKind.ObjectLiteralExpression, _kind: "ObjectLiteralExpression" }; push(elem); elementStack.push(elem); eachProp(prop.initializer.properties); elementStack.pop(); break; } case ts.SyntaxKind.ArrayLiteralExpression: { var elem = { name: prop.name.text, body: [], kind: ts.SyntaxKind.ArrayLiteralExpression, _kind: "ArrayLiteralExpression" }; push(elem); elementStack.push(elem); eachProp(prop.initializer.elements); elementStack.pop(); break; } } } }); } function literalTypeFromProp(prop, kind) { return { name: prop.name.text, value: prop.initializer.text, kind: kind, }; } function literalTypeFromArrayElement(element, kind) { return { kind: kind, name: element.text, value: element.text, }; } } function parse(string, options) { var input = "const ROOTOBJ = " + string; var stack; var sourceFile = ts.createSourceFile('json.ts', input, ts.ScriptTarget.ES2015, /*setParentNodes */ true); // delint it var _json = sourceFile.statements[0]; var init = _json.declarationList.declarations[0].initializer; switch (init.kind) { case ts.SyntaxKind.TrueKeyword: case ts.SyntaxKind.FalseKeyword: case ts.SyntaxKind.NullKeyword: case ts.SyntaxKind.StringLiteral: case ts.SyntaxKind.NumericLiteral: { stack = [{ kind: init.kind, }]; break; } case ts.SyntaxKind.ArrayLiteralExpression: { stack = walk(init.elements, [{ kind: ts.SyntaxKind.ArrayLiteralExpression, _kind: "ArrayLiteralExpression", name: options.rootName, body: [], }]); break; } default: stack = walk(init.properties); } return { stack: stack, inputKind: init.kind }; } exports.parse = parse; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUFpQztBQUVqQyx5Q0FBNEM7QUFXNUMsY0FBYyxVQUF5QixFQUFFLE9BQVk7SUFBWix3QkFBQSxFQUFBLFlBQVk7SUFFakQsSUFBTSxLQUFLLEdBQXVCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsRCxJQUFNLFlBQVksR0FBdUIsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXpELGNBQWMsT0FBTztRQUNqQixJQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJCLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFFYiw2QkFBNkIsUUFBUTtRQUNqQyxNQUFNLENBQUEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQy9CLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUNoQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQ2xDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztn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QkFDbEIsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDO1FBQ1YsQ0FBQztRQUNELEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3hDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN6QixJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0I7b0JBQzFDLEtBQUssRUFBRSx3QkFBd0I7b0JBQy9CLElBQUksRUFBRSxPQUFPLENBQUMsUUFBUTtvQkFDdEIsSUFBSSxFQUFFLEVBQUU7aUJBQ1gsQ0FBQyxDQUFDLENBQUM7WUFDSixLQUFLLENBQUM7UUFDVixDQUFDO1FBQ0QsU0FBUyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQUMsS0FBSyxPQUFBLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQztBQUN6QyxDQUFDO0FBaENELHNCQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtKc29uVHNPcHRpb25zfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IG5lZWRzUXVvdGVzID0gcmVxdWlyZShcIm5lZWRzcXVvdGVzXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZE5vZGUge1xuICAgIGtpbmQ6IHRzLlN5bnRheEtpbmRcbiAgICBfa2luZDogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHZhbHVlPzogYW55XG4gICAgYm9keT86IFBhcnNlZE5vZGVbXVxuICAgIGludGVyZmFjZUNhbmRpZGF0ZT86IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gd2Fsayhzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBpbml0aWFsID0gW10pOiBQYXJzZWROb2RlW10ge1xuXG4gICAgY29uc3Qgc3RhY2sgOiBBcnJheTxQYXJzZWROb2RlPiA9IGluaXRpYWwuc2xpY2UoKTtcbiAgICBjb25zdCBlbGVtZW50U3RhY2sgOiBBcnJheTxQYXJzZWROb2RlPiA9IGluaXRpYWwuc2xpY2UoKTtcblxuICAgIGZ1bmN0aW9uIHB1c2goZWxlbWVudCkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50U3RhY2tbZWxlbWVudFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBzaWJsaW5ncyA9IChwYXJlbnQgJiYgcGFyZW50LmJvZHkpID8gcGFyZW50LmJvZHkgOiBzdGFjaztcbiAgICAgICAgc2libGluZ3MucHVzaChlbGVtZW50KTtcbiAgICB9XG5cbiAgICBlYWNoUHJvcChzb3VyY2VGaWxlKTtcblxuICAgIHJldHVybiBzdGFjaztcblxuICAgIGZ1bmN0aW9uIGFkZEZyb21BcnJheUVsZW1lbnQoaW5jb21pbmcpIHtcbiAgICAgICAgc3dpdGNoKGluY29taW5nLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZDpcbiAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5GYWxzZUtleXdvcmQ6XG4gICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG4gICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDoge1xuICAgICAgICAgICAgICAgIHB1c2gobGl0ZXJhbFR5cGVGcm9tQXJyYXlFbGVtZW50KGluY29taW5nLCBpbmNvbWluZy5raW5kKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuUHJlZml4VW5hcnlFeHByZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgcHVzaChsaXRlcmFsVHlwZUZyb21BcnJheUVsZW1lbnQoaW5jb21pbmcsIHRzLlN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWwpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIF9raW5kOiBgT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25gLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VDYW5kaWRhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50U3RhY2sucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICBlYWNoUHJvcChpbmNvbWluZy5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgX2tpbmQ6IGBBcnJheUxpdGVyYWxFeHByZXNzaW9uYCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwdXNoKGVsZW0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRTdGFjay5wdXNoKGVsZW0pO1xuICAgICAgICAgICAgICAgIGVhY2hQcm9wKGluY29taW5nLmVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlYWNoUHJvcChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgaWYgKCFwcm9wLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZEZyb21BcnJheUVsZW1lbnQocHJvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcC5pbml0aWFsaXplci5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWVyaWNMaXRlcmFsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGxpdGVyYWxUeXBlRnJvbVByb3AocHJvcCwgcHJvcC5pbml0aWFsaXplci5raW5kKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuUHJlZml4VW5hcnlFeHByZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGxpdGVyYWxUeXBlRnJvbVByb3AocHJvcCwgdHMuU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdW90ZXMgPSBuZWVkc1F1b3Rlcyhwcm9wLm5hbWUudGV4dCkubmVlZHNRdW90ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmZhY2VDYW5kaWRhdGUgPSAocXVvdGVzID09PSBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcC5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlQ2FuZGlkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tpbmQ6IGBPYmplY3RMaXRlcmFsRXhwcmVzc2lvbmBcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcC5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogdHMuU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9raW5kOiBgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbmBcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChwcm9wLmluaXRpYWxpemVyLmVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXRlcmFsVHlwZUZyb21Qcm9wKHByb3AsIGtpbmQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHByb3AubmFtZS50ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IHByb3AuaW5pdGlhbGl6ZXIudGV4dCxcbiAgICAgICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXRlcmFsVHlwZUZyb21BcnJheUVsZW1lbnQoZWxlbWVudCwga2luZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQudGV4dCxcbiAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50LnRleHQsXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShzdHJpbmcsIG9wdGlvbnM6IEpzb25Uc09wdGlvbnMpOiB7c3RhY2s6IGFueVtdLCBpbnB1dEtpbmQ6IHRzLlN5bnRheEtpbmR9IHtcbiAgICBjb25zdCBpbnB1dCA9IGBjb25zdCBST09UT0JKID0gJHtzdHJpbmd9YDtcbiAgICBsZXQgc3RhY2s7XG4gICAgbGV0IHNvdXJjZUZpbGUgOiB0cy5Tb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnanNvbi50cycsIGlucHV0LCB0cy5TY3JpcHRUYXJnZXQuRVMyMDE1LCAvKnNldFBhcmVudE5vZGVzICovIHRydWUpO1xuICAgIC8vIGRlbGludCBpdFxuICAgIGNvbnN0IF9qc29uID0gc291cmNlRmlsZS5zdGF0ZW1lbnRzWzBdIGFzIGFueTtcbiAgICBjb25zdCBpbml0ID0gX2pzb24uZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1swXS5pbml0aWFsaXplcjtcblxuICAgIHN3aXRjaCAoaW5pdC5raW5kKSB7XG4gICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZDpcbiAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcbiAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDpcbiAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWVyaWNMaXRlcmFsOiB7XG4gICAgICAgICAgICBzdGFjayA9IFt7XG4gICAgICAgICAgICAgICAga2luZDogaW5pdC5raW5kLFxuICAgICAgICAgICAgfV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgc3RhY2sgPSB3YWxrKGluaXQuZWxlbWVudHMsIFt7XG4gICAgICAgICAgICAgICAga2luZDogdHMuU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIF9raW5kOiBgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbmAsXG4gICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5yb290TmFtZSxcbiAgICAgICAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHN0YWNrID0gd2Fsayhpbml0LnByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB7c3RhY2ssIGlucHV0S2luZDogaW5pdC5raW5kfTtcbn1cbiJdfQ==