@cdklabs/cdk-appmod-catalog-blueprints 1.10.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.jsii +1276 -211
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  3. package/lib/document-processing/agentic-document-processing.js +2 -2
  4. package/lib/document-processing/base-document-processing.js +1 -1
  5. package/lib/document-processing/bedrock-document-processing.js +1 -1
  6. package/lib/document-processing/default-document-processing-config.js +1 -1
  7. package/lib/framework/agents/base-agent.d.ts +15 -2
  8. package/lib/framework/agents/base-agent.js +3 -3
  9. package/lib/framework/agents/batch-agent.d.ts +1 -1
  10. package/lib/framework/agents/batch-agent.js +2 -2
  11. package/lib/framework/agents/default-agent-config.js +1 -1
  12. package/lib/framework/agents/interactive-agent.d.ts +286 -3
  13. package/lib/framework/agents/interactive-agent.js +412 -123
  14. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +1 -1
  15. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +1 -1
  16. package/lib/framework/agents/resources/agentcore-agent-handler/Dockerfile +20 -0
  17. package/lib/framework/agents/resources/agentcore-agent-handler/main.py +224 -0
  18. package/lib/framework/agents/resources/agentcore-agent-handler/requirements.txt +5 -0
  19. package/lib/framework/agents/resources/interactive-agent-handler/index.py +16 -93
  20. package/lib/framework/agents/resources/interactive-agent-handler/test_handler.py +214 -413
  21. package/lib/framework/bedrock/bedrock.js +1 -1
  22. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  23. package/lib/framework/foundation/access-log.js +1 -1
  24. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  25. package/lib/framework/foundation/network.js +1 -1
  26. package/lib/framework/tests/interactive-agent-nag.test.js +56 -1
  27. package/lib/framework/tests/interactive-agent.test.js +257 -11
  28. package/lib/tsconfig.tsbuildinfo +1 -1
  29. package/lib/utilities/data-loader.js +1 -1
  30. package/lib/utilities/lambda-iam-utils.js +1 -1
  31. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  32. package/lib/utilities/observability/cloudwatch-transaction-search.js +1 -1
  33. package/lib/utilities/observability/default-observability-config.js +1 -1
  34. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  35. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  36. package/lib/utilities/observability/powertools-config.js +1 -1
  37. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  38. package/lib/webapp/frontend-construct.js +1 -1
  39. package/package.json +2 -2
@@ -189,7 +189,7 @@ describe('InteractiveAgent', () => {
189
189
  },
190
190
  });
191
191
  });
