1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const ava_1 = require("ava");
|
4 | const aws_sdk_1 = require("aws-sdk");
|
5 | const uuid_1 = require("uuid");
|
6 | const index_1 = require("../index");
|
7 | const aws_faast_1 = require("../src/aws/aws-faast");
|
8 | const funcs = require("./fixtures/functions");
|
9 | const shared_1 = require("../src/shared");
|
10 | const util_1 = require("./fixtures/util");
|
11 | const error_1 = require("../src/error");
|
12 | const throttle_1 = require("../src/throttle");
|
13 | /**
|
14 | * The policies tested here should match those in the documentation at
|
15 | * {@link AwsOptions.RoleName}.
|
16 | */
|
17 | ava_1.default.serial((0, util_1.title)("aws", "custom role"), async (t) => {
|
18 | t.plan(1);
|
19 | const iam = new aws_sdk_1.IAM();
|
20 | const uuid = (0, uuid_1.v4)();
|
21 | const RoleName = `faast-test-custom-role-${uuid}`;
|
22 | let faastModule;
|
23 | let PolicyArn;
|
24 | let state = "initial";
|
25 | try {
|
26 | const AssumeRolePolicyDocument = JSON.stringify({
|
27 | Version: "2012-10-17",
|
28 | Statement: [
|
29 | {
|
30 | Principal: { Service: "lambda.amazonaws.com" },
|
31 | Action: "sts:AssumeRole",
|
32 | Effect: "Allow"
|
33 | }
|
34 | ]
|
35 | });
|
36 | state = `creating role ${RoleName}`;
|
37 | await (0, throttle_1.retryOp)(6, () => iam
|
38 | .createRole({
|
39 | AssumeRolePolicyDocument,
|
40 | RoleName,
|
41 | Description: "test custom role for lambda functions created by faast"
|
42 | })
|
43 | .promise());
|
44 | const PolicyDocument = JSON.stringify({
|
45 | Version: "2012-10-17",
|
46 | Statement: [
|
47 | {
|
48 | Effect: "Allow",
|
49 | Action: ["logs:*"],
|
50 | Resource: "arn:aws:logs:*:*:log-group:faast-*"
|
51 | },
|
52 | {
|
53 | Effect: "Allow",
|
54 | Action: ["sqs:*"],
|
55 | Resource: "arn:aws:sqs:*:*:faast-*"
|
56 | }
|
57 | ]
|
58 | });
|
59 | state = "creating policy";
|
60 | const executionPolicy = await (0, throttle_1.retryOp)(6, () => iam
|
61 | .createPolicy({
|
62 | Description: "test faast custom role policy",
|
63 | PolicyName: RoleName,
|
64 | PolicyDocument
|
65 | })
|
66 | .promise());
|
67 | state = "attaching role policy";
|
68 | PolicyArn = executionPolicy.Policy.Arn;
|
69 | await (0, throttle_1.retryOp)(6, () => iam.attachRolePolicy({ RoleName, PolicyArn: PolicyArn }).promise());
|
70 | await (0, shared_1.sleep)(30 * 1000);
|
71 | state = "creating faastAws with custom role";
|
72 | faastModule = await (0, index_1.faastAws)(funcs, {
|
73 | RoleName,
|
74 | gc: "off",
|
75 | description: t.title
|
76 | });
|
77 | state = "testing invocation";
|
78 | t.is(await faastModule.functions.identityString("hello"), "hello");
|
79 | state = "cleanup";
|
80 | }
|
81 | catch (err) {
|
82 | throw new error_1.FaastError(err, `Failed custom role test, last state: ${state}`);
|
83 | }
|
84 | finally {
|
85 | try {
|
86 | await faastModule?.cleanup();
|
87 | await (0, throttle_1.retryOp)(3, () => (0, aws_faast_1.deleteRole)(RoleName, iam));
|
88 | PolicyArn &&
|
89 | (await (0, throttle_1.retryOp)(3, () => iam.deletePolicy({ PolicyArn: PolicyArn }).promise()));
|
90 | }
|
91 | catch (err) {
|
92 | throw new error_1.FaastError(err, `Could not cleanup test role, last state: ${state}`);
|
93 | }
|
94 | }
|
95 | });
|
96 | ava_1.default.serial((0, util_1.title)("aws", "unit test ensureRole"), async (t) => {
|
97 | let role;
|
98 | t.plan(3);
|
99 | const RoleName = `faast-test-ensureRole-1-${(0, uuid_1.v4)()}`;
|
100 | try {
|
101 | const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
|
102 | role = await (0, aws_faast_1.ensureRole)(RoleName, services, true);
|
103 | t.truthy(role.Arn);
|
104 | const role2 = await (0, aws_faast_1.ensureRole)(RoleName, services, true);
|
105 | t.is(role.Arn, role2.Arn);
|
106 | }
|
107 | finally {
|
108 | const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
|
109 | await (0, aws_faast_1.deleteResources)({ RoleName }, services, () => { });
|
110 | const role3 = await services.iam
|
111 | .getRole({ RoleName })
|
112 | .promise()
|
113 | .catch(_ => { });
|
114 | t.true(role3 === undefined);
|
115 | }
|
116 | });
|
117 | ava_1.default.serial((0, util_1.title)("aws", "unit test missing role name"), async (t) => {
|
118 | const RoleName = `faast-test-ensureRole-2-${(0, uuid_1.v4)()}`;
|
119 | t.plan(1);
|
120 | const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
|
121 | try {
|
122 | await (0, aws_faast_1.ensureRole)(RoleName, services, false);
|
123 | }
|
124 | catch (err) {
|
125 | t.true(true);
|
126 | }
|
127 | });
|
128 | ava_1.default.serial((0, util_1.title)("aws", "race condition in role creation"), async (t) => {
|
129 | const RoleName = `faast-test-ensureRole-3-${(0, uuid_1.v4)()}`;
|
130 | t.plan(3);
|
131 | const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
|
132 | const promises = [];
|
133 | try {
|
134 | for (let i = 0; i < 3; i++) {
|
135 | promises.push((0, aws_faast_1.ensureRoleRaw)(RoleName, services, true));
|
136 | }
|
137 | const results = await Promise.all(promises);
|
138 | const Arn = results[0].Arn;
|
139 | results.forEach(role => t.is(role.Arn, Arn));
|
140 | }
|
141 | finally {
|
142 | await (0, aws_faast_1.deleteResources)({ RoleName }, services, () => { });
|
143 | }
|
144 | });
|
145 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXJvbGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvYXdzLXJvbGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUF1QjtBQUN2QixxQ0FBOEI7QUFDOUIsK0JBQW9DO0FBQ3BDLG9DQUFpRDtBQUNqRCxvREFNOEI7QUFDOUIsOENBQThDO0FBQzlDLDBDQUFzQztBQUN0QywwQ0FBd0M7QUFDeEMsd0NBQTBDO0FBQzFDLDhDQUEwQztBQUUxQzs7O0dBR0c7QUFDSCxhQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsWUFBSyxFQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBQSxTQUFNLEdBQUUsQ0FBQztJQUN0QixNQUFNLFFBQVEsR0FBRywwQkFBMEIsSUFBSSxFQUFFLENBQUM7SUFDbEQsSUFBSSxXQUFrRCxDQUFDO0lBQ3ZELElBQUksU0FBNkIsQ0FBQztJQUNsQyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUM7SUFDdEIsSUFBSTtRQUNBLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsWUFBWTtZQUNyQixTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFO29CQUM5QyxNQUFNLEVBQUUsZ0JBQWdCO29CQUN4QixNQUFNLEVBQUUsT0FBTztpQkFDbEI7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUNILEtBQUssR0FBRyxpQkFBaUIsUUFBUSxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFBLGtCQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUNsQixHQUFH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QyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDaEQ7WUFBUztRQUNOLE1BQU0sSUFBQSwyQkFBZSxFQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzNEO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGVzdCBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyBJQU0gfSBmcm9tIFwiYXdzLXNka1wiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGZhYXN0QXdzLCBGYWFzdE1vZHVsZSB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHtcbiAgICBkZWxldGVSb2xlLFxuICAgIGVuc3VyZVJvbGUsXG4gICAgY3JlYXRlQXdzQXBpcyxcbiAgICBkZWxldGVSZXNvdXJjZXMsXG4gICAgZW5zdXJlUm9sZVJhd1xufSBmcm9tIFwiLi4vc3JjL2F3cy9hd3MtZmFhc3RcIjtcbmltcG9ydCAqIGFzIGZ1bmNzIGZyb20gXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi4vc3JjL3NoYXJlZFwiO1xuaW1wb3J0IHsgdGl0bGUgfSBmcm9tIFwiLi9maXh0dXJlcy91dGlsXCI7XG5pbXBvcnQgeyBGYWFzdEVycm9yIH0gZnJvbSBcIi4uL3NyYy9lcnJvclwiO1xuaW1wb3J0IHsgcmV0cnlPcCB9IGZyb20gXCIuLi9zcmMvdGhyb3R0bGVcIjtcblxuLyoqXG4gKiBUaGUgcG9saWNpZXMgdGVzdGVkIGhlcmUgc2hvdWxkIG1hdGNoIHRob3NlIGluIHRoZSBkb2N1bWVudGF0aW9uIGF0XG4gKiB7QGxpbmsgQXdzT3B0aW9ucy5Sb2xlTmFtZX0uXG4gKi9cbnRlc3Quc2VyaWFsKHRpdGxlKFwiYXdzXCIsIFwiY3VzdG9tIHJvbGVcIiksIGFzeW5jIHQgPT4ge1xuICAgIHQucGxhbigxKTtcbiAgICBjb25zdCBpYW0gPSBuZXcgSUFNKCk7XG4gICAgY29uc3QgdXVpZCA9IHV1aWR2NCgpO1xuICAgIGNvbnN0IFJvbGVOYW1lID0gYGZhYXN0LXRlc3QtY3VzdG9tLXJvbGUtJHt1dWlkfWA7XG4gICAgbGV0IGZhYXN0TW9kdWxlOiBGYWFzdE1vZHVsZTx0eXBlb2YgZnVuY3M+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBQb2xpY3lBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RhdGUgPSBcImluaXRpYWxcIjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIixcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6IFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiB9LFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0OiBcIkFsbG93XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZSA9IGBjcmVhdGluZyByb2xlICR7Um9sZU5hbWV9YDtcbiAgICAgICAgYXdhaXQgcmV0cnlPcCg2LCAoKSA9PlxuICAgICAgICAgICAgaWFtXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVJvbGUoe1xuICAgICAgICAgICAgICAgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFJvbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogXCJ0ZXN0IGN1c3RvbSByb2xlIGZvciBsYW1iZGEgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgZmFhc3RcIlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnByb21pc2UoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IFBvbGljeURvY3VtZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgVmVyc2lvbjogXCIyMDEyLTEwLTE3XCIsXG4gICAgICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFtcImxvZ3M6KlwiXSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFwiYXJuOmF3czpsb2dzOio6Kjpsb2ctZ3JvdXA6ZmFhc3QtKlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFtcInNxczoqXCJdLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZTogXCJhcm46YXdzOnNxczoqOio6ZmFhc3QtKlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0ZSA9IFwiY3JlYXRpbmcgcG9saWN5XCI7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvblBvbGljeSA9IGF3YWl0IHJldHJ5T3AoNiwgKCkgPT5cbiAgICAgICAgICAgIGlhbVxuICAgICAgICAgICAgICAgIC5jcmVhdGVQb2xpY3koe1xuICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogXCJ0ZXN0IGZhYXN0IGN1c3RvbSByb2xlIHBvbGljeVwiLFxuICAgICAgICAgICAgICAgICAgICBQb2xpY3lOYW1lOiBSb2xlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgUG9saWN5RG9jdW1lbnRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5wcm9taXNlKClcbiAgICAgICAgKTtcblxuICAgICAgICBzdGF0ZSA9IFwiYXR0YWNoaW5nIHJvbGUgcG9saWN5XCI7XG4gICAgICAgIFBvbGljeUFybiA9IGV4ZWN1dGlvblBvbGljeS5Qb2xpY3khLkFybiE7XG4gICAgICAgIGF3YWl0IHJldHJ5T3AoNiwgKCkgPT5cbiAgICAgICAgICAgIGlhbS5hdHRhY2hSb2xlUG9saWN5KHsgUm9sZU5hbWUsIFBvbGljeUFybjogUG9saWN5QXJuISB9KS5wcm9taXNlKClcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCBzbGVlcCgzMCAqIDEwMDApO1xuXG4gICAgICAgIHN0YXRlID0gXCJjcmVhdGluZyBmYWFzdEF3cyB3aXRoIGN1c3RvbSByb2xlXCI7XG4gICAgICAgIGZhYXN0TW9kdWxlID0gYXdhaXQgZmFhc3RBd3MoZnVuY3MsIHtcbiAgICAgICAgICAgIFJvbGVOYW1lLFxuICAgICAgICAgICAgZ2M6IFwib2ZmXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdC50aXRsZVxuICAgICAgICB9KTtcblxuICAgICAgICBzdGF0ZSA9IFwidGVzdGluZyBpbnZvY2F0aW9uXCI7XG4gICAgICAgIHQuaXMoYXdhaXQgZmFhc3RNb2R1bGUuZnVuY3Rpb25zLmlkZW50aXR5U3RyaW5nKFwiaGVsbG9cIiksIFwiaGVsbG9cIik7XG4gICAgICAgIHN0YXRlID0gXCJjbGVhbnVwXCI7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZhYXN0RXJyb3IoZXJyLCBgRmFpbGVkIGN1c3RvbSByb2xlIHRlc3QsIGxhc3Qgc3RhdGU6ICR7c3RhdGV9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZhYXN0TW9kdWxlPy5jbGVhbnVwKCk7XG4gICAgICAgICAgICBhd2FpdCByZXRyeU9wKDMsICgpID0+IGRlbGV0ZVJvbGUoUm9sZU5hbWUsIGlhbSkpO1xuICAgICAgICAgICAgUG9saWN5QXJuICYmXG4gICAgICAgICAgICAgICAgKGF3YWl0IHJldHJ5T3AoMywgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaWFtLmRlbGV0ZVBvbGljeSh7IFBvbGljeUFybjogUG9saWN5QXJuISB9KS5wcm9taXNlKClcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICBgQ291bGQgbm90IGNsZWFudXAgdGVzdCByb2xlLCBsYXN0IHN0YXRlOiAke3N0YXRlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxudGVzdC5zZXJpYWwodGl0bGUoXCJhd3NcIiwgXCJ1bml0IHRlc3QgZW5zdXJlUm9sZVwiKSwgYXN5bmMgdCA9PiB7XG4gICAgbGV0IHJvbGU6IElBTS5Sb2xlIHwgdW5kZWZpbmVkO1xuICAgIHQucGxhbigzKTtcbiAgICBjb25zdCBSb2xlTmFtZSA9IGBmYWFzdC10ZXN0LWVuc3VyZVJvbGUtMS0ke3V1aWR2NCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCBjcmVhdGVBd3NBcGlzKFwidXMtd2VzdC0yXCIpO1xuICAgICAgICByb2xlID0gYXdhaXQgZW5zdXJlUm9sZShSb2xlTmFtZSwgc2VydmljZXMsIHRydWUpO1xuICAgICAgICB0LnRydXRoeShyb2xlLkFybik7XG4gICAgICAgIGNvbnN0IHJvbGUyID0gYXdhaXQgZW5zdXJlUm9sZShSb2xlTmFtZSwgc2VydmljZXMsIHRydWUpO1xuICAgICAgICB0LmlzKHJvbGUuQXJuLCByb2xlMi5Bcm4pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgY3JlYXRlQXdzQXBpcyhcInVzLXdlc3QtMlwiKTtcbiAgICAgICAgYXdhaXQgZGVsZXRlUmVzb3VyY2VzKHsgUm9sZU5hbWUgfSwgc2VydmljZXMsICgpID0+IHt9KTtcbiAgICAgICAgY29uc3Qgcm9sZTMgPSBhd2FpdCBzZXJ2aWNlcy5pYW1cbiAgICAgICAgICAgIC5nZXRSb2xlKHsgUm9sZU5hbWUgfSlcbiAgICAgICAgICAgIC5wcm9taXNlKClcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHt9KTtcbiAgICAgICAgdC50cnVlKHJvbGUzID09PSB1bmRlZmluZWQpO1xuICAgIH1cbn0pO1xuXG50ZXN0LnNlcmlhbCh0aXRsZShcImF3c1wiLCBcInVuaXQgdGVzdCBtaXNzaW5nIHJvbGUgbmFtZVwiKSwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgUm9sZU5hbWUgPSBgZmFhc3QtdGVzdC1lbnN1cmVSb2xlLTItJHt1dWlkdjQoKX1gO1xuICAgIHQucGxhbigxKTtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IGF3YWl0IGNyZWF0ZUF3c0FwaXMoXCJ1cy13ZXN0LTJcIik7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW5zdXJlUm9sZShSb2xlTmFtZSwgc2VydmljZXMsIGZhbHNlKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICB0LnRydWUodHJ1ZSk7XG4gICAgfVxufSk7XG5cbnRlc3Quc2VyaWFsKHRpdGxlKFwiYXdzXCIsIFwicmFjZSBjb25kaXRpb24gaW4gcm9sZSBjcmVhdGlvblwiKSwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgUm9sZU5hbWUgPSBgZmFhc3QtdGVzdC1lbnN1cmVSb2xlLTMtJHt1dWlkdjQoKX1gO1xuICAgIHQucGxhbigzKTtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IGF3YWl0IGNyZWF0ZUF3c0FwaXMoXCJ1cy13ZXN0LTJcIik7XG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8SUFNLlJvbGU+W10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChlbnN1cmVSb2xlUmF3KFJvbGVOYW1lLCBzZXJ2aWNlcywgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IEFybiA9IHJlc3VsdHNbMF0uQXJuO1xuICAgICAgICByZXN1bHRzLmZvckVhY2gocm9sZSA9PiB0LmlzKHJvbGUuQXJuLCBBcm4pKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBkZWxldGVSZXNvdXJjZXMoeyBSb2xlTmFtZSB9LCBzZXJ2aWNlcywgKCkgPT4ge30pO1xuICAgIH1cbn0pO1xuIl19 |
\ | No newline at end of file |