192
- test('Lambda function has context strategy env vars', () => {
192
+ test('Lambda function does not have deprecated context strategy env vars', () => {
193
193
  new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
194
194
  agentName: 'TestAgent',
195
195
  agentDefinition: {
@@ -198,15 +198,12 @@ describe('InteractiveAgent', () => {
198
198
  },
199
199
  });
200
200
  const template = assertions_1.Template.fromStack(stack);
201
- template.hasResourceProperties('AWS::Lambda::Function', {
202
- Environment: {
203
- Variables: assertions_1.Match.objectLike({
204
- CONTEXT_ENABLED: 'true',
205
- CONTEXT_STRATEGY: 'SlidingWindow',
206
- CONTEXT_WINDOW_SIZE: '20',
207
- }),
208
- },
209
- });
201
+ const functions = template.findResources('AWS::Lambda::Function');
202
+ const fn = Object.values(functions).find((f) => f.Properties?.FunctionName?.includes('TestAgent'));
203
+ // Context env vars should no longer be set (handled by Strands-native handler)
204
+ expect(fn.Properties.Environment.Variables.CONTEXT_ENABLED).toBeUndefined();
205
+ expect(fn.Properties.Environment.Variables.CONTEXT_STRATEGY).toBeUndefined();
206
+ expect(fn.Properties.Environment.Variables.CONTEXT_WINDOW_SIZE).toBeUndefined();
210
207
  });
211
208
  test('Lambda function has session bucket env var', () => {
212
209
  new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
@@ -837,4 +834,253 @@ describe('InteractiveAgent Knowledge Base Integration', () => {
837
834
  expect(fn.Properties.Environment.Variables.KNOWLEDGE_BASE_SYSTEM_PROMPT_ADDITION).toBeUndefined();
838
835
  });
839
836
  });
840
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9mcmFtZXdvcmsvdGVzdHMvaW50ZXJhY3RpdmUtYWdlbnQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3Qiw2Q0FBbUQ7QUFDbkQsdURBQXlEO0FBQ3pELHlEQUFvRTtBQUNwRSx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLDZEQUFrRDtBQUNsRCwyREFBMkQ7QUFDM0QsbUVBUXFDO0FBQ3JDLDZEQUFnRTtBQUVoRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksR0FBUSxDQUFDO0lBQ2IsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxZQUFtQixDQUFDO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLHVDQUF5QixDQUFDLHVDQUF1QyxDQUFDO0lBRXBGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsSUFBQSwwQkFBYSxHQUFFLENBQUM7UUFDdEIsS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO1lBQ2xDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtTQUN0RCxDQUFDLENBQUM7UUFDSCxZQUFZLEdBQUcsSUFBSSxxQkFBSyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUU7WUFDOUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO1NBQ2pGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksb0NBQWdCLENBQUMsS0FBSyxFQUFFLE9B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Q0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1FBQzNELElBQUksb0NBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUNuQyxTQUFTLEVBQUUsV0FBVztZQUN0QixlQUFlLEVBQUU7Z0JBQ2YsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtnQkFDdEMsWUFBWTthQUNiO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDbEQsQ0FBQyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUMzQyxDQUFDO1FBRVQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwRyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFwcCwgU3RhY2ssIER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2snO1xuaW1wb3J0IHsgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgY3JlYXRlVGVzdEFwcCB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy90ZXN0LXV0aWxzJztcbmltcG9ydCB7XG4gIEludGVyYWN0aXZlQWdlbnQsXG4gIFN0cmVhbWluZ0h0dHBBZGFwdGVyLFxuICBTM1Nlc3Npb25NYW5hZ2VyLFxuICBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcixcbiAgTnVsbENvbnZlcnNhdGlvbk1hbmFnZXIsXG4gIENvZ25pdG9BdXRoZW50aWNhdG9yLFxuICBOb0F1dGhlbnRpY2F0b3IsXG59IGZyb20gJy4uL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudCc7XG5pbXBvcnQgeyBCZWRyb2NrS25vd2xlZGdlQmFzZSB9IGZyb20gJy4uL2FnZW50cy9rbm93bGVkZ2UtYmFzZSc7XG5cbmRlc2NyaWJlKCdJbnRlcmFjdGl2ZUFnZW50JywgKCkgPT4ge1xuICBsZXQgYXBwOiBBcHA7XG4gIGxldCBzdGFjazogU3RhY2s7XG4gIGxldCBzeXN0ZW1Qcm9tcHQ6IEFzc2V0O1xuICBjb25zdCB0ZXN0TW9kZWwgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19TT05ORVRfMjAyNDAyMjlfVjFfMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gICAgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHN0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEZWZhdWx0IENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyB3aXRoIG1pbmltYWwgcHJvcHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYWdlbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoYWdlbnQuYWdlbnRGdW5jdGlvbikudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChhZ2VudC5hcGlFbmRwb2ludCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2RlZmF1bHQgYWRhcHRlciBpcyBTdHJlYW1pbmdIdHRwQWRhcHRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChhZ2VudC5hZGFwdGVyKS50b0JlSW5zdGFuY2VPZihTdHJlYW1pbmdIdHRwQWRhcHRlcik7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdkZWZhdWx0IHNlc3Npb24gc3RvcmUgaXMgUzNTZXNzaW9uTWFuYWdlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChhZ2VudC5zZXNzaW9uU3RvcmUpLnRvQmVJbnN0YW5jZU9mKFMzU2Vzc2lvbk1hbmFnZXIpO1xuICAgICAgZXhwZWN0KGFnZW50LnNlc3Npb25CdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdkZWZhdWx0IGNvbnRleHQgc3RyYXRlZ3kgaXMgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYWdlbnQuY29udGV4dFN0cmF0ZWd5KS50b0JlSW5zdGFuY2VPZihTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcik7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdkZWZhdWx0IGF1dGhlbnRpY2F0b3IgaXMgQ29nbml0b0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYWdlbnQuYXV0aGVudGljYXRvcikudG9CZUluc3RhbmNlT2YoQ29nbml0b0F1dGhlbnRpY2F0b3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTGFtYmRhIEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBMYW1iZGEgZnVuY3Rpb24gd2l0aCBkZWZhdWx0IDE1LW1pbnV0ZSB0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBUaW1lb3V0OiA5MDAsIC8vIDE1IG1pbnV0ZXNcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBMYW1iZGEgZnVuY3Rpb24gd2l0aCBkZWZhdWx0IDEwMjQgTUIgbWVtb3J5JywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBNZW1vcnlTaXplOiAxMDI0LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdMYW1iZGEgZnVuY3Rpb24gaGFzIExhbWJkYSBXZWIgQWRhcHRlciBsYXllcicsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgTGF5ZXJzOiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6NzUzMjQwNTk4MDc1OmxheWVyOkxhbWJkYUFkYXB0ZXJMYXllclg4NjoyNScsXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdMYW1iZGEgZnVuY3Rpb24gaGFzIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSIGVudiB2YXIgZm9yIExXQScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVI6ICcvb3B0L2Jvb3RzdHJhcCcsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBoYXMgQVdTX0xXQV9JTlZPS0VfTU9ERSBlbnYgdmFyJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBBV1NfTFdBX0lOVk9LRV9NT0RFOiAncmVzcG9uc2Vfc3RyZWFtJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnTGFtYmRhIGZ1bmN0aW9uIGhhcyBQT1JUIGVudiB2YXIgc2V0IHRvIDgwODAnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgICAgVmFyaWFibGVzOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIFBPUlQ6ICc4MDgwJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnTGFtYmRhIGZ1bmN0aW9uIGhhcyBNT0RFTF9JRCBlbnYgdmFyJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBNT0RFTF9JRDogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnTGFtYmRhIGZ1bmN0aW9uIGhhcyBjb250ZXh0IHN0cmF0ZWd5IGVudiB2YXJzJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBDT05URVhUX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdTbGlkaW5nV2luZG93JyxcbiAgICAgICAgICAgIENPTlRFWFRfV0lORE9XX1NJWkU6ICcyMCcsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBoYXMgc2Vzc2lvbiBidWNrZXQgZW52IHZhcicsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgU0VTU0lPTl9CVUNLRVQ6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2N1c3RvbSB0aW1lb3V0IGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBUaW1lb3V0OiA2MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2N1c3RvbSBtZW1vcnlTaXplIGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW9yeVNpemU6IDIwNDgsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIE1lbW9yeVNpemU6IDIwNDgsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JFU1QgQVBJIENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBSRVNUIEFQSSByZXNvdXJjZScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaScsIDEpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyAvY2hhdCByZXNvdXJjZScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2UnLCB7XG4gICAgICAgIFBhdGhQYXJ0OiAnY2hhdCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgUE9TVCBtZXRob2Qgb24gL2NoYXQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdQT1NUIG1ldGhvZCBoYXMgQ29nbml0byBhdXRob3JpemVyIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgLy8gVmVyaWZ5IENvZ25pdG8gYXV0aG9yaXplciBleGlzdHNcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcGlHYXRld2F5OjpBdXRob3JpemVyJywge1xuICAgICAgICBUeXBlOiAnQ09HTklUT19VU0VSX1BPT0xTJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnUE9TVCBtZXRob2QgaGFzIG5vIGF1dGhvcml6ZXIgd2l0aCBOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGhlbnRpY2F0b3I6IG5ldyBOb0F1dGhlbnRpY2F0b3IoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICAvLyBTaG91bGQgaGF2ZSBQT1NUIG1ldGhvZCB3aXRoIE5PTkUgYXV0aFxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBBdXRob3JpemF0aW9uVHlwZTogJ05PTkUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdSRVNUIEFQSSBoYXMgQ09SUyBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIC8vIE9QVElPTlMgbWV0aG9kIGZvciBDT1JTIHByZWZsaWdodFxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ09QVElPTlMnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXNzaW9uIE1hbmFnZW1lbnQnLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBTMyBzZXNzaW9uIGJ1Y2tldCB3aXRoIEtNUyBlbmNyeXB0aW9uIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICAgIEJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBTU0VBbGdvcml0aG06ICdhd3M6a21zJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZXNzaW9uIGJ1Y2tldCBoYXMgbGlmZWN5Y2xlIHJ1bGUnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICAgIExpZmVjeWNsZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBSdWxlczogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgICBTdGF0dXM6ICdFbmFibGVkJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjdXN0b20gc2Vzc2lvbiBidWNrZXQgaXMgdXNlZCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tQnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0N1c3RvbUJ1Y2tldCcpO1xuXG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgICAgc2Vzc2lvbkJ1Y2tldDogY3VzdG9tQnVja2V0LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChhZ2VudC5zZXNzaW9uQnVja2V0KS50b0JlKGN1c3RvbUJ1Y2tldCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdGF0ZWxlc3MgbW9kZSBjcmVhdGVzIG5vIHNlc3Npb24gYnVja2V0IHdoZW4gc2Vzc2lvblN0b3JlIGlzIGV4cGxpY2l0bHkgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgLy8gV2hlbiBzZXNzaW9uU3RvcmUgaXMgbm90IHByb3ZpZGVkIGF0IGFsbCwgZGVmYXVsdCBTM1Nlc3Npb25NYW5hZ2VyIGlzIGNyZWF0ZWQuXG4gICAgICAvLyBUbyBnbyB0cnVseSBzdGF0ZWxlc3MsIHVzZXIgbXVzdCBwYXNzIGEgY3VzdG9tIElTZXNzaW9uU3RvcmUgd2l0aCBubyBidWNrZXQuXG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZWZhdWx0IGNyZWF0ZXMgYSBzZXNzaW9uIHN0b3JlXG4gICAgICBleHBlY3QoYWdlbnQuc2Vzc2lvblN0b3JlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29nbml0byBBdXRoZW50aWNhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIENvZ25pdG8gVXNlciBQb29sIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sJywgMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIENvZ25pdG8gVXNlciBQb29sIENsaWVudCBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIDEpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnbm8gQ29nbml0byByZXNvdXJjZXMgd2l0aCBOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGhlbnRpY2F0b3I6IG5ldyBOb0F1dGhlbnRpY2F0b3IoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q29nbml0bzo6VXNlclBvb2wnLCAwKTtcbiAgICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUHJvcHMgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIGVtcHR5IGFnZW50TmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnJyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgndGhyb3dzIGVycm9yIGZvciB3aGl0ZXNwYWNlLW9ubHkgYWdlbnROYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICcgICAnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdhZ2VudE5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lbW9yeVNpemUgdG9vIGxvdycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtb3J5U2l6ZTogNjQsXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnbWVtb3J5U2l6ZSBtdXN0IGJlIGJldHdlZW4gMTI4IGFuZCAxMDI0MCBNQicpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgndGhyb3dzIGVycm9yIGZvciBtZW1vcnlTaXplIHRvbyBoaWdoJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1vcnlTaXplOiAyMDQ4MCxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIHRpbWVvdXQgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRvVGhyb3coJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIHRpbWVvdXQgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMjApLFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRvVGhyb3coJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lc3NhZ2VIaXN0b3J5TGltaXQgdG9vIGxvdycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZUhpc3RvcnlMaW1pdDogMCxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdtZXNzYWdlSGlzdG9yeUxpbWl0IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAwJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lc3NhZ2VIaXN0b3J5TGltaXQgdG9vIGhpZ2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2VIaXN0b3J5TGltaXQ6IDIwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnbWVzc2FnZUhpc3RvcnlMaW1pdCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnYWNjZXB0cyB2YWxpZCBib3VuZGFyeSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50MScsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQxJyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMSksXG4gICAgICAgICAgbWVzc2FnZUhpc3RvcnlMaW1pdDogMSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudDInLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50MicsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbW9yeVNpemU6IDEwMjQwLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICAgIG1lc3NhZ2VIaXN0b3J5TGltaXQ6IDEwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NESyBTeW50aCcsICgpID0+IHtcbiAgICB0ZXN0KCdzeW50aGVzaXplcyB3aXRob3V0IGVycm9ycycsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBhcHAuc3ludGgoKTtcbiAgICAgIH0pLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIEtNUyBrZXkgd2l0aCByb3RhdGlvbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIGNvbnN0IGtleXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKCdBV1M6OktNUzo6S2V5Jyk7XG4gICAgICBjb25zdCBoYXNSb3RhdGlvbiA9IE9iamVjdC52YWx1ZXMoa2V5cykuc29tZShcbiAgICAgICAgKGtleTogYW55KSA9PiBrZXkuUHJvcGVydGllcy5FbmFibGVLZXlSb3RhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgICk7XG4gICAgICBleHBlY3QoaGFzUm90YXRpb24pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIElBTSByb2xlIHdpdGggTGFtYmRhIHNlcnZpY2UgcHJpbmNpcGFsJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIGNvbnN0IHJvbGVzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpJQU06OlJvbGUnKTtcbiAgICAgIGNvbnN0IGFnZW50Um9sZSA9IE9iamVjdC52YWx1ZXMocm9sZXMpLmZpbmQoKHJvbGU6IGFueSkgPT5cbiAgICAgICAgcm9sZS5Qcm9wZXJ0aWVzLkFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQuc29tZShcbiAgICAgICAgICAoc3RtdDogYW55KSA9PiBzdG10LlByaW5jaXBhbD8uU2VydmljZSA9PT0gJ2xhbWJkYS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QoYWdlbnRSb2xlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdTdHJlYW1pbmdIdHRwQWRhcHRlcicsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgbW9ja0xhbWJkYTogRnVuY3Rpb247XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgIH0pO1xuICAgIG1vY2tMYW1iZGEgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNb2NrTGFtYmRhJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgc3RhdHVzQ29kZTogMjAwIH0pOycpLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdpbXBsZW1lbnRzIElDb21tdW5pY2F0aW9uQWRhcHRlciBpbnRlcmZhY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpO1xuICAgIGV4cGVjdCh0eXBlb2YgYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYWRhcHRlci5ncmFudEludm9rZSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIHdpdGggY3VzdG9tIHN0YWdlTmFtZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHsgc3RhZ2VOYW1lOiAnZGV2JyB9KSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyB3aXRoIHRocm90dGxlIHNldHRpbmdzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoe1xuICAgICAgdGhyb3R0bGU6IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9LFxuICAgIH0pKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3Mgd2hlbiBhdHRhY2hUb0Z1bmN0aW9uIGNhbGxlZCB3aXRob3V0IHNjb3BlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoKTtcbiAgICBleHBlY3QoKCkgPT4gYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKG1vY2tMYW1iZGEpKS50b1Rocm93KFxuICAgICAgJ1N0cmVhbWluZ0h0dHBBZGFwdGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHNjb3BlIGJlZm9yZSBjYWxsaW5nIGF0dGFjaFRvRnVuY3Rpb24nLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2F0dGFjaFRvRnVuY3Rpb24gcmV0dXJucyBlbmRwb2ludCBVUkwnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpO1xuICAgIGFkYXB0ZXIuX3NldFNjb3BlKHN0YWNrKTtcbiAgICBjb25zdCB1cmwgPSBhZGFwdGVyLmF0dGFjaFRvRnVuY3Rpb24obW9ja0xhbWJkYSk7XG4gICAgZXhwZWN0KHVybCkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QodHlwZW9mIHVybCkudG9CZSgnc3RyaW5nJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyYW50SW52b2tlIGRvZXMgbm90IHRocm93JywgKCkgPT4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoKTtcbiAgICBhZGFwdGVyLl9zZXRTY29wZShzdGFjayk7XG4gICAgYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKG1vY2tMYW1iZGEpO1xuICAgIGV4cGVjdCgoKSA9PiBhZGFwdGVyLmdyYW50SW52b2tlKG1vY2tMYW1iZGEpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdTM1Nlc3Npb25NYW5hZ2VyJywgKCkgPT4ge1xuICB0ZXN0KCdpbXBsZW1lbnRzIElTZXNzaW9uU3RvcmUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcihzdGFjaywgJ1NNJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBtYW5hZ2VyLmdyYW50UmVhZFdyaXRlKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdChtYW5hZ2VyLnNlc3Npb25CdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYnVja2V0IHdpdGggS01TIGVuY3J5cHRpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHN0YWNrLCAnU00nKTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICBCdWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGN1c3RvbSBidWNrZXQgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJyk7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0N1c3RvbUJ1Y2tldCcpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcihzdGFjaywgJ1NNJywgeyBidWNrZXQgfSk7XG4gICAgZXhwZWN0KG1hbmFnZXIuYnVja2V0KS50b0JlKGJ1Y2tldCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlZmF1bHQgVFRMIGlzIDI0IGhvdXJzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIoc3RhY2ssICdTTScpO1xuICAgIGV4cGVjdChtYW5hZ2VyLnNlc3Npb25UVEwudG9Ib3VycygpKS50b0JlKDI0KTtcbiAgfSk7XG5cbiAgdGVzdCgnY3VzdG9tIFRUTCBpcyBhcHBsaWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIoc3RhY2ssICdTTScsIHtcbiAgICAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmhvdXJzKDQ4KSxcbiAgICB9KTtcbiAgICBleHBlY3QobWFuYWdlci5zZXNzaW9uVFRMLnRvSG91cnMoKSkudG9CZSg0OCk7XG4gIH0pO1xufSk7XG5cblxuZGVzY3JpYmUoJ1NsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyJywgKCkgPT4ge1xuICB0ZXN0KCdkZWZhdWx0IHdpbmRvdyBzaXplIGlzIDIwJywgKCkgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoKTtcbiAgICBleHBlY3QobWFuYWdlci53aW5kb3dTaXplKS50b0JlKDIwKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3VzdG9tIHdpbmRvdyBzaXplIGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDUwIH0pO1xuICAgIGV4cGVjdChtYW5hZ2VyLndpbmRvd1NpemUpLnRvQmUoNTApO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3MgZm9yIHdpbmRvdyBzaXplIGJlbG93IDEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDAgfSkpLnRvVGhyb3coXG4gICAgICAnd2luZG93U2l6ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcsXG4gICAgKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhyb3dzIGZvciB3aW5kb3cgc2l6ZSBhYm92ZSAxMDAwJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoeyB3aW5kb3dTaXplOiAxMDAxIH0pKS50b1Rocm93KFxuICAgICAgJ3dpbmRvd1NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDMwIH0pO1xuICAgIGNvbnN0IGVudiA9IG1hbmFnZXIuZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ1NsaWRpbmdXaW5kb3cnLFxuICAgICAgQ09OVEVYVF9XSU5ET1dfU0laRTogJzMwJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG5kZXNjcmliZSgnTnVsbENvbnZlcnNhdGlvbk1hbmFnZXInLCAoKSA9PiB7XG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBOdWxsQ29udmVyc2F0aW9uTWFuYWdlcigpO1xuICAgIGNvbnN0IGVudiA9IG1hbmFnZXIuZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ2ZhbHNlJyxcbiAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdOdWxsJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG5kZXNjcmliZSgnQ29nbml0b0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gIGxldCBhcHA6IEFwcDtcbiAgbGV0IHN0YWNrOiBTdGFjaztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgd2l0aCBkZWZhdWx0IHByb3BzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0U2NvcGUgY3JlYXRlcyBVc2VyIFBvb2wgYW5kIENsaWVudCcsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgYXV0aC5fc2V0U2NvcGUoc3RhY2spO1xuICAgIGV4cGVjdChhdXRoLnVzZXJQb29sKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChhdXRoLnVzZXJQb29sQ2xpZW50KS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3Mgd2hlbiBncmFudEF1dGhlbnRpY2F0ZSBjYWxsZWQgd2l0aG91dCBzY29wZScsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgY29uc3QgbW9ja0xhbWJkYSA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ01vY2tMYW1iZGEnLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoe30pOycpLFxuICAgIH0pO1xuICAgIGV4cGVjdCgoKSA9PiBhdXRoLmdyYW50QXV0aGVudGljYXRlKG1vY2tMYW1iZGEpKS50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXV0aCA9IG5ldyBDb2duaXRvQXV0aGVudGljYXRvcigpO1xuICAgIGNvbnN0IGVudiA9IGF1dGguZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52LkFVVEhfVFlQRSkudG9CZSgnQ29nbml0bycpO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gIHRlc3QoJ2dyYW50QXV0aGVudGljYXRlIGlzIG5vLW9wJywgKCkgPT4ge1xuICAgIGNvbnN0IGF1dGggPSBuZXcgTm9BdXRoZW50aWNhdG9yKCk7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IG1vY2tMYW1iZGEgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNb2NrTGFtYmRhJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHt9KTsnKSxcbiAgICB9KTtcbiAgICBleHBlY3QoKCkgPT4gYXV0aC5ncmFudEF1dGhlbnRpY2F0ZShtb2NrTGFtYmRhKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgncmV0dXJucyBjb3JyZWN0IGVudmlyb25tZW50IHZhcmlhYmxlcycsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IE5vQXV0aGVudGljYXRvcigpO1xuICAgIGNvbnN0IGVudiA9IGF1dGguZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHsgQVVUSF9UWVBFOiAnTm9uZScgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbnRlcmFjdGl2ZUFnZW50IEtub3dsZWRnZSBCYXNlIEludGVncmF0aW9uJywgKCkgPT4ge1xuICBsZXQgYXBwOiBBcHA7XG4gIGxldCBzdGFjazogU3RhY2s7XG4gIGxldCBzeXN0ZW1Qcm9tcHQ6IEFzc2V0O1xuICBjb25zdCB0ZXN0TW9kZWwgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19TT05ORVRfMjAyNDAyMjlfVjFfMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gICAgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHN0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NldHMgS05PV0xFREdFX0JBU0VTX0NPTkZJRyB3aGVuIEtCcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGtiID0gbmV3IEJlZHJvY2tLbm93bGVkZ2VCYXNlKHN0YWNrLCAnVGVzdEtCJywge1xuICAgICAgbmFtZTogJ3Rlc3Qta2InLFxuICAgICAgZGVzY3JpcHRpb246ICdUZXN0IGtub3dsZWRnZSBiYXNlJyxcbiAgICAgIGtub3dsZWRnZUJhc2VJZDogJ0tCMTIzNDU2JyxcbiAgICB9KTtcblxuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIGtub3dsZWRnZUJhc2VzOiBba2JdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgS05PV0xFREdFX0JBU0VTX0NPTkZJRzogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICBLTk9XTEVER0VfQkFTRV9TWVNURU1fUFJPTVBUX0FERElUSU9OOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RvZXMgbm90IHNldCBLQiBlbnYgdmFycyB3aGVuIG5vIEtCcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpO1xuICAgIGNvbnN0IGZuID0gT2JqZWN0LnZhbHVlcyhmdW5jdGlvbnMpLmZpbmQoKGY6IGFueSkgPT5cbiAgICAgIGYuUHJvcGVydGllcz8uRnVuY3Rpb25OYW1lPy5pbmNsdWRlcygnVGVzdEFnZW50JyksXG4gICAgKSBhcyBhbnk7XG5cbiAgICBleHBlY3QoZm4uUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXMuS05PV0xFREdFX0JBU0VTX0NPTkZJRykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChmbi5Qcm9wZXJ0aWVzLkVudmlyb25tZW50LlZhcmlhYmxlcy5LTk9XTEVER0VfQkFTRV9TWVNURU1fUFJPTVBUX0FERElUSU9OKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
837
+ describe('LambdaHostingAdapter', () => {
838
+ let app;
839
+ let stack;
840
+ let systemPrompt;
841
+ const testModel = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_SONNET_20240229_V1_0;
842
+ beforeEach(() => {
843
+ app = (0, test_utils_1.createTestApp)();
844
+ stack = new aws_cdk_lib_1.Stack(app, 'TestStack', {
845
+ env: { account: '123456789012', region: 'us-east-1' },
846
+ });
847
+ systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
848
+ path: path.join(__dirname, '../agents/resources/default-strands-agent/batch.py'),
849
+ });
850
+ });
851
+ test('is used by default when no hostingAdapter specified', () => {
852
+ const agent = new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
853
+ agentName: 'TestAgent',
854
+ agentDefinition: {
855
+ bedrockModel: { fmModelId: testModel },
856
+ systemPrompt,
857
+ },
858
+ });
859
+ // Should have a Lambda function and API endpoint
860
+ expect(agent.agentFunction).toBeDefined();
861
+ expect(agent.apiEndpoint).toBeDefined();
862
+ // Should have created API Gateway and Cognito resources
863
+ const template = assertions_1.Template.fromStack(stack);
864
+ template.hasResourceProperties('AWS::Lambda::Function', {
865
+ FunctionName: assertions_1.Match.stringLikeRegexp('TestAgent'),
866
+ });
867
+ template.resourceCountIs('AWS::ApiGateway::RestApi', 1);
868
+ template.resourceCountIs('AWS::Cognito::UserPool', 1);
869
+ });
870
+ test('explicit LambdaHostingAdapter with custom authenticator', () => {
871
+ const agent = new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
872
+ agentName: 'TestAgent',
873
+ agentDefinition: {
874
+ bedrockModel: { fmModelId: testModel },
875
+ systemPrompt,
876
+ },
877
+ hostingAdapter: new interactive_agent_1.LambdaHostingAdapter({
878
+ authenticator: new interactive_agent_1.NoAuthenticator(),
879
+ }),
880
+ });
881
+ expect(agent.agentFunction).toBeDefined();
882
+ expect(agent.apiEndpoint).toBeDefined();
883
+ const template = assertions_1.Template.fromStack(stack);
884
+ template.hasResourceProperties('AWS::Lambda::Function', {
885
+ FunctionName: assertions_1.Match.stringLikeRegexp('TestAgent'),
886
+ });
887
+ // No Cognito with NoAuthenticator
888
+ template.resourceCountIs('AWS::Cognito::UserPool', 0);
889
+ });
890
+ test('hostingAdapter prop overrides top-level authenticator/communicationAdapter', () => {
891
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
892
+ agentName: 'TestAgent',
893
+ agentDefinition: {
894
+ bedrockModel: { fmModelId: testModel },
895
+ systemPrompt,
896
+ },
897
+ // These should be ignored when hostingAdapter is provided
898
+ authenticator: new interactive_agent_1.CognitoAuthenticator(),
899
+ hostingAdapter: new interactive_agent_1.LambdaHostingAdapter({
900
+ authenticator: new interactive_agent_1.NoAuthenticator(),
901
+ }),
902
+ });
903
+ // Adapter-level authenticator should win — no Cognito pool
904
+ const template = assertions_1.Template.fromStack(stack);
905
+ template.resourceCountIs('AWS::Cognito::UserPool', 0);
906
+ });
907
+ });
908
+ describe('AgentCoreRuntimeHostingAdapter', () => {
909
+ let app;
910
+ let stack;
911
+ let systemPrompt;
912
+ const testModel = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_SONNET_20240229_V1_0;
913
+ beforeEach(() => {
914
+ app = (0, test_utils_1.createTestApp)();
915
+ stack = new aws_cdk_lib_1.Stack(app, 'TestStack', {
916
+ env: { account: '123456789012', region: 'us-east-1' },
917
+ });
918
+ systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
919
+ path: path.join(__dirname, '../agents/resources/default-strands-agent/batch.py'),
920
+ });
921
+ });
922
+ test('creates CfnRuntime with container URI', () => {
923
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
924
+ agentName: 'TestAgent',
925
+ agentDefinition: {
926
+ bedrockModel: { fmModelId: testModel },
927
+ systemPrompt,
928
+ },
929
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
930
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
931
+ networkMode: 'PUBLIC',
932
+ }),
933
+ });
934
+ const template = assertions_1.Template.fromStack(stack);
935
+ template.hasResourceProperties('AWS::BedrockAgentCore::Runtime', {
936
+ AgentRuntimeName: 'TestAgent_runtime',
937
+ AgentRuntimeArtifact: {
938
+ ContainerConfiguration: {
939
+ ContainerUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
940
+ },
941
+ },
942
+ NetworkConfiguration: {
943
+ NetworkMode: 'PUBLIC',
944
+ },
945
+ });
946
+ });
947
+ test('creates CfnRuntimeEndpoint', () => {
948
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
949
+ agentName: 'TestAgent',
950
+ agentDefinition: {
951
+ bedrockModel: { fmModelId: testModel },
952
+ systemPrompt,
953
+ },
954
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
955
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
956
+ }),
957
+ });
958
+ const template = assertions_1.Template.fromStack(stack);
959
+ template.resourceCountIs('AWS::BedrockAgentCore::RuntimeEndpoint', 1);
960
+ template.hasResourceProperties('AWS::BedrockAgentCore::RuntimeEndpoint', {
961
+ Name: 'TestAgent_endpoint',
962
+ });
963
+ });
964
+ test('creates single IAM role with bedrock-agentcore trust', () => {
965
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
966
+ agentName: 'TestAgent',
967
+ agentDefinition: {
968
+ bedrockModel: { fmModelId: testModel },
969
+ systemPrompt,
970
+ },
971
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
972
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
973
+ }),
974
+ });
975
+ const template = assertions_1.Template.fromStack(stack);
976
+ const roles = template.findResources('AWS::IAM::Role');
977
+ // Find all roles with bedrock-agentcore trust
978
+ const agentCoreRoles = Object.values(roles).filter((role) => role.Properties.AssumeRolePolicyDocument?.Statement?.some((stmt) => stmt.Principal?.Service === 'bedrock-agentcore.amazonaws.com'));
979
+ // Should be exactly ONE role (the agent role), not a separate runtime role
980
+ expect(agentCoreRoles).toHaveLength(1);
981
+ });
982
+ test('passes environment variables', () => {
983
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
984
+ agentName: 'TestAgent',
985
+ agentDefinition: {
986
+ bedrockModel: { fmModelId: testModel },
987
+ systemPrompt,
988
+ },
989
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
990
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
991
+ }),
992
+ });
993
+ const template = assertions_1.Template.fromStack(stack);
994
+ template.hasResourceProperties('AWS::BedrockAgentCore::Runtime', {
995
+ EnvironmentVariables: assertions_1.Match.objectLike({
996
+ MODEL_ID: assertions_1.Match.anyValue(),
997
+ }),
998
+ });
999
+ });
1000
+ test('defaults to PUBLIC network mode', () => {
1001
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
1002
+ agentName: 'TestAgent',
1003
+ agentDefinition: {
1004
+ bedrockModel: { fmModelId: testModel },
1005
+ systemPrompt,
1006
+ },
1007
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
1008
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
1009
+ }),
1010
+ });
1011
+ const template = assertions_1.Template.fromStack(stack);
1012
+ template.hasResourceProperties('AWS::BedrockAgentCore::Runtime', {
1013
+ NetworkConfiguration: {
1014
+ NetworkMode: 'PUBLIC',
1015
+ },
1016
+ });
1017
+ });
1018
+ test('S3 session bucket created for AgentCore hosting', () => {
1019
+ const agent = new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
1020
+ agentName: 'TestAgent',
1021
+ agentDefinition: {
1022
+ bedrockModel: { fmModelId: testModel },
1023
+ systemPrompt,
1024
+ },
1025
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
1026
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
1027
+ }),
1028
+ });
1029
+ // Session bucket should be created for S3-backed persistence
1030
+ expect(agent.sessionBucket).toBeDefined();
1031
+ const template = assertions_1.Template.fromStack(stack);
1032
+ template.hasResourceProperties('AWS::S3::Bucket', {});
1033
+ });
1034
+ test('no agent Lambda function created for AgentCore hosting', () => {
1035
+ const agent = new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
1036
+ agentName: 'TestAgent',
1037
+ agentDefinition: {
1038
+ bedrockModel: { fmModelId: testModel },
1039
+ systemPrompt,
1040
+ },
1041
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
1042
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
1043
+ }),
1044
+ });
1045
+ expect(agent.agentFunction).toBeUndefined();
1046
+ });
1047
+ test('custom JWT authorizer configuration', () => {
1048
+ new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
1049
+ agentName: 'TestAgent',
1050
+ agentDefinition: {
1051
+ bedrockModel: { fmModelId: testModel },
1052
+ systemPrompt,
1053
+ },
1054
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
1055
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
1056
+ customJwtAuthorizer: {
1057
+ discoveryUrl: 'https://example.com/.well-known/openid-configuration',
1058
+ allowedAudience: ['my-audience'],
1059
+ allowedClients: ['my-client'],
1060
+ },
1061
+ }),
1062
+ });
1063
+ const template = assertions_1.Template.fromStack(stack);
1064
+ template.hasResourceProperties('AWS::BedrockAgentCore::Runtime', {
1065
+ AuthorizerConfiguration: assertions_1.Match.objectLike({
1066
+ CustomJWTAuthorizer: assertions_1.Match.objectLike({
1067
+ DiscoveryUrl: 'https://example.com/.well-known/openid-configuration',
1068
+ }),
1069
+ }),
1070
+ });
1071
+ });
1072
+ test('sets cfnRuntime property on agent', () => {
1073
+ const agent = new interactive_agent_1.InteractiveAgent(stack, 'Agent', {
1074
+ agentName: 'TestAgent',
1075
+ agentDefinition: {
1076
+ bedrockModel: { fmModelId: testModel },
1077
+ systemPrompt,
1078
+ },
1079
+ hostingAdapter: new interactive_agent_1.AgentCoreRuntimeHostingAdapter({
1080
+ containerImageUri: '123456789012.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest',
1081
+ }),
1082
+ });
1083
+ expect(agent.cfnRuntime).toBeDefined();
1084
+ });
1085
+ });
1086
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9mcmFtZXdvcmsvdGVzdHMvaW50ZXJhY3RpdmUtYWdlbnQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3Qiw2Q0FBbUQ7QUFDbkQsdURBQXlEO0FBQ3pELHlEQUFvRTtBQUNwRSx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLDZEQUFrRDtBQUNsRCwyREFBMkQ7QUFDM0QsbUVBVXFDO0FBQ3JDLDZEQUFnRTtBQUVoRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksR0FBUSxDQUFDO0lBQ2IsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxZQUFtQixDQUFDO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLHVDQUF5QixDQUFDLHVDQUF1QyxDQUFDO0lBRXBGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsSUFBQSwwQkFBYSxHQUFFLENBQUM7UUFDdEIsS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO1lBQ2xDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtTQUN0RCxDQUFDLENBQUM7UUFDSCxZQUFZLEdBQUcsSUFBSSxxQkFBSyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUU7WUFDOUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO1NBQ2pGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksb0NBQWdCLENBQUMsS0FBSyxFQUFFLE9B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SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBBcHAsIFN0YWNrLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFRlbXBsYXRlLCBNYXRjaCB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQge1xuICBJbnRlcmFjdGl2ZUFnZW50LFxuICBTdHJlYW1pbmdIdHRwQWRhcHRlcixcbiAgUzNTZXNzaW9uTWFuYWdlcixcbiAgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIsXG4gIE51bGxDb252ZXJzYXRpb25NYW5hZ2VyLFxuICBDb2duaXRvQXV0aGVudGljYXRvcixcbiAgTm9BdXRoZW50aWNhdG9yLFxuICBMYW1iZGFIb3N0aW5nQWRhcHRlcixcbiAgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyLFxufSBmcm9tICcuLi9hZ2VudHMvaW50ZXJhY3RpdmUtYWdlbnQnO1xuaW1wb3J0IHsgQmVkcm9ja0tub3dsZWRnZUJhc2UgfSBmcm9tICcuLi9hZ2VudHMva25vd2xlZGdlLWJhc2UnO1xuXG5kZXNjcmliZSgnSW50ZXJhY3RpdmVBZ2VudCcsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgc3lzdGVtUHJvbXB0OiBBc3NldDtcbiAgY29uc3QgdGVzdE1vZGVsID0gRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfU09OTkVUXzIwMjQwMjI5X1YxXzA7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgIH0pO1xuICAgIHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChzdGFjaywgJ1N5c3RlbVByb21wdCcsIHtcbiAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9hZ2VudHMvcmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudC9iYXRjaC5weScpLFxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVmYXVsdCBDb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2NyZWF0ZXMgd2l0aCBtaW5pbWFsIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGFnZW50KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGFnZW50LmFnZW50RnVuY3Rpb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoYWdlbnQuYXBpRW5kcG9pbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdkZWZhdWx0IGFkYXB0ZXIgaXMgU3RyZWFtaW5nSHR0cEFkYXB0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYWdlbnQuYWRhcHRlcikudG9CZUluc3RhbmNlT2YoU3RyZWFtaW5nSHR0cEFkYXB0ZXIpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZGVmYXVsdCBzZXNzaW9uIHN0b3JlIGlzIFMzU2Vzc2lvbk1hbmFnZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYWdlbnQuc2Vzc2lvblN0b3JlKS50b0JlSW5zdGFuY2VPZihTM1Nlc3Npb25NYW5hZ2VyKTtcbiAgICAgIGV4cGVjdChhZ2VudC5zZXNzaW9uQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZGVmYXVsdCBjb250ZXh0IHN0cmF0ZWd5IGlzIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGFnZW50LmNvbnRleHRTdHJhdGVneSkudG9CZUluc3RhbmNlT2YoU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZGVmYXVsdCBhdXRoZW50aWNhdG9yIGlzIENvZ25pdG9BdXRoZW50aWNhdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGFnZW50LmF1dGhlbnRpY2F0b3IpLnRvQmVJbnN0YW5jZU9mKENvZ25pdG9BdXRoZW50aWNhdG9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0xhbWJkYSBGdW5jdGlvbiBDb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2NyZWF0ZXMgTGFtYmRhIGZ1bmN0aW9uIHdpdGggZGVmYXVsdCAxNS1taW51dGUgdGltZW91dCcsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgVGltZW91dDogOTAwLCAvLyAxNSBtaW51dGVzXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgTGFtYmRhIGZ1bmN0aW9uIHdpdGggZGVmYXVsdCAxMDI0IE1CIG1lbW9yeScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgTWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnTGFtYmRhIGZ1bmN0aW9uIGhhcyBMYW1iZGEgV2ViIEFkYXB0ZXIgbGF5ZXInLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIExheWVyczogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjc1MzI0MDU5ODA3NTpsYXllcjpMYW1iZGFBZGFwdGVyTGF5ZXJYODY6MjUnLFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnTGFtYmRhIGZ1bmN0aW9uIGhhcyBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUiBlbnYgdmFyIGZvciBMV0EnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgICAgVmFyaWFibGVzOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSOiAnL29wdC9ib290c3RyYXAnLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdMYW1iZGEgZnVuY3Rpb24gaGFzIEFXU19MV0FfSU5WT0tFX01PREUgZW52IHZhcicsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgQVdTX0xXQV9JTlZPS0VfTU9ERTogJ3Jlc3BvbnNlX3N0cmVhbScsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBoYXMgUE9SVCBlbnYgdmFyIHNldCB0byA4MDgwJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBQT1JUOiAnODA4MCcsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBoYXMgTU9ERUxfSUQgZW52IHZhcicsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgTU9ERUxfSUQ6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGRlcHJlY2F0ZWQgY29udGV4dCBzdHJhdGVneSBlbnYgdmFycycsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICBjb25zdCBmdW5jdGlvbnMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nKTtcbiAgICAgIGNvbnN0IGZuID0gT2JqZWN0LnZhbHVlcyhmdW5jdGlvbnMpLmZpbmQoKGY6IGFueSkgPT5cbiAgICAgICAgZi5Qcm9wZXJ0aWVzPy5GdW5jdGlvbk5hbWU/LmluY2x1ZGVzKCdUZXN0QWdlbnQnKSxcbiAgICAgICkgYXMgYW55O1xuXG4gICAgICAvLyBDb250ZXh0IGVudiB2YXJzIHNob3VsZCBubyBsb25nZXIgYmUgc2V0IChoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlIGhhbmRsZXIpXG4gICAgICBleHBlY3QoZm4uUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXMuQ09OVEVYVF9FTkFCTEVEKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QoZm4uUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXMuQ09OVEVYVF9TVFJBVEVHWSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGZuLlByb3BlcnRpZXMuRW52aXJvbm1lbnQuVmFyaWFibGVzLkNPTlRFWFRfV0lORE9XX1NJWkUpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ0xhbWJkYSBmdW5jdGlvbiBoYXMgc2Vzc2lvbiBidWNrZXQgZW52IHZhcicsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgU0VTU0lPTl9CVUNLRVQ6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2N1c3RvbSB0aW1lb3V0IGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTApLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgICBUaW1lb3V0OiA2MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2N1c3RvbSBtZW1vcnlTaXplIGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW9yeVNpemU6IDIwNDgsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIE1lbW9yeVNpemU6IDIwNDgsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JFU1QgQVBJIENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBSRVNUIEFQSSByZXNvdXJjZScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaScsIDEpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyAvY2hhdCByZXNvdXJjZScsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2UnLCB7XG4gICAgICAgIFBhdGhQYXJ0OiAnY2hhdCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgUE9TVCBtZXRob2Qgb24gL2NoYXQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdQT1NUIG1ldGhvZCBoYXMgQ29nbml0byBhdXRob3JpemVyIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgLy8gVmVyaWZ5IENvZ25pdG8gYXV0aG9yaXplciBleGlzdHNcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpBcGlHYXRld2F5OjpBdXRob3JpemVyJywge1xuICAgICAgICBUeXBlOiAnQ09HTklUT19VU0VSX1BPT0xTJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnUE9TVCBtZXRob2QgaGFzIG5vIGF1dGhvcml6ZXIgd2l0aCBOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGhlbnRpY2F0b3I6IG5ldyBOb0F1dGhlbnRpY2F0b3IoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICAvLyBTaG91bGQgaGF2ZSBQT1NUIG1ldGhvZCB3aXRoIE5PTkUgYXV0aFxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBBdXRob3JpemF0aW9uVHlwZTogJ05PTkUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdSRVNUIEFQSSBoYXMgQ09SUyBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIC8vIE9QVElPTlMgbWV0aG9kIGZvciBDT1JTIHByZWZsaWdodFxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZCcsIHtcbiAgICAgICAgSHR0cE1ldGhvZDogJ09QVElPTlMnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXNzaW9uIE1hbmFnZW1lbnQnLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBTMyBzZXNzaW9uIGJ1Y2tldCB3aXRoIEtNUyBlbmNyeXB0aW9uIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICAgIEJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBTU0VBbGdvcml0aG06ICdhd3M6a21zJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzZXNzaW9uIGJ1Y2tldCBoYXMgbGlmZWN5Y2xlIHJ1bGUnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICAgIExpZmVjeWNsZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBSdWxlczogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgICBTdGF0dXM6ICdFbmFibGVkJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjdXN0b20gc2Vzc2lvbiBidWNrZXQgaXMgdXNlZCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tQnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0N1c3RvbUJ1Y2tldCcpO1xuXG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgICAgc2Vzc2lvbkJ1Y2tldDogY3VzdG9tQnVja2V0LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChhZ2VudC5zZXNzaW9uQnVja2V0KS50b0JlKGN1c3RvbUJ1Y2tldCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdGF0ZWxlc3MgbW9kZSBjcmVhdGVzIG5vIHNlc3Npb24gYnVja2V0IHdoZW4gc2Vzc2lvblN0b3JlIGlzIGV4cGxpY2l0bHkgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgLy8gV2hlbiBzZXNzaW9uU3RvcmUgaXMgbm90IHByb3ZpZGVkIGF0IGFsbCwgZGVmYXVsdCBTM1Nlc3Npb25NYW5hZ2VyIGlzIGNyZWF0ZWQuXG4gICAgICAvLyBUbyBnbyB0cnVseSBzdGF0ZWxlc3MsIHVzZXIgbXVzdCBwYXNzIGEgY3VzdG9tIElTZXNzaW9uU3RvcmUgd2l0aCBubyBidWNrZXQuXG4gICAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZWZhdWx0IGNyZWF0ZXMgYSBzZXNzaW9uIHN0b3JlXG4gICAgICBleHBlY3QoYWdlbnQuc2Vzc2lvblN0b3JlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29nbml0byBBdXRoZW50aWNhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIENvZ25pdG8gVXNlciBQb29sIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sJywgMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIENvZ25pdG8gVXNlciBQb29sIENsaWVudCBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIDEpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnbm8gQ29nbml0byByZXNvdXJjZXMgd2l0aCBOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGhlbnRpY2F0b3I6IG5ldyBOb0F1dGhlbnRpY2F0b3IoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q29nbml0bzo6VXNlclBvb2wnLCAwKTtcbiAgICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpDb2duaXRvOjpVc2VyUG9vbENsaWVudCcsIDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUHJvcHMgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIGVtcHR5IGFnZW50TmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnJyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgndGhyb3dzIGVycm9yIGZvciB3aGl0ZXNwYWNlLW9ubHkgYWdlbnROYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICcgICAnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdhZ2VudE5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lbW9yeVNpemUgdG9vIGxvdycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtb3J5U2l6ZTogNjQsXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnbWVtb3J5U2l6ZSBtdXN0IGJlIGJldHdlZW4gMTI4IGFuZCAxMDI0MCBNQicpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgndGhyb3dzIGVycm9yIGZvciBtZW1vcnlTaXplIHRvbyBoaWdoJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1vcnlTaXplOiAyMDQ4MCxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIHRpbWVvdXQgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRvVGhyb3coJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIHRpbWVvdXQgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMjApLFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRvVGhyb3coJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lc3NhZ2VIaXN0b3J5TGltaXQgdG9vIGxvdycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZUhpc3RvcnlMaW1pdDogMCxcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KCdtZXNzYWdlSGlzdG9yeUxpbWl0IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAwJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0aHJvd3MgZXJyb3IgZm9yIG1lc3NhZ2VIaXN0b3J5TGltaXQgdG9vIGhpZ2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2VIaXN0b3J5TGltaXQ6IDIwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfSkudG9UaHJvdygnbWVzc2FnZUhpc3RvcnlMaW1pdCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnYWNjZXB0cyB2YWxpZCBib3VuZGFyeSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50MScsIHtcbiAgICAgICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQxJyxcbiAgICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMSksXG4gICAgICAgICAgbWVzc2FnZUhpc3RvcnlMaW1pdDogMSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudDInLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50MicsXG4gICAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbW9yeVNpemU6IDEwMjQwLFxuICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICAgIG1lc3NhZ2VIaXN0b3J5TGltaXQ6IDEwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NESyBTeW50aCcsICgpID0+IHtcbiAgICB0ZXN0KCdzeW50aGVzaXplcyB3aXRob3V0IGVycm9ycycsICgpID0+IHtcbiAgICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBhcHAuc3ludGgoKTtcbiAgICAgIH0pLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIEtNUyBrZXkgd2l0aCByb3RhdGlvbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIGNvbnN0IGtleXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKCdBV1M6OktNUzo6S2V5Jyk7XG4gICAgICBjb25zdCBoYXNSb3RhdGlvbiA9IE9iamVjdC52YWx1ZXMoa2V5cykuc29tZShcbiAgICAgICAgKGtleTogYW55KSA9PiBrZXkuUHJvcGVydGllcy5FbmFibGVLZXlSb3RhdGlvbiA9PT0gdHJ1ZSxcbiAgICAgICk7XG4gICAgICBleHBlY3QoaGFzUm90YXRpb24pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIElBTSByb2xlIHdpdGggTGFtYmRhIHNlcnZpY2UgcHJpbmNpcGFsJywgKCkgPT4ge1xuICAgICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIGNvbnN0IHJvbGVzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpJQU06OlJvbGUnKTtcbiAgICAgIGNvbnN0IGFnZW50Um9sZSA9IE9iamVjdC52YWx1ZXMocm9sZXMpLmZpbmQoKHJvbGU6IGFueSkgPT5cbiAgICAgICAgcm9sZS5Qcm9wZXJ0aWVzLkFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQuc29tZShcbiAgICAgICAgICAoc3RtdDogYW55KSA9PiBzdG10LlByaW5jaXBhbD8uU2VydmljZSA9PT0gJ2xhbWJkYS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QoYWdlbnRSb2xlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdTdHJlYW1pbmdIdHRwQWRhcHRlcicsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgbW9ja0xhbWJkYTogRnVuY3Rpb247XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgIH0pO1xuICAgIG1vY2tMYW1iZGEgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNb2NrTGFtYmRhJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgc3RhdHVzQ29kZTogMjAwIH0pOycpLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdpbXBsZW1lbnRzIElDb21tdW5pY2F0aW9uQWRhcHRlciBpbnRlcmZhY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpO1xuICAgIGV4cGVjdCh0eXBlb2YgYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYWRhcHRlci5ncmFudEludm9rZSkudG9CZSgnZnVuY3Rpb24nKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIHdpdGggY3VzdG9tIHN0YWdlTmFtZScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHsgc3RhZ2VOYW1lOiAnZGV2JyB9KSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyB3aXRoIHRocm90dGxlIHNldHRpbmdzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoe1xuICAgICAgdGhyb3R0bGU6IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9LFxuICAgIH0pKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3Mgd2hlbiBhdHRhY2hUb0Z1bmN0aW9uIGNhbGxlZCB3aXRob3V0IHNjb3BlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoKTtcbiAgICBleHBlY3QoKCkgPT4gYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKG1vY2tMYW1iZGEpKS50b1Rocm93KFxuICAgICAgJ1N0cmVhbWluZ0h0dHBBZGFwdGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHNjb3BlIGJlZm9yZSBjYWxsaW5nIGF0dGFjaFRvRnVuY3Rpb24nLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2F0dGFjaFRvRnVuY3Rpb24gcmV0dXJucyBlbmRwb2ludCBVUkwnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRhcHRlciA9IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcigpO1xuICAgIGFkYXB0ZXIuX3NldFNjb3BlKHN0YWNrKTtcbiAgICBjb25zdCB1cmwgPSBhZGFwdGVyLmF0dGFjaFRvRnVuY3Rpb24obW9ja0xhbWJkYSk7XG4gICAgZXhwZWN0KHVybCkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QodHlwZW9mIHVybCkudG9CZSgnc3RyaW5nJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyYW50SW52b2tlIGRvZXMgbm90IHRocm93JywgKCkgPT4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoKTtcbiAgICBhZGFwdGVyLl9zZXRTY29wZShzdGFjayk7XG4gICAgYWRhcHRlci5hdHRhY2hUb0Z1bmN0aW9uKG1vY2tMYW1iZGEpO1xuICAgIGV4cGVjdCgoKSA9PiBhZGFwdGVyLmdyYW50SW52b2tlKG1vY2tMYW1iZGEpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdTM1Nlc3Npb25NYW5hZ2VyJywgKCkgPT4ge1xuICB0ZXN0KCdpbXBsZW1lbnRzIElTZXNzaW9uU3RvcmUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcihzdGFjaywgJ1NNJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBtYW5hZ2VyLmdyYW50UmVhZFdyaXRlKS50b0JlKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdChtYW5hZ2VyLnNlc3Npb25CdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYnVja2V0IHdpdGggS01TIGVuY3J5cHRpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHN0YWNrLCAnU00nKTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICBCdWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGN1c3RvbSBidWNrZXQgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJyk7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0N1c3RvbUJ1Y2tldCcpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcihzdGFjaywgJ1NNJywgeyBidWNrZXQgfSk7XG4gICAgZXhwZWN0KG1hbmFnZXIuYnVja2V0KS50b0JlKGJ1Y2tldCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlZmF1bHQgVFRMIGlzIDI0IGhvdXJzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIoc3RhY2ssICdTTScpO1xuICAgIGV4cGVjdChtYW5hZ2VyLnNlc3Npb25UVEwudG9Ib3VycygpKS50b0JlKDI0KTtcbiAgfSk7XG5cbiAgdGVzdCgnY3VzdG9tIFRUTCBpcyBhcHBsaWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIoc3RhY2ssICdTTScsIHtcbiAgICAgIHNlc3Npb25UVEw6IER1cmF0aW9uLmhvdXJzKDQ4KSxcbiAgICB9KTtcbiAgICBleHBlY3QobWFuYWdlci5zZXNzaW9uVFRMLnRvSG91cnMoKSkudG9CZSg0OCk7XG4gIH0pO1xufSk7XG5cblxuZGVzY3JpYmUoJ1NsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyJywgKCkgPT4ge1xuICB0ZXN0KCdkZWZhdWx0IHdpbmRvdyBzaXplIGlzIDIwJywgKCkgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoKTtcbiAgICBleHBlY3QobWFuYWdlci53aW5kb3dTaXplKS50b0JlKDIwKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3VzdG9tIHdpbmRvdyBzaXplIGlzIGFwcGxpZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDUwIH0pO1xuICAgIGV4cGVjdChtYW5hZ2VyLndpbmRvd1NpemUpLnRvQmUoNTApO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3MgZm9yIHdpbmRvdyBzaXplIGJlbG93IDEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDAgfSkpLnRvVGhyb3coXG4gICAgICAnd2luZG93U2l6ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwMCcsXG4gICAgKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhyb3dzIGZvciB3aW5kb3cgc2l6ZSBhYm92ZSAxMDAwJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoeyB3aW5kb3dTaXplOiAxMDAxIH0pKS50b1Rocm93KFxuICAgICAgJ3dpbmRvd1NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcih7IHdpbmRvd1NpemU6IDMwIH0pO1xuICAgIGNvbnN0IGVudiA9IG1hbmFnZXIuZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ1NsaWRpbmdXaW5kb3cnLFxuICAgICAgQ09OVEVYVF9XSU5ET1dfU0laRTogJzMwJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG5kZXNjcmliZSgnTnVsbENvbnZlcnNhdGlvbk1hbmFnZXInLCAoKSA9PiB7XG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBOdWxsQ29udmVyc2F0aW9uTWFuYWdlcigpO1xuICAgIGNvbnN0IGVudiA9IG1hbmFnZXIuZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ2ZhbHNlJyxcbiAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdOdWxsJyxcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG5kZXNjcmliZSgnQ29nbml0b0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gIGxldCBhcHA6IEFwcDtcbiAgbGV0IHN0YWNrOiBTdGFjaztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgd2l0aCBkZWZhdWx0IHByb3BzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0U2NvcGUgY3JlYXRlcyBVc2VyIFBvb2wgYW5kIENsaWVudCcsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgYXV0aC5fc2V0U2NvcGUoc3RhY2spO1xuICAgIGV4cGVjdChhdXRoLnVzZXJQb29sKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChhdXRoLnVzZXJQb29sQ2xpZW50KS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCd0aHJvd3Mgd2hlbiBncmFudEF1dGhlbnRpY2F0ZSBjYWxsZWQgd2l0aG91dCBzY29wZScsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgY29uc3QgbW9ja0xhbWJkYSA9IG5ldyBGdW5jdGlvbihzdGFjaywgJ01vY2tMYW1iZGEnLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoe30pOycpLFxuICAgIH0pO1xuICAgIGV4cGVjdCgoKSA9PiBhdXRoLmdyYW50QXV0aGVudGljYXRlKG1vY2tMYW1iZGEpKS50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JldHVybnMgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXV0aCA9IG5ldyBDb2duaXRvQXV0aGVudGljYXRvcigpO1xuICAgIGNvbnN0IGVudiA9IGF1dGguZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52LkFVVEhfVFlQRSkudG9CZSgnQ29nbml0bycpO1xuICB9KTtcbn0pO1xuXG5cbmRlc2NyaWJlKCdOb0F1dGhlbnRpY2F0b3InLCAoKSA9PiB7XG4gIHRlc3QoJ2dyYW50QXV0aGVudGljYXRlIGlzIG5vLW9wJywgKCkgPT4ge1xuICAgIGNvbnN0IGF1dGggPSBuZXcgTm9BdXRoZW50aWNhdG9yKCk7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycpO1xuICAgIGNvbnN0IG1vY2tMYW1iZGEgPSBuZXcgRnVuY3Rpb24oc3RhY2ssICdNb2NrTGFtYmRhJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHt9KTsnKSxcbiAgICB9KTtcbiAgICBleHBlY3QoKCkgPT4gYXV0aC5ncmFudEF1dGhlbnRpY2F0ZShtb2NrTGFtYmRhKSkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgdGVzdCgncmV0dXJucyBjb3JyZWN0IGVudmlyb25tZW50IHZhcmlhYmxlcycsICgpID0+IHtcbiAgICBjb25zdCBhdXRoID0gbmV3IE5vQXV0aGVudGljYXRvcigpO1xuICAgIGNvbnN0IGVudiA9IGF1dGguZW52aXJvbm1lbnRWYXJpYWJsZXMoKTtcbiAgICBleHBlY3QoZW52KS50b0VxdWFsKHsgQVVUSF9UWVBFOiAnTm9uZScgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbnRlcmFjdGl2ZUFnZW50IEtub3dsZWRnZSBCYXNlIEludGVncmF0aW9uJywgKCkgPT4ge1xuICBsZXQgYXBwOiBBcHA7XG4gIGxldCBzdGFjazogU3RhY2s7XG4gIGxldCBzeXN0ZW1Qcm9tcHQ6IEFzc2V0O1xuICBjb25zdCB0ZXN0TW9kZWwgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19TT05ORVRfMjAyNDAyMjlfVjFfMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gICAgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHN0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NldHMgS05PV0xFREdFX0JBU0VTX0NPTkZJRyB3aGVuIEtCcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGtiID0gbmV3IEJlZHJvY2tLbm93bGVkZ2VCYXNlKHN0YWNrLCAnVGVzdEtCJywge1xuICAgICAgbmFtZTogJ3Rlc3Qta2InLFxuICAgICAgZGVzY3JpcHRpb246ICdUZXN0IGtub3dsZWRnZSBiYXNlJyxcbiAgICAgIGtub3dsZWRnZUJhc2VJZDogJ0tCMTIzNDU2JyxcbiAgICB9KTtcblxuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIGtub3dsZWRnZUJhc2VzOiBba2JdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgS05PV0xFREdFX0JBU0VTX0NPTkZJRzogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICBLTk9XTEVER0VfQkFTRV9TWVNURU1fUFJPTVBUX0FERElUSU9OOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RvZXMgbm90IHNldCBLQiBlbnYgdmFycyB3aGVuIG5vIEtCcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpO1xuICAgIGNvbnN0IGZuID0gT2JqZWN0LnZhbHVlcyhmdW5jdGlvbnMpLmZpbmQoKGY6IGFueSkgPT5cbiAgICAgIGYuUHJvcGVydGllcz8uRnVuY3Rpb25OYW1lPy5pbmNsdWRlcygnVGVzdEFnZW50JyksXG4gICAgKSBhcyBhbnk7XG5cbiAgICBleHBlY3QoZm4uUHJvcGVydGllcy5FbnZpcm9ubWVudC5WYXJpYWJsZXMuS05PV0xFREdFX0JBU0VTX0NPTkZJRykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChmbi5Qcm9wZXJ0aWVzLkVudmlyb25tZW50LlZhcmlhYmxlcy5LTk9XTEVER0VfQkFTRV9TWVNURU1fUFJPTVBUX0FERElUSU9OKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xufSk7XG5cblxuZGVzY3JpYmUoJ0xhbWJkYUhvc3RpbmdBZGFwdGVyJywgKCkgPT4ge1xuICBsZXQgYXBwOiBBcHA7XG4gIGxldCBzdGFjazogU3RhY2s7XG4gIGxldCBzeXN0ZW1Qcm9tcHQ6IEFzc2V0O1xuICBjb25zdCB0ZXN0TW9kZWwgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19TT05ORVRfMjAyNDAyMjlfVjFfMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gICAgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHN0YWNrLCAnU3lzdGVtUHJvbXB0Jywge1xuICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2lzIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vIGhvc3RpbmdBZGFwdGVyIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdWxkIGhhdmUgYSBMYW1iZGEgZnVuY3Rpb24gYW5kIEFQSSBlbmRwb2ludFxuICAgIGV4cGVjdChhZ2VudC5hZ2VudEZ1bmN0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChhZ2VudC5hcGlFbmRwb2ludCkudG9CZURlZmluZWQoKTtcblxuICAgIC8vIFNob3VsZCBoYXZlIGNyZWF0ZWQgQVBJIEdhdGV3YXkgYW5kIENvZ25pdG8gcmVzb3VyY2VzXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRnVuY3Rpb25OYW1lOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdUZXN0QWdlbnQnKSxcbiAgICB9KTtcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaScsIDEpO1xuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpDb2duaXRvOjpVc2VyUG9vbCcsIDEpO1xuICB9KTtcblxuICB0ZXN0KCdleHBsaWNpdCBMYW1iZGFIb3N0aW5nQWRhcHRlciB3aXRoIGN1c3RvbSBhdXRoZW50aWNhdG9yJywgKCkgPT4ge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICBob3N0aW5nQWRhcHRlcjogbmV3IExhbWJkYUhvc3RpbmdBZGFwdGVyKHtcbiAgICAgICAgYXV0aGVudGljYXRvcjogbmV3IE5vQXV0aGVudGljYXRvcigpLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBleHBlY3QoYWdlbnQuYWdlbnRGdW5jdGlvbikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoYWdlbnQuYXBpRW5kcG9pbnQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBGdW5jdGlvbk5hbWU6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ1Rlc3RBZ2VudCcpLFxuICAgIH0pO1xuICAgIC8vIE5vIENvZ25pdG8gd2l0aCBOb0F1dGhlbnRpY2F0b3JcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6Q29nbml0bzo6VXNlclBvb2wnLCAwKTtcbiAgfSk7XG5cbiAgdGVzdCgnaG9zdGluZ0FkYXB0ZXIgcHJvcCBvdmVycmlkZXMgdG9wLWxldmVsIGF1dGhlbnRpY2F0b3IvY29tbXVuaWNhdGlvbkFkYXB0ZXInLCAoKSA9PiB7XG4gICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGhvc3RpbmdBZGFwdGVyIGlzIHByb3ZpZGVkXG4gICAgICBhdXRoZW50aWNhdG9yOiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKSxcbiAgICAgIGhvc3RpbmdBZGFwdGVyOiBuZXcgTGFtYmRhSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgICBhdXRoZW50aWNhdG9yOiBuZXcgTm9BdXRoZW50aWNhdG9yKCksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIC8vIEFkYXB0ZXItbGV2ZWwgYXV0aGVudGljYXRvciBzaG91bGQgd2luIOKAlCBubyBDb2duaXRvIHBvb2xcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkNvZ25pdG86OlVzZXJQb29sJywgMCk7XG4gIH0pO1xufSk7XG5cblxuZGVzY3JpYmUoJ0FnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcicsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgc3lzdGVtUHJvbXB0OiBBc3NldDtcbiAgY29uc3QgdGVzdE1vZGVsID0gRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfU09OTkVUXzIwMjQwMjI5X1YxXzA7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgIH0pO1xuICAgIHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChzdGFjaywgJ1N5c3RlbVByb21wdCcsIHtcbiAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9hZ2VudHMvcmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudC9iYXRjaC5weScpLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIENmblJ1bnRpbWUgd2l0aCBjb250YWluZXIgVVJJJywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgICBjb250YWluZXJJbWFnZVVyaTogJzEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdCcsXG4gICAgICAgIG5ldHdvcmtNb2RlOiAnUFVCTElDJyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpSdW50aW1lJywge1xuICAgICAgQWdlbnRSdW50aW1lTmFtZTogJ1Rlc3RBZ2VudF9ydW50aW1lJyxcbiAgICAgIEFnZW50UnVudGltZUFydGlmYWN0OiB7XG4gICAgICAgIENvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBDb250YWluZXJVcmk6ICcxMjM0NTY3ODkwMTIuZGtyLmVjci51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS9teS1hZ2VudDpsYXRlc3QnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIE5ldHdvcmtDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIE5ldHdvcmtNb2RlOiAnUFVCTElDJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgQ2ZuUnVudGltZUVuZHBvaW50JywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgICBjb250YWluZXJJbWFnZVVyaTogJzEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdCcsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZUVuZHBvaW50JywgMSk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkJlZHJvY2tBZ2VudENvcmU6OlJ1bnRpbWVFbmRwb2ludCcsIHtcbiAgICAgIE5hbWU6ICdUZXN0QWdlbnRfZW5kcG9pbnQnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIHNpbmdsZSBJQU0gcm9sZSB3aXRoIGJlZHJvY2stYWdlbnRjb3JlIHRydXN0JywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgICBjb250YWluZXJJbWFnZVVyaTogJzEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdCcsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICBjb25zdCByb2xlcyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpSb2xlJyk7XG4gICAgLy8gRmluZCBhbGwgcm9sZXMgd2l0aCBiZWRyb2NrLWFnZW50Y29yZSB0cnVzdFxuICAgIGNvbnN0IGFnZW50Q29yZVJvbGVzID0gT2JqZWN0LnZhbHVlcyhyb2xlcykuZmlsdGVyKChyb2xlOiBhbnkpID0+XG4gICAgICByb2xlLlByb3BlcnRpZXMuQXNzdW1lUm9sZVBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnQ/LnNvbWUoXG4gICAgICAgIChzdG10OiBhbnkpID0+IHN0bXQuUHJpbmNpcGFsPy5TZXJ2aWNlID09PSAnYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbScsXG4gICAgICApLFxuICAgICk7XG4gICAgLy8gU2hvdWxkIGJlIGV4YWN0bHkgT05FIHJvbGUgKHRoZSBhZ2VudCByb2xlKSwgbm90IGEgc2VwYXJhdGUgcnVudGltZSByb2xlXG4gICAgZXhwZWN0KGFnZW50Q29yZVJvbGVzKS50b0hhdmVMZW5ndGgoMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Bhc3NlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gICAgICAgIGNvbnRhaW5lckltYWdlVXJpOiAnMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0JyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpSdW50aW1lJywge1xuICAgICAgRW52aXJvbm1lbnRWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICBNT0RFTF9JRDogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZWZhdWx0cyB0byBQVUJMSUMgbmV0d29yayBtb2RlJywgKCkgPT4ge1xuICAgIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgICBjb250YWluZXJJbWFnZVVyaTogJzEyMzQ1Njc4OTAxMi5ka3IuZWNyLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL215LWFnZW50OmxhdGVzdCcsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZScsIHtcbiAgICAgIE5ldHdvcmtDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIE5ldHdvcmtNb2RlOiAnUFVCTElDJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ1MzIHNlc3Npb24gYnVja2V0IGNyZWF0ZWQgZm9yIEFnZW50Q29yZSBob3N0aW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gICAgICAgIGNvbnRhaW5lckltYWdlVXJpOiAnMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0JyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gU2Vzc2lvbiBidWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIFMzLWJhY2tlZCBwZXJzaXN0ZW5jZVxuICAgIGV4cGVjdChhZ2VudC5zZXNzaW9uQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgfSk7XG5cbiAgdGVzdCgnbm8gYWdlbnQgTGFtYmRhIGZ1bmN0aW9uIGNyZWF0ZWQgZm9yIEFnZW50Q29yZSBob3N0aW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gICAgICAgIGNvbnRhaW5lckltYWdlVXJpOiAnMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0JyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGFnZW50LmFnZW50RnVuY3Rpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3VzdG9tIEpXVCBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgbmV3IEludGVyYWN0aXZlQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgICBob3N0aW5nQWRhcHRlcjogbmV3IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcih7XG4gICAgICAgIGNvbnRhaW5lckltYWdlVXJpOiAnMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0JyxcbiAgICAgICAgY3VzdG9tSnd0QXV0aG9yaXplcjoge1xuICAgICAgICAgIGRpc2NvdmVyeVVybDogJ2h0dHBzOi8vZXhhbXBsZS5jb20vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgICAgIGFsbG93ZWRBdWRpZW5jZTogWydteS1hdWRpZW5jZSddLFxuICAgICAgICAgIGFsbG93ZWRDbGllbnRzOiBbJ215LWNsaWVudCddLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkJlZHJvY2tBZ2VudENvcmU6OlJ1bnRpbWUnLCB7XG4gICAgICBBdXRob3JpemVyQ29uZmlndXJhdGlvbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgIEN1c3RvbUpXVEF1dGhvcml6ZXI6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIERpc2NvdmVyeVVybDogJ2h0dHBzOi8vZXhhbXBsZS5jb20vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRzIGNmblJ1bnRpbWUgcHJvcGVydHkgb24gYWdlbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgfSxcbiAgICAgIGhvc3RpbmdBZGFwdGVyOiBuZXcgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyKHtcbiAgICAgICAgY29udGFpbmVySW1hZ2VVcmk6ICcxMjM0NTY3ODkwMTIuZGtyLmVjci51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS9teS1hZ2VudDpsYXRlc3QnLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBleHBlY3QoYWdlbnQuY2ZuUnVudGltZSkudG9CZURlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdfQ==