gen-pr 4.0.1 → 4.1.1

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.
package/dist/action.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import r from"node:os";import t from"node:path";import o from"@actions/core";import{l as i,D as n,a,m as d,n as s,b as u}from"./main-DA3u-sLa.js";import"yaml";import"ansis";import"dotenv";import"node:child_process";import"@octokit/graphql";import"@octokit/rest";import"@ai-sdk/amazon-bedrock";import"@ai-sdk/anthropic";import"@ai-sdk/azure";import"@ai-sdk/google";import"@ai-sdk/google-vertex";import"@ai-sdk/openai";import"@ai-sdk/xai";import"@openrouter/ai-sdk-provider";import"ai";import"ai-v4";import"ollama-ai-provider-v2";const m=i(),g=o.getInput("issue-number",{required:!0}),p=o.getInput("planning-model",{required:!1})||m["planning-model"],l="false"!==(o.getInput("two-staged-planning",{required:!1})||m["two-staged-planning"]),c=o.getInput("reasoning-effort",{required:!1})||m["reasoning-effort"],x="true"===(o.getInput("dry-run",{required:!1})||m["dry-run"]),f=o.getInput("coding-tool",{required:!1})||m["coding-tool"]||n,I=o.getInput("aider-extra-args",{required:!1})||m["aider-extra-args"],v=o.getInput("claude-code-extra-args",{required:!1})||m["claude-code-extra-args"],q=o.getInput("codex-extra-args",{required:!1})||m["codex-extra-args"],h=o.getInput("gemini-extra-args",{required:!1})||m["gemini-extra-args"],b=o.getInput("repomix-extra-args",{required:!1})||m["repomix-extra-args"],k=o.getInput("test-command",{required:!1})||m["test-command"],A=o.getInput("max-test-attempts",{required:!1})||m["max-test-attempts"],E=A?Number.parseInt(String(A),10):u,w=o.getInput("remove-pattern",{required:!1})||m["remove-pattern"],y="true"===(o.getInput("no-branch",{required:!1})||m["no-branch"]),N=o.getInput("node-runtime",{required:!1})||m["node-runtime"]||a;c&&!["low","medium","high"].includes(c)&&(console.error(`Invalid reasoning-effort value: ${c}. Using default. Valid values are: low, medium, high`),process.exit(1)),["aider","claude-code","codex-cli","gemini-cli"].includes(f)||(console.error(`Invalid coding-tool value: ${f}. Using default. Valid values are: aider, claude-code, codex-cli, gemini-cli`),process.exit(1)),N&&!["node","bun","npx","bunx"].includes(N)&&(console.error(`Invalid node-runtime value: ${N}. Using default. Valid values are: node (npx) and bun (bunx)`),process.exit(1));const S=s(N);e.rmSync(t.join(r.homedir(),".config","gh"),{force:!0,recursive:!0}),d({aiderExtraArgs:I,claudeCodeExtraArgs:v,codexExtraArgs:q,geminiExtraArgs:h,codingTool:f,twoStagePlanning:l,dryRun:x,noBranch:y,nodeRuntime:S,issueNumber:Number(g),maxTestAttempts:E,planningModel:p,reasoningEffort:c,repomixExtraArgs:b,testCommand:k,removePattern:w});
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY29yZSBmcm9tICdAYWN0aW9ucy9jb3JlJztcbmltcG9ydCB7IGxvYWRDb25maWdGaWxlIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9DT0RJTkdfVE9PTCwgREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUywgREVGQVVMVF9OT0RFX1JVTlRJTUUgfSBmcm9tICcuL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB7IG1haW4gfSBmcm9tICcuL21haW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplTm9kZVJ1bnRpbWUgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kaW5nVG9vbCwgTm9kZVJ1bnRpbWUsIE5vZGVSdW50aW1lQWN0dWFsLCBSZWFzb25pbmdFZmZvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuY29uc3QgY29uZmlnT3B0aW9ucyA9IGxvYWRDb25maWdGaWxlKCk7XG5cbi8vIEdldCBpbnB1dHMgKEdpdEh1YiBBY3Rpb24gaW5wdXRzIG92ZXJyaWRlIGNvbmZpZyBmaWxlIHZhbHVlcylcbmNvbnN0IGlzc3VlTnVtYmVyID0gY29yZS5nZXRJbnB1dCgnaXNzdWUtbnVtYmVyJywgeyByZXF1aXJlZDogdHJ1ZSB9KTtcbmNvbnN0IHBsYW5uaW5nTW9kZWwgPVxuICBjb3JlLmdldElucHV0KCdwbGFubmluZy1tb2RlbCcsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydwbGFubmluZy1tb2RlbCddIGFzIHN0cmluZyk7XG5jb25zdCB0d29TdGFnZVBsYW5uaW5nSW5wdXQgPVxuICBjb3JlLmdldElucHV0KCd0d28tc3RhZ2VkLXBsYW5uaW5nJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ3R3by1zdGFnZWQtcGxhbm5pbmcnXSBhcyBzdHJpbmcpO1xuY29uc3QgdHdvU3RhZ2VQbGFubmluZyA9IHR3b1N0YWdlUGxhbm5pbmdJbnB1dCAhPT0gJ2ZhbHNlJztcbmNvbnN0IHJlYXNvbmluZ0VmZm9ydCA9IChjb3JlLmdldElucHV0KCdyZWFzb25pbmctZWZmb3J0JywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHxcbiAgKGNvbmZpZ09wdGlvbnNbJ3JlYXNvbmluZy1lZmZvcnQnXSBhcyBzdHJpbmcpKSBhcyBSZWFzb25pbmdFZmZvcnQgfCB1bmRlZmluZWQ7XG5jb25zdCBkcnlSdW5JbnB1dCA9IGNvcmUuZ2V0SW5wdXQoJ2RyeS1ydW4nLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1snZHJ5LXJ1biddIGFzIHN0cmluZyk7XG5jb25zdCBkcnlSdW4gPSBkcnlSdW5JbnB1dCA9PT0gJ3RydWUnO1xuY29uc3QgY29kaW5nVG9vbCA9IChjb3JlLmdldElucHV0KCdjb2RpbmctdG9vbCcsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8XG4gIChjb25maWdPcHRpb25zWydjb2RpbmctdG9vbCddIGFzIHN0cmluZykgfHxcbiAgREVGQVVMVF9DT0RJTkdfVE9PTCkgYXMgQ29kaW5nVG9vbDtcbmNvbnN0IGFpZGVyRXh0cmFBcmdzID1cbiAgY29yZS5nZXRJbnB1dCgnYWlkZXItZXh0cmEtYXJncycsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydhaWRlci1leHRyYS1hcmdzJ10gYXMgc3RyaW5nKTtcbmNvbnN0IGNsYXVkZUNvZGVFeHRyYUFyZ3MgPVxuICBjb3JlLmdldElucHV0KCdjbGF1ZGUtY29kZS1leHRyYS1hcmdzJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ2NsYXVkZS1jb2RlLWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgY29kZXhFeHRyYUFyZ3MgPVxuICBjb3JlLmdldElucHV0KCdjb2RleC1leHRyYS1hcmdzJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ2NvZGV4LWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgZ2VtaW5pRXh0cmFBcmdzID1cbiAgY29yZS5nZXRJbnB1dCgnZ2VtaW5pLWV4dHJhLWFyZ3MnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1snZ2VtaW5pLWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgcmVwb21peEV4dHJhQXJncyA9XG4gIGNvcmUuZ2V0SW5wdXQoJ3JlcG9taXgtZXh0cmEtYXJncycsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydyZXBvbWl4LWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgdGVzdENvbW1hbmQgPSBjb3JlLmdldElucHV0KCd0ZXN0LWNvbW1hbmQnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1sndGVzdC1jb21tYW5kJ10gYXMgc3RyaW5nKTtcbmNvbnN0IG1heFRlc3RBdHRlbXB0c0lucHV0ID1cbiAgY29yZS5nZXRJbnB1dCgnbWF4LXRlc3QtYXR0ZW1wdHMnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1snbWF4LXRlc3QtYXR0ZW1wdHMnXSBhcyBzdHJpbmcgfCBudW1iZXIpO1xuY29uc3QgbWF4VGVzdEF0dGVtcHRzID0gbWF4VGVzdEF0dGVtcHRzSW5wdXRcbiAgPyBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKG1heFRlc3RBdHRlbXB0c0lucHV0KSwgMTApXG4gIDogREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUztcbmNvbnN0IHJlbW92ZVBhdHRlcm4gPVxuICBjb3JlLmdldElucHV0KCdyZW1vdmUtcGF0dGVybicsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydyZW1vdmUtcGF0dGVybiddIGFzIHN0cmluZyk7XG5jb25zdCBub0JyYW5jaElucHV0ID0gY29yZS5nZXRJbnB1dCgnbm8tYnJhbmNoJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ25vLWJyYW5jaCddIGFzIHN0cmluZyk7XG5jb25zdCBub0JyYW5jaCA9IG5vQnJhbmNoSW5wdXQgPT09ICd0cnVlJztcbmNvbnN0IG5vZGVSdW50aW1lSW5wdXQgPSAoY29yZS5nZXRJbnB1dCgnbm9kZS1ydW50aW1lJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHxcbiAgKGNvbmZpZ09wdGlvbnNbJ25vZGUtcnVudGltZSddIGFzIHN0cmluZykgfHxcbiAgREVGQVVMVF9OT0RFX1JVTlRJTUUpIGFzIE5vZGVSdW50aW1lO1xuXG5pZiAocmVhc29uaW5nRWZmb3J0ICYmICFbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCddLmluY2x1ZGVzKHJlYXNvbmluZ0VmZm9ydCkpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBgSW52YWxpZCByZWFzb25pbmctZWZmb3J0IHZhbHVlOiAke3JlYXNvbmluZ0VmZm9ydH0uIFVzaW5nIGRlZmF1bHQuIFZhbGlkIHZhbHVlcyBhcmU6IGxvdywgbWVkaXVtLCBoaWdoYFxuICApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmlmICghWydhaWRlcicsICdjbGF1ZGUtY29kZScsICdjb2RleC1jbGknLCAnZ2VtaW5pLWNsaSddLmluY2x1ZGVzKGNvZGluZ1Rvb2wpKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYEludmFsaWQgY29kaW5nLXRvb2wgdmFsdWU6ICR7Y29kaW5nVG9vbH0uIFVzaW5nIGRlZmF1bHQuIFZhbGlkIHZhbHVlcyBhcmU6IGFpZGVyLCBjbGF1ZGUtY29kZSwgY29kZXgtY2xpLCBnZW1pbmktY2xpYFxuICApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmlmIChub2RlUnVudGltZUlucHV0ICYmICFbJ25vZGUnLCAnYnVuJywgJ25weCcsICdidW54J10uaW5jbHVkZXMobm9kZVJ1bnRpbWVJbnB1dCkpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICBgSW52YWxpZCBub2RlLXJ1bnRpbWUgdmFsdWU6ICR7bm9kZVJ1bnRpbWVJbnB1dH0uIFVzaW5nIGRlZmF1bHQuIFZhbGlkIHZhbHVlcyBhcmU6IG5vZGUgKG5weCkgYW5kIGJ1biAoYnVueClgXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTm9ybWFsaXplIHRoZSBydW50aW1lIHZhbHVlIChjb252ZXJ0IGFsaWFzZXMgdG8gYWN0dWFsIGNvbW1hbmRzKVxuY29uc3Qgbm9kZVJ1bnRpbWU6IE5vZGVSdW50aW1lQWN0dWFsID0gbm9ybWFsaXplTm9kZVJ1bnRpbWUobm9kZVJ1bnRpbWVJbnB1dCk7XG5cbi8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vY2xpL2NsaS9pc3N1ZXMvODQ0MSNpc3N1ZWNvbW1lbnQtMTg3MDI3MTg1N1xuZnMucm1TeW5jKHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ2doJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxudm9pZCBtYWluKHtcbiAgYWlkZXJFeHRyYUFyZ3MsXG4gIGNsYXVkZUNvZGVFeHRyYUFyZ3MsXG4gIGNvZGV4RXh0cmFBcmdzLFxuICBnZW1pbmlFeHRyYUFyZ3MsXG4gIGNvZGluZ1Rvb2wsXG4gIHR3b1N0YWdlUGxhbm5pbmcsXG4gIGRyeVJ1bixcbiAgbm9CcmFuY2gsXG4gIG5vZGVSdW50aW1lLFxuICBpc3N1ZU51bWJlcjogTnVtYmVyKGlzc3VlTnVtYmVyKSxcbiAgbWF4VGVzdEF0dGVtcHRzLFxuICBwbGFubmluZ01vZGVsLFxuICByZWFzb25pbmdFZmZvcnQsXG4gIHJlcG9taXhFeHRyYUFyZ3MsXG4gIHRlc3RDb21tYW5kLFxuICByZW1vdmVQYXR0ZXJuLFxufSk7XG4iXSwibmFtZXMiOlsiY29uZmlnT3B0aW9ucyIsImxvYWRDb25maWdGaWxlIiwiaXNzdWVOdW1iZXIiLCJjb3JlIiwiZ2V0SW5wdXQiLCJyZXF1aXJlZCIsInBsYW5uaW5nTW9kZWwiLCJ0d29TdGFnZVBsYW5uaW5nIiwicmVhc29uaW5nRWZmb3J0IiwiZHJ5UnVuIiwiY29kaW5nVG9vbCIsIkRFRkFVTFRfQ09ESU5HX1RPT0wiLCJhaWRlckV4dHJhQXJncyIsImNsYXVkZUNvZGVFeHRyYUFyZ3MiLCJjb2RleEV4dHJhQXJncyIsImdlbWluaUV4dHJhQXJncyIsInJlcG9taXhFeHRyYUFyZ3MiLCJ0ZXN0Q29tbWFuZCIsIm1heFRlc3RBdHRlbXB0c0lucHV0IiwibWF4VGVzdEF0dGVtcHRzIiwiTnVtYmVyIiwicGFyc2VJbnQiLCJTdHJpbmciLCJERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTIiwicmVtb3ZlUGF0dGVybiIsIm5vQnJhbmNoIiwibm9kZVJ1bnRpbWVJbnB1dCIsIkRFRkFVTFRfTk9ERV9SVU5USU1FIiwiaW5jbHVkZXMiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsIm5vZGVSdW50aW1lIiwibm9ybWFsaXplTm9kZVJ1bnRpbWUiLCJmcyIsInJtU3luYyIsInBhdGgiLCJqb2luIiwib3MiLCJob21lZGlyIiwiZm9yY2UiLCJyZWN1cnNpdmUiLCJtYWluIl0sIm1hcHBpbmdzIjoidWlCQVVBLE1BQU1BLEVBQWdCQyxJQUdoQkMsRUFBY0MsRUFBS0MsU0FBUyxlQUFnQixDQUFFQyxVQUFVLElBQ3hEQyxFQUNKSCxFQUFLQyxTQUFTLGlCQUFrQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsa0JBR25FTyxFQUE2QyxXQURqREosRUFBS0MsU0FBUyxzQkFBdUIsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLHdCQUV4RVEsRUFBbUJMLEVBQUtDLFNBQVMsbUJBQW9CLENBQUVDLFVBQVUsS0FDcEVMLEVBQWMsb0JBRVhTLEVBQXlCLFVBRFhOLEVBQUtDLFNBQVMsVUFBVyxDQUFFQyxVQUFVLEtBQWFMLEVBQWMsWUFFOUVVLEVBQWNQLEVBQUtDLFNBQVMsY0FBZSxDQUFFQyxVQUFVLEtBQzFETCxFQUFjLGdCQUNmVyxFQUNJQyxFQUNKVCxFQUFLQyxTQUFTLG1CQUFvQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsb0JBQ3JFYSxFQUNKVixFQUFLQyxTQUFTLHlCQUEwQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsMEJBQzNFYyxFQUNKWCxFQUFLQyxTQUFTLG1CQUFvQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsb0JBQ3JFZSxFQUNKWixFQUFLQyxTQUFTLG9CQUFxQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMscUJBQ3RFZ0IsRUFDSmIsRUFBS0MsU0FBUyxxQkFBc0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLHNCQUN2RWlCLEVBQWNkLEVBQUtDLFNBQVMsZUFBZ0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLGdCQUNuRmtCLEVBQ0pmLEVBQUtDLFNBQVMsb0JBQXFCLENBQUVDLFVBQVUsS0FBYUwsRUFBYyxxQkFDdEVtQixFQUFrQkQsRUFDcEJFLE9BQU9DLFNBQVNDLE9BQU9KLEdBQXVCLElBQzlDSyxFQUNFQyxFQUNKckIsRUFBS0MsU0FBUyxpQkFBa0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLGtCQUVuRXlCLEVBQTZCLFVBRGJ0QixFQUFLQyxTQUFTLFlBQWEsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLGNBRWxGMEIsRUFBb0J2QixFQUFLQyxTQUFTLGVBQWdCLENBQUVDLFVBQVUsS0FDakVMLEVBQWMsaUJBQ2YyQixFQUVFbkIsSUFBb0IsQ0FBQyxNQUFPLFNBQVUsUUFBUW9CLFNBQVNwQixLQUN6RHFCLFFBQVFDLE1BQ04sbUNBQW1DdEIseURBRXJDdUIsUUFBUUMsS0FBSyxJQUdWLENBQUMsUUFBUyxjQUFlLFlBQWEsY0FBY0osU0FBU2xCLEtBQ2hFbUIsUUFBUUMsTUFDTiw4QkFBOEJwQixpRkFFaENxQixRQUFRQyxLQUFLLElBR1hOLElBQXFCLENBQUMsT0FBUSxNQUFPLE1BQU8sUUFBUUUsU0FBU0YsS0FDL0RHLFFBQVFDLE1BQ04sK0JBQStCSixpRUFFakNLLFFBQVFDLEtBQUssSUFJZixNQUFNQyxFQUFpQ0MsRUFBcUJSLEdBRzVEUyxFQUFHQyxPQUFPQyxFQUFLQyxLQUFLQyxFQUFHQyxVQUFXLFVBQVcsTUFBTyxDQUFFQyxPQUFPLEVBQU1DLFdBQVcsSUFFekVDLEVBQUssQ0FDUi9CLGlCQUNBQyxzQkFDQUMsaUJBQ0FDLGtCQUNBTCxhQUNBSCxtQkFDQUUsU0FDQWdCLFdBQ0FRLGNBQ0EvQixZQUFha0IsT0FBT2xCLEdBQ3BCaUIsa0JBQ0FiLGdCQUNBRSxrQkFDQVEsbUJBQ0FDLGNBQ0FPIn0=
1
+ import e from"node:fs";import r from"node:os";import t from"node:path";import o from"@actions/core";import{l as i,D as n,a,m as d,b as s}from"./main-DcT2jGgm.js";import"yaml";import"ansis";import"dotenv";import"node:child_process";import"@octokit/graphql";import"@octokit/rest";import"@ai-sdk/amazon-bedrock";import"@ai-sdk/anthropic";import"@ai-sdk/azure";import"@ai-sdk/google";import"@ai-sdk/google-vertex";import"@ai-sdk/openai";import"@ai-sdk/xai";import"@openrouter/ai-sdk-provider";import"ai";import"ai-v4";import"ollama-ai-provider-v2";const g=["low","medium","high"],m=["aider","claude-code","codex-cli","gemini-cli"],u=["node","bun","npx","bunx"];function p(e,r,t){e&&!r.includes(e)&&(console.error(`Invalid ${t} value: ${e}. Valid values are: ${r.join(", ")}`),process.exit(1))}const c=i(),l=o.getInput("issue-number",{required:!0}),x=o.getInput("planning-model",{required:!1})||c["planning-model"],f="false"!==(o.getInput("two-staged-planning",{required:!1})||String(c["two-staged-planning"]??"")),I=o.getInput("reasoning-effort",{required:!1})||c["reasoning-effort"],q="true"===(o.getInput("dry-run",{required:!1})||String(c["dry-run"]??"")),v=o.getInput("coding-tool",{required:!1})||c["coding-tool"]||n,b=o.getInput("aider-extra-args",{required:!1})||c["aider-extra-args"],h=o.getInput("claude-code-extra-args",{required:!1})||c["claude-code-extra-args"],k=o.getInput("codex-extra-args",{required:!1})||c["codex-extra-args"],E=o.getInput("gemini-extra-args",{required:!1})||c["gemini-extra-args"],S=o.getInput("repomix-extra-args",{required:!1})||c["repomix-extra-args"],A=o.getInput("test-command",{required:!1})||c["test-command"],y=o.getInput("max-test-attempts",{required:!1})||c["max-test-attempts"],w=y?Number.parseInt(String(y),10):s,R=o.getInput("remove-pattern",{required:!1})||c["remove-pattern"],T="true"===(o.getInput("no-branch",{required:!1})||String(c["no-branch"]??"")),j="true"===(o.getInput("verbose",{required:!1})||String(c.verbose??"")),N=o.getInput("node-runtime",{required:!1})||c["node-runtime"]||a;var $;p(($={reasoningEffort:I,codingTool:v,nodeRuntime:N}).reasoningEffort,g,"reasoning-effort"),p($.codingTool,m,"coding-tool"),p($.nodeRuntime,u,"node-runtime"),e.rmSync(t.join(r.homedir(),".config","gh"),{force:!0,recursive:!0}),d({aiderExtraArgs:b,claudeCodeExtraArgs:h,codexExtraArgs:k,geminiExtraArgs:E,codingTool:v,twoStagePlanning:f,dryRun:q,noBranch:T,nodeRuntime:N,issueNumber:Number(l),maxTestAttempts:w,planningModel:x,reasoningEffort:I,repomixExtraArgs:S,testCommand:A,removePattern:R,verbose:j});
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvdmFsaWRhdGlvbi50cyIsIi4uL3NyYy9hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWYWxpZGF0aW9uIGNvbnN0YW50cyBhbmQgdXRpbGl0aWVzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFZBTElEX1JFQVNPTklOR19FRkZPUlRTID0gWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBWQUxJRF9DT0RJTkdfVE9PTFMgPSBbJ2FpZGVyJywgJ2NsYXVkZS1jb2RlJywgJ2NvZGV4LWNsaScsICdnZW1pbmktY2xpJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgVkFMSURfTk9ERV9SVU5USU1FUyA9IFsnbm9kZScsICdidW4nLCAnbnB4JywgJ2J1bngnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGNob2ljZSBhZ2FpbnN0IGFsbG93ZWQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNob2ljZTxUIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10+KFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjaG9pY2VzOiBULFxuICBvcHRpb25OYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAodmFsdWUgJiYgIWNob2ljZXMuaW5jbHVkZXModmFsdWUgYXMgVFtudW1iZXJdKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgJHtvcHRpb25OYW1lfSB2YWx1ZTogJHt2YWx1ZX0uIFZhbGlkIHZhbHVlcyBhcmU6ICR7Y2hvaWNlcy5qb2luKCcsICcpfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFsbCBtYWluIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFpbk9wdGlvbnMob3B0aW9uczoge1xuICByZWFzb25pbmdFZmZvcnQ/OiBzdHJpbmc7XG4gIGNvZGluZ1Rvb2w/OiBzdHJpbmc7XG4gIG5vZGVSdW50aW1lPzogc3RyaW5nO1xufSk6IHZvaWQge1xuICB2YWxpZGF0ZUNob2ljZShvcHRpb25zLnJlYXNvbmluZ0VmZm9ydCwgVkFMSURfUkVBU09OSU5HX0VGRk9SVFMsICdyZWFzb25pbmctZWZmb3J0Jyk7XG4gIHZhbGlkYXRlQ2hvaWNlKG9wdGlvbnMuY29kaW5nVG9vbCwgVkFMSURfQ09ESU5HX1RPT0xTLCAnY29kaW5nLXRvb2wnKTtcbiAgdmFsaWRhdGVDaG9pY2Uob3B0aW9ucy5ub2RlUnVudGltZSwgVkFMSURfTk9ERV9SVU5USU1FUywgJ25vZGUtcnVudGltZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBjb3JlIGZyb20gJ0BhY3Rpb25zL2NvcmUnO1xuaW1wb3J0IHsgbG9hZENvbmZpZ0ZpbGUgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX0NPRElOR19UT09MLCBERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTLCBERUZBVUxUX05PREVfUlVOVElNRSB9IGZyb20gJy4vZGVmYXVsdE9wdGlvbnMuanMnO1xuaW1wb3J0IHsgbWFpbiB9IGZyb20gJy4vbWFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENvZGluZ1Rvb2wsIE5vZGVSdW50aW1lLCBSZWFzb25pbmdFZmZvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlTWFpbk9wdGlvbnMgfSBmcm9tICcuL3V0aWxzL3ZhbGlkYXRpb24uanMnO1xuXG5jb25zdCBjb25maWdPcHRpb25zID0gbG9hZENvbmZpZ0ZpbGUoKTtcblxuLy8gR2V0IGlucHV0cyAoR2l0SHViIEFjdGlvbiBpbnB1dHMgb3ZlcnJpZGUgY29uZmlnIGZpbGUgdmFsdWVzKVxuY29uc3QgaXNzdWVOdW1iZXIgPSBjb3JlLmdldElucHV0KCdpc3N1ZS1udW1iZXInLCB7IHJlcXVpcmVkOiB0cnVlIH0pO1xuY29uc3QgcGxhbm5pbmdNb2RlbCA9XG4gIGNvcmUuZ2V0SW5wdXQoJ3BsYW5uaW5nLW1vZGVsJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ3BsYW5uaW5nLW1vZGVsJ10gYXMgc3RyaW5nKTtcbmNvbnN0IHR3b1N0YWdlUGxhbm5pbmdJbnB1dCA9XG4gIGNvcmUuZ2V0SW5wdXQoJ3R3by1zdGFnZWQtcGxhbm5pbmcnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCBTdHJpbmcoY29uZmlnT3B0aW9uc1sndHdvLXN0YWdlZC1wbGFubmluZyddID8/ICcnKTtcbmNvbnN0IHR3b1N0YWdlUGxhbm5pbmcgPSB0d29TdGFnZVBsYW5uaW5nSW5wdXQgIT09ICdmYWxzZSc7XG5jb25zdCByZWFzb25pbmdFZmZvcnQgPSAoY29yZS5nZXRJbnB1dCgncmVhc29uaW5nLWVmZm9ydCcsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8XG4gIChjb25maWdPcHRpb25zWydyZWFzb25pbmctZWZmb3J0J10gYXMgc3RyaW5nKSkgYXMgUmVhc29uaW5nRWZmb3J0IHwgdW5kZWZpbmVkO1xuY29uc3QgZHJ5UnVuSW5wdXQgPSBjb3JlLmdldElucHV0KCdkcnktcnVuJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgU3RyaW5nKGNvbmZpZ09wdGlvbnNbJ2RyeS1ydW4nXSA/PyAnJyk7XG5jb25zdCBkcnlSdW4gPSBkcnlSdW5JbnB1dCA9PT0gJ3RydWUnO1xuY29uc3QgY29kaW5nVG9vbCA9IChjb3JlLmdldElucHV0KCdjb2RpbmctdG9vbCcsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8XG4gIChjb25maWdPcHRpb25zWydjb2RpbmctdG9vbCddIGFzIHN0cmluZykgfHxcbiAgREVGQVVMVF9DT0RJTkdfVE9PTCkgYXMgQ29kaW5nVG9vbDtcbmNvbnN0IGFpZGVyRXh0cmFBcmdzID1cbiAgY29yZS5nZXRJbnB1dCgnYWlkZXItZXh0cmEtYXJncycsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydhaWRlci1leHRyYS1hcmdzJ10gYXMgc3RyaW5nKTtcbmNvbnN0IGNsYXVkZUNvZGVFeHRyYUFyZ3MgPVxuICBjb3JlLmdldElucHV0KCdjbGF1ZGUtY29kZS1leHRyYS1hcmdzJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ2NsYXVkZS1jb2RlLWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgY29kZXhFeHRyYUFyZ3MgPVxuICBjb3JlLmdldElucHV0KCdjb2RleC1leHRyYS1hcmdzJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgKGNvbmZpZ09wdGlvbnNbJ2NvZGV4LWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgZ2VtaW5pRXh0cmFBcmdzID1cbiAgY29yZS5nZXRJbnB1dCgnZ2VtaW5pLWV4dHJhLWFyZ3MnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1snZ2VtaW5pLWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgcmVwb21peEV4dHJhQXJncyA9XG4gIGNvcmUuZ2V0SW5wdXQoJ3JlcG9taXgtZXh0cmEtYXJncycsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydyZXBvbWl4LWV4dHJhLWFyZ3MnXSBhcyBzdHJpbmcpO1xuY29uc3QgdGVzdENvbW1hbmQgPSBjb3JlLmdldElucHV0KCd0ZXN0LWNvbW1hbmQnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1sndGVzdC1jb21tYW5kJ10gYXMgc3RyaW5nKTtcbmNvbnN0IG1heFRlc3RBdHRlbXB0c0lucHV0ID1cbiAgY29yZS5nZXRJbnB1dCgnbWF4LXRlc3QtYXR0ZW1wdHMnLCB7IHJlcXVpcmVkOiBmYWxzZSB9KSB8fCAoY29uZmlnT3B0aW9uc1snbWF4LXRlc3QtYXR0ZW1wdHMnXSBhcyBzdHJpbmcgfCBudW1iZXIpO1xuY29uc3QgbWF4VGVzdEF0dGVtcHRzID0gbWF4VGVzdEF0dGVtcHRzSW5wdXRcbiAgPyBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKG1heFRlc3RBdHRlbXB0c0lucHV0KSwgMTApXG4gIDogREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUztcbmNvbnN0IHJlbW92ZVBhdHRlcm4gPVxuICBjb3JlLmdldElucHV0KCdyZW1vdmUtcGF0dGVybicsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IChjb25maWdPcHRpb25zWydyZW1vdmUtcGF0dGVybiddIGFzIHN0cmluZyk7XG5jb25zdCBub0JyYW5jaElucHV0ID0gY29yZS5nZXRJbnB1dCgnbm8tYnJhbmNoJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHwgU3RyaW5nKGNvbmZpZ09wdGlvbnNbJ25vLWJyYW5jaCddID8/ICcnKTtcbmNvbnN0IG5vQnJhbmNoID0gbm9CcmFuY2hJbnB1dCA9PT0gJ3RydWUnO1xuY29uc3QgdmVyYm9zZUlucHV0ID0gY29yZS5nZXRJbnB1dCgndmVyYm9zZScsIHsgcmVxdWlyZWQ6IGZhbHNlIH0pIHx8IFN0cmluZyhjb25maWdPcHRpb25zLnZlcmJvc2UgPz8gJycpO1xuY29uc3QgdmVyYm9zZSA9IHZlcmJvc2VJbnB1dCA9PT0gJ3RydWUnO1xuY29uc3Qgbm9kZVJ1bnRpbWUgPSAoY29yZS5nZXRJbnB1dCgnbm9kZS1ydW50aW1lJywgeyByZXF1aXJlZDogZmFsc2UgfSkgfHxcbiAgKGNvbmZpZ09wdGlvbnNbJ25vZGUtcnVudGltZSddIGFzIHN0cmluZykgfHxcbiAgREVGQVVMVF9OT0RFX1JVTlRJTUUpIGFzIE5vZGVSdW50aW1lO1xuXG4vLyBWYWxpZGF0ZSBhbGwgb3B0aW9ucyB1c2luZyBzaGFyZWQgdXRpbGl0eVxudmFsaWRhdGVNYWluT3B0aW9ucyh7XG4gIHJlYXNvbmluZ0VmZm9ydCxcbiAgY29kaW5nVG9vbCxcbiAgbm9kZVJ1bnRpbWUsXG59KTtcblxuLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9jbGkvY2xpL2lzc3Vlcy84NDQxI2lzc3VlY29tbWVudC0xODcwMjcxODU3XG5mcy5ybVN5bmMocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnZ2gnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG52b2lkIG1haW4oe1xuICBhaWRlckV4dHJhQXJncyxcbiAgY2xhdWRlQ29kZUV4dHJhQXJncyxcbiAgY29kZXhFeHRyYUFyZ3MsXG4gIGdlbWluaUV4dHJhQXJncyxcbiAgY29kaW5nVG9vbCxcbiAgdHdvU3RhZ2VQbGFubmluZyxcbiAgZHJ5UnVuLFxuICBub0JyYW5jaCxcbiAgbm9kZVJ1bnRpbWUsXG4gIGlzc3VlTnVtYmVyOiBOdW1iZXIoaXNzdWVOdW1iZXIpLFxuICBtYXhUZXN0QXR0ZW1wdHMsXG4gIHBsYW5uaW5nTW9kZWwsXG4gIHJlYXNvbmluZ0VmZm9ydCxcbiAgcmVwb21peEV4dHJhQXJncyxcbiAgdGVzdENvbW1hbmQsXG4gIHJlbW92ZVBhdHRlcm4sXG4gIHZlcmJvc2UsXG59KTtcbiJdLCJuYW1lcyI6WyJWQUxJRF9SRUFTT05JTkdfRUZGT1JUUyIsIlZBTElEX0NPRElOR19UT09MUyIsIlZBTElEX05PREVfUlVOVElNRVMiLCJ2YWxpZGF0ZUNob2ljZSIsInZhbHVlIiwiY2hvaWNlcyIsIm9wdGlvbk5hbWUiLCJpbmNsdWRlcyIsImNvbnNvbGUiLCJlcnJvciIsImpvaW4iLCJwcm9jZXNzIiwiZXhpdCIsImNvbmZpZ09wdGlvbnMiLCJsb2FkQ29uZmlnRmlsZSIsImlzc3VlTnVtYmVyIiwiY29yZSIsImdldElucHV0IiwicmVxdWlyZWQiLCJwbGFubmluZ01vZGVsIiwidHdvU3RhZ2VQbGFubmluZyIsIlN0cmluZyIsInJlYXNvbmluZ0VmZm9ydCIsImRyeVJ1biIsImNvZGluZ1Rvb2wiLCJERUZBVUxUX0NPRElOR19UT09MIiwiYWlkZXJFeHRyYUFyZ3MiLCJjbGF1ZGVDb2RlRXh0cmFBcmdzIiwiY29kZXhFeHRyYUFyZ3MiLCJnZW1pbmlFeHRyYUFyZ3MiLCJyZXBvbWl4RXh0cmFBcmdzIiwidGVzdENvbW1hbmQiLCJtYXhUZXN0QXR0ZW1wdHNJbnB1dCIsIm1heFRlc3RBdHRlbXB0cyIsIk51bWJlciIsInBhcnNlSW50IiwiREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUyIsInJlbW92ZVBhdHRlcm4iLCJub0JyYW5jaCIsInZlcmJvc2UiLCJub2RlUnVudGltZSIsIkRFRkFVTFRfTk9ERV9SVU5USU1FIiwib3B0aW9ucyIsImZzIiwicm1TeW5jIiwicGF0aCIsIm9zIiwiaG9tZWRpciIsImZvcmNlIiwicmVjdXJzaXZlIiwibWFpbiJdLCJtYXBwaW5ncyI6ImdpQkFJTyxNQUFNQSxFQUEwQixDQUFDLE1BQU8sU0FBVSxRQUM1Q0MsRUFBcUIsQ0FBQyxRQUFTLGNBQWUsWUFBYSxjQUMzREMsRUFBc0IsQ0FBQyxPQUFRLE1BQU8sTUFBTyxRQUtuRCxTQUFTQyxFQUNkQyxFQUNBQyxFQUNBQyxHQUVJRixJQUFVQyxFQUFRRSxTQUFTSCxLQUM3QkksUUFBUUMsTUFBTSxXQUFXSCxZQUFxQkYsd0JBQTRCQyxFQUFRSyxLQUFLLFNBQ3ZGQyxRQUFRQyxLQUFLLEdBRWpCLENDVkEsTUFBTUMsRUFBZ0JDLElBR2hCQyxFQUFjQyxFQUFLQyxTQUFTLGVBQWdCLENBQUVDLFVBQVUsSUFDeERDLEVBQ0pILEVBQUtDLFNBQVMsaUJBQWtCLENBQUVDLFVBQVUsS0FBYUwsRUFBYyxrQkFHbkVPLEVBQTZDLFdBRGpESixFQUFLQyxTQUFTLHNCQUF1QixDQUFFQyxVQUFVLEtBQVlHLE9BQU9SLEVBQWMsd0JBQTBCLEtBRXhHUyxFQUFtQk4sRUFBS0MsU0FBUyxtQkFBb0IsQ0FBRUMsVUFBVSxLQUNwRUwsRUFBYyxvQkFFWFUsRUFBeUIsVUFEWFAsRUFBS0MsU0FBUyxVQUFXLENBQUVDLFVBQVUsS0FBWUcsT0FBT1IsRUFBYyxZQUFjLEtBRWxHVyxFQUFjUixFQUFLQyxTQUFTLGNBQWUsQ0FBRUMsVUFBVSxLQUMxREwsRUFBYyxnQkFDZlksRUFDSUMsRUFDSlYsRUFBS0MsU0FBUyxtQkFBb0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLG9CQUNyRWMsRUFDSlgsRUFBS0MsU0FBUyx5QkFBMEIsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLDBCQUMzRWUsRUFDSlosRUFBS0MsU0FBUyxtQkFBb0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLG9CQUNyRWdCLEVBQ0piLEVBQUtDLFNBQVMsb0JBQXFCLENBQUVDLFVBQVUsS0FBYUwsRUFBYyxxQkFDdEVpQixFQUNKZCxFQUFLQyxTQUFTLHFCQUFzQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsc0JBQ3ZFa0IsRUFBY2YsRUFBS0MsU0FBUyxlQUFnQixDQUFFQyxVQUFVLEtBQWFMLEVBQWMsZ0JBQ25GbUIsRUFDSmhCLEVBQUtDLFNBQVMsb0JBQXFCLENBQUVDLFVBQVUsS0FBYUwsRUFBYyxxQkFDdEVvQixFQUFrQkQsRUFDcEJFLE9BQU9DLFNBQVNkLE9BQU9XLEdBQXVCLElBQzlDSSxFQUNFQyxFQUNKckIsRUFBS0MsU0FBUyxpQkFBa0IsQ0FBRUMsVUFBVSxLQUFhTCxFQUFjLGtCQUVuRXlCLEVBQTZCLFVBRGJ0QixFQUFLQyxTQUFTLFlBQWEsQ0FBRUMsVUFBVSxLQUFZRyxPQUFPUixFQUFjLGNBQWdCLEtBR3hHMEIsRUFBMkIsVUFEWnZCLEVBQUtDLFNBQVMsVUFBVyxDQUFFQyxVQUFVLEtBQVlHLE9BQU9SLEVBQWMwQixTQUFXLEtBRWhHQyxFQUFleEIsRUFBS0MsU0FBUyxlQUFnQixDQUFFQyxVQUFVLEtBQzVETCxFQUFjLGlCQUNmNEIsRUR6QkssSUFBNkJDLEVBS2xDdkMsR0FMa0N1QyxFQzRCaEIsQ0FDbEJwQixrQkFDQUUsYUFDQWdCLGdCRDFCdUJsQixnQkFBaUJ0QixFQUF5QixvQkFDakVHLEVBQWV1QyxFQUFRbEIsV0FBWXZCLEVBQW9CLGVBQ3ZERSxFQUFldUMsRUFBUUYsWUFBYXRDLEVBQXFCLGdCQzRCM0R5QyxFQUFHQyxPQUFPQyxFQUFLbkMsS0FBS29DLEVBQUdDLFVBQVcsVUFBVyxNQUFPLENBQUVDLE9BQU8sRUFBTUMsV0FBVyxJQUV6RUMsRUFBSyxDQUNSeEIsaUJBQ0FDLHNCQUNBQyxpQkFDQUMsa0JBQ0FMLGFBQ0FKLG1CQUNBRyxTQUNBZSxXQUNBRSxjQUNBekIsWUFBYW1CLE9BQU9uQixHQUNwQmtCLGtCQUNBZCxnQkFDQUcsa0JBQ0FRLG1CQUNBQyxjQUNBTSxnQkFDQUUifQ==
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import o from"node:path";import t from"node:process";import i from"yargs";import{hideBin as a}from"yargs/helpers";import{l as n,D as r,c as s,d as p,e as d,f as m,g as l,b as g,a as c,n as u,m as f}from"./main-DA3u-sLa.js";import"yaml";import"ansis";import"dotenv";import"node:child_process";import"@octokit/graphql";import"@octokit/rest";import"@ai-sdk/amazon-bedrock";import"@ai-sdk/anthropic";import"@ai-sdk/azure";import"@ai-sdk/google";import"@ai-sdk/google-vertex";import"@ai-sdk/openai";import"@ai-sdk/xai";import"@openrouter/ai-sdk-provider";import"ai";import"ai-v4";import"ollama-ai-provider-v2";const h=await i(a(t.argv)).config(n()).option("issue-number",{alias:"i",description:"GitHub issue number to process",type:"number",demandOption:!0}).option("planning-model",{alias:"m",description:"LLM for planning code changes. Must use llmlite format: provider/model (e.g., openai/gpt-4.1, azure/gpt-4.1, gemini/gemini-2.5-pro, anthropic/claude-4-sonnet-latest, bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0, vertex/gemini-2.5-pro, xai/grok-4)",type:"string"}).option("two-staged-planning",{alias:"p",description:"Enable two-staged planning: first select relevant files, then generate detailed implementation plans (increases LLM cost but improves code quality)",type:"boolean",default:!0}).option("reasoning-effort",{alias:"e",description:"Constrains effort on reasoning for planning models. Supported values are low, medium, and high.",type:"string",choices:["low","medium","high"]}).option("coding-tool",{alias:"c",description:"Coding tool to use for making changes",type:"string",choices:["aider","claude-code","codex-cli","gemini-cli"],default:r}).option("aider-extra-args",{alias:"a",description:'Additional arguments to pass to Aider ("--yes-always --no-check-update --no-show-release-notes" is always applied)',type:"string",default:s}).option("claude-code-extra-args",{description:'Additional arguments to pass to Claude Code ("--dangerously-skip-permissions" is always applied, "--print" is applied only in CI)',type:"string",default:p}).option("codex-extra-args",{description:"Additional arguments to pass to Codex CLI (nothing is always applied)",type:"string",default:d}).option("gemini-extra-args",{description:'Additional arguments to pass to Gemini CLI ("--yolo" is always applied)',type:"string",default:m}).option("repomix-extra-args",{alias:"r",description:"Additional arguments for repomix when generating context",type:"string",default:l}).option("test-command",{alias:"t",description:"Command to run after the coding tool applies changes. If it fails, the assistant will try to fix it.",type:"string"}).option("max-test-attempts",{description:"Maximum number of attempts to fix test failures",type:"number",default:g}).option("dry-run",{alias:"d",description:"Run without making actual changes (no branch creation, no PR)",type:"boolean",default:!1}).option("remove-pattern",{description:"RegExp pattern to remove from issue and PR descriptions",type:"string"}).option("no-branch",{alias:"n",description:"Do not create a new branch, commit changes directly to the base branch",type:"boolean",default:!1}).option("node-runtime",{description:"Node.js runtime to use for running tools",type:"string",choices:["node","bun","npx","bunx"],default:c}).option("working-dir",{alias:"w",description:"Working directory path for commands",type:"string"}).version(function(){let t=import.meta.dir||o.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(o.join(t,"package.json"));)t=o.dirname(t);return JSON.parse(e.readFileSync(o.join(t,"package.json"),"utf8")).version}()).help().argv;h["working-dir"]&&(t.chdir(h["working-dir"]),console.info(`Changed working directory to: ${t.cwd()}`));const x=u(h["node-runtime"]);await f({aiderExtraArgs:h["aider-extra-args"],claudeCodeExtraArgs:h["claude-code-extra-args"],codexExtraArgs:h["codex-extra-args"],geminiExtraArgs:h["gemini-extra-args"],codingTool:h["coding-tool"],dryRun:h["dry-run"],noBranch:h["no-branch"],nodeRuntime:x,twoStagePlanning:h["two-staged-planning"],issueNumber:h["issue-number"],maxTestAttempts:h["max-test-attempts"],planningModel:h["planning-model"],reasoningEffort:h["reasoning-effort"],repomixExtraArgs:h["repomix-extra-args"],testCommand:h["test-command"],removePattern:h["remove-pattern"]});
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB7IGxvYWRDb25maWdGaWxlIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTLFxuICBERUZBVUxUX0NMQVVERV9DT0RFX0VYVFJBX0FSR1MsXG4gIERFRkFVTFRfQ09ERVhfRVhUUkFfQVJHUyxcbiAgREVGQVVMVF9DT0RJTkdfVE9PTCxcbiAgREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyxcbiAgREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUyxcbiAgREVGQVVMVF9OT0RFX1JVTlRJTUUsXG4gIERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTLFxufSBmcm9tICcuL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB7IG1haW4gfSBmcm9tICcuL21haW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplTm9kZVJ1bnRpbWUgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kaW5nVG9vbCwgTm9kZVJ1bnRpbWUsIE5vZGVSdW50aW1lQWN0dWFsLCBSZWFzb25pbmdFZmZvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1c2luZyB5YXJncyAoQ0xJIG9wdGlvbnMgb3ZlcnJpZGUgY29uZmlnKVxuY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLmNvbmZpZyhsb2FkQ29uZmlnRmlsZSgpKVxuICAvLyBPcHRpb25zIHNhbWUgd2l0aCB0aGUgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dcbiAgLm9wdGlvbignaXNzdWUtbnVtYmVyJywge1xuICAgIGFsaWFzOiAnaScsXG4gICAgZGVzY3JpcHRpb246ICdHaXRIdWIgaXNzdWUgbnVtYmVyIHRvIHByb2Nlc3MnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgfSlcbiAgLm9wdGlvbigncGxhbm5pbmctbW9kZWwnLCB7XG4gICAgYWxpYXM6ICdtJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdMTE0gZm9yIHBsYW5uaW5nIGNvZGUgY2hhbmdlcy4gTXVzdCB1c2UgbGxtbGl0ZSBmb3JtYXQ6IHByb3ZpZGVyL21vZGVsIChlLmcuLCBvcGVuYWkvZ3B0LTQuMSwgYXp1cmUvZ3B0LTQuMSwgZ2VtaW5pL2dlbWluaS0yLjUtcHJvLCBhbnRocm9waWMvY2xhdWRlLTQtc29ubmV0LWxhdGVzdCwgYmVkcm9jay91cy5hbnRocm9waWMuY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0LXYxOjAsIHZlcnRleC9nZW1pbmktMi41LXBybywgeGFpL2dyb2stNCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9KVxuICAub3B0aW9uKCd0d28tc3RhZ2VkLXBsYW5uaW5nJywge1xuICAgIGFsaWFzOiAncCcsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW5hYmxlIHR3by1zdGFnZWQgcGxhbm5pbmc6IGZpcnN0IHNlbGVjdCByZWxldmFudCBmaWxlcywgdGhlbiBnZW5lcmF0ZSBkZXRhaWxlZCBpbXBsZW1lbnRhdGlvbiBwbGFucyAoaW5jcmVhc2VzIExMTSBjb3N0IGJ1dCBpbXByb3ZlcyBjb2RlIHF1YWxpdHkpJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSlcbiAgLm9wdGlvbigncmVhc29uaW5nLWVmZm9ydCcsIHtcbiAgICBhbGlhczogJ2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29uc3RyYWlucyBlZmZvcnQgb24gcmVhc29uaW5nIGZvciBwbGFubmluZyBtb2RlbHMuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGxvdywgbWVkaXVtLCBhbmQgaGlnaC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnbG93JywgJ21lZGl1bScsICdoaWdoJ10sXG4gIH0pXG4gIC5vcHRpb24oJ2NvZGluZy10b29sJywge1xuICAgIGFsaWFzOiAnYycsXG4gICAgZGVzY3JpcHRpb246ICdDb2RpbmcgdG9vbCB0byB1c2UgZm9yIG1ha2luZyBjaGFuZ2VzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FpZGVyJywgJ2NsYXVkZS1jb2RlJywgJ2NvZGV4LWNsaScsICdnZW1pbmktY2xpJ10sXG4gICAgZGVmYXVsdDogREVGQVVMVF9DT0RJTkdfVE9PTCxcbiAgfSlcbiAgLm9wdGlvbignYWlkZXItZXh0cmEtYXJncycsIHtcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gQWlkZXIgKFwiLS15ZXMtYWx3YXlzIC0tbm8tY2hlY2stdXBkYXRlIC0tbm8tc2hvdy1yZWxlYXNlLW5vdGVzXCIgaXMgYWx3YXlzIGFwcGxpZWQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiBERUZBVUxUX0FJREVSX0VYVFJBX0FSR1MsXG4gIH0pXG4gIC5vcHRpb24oJ2NsYXVkZS1jb2RlLWV4dHJhLWFyZ3MnLCB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBDbGF1ZGUgQ29kZSAoXCItLWRhbmdlcm91c2x5LXNraXAtcGVybWlzc2lvbnNcIiBpcyBhbHdheXMgYXBwbGllZCwgXCItLXByaW50XCIgaXMgYXBwbGllZCBvbmx5IGluIENJKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogREVGQVVMVF9DTEFVREVfQ09ERV9FWFRSQV9BUkdTLFxuICB9KVxuICAub3B0aW9uKCdjb2RleC1leHRyYS1hcmdzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBDb2RleCBDTEkgKG5vdGhpbmcgaXMgYWx3YXlzIGFwcGxpZWQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiBERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MsXG4gIH0pXG4gIC5vcHRpb24oJ2dlbWluaS1leHRyYS1hcmdzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBHZW1pbmkgQ0xJIChcIi0teW9sb1wiIGlzIGFsd2F5cyBhcHBsaWVkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyxcbiAgfSlcbiAgLm9wdGlvbigncmVwb21peC1leHRyYS1hcmdzJywge1xuICAgIGFsaWFzOiAncicsXG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVwb21peCB3aGVuIGdlbmVyYXRpbmcgY29udGV4dCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MsXG4gIH0pXG4gIC5vcHRpb24oJ3Rlc3QtY29tbWFuZCcsIHtcbiAgICBhbGlhczogJ3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZCB0byBydW4gYWZ0ZXIgdGhlIGNvZGluZyB0b29sIGFwcGxpZXMgY2hhbmdlcy4gSWYgaXQgZmFpbHMsIHRoZSBhc3Npc3RhbnQgd2lsbCB0cnkgdG8gZml4IGl0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0pXG4gIC5vcHRpb24oJ21heC10ZXN0LWF0dGVtcHRzJywge1xuICAgIGRlc2NyaXB0aW9uOiAnTWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gZml4IHRlc3QgZmFpbHVyZXMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfTUFYX1RFU1RfQVRURU1QVFMsXG4gIH0pXG4gIC5vcHRpb24oJ2RyeS1ydW4nLCB7XG4gICAgYWxpYXM6ICdkJyxcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB3aXRob3V0IG1ha2luZyBhY3R1YWwgY2hhbmdlcyAobm8gYnJhbmNoIGNyZWF0aW9uLCBubyBQUiknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSlcbiAgLm9wdGlvbigncmVtb3ZlLXBhdHRlcm4nLCB7XG4gICAgZGVzY3JpcHRpb246ICdSZWdFeHAgcGF0dGVybiB0byByZW1vdmUgZnJvbSBpc3N1ZSBhbmQgUFIgZGVzY3JpcHRpb25zJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSlcbiAgLm9wdGlvbignbm8tYnJhbmNoJywge1xuICAgIGFsaWFzOiAnbicsXG4gICAgZGVzY3JpcHRpb246ICdEbyBub3QgY3JlYXRlIGEgbmV3IGJyYW5jaCwgY29tbWl0IGNoYW5nZXMgZGlyZWN0bHkgdG8gdGhlIGJhc2UgYnJhbmNoJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0pXG4gIC5vcHRpb24oJ25vZGUtcnVudGltZScsIHtcbiAgICBkZXNjcmlwdGlvbjogJ05vZGUuanMgcnVudGltZSB0byB1c2UgZm9yIHJ1bm5pbmcgdG9vbHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnbm9kZScsICdidW4nLCAnbnB4JywgJ2J1bngnXSxcbiAgICBkZWZhdWx0OiBERUZBVUxUX05PREVfUlVOVElNRSxcbiAgfSlcbiAgLy8gT3B0aW9ucyBvbmx5IGZvciB0aGlzIHN0YW5kYWxvbmUgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAub3B0aW9uKCd3b3JraW5nLWRpcicsIHtcbiAgICBhbGlhczogJ3cnLFxuICAgIGRlc2NyaXB0aW9uOiAnV29ya2luZyBkaXJlY3RvcnkgcGF0aCBmb3IgY29tbWFuZHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9KVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IGltcG9ydC5tZXRhLmRpciB8fCBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpLnZlcnNpb247XG59XG5cbmlmIChhcmd2Wyd3b3JraW5nLWRpciddKSB7XG4gIHByb2Nlc3MuY2hkaXIoYXJndlsnd29ya2luZy1kaXInXSk7XG4gIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCB3b3JraW5nIGRpcmVjdG9yeSB0bzogJHtwcm9jZXNzLmN3ZCgpfWApO1xufVxuXG4vLyBOb3JtYWxpemUgdGhlIHJ1bnRpbWUgdmFsdWUgKGNvbnZlcnQgYWxpYXNlcyB0byBhY3R1YWwgY29tbWFuZHMpXG5jb25zdCBub2RlUnVudGltZTogTm9kZVJ1bnRpbWVBY3R1YWwgPSBub3JtYWxpemVOb2RlUnVudGltZShhcmd2Wydub2RlLXJ1bnRpbWUnXSBhcyBOb2RlUnVudGltZSk7XG5cbmF3YWl0IG1haW4oe1xuICBhaWRlckV4dHJhQXJnczogYXJndlsnYWlkZXItZXh0cmEtYXJncyddLFxuICBjbGF1ZGVDb2RlRXh0cmFBcmdzOiBhcmd2WydjbGF1ZGUtY29kZS1leHRyYS1hcmdzJ10sXG4gIGNvZGV4RXh0cmFBcmdzOiBhcmd2Wydjb2RleC1leHRyYS1hcmdzJ10sXG4gIGdlbWluaUV4dHJhQXJnczogYXJndlsnZ2VtaW5pLWV4dHJhLWFyZ3MnXSxcbiAgY29kaW5nVG9vbDogYXJndlsnY29kaW5nLXRvb2wnXSBhcyBDb2RpbmdUb29sLFxuICBkcnlSdW46IGFyZ3ZbJ2RyeS1ydW4nXSxcbiAgbm9CcmFuY2g6IGFyZ3ZbJ25vLWJyYW5jaCddLFxuICBub2RlUnVudGltZSxcbiAgdHdvU3RhZ2VQbGFubmluZzogYXJndlsndHdvLXN0YWdlZC1wbGFubmluZyddLFxuICBpc3N1ZU51bWJlcjogYXJndlsnaXNzdWUtbnVtYmVyJ10sXG4gIG1heFRlc3RBdHRlbXB0czogYXJndlsnbWF4LXRlc3QtYXR0ZW1wdHMnXSxcbiAgcGxhbm5pbmdNb2RlbDogYXJndlsncGxhbm5pbmctbW9kZWwnXSxcbiAgcmVhc29uaW5nRWZmb3J0OiBhcmd2WydyZWFzb25pbmctZWZmb3J0J10gYXMgUmVhc29uaW5nRWZmb3J0LFxuICByZXBvbWl4RXh0cmFBcmdzOiBhcmd2WydyZXBvbWl4LWV4dHJhLWFyZ3MnXSxcbiAgdGVzdENvbW1hbmQ6IGFyZ3ZbJ3Rlc3QtY29tbWFuZCddLFxuICByZW1vdmVQYXR0ZXJuOiBhcmd2WydyZW1vdmUtcGF0dGVybiddLFxufSk7XG4iXSwibmFtZXMiOlsiYXJndiIsInlhcmdzIiwiaGlkZUJpbiIsInByb2Nlc3MiLCJjb25maWciLCJsb2FkQ29uZmlnRmlsZSIsIm9wdGlvbiIsImFsaWFzIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVtYW5kT3B0aW9uIiwiZGVmYXVsdCIsImNob2ljZXMiLCJERUZBVUxUX0NPRElOR19UT09MIiwiREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTIiwiREVGQVVMVF9DTEFVREVfQ09ERV9FWFRSQV9BUkdTIiwiREVGQVVMVF9DT0RFWF9FWFRSQV9BUkdTIiwiREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyIsIkRFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTIiwiREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUyIsIkRFRkFVTFRfTk9ERV9SVU5USU1FIiwidmVyc2lvbiIsInBhY2thZ2VKc29uRGlyIiwiZGlyIiwicGF0aCIsImRpcm5hbWUiLCJVUkwiLCJ1cmwiLCJwYXRobmFtZSIsImZzIiwiZXhpc3RzU3luYyIsImpvaW4iLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJnZXRWZXJzaW9uIiwiaGVscCIsImNoZGlyIiwiY29uc29sZSIsImluZm8iLCJjd2QiLCJub2RlUnVudGltZSIsIm5vcm1hbGl6ZU5vZGVSdW50aW1lIiwibWFpbiIsImFpZGVyRXh0cmFBcmdzIiwiY2xhdWRlQ29kZUV4dHJhQXJncyIsImNvZGV4RXh0cmFBcmdzIiwiZ2VtaW5pRXh0cmFBcmdzIiwiY29kaW5nVG9vbCIsImRyeVJ1biIsIm5vQnJhbmNoIiwidHdvU3RhZ2VQbGFubmluZyIsImlzc3VlTnVtYmVyIiwibWF4VGVzdEF0dGVtcHRzIiwicGxhbm5pbmdNb2RlbCIsInJlYXNvbmluZ0VmZm9ydCIsInJlcG9taXhFeHRyYUFyZ3MiLCJ0ZXN0Q29tbWFuZCIsInJlbW92ZVBhdHRlcm4iXSwibWFwcGluZ3MiOiJvbkJBcUJBLE1BQU1BLFFBQWFDLEVBQU1DLEVBQVFDLEVBQVFILE9BQ3RDSSxPQUFPQyxLQUVQQyxPQUFPLGVBQWdCLENBQ3RCQyxNQUFPLElBQ1BDLFlBQWEsaUNBQ2JDLEtBQU0sU0FDTkMsY0FBYyxJQUVmSixPQUFPLGlCQUFrQixDQUN4QkMsTUFBTyxJQUNQQyxZQUNFLCtQQUNGQyxLQUFNLFdBRVBILE9BQU8sc0JBQXVCLENBQzdCQyxNQUFPLElBQ1BDLFlBQ0Usc0pBQ0ZDLEtBQU0sVUFDTkUsU0FBUyxJQUVWTCxPQUFPLG1CQUFvQixDQUMxQkMsTUFBTyxJQUNQQyxZQUFhLGtHQUNiQyxLQUFNLFNBQ05HLFFBQVMsQ0FBQyxNQUFPLFNBQVUsVUFFNUJOLE9BQU8sY0FBZSxDQUNyQkMsTUFBTyxJQUNQQyxZQUFhLHdDQUNiQyxLQUFNLFNBQ05HLFFBQVMsQ0FBQyxRQUFTLGNBQWUsWUFBYSxjQUMvQ0QsUUFBU0UsSUFFVlAsT0FBTyxtQkFBb0IsQ0FDMUJDLE1BQU8sSUFDUEMsWUFDRSxxSEFDRkMsS0FBTSxTQUNORSxRQUFTRyxJQUVWUixPQUFPLHlCQUEwQixDQUNoQ0UsWUFDRSxvSUFDRkMsS0FBTSxTQUNORSxRQUFTSSxJQUVWVCxPQUFPLG1CQUFvQixDQUMxQkUsWUFBYSx3RUFDYkMsS0FBTSxTQUNORSxRQUFTSyxJQUVWVixPQUFPLG9CQUFxQixDQUMzQkUsWUFBYSwwRUFDYkMsS0FBTSxTQUNORSxRQUFTTSxJQUVWWCxPQUFPLHFCQUFzQixDQUM1QkMsTUFBTyxJQUNQQyxZQUFhLDJEQUNiQyxLQUFNLFNBQ05FLFFBQVNPLElBRVZaLE9BQU8sZUFBZ0IsQ0FDdEJDLE1BQU8sSUFDUEMsWUFBYSx1R0FDYkMsS0FBTSxXQUVQSCxPQUFPLG9CQUFxQixDQUMzQkUsWUFBYSxrREFDYkMsS0FBTSxTQUNORSxRQUFTUSxJQUVWYixPQUFPLFVBQVcsQ0FDakJDLE1BQU8sSUFDUEMsWUFBYSxnRUFDYkMsS0FBTSxVQUNORSxTQUFTLElBRVZMLE9BQU8saUJBQWtCLENBQ3hCRSxZQUFhLDBEQUNiQyxLQUFNLFdBRVBILE9BQU8sWUFBYSxDQUNuQkMsTUFBTyxJQUNQQyxZQUFhLHlFQUNiQyxLQUFNLFVBQ05FLFNBQVMsSUFFVkwsT0FBTyxlQUFnQixDQUN0QkUsWUFBYSwyQ0FDYkMsS0FBTSxTQUNORyxRQUFTLENBQUMsT0FBUSxNQUFPLE1BQU8sUUFDaENELFFBQVNTLElBR1ZkLE9BQU8sY0FBZSxDQUNyQkMsTUFBTyxJQUNQQyxZQUFhLHNDQUNiQyxLQUFNLFdBR1BZLFFBR0gsV0FDRSxJQUFJQyxjQUE2QkMsS0FBT0MsRUFBS0MsUUFBUSxJQUFJQyxnQkFBZ0JDLEtBQUtDLFVBQzlFLE1BQVFDLEVBQUdDLFdBQVdOLEVBQUtPLEtBQUtULEVBQWdCLGtCQUM5Q0EsRUFBaUJFLEVBQUtDLFFBQVFILEdBRWhDLE9BQU9VLEtBQUtDLE1BQU1KLEVBQUdLLGFBQWFWLEVBQUtPLEtBQUtULEVBQWdCLGdCQUFpQixTQUFTRCxPQUN4RixDQVRXYyxJQUNSQyxPQUFPcEMsS0FVTkEsRUFBSyxpQkFDUEcsRUFBUWtDLE1BQU1yQyxFQUFLLGdCQUNuQnNDLFFBQVFDLEtBQUssaUNBQWlDcEMsRUFBUXFDLFVBSXhELE1BQU1DLEVBQWlDQyxFQUFxQjFDLEVBQUssdUJBRTNEMkMsRUFBSyxDQUNUQyxlQUFnQjVDLEVBQUssb0JBQ3JCNkMsb0JBQXFCN0MsRUFBSywwQkFDMUI4QyxlQUFnQjlDLEVBQUssb0JBQ3JCK0MsZ0JBQWlCL0MsRUFBSyxxQkFDdEJnRCxXQUFZaEQsRUFBSyxlQUNqQmlELE9BQVFqRCxFQUFLLFdBQ2JrRCxTQUFVbEQsRUFBSyxhQUNmeUMsY0FDQVUsaUJBQWtCbkQsRUFBSyx1QkFDdkJvRCxZQUFhcEQsRUFBSyxnQkFDbEJxRCxnQkFBaUJyRCxFQUFLLHFCQUN0QnNELGNBQWV0RCxFQUFLLGtCQUNwQnVELGdCQUFpQnZELEVBQUssb0JBQ3RCd0QsaUJBQWtCeEQsRUFBSyxzQkFDdkJ5RCxZQUFhekQsRUFBSyxnQkFDbEIwRCxjQUFlMUQsRUFBSyJ9
1
+ import e from"node:fs";import o from"node:path";import t from"node:process";import i from"yargs";import{hideBin as a}from"yargs/helpers";import{l as n,D as r,c as s,d as p,e as d,f as m,g as l,b as g,a as c,m as u}from"./main-DcT2jGgm.js";import"yaml";import"ansis";import"dotenv";import"node:child_process";import"@octokit/graphql";import"@octokit/rest";import"@ai-sdk/amazon-bedrock";import"@ai-sdk/anthropic";import"@ai-sdk/azure";import"@ai-sdk/google";import"@ai-sdk/google-vertex";import"@ai-sdk/openai";import"@ai-sdk/xai";import"@openrouter/ai-sdk-provider";import"ai";import"ai-v4";import"ollama-ai-provider-v2";const f=await i(a(t.argv)).config(n()).option("issue-number",{alias:"i",description:"GitHub issue number to process",type:"number",demandOption:!0}).option("planning-model",{alias:"m",description:"LLM for planning code changes. Must use llmlite format: provider/model (e.g., openai/gpt-4.1, azure/gpt-4.1, gemini/gemini-2.5-pro, anthropic/claude-4-sonnet-latest, bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0, vertex/gemini-2.5-pro, xai/grok-4)",type:"string"}).option("two-staged-planning",{alias:"p",description:"Enable two-staged planning: first select relevant files, then generate detailed implementation plans (increases LLM cost but improves code quality)",type:"boolean",default:!0}).option("reasoning-effort",{alias:"e",description:"Constrains effort on reasoning for planning models. Supported values are low, medium, and high.",type:"string",choices:["low","medium","high"]}).option("coding-tool",{alias:"c",description:"Coding tool to use for making changes",type:"string",choices:["aider","claude-code","codex-cli","gemini-cli"],default:r}).option("aider-extra-args",{alias:"a",description:'Additional arguments to pass to Aider ("--yes-always --no-check-update --no-show-release-notes" is always applied)',type:"string",default:s}).option("claude-code-extra-args",{description:'Additional arguments to pass to Claude Code ("--dangerously-skip-permissions" is always applied, "--print" is applied only in CI)',type:"string",default:p}).option("codex-extra-args",{description:"Additional arguments to pass to Codex CLI (nothing is always applied)",type:"string",default:d}).option("gemini-extra-args",{description:'Additional arguments to pass to Gemini CLI ("--yolo" is always applied)',type:"string",default:m}).option("repomix-extra-args",{alias:"r",description:"Additional arguments for repomix when generating context",type:"string",default:l}).option("test-command",{alias:"t",description:"Command to run after the coding tool applies changes. If it fails, the assistant will try to fix it.",type:"string"}).option("max-test-attempts",{description:"Maximum number of attempts to fix test failures",type:"number",default:g}).option("dry-run",{alias:"d",description:"Run without making actual changes (no branch creation, no PR)",type:"boolean",default:!1}).option("remove-pattern",{description:"RegExp pattern to remove from issue and PR descriptions",type:"string"}).option("no-branch",{alias:"n",description:"Do not create a new branch, commit changes directly to the base branch",type:"boolean",default:!1}).option("node-runtime",{description:"Node.js runtime to use for running tools",type:"string",choices:["node","bun","npx","bunx"],default:c}).option("working-dir",{alias:"w",description:"Working directory path for commands",type:"string"}).option("verbose",{alias:"v",description:"Print parsed options at start",type:"boolean",default:!1}).version(function(){let t=import.meta.dir||o.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(o.join(t,"package.json"));)t=o.dirname(t);return JSON.parse(e.readFileSync(o.join(t,"package.json"),"utf8")).version}()).help().argv;f["working-dir"]&&(t.chdir(f["working-dir"]),console.info(`Changed working directory to: ${t.cwd()}`)),await u({aiderExtraArgs:f["aider-extra-args"],claudeCodeExtraArgs:f["claude-code-extra-args"],codexExtraArgs:f["codex-extra-args"],geminiExtraArgs:f["gemini-extra-args"],codingTool:f["coding-tool"],dryRun:f["dry-run"],noBranch:f["no-branch"],nodeRuntime:f["node-runtime"],twoStagePlanning:f["two-staged-planning"],issueNumber:f["issue-number"],maxTestAttempts:f["max-test-attempts"],planningModel:f["planning-model"],reasoningEffort:f["reasoning-effort"],repomixExtraArgs:f["repomix-extra-args"],testCommand:f["test-command"],removePattern:f["remove-pattern"],verbose:f.verbose});
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB7IGxvYWRDb25maWdGaWxlIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTLFxuICBERUZBVUxUX0NMQVVERV9DT0RFX0VYVFJBX0FSR1MsXG4gIERFRkFVTFRfQ09ERVhfRVhUUkFfQVJHUyxcbiAgREVGQVVMVF9DT0RJTkdfVE9PTCxcbiAgREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyxcbiAgREVGQVVMVF9NQVhfVEVTVF9BVFRFTVBUUyxcbiAgREVGQVVMVF9OT0RFX1JVTlRJTUUsXG4gIERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTLFxufSBmcm9tICcuL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB7IG1haW4gfSBmcm9tICcuL21haW4uanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RpbmdUb29sLCBOb2RlUnVudGltZSwgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdXNpbmcgeWFyZ3MgKENMSSBvcHRpb25zIG92ZXJyaWRlIGNvbmZpZylcbmNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5jb25maWcobG9hZENvbmZpZ0ZpbGUoKSlcbiAgLy8gT3B0aW9ucyBzYW1lIHdpdGggdGhlIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93XG4gIC5vcHRpb24oJ2lzc3VlLW51bWJlcicsIHtcbiAgICBhbGlhczogJ2knLFxuICAgIGRlc2NyaXB0aW9uOiAnR2l0SHViIGlzc3VlIG51bWJlciB0byBwcm9jZXNzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gIH0pXG4gIC5vcHRpb24oJ3BsYW5uaW5nLW1vZGVsJywge1xuICAgIGFsaWFzOiAnbScsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnTExNIGZvciBwbGFubmluZyBjb2RlIGNoYW5nZXMuIE11c3QgdXNlIGxsbWxpdGUgZm9ybWF0OiBwcm92aWRlci9tb2RlbCAoZS5nLiwgb3BlbmFpL2dwdC00LjEsIGF6dXJlL2dwdC00LjEsIGdlbWluaS9nZW1pbmktMi41LXBybywgYW50aHJvcGljL2NsYXVkZS00LXNvbm5ldC1sYXRlc3QsIGJlZHJvY2svdXMuYW50aHJvcGljLmNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNC12MTowLCB2ZXJ0ZXgvZ2VtaW5pLTIuNS1wcm8sIHhhaS9ncm9rLTQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSlcbiAgLm9wdGlvbigndHdvLXN0YWdlZC1wbGFubmluZycsIHtcbiAgICBhbGlhczogJ3AnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0VuYWJsZSB0d28tc3RhZ2VkIHBsYW5uaW5nOiBmaXJzdCBzZWxlY3QgcmVsZXZhbnQgZmlsZXMsIHRoZW4gZ2VuZXJhdGUgZGV0YWlsZWQgaW1wbGVtZW50YXRpb24gcGxhbnMgKGluY3JlYXNlcyBMTE0gY29zdCBidXQgaW1wcm92ZXMgY29kZSBxdWFsaXR5KScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0pXG4gIC5vcHRpb24oJ3JlYXNvbmluZy1lZmZvcnQnLCB7XG4gICAgYWxpYXM6ICdlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbnN0cmFpbnMgZWZmb3J0IG9uIHJlYXNvbmluZyBmb3IgcGxhbm5pbmcgbW9kZWxzLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBsb3csIG1lZGl1bSwgYW5kIGhpZ2guJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCddLFxuICB9KVxuICAub3B0aW9uKCdjb2RpbmctdG9vbCcsIHtcbiAgICBhbGlhczogJ2MnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29kaW5nIHRvb2wgdG8gdXNlIGZvciBtYWtpbmcgY2hhbmdlcycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhaWRlcicsICdjbGF1ZGUtY29kZScsICdjb2RleC1jbGknLCAnZ2VtaW5pLWNsaSddLFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfQ09ESU5HX1RPT0wsXG4gIH0pXG4gIC5vcHRpb24oJ2FpZGVyLWV4dHJhLWFyZ3MnLCB7XG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIEFpZGVyIChcIi0teWVzLWFsd2F5cyAtLW5vLWNoZWNrLXVwZGF0ZSAtLW5vLXNob3ctcmVsZWFzZS1ub3Rlc1wiIGlzIGFsd2F5cyBhcHBsaWVkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTLFxuICB9KVxuICAub3B0aW9uKCdjbGF1ZGUtY29kZS1leHRyYS1hcmdzJywge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0FkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gQ2xhdWRlIENvZGUgKFwiLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zXCIgaXMgYWx3YXlzIGFwcGxpZWQsIFwiLS1wcmludFwiIGlzIGFwcGxpZWQgb25seSBpbiBDSSknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfQ0xBVURFX0NPREVfRVhUUkFfQVJHUyxcbiAgfSlcbiAgLm9wdGlvbignY29kZXgtZXh0cmEtYXJncycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gQ29kZXggQ0xJIChub3RoaW5nIGlzIGFsd2F5cyBhcHBsaWVkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogREVGQVVMVF9DT0RFWF9FWFRSQV9BUkdTLFxuICB9KVxuICAub3B0aW9uKCdnZW1pbmktZXh0cmEtYXJncycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gR2VtaW5pIENMSSAoXCItLXlvbG9cIiBpcyBhbHdheXMgYXBwbGllZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfR0VNSU5JX0VYVFJBX0FSR1MsXG4gIH0pXG4gIC5vcHRpb24oJ3JlcG9taXgtZXh0cmEtYXJncycsIHtcbiAgICBhbGlhczogJ3InLFxuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlcG9taXggd2hlbiBnZW5lcmF0aW5nIGNvbnRleHQnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6IERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTLFxuICB9KVxuICAub3B0aW9uKCd0ZXN0LWNvbW1hbmQnLCB7XG4gICAgYWxpYXM6ICd0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmQgdG8gcnVuIGFmdGVyIHRoZSBjb2RpbmcgdG9vbCBhcHBsaWVzIGNoYW5nZXMuIElmIGl0IGZhaWxzLCB0aGUgYXNzaXN0YW50IHdpbGwgdHJ5IHRvIGZpeCBpdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9KVxuICAub3B0aW9uKCdtYXgtdGVzdC1hdHRlbXB0cycsIHtcbiAgICBkZXNjcmlwdGlvbjogJ01heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIGZpeCB0ZXN0IGZhaWx1cmVzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiBERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTLFxuICB9KVxuICAub3B0aW9uKCdkcnktcnVuJywge1xuICAgIGFsaWFzOiAnZCcsXG4gICAgZGVzY3JpcHRpb246ICdSdW4gd2l0aG91dCBtYWtpbmcgYWN0dWFsIGNoYW5nZXMgKG5vIGJyYW5jaCBjcmVhdGlvbiwgbm8gUFIpJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0pXG4gIC5vcHRpb24oJ3JlbW92ZS1wYXR0ZXJuJywge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVnRXhwIHBhdHRlcm4gdG8gcmVtb3ZlIGZyb20gaXNzdWUgYW5kIFBSIGRlc2NyaXB0aW9ucycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0pXG4gIC5vcHRpb24oJ25vLWJyYW5jaCcsIHtcbiAgICBhbGlhczogJ24nLFxuICAgIGRlc2NyaXB0aW9uOiAnRG8gbm90IGNyZWF0ZSBhIG5ldyBicmFuY2gsIGNvbW1pdCBjaGFuZ2VzIGRpcmVjdGx5IHRvIHRoZSBiYXNlIGJyYW5jaCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9KVxuICAub3B0aW9uKCdub2RlLXJ1bnRpbWUnLCB7XG4gICAgZGVzY3JpcHRpb246ICdOb2RlLmpzIHJ1bnRpbWUgdG8gdXNlIGZvciBydW5uaW5nIHRvb2xzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ25vZGUnLCAnYnVuJywgJ25weCcsICdidW54J10sXG4gICAgZGVmYXVsdDogREVGQVVMVF9OT0RFX1JVTlRJTUUsXG4gIH0pXG4gIC8vIE9wdGlvbnMgb25seSBmb3IgdGhpcyBzdGFuZGFsb25lIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLm9wdGlvbignd29ya2luZy1kaXInLCB7XG4gICAgYWxpYXM6ICd3JyxcbiAgICBkZXNjcmlwdGlvbjogJ1dvcmtpbmcgZGlyZWN0b3J5IHBhdGggZm9yIGNvbW1hbmRzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSlcbiAgLm9wdGlvbigndmVyYm9zZScsIHtcbiAgICBhbGlhczogJ3YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgcGFyc2VkIG9wdGlvbnMgYXQgc3RhcnQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSlcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBpbXBvcnQubWV0YS5kaXIgfHwgcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKS52ZXJzaW9uO1xufVxuXG5pZiAoYXJndlsnd29ya2luZy1kaXInXSkge1xuICBwcm9jZXNzLmNoZGlyKGFyZ3ZbJ3dvcmtpbmctZGlyJ10pO1xuICBjb25zb2xlLmluZm8oYENoYW5nZWQgd29ya2luZyBkaXJlY3RvcnkgdG86ICR7cHJvY2Vzcy5jd2QoKX1gKTtcbn1cblxuYXdhaXQgbWFpbih7XG4gIGFpZGVyRXh0cmFBcmdzOiBhcmd2WydhaWRlci1leHRyYS1hcmdzJ10sXG4gIGNsYXVkZUNvZGVFeHRyYUFyZ3M6IGFyZ3ZbJ2NsYXVkZS1jb2RlLWV4dHJhLWFyZ3MnXSxcbiAgY29kZXhFeHRyYUFyZ3M6IGFyZ3ZbJ2NvZGV4LWV4dHJhLWFyZ3MnXSxcbiAgZ2VtaW5pRXh0cmFBcmdzOiBhcmd2WydnZW1pbmktZXh0cmEtYXJncyddLFxuICBjb2RpbmdUb29sOiBhcmd2Wydjb2RpbmctdG9vbCddIGFzIENvZGluZ1Rvb2wsXG4gIGRyeVJ1bjogYXJndlsnZHJ5LXJ1biddLFxuICBub0JyYW5jaDogYXJndlsnbm8tYnJhbmNoJ10sXG4gIG5vZGVSdW50aW1lOiBhcmd2Wydub2RlLXJ1bnRpbWUnXSBhcyBOb2RlUnVudGltZSxcbiAgdHdvU3RhZ2VQbGFubmluZzogYXJndlsndHdvLXN0YWdlZC1wbGFubmluZyddLFxuICBpc3N1ZU51bWJlcjogYXJndlsnaXNzdWUtbnVtYmVyJ10sXG4gIG1heFRlc3RBdHRlbXB0czogYXJndlsnbWF4LXRlc3QtYXR0ZW1wdHMnXSxcbiAgcGxhbm5pbmdNb2RlbDogYXJndlsncGxhbm5pbmctbW9kZWwnXSxcbiAgcmVhc29uaW5nRWZmb3J0OiBhcmd2WydyZWFzb25pbmctZWZmb3J0J10gYXMgUmVhc29uaW5nRWZmb3J0LFxuICByZXBvbWl4RXh0cmFBcmdzOiBhcmd2WydyZXBvbWl4LWV4dHJhLWFyZ3MnXSxcbiAgdGVzdENvbW1hbmQ6IGFyZ3ZbJ3Rlc3QtY29tbWFuZCddLFxuICByZW1vdmVQYXR0ZXJuOiBhcmd2WydyZW1vdmUtcGF0dGVybiddLFxuICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG59KTtcbiJdLCJuYW1lcyI6WyJhcmd2IiwieWFyZ3MiLCJoaWRlQmluIiwicHJvY2VzcyIsImNvbmZpZyIsImxvYWRDb25maWdGaWxlIiwib3B0aW9uIiwiYWxpYXMiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZW1hbmRPcHRpb24iLCJkZWZhdWx0IiwiY2hvaWNlcyIsIkRFRkFVTFRfQ09ESU5HX1RPT0wiLCJERUZBVUxUX0FJREVSX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NMQVVERV9DT0RFX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MiLCJERUZBVUxUX0dFTUlOSV9FWFRSQV9BUkdTIiwiREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MiLCJERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTIiwiREVGQVVMVF9OT0RFX1JVTlRJTUUiLCJ2ZXJzaW9uIiwicGFja2FnZUpzb25EaXIiLCJkaXIiLCJwYXRoIiwiZGlybmFtZSIsIlVSTCIsInVybCIsInBhdGhuYW1lIiwiZnMiLCJleGlzdHNTeW5jIiwiam9pbiIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImdldFZlcnNpb24iLCJoZWxwIiwiY2hkaXIiLCJjb25zb2xlIiwiaW5mbyIsImN3ZCIsIm1haW4iLCJhaWRlckV4dHJhQXJncyIsImNsYXVkZUNvZGVFeHRyYUFyZ3MiLCJjb2RleEV4dHJhQXJncyIsImdlbWluaUV4dHJhQXJncyIsImNvZGluZ1Rvb2wiLCJkcnlSdW4iLCJub0JyYW5jaCIsIm5vZGVSdW50aW1lIiwidHdvU3RhZ2VQbGFubmluZyIsImlzc3VlTnVtYmVyIiwibWF4VGVzdEF0dGVtcHRzIiwicGxhbm5pbmdNb2RlbCIsInJlYXNvbmluZ0VmZm9ydCIsInJlcG9taXhFeHRyYUFyZ3MiLCJ0ZXN0Q29tbWFuZCIsInJlbW92ZVBhdHRlcm4iLCJ2ZXJib3NlIl0sIm1hcHBpbmdzIjoiNm1CQW9CQSxNQUFNQSxRQUFhQyxFQUFNQyxFQUFRQyxFQUFRSCxPQUN0Q0ksT0FBT0MsS0FFUEMsT0FBTyxlQUFnQixDQUN0QkMsTUFBTyxJQUNQQyxZQUFhLGlDQUNiQyxLQUFNLFNBQ05DLGNBQWMsSUFFZkosT0FBTyxpQkFBa0IsQ0FDeEJDLE1BQU8sSUFDUEMsWUFDRSwrUEFDRkMsS0FBTSxXQUVQSCxPQUFPLHNCQUF1QixDQUM3QkMsTUFBTyxJQUNQQyxZQUNFLHNKQUNGQyxLQUFNLFVBQ05FLFNBQVMsSUFFVkwsT0FBTyxtQkFBb0IsQ0FDMUJDLE1BQU8sSUFDUEMsWUFBYSxrR0FDYkMsS0FBTSxTQUNORyxRQUFTLENBQUMsTUFBTyxTQUFVLFVBRTVCTixPQUFPLGNBQWUsQ0FDckJDLE1BQU8sSUFDUEMsWUFB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
@@ -0,0 +1,2 @@
1
+ import e from"node:fs";import t from"node:path";import n from"yaml";import o from"ansis";import{config as i}from"dotenv";import r,{spawn as s}from"node:child_process";import{graphql as a}from"@octokit/graphql";import{Octokit as c}from"@octokit/rest";import{createAmazonBedrock as l}from"@ai-sdk/amazon-bedrock";import{createAnthropic as u}from"@ai-sdk/anthropic";import{createAzure as d}from"@ai-sdk/azure";import{createGoogleGenerativeAI as f}from"@ai-sdk/google";import{createVertex as m}from"@ai-sdk/google-vertex";import{createOpenAI as p}from"@ai-sdk/openai";import{createXai as g}from"@ai-sdk/xai";import{createOpenRouter as h}from"@openrouter/ai-sdk-provider";import{generateText as w}from"ai";import{generateText as y}from"ai-v4";import{createOllama as $}from"ollama-ai-provider-v2";function b(){let o={};for(const i of["gen-pr.config.yml","gen-pr.config.yaml"]){const r=t.resolve(process.cwd(),i);if(e.existsSync(r)){try{o=n.parse(e.readFileSync(r,"utf8")),console.info(`Loaded gen-pr config from ${i}`)}catch(e){console.error(`Failed to parse config file ${i}:`,e),process.exit(1)}break}}return o}const v="--model gemini/gemini-2.5-pro --edit-format diff-fenced",x="--allowedTools Bash Edit Write",E="--full-auto",A="",P='--compress --remove-empty-lines --include "src/**/*.{ts,tsx},**/*.md"',R=5,_="aider",I="npx";const S="## gen-pr Metadata";function k(e,t){if(e.length>t){const n=e.slice(0,t),o=e.length-t;return`${n}\n\n... (${Math.floor(o)} characters truncated) ...`}return e}function O(e){return e.replaceAll("\r\n","\n").trim()}function N(e){switch(e){case"node":case"npx":return"npx";case"bun":case"bunx":return"bunx"}}async function G(e,t,n){const{ignoreExitStatus:i,...r}=n??{},s=t.map(e=>e.includes(" ")?`"${e.replaceAll('"','"')}"`:e).join(" ");console.info(o.green(`$ ${e} ${s}`)),console.info("stdout: ---------------------");const a=await C(e,t,r);r.truncateStdout&&console.info(k(a.stdout,3e3));const c=a.stderr.trim();if(c){console.info("stderr: ---------------------");const e=k(c,3e3);console.info(o.yellow(e))}return console.info("-----------------------------"),console.info(o.magenta(`Exit code: ${a.status}\n`)),i||0===a.status||null===a.status||process.exit(a.status),a}async function C(e,t,n){return new Promise((o,i)=>{try{const r=(t??[]).map(e=>e.replace(/\0/g,"")),a=s(e,r,n);a.stdout?.setEncoding?.("utf8"),a.stderr?.setEncoding?.("utf8");let c="",l="";a.stdout?.on("data",e=>{n?.truncateStdout||process.stdout.write(e),c+=e}),a.stderr?.on("data",e=>{l+=e}),a.on("error",e=>{i(e)}),a.on("close",(e,t)=>{void 0===a.pid?i(new Error("Process has no pid.")):o({pid:a.pid,stdout:c,stderr:l,status:e,signal:t})})}catch(e){i(e)}})}function T(e){if(!e)return[];const t=[];let n="",o=!1,i=!1;for(let r=0;r<e.length;r++){const s=e[r];'"'!==s||i?"'"!==s||o?" "!==s||o||i?n+=s:n&&(t.push(n),n=""):i=!i:o=!o}return n&&t.push(n),t}const M=process.env.GH_TOKEN||process.env.GITHUB_TOKEN||r.spawnSync("gh",["auth","token"],{encoding:"utf-8"}).stdout.trim();if(!M)throw new Error("GitHub token not found. Please set GH_TOKEN or GITHUB_TOKEN environment variable, or authenticate with gh CLI");const W=new c({auth:M}),H=a.defaults({headers:{authorization:`token ${M}`}});let L,Y;async function q(){if(!L||!Y){const{stdout:e}=await G("git",["remote","get-url","origin"],{ignoreExitStatus:!0}),t=e.trim().match(/github\.com[:/]([^/]+)\/(.+)/);if(!t?.[1]||!t[2])throw new Error("Could not parse GitHub repository from remote URL");L=t[1],Y=t[2].replace(/\.git$/,"")}if(!L||!Y)throw new Error("Repository information not properly initialized");return{owner:L,repo:Y}}async function F(e,t){try{const n=await async function(e){const{owner:t,repo:n}=await q();return(await W.pulls.get({owner:t,repo:n,pull_number:e,mediaType:{format:"diff"}})).data}(e);if(!n.trim())return;t.code_changes=function(e){const t=5e4,n=1e4,o=[/^diff --git a\/dist\//m,/^diff --git a\/build\//m,/^diff --git a\/.*\.bundle\./m,/^diff --git a\/.*\.min\./m,/^diff --git a\/node_modules\//m];if(e.length<=t)return e;const i=e.split(/(?=^diff --git)/m),r=[];let s=0;for(const e of i){if(!e.trim())continue;if(o.some(t=>t.test(e))){const t=[...e.split("\n").slice(0,4),"@@ ... @@","... (large bundled/compiled file diff truncated) ...",""].join("\n");r.push(t),s+=t.length}else if(e.length>n){const t=`${e.slice(0,n)}\n... (diff truncated) ...\n`;r.push(t),s+=t.length}else r.push(e),s+=e.length;if(s>.9*t){r.push("\n... (remaining diffs truncated) ...\n");break}}return r.join("")}(n.trim())}catch(e){console.warn("Failed to fetch PR diff:",e)}}async function K(e,t,n,o=!1){if(t.has(e))return;let i;t.add(e);try{i=await async function(e){const{owner:t,repo:n}=await q(),{data:o}=await W.issues.get({owner:t,repo:n,issue_number:e});let i=o;if(o.pull_request){const{data:o}=await W.pulls.get({owner:t,repo:n,pull_number:e});i=o}const r=await W.issues.listComments({owner:t,repo:n,issue_number:e});return{author:i.user?.login||"",title:i.title,body:i.body||"",labels:i.labels.map(e=>({name:"string"==typeof e?e:e.name||""})),comments:r.data.map(e=>({author:e.user?.login||"",body:e.body||"",createdAt:e.created_at})),url:i.html_url}}(e)}catch(t){return void console.warn(`Failed to fetch issue #${e}:`,t)}const r=function(e){const t=/(?:^|\s)#(\d+)/g,n=[];for(;;){const o=t.exec(e);if(!o)break;const i=Number.parseInt(o[1]??"",10);Number.isInteger(i)&&n.push(i)}return[...new Set(n)]}([i.body,...i.comments.map(e=>e.body)].join("\n")),s=i.body.replace(/<!--[\s\S]*?-->/g,"");const a=i.url?.includes("/pull/")?function(e){const t=e.indexOf(S);return t>=0?e.substring(0,t):e}(s):s,c=function(e,t){if(!t)return e;try{const n=new RegExp(t,"g");return e.replace(n,"")}catch(n){return console.warn(`Invalid regex pattern "${t}":`,n),e}}(a,n.removePattern||""),l=i.comments.map(e=>({author:e.author,body:O(e.body),createdAt:new Date(e.createdAt).getTime()})),u={author:i.author,title:i.title,description:O(c),comments:[]};return i.url?.includes("/pull/")&&!o&&(await F(e,u),await async function(e,t){try{const n=await async function(e){const{owner:t,repo:n}=await q();return await H("\n query($owner: String!, $repo: String!, $pr: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $pr) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n comments(first: 100) {\n nodes {\n author {\n login\n }\n body\n path\n line\n diffHunk\n createdAt\n }\n }\n }\n }\n }\n }\n }\n ",{owner:t,repo:n,pr:e})}(e),o=n?.repository?.pullRequest?.reviewThreads?.nodes||[];for(const e of o)!e.isResolved&&e.comments?.nodes&&B(e.comments.nodes,t)}catch(e){console.warn("Failed to fetch PR review threads:",e)}}(e,l),await async function(e,t){try{const n=(await async function(e){const{owner:t,repo:n}=await q();return(await W.pulls.listReviews({owner:t,repo:n,pull_number:e})).data.map(e=>({user:{login:e.user?.login||""},state:e.state,body:e.body||"",submitted_at:e.submitted_at||""}))}(e)).map(e=>({author:e.user.login,reviewState:e.state,body:O(e.body),createdAt:new Date(e.submitted_at).getTime()}));t.push(...n)}catch(e){console.warn("Failed to fetch PR reviews:",e)}}(e,l)),r.length>0&&await async function(e,t,n,o){const i=e.map(e=>K(e,t,n,!0)),r=(await Promise.all(i)).filter(e=>!!e);if(0===r.length)return;o.referenced_issues=r}(r,t,n,u),u.comments=l.filter(e=>e.body).sort((e,t)=>e.createdAt-t.createdAt).map(({createdAt:e,...t})=>t),u}function B(e,t){for(const n of e){if(!n.author||!n.body)continue;const e=D(n.diffHunk),o={author:n.author.login,codeLocation:n.path&&n.line?`${n.path}:${n.line}`:void 0,codeContent:e||void 0,body:O(n.body),createdAt:new Date(n.createdAt).getTime()};Object.keys(o).forEach(e=>{void 0===o[e]&&delete o[e]}),t.push(o)}}function D(e){if(!e)return"";const t=e.split("\n").find(e=>(e.startsWith("+")||e.startsWith("-"))&&!e.startsWith("@@")&&e.trim().length>1);return t?.trim()||""}function j(e,t){const n=`\n${e}`,o=t.map(e=>n.indexOf(`\n${e}`));if(!o.some(e=>-1===e)&&o.every((e,t)=>0===t||e>o[t-1]))return t.map((e,i)=>{const r=o[i]+1+e.length,s=i+1<t.length?o[i+1]+1:n.length;return n.slice(r,s).trim()})}function z(e,t){const n=new RegExp(`${t}{3,}`,"g"),o=e.match(n),i=o?Math.max(...o.map(e=>e.length)):0,r=Math.max(3,i+1);return t.repeat(r)}function U(e){return e.trim().replace(/^(`{3,}|~{3,})[\s\S]*?\n([\s\S]*?)\n\1\s*$/,"$2")}function J(e){return e.map((e,t)=>({id:`msg-${t}`,role:"tool"===e.role?"data":e.role,content:"string"==typeof e.content?e.content:JSON.stringify(e.content)}))}const V={blockQuote:"literal",lineWidth:0};async function Q(e,t,n){try{if(e.startsWith("ollama/"))return await async function(e,t,n){const[o,...i]=e.split("/");try{const r=i.join("/");r||(console.error(`Invalid ${o} model format: ${e}. Expected format: ${o}/model-name`),process.exit(1));const s=`${process.env.OLLAMA_BASE_URL||"http://localhost:11434"}/api`,a=$({baseURL:s,...process.env.OLLAMA_API_KEY&&{apiKey:process.env.OLLAMA_API_KEY}})(r),c=await y({model:a,providerOptions:n?{ollama:{think:!0}}:void 0,messages:J(t)});return X(e,c),c.text}catch(t){console.error(`${o.charAt(0).toUpperCase()+o.slice(1)} API error for model ${e}:`,t),process.exit(1)}}(e,t,n);const[o,i,r]=function(e,t){e.includes("/")||(console.error(`Model must be in format 'provider/model'. Got: ${e}`),process.exit(1));const[n,...o]=e.split("/"),i=o.join("/");switch(n){case"openai":return[p()(i),n,i];case"anthropic":return[u()(i),n,i];case"gemini":return[f()(i),n,i];case"azure":return[d()(i),n,i];case"bedrock":return[l()(i),n,i];case"vertex":return[m()(i),n,i];case"xai":return[g()(i),n,i];case"openrouter":return[h({apiKey:process.env.OPENROUTER_API_KEY,headers:{"HTTP-Referer":"https://github.com/WillBooster/gen-pr","X-Title":"gen-pr"}})(i,t?{reasoning:{effort:t}}:{}),n,i];default:console.error(`Unsupported provider: ${n}. Supported providers: openai, azure, google, anthropic, bedrock, vertex, grok, openrouter, ollama`),process.exit(1)}}(e,n),s={model:o,messages:t};if(n){const t=function(e,t){switch(e){case"openai":case"azure":return/^(o1|o3|o4)/.test(t);case"anthropic":return/^claude-(opus-4|sonnet-4|3-7-sonnet)/.test(t);case"gemini":return/^gemini-2\.5/.test(t);case"bedrock":return/^(us\.)?anthropic\.claude-(opus-4|sonnet-4|3-7-sonnet)/.test(t);case"vertex":return/^gemini-2\.5/.test(t)||/^claude-(3-7-sonnet|opus-4|sonnet-4)/.test(t);case"xai":return/^grok-3/.test(t);case"openrouter":return!0;default:return!1}}(i,r);if(t){const e=function(e){return{low:4e3,medium:8e3,high:24e3}[e]}(n);"openai"===i?s.providerOptions={openai:{reasoningEffort:n}}:"anthropic"===i?s.providerOptions={anthropic:{thinking:{type:"enabled",budgetTokens:e}}}:"gemini"===i?s.providerOptions={google:{thinkingConfig:{thinkingBudget:e}}}:"bedrock"===i?console.warn(`Note: The current AI SDK doesn't work on Bedrock with reasoning. Model ${r} will use default reasoning settings.`):"xai"===i&&(s.providerOptions={xai:{reasoningEffort:n}})}else console.warn(`Model ${e} does not support reasoning/thinking options. Ignoring reasoning effort parameter.`)}const a=await w(s);return X(e,a),a.text}catch(t){console.error(`LLM API error for model ${e}:`,t),process.exit(1)}}function X(e,t){console.info(`${e}:`,n.stringify({text:t.text,usage:t.usage,finishReason:t.finishReason},V))}const Z="repomix.result",ee="## File Paths to be Modified",te="## File Paths to be Referred",ne="## Implementation Plan",oe="## Commit Message";function ie(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with analyzing GitHub ${n}s and identifying relevant files for code changes.\n\nReview the following GitHub ${n} and the list of available file paths and their contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when identifying files.":""}\nYour task is to identify:\n1. Files that need to be MODIFIED to resolve the ${n}\n2. Files that should be REFERRED to (but not modified) to understand the codebase better\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ee}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\n${te}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\`\`\`\n`}function re(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with creating an implementation plan based on GitHub ${n}s.\n\nReview the following GitHub ${n} and the provided file contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when creating the plan.":""}\nCreate a detailed, step-by-step plan outlining how to address the ${n} effectively.\nAlso, provide a concise and descriptive commit message for the changes, following the Conventional Commits specification.\n\nYour plan should:\n- Focus on implementation details for each file that needs modification\n- Be clear and actionable for a developer to follow\n- Prefer showing diffs rather than complete file contents when describing changes\n- Exclude testing procedures unless users explicitly request\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ne}\n\n1. [Specific implementation step]\n2. [Next implementation step]\n...\n\n${oe}\n\n[commit message]\n\`\`\`\n`.trim()}function se(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with analyzing GitHub ${n}s and creating an implementation plan.\n\nReview the following GitHub ${n} and the list of available file paths and their contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when creating the plan.":""}\nYour task is to:\n1. Create a detailed, step-by-step plan outlining how to resolve the ${n} effectively.\n2. Identify files that need to be modified to resolve the ${n}.\n3. Provide a concise and descriptive commit message for the changes, following the Conventional Commits specification.\n\nYour plan should:\n- Focus on implementation details for each file that needs modification\n- Be clear and actionable for a developer to follow\n- Prefer showing diffs rather than complete file contents when describing changes\n- Exclude testing procedures as those will be handled separately\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ne}\n\n1. [Specific implementation step]\n2. [Next implementation step]\n...\n\n${ee}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\n${oe}\n\n[commit message]\n\`\`\`\n`}const ae=process.env.CI||process.env.GITHUB_ACTIONS;const ce={aider:{name:"Aider",buildArgs:function(e,t){const n=["--yes-always","--no-check-update","--no-gitignore","--no-show-model-warnings","--no-show-release-notes",...T(e.aiderExtraArgs||v),"--message",t.prompt];return e.dryRun&&n.push("--dry-run"),t.resolutionPlan&&"filePaths"in t.resolutionPlan&&n.push(...t.resolutionPlan.filePaths),n},getCommand:()=>"aider"},"claude-code":{name:"Claude Code",buildArgs:function(e,t){const n=["--yes","@anthropic-ai/claude-code@latest",...T(e.claudeCodeExtraArgs||x),"--dangerously-skip-permissions"];return ae&&n.push("--print"),n.push(t.prompt),n},getCommand:e=>e,getRunOptions:()=>({stdio:"inherit"})},"codex-cli":{name:"Codex CLI",buildArgs:function(e,t){return["--yes","@openai/codex@latest","exec",...T(e.codexExtraArgs||E),t.prompt]},getCommand:e=>e},"gemini-cli":{name:"Gemini CLI",buildArgs:function(e,t){return["--yes","@google/gemini-cli@latest","--yolo",...T(e.geminiExtraArgs||""),"--prompt",t.prompt]},getCommand:e=>e}};function le(e){return ce[e].name}function ue(e,t,n,o){const i=ce[e];return{command:i.getCommand(n),args:i.buildArgs(t,o),runOptions:i.getRunOptions?.()}}function de(){return{env:{...process.env,NO_COLOR:"1"},ignoreExitStatus:!0}}async function fe(e,t,n){const i=le(e.codingTool),r=N(e.nodeRuntime),{command:s,args:a,runOptions:c}=ue(e.codingTool,e,r,{prompt:t,resolutionPlan:n}),l={...de(),...c};console.info(o.cyan(`Asking ${i} to fix "${e.testCommand}"...`));const u=(await G(s,a,l)).stdout;return`\n\n## ${i} fix attempt for "${e.testCommand}"\n\n${u.trim()}`}async function me(t){i(),!process.env.AWS_REGION&&process.env.AWS_REGION_NAME?process.env.AWS_REGION=process.env.AWS_REGION_NAME:process.env.AWS_REGION&&!process.env.AWS_REGION_NAME&&(process.env.AWS_REGION_NAME=process.env.AWS_REGION),!process.env.GEMINI_API_KEY&&process.env.GOOGLE_GENERATIVE_AI_API_KEY?process.env.GEMINI_API_KEY=process.env.GOOGLE_GENERATIVE_AI_API_KEY:process.env.GEMINI_API_KEY&&!process.env.GOOGLE_GENERATIVE_AI_API_KEY&&(process.env.GOOGLE_GENERATIVE_AI_API_KEY=process.env.GEMINI_API_KEY),function(e,t){t&&(console.info("Parsed options:"),console.info(JSON.stringify(e,null,2)))}(t,t.verbose);const s=N(t.nodeRuntime);t.dryRun?console.info(o.yellow("Running in dry-run mode. No branches or PRs will be created.")):await async function(){const e=(await G("git",["config","user.name"],{ignoreExitStatus:!0})).stdout.trim(),t=(await G("git",["config","user.email"],{ignoreExitStatus:!0})).stdout.trim();if(!e||!t){const e=(await G("gh",["api","user"],{ignoreExitStatus:!0})).stdout.trim();try{const{name:t,email:n}=JSON.parse(e);t&&await G("git",["config","user.name",t]),n&&await G("git",["config","user.email",n])}catch{}}}(),"aider"===t.codingTool&&(await G("python",["-m","pip","install","aider-install"]),await pe(),await G("uv",["tool","uninstall","aider-chat"],{ignoreExitStatus:!0}),await G("aider-install",[]),await pe(),t.aiderExtraArgs?.includes("bedrock/")&&await G("uv",["tool","run","--from","aider-chat","pip","install","--upgrade","--upgrade-strategy","only-if-needed","boto3"]));const a=await async function(e){const{stdout:t}=await G("gh",["pr","view",e.issueNumber.toString(),"--json","headRefName"],{ignoreExitStatus:!0});try{if(t)return JSON.parse(t).headRefName}catch{}}(t),c=!!a,l=a||await async function(){return(await G("git",["branch","--show-current"])).stdout.trim()}(),u=await async function(e){const t=new Set,n=await K(e.issueNumber,t,e,!1);if(!n)throw new Error(`Failed to fetch issue data for issue #${e.issueNumber}`);return n}(t),d=n.stringify(u,V).trim(),f=t.planningModel&&await async function(t,o,i,r,s,a=!1){const c=z(o,"~"),l=`${c}yaml\n${n.stringify(o,V).trim()}\n${c}`,u=["--yes","repomix@latest","--output",Z];u.push(...T(s||P)),await G("npx",u);const d=e.readFileSync(Z,"utf8");if(e.promises.rm(Z,{force:!0}),i){console.info(`Selecting files with ${t} (reasoning effort: ${r}) ...`);const n=await Q(t,[{role:"system",content:ie(l,a).trim()},{role:"user",content:d}],r);console.info("Selecting complete!");const o=j(U(n),[ee,te]);if(!o)return{filePaths:[]};const[i,s]=o.map(e=>[...e.matchAll(/\B-\s*`?([^`\n]+)`?/g)].map(e=>e[1]?.trim()??"").filter(Boolean)),c=[...i,...s].map(t=>{const n=e.existsSync(t)?e.readFileSync(t,"utf8").trim():"",o=z(n,"~");return`## \`${t}\`\n\n${o}\n${n}\n${o}`}).join("\n\n");console.info(`Planning code changes with ${t} (reasoning effort: ${r}) ...`);const u=await Q(t,[{role:"system",content:re(l,a)},{role:"user",content:c}],r);console.info("Planning complete!");const f=j(U(u),[oe,ne]);if(!f)return{filePaths:i};const[m,p]=f;return{plan:p,commitMessage:m?.trim(),filePaths:i}}console.info(`Planning code changes with ${t} (reasoning effort: ${r}) ...`);const f=await Q(t,[{role:"system",content:se(l,a).trim()},{role:"user",content:d}],r);console.info("Planning complete!");const m=j(U(f),[oe,ne,ee]);if(!m)return{filePaths:[]};const[p,g,h]=m,w=[...(h??"").matchAll(/\B-\s*`?([^`\n]+)`?/g)].map(e=>e[1]?.trim()??"").filter(Boolean);return{plan:g,commitMessage:p?.trim(),filePaths:w}}(t.planningModel,d,t.twoStagePlanning,t.reasoningEffort,t.repomixExtraArgs,c)||void 0;console.info("Resolution plan:",f);const m=f&&"plan"in f&&f.plan||"",p=z(d,"~"),g=`\nModify the code to resolve ${c?"the comments on the following GitHub pull request":"the following GitHub issue"}${m?" based on the plan":""}.${"aider"!==t.codingTool?" After that, commit your changes with a message, following the Conventional Commits specification.":""}\n\n## ${c?"Pull Request":"Issue"}\n\n${p}yml\n${d}\n${p}\n\n${m&&`## Plan\n\n${m}`}\n`.trim(),h=new Date,w=`gen-pr-${t.issueNumber}-${t.codingTool}-${h.getFullYear()}_${ge(h.getMonth()+1)}${ge(h.getDate())}_${ge(h.getHours())}${ge(h.getMinutes())}${ge(h.getSeconds())}`;t.noBranch?t.dryRun?console.info(o.yellow(`Would commit directly to base branch: ${l}`)):(c&&await G("git",["fetch","origin",l]),await G("git",["switch",l])):t.dryRun?console.info(o.yellow(`Would create branch: ${w}`)):(c&&(await G("git",["fetch","origin",l]),await G("git",["switch",l])),await G("git",["switch","--force-create",w]));let y,$="",b="",v=!0;const x=le(t.codingTool),{command:E,args:A,runOptions:R}=ue(t.codingTool,t,s,{prompt:g,resolutionPlan:f}),_={...de(),...R};if(y=function(e,t,n){const o=t.map(e=>e===n?"...":e.includes(" ")||e.includes('"')||e.includes("'")?`"${e.replace(/"/g,'\\"')}"`:e);return`${e} ${o.join(" ")}`}(E,A,g),t.dryRun)console.info(`\n=== DRY MODE: ${x} Prompt ===`),console.info(g),console.info(`=== End ${x} Prompt ===\n`),console.info(o.yellow(`Would run: ${y}`)),$="Skipped due to dry-run mode";else{const e=await G(E,A,_);$=e.stdout||"",0!==e.status&&(v=!1,b=`${x} failed with exit code ${e.status}\n${e.stderr}`,console.error(o.red(`${x} execution failed: ${b}`)))}let I=($||"").trim(),O=!0,M="";if(t.dryRun)console.info(o.yellow("Would run test command"));else{const e=await async function(e,t){const[n,...i]=T(e.testCommand||"");if(!n)return{fixResult:"",success:!0};const r=e.maxTestAttempts;let s=0,a="",c=!1,l="";for(;s<r;){s++,console.info(o.cyan(`Executing test command (attempt ${s}/${r}): ${e.testCommand}`));const u=await C(n,i,{cwd:process.cwd()});if(0===u.status){console.info(o.green("Test command passed successfully.")),c=!0;break}if(console.warn(o.yellow(`Test command failed with exit code ${u.status}.`)),l=`Test command failed with exit code ${u.status}\n\nStdout:\n${u.stdout}\n\nStderr:\n${u.stderr}`,s>=r){console.warn(o.yellow(`Maximum fix attempts (${r}) reached. Giving up.`));break}const d=z(u.stdout,"~"),f=z(u.stderr,"~"),m=`\nThe previous changes were applied, but the test command \`${e.testCommand}\` failed.\n\nExit code: ${u.status}\n\nStdout:\n${d}\n${u.stdout}\n${d}\n\nStderr:\n${f}\n${u.stderr}\n${f}\n\nPlease analyze the output and fix the errors.\n`.trim();a+=await fe(e,m,t)}return{fixResult:a,success:c,error:c?void 0:l}}(t,f);I+=e.fixResult,O=e.success,M=e.error||"",O||console.warn(o.yellow("Tests failed after all fix attempts. Will create a draft PR."))}v||console.warn(o.yellow(`${x} execution failed. Will create a draft PR.`));const H=!v||!O;let L="";H&&(b&&(L+=`\n\n### ❌ ${x} Execution Error\n\n\`\`\`\n${b}\n\`\`\``),M&&(L+=`\n\n### ❌ Test Execution Error\n\n\`\`\`\n${M}\n\`\`\``));const Y=f?.commitMessage||`fix: Close #${t.issueNumber}`;if(await G("git",["add","-A"],{ignoreExitStatus:!0}),0!==(await G("git",["commit","-m",Y],{ignoreExitStatus:!0})).status&&await G("git",["commit","-m",Y,"--no-verify"],{ignoreExitStatus:!0}),t.noBranch?t.dryRun?console.info(o.yellow(`Would push changes directly to base branch: ${l}`)):await G("git",["push","origin",l,"--no-verify"]):t.dryRun?console.info(o.yellow(`Would push branch: ${w} to origin`)):await G("git",["push","origin",w,"--no-verify"]),t.noBranch)t.dryRun?console.info(o.yellow("Skipping PR creation due to --no-branch option")):console.info(`Changes committed directly to base branch: ${l}`);else{const e=function(e){return r.spawnSync("git",["log",`${e}..HEAD`,"--reverse","--pretty=%s"],{encoding:"utf8",stdio:"pipe"}).stdout.trim().split("\n").find(e=>e.trim())??""}(l)||Y;let n=c?"":`Close #${t.issueNumber}`;if(t.planningModel&&(n+=`\n\n${S}\n\n- **Planning Model:** ${t.planningModel}`),n+=`\n- **Coding Tool:** ${x}\n- **Coding Command:** \`${y}\``,m){const e=z(m,"~");n+=`\n\n### Plan\n\n${e}\n${k(m,I.length/(m.length+I.length)*3e4)}\n${e}`}if(I){const e=z(I,"~");n+=`\n\n### ${x} Log\n\n${e}\n${k(I,I.length/(m.length+I.length)*3e4)}\n${e}`}n=n.replaceAll(/(?:\s*\n){2,}/g,"\n\n").trim(),H&&(n+=L),t.dryRun?console.info(o.yellow(`Would create PR with title: ${e}${H?" (as draft)":""}`)):await async function(e){const{owner:t,repo:n}=await q();await W.pulls.create({owner:t,repo:n,title:e.title,body:e.body,head:e.head,base:e.base,draft:e.draft})}({title:e,body:n,head:w,base:l,draft:H})}console.info(`\n${c?"Pull request":"Issue"} #${t.issueNumber} processed successfully.`)}async function pe(){try{await G("asdf",["reshim"],{ignoreExitStatus:!0})}catch{}}function ge(e){return String(e).padStart(2,"0")}export{_ as D,I as a,R as b,v as c,x as d,E as e,A as f,P as g,b as l,me as m};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1EY1QyakdnbS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyIsIi4uL3NyYy9kZWZhdWx0T3B0aW9ucy50cyIsIi4uL3NyYy90ZXh0LnRzIiwiLi4vc3JjL3NwYXduLnRzIiwiLi4vc3JjL29jdG9raXQudHMiLCIuLi9zcmMvaXNzdWUudHMiLCIuLi9zcmMvbWFya2Rvd24udHMiLCIuLi9zcmMvbGxtdjQudHMiLCIuLi9zcmMveWFtbC50cyIsIi4uL3NyYy9sbG0udHMiLCIuLi9zcmMvcGxhbi50cyIsIi4uL3NyYy9jaS50cyIsIi4uL3NyYy91dGlscy90b29sUmVnaXN0cnkudHMiLCIuLi9zcmMvdG9vbHMvYWlkZXIudHMiLCIuLi9zcmMvdG9vbHMvY2xhdWRlQ29kZS50cyIsIi4uL3NyYy90b29scy9jb2RleC50cyIsIi4uL3NyYy90b29scy9nZW1pbmkudHMiLCIuLi9zcmMvdGVzdC50cyIsIi4uL3NyYy9tYWluLnRzIiwiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy91dGlscy9sb2dnaW5nLnRzIiwiLi4vc3JjL2dpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlnRmlsZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIC8vIExvYWQgY29uZmlnIGZpbGUgKFlBTUwpIGZyb20gcmVwb3NpdG9yeSByb290IHRvIHNldCBkZWZhdWx0IG9wdGlvbiB2YWx1ZXNcbiAgbGV0IGNvbmZpZ09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgbmFtZSBvZiBbJ2dlbi1wci5jb25maWcueW1sJywgJ2dlbi1wci5jb25maWcueWFtbCddKSB7XG4gICAgY29uc3QgY2ZnUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBuYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjZmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnT3B0aW9ucyA9IFlBTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNmZ1BhdGgsICd1dGY4JykpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCBnZW4tcHIgY29uZmlnIGZyb20gJHtuYW1lfWApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjb25maWcgZmlsZSAke25hbWV9OmAsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnT3B0aW9ucztcbn1cbiIsImltcG9ydCB0eXBlIHsgTm9kZVJ1bnRpbWVBY3R1YWwgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFwiLS15ZXMtYWx3YXlzIC0tbm8tY2hlY2stdXBkYXRlIC0tbm8tZ2l0aWdub3JlIC0tbm8tc2hvdy1tb2RlbC13YXJuaW5ncyAtLW5vLXNob3ctcmVsZWFzZS1ub3Rlc1wiIGlzIGFsd2F5cyBhcHBsaWVkICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTID0gJy0tbW9kZWwgZ2VtaW5pL2dlbWluaS0yLjUtcHJvIC0tZWRpdC1mb3JtYXQgZGlmZi1mZW5jZWQnO1xuLyoqIFwiLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zIC0tcHJpbnRcIiBpcyBhbHdheXMgYXBwbGllZCAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xBVURFX0NPREVfRVhUUkFfQVJHUyA9ICctLWFsbG93ZWRUb29scyBCYXNoIEVkaXQgV3JpdGUnO1xuLyoqIGV4ZWMgaXMgYWx3YXlzIGFwcGxpZWQgKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MgPSAnLS1mdWxsLWF1dG8nO1xuLyoqIFwiLS15b2xvXCIgaXMgYWx3YXlzIGFwcGxpZWQgKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dFTUlOSV9FWFRSQV9BUkdTID0gJyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MgPSAnLS1jb21wcmVzcyAtLXJlbW92ZS1lbXB0eS1saW5lcyAtLWluY2x1ZGUgXCJzcmMvKiovKi57dHMsdHN4fSwqKi8qLm1kXCInO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1RFU1RfQVRURU1QVFMgPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09ESU5HX1RPT0wgPSAnYWlkZXInO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9SVU5USU1FOiBOb2RlUnVudGltZUFjdHVhbCA9ICducHgnO1xuIiwiZXhwb3J0IGNvbnN0IEhFQURJTkdfT0ZfR0VOX1BSX01FVEFEQVRBID0gJyMjIGdlbi1wciBNZXRhZGF0YSc7XG5cbi8qKlxuICogVHJ1bmNhdGUgbG9uZyB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodGV4dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB0ZXh0LnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgY29uc3Qgb21pdHRlZCA9IHRleHQubGVuZ3RoIC0gbWF4TGVuZ3RoO1xuICAgIHJldHVybiBgJHt0cnVuY2F0ZWR9XFxuXFxuLi4uICgke01hdGguZmxvb3Iob21pdHRlZCl9IGNoYXJhY3RlcnMgdHJ1bmNhdGVkKSAuLi5gO1xuICB9XG5cbiAgcmV0dXJuIHRleHQ7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBIVE1MLXN0eWxlIGNvbW1lbnRzIGZyb20gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1hcmtkb3duQ29udGVudCBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgbWFya2Rvd24gY29udGVudFxuICogQHJldHVybnMgVGhlIHN0cmluZyB3aXRoIEhUTUwgY29tbWVudHMgcmVtb3ZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBIdG1sQ29tbWVudHMobWFya2Rvd25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbWFya2Rvd25Db250ZW50LnJlcGxhY2UoLzwhLS1bXFxzXFxTXSo/LS0+L2csICcnKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGdlbi1wciBtZXRhZGF0YSBzZWN0aW9ucyBmcm9tIGEgUFIgYm9keSBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwTWV0YWRhdGFTZWN0aW9ucyhtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGluZGV4ID0gbWFya2Rvd25Db250ZW50LmluZGV4T2YoSEVBRElOR19PRl9HRU5fUFJfTUVUQURBVEEpO1xuICByZXR1cm4gaW5kZXggPj0gMCA/IG1hcmtkb3duQ29udGVudC5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbWFya2Rvd25Db250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTmV3TGluZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRleHQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByZWdleCBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB0ZXh0IFRoZSBpbnB1dCB0ZXh0XG4gKiBAcGFyYW0gcGF0dGVybiBUaGUgcmVnZXggcGF0dGVybiBzdHJpbmcgdG8gcmVtb3ZlXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIG1hdGNoZWQgcGF0dGVybnMgcmVtb3ZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUmVnZXhQYXR0ZXJuKHRleHQ6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXR0ZXJuKSByZXR1cm4gdGV4dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHJlZ2V4IHBhdHRlcm4gXCIke3BhdHRlcm59XCI6YCwgZXJyb3IpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduT3B0aW9ucywgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgYW5zaXMgZnJvbSAnYW5zaXMnO1xuaW1wb3J0IHsgdHJ1bmNhdGVUZXh0IH0gZnJvbSAnLi90ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgTm9kZVJ1bnRpbWUsIE5vZGVSdW50aW1lQWN0dWFsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IE1BWF9MT0dfTEVOR1RIID0gMzAwMDtcblxuLyoqXG4gKiBOb3JtYWxpemVzIG5vZGUgcnVudGltZSB2YWx1ZXMgdG8gdGhlaXIgYWN0dWFsIGV4ZWN1dGFibGUgY29tbWFuZHMuXG4gKiAnbm9kZScgaXMgYW4gYWxpYXMgZm9yICducHgnIGFuZCAnYnVuJyBpcyBhbiBhbGlhcyBmb3IgJ2J1bngnLlxuICpcbiAqIEBwYXJhbSBydW50aW1lIFRoZSBydW50aW1lIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcnVudGltZSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOb2RlUnVudGltZShydW50aW1lOiBOb2RlUnVudGltZSk6IE5vZGVSdW50aW1lQWN0dWFsIHtcbiAgc3dpdGNoIChydW50aW1lKSB7XG4gICAgY2FzZSAnbm9kZSc6XG4gICAgY2FzZSAnbnB4JzpcbiAgICAgIHJldHVybiAnbnB4JztcbiAgICBjYXNlICdidW4nOlxuICAgIGNhc2UgJ2J1bngnOlxuICAgICAgcmV0dXJuICdidW54JztcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduT3B0aW9ucyAmIHsgaWdub3JlRXhpdFN0YXR1cz86IGJvb2xlYW47IHRydW5jYXRlU3Rkb3V0PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+PiB7XG4gIGNvbnN0IHsgaWdub3JlRXhpdFN0YXR1cywgLi4uc3Bhd25PcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCBhcmdzVGV4dCA9IGFyZ3MubWFwKChhKSA9PiAoYS5pbmNsdWRlcygnICcpID8gYFwiJHthLnJlcGxhY2VBbGwoJ1wiJywgJ1wiJyl9XCJgIDogYSkpLmpvaW4oJyAnKTtcbiAgY29uc29sZS5pbmZvKGFuc2lzLmdyZWVuKGAkICR7Y29tbWFuZH0gJHthcmdzVGV4dH1gKSk7XG5cbiAgY29uc29sZS5pbmZvKCdzdGRvdXQ6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIGFyZ3MsIHNwYXduT3B0aW9ucyk7XG4gIGlmIChzcGF3bk9wdGlvbnMudHJ1bmNhdGVTdGRvdXQpIGNvbnNvbGUuaW5mbyh0cnVuY2F0ZVRleHQocmV0LnN0ZG91dCwgTUFYX0xPR19MRU5HVEgpKTtcbiAgY29uc3Qgc3RkZXJyID0gcmV0LnN0ZGVyci50cmltKCk7XG4gIGlmIChzdGRlcnIpIHtcbiAgICBjb25zb2xlLmluZm8oJ3N0ZGVycjogLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgY29uc3QgdHJ1bmNhdGVkU3RkZXJyID0gdHJ1bmNhdGVUZXh0KHN0ZGVyciwgTUFYX0xPR19MRU5HVEgpO1xuICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3codHJ1bmNhdGVkU3RkZXJyKSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICBjb25zb2xlLmluZm8oYW5zaXMubWFnZW50YShgRXhpdCBjb2RlOiAke3JldC5zdGF0dXN9XFxuYCkpO1xuICBpZiAoIWlnbm9yZUV4aXRTdGF0dXMgJiYgcmV0LnN0YXR1cyAhPT0gMCAmJiByZXQuc3RhdHVzICE9PSBudWxsKSB7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zOiBTcGF3bk9wdGlvbnMgJiB7IHRydW5jYXRlU3Rkb3V0PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhbml0aXplIGFyZ3MgdG8gcmVtb3ZlIG51bGwgYnl0ZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZEFyZ3MgPSAoYXJncyA/PyBbXSkubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKC9cXDAvZywgJycpKTtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBzYW5pdGl6ZWRBcmdzLCBvcHRpb25zKTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucz8udHJ1bmNhdGVTdGRvdXQpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGNvbW1hbmQgbGluZSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBhcmd1bWVudHMsIHByZXNlcnZpbmcgcXVvdGVkIHN0cmluZ3MuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzOlxuICogLSBTcGFjZS1zZXBhcmF0ZWQgYXJndW1lbnRzXG4gKiAtIERvdWJsZS1xdW90ZWQgc3RyaW5ncyAocHJlc2VydmVzIHNwYWNlcyB3aXRoaW4pXG4gKiAtIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyAocHJlc2VydmVzIHNwYWNlcyB3aXRoaW4pXG4gKlxuICogQHBhcmFtIGFyZ3NTdHJpbmcgVGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgdG8gcGFyc2VcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHBhcnNlZCBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tbWFuZExpbmVBcmdzKGFyZ3NTdHJpbmc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFhcmdzU3RyaW5nKSByZXR1cm4gW107XG5cbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnc1N0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBhcmdzU3RyaW5nW2ldO1xuXG4gICAgLy8gSGFuZGxlIHF1b3Rlc1xuICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGFjZXMgKG9ubHkgc3BsaXQgb24gc3BhY2VzIG91dHNpZGUgb2YgcXVvdGVzKVxuICAgIGlmIChjaGFyID09PSAnICcgJiYgIWluRG91YmxlUXVvdGUgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gJyc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGN1cnJlbnQgYXJndW1lbnRcbiAgICBjdXJyZW50ICs9IGNoYXI7XG4gIH1cblxuICAvLyBBZGQgdGhlIGxhc3QgYXJndW1lbnQgaWYgdGhlcmUgaXMgb25lXG4gIGlmIChjdXJyZW50KSB7XG4gICAgcmVzdWx0LnB1c2goY3VycmVudCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICdAb2N0b2tpdC9ncmFwaHFsJztcbmltcG9ydCB0eXBlIHsgUmVzdEVuZHBvaW50TWV0aG9kVHlwZXMgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgTGFiZWxJbmZvLFxuICBQdWxsUmVxdWVzdFBhcmFtcyxcbiAgUHVsbFJlcXVlc3RSZXZpZXcsXG4gIFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkc1Jlc3BvbnNlLFxuICBSZXBvc2l0b3J5SW5mbyxcbiAgU2ltcGxlQ29tbWVudCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLnN0ZG91dC50cmltKCk7XG5pZiAoIXRva2VuKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnR2l0SHViIHRva2VuIG5vdCBmb3VuZC4gUGxlYXNlIHNldCBHSF9UT0tFTiBvciBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGF1dGhlbnRpY2F0ZSB3aXRoIGdoIENMSSdcbiAgKTtcbn1cbmNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5jb25zdCBncmFwaHFsQ2xpZW50ID0gZ3JhcGhxbC5kZWZhdWx0cyh7XG4gIGhlYWRlcnM6IHtcbiAgICBhdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxuICB9LFxufSk7XG5cbmxldCByZXBvT3duZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVwb0luZm8oKTogUHJvbWlzZTxSZXBvc2l0b3J5SW5mbz4ge1xuICBpZiAoIXJlcG9Pd25lciB8fCAhcmVwb05hbWUpIHtcbiAgICAvLyBHZXQgcmVwbyBpbmZvIGZyb20gZ2l0IHJlbW90ZVxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ3JlbW90ZScsICdnZXQtdXJsJywgJ29yaWdpbiddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gICAgY29uc3QgcmVtb3RlVXJsID0gc3Rkb3V0LnRyaW0oKTtcblxuICAgIC8vIFBhcnNlIEdpdEh1YiByZXBvIFVSTCAoc3VwcG9ydHMgYm90aCBodHRwcyBhbmQgc3NoIGZvcm1hdHMpXG4gICAgY29uc3QgbWF0Y2ggPSByZW1vdGVVcmwubWF0Y2goL2dpdGh1YlxcLmNvbVs6L10oW14vXSspXFwvKC4rKS8pO1xuICAgIGlmIChtYXRjaD8uWzFdICYmIG1hdGNoWzJdKSB7XG4gICAgICByZXBvT3duZXIgPSBtYXRjaFsxXTtcbiAgICAgIHJlcG9OYW1lID0gbWF0Y2hbMl0ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcGFyc2UgR2l0SHViIHJlcG9zaXRvcnkgZnJvbSByZW1vdGUgVVJMJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXBvT3duZXIgfHwgIXJlcG9OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvc2l0b3J5IGluZm9ybWF0aW9uIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiB7IG93bmVyOiByZXBvT3duZXIsIHJlcG86IHJlcG9OYW1lIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVQdWxsUmVxdWVzdChwYXJhbXM6IFB1bGxSZXF1ZXN0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3duZXIsIHJlcG8gfSA9IGF3YWl0IGdldFJlcG9JbmZvKCk7XG5cbiAgYXdhaXQgb2N0b2tpdC5wdWxscy5jcmVhdGUoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgdGl0bGU6IHBhcmFtcy50aXRsZSxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgICBoZWFkOiBwYXJhbXMuaGVhZCxcbiAgICBiYXNlOiBwYXJhbXMuYmFzZSxcbiAgICBkcmFmdDogcGFyYW1zLmRyYWZ0LFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFB1bGxSZXF1ZXN0RGlmZihwdWxsTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5wdWxscy5nZXQoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgcHVsbF9udW1iZXI6IHB1bGxOdW1iZXIsXG4gICAgbWVkaWFUeXBlOiB7XG4gICAgICBmb3JtYXQ6ICdkaWZmJyxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVzcG9uc2UuZGF0YSBhcyB1bmtub3duIGFzIHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElzc3VlKGlzc3VlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgbGFiZWxzOiBMYWJlbEluZm9bXTtcbiAgY29tbWVudHM6IFNpbXBsZUNvbW1lbnRbXTtcbiAgdXJsOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHsgb3duZXIsIHJlcG8gfSA9IGF3YWl0IGdldFJlcG9JbmZvKCk7XG5cbiAgLy8gR2V0IGlzc3VlIGRhdGEgZmlyc3QgLSB0aGlzIHdvcmtzIGZvciBib3RoIGlzc3VlcyBhbmQgUFJzXG4gIGNvbnN0IHsgZGF0YTogaXNzdWVEYXRhIH0gPSBhd2FpdCBvY3Rva2l0Lmlzc3Vlcy5nZXQoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgaXNzdWVfbnVtYmVyOiBpc3N1ZU51bWJlcixcbiAgfSk7XG4gIC8vIElmIGl0IGhhcyBwdWxsX3JlcXVlc3QgZmllbGQsIGdldCB0aGUgZnVsbCBQUiBkYXRhXG4gIGxldCBpc3N1ZU9yUHVsbFJlcXVlc3Q6XG4gICAgfCBSZXN0RW5kcG9pbnRNZXRob2RUeXBlc1sncHVsbHMnXVsnZ2V0J11bJ3Jlc3BvbnNlJ11bJ2RhdGEnXVxuICAgIHwgUmVzdEVuZHBvaW50TWV0aG9kVHlwZXNbJ2lzc3VlcyddWydnZXQnXVsncmVzcG9uc2UnXVsnZGF0YSddID0gaXNzdWVEYXRhO1xuICBpZiAoaXNzdWVEYXRhLnB1bGxfcmVxdWVzdCkge1xuICAgIGNvbnN0IHsgZGF0YTogcHJEYXRhIH0gPSBhd2FpdCBvY3Rva2l0LnB1bGxzLmdldCh7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBwdWxsX251bWJlcjogaXNzdWVOdW1iZXIsXG4gICAgfSk7XG4gICAgaXNzdWVPclB1bGxSZXF1ZXN0ID0gcHJEYXRhO1xuICB9XG5cbiAgY29uc3QgY29tbWVudHNSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuaXNzdWVzLmxpc3RDb21tZW50cyh7XG4gICAgb3duZXIsXG4gICAgcmVwbyxcbiAgICBpc3N1ZV9udW1iZXI6IGlzc3VlTnVtYmVyLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGF1dGhvcjogaXNzdWVPclB1bGxSZXF1ZXN0LnVzZXI/LmxvZ2luIHx8ICcnLFxuICAgIHRpdGxlOiBpc3N1ZU9yUHVsbFJlcXVlc3QudGl0bGUsXG4gICAgYm9keTogaXNzdWVPclB1bGxSZXF1ZXN0LmJvZHkgfHwgJycsXG4gICAgbGFiZWxzOiBpc3N1ZU9yUHVsbFJlcXVlc3QubGFiZWxzLm1hcCgobGFiZWw6IHN0cmluZyB8IHsgbmFtZT86IHN0cmluZyB9KSA9PiAoe1xuICAgICAgbmFtZTogdHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwubmFtZSB8fCAnJyxcbiAgICB9KSksXG4gICAgY29tbWVudHM6IGNvbW1lbnRzUmVzcG9uc2UuZGF0YS5tYXAoKGNvbW1lbnQpID0+ICh7XG4gICAgICBhdXRob3I6IGNvbW1lbnQudXNlcj8ubG9naW4gfHwgJycsXG4gICAgICBib2R5OiBjb21tZW50LmJvZHkgfHwgJycsXG4gICAgICBjcmVhdGVkQXQ6IGNvbW1lbnQuY3JlYXRlZF9hdCxcbiAgICB9KSksXG4gICAgdXJsOiBpc3N1ZU9yUHVsbFJlcXVlc3QuaHRtbF91cmwsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQdWxsUmVxdWVzdFJldmlld1RocmVhZHMocHVsbE51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxQdWxsUmVxdWVzdFJldmlld1RocmVhZHNSZXNwb25zZT4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IE1BWF9NRVNTQUdFX0NPVU5UID0gMTAwO1xuICBjb25zdCBxdWVyeSA9IGBcbiAgICBxdWVyeSgkb3duZXI6IFN0cmluZyEsICRyZXBvOiBTdHJpbmchLCAkcHI6IEludCEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHtcbiAgICAgICAgcHVsbFJlcXVlc3QobnVtYmVyOiAkcHIpIHtcbiAgICAgICAgICByZXZpZXdUaHJlYWRzKGZpcnN0OiAke01BWF9NRVNTQUdFX0NPVU5UfSkge1xuICAgICAgICAgICAgbm9kZXMge1xuICAgICAgICAgICAgICBpc1Jlc29sdmVkXG4gICAgICAgICAgICAgIGNvbW1lbnRzKGZpcnN0OiAke01BWF9NRVNTQUdFX0NPVU5UfSkge1xuICAgICAgICAgICAgICAgIG5vZGVzIHtcbiAgICAgICAgICAgICAgICAgIGF1dGhvciB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2luXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBib2R5XG4gICAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAgICAgICBkaWZmSHVua1xuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBgO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdyYXBocWxDbGllbnQocXVlcnksIHtcbiAgICBvd25lcixcbiAgICByZXBvLFxuICAgIHByOiBwdWxsTnVtYmVyLFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IGFzIFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkc1Jlc3BvbnNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHVsbFJlcXVlc3RSZXZpZXdzKHB1bGxOdW1iZXI6IG51bWJlcik6IFByb21pc2U8UHVsbFJlcXVlc3RSZXZpZXdbXT4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5wdWxscy5saXN0UmV2aWV3cyh7XG4gICAgb3duZXIsXG4gICAgcmVwbyxcbiAgICBwdWxsX251bWJlcjogcHVsbE51bWJlcixcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGEubWFwKChyZXZpZXcpID0+ICh7XG4gICAgdXNlcjogeyBsb2dpbjogcmV2aWV3LnVzZXI/LmxvZ2luIHx8ICcnIH0sXG4gICAgc3RhdGU6IHJldmlldy5zdGF0ZSxcbiAgICBib2R5OiByZXZpZXcuYm9keSB8fCAnJyxcbiAgICBzdWJtaXR0ZWRfYXQ6IHJldmlldy5zdWJtaXR0ZWRfYXQgfHwgJycsXG4gIH0pKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuL21haW4uanMnO1xuaW1wb3J0IHsgZ2V0SXNzdWUsIGdldFB1bGxSZXF1ZXN0RGlmZiwgZ2V0UHVsbFJlcXVlc3RSZXZpZXdzLCBnZXRQdWxsUmVxdWVzdFJldmlld1RocmVhZHMgfSBmcm9tICcuL29jdG9raXQuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplTmV3TGluZXMsIHJlbW92ZVJlZ2V4UGF0dGVybiwgc3RyaXBIdG1sQ29tbWVudHMsIHN0cmlwTWV0YWRhdGFTZWN0aW9ucyB9IGZyb20gJy4vdGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IElzc3VlQ29tbWVudCwgSXNzdWVJbmZvLCBVc2VyTG9naW4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gVGVtcG9yYXJ5IGludGVyZmFjZSBmb3Igc29ydGluZyBjb21tZW50cyB3aXRoIGRhdGUgaW5mb3JtYXRpb25cbmludGVyZmFjZSBJc3N1ZUNvbW1lbnRXaXRoRGF0ZSBleHRlbmRzIElzc3VlQ29tbWVudCB7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSXNzdWVJbmZvKG9wdGlvbnM6IE1haW5PcHRpb25zKTogUHJvbWlzZTxJc3N1ZUluZm8+IHtcbiAgY29uc3QgcHJvY2Vzc2VkSXNzdWVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGNvbnN0IGlzc3VlSW5mbyA9IGF3YWl0IGZldGNoSXNzdWVEYXRhKG9wdGlvbnMuaXNzdWVOdW1iZXIsIHByb2Nlc3NlZElzc3Vlcywgb3B0aW9ucywgZmFsc2UpO1xuICBpZiAoIWlzc3VlSW5mbykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGlzc3VlIGRhdGEgZm9yIGlzc3VlICMke29wdGlvbnMuaXNzdWVOdW1iZXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGlzc3VlSW5mbztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQUkRpZmYoaXNzdWVOdW1iZXI6IG51bWJlciwgaXNzdWVJbmZvOiBJc3N1ZUluZm8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwckRpZmYgPSBhd2FpdCBnZXRQdWxsUmVxdWVzdERpZmYoaXNzdWVOdW1iZXIpO1xuICAgIGlmICghcHJEaWZmLnRyaW0oKSkgcmV0dXJuO1xuICAgIGlzc3VlSW5mby5jb2RlX2NoYW5nZXMgPSBwcm9jZXNzRGlmZkNvbnRlbnQocHJEaWZmLnRyaW0oKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggUFIgZGlmZjonLCBlcnJvcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hJc3N1ZURhdGEoXG4gIGlzc3VlTnVtYmVyOiBudW1iZXIsXG4gIHByb2Nlc3NlZElzc3VlczogU2V0PG51bWJlcj4sXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBpc1JlZmVyZW5jZWQgPSBmYWxzZVxuKTogUHJvbWlzZTxJc3N1ZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHByb2Nlc3NlZElzc3Vlcy5oYXMoaXNzdWVOdW1iZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb2Nlc3NlZElzc3Vlcy5hZGQoaXNzdWVOdW1iZXIpO1xuXG4gIGxldCBpc3N1ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRJc3N1ZT4+O1xuICB0cnkge1xuICAgIGlzc3VlID0gYXdhaXQgZ2V0SXNzdWUoaXNzdWVOdW1iZXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIGlzc3VlICMke2lzc3VlTnVtYmVyfTpgLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRXh0cmFjdCBpc3N1ZS9QUiByZWZlcmVuY2VzIGZyb20gdGhlIGlzc3VlIGJvZHkgYW5kIGNvbW1lbnRzXG4gIGNvbnN0IGFsbFRleHQgPSBbaXNzdWUuYm9keSwgLi4uaXNzdWUuY29tbWVudHMubWFwKChjKSA9PiBjLmJvZHkpXS5qb2luKCdcXG4nKTtcbiAgY29uc3QgcmVmZXJlbmNlZE51bWJlcnMgPSBleHRyYWN0SXNzdWVSZWZlcmVuY2VzKGFsbFRleHQpO1xuXG4gIGNvbnN0IHJhd0JvZHkgPSBzdHJpcEh0bWxDb21tZW50cyhpc3N1ZS5ib2R5KTtcbiAgY29uc3QgcHJvY2Vzc2VkQm9keSA9IGlzc3VlLnVybD8uaW5jbHVkZXMoJy9wdWxsLycpID8gc3RyaXBNZXRhZGF0YVNlY3Rpb25zKHJhd0JvZHkpIDogcmF3Qm9keTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByZW1vdmVSZWdleFBhdHRlcm4ocHJvY2Vzc2VkQm9keSwgb3B0aW9ucy5yZW1vdmVQYXR0ZXJuIHx8ICcnKTtcbiAgY29uc3QgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXSA9IGlzc3VlLmNvbW1lbnRzLm1hcCgoYykgPT4gKHtcbiAgICBhdXRob3I6IGMuYXV0aG9yLFxuICAgIGJvZHk6IG5vcm1hbGl6ZU5ld0xpbmVzKGMuYm9keSksXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjLmNyZWF0ZWRBdCkuZ2V0VGltZSgpLFxuICB9KSk7XG5cbiAgY29uc3QgaXNzdWVJbmZvOiBJc3N1ZUluZm8gPSB7XG4gICAgYXV0aG9yOiBpc3N1ZS5hdXRob3IsXG4gICAgdGl0bGU6IGlzc3VlLnRpdGxlLFxuICAgIGRlc2NyaXB0aW9uOiBub3JtYWxpemVOZXdMaW5lcyhkZXNjcmlwdGlvbiksXG4gICAgY29tbWVudHM6IFtdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBhZnRlciBzb3J0aW5nXG4gIH07XG5cbiAgaWYgKGlzc3VlLnVybD8uaW5jbHVkZXMoJy9wdWxsLycpICYmICFpc1JlZmVyZW5jZWQpIHtcbiAgICBhd2FpdCBmZXRjaFBSRGlmZihpc3N1ZU51bWJlciwgaXNzdWVJbmZvKTtcbiAgICBhd2FpdCBmZXRjaFBSUmV2aWV3VGhyZWFkcyhpc3N1ZU51bWJlciwgY29tbWVudHNXaXRoRGF0ZSk7XG4gICAgYXdhaXQgZmV0Y2hQUlJldmlld3MoaXNzdWVOdW1iZXIsIGNvbW1lbnRzV2l0aERhdGUpO1xuICB9XG5cbiAgaWYgKHJlZmVyZW5jZWROdW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBmZXRjaFJlZmVyZW5jZWRJc3N1ZXMocmVmZXJlbmNlZE51bWJlcnMsIHByb2Nlc3NlZElzc3Vlcywgb3B0aW9ucywgaXNzdWVJbmZvKTtcbiAgfVxuXG4gIC8vIFNvcnQgY29tbWVudHMgYnkgY3JlYXRpb24gZGF0ZSAob2xkZXN0IGZpcnN0KSBhbmQgcmVtb3ZlIGNyZWF0ZWRBdCBmaWVsZFxuICBpc3N1ZUluZm8uY29tbWVudHMgPSBjb21tZW50c1dpdGhEYXRlXG4gICAgLmZpbHRlcigoYykgPT4gYy5ib2R5KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNyZWF0ZWRBdCAtIGIuY3JlYXRlZEF0KVxuICAgIC5tYXAoKHsgY3JlYXRlZEF0LCAuLi5jb21tZW50IH0pID0+IGNvbW1lbnQpO1xuXG4gIHJldHVybiBpc3N1ZUluZm87XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUFJSZXZpZXdUaHJlYWRzKGlzc3VlTnVtYmVyOiBudW1iZXIsIGNvbW1lbnRzV2l0aERhdGU6IElzc3VlQ29tbWVudFdpdGhEYXRlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsRGF0YSA9IGF3YWl0IGdldFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkcyhpc3N1ZU51bWJlcik7XG4gICAgY29uc3QgcmV2aWV3VGhyZWFkcyA9IGdyYXBocWxEYXRhPy5yZXBvc2l0b3J5Py5wdWxsUmVxdWVzdD8ucmV2aWV3VGhyZWFkcz8ubm9kZXMgfHwgW107XG5cbiAgICBmb3IgKGNvbnN0IHRocmVhZCBvZiByZXZpZXdUaHJlYWRzKSB7XG4gICAgICBpZiAoIXRocmVhZC5pc1Jlc29sdmVkICYmIHRocmVhZC5jb21tZW50cz8ubm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc1Jldmlld1RocmVhZENvbW1lbnRzKHRocmVhZC5jb21tZW50cy5ub2RlcywgY29tbWVudHNXaXRoRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIFBSIHJldmlldyB0aHJlYWRzOicsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzUmV2aWV3VGhyZWFkQ29tbWVudHMoXG4gIGNvbW1lbnRzOiBBcnJheTx7XG4gICAgYXV0aG9yPzogVXNlckxvZ2luO1xuICAgIGJvZHk/OiBzdHJpbmc7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICBsaW5lPzogbnVtYmVyO1xuICAgIGRpZmZIdW5rPzogc3RyaW5nO1xuICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB9PixcbiAgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgY29tbWVudCBvZiBjb21tZW50cykge1xuICAgIGlmICghY29tbWVudC5hdXRob3IgfHwgIWNvbW1lbnQuYm9keSkgY29udGludWU7XG5cbiAgICBjb25zdCBjb2RlQ29udGVudCA9IGV4dHJhY3RDb2RlRnJvbURpZmZIdW5rKGNvbW1lbnQuZGlmZkh1bmspO1xuICAgIGNvbnN0IHJldmlld0NvbW1lbnQ6IElzc3VlQ29tbWVudFdpdGhEYXRlID0ge1xuICAgICAgYXV0aG9yOiBjb21tZW50LmF1dGhvci5sb2dpbixcbiAgICAgIGNvZGVMb2NhdGlvbjogY29tbWVudC5wYXRoICYmIGNvbW1lbnQubGluZSA/IGAke2NvbW1lbnQucGF0aH06JHtjb21tZW50LmxpbmV9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGVDb250ZW50OiBjb2RlQ29udGVudCB8fCB1bmRlZmluZWQsXG4gICAgICBib2R5OiBub3JtYWxpemVOZXdMaW5lcyhjb21tZW50LmJvZHkpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjb21tZW50LmNyZWF0ZWRBdCkuZ2V0VGltZSgpLFxuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHByb3BlcnRpZXNcbiAgICBPYmplY3Qua2V5cyhyZXZpZXdDb21tZW50KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChyZXZpZXdDb21tZW50W2tleSBhcyBrZXlvZiBJc3N1ZUNvbW1lbnRXaXRoRGF0ZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgcmV2aWV3Q29tbWVudFtrZXkgYXMga2V5b2YgSXNzdWVDb21tZW50V2l0aERhdGVdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29tbWVudHNXaXRoRGF0ZS5wdXNoKHJldmlld0NvbW1lbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb2RlRnJvbURpZmZIdW5rKGRpZmZIdW5rOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWRpZmZIdW5rKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgbGluZXMgPSBkaWZmSHVuay5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGNvZGVMaW5lID0gbGluZXMuZmluZChcbiAgICAobGluZTogc3RyaW5nKSA9PiAobGluZS5zdGFydHNXaXRoKCcrJykgfHwgbGluZS5zdGFydHNXaXRoKCctJykpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ0BAJykgJiYgbGluZS50cmltKCkubGVuZ3RoID4gMVxuICApO1xuICByZXR1cm4gY29kZUxpbmU/LnRyaW0oKSB8fCAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQUlJldmlld3MoaXNzdWVOdW1iZXI6IG51bWJlciwgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJldmlld3MgPSBhd2FpdCBnZXRQdWxsUmVxdWVzdFJldmlld3MoaXNzdWVOdW1iZXIpO1xuICAgIGNvbnN0IHJldmlld1Jlc3VsdENvbW1lbnRzOiBJc3N1ZUNvbW1lbnRXaXRoRGF0ZVtdID0gcmV2aWV3cy5tYXAoKHJldmlldykgPT4gKHtcbiAgICAgIGF1dGhvcjogcmV2aWV3LnVzZXIubG9naW4sXG4gICAgICByZXZpZXdTdGF0ZTogcmV2aWV3LnN0YXRlLFxuICAgICAgYm9keTogbm9ybWFsaXplTmV3TGluZXMocmV2aWV3LmJvZHkpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShyZXZpZXcuc3VibWl0dGVkX2F0KS5nZXRUaW1lKCksXG4gICAgfSkpO1xuICAgIGNvbW1lbnRzV2l0aERhdGUucHVzaCguLi5yZXZpZXdSZXN1bHRDb21tZW50cyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggUFIgcmV2aWV3czonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdElzc3VlUmVmZXJlbmNlcyh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlZ2V4ID0gLyg/Ol58XFxzKSMoXFxkKykvZztcbiAgY29uc3QgbnVtYmVyczogbnVtYmVyW10gPSBbXTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyh0ZXh0KTtcbiAgICBpZiAoIW1hdGNoKSBicmVhaztcblxuICAgIGNvbnN0IG51bWJlciA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSA/PyAnJywgMTApO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikpIHtcbiAgICAgIG51bWJlcnMucHVzaChudW1iZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQobnVtYmVycyldOyAvLyBSZW1vdmUgZHVwbGljYXRlc1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZmVyZW5jZWRJc3N1ZXMoXG4gIHJlZmVyZW5jZWROdW1iZXJzOiBudW1iZXJbXSxcbiAgcHJvY2Vzc2VkSXNzdWVzOiBTZXQ8bnVtYmVyPixcbiAgb3B0aW9uczogTWFpbk9wdGlvbnMsXG4gIGlzc3VlSW5mbzogSXNzdWVJbmZvXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVmZXJlbmNlZElzc3Vlc1Byb21pc2VzID0gcmVmZXJlbmNlZE51bWJlcnMubWFwKChudW0pID0+IGZldGNoSXNzdWVEYXRhKG51bSwgcHJvY2Vzc2VkSXNzdWVzLCBvcHRpb25zLCB0cnVlKSk7XG4gIGNvbnN0IHJlZmVyZW5jZWRJc3N1ZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVmZXJlbmNlZElzc3Vlc1Byb21pc2VzKSkuZmlsdGVyKChpc3N1ZSk6IGlzc3VlIGlzIElzc3VlSW5mbyA9PiAhIWlzc3VlKTtcblxuICBpZiAocmVmZXJlbmNlZElzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpc3N1ZUluZm8ucmVmZXJlbmNlZF9pc3N1ZXMgPSByZWZlcmVuY2VkSXNzdWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgZGlmZiBjb250ZW50IHRvIGhhbmRsZSBsYXJnZSBkaWZmcyBieSB0cnVuY2F0aW5nIG9yIG9taXR0aW5nIGxhcmdlIGZyYWdtZW50c1xuICovXG5mdW5jdGlvbiBwcm9jZXNzRGlmZkNvbnRlbnQoZGlmZkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IE1BWF9UT1RBTF9ESUZGX1NJWkUgPSA1MDAwMDtcbiAgY29uc3QgTUFYX0ZJTEVfRElGRl9TSVpFID0gMTAwMDA7XG4gIGNvbnN0IExBUkdFX0ZJTEVfUEFUVEVSTlMgPSBbXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9kaXN0XFwvL20sXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9idWlsZFxcLy9tLFxuICAgIC9eZGlmZiAtLWdpdCBhXFwvLipcXC5idW5kbGVcXC4vbSxcbiAgICAvXmRpZmYgLS1naXQgYVxcLy4qXFwubWluXFwuL20sXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9ub2RlX21vZHVsZXNcXC8vbSxcbiAgXTtcblxuICAvLyBJZiB0aGUgZW50aXJlIGRpZmYgaXMgc21hbGwgZW5vdWdoLCByZXR1cm4gYXMtaXNcbiAgaWYgKGRpZmZDb250ZW50Lmxlbmd0aCA8PSBNQVhfVE9UQUxfRElGRl9TSVpFKSB7XG4gICAgcmV0dXJuIGRpZmZDb250ZW50O1xuICB9XG5cbiAgLy8gU3BsaXQgZGlmZiBpbnRvIGluZGl2aWR1YWwgZmlsZSBzZWN0aW9uc1xuICBjb25zdCBmaWxlU2VjdGlvbnMgPSBkaWZmQ29udGVudC5zcGxpdCgvKD89XmRpZmYgLS1naXQpL20pO1xuICBjb25zdCBwcm9jZXNzZWRTZWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGZpbGVTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbi50cmltKCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgaXNMYXJnZUZpbGUgPSBMQVJHRV9GSUxFX1BBVFRFUk5TLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzZWN0aW9uKSk7XG5cbiAgICBpZiAoaXNMYXJnZUZpbGUpIHtcbiAgICAgIC8vIEZvciBsYXJnZS9idW5kbGVkIGZpbGVzLCBpbmNsdWRlIG9ubHkgdGhlIGhlYWRlciBhbmQgYSB0cnVuY2F0aW9uIG5vdGljZVxuICAgICAgY29uc3QgbGluZXMgPSBzZWN0aW9uLnNwbGl0KCdcXG4nKTtcbiAgICAgIGNvbnN0IGhlYWRlckxpbmVzID0gbGluZXMuc2xpY2UoMCwgNCk7IC8vIGRpZmYgLS1naXQsIGluZGV4LCAtLS0sICsrK1xuICAgICAgY29uc3QgdHJ1bmNhdGVkU2VjdGlvbiA9IFtcbiAgICAgICAgLi4uaGVhZGVyTGluZXMsXG4gICAgICAgICdAQCAuLi4gQEAnLFxuICAgICAgICAnLi4uIChsYXJnZSBidW5kbGVkL2NvbXBpbGVkIGZpbGUgZGlmZiB0cnVuY2F0ZWQpIC4uLicsXG4gICAgICAgICcnLFxuICAgICAgXS5qb2luKCdcXG4nKTtcblxuICAgICAgcHJvY2Vzc2VkU2VjdGlvbnMucHVzaCh0cnVuY2F0ZWRTZWN0aW9uKTtcbiAgICAgIHRvdGFsU2l6ZSArPSB0cnVuY2F0ZWRTZWN0aW9uLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHNlY3Rpb24ubGVuZ3RoID4gTUFYX0ZJTEVfRElGRl9TSVpFKSB7XG4gICAgICAvLyBGb3Igb3RoZXIgbGFyZ2UgZmlsZXMsIHRydW5jYXRlIGJ1dCBrZWVwIHNvbWUgY29udGVudFxuICAgICAgY29uc3QgdHJ1bmNhdGVkU2VjdGlvbiA9IGAke3NlY3Rpb24uc2xpY2UoMCwgTUFYX0ZJTEVfRElGRl9TSVpFKX1cXG4uLi4gKGRpZmYgdHJ1bmNhdGVkKSAuLi5cXG5gO1xuICAgICAgcHJvY2Vzc2VkU2VjdGlvbnMucHVzaCh0cnVuY2F0ZWRTZWN0aW9uKTtcbiAgICAgIHRvdGFsU2l6ZSArPSB0cnVuY2F0ZWRTZWN0aW9uLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU21hbGwgZmlsZXMsIGluY2x1ZGUgYXMtaXNcbiAgICAgIHByb2Nlc3NlZFNlY3Rpb25zLnB1c2goc2VjdGlvbik7XG4gICAgICB0b3RhbFNpemUgKz0gc2VjdGlvbi5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBpZiB3ZSdyZSBhcHByb2FjaGluZyB0aGUgdG90YWwgc2l6ZSBsaW1pdFxuICAgIGlmICh0b3RhbFNpemUgPiBNQVhfVE9UQUxfRElGRl9TSVpFICogMC45KSB7XG4gICAgICBwcm9jZXNzZWRTZWN0aW9ucy5wdXNoKCdcXG4uLi4gKHJlbWFpbmluZyBkaWZmcyB0cnVuY2F0ZWQpIC4uLlxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByb2Nlc3NlZFNlY3Rpb25zLmpvaW4oJycpO1xufVxuIiwiLyoqXG4gKiBFeHRyYWN0cyBjb250ZW50IGJldHdlZW4gc3BlY2lmaWVkIGhlYWRlcnMgZnJvbSBhIHRleHRcbiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHBhcnNlXG4gKiBAcGFyYW0gaGVhZGVycyBBcnJheSBvZiBoZWFkZXIgc3RyaW5ncyB0byBleHRyYWN0IGNvbnRlbnQgZm9yXG4gKiBAcmV0dXJucyBBcnJheSBvZiBjb250ZW50IHN0cmluZ3MsIG9yIHVuZGVmaW5lZCBpZiBhbnkgaGVhZGVycyBhcmUgbWlzc2luZyBvciBpbiBkaWZmZXJlbnQgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RIZWFkZXJDb250ZW50cyh0ZXh0OiBzdHJpbmcsIGhlYWRlcnM6IHN0cmluZ1tdKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBtb2RpZmllZFJlc3BvbnNlID0gYFxcbiR7dGV4dH1gO1xuICBjb25zdCBpbmRpY2VzID0gaGVhZGVycy5tYXAoKGhlYWRlcikgPT4gbW9kaWZpZWRSZXNwb25zZS5pbmRleE9mKGBcXG4ke2hlYWRlcn1gKSk7XG5cbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBhbnkgaGVhZGVycyBhcmUgbWlzc2luZyBvciBub3QgaW4gb3JkZXJcbiAgaWYgKFxuICAgIGluZGljZXMuc29tZSgoaW5kZXgpID0+IGluZGV4ID09PSAtMSkgfHxcbiAgICAhaW5kaWNlcy5ldmVyeSgoaW5kZXgsIGkpID0+IGkgPT09IDAgfHwgaW5kZXggPiAoaW5kaWNlc1tpIC0gMV0gYXMgbnVtYmVyKSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzLm1hcCgoaGVhZGVyLCBpKSA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSAoaW5kaWNlc1tpXSBhcyBudW1iZXIpICsgMSArIGhlYWRlci5sZW5ndGg7XG4gICAgY29uc3QgZW5kID0gaSArIDEgPCBoZWFkZXJzLmxlbmd0aCA/IChpbmRpY2VzW2kgKyAxXSBhcyBudW1iZXIpICsgMSA6IG1vZGlmaWVkUmVzcG9uc2UubGVuZ3RoO1xuICAgIHJldHVybiBtb2RpZmllZFJlc3BvbnNlLnNsaWNlKHN0YXJ0LCBlbmQpLnRyaW0oKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGlzdGluY3RGZW5jZShjb250ZW50OiBzdHJpbmcsIGZlbmNlQ2hhcjogJ2AnIHwgJ34nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAke2ZlbmNlQ2hhcn17Myx9YCwgJ2cnKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2gocmVnZXgpO1xuICBjb25zdCBtYXhMZW5ndGggPSBtYXRjaGVzID8gTWF0aC5tYXgoLi4ubWF0Y2hlcy5tYXAoKHNlcSkgPT4gc2VxLmxlbmd0aCkpIDogMDtcbiAgY29uc3QgZmVuY2VMZW5ndGggPSBNYXRoLm1heCgzLCBtYXhMZW5ndGggKyAxKTtcbiAgcmV0dXJuIGZlbmNlQ2hhci5yZXBlYXQoZmVuY2VMZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbUNvZGVCbG9ja0ZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZW1vdmUgY29kZSBibG9jayBmZW5jZXMgd2l0aCBhbnkgbnVtYmVyIG9mIGJhY2t0aWNrcyBvciB0aWxkZXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmRcbiAgcmV0dXJuIGNvbnRlbnQudHJpbSgpLnJlcGxhY2UoL14oYHszLH18fnszLH0pW1xcc1xcU10qP1xcbihbXFxzXFxTXSo/KVxcblxcMVxccyokLywgJyQyJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcbmltcG9ydCB7IGdlbmVyYXRlVGV4dCwgdHlwZSBNZXNzYWdlIH0gZnJvbSAnYWktdjQnO1xuaW1wb3J0IHsgY3JlYXRlT2xsYW1hIH0gZnJvbSAnb2xsYW1hLWFpLXByb3ZpZGVyLXYyJztcbmltcG9ydCB7IGxvZ1Jlc3VsdCB9IGZyb20gJy4vbGxtLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogQ2FsbCBBSSBTREsgdjQgcHJvdmlkZXIgQVBJIChmb3IgT2xsYW1hKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbFY0UHJvdmlkZXJBcGkoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgcmVhc29uaW5nRWZmb3J0PzogUmVhc29uaW5nRWZmb3J0XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBbcHJvdmlkZXIsIC4uLm1vZGVsUGFydHNdID0gbW9kZWwuc3BsaXQoJy8nKSBhcyBbc3RyaW5nLCAuLi5zdHJpbmdbXV07XG4gIHRyeSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxQYXJ0cy5qb2luKCcvJyk7IC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBtb2RlbCBuYW1lIGl0c2VsZiBjb250YWlucyAnLydcbiAgICBpZiAoIW1vZGVsTmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCAke3Byb3ZpZGVyfSBtb2RlbCBmb3JtYXQ6ICR7bW9kZWx9LiBFeHBlY3RlZCBmb3JtYXQ6ICR7cHJvdmlkZXJ9L21vZGVsLW5hbWVgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGxhbWFCYXNlVVJMID0gYCR7cHJvY2Vzcy5lbnYuT0xMQU1BX0JBU0VfVVJMIHx8ICdodHRwOi8vbG9jYWxob3N0OjExNDM0J30vYXBpYDtcbiAgICBjb25zdCBvbGxhbWEgPSBjcmVhdGVPbGxhbWEoe1xuICAgICAgYmFzZVVSTDogb2xsYW1hQmFzZVVSTCxcbiAgICAgIC4uLihwcm9jZXNzLmVudi5PTExBTUFfQVBJX0tFWSAmJiB7IGFwaUtleTogcHJvY2Vzcy5lbnYuT0xMQU1BX0FQSV9LRVkgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcHJvdmlkZXJNb2RlbCA9IG9sbGFtYShtb2RlbE5hbWUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBwcm92aWRlck1vZGVsLFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiByZWFzb25pbmdFZmZvcnQgPyB7IG9sbGFtYTogeyB0aGluazogdHJ1ZSB9IH0gOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlczogY29udmVydFRvVjRNZXNzYWdlcyhtZXNzYWdlcyksXG4gICAgfSk7XG4gICAgbG9nUmVzdWx0KG1vZGVsLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke3Byb3ZpZGVyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvdmlkZXIuc2xpY2UoMSl9IEFQSSBlcnJvciBmb3IgbW9kZWwgJHttb2RlbH06YCwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgQUkgU0RLIHY1IE1vZGVsTWVzc2FnZVtdIHRvIEFJIFNESyB2NCBNZXNzYWdlW10gZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb1Y0TWVzc2FnZXMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogTWVzc2FnZVtdIHtcbiAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobXNnLCBpbmRleCkgPT4gKHtcbiAgICBpZDogYG1zZy0ke2luZGV4fWAsXG4gICAgcm9sZTogbXNnLnJvbGUgPT09ICd0b29sJyA/ICdkYXRhJyA6IG1zZy5yb2xlLFxuICAgIGNvbnRlbnQ6IHR5cGVvZiBtc2cuY29udGVudCA9PT0gJ3N0cmluZycgPyBtc2cuY29udGVudCA6IEpTT04uc3RyaW5naWZ5KG1zZy5jb250ZW50KSxcbiAgfSkpO1xufVxuIiwiLyoqXG4gKiBgYmxvY2tRdW90ZTogJ2xpdGVyYWwnYDogVXNlIGEgcGlwZSAoYHByb3A6IHxgKSB0byByZXByZXNlbnQgbXVsdGktbGluZSBzdHJpbmdzLlxuICogYGxpbmVXaWR0aDogMGA6IE5vIGxpbWl0IG9uIHRoZSBsaW5lIHdpZHRoLlxuICovXG5leHBvcnQgY29uc3QgeWFtbFN0cmluZ2lmeU9wdGlvbnMgPSB7IGJsb2NrUXVvdGU6ICdsaXRlcmFsJywgbGluZVdpZHRoOiAwIH0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBjcmVhdGVBbWF6b25CZWRyb2NrIH0gZnJvbSAnQGFpLXNkay9hbWF6b24tYmVkcm9jayc7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY1Byb3ZpZGVyT3B0aW9ucywgY3JlYXRlQW50aHJvcGljIH0gZnJvbSAnQGFpLXNkay9hbnRocm9waWMnO1xuaW1wb3J0IHsgY3JlYXRlQXp1cmUgfSBmcm9tICdAYWktc2RrL2F6dXJlJztcbmltcG9ydCB7IGNyZWF0ZUdvb2dsZUdlbmVyYXRpdmVBSSwgdHlwZSBHb29nbGVHZW5lcmF0aXZlQUlQcm92aWRlck9wdGlvbnMgfSBmcm9tICdAYWktc2RrL2dvb2dsZSc7XG5pbXBvcnQgeyBjcmVhdGVWZXJ0ZXggfSBmcm9tICdAYWktc2RrL2dvb2dsZS12ZXJ0ZXgnO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJLCB0eXBlIE9wZW5BSVJlc3BvbnNlc1Byb3ZpZGVyT3B0aW9ucyB9IGZyb20gJ0BhaS1zZGsvb3BlbmFpJztcbmltcG9ydCB0eXBlIHsgTGFuZ3VhZ2VNb2RlbFYyIH0gZnJvbSAnQGFpLXNkay9wcm92aWRlcic7XG5pbXBvcnQgeyBjcmVhdGVYYWkgfSBmcm9tICdAYWktc2RrL3hhaSc7XG5pbXBvcnQgeyBjcmVhdGVPcGVuUm91dGVyIH0gZnJvbSAnQG9wZW5yb3V0ZXIvYWktc2RrLXByb3ZpZGVyJztcbmltcG9ydCB7IGdlbmVyYXRlVGV4dCwgdHlwZSBNb2RlbE1lc3NhZ2UgfSBmcm9tICdhaSc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCB7IGNhbGxWNFByb3ZpZGVyQXBpIH0gZnJvbSAnLi9sbG12NC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ0VmZm9ydCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgeWFtbFN0cmluZ2lmeU9wdGlvbnMgfSBmcm9tICcuL3lhbWwuanMnO1xuXG4vKipcbiAqIENhbGwgTExNIEFQSSB1c2luZyBBSSBTREsgNVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbExsbUFwaShcbiAgbW9kZWw6IHN0cmluZyxcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdLFxuICByZWFzb25pbmdFZmZvcnQ/OiBSZWFzb25pbmdFZmZvcnRcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgT2xsYW1hIHVzaW5nIEFJIFNESyB2NFxuICAgIGlmIChtb2RlbC5zdGFydHNXaXRoKCdvbGxhbWEvJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsVjRQcm92aWRlckFwaShtb2RlbCwgbWVzc2FnZXMsIHJlYXNvbmluZ0VmZm9ydCk7XG4gICAgfVxuXG4gICAgY29uc3QgW21vZGVsSW5zdGFuY2UsIHByb3ZpZGVyLCBtb2RlbE5hbWVdID0gZ2V0TW9kZWxJbnN0YW5jZShtb2RlbCwgcmVhc29uaW5nRWZmb3J0KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnNcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBQYXJhbWV0ZXJzPHR5cGVvZiBnZW5lcmF0ZVRleHQ+WzBdID0ge1xuICAgICAgbW9kZWw6IG1vZGVsSW5zdGFuY2UsXG4gICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgfTtcblxuICAgIGlmIChyZWFzb25pbmdFZmZvcnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBtb2RlbCBzdXBwb3J0cyByZWFzb25pbmcvdGhpbmtpbmcgb3B0aW9uc1xuICAgICAgY29uc3QgbW9kZWxTdXBwb3J0c1JlYXNvbmluZyA9IHN1cHBvcnRzUmVhc29uaW5nT3B0aW9ucyhwcm92aWRlciwgbW9kZWxOYW1lKTtcblxuICAgICAgaWYgKCFtb2RlbFN1cHBvcnRzUmVhc29uaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgTW9kZWwgJHttb2RlbH0gZG9lcyBub3Qgc3VwcG9ydCByZWFzb25pbmcvdGhpbmtpbmcgb3B0aW9ucy4gSWdub3JpbmcgcmVhc29uaW5nIGVmZm9ydCBwYXJhbWV0ZXIuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmdCdWRnZXQgPSBnZXRUaGlua2luZ0J1ZGdldChyZWFzb25pbmdFZmZvcnQpO1xuICAgICAgICBpZiAocHJvdmlkZXIgPT09ICdvcGVuYWknKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcGVuYWk6IHtcbiAgICAgICAgICAgICAgcmVhc29uaW5nRWZmb3J0LFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgT3BlbkFJUmVzcG9uc2VzUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgPT09ICdhbnRocm9waWMnKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbnRocm9waWM6IHtcbiAgICAgICAgICAgICAgdGhpbmtpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZW5hYmxlZCcsXG4gICAgICAgICAgICAgICAgYnVkZ2V0VG9rZW5zOiB0aGlua2luZ0J1ZGdldCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFudGhyb3BpY1Byb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyID09PSAnZ2VtaW5pJykge1xuICAgICAgICAgIHJlcXVlc3RQYXJhbXMucHJvdmlkZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgZ29vZ2xlOiB7XG4gICAgICAgICAgICAgIHRoaW5raW5nQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgdGhpbmtpbmdCdWRnZXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBHb29nbGVHZW5lcmF0aXZlQUlQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm92aWRlciA9PT0gJ2JlZHJvY2snKSB7XG4gICAgICAgICAgLy8gVGhlIGxhdGVzdCBBSSBTREsgZG9lc24ndCB3b3JrIG9uIEJlZHJvY2sgd2l0aCByZWFzb25pbmcuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYE5vdGU6IFRoZSBjdXJyZW50IEFJIFNESyBkb2Vzbid0IHdvcmsgb24gQmVkcm9jayB3aXRoIHJlYXNvbmluZy4gTW9kZWwgJHttb2RlbE5hbWV9IHdpbGwgdXNlIGRlZmF1bHQgcmVhc29uaW5nIHNldHRpbmdzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHJlcXVlc3RQYXJhbXMucHJvdmlkZXJPcHRpb25zID0ge1xuICAgICAgICAgIC8vICAgYmVkcm9jazoge1xuICAgICAgICAgIC8vICAgICByZWFzb25pbmdDb25maWc6IHsgdHlwZTogJ2VuYWJsZWQnLCBidWRnZXRUb2tlbnM6IHRoaW5raW5nQnVkZ2V0IH0sXG4gICAgICAgICAgLy8gICB9IHNhdGlzZmllcyBCZWRyb2NrUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgIC8vIH07XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgPT09ICd4YWknKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICB4YWk6IHtcbiAgICAgICAgICAgICAgcmVhc29uaW5nRWZmb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHJlcXVlc3RQYXJhbXMpO1xuICAgIGxvZ1Jlc3VsdChtb2RlbCwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBMTE0gQVBJIGVycm9yIGZvciBtb2RlbCAke21vZGVsfTpgLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogTG9nIHRoZSByZXN1bHQgb2YgYW4gTExNIEFQSSBjYWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dSZXN1bHQobW9kZWw6IHN0cmluZywgcmVzdWx0OiB7IHRleHQ6IHN0cmluZzsgdXNhZ2U/OiB1bmtub3duOyBmaW5pc2hSZWFzb24/OiBzdHJpbmcgfSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgYCR7bW9kZWx9OmAsXG4gICAgWUFNTC5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgICBmaW5pc2hSZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gICAgICB9LFxuICAgICAgeWFtbFN0cmluZ2lmeU9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsSW5zdGFuY2UobW9kZWw6IHN0cmluZywgcmVhc29uaW5nRWZmb3J0PzogUmVhc29uaW5nRWZmb3J0KTogW0xhbmd1YWdlTW9kZWxWMiwgc3RyaW5nLCBzdHJpbmddIHtcbiAgLy8gT25seSBzdXBwb3J0IGxsbWxpdGUgZm9ybWF0IChwcm92aWRlci9tb2RlbClcbiAgaWYgKCFtb2RlbC5pbmNsdWRlcygnLycpKSB7XG4gICAgY29uc29sZS5lcnJvcihgTW9kZWwgbXVzdCBiZSBpbiBmb3JtYXQgJ3Byb3ZpZGVyL21vZGVsJy4gR290OiAke21vZGVsfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgLi4ubW9kZWxQYXJ0c10gPSBtb2RlbC5zcGxpdCgnLycpO1xuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbFBhcnRzLmpvaW4oJy8nKTsgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIG1vZGVsIG5hbWUgaXRzZWxmIGNvbnRhaW5zICcvJ1xuXG4gIHN3aXRjaCAocHJvdmlkZXIpIHtcbiAgICBjYXNlICdvcGVuYWknOiB7XG4gICAgICAvLyBjZi4gaHR0cHM6Ly9haS1zZGsuZGV2L3Byb3ZpZGVycy9haS1zZGstcHJvdmlkZXJzL29wZW5haVxuICAgICAgY29uc3Qgb3BlbmFpUHJvdmlkZXIgPSBjcmVhdGVPcGVuQUkoKTtcbiAgICAgIHJldHVybiBbb3BlbmFpUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnYW50aHJvcGljJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy9hbnRocm9waWNcbiAgICAgIGNvbnN0IGFudGhyb3BpY1Byb3ZpZGVyID0gY3JlYXRlQW50aHJvcGljKCk7XG4gICAgICByZXR1cm4gW2FudGhyb3BpY1Byb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ2dlbWluaSc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvZ29vZ2xlLWdlbmVyYXRpdmUtYWlcbiAgICAgIGNvbnN0IGdvb2dsZVByb3ZpZGVyID0gY3JlYXRlR29vZ2xlR2VuZXJhdGl2ZUFJKCk7XG4gICAgICByZXR1cm4gW2dvb2dsZVByb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ2F6dXJlJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy9henVyZVxuICAgICAgY29uc3QgYXp1cmVQcm92aWRlciA9IGNyZWF0ZUF6dXJlKCk7XG4gICAgICByZXR1cm4gW2F6dXJlUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnYmVkcm9jayc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvYW1hem9uLWJlZHJvY2tcbiAgICAgIGNvbnN0IGJlZHJvY2tQcm92aWRlciA9IGNyZWF0ZUFtYXpvbkJlZHJvY2soKTtcbiAgICAgIHJldHVybiBbYmVkcm9ja1Byb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ3ZlcnRleCc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvZ29vZ2xlLXZlcnRleFxuICAgICAgY29uc3QgdmVydGV4UHJvdmlkZXIgPSBjcmVhdGVWZXJ0ZXgoKTtcbiAgICAgIHJldHVybiBbdmVydGV4UHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAneGFpJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy94YWlcbiAgICAgIGNvbnN0IGdyb2tQcm92aWRlciA9IGNyZWF0ZVhhaSgpO1xuICAgICAgcmV0dXJuIFtncm9rUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnb3BlbnJvdXRlcic6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vT3BlblJvdXRlclRlYW0vYWktc2RrLXByb3ZpZGVyXG4gICAgICBjb25zdCBvcGVucm91dGVyUHJvdmlkZXIgPSBjcmVhdGVPcGVuUm91dGVyKHtcbiAgICAgICAgYXBpS2V5OiBwcm9jZXNzLmVudi5PUEVOUk9VVEVSX0FQSV9LRVksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnSFRUUC1SZWZlcmVyJzogJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9nZW4tcHInLFxuICAgICAgICAgICdYLVRpdGxlJzogJ2dlbi1wcicsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1vZGVsT3B0aW9ucyA9IHJlYXNvbmluZ0VmZm9ydFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJlYXNvbmluZzoge1xuICAgICAgICAgICAgICBlZmZvcnQ6IHJlYXNvbmluZ0VmZm9ydCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9O1xuICAgICAgcmV0dXJuIFtvcGVucm91dGVyUHJvdmlkZXIobW9kZWxOYW1lLCBtb2RlbE9wdGlvbnMpLCBwcm92aWRlciwgbW9kZWxOYW1lXTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIHByb3ZpZGVyOiAke3Byb3ZpZGVyfS4gU3VwcG9ydGVkIHByb3ZpZGVyczogb3BlbmFpLCBhenVyZSwgZ29vZ2xlLCBhbnRocm9waWMsIGJlZHJvY2ssIHZlcnRleCwgZ3Jvaywgb3BlbnJvdXRlciwgb2xsYW1hYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgbW9kZWwgc3VwcG9ydHMgcmVhc29uaW5nL3RoaW5raW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVhc29uaW5nT3B0aW9ucyhwcm92aWRlcjogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHByb3ZpZGVyKSB7XG4gICAgY2FzZSAnb3BlbmFpJzpcbiAgICBjYXNlICdhenVyZSc6XG4gICAgICAvLyBPcGVuQUkgYW5kIEF6dXJlOiBvbmx5IG8xLCBvMywgbzQgc2VyaWVzIG1vZGVscyBzdXBwb3J0IHJlYXNvbmluZyBlZmZvcnRcbiAgICAgIHJldHVybiAvXihvMXxvM3xvNCkvLnRlc3QobW9kZWxOYW1lKTtcblxuICAgIGNhc2UgJ2FudGhyb3BpYyc6XG4gICAgICAvLyBBbnRocm9waWM6IG9ubHkgQ2xhdWRlIDMuNyBhbmQgQ2xhdWRlIDQgbW9kZWxzIHN1cHBvcnQgdGhpbmtpbmcgYnVkZ2V0XG4gICAgICByZXR1cm4gL15jbGF1ZGUtKG9wdXMtNHxzb25uZXQtNHwzLTctc29ubmV0KS8udGVzdChtb2RlbE5hbWUpO1xuXG4gICAgY2FzZSAnZ2VtaW5pJzpcbiAgICAgIC8vIEdvb2dsZTogb25seSBHZW1pbmkgMi41IG1vZGVscyBzdXBwb3J0IHRoaW5raW5nIGJ1ZGdldFxuICAgICAgcmV0dXJuIC9eZ2VtaW5pLTJcXC41Ly50ZXN0KG1vZGVsTmFtZSk7XG5cbiAgICBjYXNlICdiZWRyb2NrJzpcbiAgICAgIC8vIEJlZHJvY2s6IG9ubHkgQW50aHJvcGljIENsYXVkZSAzLjcgYW5kIDQgbW9kZWxzIHN1cHBvcnQgcmVhc29uaW5nXG4gICAgICByZXR1cm4gL14odXNcXC4pP2FudGhyb3BpY1xcLmNsYXVkZS0ob3B1cy00fHNvbm5ldC00fDMtNy1zb25uZXQpLy50ZXN0KG1vZGVsTmFtZSk7XG5cbiAgICBjYXNlICd2ZXJ0ZXgnOlxuICAgICAgLy8gVmVydGV4OiBHZW1pbmkgMi41IG1vZGVscyBhbmQgQ2xhdWRlIDMuNy80IG1vZGVscyBzdXBwb3J0IHRoaW5raW5nIGJ1ZGdldFxuICAgICAgcmV0dXJuIC9eZ2VtaW5pLTJcXC41Ly50ZXN0KG1vZGVsTmFtZSkgfHwgL15jbGF1ZGUtKDMtNy1zb25uZXR8b3B1cy00fHNvbm5ldC00KS8udGVzdChtb2RlbE5hbWUpO1xuXG4gICAgY2FzZSAneGFpJzpcbiAgICAgIC8vIEdyb2s6IEdyb2sgMyBtb2RlbHMgc3VwcG9ydCByZWFzb25pbmcgZWZmb3J0XG4gICAgICByZXR1cm4gL15ncm9rLTMvLnRlc3QobW9kZWxOYW1lKTtcblxuICAgIC8vIFdlIGNhbiBhbHdheXMgcGFzcyByZWFzb25pbmdFZmZvcnQgdG8gT3BlblJvdXRlciB3aXRob3V0IGVycm9ycy5cbiAgICBjYXNlICdvcGVucm91dGVyJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGlua2luZyBidWRnZXQgdG9rZW4gY291bnQgYmFzZWQgb24gcmVhc29uaW5nIGVmZm9ydCBsZXZlbFxuICovXG5mdW5jdGlvbiBnZXRUaGlua2luZ0J1ZGdldChyZWFzb25pbmdFZmZvcnQ6IFJlYXNvbmluZ0VmZm9ydCk6IG51bWJlciB7XG4gIGNvbnN0IHRva2VuQnVkZ2V0cyA9IHtcbiAgICBsb3c6IDQwMDAsIC8vIDRLIHRva2Vuc1xuICAgIG1lZGl1bTogODAwMCwgLy8gOEsgdG9rZW5zXG4gICAgaGlnaDogMjQwMDAsIC8vIDI0SyB0b2tlbnNcbiAgfTtcblxuICByZXR1cm4gdG9rZW5CdWRnZXRzW3JlYXNvbmluZ0VmZm9ydF07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCB7IERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTIH0gZnJvbSAnLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjYWxsTGxtQXBpIH0gZnJvbSAnLi9sbG0uanMnO1xuaW1wb3J0IHsgZXh0cmFjdEhlYWRlckNvbnRlbnRzLCBmaW5kRGlzdGluY3RGZW5jZSwgdHJpbUNvZGVCbG9ja0ZlbmNlcyB9IGZyb20gJy4vbWFya2Rvd24uanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3MsIHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyB5YW1sU3RyaW5naWZ5T3B0aW9ucyB9IGZyb20gJy4veWFtbC5qcyc7XG5cbmNvbnN0IFJFUE9NSVhfRklMRV9OQU1FID0gJ3JlcG9taXgucmVzdWx0JztcblxuZXhwb3J0IHR5cGUgUmVzb2x1dGlvblBsYW4gPSB7XG4gIHBsYW4/OiBzdHJpbmc7XG4gIGNvbW1pdE1lc3NhZ2U/OiBzdHJpbmc7XG4gIGZpbGVQYXRoczogc3RyaW5nW107XG59O1xuXG5jb25zdCBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUQgPSAnIyMgRmlsZSBQYXRocyB0byBiZSBNb2RpZmllZCc7XG5jb25zdCBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfUkVGRVJSRUQgPSAnIyMgRmlsZSBQYXRocyB0byBiZSBSZWZlcnJlZCc7XG5jb25zdCBIRUFESU5HX09GX1BMQU4gPSAnIyMgSW1wbGVtZW50YXRpb24gUGxhbic7XG5jb25zdCBIRUFESU5HX09GX0NPTU1JVF9NRVNTQUdFID0gJyMjIENvbW1pdCBNZXNzYWdlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYW5Db2RlQ2hhbmdlcyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgaXNzdWVDb250ZW50OiBzdHJpbmcsXG4gIHR3b1N0YWdlUGxhbm5pbmc6IGJvb2xlYW4sXG4gIHJlYXNvbmluZ0VmZm9ydD86IFJlYXNvbmluZ0VmZm9ydCxcbiAgcmVwb21peEV4dHJhQXJncz86IHN0cmluZyxcbiAgaXNQdWxsUmVxdWVzdCA9IGZhbHNlXG4pOiBQcm9taXNlPFJlc29sdXRpb25QbGFuPiB7XG4gIGNvbnN0IGlzc3VlRmVuY2UgPSBmaW5kRGlzdGluY3RGZW5jZShpc3N1ZUNvbnRlbnQsICd+Jyk7XG4gIGNvbnN0IGlzc3VlWWFtbFRleHQgPSBgJHtpc3N1ZUZlbmNlfXlhbWxcbiR7WUFNTC5zdHJpbmdpZnkoaXNzdWVDb250ZW50LCB5YW1sU3RyaW5naWZ5T3B0aW9ucykudHJpbSgpfVxuJHtpc3N1ZUZlbmNlfWA7XG5cbiAgLy8gQmFzZSByZXBvbWl4IGNvbW1hbmQgYXJndW1lbnRzXG4gIGNvbnN0IHJlcG9taXhBcmdzID0gWyctLXllcycsICdyZXBvbWl4QGxhdGVzdCcsICctLW91dHB1dCcsIFJFUE9NSVhfRklMRV9OQU1FXTtcbiAgcmVwb21peEFyZ3MucHVzaCguLi5wYXJzZUNvbW1hbmRMaW5lQXJncyhyZXBvbWl4RXh0cmFBcmdzIHx8IERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTKSk7XG5cbiAgYXdhaXQgcnVuQ29tbWFuZCgnbnB4JywgcmVwb21peEFyZ3MpO1xuICBjb25zdCByZXBvbWl4UmVzdWx0ID0gZnMucmVhZEZpbGVTeW5jKFJFUE9NSVhfRklMRV9OQU1FLCAndXRmOCcpO1xuICB2b2lkIGZzLnByb21pc2VzLnJtKFJFUE9NSVhfRklMRV9OQU1FLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICh0d29TdGFnZVBsYW5uaW5nKSB7XG4gICAgY29uc29sZS5pbmZvKGBTZWxlY3RpbmcgZmlsZXMgd2l0aCAke21vZGVsfSAocmVhc29uaW5nIGVmZm9ydDogJHtyZWFzb25pbmdFZmZvcnR9KSAuLi5gKTtcbiAgICBjb25zdCBmaWxlc1Jlc3BvbnNlID0gYXdhaXQgY2FsbExsbUFwaShcbiAgICAgIG1vZGVsLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgICAgY29udGVudDogYnVpbGRQcm9tcHRGb3JTZWxlY3RpbmdGaWxlcyhpc3N1ZVlhbWxUZXh0LCBpc1B1bGxSZXF1ZXN0KS50cmltKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgY29udGVudDogcmVwb21peFJlc3VsdCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWFzb25pbmdFZmZvcnRcbiAgICApO1xuICAgIGNvbnNvbGUuaW5mbygnU2VsZWN0aW5nIGNvbXBsZXRlIScpO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkRmlsZVBhdGhMaXN0cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKGZpbGVzUmVzcG9uc2UpLCBbXG4gICAgICBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUQsXG4gICAgICBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfUkVGRVJSRUQsXG4gICAgXSkgYXMgW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWV4dHJhY3RlZEZpbGVQYXRoTGlzdHMpIHtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoczogW10gfTtcbiAgICB9XG4gICAgY29uc3QgW2ZpbGVQYXRoc1RvQmVNb2RpZmllZCwgZmlsZVBhdGhzVG9CZVJlZmVycmVkXSA9IGV4dHJhY3RlZEZpbGVQYXRoTGlzdHMubWFwKChmaWxlc0NvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGhSZWdleCA9IC9cXEItXFxzKmA/KFteYFxcbl0rKWA/L2c7XG4gICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmZpbGVzQ29udGVudC5tYXRjaEFsbChmaWxlUGF0aFJlZ2V4KV07XG4gICAgICByZXR1cm4gbWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXT8udHJpbSgpID8/ICcnKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfSkgYXMgW3N0cmluZ1tdLCBzdHJpbmdbXV07XG5cbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBbLi4uZmlsZVBhdGhzVG9CZU1vZGlmaWVkLCAuLi5maWxlUGF0aHNUb0JlUmVmZXJyZWRdXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykudHJpbSgpIDogJyc7XG4gICAgICAgIGNvbnN0IGZlbmNlID0gZmluZERpc3RpbmN0RmVuY2UoY29udGVudCwgJ34nKTtcbiAgICAgICAgcmV0dXJuIGAjIyBcXGAke2ZpbGVQYXRofVxcYFxuXG4ke2ZlbmNlfVxuJHtjb250ZW50fVxuJHtmZW5jZX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG5cXG4nKTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUGxhbm5pbmcgY29kZSBjaGFuZ2VzIHdpdGggJHttb2RlbH0gKHJlYXNvbmluZyBlZmZvcnQ6ICR7cmVhc29uaW5nRWZmb3J0fSkgLi4uYCk7XG4gICAgY29uc3QgcGxhblJlc3BvbnNlID0gYXdhaXQgY2FsbExsbUFwaShcbiAgICAgIG1vZGVsLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgICAgY29udGVudDogYnVpbGRQcm9tcHRGb3JQbGFubmluZ0NvZGVDaGFuZ2VzKGlzc3VlWWFtbFRleHQsIGlzUHVsbFJlcXVlc3QpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgICAgIGNvbnRlbnQ6IGZpbGVDb250ZW50cyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWFzb25pbmdFZmZvcnRcbiAgICApO1xuICAgIGNvbnNvbGUuaW5mbygnUGxhbm5pbmcgY29tcGxldGUhJyk7XG5cbiAgICBjb25zdCBleHRyYWN0ZWRDb250ZW50cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKHBsYW5SZXNwb25zZSksIFtcbiAgICAgIEhFQURJTkdfT0ZfQ09NTUlUX01FU1NBR0UsXG4gICAgICBIRUFESU5HX09GX1BMQU4sXG4gICAgXSk7XG4gICAgaWYgKCFleHRyYWN0ZWRDb250ZW50cykge1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGhzOiBmaWxlUGF0aHNUb0JlTW9kaWZpZWQgfTtcbiAgICB9XG4gICAgY29uc3QgW2NvbW1pdE1lc3NhZ2UsIHBsYW5dID0gZXh0cmFjdGVkQ29udGVudHM7XG4gICAgcmV0dXJuIHsgcGxhbiwgY29tbWl0TWVzc2FnZTogY29tbWl0TWVzc2FnZT8udHJpbSgpLCBmaWxlUGF0aHM6IGZpbGVQYXRoc1RvQmVNb2RpZmllZCB9O1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgUGxhbm5pbmcgY29kZSBjaGFuZ2VzIHdpdGggJHttb2RlbH0gKHJlYXNvbmluZyBlZmZvcnQ6ICR7cmVhc29uaW5nRWZmb3J0fSkgLi4uYCk7XG4gIGNvbnN0IGZpbGVzUmVzcG9uc2UgPSBhd2FpdCBjYWxsTGxtQXBpKFxuICAgIG1vZGVsLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgIGNvbnRlbnQ6IGJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXNBbmRQbGFubmluZ0NvZGVDaGFuZ2VzKGlzc3VlWWFtbFRleHQsIGlzUHVsbFJlcXVlc3QpLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgY29udGVudDogcmVwb21peFJlc3VsdCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICByZWFzb25pbmdFZmZvcnRcbiAgKTtcbiAgY29uc29sZS5pbmZvKCdQbGFubmluZyBjb21wbGV0ZSEnKTtcblxuICBjb25zdCBleHRyYWN0ZWRDb250ZW50cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKGZpbGVzUmVzcG9uc2UpLCBbXG4gICAgSEVBRElOR19PRl9DT01NSVRfTUVTU0FHRSxcbiAgICBIRUFESU5HX09GX1BMQU4sXG4gICAgSEVBRElOR19PRl9GSUxFX1BBVEhTX1RPX0JFX01PRElGSUVELFxuICBdKTtcbiAgaWYgKCFleHRyYWN0ZWRDb250ZW50cykge1xuICAgIHJldHVybiB7IGZpbGVQYXRoczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IFtjb21taXRNZXNzYWdlLCBwbGFuLCBmaWxlUGF0aHNUZXh0XSA9IGV4dHJhY3RlZENvbnRlbnRzO1xuXG4gIGNvbnN0IGZpbGVQYXRoUmVnZXggPSAvXFxCLVxccypgPyhbXmBcXG5dKylgPy9nO1xuICBjb25zdCBtYXRjaGVzID0gWy4uLihmaWxlUGF0aHNUZXh0ID8/ICcnKS5tYXRjaEFsbChmaWxlUGF0aFJlZ2V4KV07XG4gIGNvbnN0IGZpbGVQYXRoc1RvQmVNb2RpZmllZCA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0/LnRyaW0oKSA/PyAnJykuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4geyBwbGFuLCBjb21taXRNZXNzYWdlOiBjb21taXRNZXNzYWdlPy50cmltKCksIGZpbGVQYXRoczogZmlsZVBhdGhzVG9CZU1vZGlmaWVkIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXMoaXNzdWVZYW1sVGV4dDogc3RyaW5nLCBpc1B1bGxSZXF1ZXN0ID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBpdGVtVHlwZSA9IGlzUHVsbFJlcXVlc3QgPyAncHVsbCByZXF1ZXN0JyA6ICdpc3N1ZSc7XG4gIGNvbnN0IGV4dHJhSW5zdHJ1Y3Rpb24gPSBpc1B1bGxSZXF1ZXN0ID8gJyBDb25zaWRlciB0aGUgY29tbWVudHMgb24gdGhlIHB1bGwgcmVxdWVzdCB3aGVuIGlkZW50aWZ5aW5nIGZpbGVzLicgOiAnJztcbiAgcmV0dXJuIGBcbllvdSBhcmUgYW4gZXhwZXJ0IHNvZnR3YXJlIGRldmVsb3BlciB0YXNrZWQgd2l0aCBhbmFseXppbmcgR2l0SHViICR7aXRlbVR5cGV9cyBhbmQgaWRlbnRpZnlpbmcgcmVsZXZhbnQgZmlsZXMgZm9yIGNvZGUgY2hhbmdlcy5cblxuUmV2aWV3IHRoZSBmb2xsb3dpbmcgR2l0SHViICR7aXRlbVR5cGV9IGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZmlsZSBwYXRocyBhbmQgdGhlaXIgY29udGVudHMgKHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaW4gYSBzZXBhcmF0ZSBtZXNzYWdlKS4ke2V4dHJhSW5zdHJ1Y3Rpb259XG5Zb3VyIHRhc2sgaXMgdG8gaWRlbnRpZnk6XG4xLiBGaWxlcyB0aGF0IG5lZWQgdG8gYmUgTU9ESUZJRUQgdG8gcmVzb2x2ZSB0aGUgJHtpdGVtVHlwZX1cbjIuIEZpbGVzIHRoYXQgc2hvdWxkIGJlIFJFRkVSUkVEIHRvIChidXQgbm90IG1vZGlmaWVkKSB0byB1bmRlcnN0YW5kIHRoZSBjb2RlYmFzZSBiZXR0ZXJcblxuR2l0SHViICR7aXNQdWxsUmVxdWVzdCA/ICdQdWxsIFJlcXVlc3QnIDogJ0lzc3VlJ306XG4ke2lzc3VlWWFtbFRleHR9XG5cblBsZWFzZSBmb3JtYXQgeW91ciByZXNwb25zZSB3aXRob3V0IGFueSBleHBsYW5hdG9yeSB0ZXh0IGFzIGZvbGxvd3M6XG5cXGBcXGBcXGBtZFxuJHtIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUR9XG5cbi0gXFxgW2ZpbGVQYXRoMV1cXGBcbi0gXFxgW2ZpbGVQYXRoMl1cXGBcbi0gLi4uXG5cbiR7SEVBRElOR19PRl9GSUxFX1BBVEhTX1RPX0JFX1JFRkVSUkVEfVxuXG4tIFxcYFtmaWxlUGF0aDFdXFxgXG4tIFxcYFtmaWxlUGF0aDJdXFxgXG4tIC4uLlxuXFxgXFxgXFxgXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdEZvclBsYW5uaW5nQ29kZUNoYW5nZXMoaXNzdWVZYW1sVGV4dDogc3RyaW5nLCBpc1B1bGxSZXF1ZXN0ID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBpdGVtVHlwZSA9IGlzUHVsbFJlcXVlc3QgPyAncHVsbCByZXF1ZXN0JyA6ICdpc3N1ZSc7XG4gIGNvbnN0IGV4dHJhSW5zdHJ1Y3Rpb24gPSBpc1B1bGxSZXF1ZXN0ID8gJyBDb25zaWRlciB0aGUgY29tbWVudHMgb24gdGhlIHB1bGwgcmVxdWVzdCB3aGVuIGNyZWF0aW5nIHRoZSBwbGFuLicgOiAnJztcbiAgcmV0dXJuIGBcbllvdSBhcmUgYW4gZXhwZXJ0IHNvZnR3YXJlIGRldmVsb3BlciB0YXNrZWQgd2l0aCBjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBwbGFuIGJhc2VkIG9uIEdpdEh1YiAke2l0ZW1UeXBlfXMuXG5cblJldmlldyB0aGUgZm9sbG93aW5nIEdpdEh1YiAke2l0ZW1UeXBlfSBhbmQgdGhlIHByb3ZpZGVkIGZpbGUgY29udGVudHMgKHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaW4gYSBzZXBhcmF0ZSBtZXNzYWdlKS4ke2V4dHJhSW5zdHJ1Y3Rpb259XG5DcmVhdGUgYSBkZXRhaWxlZCwgc3RlcC1ieS1zdGVwIHBsYW4gb3V0bGluaW5nIGhvdyB0byBhZGRyZXNzIHRoZSAke2l0ZW1UeXBlfSBlZmZlY3RpdmVseS5cbkFsc28sIHByb3ZpZGUgYSBjb25jaXNlIGFuZCBkZXNjcmlwdGl2ZSBjb21taXQgbWVzc2FnZSBmb3IgdGhlIGNoYW5nZXMsIGZvbGxvd2luZyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgc3BlY2lmaWNhdGlvbi5cblxuWW91ciBwbGFuIHNob3VsZDpcbi0gRm9jdXMgb24gaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgZWFjaCBmaWxlIHRoYXQgbmVlZHMgbW9kaWZpY2F0aW9uXG4tIEJlIGNsZWFyIGFuZCBhY3Rpb25hYmxlIGZvciBhIGRldmVsb3BlciB0byBmb2xsb3dcbi0gUHJlZmVyIHNob3dpbmcgZGlmZnMgcmF0aGVyIHRoYW4gY29tcGxldGUgZmlsZSBjb250ZW50cyB3aGVuIGRlc2NyaWJpbmcgY2hhbmdlc1xuLSBFeGNsdWRlIHRlc3RpbmcgcHJvY2VkdXJlcyB1bmxlc3MgdXNlcnMgZXhwbGljaXRseSByZXF1ZXN0XG5cbkdpdEh1YiAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9OlxuJHtpc3N1ZVlhbWxUZXh0fVxuXG5QbGVhc2UgZm9ybWF0IHlvdXIgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZXhwbGFuYXRvcnkgdGV4dCBhcyBmb2xsb3dzOlxuXFxgXFxgXFxgbWRcbiR7SEVBRElOR19PRl9QTEFOfVxuXG4xLiBbU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gc3RlcF1cbjIuIFtOZXh0IGltcGxlbWVudGF0aW9uIHN0ZXBdXG4uLi5cblxuJHtIRUFESU5HX09GX0NPTU1JVF9NRVNTQUdFfVxuXG5bY29tbWl0IG1lc3NhZ2VdXG5cXGBcXGBcXGBcbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdEZvclNlbGVjdGluZ0ZpbGVzQW5kUGxhbm5pbmdDb2RlQ2hhbmdlcyhpc3N1ZVlhbWxUZXh0OiBzdHJpbmcsIGlzUHVsbFJlcXVlc3QgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IGl0ZW1UeXBlID0gaXNQdWxsUmVxdWVzdCA/ICdwdWxsIHJlcXVlc3QnIDogJ2lzc3VlJztcbiAgY29uc3QgZXh0cmFJbnN0cnVjdGlvbiA9IGlzUHVsbFJlcXVlc3QgPyAnIENvbnNpZGVyIHRoZSBjb21tZW50cyBvbiB0aGUgcHVsbCByZXF1ZXN0IHdoZW4gY3JlYXRpbmcgdGhlIHBsYW4uJyA6ICcnO1xuICByZXR1cm4gYFxuWW91IGFyZSBhbiBleHBlcnQgc29mdHdhcmUgZGV2ZWxvcGVyIHRhc2tlZCB3aXRoIGFuYWx5emluZyBHaXRIdWIgJHtpdGVtVHlwZX1zIGFuZCBjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBwbGFuLlxuXG5SZXZpZXcgdGhlIGZvbGxvd2luZyBHaXRIdWIgJHtpdGVtVHlwZX0gYW5kIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWxlIHBhdGhzIGFuZCB0aGVpciBjb250ZW50cyAod2hpY2ggd2lsbCBiZSBwcm92aWRlZCBpbiBhIHNlcGFyYXRlIG1lc3NhZ2UpLiR7ZXh0cmFJbnN0cnVjdGlvbn1cbllvdXIgdGFzayBpcyB0bzpcbjEuIENyZWF0ZSBhIGRldGFpbGVkLCBzdGVwLWJ5LXN0ZXAgcGxhbiBvdXRsaW5pbmcgaG93IHRvIHJlc29sdmUgdGhlICR7aXRlbVR5cGV9IGVmZmVjdGl2ZWx5LlxuMi4gSWRlbnRpZnkgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIHJlc29sdmUgdGhlICR7aXRlbVR5cGV9LlxuMy4gUHJvdmlkZSBhIGNvbmNpc2UgYW5kIGRlc2NyaXB0aXZlIGNvbW1pdCBtZXNzYWdlIGZvciB0aGUgY2hhbmdlcywgZm9sbG93aW5nIHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBzcGVjaWZpY2F0aW9uLlxuXG5Zb3VyIHBsYW4gc2hvdWxkOlxuLSBGb2N1cyBvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBlYWNoIGZpbGUgdGhhdCBuZWVkcyBtb2RpZmljYXRpb25cbi0gQmUgY2xlYXIgYW5kIGFjdGlvbmFibGUgZm9yIGEgZGV2ZWxvcGVyIHRvIGZvbGxvd1xuLSBQcmVmZXIgc2hvd2luZyBkaWZmcyByYXRoZXIgdGhhbiBjb21wbGV0ZSBmaWxlIGNvbnRlbnRzIHdoZW4gZGVzY3JpYmluZyBjaGFuZ2VzXG4tIEV4Y2x1ZGUgdGVzdGluZyBwcm9jZWR1cmVzIGFzIHRob3NlIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5XG5cbkdpdEh1YiAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9OlxuJHtpc3N1ZVlhbWxUZXh0fVxuXG5QbGVhc2UgZm9ybWF0IHlvdXIgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZXhwbGFuYXRvcnkgdGV4dCBhcyBmb2xsb3dzOlxuXFxgXFxgXFxgbWRcbiR7SEVBRElOR19PRl9QTEFOfVxuXG4xLiBbU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gc3RlcF1cbjIuIFtOZXh0IGltcGxlbWVudGF0aW9uIHN0ZXBdXG4uLi5cblxuJHtIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUR9XG5cbi0gXFxgW2ZpbGVQYXRoMV1cXGBcbi0gXFxgW2ZpbGVQYXRoMl1cXGBcbi0gLi4uXG5cbiR7SEVBRElOR19PRl9DT01NSVRfTUVTU0FHRX1cblxuW2NvbW1pdCBtZXNzYWdlXVxuXFxgXFxgXFxgXG5gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzQ0kgPSBwcm9jZXNzLmVudi5DSSB8fCBwcm9jZXNzLmVudi5HSVRIVUJfQUNUSU9OUztcbiIsImltcG9ydCB0eXBlIHsgU3Bhd25PcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuLi9tYWluLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x1dGlvblBsYW4gfSBmcm9tICcuLi9wbGFuLmpzJztcbmltcG9ydCB7IGJ1aWxkQWlkZXJBcmdzIH0gZnJvbSAnLi4vdG9vbHMvYWlkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRDbGF1ZGVDb2RlQXJncyB9IGZyb20gJy4uL3Rvb2xzL2NsYXVkZUNvZGUuanMnO1xuaW1wb3J0IHsgYnVpbGRDb2RleEFyZ3MgfSBmcm9tICcuLi90b29scy9jb2RleC5qcyc7XG5pbXBvcnQgeyBidWlsZEdlbWluaUFyZ3MgfSBmcm9tICcuLi90b29scy9nZW1pbmkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RpbmdUb29sLCBOb2RlUnVudGltZUFjdHVhbCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sQXJncyB7XG4gIHByb21wdDogc3RyaW5nO1xuICByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGJ1aWxkQXJnczogKG9wdGlvbnM6IE1haW5PcHRpb25zLCBhcmdzOiBUb29sQXJncykgPT4gc3RyaW5nW107XG4gIGdldENvbW1hbmQ6IChub2RlUnVudGltZTogTm9kZVJ1bnRpbWVBY3R1YWwpID0+IHN0cmluZztcbiAgZ2V0UnVuT3B0aW9ucz86ICgpID0+IFNwYXduT3B0aW9ucztcbn1cblxuZXhwb3J0IGNvbnN0IFRPT0xfUkVHSVNUUlk6IFJlY29yZDxDb2RpbmdUb29sLCBUb29sQ29uZmlnPiA9IHtcbiAgYWlkZXI6IHtcbiAgICBuYW1lOiAnQWlkZXInLFxuICAgIGJ1aWxkQXJnczogYnVpbGRBaWRlckFyZ3MsXG4gICAgZ2V0Q29tbWFuZDogKCkgPT4gJ2FpZGVyJyxcbiAgfSxcbiAgJ2NsYXVkZS1jb2RlJzoge1xuICAgIG5hbWU6ICdDbGF1ZGUgQ29kZScsXG4gICAgYnVpbGRBcmdzOiBidWlsZENsYXVkZUNvZGVBcmdzLFxuICAgIGdldENvbW1hbmQ6IChub2RlUnVudGltZSkgPT4gbm9kZVJ1bnRpbWUsXG4gICAgZ2V0UnVuT3B0aW9uczogKCkgPT4gKHsgc3RkaW86ICdpbmhlcml0JyB9KSxcbiAgfSxcbiAgJ2NvZGV4LWNsaSc6IHtcbiAgICBuYW1lOiAnQ29kZXggQ0xJJyxcbiAgICBidWlsZEFyZ3M6IGJ1aWxkQ29kZXhBcmdzLFxuICAgIGdldENvbW1hbmQ6IChub2RlUnVudGltZSkgPT4gbm9kZVJ1bnRpbWUsXG4gIH0sXG4gICdnZW1pbmktY2xpJzoge1xuICAgIG5hbWU6ICdHZW1pbmkgQ0xJJyxcbiAgICBidWlsZEFyZ3M6IGJ1aWxkR2VtaW5pQXJncyxcbiAgICBnZXRDb21tYW5kOiAobm9kZVJ1bnRpbWUpID0+IG5vZGVSdW50aW1lLFxuICB9LFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBjb2RpbmcgdG9vbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbE5hbWUodG9vbDogQ29kaW5nVG9vbCk6IHN0cmluZyB7XG4gIHJldHVybiBUT09MX1JFR0lTVFJZW3Rvb2xdLm5hbWU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgZm9yIGEgY29kaW5nIHRvb2xcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xDb21tYW5kQW5kQXJncyhcbiAgdG9vbDogQ29kaW5nVG9vbCxcbiAgb3B0aW9uczogTWFpbk9wdGlvbnMsXG4gIG5vZGVSdW50aW1lOiBOb2RlUnVudGltZUFjdHVhbCxcbiAgYXJnczogVG9vbEFyZ3Ncbik6IHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgcnVuT3B0aW9ucz86IFNwYXduT3B0aW9ucyB9IHtcbiAgY29uc3QgY29uZmlnID0gVE9PTF9SRUdJU1RSWVt0b29sXTtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBjb25maWcuZ2V0Q29tbWFuZChub2RlUnVudGltZSksXG4gICAgYXJnczogY29uZmlnLmJ1aWxkQXJncyhvcHRpb25zLCBhcmdzKSxcbiAgICBydW5PcHRpb25zOiBjb25maWcuZ2V0UnVuT3B0aW9ucz8uKCksXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIHN0YW5kYXJkIHJ1biBvcHRpb25zIGZvciB0b29sc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRSdW5PcHRpb25zKCk6IFNwYXduT3B0aW9ucyAmIHsgaWdub3JlRXhpdFN0YXR1cz86IGJvb2xlYW4gfSB7XG4gIHJldHVybiB7XG4gICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBOT19DT0xPUjogJzEnIH0sXG4gICAgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSxcbiAgfTtcbn1cbiIsImltcG9ydCB7IERFRkFVTFRfQUlERVJfRVhUUkFfQVJHUyB9IGZyb20gJy4uL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuLi9tYWluLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x1dGlvblBsYW4gfSBmcm9tICcuLi9wbGFuLmpzJztcblxuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3MgfSBmcm9tICcuLi9zcGF3bi5qcyc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgQWlkZXIgY29tbWFuZFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBtYWluIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW5jbHVkZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgYWlkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQWlkZXJBcmdzKFxuICBvcHRpb25zOiBNYWluT3B0aW9ucyxcbiAgYXJnczogeyBwcm9tcHQ6IHN0cmluZzsgcmVzb2x1dGlvblBsYW4/OiBSZXNvbHV0aW9uUGxhbiB9XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFpZGVyQXJncyA9IFtcbiAgICAnLS15ZXMtYWx3YXlzJyxcbiAgICAnLS1uby1jaGVjay11cGRhdGUnLFxuICAgICctLW5vLWdpdGlnbm9yZScsXG4gICAgJy0tbm8tc2hvdy1tb2RlbC13YXJuaW5ncycsXG4gICAgJy0tbm8tc2hvdy1yZWxlYXNlLW5vdGVzJyxcbiAgICAuLi5wYXJzZUNvbW1hbmRMaW5lQXJncyhvcHRpb25zLmFpZGVyRXh0cmFBcmdzIHx8IERFRkFVTFRfQUlERVJfRVhUUkFfQVJHUyksXG4gICAgJy0tbWVzc2FnZScsXG4gICAgYXJncy5wcm9tcHQsXG4gIF07XG5cbiAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgYWlkZXJBcmdzLnB1c2goJy0tZHJ5LXJ1bicpO1xuICB9XG4gIGlmIChhcmdzLnJlc29sdXRpb25QbGFuICYmICdmaWxlUGF0aHMnIGluIGFyZ3MucmVzb2x1dGlvblBsYW4pIHtcbiAgICBhaWRlckFyZ3MucHVzaCguLi5hcmdzLnJlc29sdXRpb25QbGFuLmZpbGVQYXRocyk7XG4gIH1cblxuICByZXR1cm4gYWlkZXJBcmdzO1xufVxuIiwiaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL2NpLmpzJztcbmltcG9ydCB7IERFRkFVTFRfQ0xBVURFX0NPREVfRVhUUkFfQVJHUyB9IGZyb20gJy4uL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuLi9tYWluLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x1dGlvblBsYW4gfSBmcm9tICcuLi9wbGFuLmpzJztcblxuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3MgfSBmcm9tICcuLi9zcGF3bi5qcyc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgQ2xhdWRlIENvZGUgY29tbWFuZFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBtYWluIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW5jbHVkZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgQGFudGhyb3BpYy1haS9jbGF1ZGUtY29kZUBsYXRlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xhdWRlQ29kZUFyZ3MoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBhcmdzOiB7IHByb21wdDogc3RyaW5nOyByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuIH1cbik6IHN0cmluZ1tdIHtcbiAgLy8gY2YuIGh0dHBzOi8vZG9jcy5hbnRocm9waWMuY29tL2VuL2RvY3MvY2xhdWRlLWNvZGUvY2xpLXVzYWdlXG4gIGNvbnN0IGJhc2VBcmdzID0gW1xuICAgICctLXllcycsXG4gICAgJ0BhbnRocm9waWMtYWkvY2xhdWRlLWNvZGVAbGF0ZXN0JyxcbiAgICAuLi5wYXJzZUNvbW1hbmRMaW5lQXJncyhvcHRpb25zLmNsYXVkZUNvZGVFeHRyYUFyZ3MgfHwgREVGQVVMVF9DTEFVREVfQ09ERV9FWFRSQV9BUkdTKSxcbiAgICAvLyBCeXBhc3MgYWxsIHBlcm1pc3Npb24gY2hlY2tzXG4gICAgJy0tZGFuZ2Vyb3VzbHktc2tpcC1wZXJtaXNzaW9ucycsXG4gIF07XG4gIGlmIChpc0NJKSB7XG4gICAgYmFzZUFyZ3MucHVzaCgnLS1wcmludCcpO1xuICB9XG4gIGJhc2VBcmdzLnB1c2goYXJncy5wcm9tcHQpO1xuICByZXR1cm4gYmFzZUFyZ3M7XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MgfSBmcm9tICcuLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi4vbWFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi4vcGxhbi5qcyc7XG5cbmltcG9ydCB7IHBhcnNlQ29tbWFuZExpbmVBcmdzIH0gZnJvbSAnLi4vc3Bhd24uanMnO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIENvZGV4IENMSSBjb21tYW5kXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG1haW4gb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBAb3BlbmFpL2NvZGV4QGxhdGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleEFyZ3MoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBhcmdzOiB7IHByb21wdDogc3RyaW5nOyByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuIH1cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS15ZXMnLFxuICAgICdAb3BlbmFpL2NvZGV4QGxhdGVzdCcsXG4gICAgJ2V4ZWMnLFxuICAgIC4uLnBhcnNlQ29tbWFuZExpbmVBcmdzKG9wdGlvbnMuY29kZXhFeHRyYUFyZ3MgfHwgREVGQVVMVF9DT0RFWF9FWFRSQV9BUkdTKSxcbiAgICBhcmdzLnByb21wdCxcbiAgXTtcbn1cbiIsImltcG9ydCB7IERFRkFVTFRfR0VNSU5JX0VYVFJBX0FSR1MgfSBmcm9tICcuLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi4vbWFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi4vcGxhbi5qcyc7XG5cbmltcG9ydCB7IHBhcnNlQ29tbWFuZExpbmVBcmdzIH0gZnJvbSAnLi4vc3Bhd24uanMnO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEdlbWluaSBDTEkgY29tbWFuZFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBtYWluIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW5jbHVkZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgQGdvb2dsZS9nZW1pbmktY2xpQGxhdGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW1pbmlBcmdzKFxuICBvcHRpb25zOiBNYWluT3B0aW9ucyxcbiAgYXJnczogeyBwcm9tcHQ6IHN0cmluZzsgcmVzb2x1dGlvblBsYW4/OiBSZXNvbHV0aW9uUGxhbiB9XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJy0teWVzJyxcbiAgICAnQGdvb2dsZS9nZW1pbmktY2xpQGxhdGVzdCcsXG4gICAgJy0teW9sbycsXG4gICAgLi4ucGFyc2VDb21tYW5kTGluZUFyZ3Mob3B0aW9ucy5nZW1pbmlFeHRyYUFyZ3MgfHwgREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyksXG4gICAgJy0tcHJvbXB0JyxcbiAgICBhcmdzLnByb21wdCxcbiAgXTtcbn1cbiIsImltcG9ydCBhbnNpcyBmcm9tICdhbnNpcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi9tYWluLmpzJztcbmltcG9ydCB7IGZpbmREaXN0aW5jdEZlbmNlIH0gZnJvbSAnLi9tYXJrZG93bi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi9wbGFuLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU5vZGVSdW50aW1lLCBwYXJzZUNvbW1hbmRMaW5lQXJncywgcnVuQ29tbWFuZCwgc3Bhd25Bc3luYyB9IGZyb20gJy4vc3Bhd24uanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RhbmRhcmRSdW5PcHRpb25zLCBnZXRUb29sQ29tbWFuZEFuZEFyZ3MsIGdldFRvb2xOYW1lIH0gZnJvbSAnLi91dGlscy90b29sUmVnaXN0cnkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSZXN1bHQge1xuICBmaXhSZXN1bHQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0QW5kRml4KG9wdGlvbnM6IE1haW5PcHRpb25zLCByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuKTogUHJvbWlzZTxUZXN0UmVzdWx0PiB7XG4gIGNvbnN0IFtjb21tYW5kUHJvZ3JhbSwgLi4uY29tbWFuZEFyZ3NdID0gcGFyc2VDb21tYW5kTGluZUFyZ3Mob3B0aW9ucy50ZXN0Q29tbWFuZCB8fCAnJyk7XG4gIGlmICghY29tbWFuZFByb2dyYW0pIHJldHVybiB7IGZpeFJlc3VsdDogJycsIHN1Y2Nlc3M6IHRydWUgfTtcblxuICBjb25zdCBtYXhBdHRlbXB0cyA9IG9wdGlvbnMubWF4VGVzdEF0dGVtcHRzO1xuICBsZXQgYXR0ZW1wdHMgPSAwO1xuICBsZXQgZml4UmVzdWx0ID0gJyc7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG4gIGxldCBsYXN0RXJyb3IgPSAnJztcblxuICB3aGlsZSAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgIGF0dGVtcHRzKys7XG4gICAgY29uc29sZS5pbmZvKGFuc2lzLmN5YW4oYEV4ZWN1dGluZyB0ZXN0IGNvbW1hbmQgKGF0dGVtcHQgJHthdHRlbXB0c30vJHttYXhBdHRlbXB0c30pOiAke29wdGlvbnMudGVzdENvbW1hbmR9YCkpO1xuXG4gICAgY29uc3QgdGVzdFJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZFByb2dyYW0sIGNvbW1hbmRBcmdzLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSk7XG5cbiAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhhbnNpcy5ncmVlbignVGVzdCBjb21tYW5kIHBhc3NlZCBzdWNjZXNzZnVsbHkuJykpO1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYW5zaXMueWVsbG93KGBUZXN0IGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7dGVzdFJlc3VsdC5zdGF0dXN9LmApKTtcblxuICAgIC8vIENhcHR1cmUgdGhlIGVycm9yIGRldGFpbHNcbiAgICBsYXN0RXJyb3IgPSBgVGVzdCBjb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke3Rlc3RSZXN1bHQuc3RhdHVzfVxcblxcblN0ZG91dDpcXG4ke3Rlc3RSZXN1bHQuc3Rkb3V0fVxcblxcblN0ZGVycjpcXG4ke3Rlc3RSZXN1bHQuc3RkZXJyfWA7XG5cbiAgICAvLyBPbmx5IHRyeSB0byBmaXggaWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBtYXhpbXVtIGF0dGVtcHRzXG4gICAgaWYgKGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYW5zaXMueWVsbG93KGBNYXhpbXVtIGZpeCBhdHRlbXB0cyAoJHttYXhBdHRlbXB0c30pIHJlYWNoZWQuIEdpdmluZyB1cC5gKSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBzdGRvdXRGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHRlc3RSZXN1bHQuc3Rkb3V0LCAnficpO1xuICAgIGNvbnN0IHN0ZGVyckZlbmNlID0gZmluZERpc3RpbmN0RmVuY2UodGVzdFJlc3VsdC5zdGRlcnIsICd+Jyk7XG4gICAgY29uc3QgcHJvbXB0ID0gYFxuVGhlIHByZXZpb3VzIGNoYW5nZXMgd2VyZSBhcHBsaWVkLCBidXQgdGhlIHRlc3QgY29tbWFuZCBcXGAke29wdGlvbnMudGVzdENvbW1hbmR9XFxgIGZhaWxlZC5cblxuRXhpdCBjb2RlOiAke3Rlc3RSZXN1bHQuc3RhdHVzfVxuXG5TdGRvdXQ6XG4ke3N0ZG91dEZlbmNlfVxuJHt0ZXN0UmVzdWx0LnN0ZG91dH1cbiR7c3Rkb3V0RmVuY2V9XG5cblN0ZGVycjpcbiR7c3RkZXJyRmVuY2V9XG4ke3Rlc3RSZXN1bHQuc3RkZXJyfVxuJHtzdGRlcnJGZW5jZX1cblxuUGxlYXNlIGFuYWx5emUgdGhlIG91dHB1dCBhbmQgZml4IHRoZSBlcnJvcnMuXG5gLnRyaW0oKTtcblxuICAgIGZpeFJlc3VsdCArPSBhd2FpdCBydW5Ub29sRml4KG9wdGlvbnMsIHByb21wdCwgcmVzb2x1dGlvblBsYW4pO1xuICB9XG5cbiAgcmV0dXJuIHsgZml4UmVzdWx0LCBzdWNjZXNzLCBlcnJvcjogc3VjY2VzcyA/IHVuZGVmaW5lZCA6IGxhc3RFcnJvciB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBydW4gY29kaW5nIHRvb2wgd2l0aCBhIGZpeCBwcm9tcHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRvb2xGaXgoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBwcm9tcHQ6IHN0cmluZyxcbiAgcmVzb2x1dGlvblBsYW4/OiBSZXNvbHV0aW9uUGxhblxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdG9vbE5hbWUgPSBnZXRUb29sTmFtZShvcHRpb25zLmNvZGluZ1Rvb2wpO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcnVudGltZSB2YWx1ZSAoY29udmVydCBhbGlhc2VzIHRvIGFjdHVhbCBjb21tYW5kcylcbiAgY29uc3Qgbm9kZVJ1bnRpbWUgPSBub3JtYWxpemVOb2RlUnVudGltZShvcHRpb25zLm5vZGVSdW50aW1lKTtcblxuICAvLyBCdWlsZCB0b29sIGNvbmZpZ3VyYXRpb24gdXNpbmcgcmVnaXN0cnlcbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgYXJnczogdG9vbEFyZ3MsXG4gICAgcnVuT3B0aW9ucyxcbiAgfSA9IGdldFRvb2xDb21tYW5kQW5kQXJncyhvcHRpb25zLmNvZGluZ1Rvb2wsIG9wdGlvbnMsIG5vZGVSdW50aW1lLCB7XG4gICAgcHJvbXB0LFxuICAgIHJlc29sdXRpb25QbGFuLFxuICB9KTtcblxuICBjb25zdCBydW5PcHRzID0ge1xuICAgIC4uLmNyZWF0ZVN0YW5kYXJkUnVuT3B0aW9ucygpLFxuICAgIC4uLnJ1bk9wdGlvbnMsXG4gIH07XG5cbiAgY29uc29sZS5pbmZvKGFuc2lzLmN5YW4oYEFza2luZyAke3Rvb2xOYW1lfSB0byBmaXggXCIke29wdGlvbnMudGVzdENvbW1hbmR9XCIuLi5gKSk7XG4gIGNvbnN0IGFzc2lzdGFudFJlc3VsdCA9IChhd2FpdCBydW5Db21tYW5kKGNvbW1hbmQsIHRvb2xBcmdzLCBydW5PcHRzKSkuc3Rkb3V0O1xuXG4gIHJldHVybiBgXFxuXFxuIyMgJHt0b29sTmFtZX0gZml4IGF0dGVtcHQgZm9yIFwiJHtvcHRpb25zLnRlc3RDb21tYW5kfVwiXFxuXFxuJHthc3Npc3RhbnRSZXN1bHQudHJpbSgpfWA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgYW5zaXMgZnJvbSAnYW5zaXMnO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnZWYXJzIH0gZnJvbSAnLi9lbnYuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlR2l0VXNlckRldGFpbHNJZk5lZWRlZCwgZ2V0QmFzZUJyYW5jaCwgZ2V0Q3VycmVudEJyYW5jaCwgZ2V0SGVhZGVyT2ZGaXJzdENvbW1pdCB9IGZyb20gJy4vZ2l0LmpzJztcbmltcG9ydCB7IGNyZWF0ZUlzc3VlSW5mbyB9IGZyb20gJy4vaXNzdWUuanMnO1xuaW1wb3J0IHsgZmluZERpc3RpbmN0RmVuY2UgfSBmcm9tICcuL21hcmtkb3duLmpzJztcbmltcG9ydCB7IGNyZWF0ZVB1bGxSZXF1ZXN0IH0gZnJvbSAnLi9vY3Rva2l0LmpzJztcbmltcG9ydCB7IHBsYW5Db2RlQ2hhbmdlcyB9IGZyb20gJy4vcGxhbi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVOb2RlUnVudGltZSwgcnVuQ29tbWFuZCB9IGZyb20gJy4vc3Bhd24uanMnO1xuaW1wb3J0IHsgdGVzdEFuZEZpeCB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyBIRUFESU5HX09GX0dFTl9QUl9NRVRBREFUQSwgdHJ1bmNhdGVUZXh0IH0gZnJvbSAnLi90ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgQ29kaW5nVG9vbCwgTm9kZVJ1bnRpbWUsIE5vZGVSdW50aW1lQWN0dWFsLCBSZWFzb25pbmdFZmZvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ1ZlcmJvc2VPcHRpb25zIH0gZnJvbSAnLi91dGlscy9sb2dnaW5nLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0YW5kYXJkUnVuT3B0aW9ucywgZ2V0VG9vbENvbW1hbmRBbmRBcmdzLCBnZXRUb29sTmFtZSB9IGZyb20gJy4vdXRpbHMvdG9vbFJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHlhbWxTdHJpbmdpZnlPcHRpb25zIH0gZnJvbSAnLi95YW1sLmpzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgbWFpbiBmdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW5PcHRpb25zIHtcbiAgLyoqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gQWlkZXIgKi9cbiAgYWlkZXJFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIENsYXVkZSBDb2RlICovXG4gIGNsYXVkZUNvZGVFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIENvZGV4IENMSSAqL1xuICBjb2RleEV4dHJhQXJncz86IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gR2VtaW5pIENMSSAqL1xuICBnZW1pbmlFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBDb2RpbmcgdG9vbCB0byB1c2UgKi9cbiAgY29kaW5nVG9vbDogQ29kaW5nVG9vbDtcbiAgLyoqIEVuYWJsZSB0d28tc3RhZ2VkIHBsYW5uaW5nOiBmaXJzdCBzZWxlY3QgcmVsZXZhbnQgZmlsZXMsIHRoZW4gZ2VuZXJhdGUgZGV0YWlsZWQgaW1wbGVtZW50YXRpb24gcGxhbnMgKi9cbiAgdHdvU3RhZ2VQbGFubmluZzogYm9vbGVhbjtcbiAgLyoqIFJ1biB3aXRob3V0IG1ha2luZyBhY3R1YWwgY2hhbmdlcyAobm8gYnJhbmNoIGNyZWF0aW9uLCBubyBQUikgKi9cbiAgZHJ5UnVuOiBib29sZWFuO1xuICAvKiogRG8gbm90IGNyZWF0ZSBhIG5ldyBicmFuY2gsIGNvbW1pdCBjaGFuZ2VzIGRpcmVjdGx5IHRvIHRoZSBiYXNlIGJyYW5jaCAqL1xuICBub0JyYW5jaDogYm9vbGVhbjtcbiAgLyoqIE5vZGUuanMgcnVudGltZSB0byB1c2UgKi9cbiAgbm9kZVJ1bnRpbWU6IE5vZGVSdW50aW1lO1xuICAvKiogR2l0SHViIGlzc3VlIG51bWJlciB0byBwcm9jZXNzICovXG4gIGlzc3VlTnVtYmVyOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyB0byBmaXggdGVzdCBmYWlsdXJlcyAqL1xuICBtYXhUZXN0QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIExMTSBtb2RlbCB0byB1c2UgZm9yIHBsYW5uaW5nIGNvZGUgY2hhbmdlcyAqL1xuICBwbGFubmluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogTGV2ZWwgb2YgcmVhc29uaW5nIGVmZm9ydCBmb3IgdGhlIExMTSAqL1xuICByZWFzb25pbmdFZmZvcnQ/OiBSZWFzb25pbmdFZmZvcnQ7XG4gIC8qKiBFeHRyYSBhcmd1bWVudHMgZm9yIHJlcG9taXggd2hlbiBnZW5lcmF0aW5nIGNvbnRleHQgKi9cbiAgcmVwb21peEV4dHJhQXJncz86IHN0cmluZztcbiAgLyoqIENvbW1hbmQgdG8gcnVuIGFmdGVyIGNvZGluZyB0b29sIGFwcGxpZXMgY2hhbmdlcy4gSWYgaXQgZmFpbHMsIHRoZSBhc3Npc3RhbnQgd2lsbCB0cnkgdG8gZml4IGl0LiAqL1xuICB0ZXN0Q29tbWFuZD86IHN0cmluZztcbiAgLyoqIFJlZ0V4cCBwYXR0ZXJuIHRvIHJlbW92ZSBmcm9tIGlzc3VlIGFuZCBQUiBkZXNjcmlwdGlvbnMgKi9cbiAgcmVtb3ZlUGF0dGVybj86IHN0cmluZztcbiAgLyoqIFByaW50IHBhcnNlZCBvcHRpb25zIGF0IHN0YXJ0ICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xufVxuXG5jb25zdCBNQVhfUFJfQk9EWV9MRU5HVEggPSAzMDAwMDsgLy8gR2l0SHViJ3MgbGltaXQgaXMgNjU1MzYsIGxlYXZlIHNvbWUgYnVmZmVyXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE1haW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbmZpZ3VyZUVudlZhcnMoKTtcblxuICAvLyBQcmludCBwYXJzZWQgb3B0aW9ucyBpZiB2ZXJib3NlIGZsYWcgaXMgc2V0XG4gIGxvZ1ZlcmJvc2VPcHRpb25zKG9wdGlvbnMsIG9wdGlvbnMudmVyYm9zZSk7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBydW50aW1lIHZhbHVlIChjb252ZXJ0IGFsaWFzZXMgdG8gYWN0dWFsIGNvbW1hbmRzKVxuICBjb25zdCBub2RlUnVudGltZTogTm9kZVJ1bnRpbWVBY3R1YWwgPSBub3JtYWxpemVOb2RlUnVudGltZShvcHRpb25zLm5vZGVSdW50aW1lKTtcblxuICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KCdSdW5uaW5nIGluIGRyeS1ydW4gbW9kZS4gTm8gYnJhbmNoZXMgb3IgUFJzIHdpbGwgYmUgY3JlYXRlZC4nKSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgY29uZmlndXJlR2l0VXNlckRldGFpbHNJZk5lZWRlZCgpO1xuICB9XG5cbiAgLy8gSW5zdGFsbCBjb2RpbmcgdG9vbHNcbiAgaWYgKG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2FpZGVyJykge1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ3B5dGhvbicsIFsnLW0nLCAncGlwJywgJ2luc3RhbGwnLCAnYWlkZXItaW5zdGFsbCddKTtcbiAgICBhd2FpdCByZXNoaW1Ub0RldGVjdE5ld1Rvb2xzKCk7XG4gICAgYXdhaXQgcnVuQ29tbWFuZCgndXYnLCBbJ3Rvb2wnLCAndW5pbnN0YWxsJywgJ2FpZGVyLWNoYXQnXSwgeyBpZ25vcmVFeGl0U3RhdHVzOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2FpZGVyLWluc3RhbGwnLCBbXSk7XG4gICAgYXdhaXQgcmVzaGltVG9EZXRlY3ROZXdUb29scygpO1xuXG4gICAgaWYgKG9wdGlvbnMuYWlkZXJFeHRyYUFyZ3M/LmluY2x1ZGVzKCdiZWRyb2NrLycpKSB7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKCd1dicsIFtcbiAgICAgICAgJ3Rvb2wnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgJy0tZnJvbScsXG4gICAgICAgICdhaWRlci1jaGF0JyxcbiAgICAgICAgJ3BpcCcsXG4gICAgICAgICdpbnN0YWxsJyxcbiAgICAgICAgJy0tdXBncmFkZScsXG4gICAgICAgICctLXVwZ3JhZGUtc3RyYXRlZ3knLFxuICAgICAgICAnb25seS1pZi1uZWVkZWQnLFxuICAgICAgICAnYm90bzMnLFxuICAgICAgXSk7XG4gICAgICAvLyBhd2FpdCBydW5Db21tYW5kKCdhaWRlcicsIFsnLS1pbnN0YWxsLW1haW4tYnJhbmNoJywgJy0teWVzLWFsd2F5cyddKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwckJhc2VCcmFuY2ggPSBhd2FpdCBnZXRCYXNlQnJhbmNoKG9wdGlvbnMpO1xuICBjb25zdCBpc1B1bGxSZXF1ZXN0ID0gISFwckJhc2VCcmFuY2g7XG4gIGNvbnN0IGJhc2VCcmFuY2ggPSBwckJhc2VCcmFuY2ggfHwgKGF3YWl0IGdldEN1cnJlbnRCcmFuY2goKSk7XG5cbiAgY29uc3QgaXNzdWVJbmZvID0gYXdhaXQgY3JlYXRlSXNzdWVJbmZvKG9wdGlvbnMpO1xuICBjb25zdCBpc3N1ZVRleHQgPSBZQU1MLnN0cmluZ2lmeShpc3N1ZUluZm8sIHlhbWxTdHJpbmdpZnlPcHRpb25zKS50cmltKCk7XG5cbiAgY29uc3QgcmVzb2x1dGlvblBsYW4gPVxuICAgIChvcHRpb25zLnBsYW5uaW5nTW9kZWwgJiZcbiAgICAgIChhd2FpdCBwbGFuQ29kZUNoYW5nZXMoXG4gICAgICAgIG9wdGlvbnMucGxhbm5pbmdNb2RlbCxcbiAgICAgICAgaXNzdWVUZXh0LFxuICAgICAgICBvcHRpb25zLnR3b1N0YWdlUGxhbm5pbmcsXG4gICAgICAgIG9wdGlvbnMucmVhc29uaW5nRWZmb3J0LFxuICAgICAgICBvcHRpb25zLnJlcG9taXhFeHRyYUFyZ3MsXG4gICAgICAgIGlzUHVsbFJlcXVlc3RcbiAgICAgICkpKSB8fFxuICAgIHVuZGVmaW5lZDtcbiAgY29uc29sZS5pbmZvKCdSZXNvbHV0aW9uIHBsYW46JywgcmVzb2x1dGlvblBsYW4pO1xuXG4gIGNvbnN0IHBsYW5UZXh0ID0gKHJlc29sdXRpb25QbGFuICYmICdwbGFuJyBpbiByZXNvbHV0aW9uUGxhbiAmJiByZXNvbHV0aW9uUGxhbi5wbGFuKSB8fCAnJztcbiAgY29uc3QgaXNzdWVGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKGlzc3VlVGV4dCwgJ34nKTtcbiAgY29uc3QgaXNBZ2VudGljID0gb3B0aW9ucy5jb2RpbmdUb29sICE9PSAnYWlkZXInO1xuICBjb25zdCB0YXJnZXQgPSBpc1B1bGxSZXF1ZXN0ID8gJ3RoZSBjb21tZW50cyBvbiB0aGUgZm9sbG93aW5nIEdpdEh1YiBwdWxsIHJlcXVlc3QnIDogJ3RoZSBmb2xsb3dpbmcgR2l0SHViIGlzc3VlJztcbiAgY29uc3QgcHJvbXB0ID0gYFxuTW9kaWZ5IHRoZSBjb2RlIHRvIHJlc29sdmUgJHt0YXJnZXR9JHtwbGFuVGV4dCA/ICcgYmFzZWQgb24gdGhlIHBsYW4nIDogJyd9LiR7aXNBZ2VudGljID8gJyBBZnRlciB0aGF0LCBjb21taXQgeW91ciBjaGFuZ2VzIHdpdGggYSBtZXNzYWdlLCBmb2xsb3dpbmcgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIHNwZWNpZmljYXRpb24uJyA6ICcnfVxuXG4jIyAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9XG5cbiR7aXNzdWVGZW5jZX15bWxcbiR7aXNzdWVUZXh0fVxuJHtpc3N1ZUZlbmNlfVxuXG4ke1xuICBwbGFuVGV4dCAmJlxuICBgIyMgUGxhblxuXG4ke3BsYW5UZXh0fWBcbn1cbmAudHJpbSgpO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IG5ld0JyYW5jaE5hbWUgPSBgZ2VuLXByLSR7b3B0aW9ucy5pc3N1ZU51bWJlcn0tJHtvcHRpb25zLmNvZGluZ1Rvb2x9LSR7bm93LmdldEZ1bGxZZWFyKCl9XyR7Z2V0VHdvRGlnaXRzKG5vdy5nZXRNb250aCgpICsgMSl9JHtnZXRUd29EaWdpdHMobm93LmdldERhdGUoKSl9XyR7Z2V0VHdvRGlnaXRzKG5vdy5nZXRIb3VycygpKX0ke2dldFR3b0RpZ2l0cyhub3cuZ2V0TWludXRlcygpKX0ke2dldFR3b0RpZ2l0cyhub3cuZ2V0U2Vjb25kcygpKX1gO1xuXG4gIGlmIChvcHRpb25zLm5vQnJhbmNoKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBjb21taXQgZGlyZWN0bHkgdG8gYmFzZSBicmFuY2g6ICR7YmFzZUJyYW5jaH1gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1B1bGxSZXF1ZXN0KSB7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnZmV0Y2gnLCAnb3JpZ2luJywgYmFzZUJyYW5jaF0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydzd2l0Y2gnLCBiYXNlQnJhbmNoXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGFuc2lzLnllbGxvdyhgV291bGQgY3JlYXRlIGJyYW5jaDogJHtuZXdCcmFuY2hOYW1lfWApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHVsbFJlcXVlc3QpIHtcbiAgICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydmZXRjaCcsICdvcmlnaW4nLCBiYXNlQnJhbmNoXSk7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnc3dpdGNoJywgYmFzZUJyYW5jaF0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydzd2l0Y2gnLCAnLS1mb3JjZS1jcmVhdGUnLCBuZXdCcmFuY2hOYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhlY3V0ZSBjb2RpbmcgdG9vbFxuICBsZXQgdG9vbFJlc3VsdCA9ICcnO1xuICBsZXQgdG9vbENvbW1hbmQ6IHN0cmluZztcbiAgbGV0IHRvb2xFcnJvciA9ICcnO1xuICBsZXQgdG9vbFN1Y2Nlc3MgPSB0cnVlO1xuICBjb25zdCB0b29sTmFtZSA9IGdldFRvb2xOYW1lKG9wdGlvbnMuY29kaW5nVG9vbCk7XG5cbiAgLy8gQnVpbGQgdG9vbCBjb25maWd1cmF0aW9uIHVzaW5nIHJlZ2lzdHJ5XG4gIGNvbnN0IHtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3M6IHRvb2xBcmdzLFxuICAgIHJ1bk9wdGlvbnMsXG4gIH0gPSBnZXRUb29sQ29tbWFuZEFuZEFyZ3Mob3B0aW9ucy5jb2RpbmdUb29sLCBvcHRpb25zLCBub2RlUnVudGltZSwge1xuICAgIHByb21wdCxcbiAgICByZXNvbHV0aW9uUGxhbixcbiAgfSk7XG5cbiAgY29uc3QgcnVuT3B0czogU3Bhd25PcHRpb25zICYgeyBpZ25vcmVFeGl0U3RhdHVzPzogYm9vbGVhbiB9ID0ge1xuICAgIC4uLmNyZWF0ZVN0YW5kYXJkUnVuT3B0aW9ucygpLFxuICAgIC4uLnJ1bk9wdGlvbnMsXG4gIH07XG5cbiAgdG9vbENvbW1hbmQgPSBidWlsZFRvb2xDb21tYW5kU3RyaW5nKGNvbW1hbmQsIHRvb2xBcmdzLCBwcm9tcHQpO1xuXG4gIC8vIEV4ZWN1dGUgdG9vbCBjb21tYW5kXG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbyhgXFxuPT09IERSWSBNT0RFOiAke3Rvb2xOYW1lfSBQcm9tcHQgPT09YCk7XG4gICAgY29uc29sZS5pbmZvKHByb21wdCk7XG4gICAgY29uc29sZS5pbmZvKGA9PT0gRW5kICR7dG9vbE5hbWV9IFByb21wdCA9PT1cXG5gKTtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBydW46ICR7dG9vbENvbW1hbmR9YCkpO1xuICAgIHRvb2xSZXN1bHQgPSAnU2tpcHBlZCBkdWUgdG8gZHJ5LXJ1biBtb2RlJztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0b29sUnVuUmVzdWx0ID0gYXdhaXQgcnVuQ29tbWFuZChjb21tYW5kLCB0b29sQXJncywgcnVuT3B0cyk7XG4gICAgdG9vbFJlc3VsdCA9IHRvb2xSdW5SZXN1bHQuc3Rkb3V0IHx8ICcnO1xuICAgIGlmICh0b29sUnVuUmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdG9vbFN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgIHRvb2xFcnJvciA9IGAke3Rvb2xOYW1lfSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHt0b29sUnVuUmVzdWx0LnN0YXR1c31cXG4ke3Rvb2xSdW5SZXN1bHQuc3RkZXJyfWA7XG4gICAgICBjb25zb2xlLmVycm9yKGFuc2lzLnJlZChgJHt0b29sTmFtZX0gZXhlY3V0aW9uIGZhaWxlZDogJHt0b29sRXJyb3J9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB0b29sUmVzcG9uc2UgPSAodG9vbFJlc3VsdCB8fCAnJykudHJpbSgpO1xuICBsZXQgdGVzdFN1Y2Nlc3MgPSB0cnVlO1xuICBsZXQgdGVzdEVycm9yID0gJyc7XG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3coYFdvdWxkIHJ1biB0ZXN0IGNvbW1hbmRgKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGVzdFJlc3VsdCA9IGF3YWl0IHRlc3RBbmRGaXgob3B0aW9ucywgcmVzb2x1dGlvblBsYW4pO1xuICAgIHRvb2xSZXNwb25zZSArPSB0ZXN0UmVzdWx0LmZpeFJlc3VsdDtcbiAgICB0ZXN0U3VjY2VzcyA9IHRlc3RSZXN1bHQuc3VjY2VzcztcbiAgICB0ZXN0RXJyb3IgPSB0ZXN0UmVzdWx0LmVycm9yIHx8ICcnO1xuICAgIGlmICghdGVzdFN1Y2Nlc3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihhbnNpcy55ZWxsb3coJ1Rlc3RzIGZhaWxlZCBhZnRlciBhbGwgZml4IGF0dGVtcHRzLiBXaWxsIGNyZWF0ZSBhIGRyYWZ0IFBSLicpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRvb2xTdWNjZXNzKSB7XG4gICAgY29uc29sZS53YXJuKGFuc2lzLnllbGxvdyhgJHt0b29sTmFtZX0gZXhlY3V0aW9uIGZhaWxlZC4gV2lsbCBjcmVhdGUgYSBkcmFmdCBQUi5gKSk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgUFIgc2hvdWxkIGJlIGEgZHJhZnRcbiAgY29uc3Qgc2hvdWxkQmVEcmFmdCA9ICF0b29sU3VjY2VzcyB8fCAhdGVzdFN1Y2Nlc3M7XG4gIGxldCBlcnJvckxvZ3MgPSAnJztcbiAgaWYgKHNob3VsZEJlRHJhZnQpIHtcbiAgICBpZiAodG9vbEVycm9yKSB7XG4gICAgICBlcnJvckxvZ3MgKz0gYFxcblxcbiMjIyDinYwgJHt0b29sTmFtZX0gRXhlY3V0aW9uIEVycm9yXFxuXFxuXFxgXFxgXFxgXFxuJHt0b29sRXJyb3J9XFxuXFxgXFxgXFxgYDtcbiAgICB9XG4gICAgaWYgKHRlc3RFcnJvcikge1xuICAgICAgZXJyb3JMb2dzICs9IGBcXG5cXG4jIyMg4p2MIFRlc3QgRXhlY3V0aW9uIEVycm9yXFxuXFxuXFxgXFxgXFxgXFxuJHt0ZXN0RXJyb3J9XFxuXFxgXFxgXFxgYDtcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgY29tbWl0aW5nIGNoYW5nZXMgYmVjYXVzZSBjb2RpbmcgdG9vbCBtYXkgZmFpbCB0byBjb21taXQgY2hhbmdlcyBkdWUgdG8gcHJlLWNvbW1pdCBob29rc1xuICBjb25zdCBjb21taXRNZXNzYWdlID0gcmVzb2x1dGlvblBsYW4/LmNvbW1pdE1lc3NhZ2UgfHwgYGZpeDogQ2xvc2UgIyR7b3B0aW9ucy5pc3N1ZU51bWJlcn1gO1xuICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2FkZCcsICctQSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gIGlmIChcbiAgICAoXG4gICAgICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbW1pdCcsICctbScsIGNvbW1pdE1lc3NhZ2VdLCB7XG4gICAgICAgIGlnbm9yZUV4aXRTdGF0dXM6IHRydWUsXG4gICAgICB9KVxuICAgICkuc3RhdHVzICE9PSAwXG4gICkge1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29tbWl0JywgJy1tJywgY29tbWl0TWVzc2FnZSwgJy0tbm8tdmVyaWZ5J10sIHtcbiAgICAgIGlnbm9yZUV4aXRTdGF0dXM6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubm9CcmFuY2gpIHtcbiAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3coYFdvdWxkIHB1c2ggY2hhbmdlcyBkaXJlY3RseSB0byBiYXNlIGJyYW5jaDogJHtiYXNlQnJhbmNofWApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydwdXNoJywgJ29yaWdpbicsIGJhc2VCcmFuY2gsICctLW5vLXZlcmlmeSddKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBwdXNoIGJyYW5jaDogJHtuZXdCcmFuY2hOYW1lfSB0byBvcmlnaW5gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsncHVzaCcsICdvcmlnaW4nLCBuZXdCcmFuY2hOYW1lLCAnLS1uby12ZXJpZnknXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgUFIgdXNpbmcgR2l0SHViIENMSSAodW5sZXNzIG5vQnJhbmNoIGlzIGVuYWJsZWQpXG4gIGlmIChvcHRpb25zLm5vQnJhbmNoKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBTa2lwcGluZyBQUiBjcmVhdGlvbiBkdWUgdG8gLS1uby1icmFuY2ggb3B0aW9uYCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZXMgY29tbWl0dGVkIGRpcmVjdGx5IHRvIGJhc2UgYnJhbmNoOiAke2Jhc2VCcmFuY2h9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByVGl0bGUgPSBnZXRIZWFkZXJPZkZpcnN0Q29tbWl0KGJhc2VCcmFuY2gpIHx8IGNvbW1pdE1lc3NhZ2U7XG4gICAgbGV0IHByQm9keSA9IGlzUHVsbFJlcXVlc3QgPyAnJyA6IGBDbG9zZSAjJHtvcHRpb25zLmlzc3VlTnVtYmVyfWA7XG5cbiAgICBpZiAob3B0aW9ucy5wbGFubmluZ01vZGVsKSB7XG4gICAgICBwckJvZHkgKz0gYFxuXG4ke0hFQURJTkdfT0ZfR0VOX1BSX01FVEFEQVRBfVxuXG4tICoqUGxhbm5pbmcgTW9kZWw6KiogJHtvcHRpb25zLnBsYW5uaW5nTW9kZWx9YDtcbiAgICB9XG5cbiAgICBwckJvZHkgKz0gYFxuLSAqKkNvZGluZyBUb29sOioqICR7dG9vbE5hbWV9XG4tICoqQ29kaW5nIENvbW1hbmQ6KiogXFxgJHt0b29sQ29tbWFuZH1cXGBgO1xuICAgIGlmIChwbGFuVGV4dCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHBsYW5UZXh0LCAnficpO1xuICAgICAgcHJCb2R5ICs9IGBcblxuIyMjIFBsYW5cblxuJHtyZXNwb25zZUZlbmNlfVxuJHt0cnVuY2F0ZVRleHQocGxhblRleHQsICh0b29sUmVzcG9uc2UubGVuZ3RoIC8gKHBsYW5UZXh0Lmxlbmd0aCArIHRvb2xSZXNwb25zZS5sZW5ndGgpKSAqIE1BWF9QUl9CT0RZX0xFTkdUSCl9XG4ke3Jlc3BvbnNlRmVuY2V9YDtcbiAgICB9XG4gICAgaWYgKHRvb2xSZXNwb25zZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHRvb2xSZXNwb25zZSwgJ34nKTtcbiAgICAgIHByQm9keSArPSBgXG5cbiMjIyAke3Rvb2xOYW1lfSBMb2dcblxuJHtyZXNwb25zZUZlbmNlfVxuJHt0cnVuY2F0ZVRleHQodG9vbFJlc3BvbnNlLCAodG9vbFJlc3BvbnNlLmxlbmd0aCAvIChwbGFuVGV4dC5sZW5ndGggKyB0b29sUmVzcG9uc2UubGVuZ3RoKSkgKiBNQVhfUFJfQk9EWV9MRU5HVEgpfVxuJHtyZXNwb25zZUZlbmNlfWA7XG4gICAgfVxuICAgIHByQm9keSA9IHByQm9keS5yZXBsYWNlQWxsKC8oPzpcXHMqXFxuKXsyLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcblxuICAgIC8vIEFkZCBlcnJvciBsb2dzIHRvIFBSIGJvZHkgaWYgaXQncyBhIGRyYWZ0IGR1ZSB0byBmYWlsdXJlc1xuICAgIGlmIChzaG91bGRCZURyYWZ0KSB7XG4gICAgICBwckJvZHkgKz0gZXJyb3JMb2dzO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGFuc2lzLnllbGxvdyhgV291bGQgY3JlYXRlIFBSIHdpdGggdGl0bGU6ICR7cHJUaXRsZX0ke3Nob3VsZEJlRHJhZnQgPyAnIChhcyBkcmFmdCknIDogJyd9YCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjcmVhdGVQdWxsUmVxdWVzdCh7XG4gICAgICAgIHRpdGxlOiBwclRpdGxlLFxuICAgICAgICBib2R5OiBwckJvZHksXG4gICAgICAgIGhlYWQ6IG5ld0JyYW5jaE5hbWUsXG4gICAgICAgIGJhc2U6IGJhc2VCcmFuY2gsXG4gICAgICAgIGRyYWZ0OiBzaG91bGRCZURyYWZ0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5pbmZvKGBcXG4ke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCByZXF1ZXN0JyA6ICdJc3N1ZSd9ICMke29wdGlvbnMuaXNzdWVOdW1iZXJ9IHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc2hpbVRvRGV0ZWN0TmV3VG9vbHMoKSB7XG4gIHRyeSB7XG4gICAgLy8gTWFrZSB1diBhdmFpbGFibGUgb24gYXNkZiBlbnZpcm9ubWVudFxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2FzZGYnLCBbJ3Jlc2hpbSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUd29EaWdpdHModmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgY29tbWFuZCBzdHJpbmcgZm9yIGRpc3BsYXksIHJlcGxhY2luZyB0aGUgcHJvbXB0IGFyZ3VtZW50IHdpdGggLi4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVG9vbENvbW1hbmRTdHJpbmcoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgcHJvbXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlc2NhcGVkQXJncyA9IGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoYXJnID09PSBwcm9tcHQpIHtcbiAgICAgIHJldHVybiAnLi4uJztcbiAgICB9XG4gICAgaWYgKGFyZy5pbmNsdWRlcygnICcpIHx8IGFyZy5pbmNsdWRlcygnXCInKSB8fCBhcmcuaW5jbHVkZXMoXCInXCIpKSB7XG4gICAgICByZXR1cm4gYFwiJHthcmcucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgICB9XG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG4gIHJldHVybiBgJHtjb21tYW5kfSAke2VzY2FwZWRBcmdzLmpvaW4oJyAnKX1gO1xufVxuIiwiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudlZhcnMoKTogdm9pZCB7XG4gIGNvbmZpZygpO1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiAmJiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OX05BTUUpIHtcbiAgICBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID0gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTl9OQU1FO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LkFXU19SRUdJT04gJiYgIXByb2Nlc3MuZW52LkFXU19SRUdJT05fTkFNRSkge1xuICAgIHByb2Nlc3MuZW52LkFXU19SRUdJT05fTkFNRSA9IHByb2Nlc3MuZW52LkFXU19SRUdJT047XG4gIH1cblxuICBpZiAoIXByb2Nlc3MuZW52LkdFTUlOSV9BUElfS0VZICYmIHByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVkpIHtcbiAgICBwcm9jZXNzLmVudi5HRU1JTklfQVBJX0tFWSA9IHByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuR0VNSU5JX0FQSV9LRVkgJiYgIXByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVkpIHtcbiAgICBwcm9jZXNzLmVudi5HT09HTEVfR0VORVJBVElWRV9BSV9BUElfS0VZID0gcHJvY2Vzcy5lbnYuR0VNSU5JX0FQSV9LRVk7XG4gIH1cbn1cbiIsIi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGxvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIExvZyBvcHRpb25zIGluIHZlcmJvc2UgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nVmVyYm9zZU9wdGlvbnMob3B0aW9uczogdW5rbm93biwgdmVyYm9zZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ1BhcnNlZCBvcHRpb25zOicpO1xuICAgIGNvbnNvbGUuaW5mbyhKU09OLnN0cmluZ2lmeShvcHRpb25zLCBudWxsLCAyKSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi9tYWluLmpzJztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUdpdFVzZXJEZXRhaWxzSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGdpdFVzZXJOYW1lID0gKGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29uZmlnJywgJ3VzZXIubmFtZSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSkpLnN0ZG91dC50cmltKCk7XG4gIGNvbnN0IGdpdFVzZXJFbWFpbCA9IChhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbmZpZycsICd1c2VyLmVtYWlsJ10sIHsgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgaWYgKCFnaXRVc2VyTmFtZSB8fCAhZ2l0VXNlckVtYWlsKSB7XG4gICAgY29uc3QgZ2l0aHViVXNlckluZm9Kc29uID0gKGF3YWl0IHJ1bkNvbW1hbmQoJ2doJywgWydhcGknLCAndXNlciddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgZW1haWwgfSA9IEpTT04ucGFyc2UoZ2l0aHViVXNlckluZm9Kc29uKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29uZmlnJywgJ3VzZXIubmFtZScsIG5hbWVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbmZpZycsICd1c2VyLmVtYWlsJywgZW1haWxdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRCcmFuY2goKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY3VycmVudEJyYW5jaFJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnYnJhbmNoJywgJy0tc2hvdy1jdXJyZW50J10pO1xuICByZXR1cm4gY3VycmVudEJyYW5jaFJlc3VsdC5zdGRvdXQudHJpbSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZUJyYW5jaChvcHRpb25zOiBNYWluT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgc3Rkb3V0OiBwclZpZXdSZXN1bHQgfSA9IGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgJ2doJyxcbiAgICBbJ3ByJywgJ3ZpZXcnLCBvcHRpb25zLmlzc3VlTnVtYmVyLnRvU3RyaW5nKCksICctLWpzb24nLCAnaGVhZFJlZk5hbWUnXSxcbiAgICB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfVxuICApO1xuICB0cnkge1xuICAgIGlmIChwclZpZXdSZXN1bHQpIHtcbiAgICAgIGNvbnN0IHByRGF0YSA9IEpTT04ucGFyc2UocHJWaWV3UmVzdWx0KTtcbiAgICAgIHJldHVybiBwckRhdGEuaGVhZFJlZk5hbWU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBOb3QgYSBQUiBvciBlcnJvciBwYXJzaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdFJlcG9OYW1lKCk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcG9VcmxSZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZW1vdGUnLCAnZ2V0LXVybCcsICdvcmlnaW4nXSwge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIGNvbnN0IHJlcG9VcmwgPSByZXBvVXJsUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIGNvbnN0IHJlcG9NYXRjaCA9IHJlcG9VcmwubWF0Y2goL2dpdGh1YlxcLmNvbVsvOl0oW1xcdy1dK1xcL1tcXHctXSspKFxcLmdpdCk/JC8pO1xuICByZXR1cm4gcmVwb01hdGNoPy5bMV0gPz8gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJPZkZpcnN0Q29tbWl0KGJhc2VCcmFuY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0Q29tbWl0UmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnbG9nJywgYCR7YmFzZUJyYW5jaH0uLkhFQURgLCAnLS1yZXZlcnNlJywgJy0tcHJldHR5PSVzJ10sIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiAncGlwZScsXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIGZpcnN0Q29tbWl0UmVzdWx0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpKSA/PyAnJ1xuICApO1xufVxuIl0sIm5hbWVzIjpbImxvYWRDb25maWdGaWxlIiwiY29uZmlnT3B0aW9ucyIsIm5hbWUiLCJjZmdQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzIiwiY3dkIiwiZnMiLCJleGlzdHNTeW5jIiwiWUFNTCIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiY29uc29sZSIsImluZm8iLCJlcnIiLCJlcnJvciIsImV4aXQiLCJERUZBVUxUX0FJREVSX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NMQVVERV9DT0RFX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MiLCJERUZBVUxUX0dFTUlOSV9FWFRSQV9BUkdTIiwiREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MiLCJERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTIiwiREVGQVVMVF9DT0RJTkdfVE9PTCIsIkRFRkFVTFRfTk9ERV9SVU5USU1FIiwiSEVBRElOR19PRl9HRU5fUFJfTUVUQURBVEEiLCJ0cnVuY2F0ZVRleHQiLCJ0ZXh0IiwibWF4TGVuZ3RoIiwibGVuZ3RoIiwidHJ1bmNhdGVkIiwic2xpY2UiLCJvbWl0dGVkIiwiTWF0aCIsImZsb29yIiwibm9ybWFsaXplTmV3TGluZXMiLCJyZXBsYWNlQWxsIiwidHJpbSIsIm5vcm1hbGl6ZU5vZGVSdW50aW1lIiwicnVudGltZSIsImFzeW5jIiwicnVuQ29tbWFuZCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImlnbm9yZUV4aXRTdGF0dXMiLCJzcGF3bk9wdGlvbnMiLCJhcmdzVGV4dCIsIm1hcCIsImEiLCJpbmNsdWRlcyIsImpvaW4iLCJhbnNpcyIsImdyZWVuIiwicmV0Iiwic3Bhd25Bc3luYyIsInRydW5jYXRlU3Rkb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwidHJ1bmNhdGVkU3RkZXJyIiwieWVsbG93IiwibWFnZW50YSIsInN0YXR1cyIsIlByb21pc2UiLCJyZWplY3QiLCJzYW5pdGl6ZWRBcmdzIiwiYXJnIiwicmVwbGFjZSIsInByb2MiLCJzcGF3biIsInNldEVuY29kaW5nIiwib24iLCJkYXRhIiwid3JpdGUiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwicGlkIiwiRXJyb3IiLCJwYXJzZUNvbW1hbmRMaW5lQXJncyIsImFyZ3NTdHJpbmciLCJyZXN1bHQiLCJjdXJyZW50IiwiaW5Eb3VibGVRdW90ZSIsImluU2luZ2xlUXVvdGUiLCJpIiwiY2hhciIsInB1c2giLCJ0b2tlbiIsImVudiIsIkdIX1RPS0VOIiwiR0lUSFVCX1RPS0VOIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsImVuY29kaW5nIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ3JhcGhxbENsaWVudCIsImdyYXBocWwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJhdXRob3JpemF0aW9uIiwicmVwb093bmVyIiwicmVwb05hbWUiLCJnZXRSZXBvSW5mbyIsIm1hdGNoIiwib3duZXIiLCJyZXBvIiwiZmV0Y2hQUkRpZmYiLCJpc3N1ZU51bWJlciIsImlzc3VlSW5mbyIsInByRGlmZiIsInB1bGxOdW1iZXIiLCJwdWxscyIsImdldCIsInB1bGxfbnVtYmVyIiwibWVkaWFUeXBlIiwiZm9ybWF0IiwiZ2V0UHVsbFJlcXVlc3REaWZmIiwiY29kZV9jaGFuZ2VzIiwiZGlmZkNvbnRlbnQiLCJNQVhfVE9UQUxfRElGRl9TSVpFIiwiTUFYX0ZJTEVfRElGRl9TSVpFIiwiTEFSR0VfRklMRV9QQVRURVJOUyIsImZpbGVTZWN0aW9ucyIsInNwbGl0IiwicHJvY2Vzc2VkU2VjdGlvbnMiLCJ0b3RhbFNpemUiLCJzZWN0aW9uIiwic29tZSIsInBhdHRlcm4iLCJ0ZXN0IiwidHJ1bmNhdGVkU2VjdGlvbiIsInByb2Nlc3NEaWZmQ29udGVudCIsIndhcm4iLCJmZXRjaElzc3VlRGF0YSIsInByb2Nlc3NlZElzc3VlcyIsImlzUmVmZXJlbmNlZCIsImhhcyIsImlzc3VlIiwiYWRkIiwiaXNzdWVEYXRhIiwiaXNzdWVzIiwiaXNzdWVfbnVtYmVyIiwiaXNzdWVPclB1bGxSZXF1ZXN0IiwicHVsbF9yZXF1ZXN0IiwicHJEYXRhIiwiY29tbWVudHNSZXNwb25zZSIsImxpc3RDb21tZW50cyIsImF1dGhvciIsInVzZXIiLCJsb2dpbiIsInRpdGxlIiwiYm9keSIsImxhYmVscyIsImxhYmVsIiwiY29tbWVudHMiLCJjb21tZW50IiwiY3JlYXRlZEF0IiwiY3JlYXRlZF9hdCIsInVybCIsImh0bWxfdXJsIiwiZ2V0SXNzdWUiLCJyZWZlcmVuY2VkTnVtYmVycyIsInJlZ2V4IiwibnVtYmVycyIsImV4ZWMiLCJudW1iZXIiLCJOdW1iZXIiLCJwYXJzZUludCIsImlzSW50ZWdlciIsIlNldCIsImV4dHJhY3RJc3N1ZVJlZmVyZW5jZXMiLCJjIiwicmF3Qm9keSIsInByb2Nlc3NlZEJvZHkiLCJtYXJrZG93bkNvbnRlbnQiLCJpbmRleCIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJzdHJpcE1ldGFkYXRhU2VjdGlvbnMiLCJkZXNjcmlwdGlvbiIsIlJlZ0V4cCIsInJlbW92ZVJlZ2V4UGF0dGVybiIsInJlbW92ZVBhdHRlcm4iLCJjb21tZW50c1dpdGhEYXRlIiwiRGF0ZSIsImdldFRpbWUiLCJncmFwaHFsRGF0YSIsInByIiwiZ2V0UHVsbFJlcXVlc3RSZXZpZXdUaHJlYWRzIiwicmV2aWV3VGhyZWFkcyIsInJlcG9zaXRvcnkiLCJwdWxsUmVxdWVzdCIsIm5vZGVzIiwidGhyZWFkIiwiaXNSZXNvbHZlZCIsInByb2Nlc3NSZXZpZXdUaHJlYWRDb21tZW50cyIsImZldGNoUFJSZXZpZXdUaHJlYWRzIiwicmV2aWV3UmVzdWx0Q29tbWVudHMiLCJsaXN0UmV2aWV3cyIsInJldmlldyIsInN0YXRlIiwic3VibWl0dGVkX2F0IiwiZ2V0UHVsbFJlcXVlc3RSZXZpZXdzIiwicmV2aWV3U3RhdGUiLCJmZXRjaFBSUmV2aWV3cyIsInJlZmVyZW5jZWRJc3N1ZXNQcm9taXNlcyIsIm51bSIsInJlZmVyZW5jZWRJc3N1ZXMiLCJhbGwiLCJmaWx0ZXIiLCJyZWZlcmVuY2VkX2lzc3VlcyIsImZldGNoUmVmZXJlbmNlZElzc3VlcyIsInNvcnQiLCJiIiwiY29kZUNvbnRlbnQiLCJleHRyYWN0Q29kZUZyb21EaWZmSHVuayIsImRpZmZIdW5rIiwicmV2aWV3Q29tbWVudCIsImNvZGVMb2NhdGlvbiIsImxpbmUiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImNvZGVMaW5lIiwiZmluZCIsInN0YXJ0c1dpdGgiLCJleHRyYWN0SGVhZGVyQ29udGVudHMiLCJtb2RpZmllZFJlc3BvbnNlIiwiaW5kaWNlcyIsImhlYWRlciIsImV2ZXJ5Iiwic3RhcnQiLCJlbmQiLCJmaW5kRGlzdGluY3RGZW5jZSIsImNvbnRlbnQiLCJmZW5jZUNoYXIiLCJtYXRjaGVzIiwibWF4Iiwic2VxIiwiZmVuY2VMZW5ndGgiLCJyZXBlYXQiLCJ0cmltQ29kZUJsb2NrRmVuY2VzIiwiY29udmVydFRvVjRNZXNzYWdlcyIsIm1lc3NhZ2VzIiwibXNnIiwiaWQiLCJyb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInlhbWxTdHJpbmdpZnlPcHRpb25zIiwiYmxvY2tRdW90ZSIsImxpbmVXaWR0aCIsImNhbGxMbG1BcGkiLCJtb2RlbCIsInJlYXNvbmluZ0VmZm9ydCIsInByb3ZpZGVyIiwibW9kZWxQYXJ0cyIsIm1vZGVsTmFtZSIsIm9sbGFtYUJhc2VVUkwiLCJPTExBTUFfQkFTRV9VUkwiLCJwcm92aWRlck1vZGVsIiwiY3JlYXRlT2xsYW1hIiwiYmFzZVVSTCIsIk9MTEFNQV9BUElfS0VZIiwiYXBpS2V5Iiwib2xsYW1hIiwiZ2VuZXJhdGVUZXh0IiwicHJvdmlkZXJPcHRpb25zIiwidGhpbmsiLCJsb2dSZXN1bHQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsImNhbGxWNFByb3ZpZGVyQXBpIiwibW9kZWxJbnN0YW5jZSIsImNyZWF0ZU9wZW5BSSIsIm9wZW5haVByb3ZpZGVyIiwiY3JlYXRlQW50aHJvcGljIiwiYW50aHJvcGljUHJvdmlkZXIiLCJjcmVhdGVHb29nbGVHZW5lcmF0aXZlQUkiLCJnb29nbGVQcm92aWRlciIsImNyZWF0ZUF6dXJlIiwiYXp1cmVQcm92aWRlciIsImNyZWF0ZUFtYXpvbkJlZHJvY2siLCJiZWRyb2NrUHJvdmlkZXIiLCJjcmVhdGVWZXJ0ZXgiLCJ2ZXJ0ZXhQcm92aWRlciIsImNyZWF0ZVhhaSIsImdyb2tQcm92aWRlciIsImNyZWF0ZU9wZW5Sb3V0ZXIiLCJPUEVOUk9VVEVSX0FQSV9LRVkiLCJvcGVucm91dGVyUHJvdmlkZXIiLCJyZWFzb25pbmciLCJlZmZvcnQiLCJnZXRNb2RlbEluc3RhbmNlIiwicmVxdWVzdFBhcmFtcyIsIm1vZGVsU3VwcG9ydHNSZWFzb25pbmciLCJzdXBwb3J0c1JlYXNvbmluZ09wdGlvbnMiLCJ0aGlua2luZ0J1ZGdldCIsImxvdyIsIm1lZGl1bSIsImhpZ2giLCJnZXRUaGlua2luZ0J1ZGdldCIsIm9wZW5haSIsImFudGhyb3BpYyIsInRoaW5raW5nIiwidHlwZSIsImJ1ZGdldFRva2VucyIsImdvb2dsZSIsInRoaW5raW5nQ29uZmlnIiwieGFpIiwidXNhZ2UiLCJmaW5pc2hSZWFzb24iLCJSRVBPTUlYX0ZJTEVfTkFNRSIsIkhFQURJTkdfT0ZfRklMRV9QQVRIU19UT19CRV9NT0RJRklFRCIsIkhFQURJTkdfT0ZfRklMRV9QQVRIU19UT19CRV9SRUZFUlJFRCIsIkhFQURJTkdfT0ZfUExBTiIsIkhFQURJTkdfT0ZfQ09NTUlUX01FU1NBR0UiLCJidWlsZFByb21wdEZvclNlbGVjdGluZ0ZpbGVzIiwiaXNzdWVZYW1sVGV4dCIsImlzUHVsbFJlcXVlc3QiLCJpdGVtVHlwZSIsImJ1aWxkUHJvbXB0Rm9yUGxhbm5pbmdDb2RlQ2hhbmdlcyIsImJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXNBbmRQbGFubmluZ0NvZGVDaGFuZ2VzIiwiaXNDSSIsIkNJIiwiR0lUSFVCX0FDVElPTlMiLCJUT09MX1JFR0lTVFJZIiwiYWlkZXIiLCJidWlsZEFyZ3MiLCJhaWRlckFyZ3MiLCJhaWRlckV4dHJhQXJncyIsInByb21wdCIsImRyeVJ1biIsInJlc29sdXRpb25QbGFuIiwiZmlsZVBhdGhzIiwiZ2V0Q29tbWFuZCIsImJhc2VBcmdzIiwiY2xhdWRlQ29kZUV4dHJhQXJncyIsIm5vZGVSdW50aW1lIiwiZ2V0UnVuT3B0aW9ucyIsInN0ZGlvIiwiY29kZXhFeHRyYUFyZ3MiLCJnZW1pbmlFeHRyYUFyZ3MiLCJnZXRUb29sTmFtZSIsInRvb2wiLCJnZXRUb29sQ29tbWFuZEFuZEFyZ3MiLCJjb25maWciLCJydW5PcHRpb25zIiwiY3JlYXRlU3RhbmRhcmRSdW5PcHRpb25zIiwiTk9fQ09MT1IiLCJydW5Ub29sRml4IiwidG9vbE5hbWUiLCJjb2RpbmdUb29sIiwidG9vbEFyZ3MiLCJydW5PcHRzIiwiY3lhbiIsInRlc3RDb21tYW5kIiwiYXNzaXN0YW50UmVzdWx0IiwibWFpbiIsIkFXU19SRUdJT04iLCJBV1NfUkVHSU9OX05BTUUiLCJHRU1JTklfQVBJX0tFWSIsIkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVkiLCJ2ZXJib3NlIiwibG9nVmVyYm9zZU9wdGlvbnMiLCJnaXRVc2VyTmFtZSIsImdpdFVzZXJFbWFpbCIsImdpdGh1YlVzZXJJbmZvSnNvbiIsImVtYWlsIiwiY29uZmlndXJlR2l0VXNlckRldGFpbHNJZk5lZWRlZCIsInJlc2hpbVRvRGV0ZWN0TmV3VG9vbHMiLCJwckJhc2VCcmFuY2giLCJwclZpZXdSZXN1bHQiLCJ0b1N0cmluZyIsImhlYWRSZWZOYW1lIiwiZ2V0QmFzZUJyYW5jaCIsImJhc2VCcmFuY2giLCJnZXRDdXJyZW50QnJhbmNoIiwiY3JlYXRlSXNzdWVJbmZvIiwiaXNzdWVUZXh0IiwicGxhbm5pbmdNb2RlbCIsImlzc3VlQ29udGVudCIsInR3b1N0YWdlUGxhbm5pbmciLCJyZXBvbWl4RXh0cmFBcmdzIiwiaXNzdWVGZW5jZSIsInJlcG9taXhBcmdzIiwicmVwb21peFJlc3VsdCIsInByb21pc2VzIiwicm0iLCJmb3JjZSIsImZpbGVzUmVzcG9uc2UiLCJleHRyYWN0ZWRGaWxlUGF0aExpc3RzIiwiZmlsZVBhdGhzVG9CZU1vZGlmaWVkIiwiZmlsZVBhdGhzVG9CZVJlZmVycmVkIiwiZmlsZXNDb250ZW50IiwibWF0Y2hBbGwiLCJCb29sZWFuIiwiZmlsZUNvbnRlbnRzIiwiZmlsZVBhdGgiLCJmZW5jZSIsInBsYW5SZXNwb25zZSIsImV4dHJhY3RlZENvbnRlbnRzIiwiY29tbWl0TWVzc2FnZSIsInBsYW4iLCJmaWxlUGF0aHNUZXh0IiwicGxhbkNvZGVDaGFuZ2VzIiwicGxhblRleHQiLCJub3ciLCJuZXdCcmFuY2hOYW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRUd29EaWdpdHMiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwibm9CcmFuY2giLCJ0b29sQ29tbWFuZCIsInRvb2xSZXN1bHQiLCJ0b29sRXJyb3IiLCJ0b29sU3VjY2VzcyIsImVzY2FwZWRBcmdzIiwiYnVpbGRUb29sQ29tbWFuZFN0cmluZyIsInRvb2xSdW5SZXN1bHQiLCJyZWQiLCJ0b29sUmVzcG9uc2UiLCJ0ZXN0U3VjY2VzcyIsInRlc3RFcnJvciIsInRlc3RSZXN1bHQiLCJjb21tYW5kUHJvZ3JhbSIsImNvbW1hbmRBcmdzIiwiZml4UmVzdWx0Iiwic3VjY2VzcyIsIm1heEF0dGVtcHRzIiwibWF4VGVzdEF0dGVtcHRzIiwiYXR0ZW1wdHMiLCJsYXN0RXJyb3IiLCJzdGRvdXRGZW5jZSIsInN0ZGVyckZlbmNlIiwidGVzdEFuZEZpeCIsInNob3VsZEJlRHJhZnQiLCJlcnJvckxvZ3MiLCJwclRpdGxlIiwiZ2V0SGVhZGVyT2ZGaXJzdENvbW1pdCIsInByQm9keSIsInJlc3BvbnNlRmVuY2UiLCJwYXJhbXMiLCJjcmVhdGUiLCJoZWFkIiwiYmFzZSIsImRyYWZ0IiwiY3JlYXRlUHVsbFJl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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gen-pr",
3
- "version": "4.0.1",
3
+ "version": "4.1.1",
4
4
  "repository": "github:WillBooster/gen-pr",
5
5
  "license": "Apache-2.0",
6
6
  "author": "WillBooster Inc.",
@@ -1,2 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import n from"yaml";import o from"ansis";import{config as i}from"dotenv";import s,{spawn as r}from"node:child_process";import{graphql as a}from"@octokit/graphql";import{Octokit as c}from"@octokit/rest";import{createAmazonBedrock as l}from"@ai-sdk/amazon-bedrock";import{createAnthropic as u}from"@ai-sdk/anthropic";import{createAzure as d}from"@ai-sdk/azure";import{createGoogleGenerativeAI as f}from"@ai-sdk/google";import{createVertex as p}from"@ai-sdk/google-vertex";import{createOpenAI as m}from"@ai-sdk/openai";import{createXai as g}from"@ai-sdk/xai";import{createOpenRouter as h}from"@openrouter/ai-sdk-provider";import{generateText as w}from"ai";import{generateText as y}from"ai-v4";import{createOllama as $}from"ollama-ai-provider-v2";function b(){let o={};for(const i of["gen-pr.config.yml","gen-pr.config.yaml"]){const s=t.resolve(process.cwd(),i);if(e.existsSync(s)){try{o=n.parse(e.readFileSync(s,"utf8")),console.info(`Loaded gen-pr config from ${i}`)}catch(e){console.error(`Failed to parse config file ${i}:`,e),process.exit(1)}break}}return o}const x="--model gemini/gemini-2.5-pro --edit-format diff-fenced",v="--allowedTools Bash Edit Write",E="--full-auto",A="",R='--compress --remove-empty-lines --include "src/**/*.{ts,tsx},**/*.md"',P=5,_="aider",I="npx";const S="## gen-pr Metadata";function C(e,t){if(e.length>t){const n=e.slice(0,t),o=e.length-t;return`${n}\n\n... (${Math.floor(o)} characters truncated) ...`}return e}function O(e){return e.replaceAll("\r\n","\n").trim()}function k(e){switch(e){case"node":case"npx":return"npx";case"bun":case"bunx":return"bunx"}}async function N(e,t,n){const{ignoreExitStatus:i,...s}=n??{},r=t.map(e=>e.includes(" ")?`"${e.replaceAll('"','"')}"`:e).join(" ");console.info(o.green(`$ ${e} ${r}`)),console.info("stdout: ---------------------");const a=await T(e,t,s);s.truncateStdout&&console.info(C(a.stdout,3e3));const c=a.stderr.trim();if(c){console.info("stderr: ---------------------");const e=C(c,3e3);console.info(o.yellow(e))}return console.info("-----------------------------"),console.info(o.magenta(`Exit code: ${a.status}\n`)),i||0===a.status||null===a.status||process.exit(a.status),a}async function T(e,t,n){return new Promise((o,i)=>{try{const s=(t??[]).map(e=>e.replace(/\0/g,"")),a=r(e,s,n);a.stdout?.setEncoding?.("utf8"),a.stderr?.setEncoding?.("utf8");let c="",l="";a.stdout?.on("data",e=>{n?.truncateStdout||process.stdout.write(e),c+=e}),a.stderr?.on("data",e=>{l+=e}),a.on("error",e=>{i(e)}),a.on("close",(e,t)=>{void 0===a.pid?i(new Error("Process has no pid.")):o({pid:a.pid,stdout:c,stderr:l,status:e,signal:t})})}catch(e){i(e)}})}function G(e){if(!e)return[];const t=[];let n="",o=!1,i=!1;for(let s=0;s<e.length;s++){const r=e[s];'"'!==r||i?"'"!==r||o?" "!==r||o||i?n+=r:n&&(t.push(n),n=""):i=!i:o=!o}return n&&t.push(n),t}const M=process.env.GH_TOKEN||process.env.GITHUB_TOKEN||s.spawnSync("gh",["auth","token"],{encoding:"utf-8"}).stdout.trim();if(!M)throw new Error("GitHub token not found. Please set GH_TOKEN or GITHUB_TOKEN environment variable, or authenticate with gh CLI");const L=new c({auth:M}),W=a.defaults({headers:{authorization:`token ${M}`}});let H,Y;async function q(){if(!H||!Y){const{stdout:e}=await N("git",["remote","get-url","origin"],{ignoreExitStatus:!0}),t=e.trim().match(/github\.com[:/]([^/]+)\/(.+)/);if(!t?.[1]||!t[2])throw new Error("Could not parse GitHub repository from remote URL");H=t[1],Y=t[2].replace(/\.git$/,"")}if(!H||!Y)throw new Error("Repository information not properly initialized");return{owner:H,repo:Y}}async function F(e,t){try{const n=await async function(e){const{owner:t,repo:n}=await q();return(await L.pulls.get({owner:t,repo:n,pull_number:e,mediaType:{format:"diff"}})).data}(e);if(!n.trim())return;t.code_changes=function(e){const t=5e4,n=1e4,o=[/^diff --git a\/dist\//m,/^diff --git a\/build\//m,/^diff --git a\/.*\.bundle\./m,/^diff --git a\/.*\.min\./m,/^diff --git a\/node_modules\//m];if(e.length<=t)return e;const i=e.split(/(?=^diff --git)/m),s=[];let r=0;for(const e of i){if(!e.trim())continue;if(o.some(t=>t.test(e))){const t=[...e.split("\n").slice(0,4),"@@ ... @@","... (large bundled/compiled file diff truncated) ...",""].join("\n");s.push(t),r+=t.length}else if(e.length>n){const t=`${e.slice(0,n)}\n... (diff truncated) ...\n`;s.push(t),r+=t.length}else s.push(e),r+=e.length;if(r>.9*t){s.push("\n... (remaining diffs truncated) ...\n");break}}return s.join("")}(n.trim())}catch(e){console.warn("Failed to fetch PR diff:",e)}}async function K(e,t,n,o=!1){if(t.has(e))return;let i;t.add(e);try{i=await async function(e){const{owner:t,repo:n}=await q(),{data:o}=await L.issues.get({owner:t,repo:n,issue_number:e});let i=o;if(o.pull_request){const{data:o}=await L.pulls.get({owner:t,repo:n,pull_number:e});i=o}const s=await L.issues.listComments({owner:t,repo:n,issue_number:e});return{author:i.user?.login||"",title:i.title,body:i.body||"",labels:i.labels.map(e=>({name:"string"==typeof e?e:e.name||""})),comments:s.data.map(e=>({author:e.user?.login||"",body:e.body||"",createdAt:e.created_at})),url:i.html_url}}(e)}catch(t){return void console.warn(`Failed to fetch issue #${e}:`,t)}const s=function(e){const t=/(?:^|\s)#(\d+)/g,n=[];for(;;){const o=t.exec(e);if(!o)break;const i=Number.parseInt(o[1]??"",10);Number.isInteger(i)&&n.push(i)}return[...new Set(n)]}([i.body,...i.comments.map(e=>e.body)].join("\n")),r=i.body.replace(/<!--[\s\S]*?-->/g,"");const a=i.url?.includes("/pull/")?function(e){const t=e.indexOf(S);return t>=0?e.substring(0,t):e}(r):r,c=function(e,t){if(!t)return e;try{const n=new RegExp(t,"g");return e.replace(n,"")}catch(n){return console.warn(`Invalid regex pattern "${t}":`,n),e}}(a,n.removePattern||""),l=i.comments.map(e=>({author:e.author,body:O(e.body),createdAt:new Date(e.createdAt).getTime()})),u={author:i.author,title:i.title,description:O(c),comments:[]};return i.url?.includes("/pull/")&&!o&&(await F(e,u),await async function(e,t){try{const n=await async function(e){const{owner:t,repo:n}=await q();return await W("\n query($owner: String!, $repo: String!, $pr: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $pr) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n comments(first: 100) {\n nodes {\n author {\n login\n }\n body\n path\n line\n diffHunk\n createdAt\n }\n }\n }\n }\n }\n }\n }\n ",{owner:t,repo:n,pr:e})}(e),o=n?.repository?.pullRequest?.reviewThreads?.nodes||[];for(const e of o)!e.isResolved&&e.comments?.nodes&&B(e.comments.nodes,t)}catch(e){console.warn("Failed to fetch PR review threads:",e)}}(e,l),await async function(e,t){try{const n=(await async function(e){const{owner:t,repo:n}=await q();return(await L.pulls.listReviews({owner:t,repo:n,pull_number:e})).data.map(e=>({user:{login:e.user?.login||""},state:e.state,body:e.body||"",submitted_at:e.submitted_at||""}))}(e)).map(e=>({author:e.user.login,reviewState:e.state,body:O(e.body),createdAt:new Date(e.submitted_at).getTime()}));t.push(...n)}catch(e){console.warn("Failed to fetch PR reviews:",e)}}(e,l)),s.length>0&&await async function(e,t,n,o){const i=e.map(e=>K(e,t,n,!0)),s=(await Promise.all(i)).filter(e=>!!e);if(0===s.length)return;o.referenced_issues=s}(s,t,n,u),u.comments=l.filter(e=>e.body).sort((e,t)=>e.createdAt-t.createdAt).map(({createdAt:e,...t})=>t),u}function B(e,t){for(const n of e){if(!n.author||!n.body)continue;const e=D(n.diffHunk),o={author:n.author.login,codeLocation:n.path&&n.line?`${n.path}:${n.line}`:void 0,codeContent:e||void 0,body:O(n.body),createdAt:new Date(n.createdAt).getTime()};Object.keys(o).forEach(e=>{void 0===o[e]&&delete o[e]}),t.push(o)}}function D(e){if(!e)return"";const t=e.split("\n").find(e=>(e.startsWith("+")||e.startsWith("-"))&&!e.startsWith("@@")&&e.trim().length>1);return t?.trim()||""}function j(e,t){const n=`\n${e}`,o=t.map(e=>n.indexOf(`\n${e}`));if(!o.some(e=>-1===e)&&o.every((e,t)=>0===t||e>o[t-1]))return t.map((e,i)=>{const s=o[i]+1+e.length,r=i+1<t.length?o[i+1]+1:n.length;return n.slice(s,r).trim()})}function z(e,t){const n=new RegExp(`${t}{3,}`,"g"),o=e.match(n),i=o?Math.max(...o.map(e=>e.length)):0,s=Math.max(3,i+1);return t.repeat(s)}function U(e){return e.trim().replace(/^(`{3,}|~{3,})[\s\S]*?\n([\s\S]*?)\n\1\s*$/,"$2")}function V(e){return e.map((e,t)=>({id:`msg-${t}`,role:"tool"===e.role?"data":e.role,content:"string"==typeof e.content?e.content:JSON.stringify(e.content)}))}const J={blockQuote:"literal",lineWidth:0};async function Q(e,t,n){try{if(e.startsWith("ollama/"))return await async function(e,t,n){const[o,...i]=e.split("/");try{const s=i.join("/");s||(console.error(`Invalid ${o} model format: ${e}. Expected format: ${o}/model-name`),process.exit(1));const r=`${process.env.OLLAMA_BASE_URL||"http://localhost:11434"}/api`,a=$({baseURL:r,...process.env.OLLAMA_API_KEY&&{apiKey:process.env.OLLAMA_API_KEY}})(s),c=await y({model:a,providerOptions:n?{ollama:{think:!0}}:void 0,messages:V(t)});return X(e,c),c.text}catch(t){console.error(`${o.charAt(0).toUpperCase()+o.slice(1)} API error for model ${e}:`,t),process.exit(1)}}(e,t,n);const[o,i,s]=function(e,t){e.includes("/")||(console.error(`Model must be in format 'provider/model'. Got: ${e}`),process.exit(1));const[n,...o]=e.split("/"),i=o.join("/");switch(n){case"openai":return[m()(i),n,i];case"anthropic":return[u()(i),n,i];case"gemini":return[f()(i),n,i];case"azure":return[d()(i),n,i];case"bedrock":return[l()(i),n,i];case"vertex":return[p()(i),n,i];case"xai":return[g()(i),n,i];case"openrouter":return[h({apiKey:process.env.OPENROUTER_API_KEY,headers:{"HTTP-Referer":"https://github.com/WillBooster/gen-pr","X-Title":"gen-pr"}})(i,t?{reasoning:{effort:t}}:{}),n,i];default:console.error(`Unsupported provider: ${n}. Supported providers: openai, azure, google, anthropic, bedrock, vertex, grok, openrouter, ollama`),process.exit(1)}}(e,n),r={model:o,messages:t};if(n){const t=function(e,t){switch(e){case"openai":case"azure":return/^(o1|o3|o4)/.test(t);case"anthropic":return/^claude-(opus-4|sonnet-4|3-7-sonnet)/.test(t);case"gemini":return/^gemini-2\.5/.test(t);case"bedrock":return/^(us\.)?anthropic\.claude-(opus-4|sonnet-4|3-7-sonnet)/.test(t);case"vertex":return/^gemini-2\.5/.test(t)||/^claude-(3-7-sonnet|opus-4|sonnet-4)/.test(t);case"xai":return/^grok-3/.test(t);case"openrouter":return!0;default:return!1}}(i,s);if(t){const e=function(e){return{low:4e3,medium:8e3,high:24e3}[e]}(n);"openai"===i?r.providerOptions={openai:{reasoningEffort:n}}:"anthropic"===i?r.providerOptions={anthropic:{thinking:{type:"enabled",budgetTokens:e}}}:"gemini"===i?r.providerOptions={google:{thinkingConfig:{thinkingBudget:e}}}:"bedrock"===i?console.warn(`Note: The current AI SDK doesn't work on Bedrock with reasoning. Model ${s} will use default reasoning settings.`):"xai"===i&&(r.providerOptions={xai:{reasoningEffort:n}})}else console.warn(`Model ${e} does not support reasoning/thinking options. Ignoring reasoning effort parameter.`)}const a=await w(r);return X(e,a),a.text}catch(t){console.error(`LLM API error for model ${e}:`,t),process.exit(1)}}function X(e,t){console.info(`${e}:`,n.stringify({text:t.text,usage:t.usage,finishReason:t.finishReason},J))}const Z="repomix.result",ee="## File Paths to be Modified",te="## File Paths to be Referred",ne="## Implementation Plan",oe="## Commit Message";function ie(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with analyzing GitHub ${n}s and identifying relevant files for code changes.\n\nReview the following GitHub ${n} and the list of available file paths and their contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when identifying files.":""}\nYour task is to identify:\n1. Files that need to be MODIFIED to resolve the ${n}\n2. Files that should be REFERRED to (but not modified) to understand the codebase better\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ee}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\n${te}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\`\`\`\n`}function se(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with creating an implementation plan based on GitHub ${n}s.\n\nReview the following GitHub ${n} and the provided file contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when creating the plan.":""}\nCreate a detailed, step-by-step plan outlining how to address the ${n} effectively.\nAlso, provide a concise and descriptive commit message for the changes, following the Conventional Commits specification.\n\nYour plan should:\n- Focus on implementation details for each file that needs modification\n- Be clear and actionable for a developer to follow\n- Prefer showing diffs rather than complete file contents when describing changes\n- Exclude testing procedures unless users explicitly request\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ne}\n\n1. [Specific implementation step]\n2. [Next implementation step]\n...\n\n${oe}\n\n[commit message]\n\`\`\`\n`.trim()}function re(e,t=!1){const n=t?"pull request":"issue";return`\nYou are an expert software developer tasked with analyzing GitHub ${n}s and creating an implementation plan.\n\nReview the following GitHub ${n} and the list of available file paths and their contents (which will be provided in a separate message).${t?" Consider the comments on the pull request when creating the plan.":""}\nYour task is to:\n1. Create a detailed, step-by-step plan outlining how to resolve the ${n} effectively.\n2. Identify files that need to be modified to resolve the ${n}.\n3. Provide a concise and descriptive commit message for the changes, following the Conventional Commits specification.\n\nYour plan should:\n- Focus on implementation details for each file that needs modification\n- Be clear and actionable for a developer to follow\n- Prefer showing diffs rather than complete file contents when describing changes\n- Exclude testing procedures as those will be handled separately\n\nGitHub ${t?"Pull Request":"Issue"}:\n${e}\n\nPlease format your response without any explanatory text as follows:\n\`\`\`md\n${ne}\n\n1. [Specific implementation step]\n2. [Next implementation step]\n...\n\n${ee}\n\n- \`[filePath1]\`\n- \`[filePath2]\`\n- ...\n\n${oe}\n\n[commit message]\n\`\`\`\n`}function ae(e,t){const n=["--yes-always","--no-check-update","--no-gitignore","--no-show-model-warnings","--no-show-release-notes",...G(e.aiderExtraArgs||x),"--message",t.prompt];return e.dryRun&&n.push("--dry-run"),t.resolutionPlan&&"filePaths"in t.resolutionPlan&&n.push(...t.resolutionPlan.filePaths),n}const ce=process.env.CI||process.env.GITHUB_ACTIONS;function le(e,t){const n=["--yes","@anthropic-ai/claude-code@latest",...G(e.claudeCodeExtraArgs||v),"--dangerously-skip-permissions"];return ce&&n.push("--print"),n.push(t.prompt),n}function ue(e,t){return["--yes","@openai/codex@latest","exec",...G(e.codexExtraArgs||E),t.prompt]}function de(e,t){return["--yes","@google/gemini-cli@latest","--yolo",...G(e.geminiExtraArgs||""),"--prompt",t.prompt]}async function fe(e,t,n){const i="aider"===e.codingTool?"Aider":"claude-code"===e.codingTool?"Claude Code":"codex-cli"===e.codingTool?"Codex CLI":"Gemini CLI";let s;if("aider"===e.codingTool){const i=ae(e,{prompt:t,resolutionPlan:n});console.info(o.cyan(`Asking Aider to fix "${e.testCommand}"...`)),s=(await N("aider",i,{env:{...process.env,NO_COLOR:"1"},ignoreExitStatus:!0})).stdout}else if("claude-code"===e.codingTool){const n=le(e,{prompt:t});console.info(o.cyan(`Asking Claude Code to fix "${e.testCommand}"...`)),s=(await N(e.nodeRuntime,n,{env:{...process.env,NO_COLOR:"1"},stdio:"inherit",ignoreExitStatus:!0})).stdout}else if("codex-cli"===e.codingTool){const n=ue(e,{prompt:t});console.info(o.cyan(`Asking Codex to fix "${e.testCommand}"...`)),s=(await N(e.nodeRuntime,n,{env:{...process.env,NO_COLOR:"1"},ignoreExitStatus:!0})).stdout}else{const n=de(e,{prompt:t});console.info(o.cyan(`Asking Gemini CLI to fix "${e.testCommand}"...`)),s=(await N(e.nodeRuntime,n,{env:{...process.env,NO_COLOR:"1"},ignoreExitStatus:!0})).stdout}return`\n\n## ${i} fix attempt for "${e.testCommand}"\n\n${s.trim()}`}async function pe(t){i(),!process.env.AWS_REGION&&process.env.AWS_REGION_NAME?process.env.AWS_REGION=process.env.AWS_REGION_NAME:process.env.AWS_REGION&&!process.env.AWS_REGION_NAME&&(process.env.AWS_REGION_NAME=process.env.AWS_REGION),!process.env.GEMINI_API_KEY&&process.env.GOOGLE_GENERATIVE_AI_API_KEY?process.env.GEMINI_API_KEY=process.env.GOOGLE_GENERATIVE_AI_API_KEY:process.env.GEMINI_API_KEY&&!process.env.GOOGLE_GENERATIVE_AI_API_KEY&&(process.env.GOOGLE_GENERATIVE_AI_API_KEY=process.env.GEMINI_API_KEY),t.dryRun?console.info(o.yellow("Running in dry-run mode. No branches or PRs will be created.")):await async function(){const e=(await N("git",["config","user.name"],{ignoreExitStatus:!0})).stdout.trim(),t=(await N("git",["config","user.email"],{ignoreExitStatus:!0})).stdout.trim();if(!e||!t){const e=(await N("gh",["api","user"],{ignoreExitStatus:!0})).stdout.trim();try{const{name:t,email:n}=JSON.parse(e);t&&await N("git",["config","user.name",t]),n&&await N("git",["config","user.email",n])}catch{}}}(),"aider"===t.codingTool&&(await N("python",["-m","pip","install","aider-install"]),await me(),await N("uv",["tool","uninstall","aider-chat"],{ignoreExitStatus:!0}),await N("aider-install",[]),await me(),t.aiderExtraArgs?.includes("bedrock/")&&await N("uv",["tool","run","--from","aider-chat","pip","install","--upgrade","--upgrade-strategy","only-if-needed","boto3"]));const r=await async function(e){const{stdout:t}=await N("gh",["pr","view",e.issueNumber.toString(),"--json","headRefName"],{ignoreExitStatus:!0});try{if(t)return JSON.parse(t).headRefName}catch{}}(t),a=!!r,c=r||await async function(){return(await N("git",["branch","--show-current"])).stdout.trim()}(),l=await async function(e){const t=new Set,n=await K(e.issueNumber,t,e,!1);if(!n)throw new Error(`Failed to fetch issue data for issue #${e.issueNumber}`);return n}(t),u=n.stringify(l,J).trim(),d=t.planningModel&&await async function(t,o,i,s,r,a=!1){const c=z(o,"~"),l=`${c}yaml\n${n.stringify(o,J).trim()}\n${c}`,u=["--yes","repomix@latest","--output",Z];u.push(...G(r||R)),await N("npx",u);const d=e.readFileSync(Z,"utf8");if(e.promises.rm(Z,{force:!0}),i){console.info(`Selecting files with ${t} (reasoning effort: ${s}) ...`);const n=await Q(t,[{role:"system",content:ie(l,a).trim()},{role:"user",content:d}],s);console.info("Selecting complete!");const o=j(U(n),[ee,te]);if(!o)return{filePaths:[]};const[i,r]=o.map(e=>[...e.matchAll(/\B-\s*`?([^`\n]+)`?/g)].map(e=>e[1]?.trim()??"").filter(Boolean)),c=[...i,...r].map(t=>{const n=e.existsSync(t)?e.readFileSync(t,"utf8").trim():"",o=z(n,"~");return`## \`${t}\`\n\n${o}\n${n}\n${o}`}).join("\n\n");console.info(`Planning code changes with ${t} (reasoning effort: ${s}) ...`);const u=await Q(t,[{role:"system",content:se(l,a)},{role:"user",content:c}],s);console.info("Planning complete!");const f=j(U(u),[oe,ne]);if(!f)return{filePaths:i};const[p,m]=f;return{plan:m,commitMessage:p?.trim(),filePaths:i}}console.info(`Planning code changes with ${t} (reasoning effort: ${s}) ...`);const f=await Q(t,[{role:"system",content:re(l,a).trim()},{role:"user",content:d}],s);console.info("Planning complete!");const p=j(U(f),[oe,ne,ee]);if(!p)return{filePaths:[]};const[m,g,h]=p,w=[...(h??"").matchAll(/\B-\s*`?([^`\n]+)`?/g)].map(e=>e[1]?.trim()??"").filter(Boolean);return{plan:g,commitMessage:m?.trim(),filePaths:w}}(t.planningModel,u,t.twoStagePlanning,t.reasoningEffort,t.repomixExtraArgs,a)||void 0;console.info("Resolution plan:",d);const f=d&&"plan"in d&&d.plan||"",p=z(u,"~"),m=`\nModify the code to resolve ${a?"the comments on the following GitHub pull request":"the following GitHub issue"}${f?" based on the plan":""}.${"aider"!==t.codingTool?" After that, commit your changes with a message, following the Conventional Commits specification.":""}\n\n## ${a?"Pull Request":"Issue"}\n\n${p}yml\n${u}\n${p}\n\n${f&&`## Plan\n\n${f}`}\n`.trim(),g=new Date,h=`gen-pr-${t.issueNumber}-${t.codingTool}-${g.getFullYear()}_${ge(g.getMonth()+1)}${ge(g.getDate())}_${ge(g.getHours())}${ge(g.getMinutes())}${ge(g.getSeconds())}`;t.noBranch?t.dryRun?console.info(o.yellow(`Would commit directly to base branch: ${c}`)):(a&&await N("git",["fetch","origin",c]),await N("git",["switch",c])):t.dryRun?console.info(o.yellow(`Would create branch: ${h}`)):(a&&(await N("git",["fetch","origin",c]),await N("git",["switch",c])),await N("git",["switch","--force-create",h]));let w,y="",$="",b=!0;const x="aider"===t.codingTool?"Aider":"claude-code"===t.codingTool?"Claude Code":"codex-cli"===t.codingTool?"Codex CLI":"Gemini CLI";let v,E,A={env:{...process.env,NO_COLOR:"1"},ignoreExitStatus:!0};if("aider"===t.codingTool?(v=ae(t,{prompt:m,resolutionPlan:d}),E="aider"):"claude-code"===t.codingTool?(v=le(t,{prompt:m}),E=t.nodeRuntime,A={...A,stdio:"inherit"}):"codex-cli"===t.codingTool?(v=ue(t,{prompt:m}),E=t.nodeRuntime):(v=de(t,{prompt:m}),E=t.nodeRuntime),w=function(e,t,n){const o=t.map(e=>e===n?"...":e.includes(" ")||e.includes('"')||e.includes("'")?`"${e.replace(/"/g,'\\"')}"`:e);return`${e} ${o.join(" ")}`}(E,v,m),t.dryRun)console.info(`\n=== DRY MODE: ${x} Prompt ===`),console.info(m),console.info(`=== End ${x} Prompt ===\n`),console.info(o.yellow(`Would run: ${w}`)),y="Skipped due to dry-run mode";else{const e=await N(E,v,A);y=e.stdout||"",0!==e.status&&(b=!1,$=`${x} failed with exit code ${e.status}\n${e.stderr}`,console.error(o.red(`${x} execution failed: ${$}`)))}let P=(y||"").trim(),_=!0,I="";if(t.dryRun)console.info(o.yellow("Would run test command"));else{const e=await async function(e,t){const[n,...i]=G(e.testCommand||"");if(!n)return{fixResult:"",success:!0};const s=e.maxTestAttempts;let r=0,a="",c=!1,l="";for(;r<s;){r++,console.info(o.cyan(`Executing test command (attempt ${r}/${s}): ${e.testCommand}`));const u=await T(n,i,{cwd:process.cwd()});if(0===u.status){console.info(o.green("Test command passed successfully.")),c=!0;break}if(console.warn(o.yellow(`Test command failed with exit code ${u.status}.`)),l=`Test command failed with exit code ${u.status}\n\nStdout:\n${u.stdout}\n\nStderr:\n${u.stderr}`,r>=s){console.warn(o.yellow(`Maximum fix attempts (${s}) reached. Giving up.`));break}const d=z(u.stdout,"~"),f=z(u.stderr,"~"),p=`\nThe previous changes were applied, but the test command \`${e.testCommand}\` failed.\n\nExit code: ${u.status}\n\nStdout:\n${d}\n${u.stdout}\n${d}\n\nStderr:\n${f}\n${u.stderr}\n${f}\n\nPlease analyze the output and fix the errors.\n`.trim();a+=await fe(e,p,t)}return{fixResult:a,success:c,error:c?void 0:l}}(t,d);P+=e.fixResult,_=e.success,I=e.error||"",_||console.warn(o.yellow("Tests failed after all fix attempts. Will create a draft PR."))}b||console.warn(o.yellow(`${x} execution failed. Will create a draft PR.`));const O=!b||!_;let k="";O&&($&&(k+=`\n\n### ❌ ${x} Execution Error\n\n\`\`\`\n${$}\n\`\`\``),I&&(k+=`\n\n### ❌ Test Execution Error\n\n\`\`\`\n${I}\n\`\`\``));const M=d?.commitMessage||`fix: Close #${t.issueNumber}`;if(await N("git",["add","-A"],{ignoreExitStatus:!0}),0!==(await N("git",["commit","-m",M],{ignoreExitStatus:!0})).status&&await N("git",["commit","-m",M,"--no-verify"],{ignoreExitStatus:!0}),t.noBranch?t.dryRun?console.info(o.yellow(`Would push changes directly to base branch: ${c}`)):await N("git",["push","origin",c,"--no-verify"]):t.dryRun?console.info(o.yellow(`Would push branch: ${h} to origin`)):await N("git",["push","origin",h,"--no-verify"]),t.noBranch)t.dryRun?console.info(o.yellow("Skipping PR creation due to --no-branch option")):console.info(`Changes committed directly to base branch: ${c}`);else{const e=function(e){return s.spawnSync("git",["log",`${e}..HEAD`,"--reverse","--pretty=%s"],{encoding:"utf8",stdio:"pipe"}).stdout.trim().split("\n").find(e=>e.trim())??""}(c)||M;let n=a?"":`Close #${t.issueNumber}`;if(t.planningModel&&(n+=`\n\n${S}\n\n- **Planning Model:** ${t.planningModel}`),n+=`\n- **Coding Tool:** ${x}\n- **Coding Command:** \`${w}\``,f){const e=z(f,"~");n+=`\n\n### Plan\n\n${e}\n${C(f,P.length/(f.length+P.length)*3e4)}\n${e}`}if(P){const e=z(P,"~");n+=`\n\n### ${x} Log\n\n${e}\n${C(P,P.length/(f.length+P.length)*3e4)}\n${e}`}n=n.replaceAll(/(?:\s*\n){2,}/g,"\n\n").trim(),O&&(n+=k),t.dryRun?console.info(o.yellow(`Would create PR with title: ${e}${O?" (as draft)":""}`)):await async function(e){const{owner:t,repo:n}=await q();await L.pulls.create({owner:t,repo:n,title:e.title,body:e.body,head:e.head,base:e.base,draft:e.draft})}({title:e,body:n,head:h,base:c,draft:O})}console.info(`\n${a?"Pull request":"Issue"} #${t.issueNumber} processed successfully.`)}async function me(){try{await N("asdf",["reshim"],{ignoreExitStatus:!0})}catch{}}function ge(e){return String(e).padStart(2,"0")}export{_ as D,I as a,P as b,x as c,v as d,E as e,A as f,R as g,b as l,pe as m,k as n};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi1EQTN1LXNMYS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyIsIi4uL3NyYy9kZWZhdWx0T3B0aW9ucy50cyIsIi4uL3NyYy90ZXh0LnRzIiwiLi4vc3JjL3NwYXduLnRzIiwiLi4vc3JjL29jdG9raXQudHMiLCIuLi9zcmMvaXNzdWUudHMiLCIuLi9zcmMvbWFya2Rvd24udHMiLCIuLi9zcmMvbGxtdjQudHMiLCIuLi9zcmMveWFtbC50cyIsIi4uL3NyYy9sbG0udHMiLCIuLi9zcmMvcGxhbi50cyIsIi4uL3NyYy90b29scy9haWRlci50cyIsIi4uL3NyYy9jaS50cyIsIi4uL3NyYy90b29scy9jbGF1ZGVDb2RlLnRzIiwiLi4vc3JjL3Rvb2xzL2NvZGV4LnRzIiwiLi4vc3JjL3Rvb2xzL2dlbWluaS50cyIsIi4uL3NyYy90ZXN0LnRzIiwiLi4vc3JjL21haW4udHMiLCIuLi9zcmMvZW52LnRzIiwiLi4vc3JjL2dpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlnRmlsZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIC8vIExvYWQgY29uZmlnIGZpbGUgKFlBTUwpIGZyb20gcmVwb3NpdG9yeSByb290IHRvIHNldCBkZWZhdWx0IG9wdGlvbiB2YWx1ZXNcbiAgbGV0IGNvbmZpZ09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgbmFtZSBvZiBbJ2dlbi1wci5jb25maWcueW1sJywgJ2dlbi1wci5jb25maWcueWFtbCddKSB7XG4gICAgY29uc3QgY2ZnUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBuYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjZmdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnT3B0aW9ucyA9IFlBTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNmZ1BhdGgsICd1dGY4JykpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCBnZW4tcHIgY29uZmlnIGZyb20gJHtuYW1lfWApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjb25maWcgZmlsZSAke25hbWV9OmAsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnT3B0aW9ucztcbn1cbiIsImltcG9ydCB0eXBlIHsgTm9kZVJ1bnRpbWVBY3R1YWwgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFwiLS15ZXMtYWx3YXlzIC0tbm8tY2hlY2stdXBkYXRlIC0tbm8tZ2l0aWdub3JlIC0tbm8tc2hvdy1tb2RlbC13YXJuaW5ncyAtLW5vLXNob3ctcmVsZWFzZS1ub3Rlc1wiIGlzIGFsd2F5cyBhcHBsaWVkICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTID0gJy0tbW9kZWwgZ2VtaW5pL2dlbWluaS0yLjUtcHJvIC0tZWRpdC1mb3JtYXQgZGlmZi1mZW5jZWQnO1xuLyoqIFwiLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zIC0tcHJpbnRcIiBpcyBhbHdheXMgYXBwbGllZCAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xBVURFX0NPREVfRVhUUkFfQVJHUyA9ICctLWFsbG93ZWRUb29scyBCYXNoIEVkaXQgV3JpdGUnO1xuLyoqIGV4ZWMgaXMgYWx3YXlzIGFwcGxpZWQgKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MgPSAnLS1mdWxsLWF1dG8nO1xuLyoqIFwiLS15b2xvXCIgaXMgYWx3YXlzIGFwcGxpZWQgKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dFTUlOSV9FWFRSQV9BUkdTID0gJyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MgPSAnLS1jb21wcmVzcyAtLXJlbW92ZS1lbXB0eS1saW5lcyAtLWluY2x1ZGUgXCJzcmMvKiovKi57dHMsdHN4fSwqKi8qLm1kXCInO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1RFU1RfQVRURU1QVFMgPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09ESU5HX1RPT0wgPSAnYWlkZXInO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9ERV9SVU5USU1FOiBOb2RlUnVudGltZUFjdHVhbCA9ICducHgnO1xuIiwiZXhwb3J0IGNvbnN0IEhFQURJTkdfT0ZfR0VOX1BSX01FVEFEQVRBID0gJyMjIGdlbi1wciBNZXRhZGF0YSc7XG5cbi8qKlxuICogVHJ1bmNhdGUgbG9uZyB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodGV4dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB0ZXh0LnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgY29uc3Qgb21pdHRlZCA9IHRleHQubGVuZ3RoIC0gbWF4TGVuZ3RoO1xuICAgIHJldHVybiBgJHt0cnVuY2F0ZWR9XFxuXFxuLi4uICgke01hdGguZmxvb3Iob21pdHRlZCl9IGNoYXJhY3RlcnMgdHJ1bmNhdGVkKSAuLi5gO1xuICB9XG5cbiAgcmV0dXJuIHRleHQ7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBIVE1MLXN0eWxlIGNvbW1lbnRzIGZyb20gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1hcmtkb3duQ29udGVudCBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgbWFya2Rvd24gY29udGVudFxuICogQHJldHVybnMgVGhlIHN0cmluZyB3aXRoIEhUTUwgY29tbWVudHMgcmVtb3ZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBIdG1sQ29tbWVudHMobWFya2Rvd25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbWFya2Rvd25Db250ZW50LnJlcGxhY2UoLzwhLS1bXFxzXFxTXSo/LS0+L2csICcnKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGdlbi1wciBtZXRhZGF0YSBzZWN0aW9ucyBmcm9tIGEgUFIgYm9keSBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwTWV0YWRhdGFTZWN0aW9ucyhtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGluZGV4ID0gbWFya2Rvd25Db250ZW50LmluZGV4T2YoSEVBRElOR19PRl9HRU5fUFJfTUVUQURBVEEpO1xuICByZXR1cm4gaW5kZXggPj0gMCA/IG1hcmtkb3duQ29udGVudC5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbWFya2Rvd25Db250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTmV3TGluZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRleHQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCByZWdleCBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB0ZXh0IFRoZSBpbnB1dCB0ZXh0XG4gKiBAcGFyYW0gcGF0dGVybiBUaGUgcmVnZXggcGF0dGVybiBzdHJpbmcgdG8gcmVtb3ZlXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIG1hdGNoZWQgcGF0dGVybnMgcmVtb3ZlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUmVnZXhQYXR0ZXJuKHRleHQ6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXR0ZXJuKSByZXR1cm4gdGV4dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKHJlZ2V4LCAnJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHJlZ2V4IHBhdHRlcm4gXCIke3BhdHRlcm59XCI6YCwgZXJyb3IpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduT3B0aW9ucywgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgYW5zaXMgZnJvbSAnYW5zaXMnO1xuaW1wb3J0IHsgdHJ1bmNhdGVUZXh0IH0gZnJvbSAnLi90ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgTm9kZVJ1bnRpbWUsIE5vZGVSdW50aW1lQWN0dWFsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IE1BWF9MT0dfTEVOR1RIID0gMzAwMDtcblxuLyoqXG4gKiBOb3JtYWxpemVzIG5vZGUgcnVudGltZSB2YWx1ZXMgdG8gdGhlaXIgYWN0dWFsIGV4ZWN1dGFibGUgY29tbWFuZHMuXG4gKiAnbm9kZScgaXMgYW4gYWxpYXMgZm9yICducHgnIGFuZCAnYnVuJyBpcyBhbiBhbGlhcyBmb3IgJ2J1bngnLlxuICpcbiAqIEBwYXJhbSBydW50aW1lIFRoZSBydW50aW1lIHZhbHVlIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcnVudGltZSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOb2RlUnVudGltZShydW50aW1lOiBOb2RlUnVudGltZSk6IE5vZGVSdW50aW1lQWN0dWFsIHtcbiAgc3dpdGNoIChydW50aW1lKSB7XG4gICAgY2FzZSAnbm9kZSc6XG4gICAgY2FzZSAnbnB4JzpcbiAgICAgIHJldHVybiAnbnB4JztcbiAgICBjYXNlICdidW4nOlxuICAgIGNhc2UgJ2J1bngnOlxuICAgICAgcmV0dXJuICdidW54JztcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduT3B0aW9ucyAmIHsgaWdub3JlRXhpdFN0YXR1cz86IGJvb2xlYW47IHRydW5jYXRlU3Rkb3V0PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+PiB7XG4gIGNvbnN0IHsgaWdub3JlRXhpdFN0YXR1cywgLi4uc3Bhd25PcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCBhcmdzVGV4dCA9IGFyZ3MubWFwKChhKSA9PiAoYS5pbmNsdWRlcygnICcpID8gYFwiJHthLnJlcGxhY2VBbGwoJ1wiJywgJ1wiJyl9XCJgIDogYSkpLmpvaW4oJyAnKTtcbiAgY29uc29sZS5pbmZvKGFuc2lzLmdyZWVuKGAkICR7Y29tbWFuZH0gJHthcmdzVGV4dH1gKSk7XG5cbiAgY29uc29sZS5pbmZvKCdzdGRvdXQ6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIGFyZ3MsIHNwYXduT3B0aW9ucyk7XG4gIGlmIChzcGF3bk9wdGlvbnMudHJ1bmNhdGVTdGRvdXQpIGNvbnNvbGUuaW5mbyh0cnVuY2F0ZVRleHQocmV0LnN0ZG91dCwgTUFYX0xPR19MRU5HVEgpKTtcbiAgY29uc3Qgc3RkZXJyID0gcmV0LnN0ZGVyci50cmltKCk7XG4gIGlmIChzdGRlcnIpIHtcbiAgICBjb25zb2xlLmluZm8oJ3N0ZGVycjogLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgY29uc3QgdHJ1bmNhdGVkU3RkZXJyID0gdHJ1bmNhdGVUZXh0KHN0ZGVyciwgTUFYX0xPR19MRU5HVEgpO1xuICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3codHJ1bmNhdGVkU3RkZXJyKSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICBjb25zb2xlLmluZm8oYW5zaXMubWFnZW50YShgRXhpdCBjb2RlOiAke3JldC5zdGF0dXN9XFxuYCkpO1xuICBpZiAoIWlnbm9yZUV4aXRTdGF0dXMgJiYgcmV0LnN0YXR1cyAhPT0gMCAmJiByZXQuc3RhdHVzICE9PSBudWxsKSB7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zOiBTcGF3bk9wdGlvbnMgJiB7IHRydW5jYXRlU3Rkb3V0PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhbml0aXplIGFyZ3MgdG8gcmVtb3ZlIG51bGwgYnl0ZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZEFyZ3MgPSAoYXJncyA/PyBbXSkubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKC9cXDAvZywgJycpKTtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBzYW5pdGl6ZWRBcmdzLCBvcHRpb25zKTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucz8udHJ1bmNhdGVTdGRvdXQpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGNvbW1hbmQgbGluZSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBhcmd1bWVudHMsIHByZXNlcnZpbmcgcXVvdGVkIHN0cmluZ3MuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzOlxuICogLSBTcGFjZS1zZXBhcmF0ZWQgYXJndW1lbnRzXG4gKiAtIERvdWJsZS1xdW90ZWQgc3RyaW5ncyAocHJlc2VydmVzIHNwYWNlcyB3aXRoaW4pXG4gKiAtIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyAocHJlc2VydmVzIHNwYWNlcyB3aXRoaW4pXG4gKlxuICogQHBhcmFtIGFyZ3NTdHJpbmcgVGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgdG8gcGFyc2VcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHBhcnNlZCBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tbWFuZExpbmVBcmdzKGFyZ3NTdHJpbmc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFhcmdzU3RyaW5nKSByZXR1cm4gW107XG5cbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnc1N0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBhcmdzU3RyaW5nW2ldO1xuXG4gICAgLy8gSGFuZGxlIHF1b3Rlc1xuICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzcGFjZXMgKG9ubHkgc3BsaXQgb24gc3BhY2VzIG91dHNpZGUgb2YgcXVvdGVzKVxuICAgIGlmIChjaGFyID09PSAnICcgJiYgIWluRG91YmxlUXVvdGUgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0gJyc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGN1cnJlbnQgYXJndW1lbnRcbiAgICBjdXJyZW50ICs9IGNoYXI7XG4gIH1cblxuICAvLyBBZGQgdGhlIGxhc3QgYXJndW1lbnQgaWYgdGhlcmUgaXMgb25lXG4gIGlmIChjdXJyZW50KSB7XG4gICAgcmVzdWx0LnB1c2goY3VycmVudCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICdAb2N0b2tpdC9ncmFwaHFsJztcbmltcG9ydCB0eXBlIHsgUmVzdEVuZHBvaW50TWV0aG9kVHlwZXMgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9yZXN0JztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgTGFiZWxJbmZvLFxuICBQdWxsUmVxdWVzdFBhcmFtcyxcbiAgUHVsbFJlcXVlc3RSZXZpZXcsXG4gIFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkc1Jlc3BvbnNlLFxuICBSZXBvc2l0b3J5SW5mbyxcbiAgU2ltcGxlQ29tbWVudCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pLnN0ZG91dC50cmltKCk7XG5pZiAoIXRva2VuKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnR2l0SHViIHRva2VuIG5vdCBmb3VuZC4gUGxlYXNlIHNldCBHSF9UT0tFTiBvciBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGF1dGhlbnRpY2F0ZSB3aXRoIGdoIENMSSdcbiAgKTtcbn1cbmNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5jb25zdCBncmFwaHFsQ2xpZW50ID0gZ3JhcGhxbC5kZWZhdWx0cyh7XG4gIGhlYWRlcnM6IHtcbiAgICBhdXRob3JpemF0aW9uOiBgdG9rZW4gJHt0b2tlbn1gLFxuICB9LFxufSk7XG5cbmxldCByZXBvT3duZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVwb0luZm8oKTogUHJvbWlzZTxSZXBvc2l0b3J5SW5mbz4ge1xuICBpZiAoIXJlcG9Pd25lciB8fCAhcmVwb05hbWUpIHtcbiAgICAvLyBHZXQgcmVwbyBpbmZvIGZyb20gZ2l0IHJlbW90ZVxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ3JlbW90ZScsICdnZXQtdXJsJywgJ29yaWdpbiddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gICAgY29uc3QgcmVtb3RlVXJsID0gc3Rkb3V0LnRyaW0oKTtcblxuICAgIC8vIFBhcnNlIEdpdEh1YiByZXBvIFVSTCAoc3VwcG9ydHMgYm90aCBodHRwcyBhbmQgc3NoIGZvcm1hdHMpXG4gICAgY29uc3QgbWF0Y2ggPSByZW1vdGVVcmwubWF0Y2goL2dpdGh1YlxcLmNvbVs6L10oW14vXSspXFwvKC4rKS8pO1xuICAgIGlmIChtYXRjaD8uWzFdICYmIG1hdGNoWzJdKSB7XG4gICAgICByZXBvT3duZXIgPSBtYXRjaFsxXTtcbiAgICAgIHJlcG9OYW1lID0gbWF0Y2hbMl0ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcGFyc2UgR2l0SHViIHJlcG9zaXRvcnkgZnJvbSByZW1vdGUgVVJMJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXBvT3duZXIgfHwgIXJlcG9OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXBvc2l0b3J5IGluZm9ybWF0aW9uIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiB7IG93bmVyOiByZXBvT3duZXIsIHJlcG86IHJlcG9OYW1lIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVQdWxsUmVxdWVzdChwYXJhbXM6IFB1bGxSZXF1ZXN0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3duZXIsIHJlcG8gfSA9IGF3YWl0IGdldFJlcG9JbmZvKCk7XG5cbiAgYXdhaXQgb2N0b2tpdC5wdWxscy5jcmVhdGUoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgdGl0bGU6IHBhcmFtcy50aXRsZSxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgICBoZWFkOiBwYXJhbXMuaGVhZCxcbiAgICBiYXNlOiBwYXJhbXMuYmFzZSxcbiAgICBkcmFmdDogcGFyYW1zLmRyYWZ0LFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFB1bGxSZXF1ZXN0RGlmZihwdWxsTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5wdWxscy5nZXQoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgcHVsbF9udW1iZXI6IHB1bGxOdW1iZXIsXG4gICAgbWVkaWFUeXBlOiB7XG4gICAgICBmb3JtYXQ6ICdkaWZmJyxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVzcG9uc2UuZGF0YSBhcyB1bmtub3duIGFzIHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElzc3VlKGlzc3VlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgbGFiZWxzOiBMYWJlbEluZm9bXTtcbiAgY29tbWVudHM6IFNpbXBsZUNvbW1lbnRbXTtcbiAgdXJsOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHsgb3duZXIsIHJlcG8gfSA9IGF3YWl0IGdldFJlcG9JbmZvKCk7XG5cbiAgLy8gR2V0IGlzc3VlIGRhdGEgZmlyc3QgLSB0aGlzIHdvcmtzIGZvciBib3RoIGlzc3VlcyBhbmQgUFJzXG4gIGNvbnN0IHsgZGF0YTogaXNzdWVEYXRhIH0gPSBhd2FpdCBvY3Rva2l0Lmlzc3Vlcy5nZXQoe1xuICAgIG93bmVyLFxuICAgIHJlcG8sXG4gICAgaXNzdWVfbnVtYmVyOiBpc3N1ZU51bWJlcixcbiAgfSk7XG4gIC8vIElmIGl0IGhhcyBwdWxsX3JlcXVlc3QgZmllbGQsIGdldCB0aGUgZnVsbCBQUiBkYXRhXG4gIGxldCBpc3N1ZU9yUHVsbFJlcXVlc3Q6XG4gICAgfCBSZXN0RW5kcG9pbnRNZXRob2RUeXBlc1sncHVsbHMnXVsnZ2V0J11bJ3Jlc3BvbnNlJ11bJ2RhdGEnXVxuICAgIHwgUmVzdEVuZHBvaW50TWV0aG9kVHlwZXNbJ2lzc3VlcyddWydnZXQnXVsncmVzcG9uc2UnXVsnZGF0YSddID0gaXNzdWVEYXRhO1xuICBpZiAoaXNzdWVEYXRhLnB1bGxfcmVxdWVzdCkge1xuICAgIGNvbnN0IHsgZGF0YTogcHJEYXRhIH0gPSBhd2FpdCBvY3Rva2l0LnB1bGxzLmdldCh7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBwdWxsX251bWJlcjogaXNzdWVOdW1iZXIsXG4gICAgfSk7XG4gICAgaXNzdWVPclB1bGxSZXF1ZXN0ID0gcHJEYXRhO1xuICB9XG5cbiAgY29uc3QgY29tbWVudHNSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuaXNzdWVzLmxpc3RDb21tZW50cyh7XG4gICAgb3duZXIsXG4gICAgcmVwbyxcbiAgICBpc3N1ZV9udW1iZXI6IGlzc3VlTnVtYmVyLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGF1dGhvcjogaXNzdWVPclB1bGxSZXF1ZXN0LnVzZXI/LmxvZ2luIHx8ICcnLFxuICAgIHRpdGxlOiBpc3N1ZU9yUHVsbFJlcXVlc3QudGl0bGUsXG4gICAgYm9keTogaXNzdWVPclB1bGxSZXF1ZXN0LmJvZHkgfHwgJycsXG4gICAgbGFiZWxzOiBpc3N1ZU9yUHVsbFJlcXVlc3QubGFiZWxzLm1hcCgobGFiZWw6IHN0cmluZyB8IHsgbmFtZT86IHN0cmluZyB9KSA9PiAoe1xuICAgICAgbmFtZTogdHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyA/IGxhYmVsIDogbGFiZWwubmFtZSB8fCAnJyxcbiAgICB9KSksXG4gICAgY29tbWVudHM6IGNvbW1lbnRzUmVzcG9uc2UuZGF0YS5tYXAoKGNvbW1lbnQpID0+ICh7XG4gICAgICBhdXRob3I6IGNvbW1lbnQudXNlcj8ubG9naW4gfHwgJycsXG4gICAgICBib2R5OiBjb21tZW50LmJvZHkgfHwgJycsXG4gICAgICBjcmVhdGVkQXQ6IGNvbW1lbnQuY3JlYXRlZF9hdCxcbiAgICB9KSksXG4gICAgdXJsOiBpc3N1ZU9yUHVsbFJlcXVlc3QuaHRtbF91cmwsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQdWxsUmVxdWVzdFJldmlld1RocmVhZHMocHVsbE51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxQdWxsUmVxdWVzdFJldmlld1RocmVhZHNSZXNwb25zZT4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IE1BWF9NRVNTQUdFX0NPVU5UID0gMTAwO1xuICBjb25zdCBxdWVyeSA9IGBcbiAgICBxdWVyeSgkb3duZXI6IFN0cmluZyEsICRyZXBvOiBTdHJpbmchLCAkcHI6IEludCEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHtcbiAgICAgICAgcHVsbFJlcXVlc3QobnVtYmVyOiAkcHIpIHtcbiAgICAgICAgICByZXZpZXdUaHJlYWRzKGZpcnN0OiAke01BWF9NRVNTQUdFX0NPVU5UfSkge1xuICAgICAgICAgICAgbm9kZXMge1xuICAgICAgICAgICAgICBpc1Jlc29sdmVkXG4gICAgICAgICAgICAgIGNvbW1lbnRzKGZpcnN0OiAke01BWF9NRVNTQUdFX0NPVU5UfSkge1xuICAgICAgICAgICAgICAgIG5vZGVzIHtcbiAgICAgICAgICAgICAgICAgIGF1dGhvciB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2luXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBib2R5XG4gICAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAgICAgICBkaWZmSHVua1xuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBgO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdyYXBocWxDbGllbnQocXVlcnksIHtcbiAgICBvd25lcixcbiAgICByZXBvLFxuICAgIHByOiBwdWxsTnVtYmVyLFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IGFzIFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkc1Jlc3BvbnNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHVsbFJlcXVlc3RSZXZpZXdzKHB1bGxOdW1iZXI6IG51bWJlcik6IFByb21pc2U8UHVsbFJlcXVlc3RSZXZpZXdbXT4ge1xuICBjb25zdCB7IG93bmVyLCByZXBvIH0gPSBhd2FpdCBnZXRSZXBvSW5mbygpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5wdWxscy5saXN0UmV2aWV3cyh7XG4gICAgb3duZXIsXG4gICAgcmVwbyxcbiAgICBwdWxsX251bWJlcjogcHVsbE51bWJlcixcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmRhdGEubWFwKChyZXZpZXcpID0+ICh7XG4gICAgdXNlcjogeyBsb2dpbjogcmV2aWV3LnVzZXI/LmxvZ2luIHx8ICcnIH0sXG4gICAgc3RhdGU6IHJldmlldy5zdGF0ZSxcbiAgICBib2R5OiByZXZpZXcuYm9keSB8fCAnJyxcbiAgICBzdWJtaXR0ZWRfYXQ6IHJldmlldy5zdWJtaXR0ZWRfYXQgfHwgJycsXG4gIH0pKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuL21haW4uanMnO1xuaW1wb3J0IHsgZ2V0SXNzdWUsIGdldFB1bGxSZXF1ZXN0RGlmZiwgZ2V0UHVsbFJlcXVlc3RSZXZpZXdzLCBnZXRQdWxsUmVxdWVzdFJldmlld1RocmVhZHMgfSBmcm9tICcuL29jdG9raXQuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplTmV3TGluZXMsIHJlbW92ZVJlZ2V4UGF0dGVybiwgc3RyaXBIdG1sQ29tbWVudHMsIHN0cmlwTWV0YWRhdGFTZWN0aW9ucyB9IGZyb20gJy4vdGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IElzc3VlQ29tbWVudCwgSXNzdWVJbmZvLCBVc2VyTG9naW4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gVGVtcG9yYXJ5IGludGVyZmFjZSBmb3Igc29ydGluZyBjb21tZW50cyB3aXRoIGRhdGUgaW5mb3JtYXRpb25cbmludGVyZmFjZSBJc3N1ZUNvbW1lbnRXaXRoRGF0ZSBleHRlbmRzIElzc3VlQ29tbWVudCB7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSXNzdWVJbmZvKG9wdGlvbnM6IE1haW5PcHRpb25zKTogUHJvbWlzZTxJc3N1ZUluZm8+IHtcbiAgY29uc3QgcHJvY2Vzc2VkSXNzdWVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGNvbnN0IGlzc3VlSW5mbyA9IGF3YWl0IGZldGNoSXNzdWVEYXRhKG9wdGlvbnMuaXNzdWVOdW1iZXIsIHByb2Nlc3NlZElzc3Vlcywgb3B0aW9ucywgZmFsc2UpO1xuICBpZiAoIWlzc3VlSW5mbykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGlzc3VlIGRhdGEgZm9yIGlzc3VlICMke29wdGlvbnMuaXNzdWVOdW1iZXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGlzc3VlSW5mbztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQUkRpZmYoaXNzdWVOdW1iZXI6IG51bWJlciwgaXNzdWVJbmZvOiBJc3N1ZUluZm8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwckRpZmYgPSBhd2FpdCBnZXRQdWxsUmVxdWVzdERpZmYoaXNzdWVOdW1iZXIpO1xuICAgIGlmICghcHJEaWZmLnRyaW0oKSkgcmV0dXJuO1xuICAgIGlzc3VlSW5mby5jb2RlX2NoYW5nZXMgPSBwcm9jZXNzRGlmZkNvbnRlbnQocHJEaWZmLnRyaW0oKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggUFIgZGlmZjonLCBlcnJvcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hJc3N1ZURhdGEoXG4gIGlzc3VlTnVtYmVyOiBudW1iZXIsXG4gIHByb2Nlc3NlZElzc3VlczogU2V0PG51bWJlcj4sXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBpc1JlZmVyZW5jZWQgPSBmYWxzZVxuKTogUHJvbWlzZTxJc3N1ZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHByb2Nlc3NlZElzc3Vlcy5oYXMoaXNzdWVOdW1iZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb2Nlc3NlZElzc3Vlcy5hZGQoaXNzdWVOdW1iZXIpO1xuXG4gIGxldCBpc3N1ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRJc3N1ZT4+O1xuICB0cnkge1xuICAgIGlzc3VlID0gYXdhaXQgZ2V0SXNzdWUoaXNzdWVOdW1iZXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIGlzc3VlICMke2lzc3VlTnVtYmVyfTpgLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRXh0cmFjdCBpc3N1ZS9QUiByZWZlcmVuY2VzIGZyb20gdGhlIGlzc3VlIGJvZHkgYW5kIGNvbW1lbnRzXG4gIGNvbnN0IGFsbFRleHQgPSBbaXNzdWUuYm9keSwgLi4uaXNzdWUuY29tbWVudHMubWFwKChjKSA9PiBjLmJvZHkpXS5qb2luKCdcXG4nKTtcbiAgY29uc3QgcmVmZXJlbmNlZE51bWJlcnMgPSBleHRyYWN0SXNzdWVSZWZlcmVuY2VzKGFsbFRleHQpO1xuXG4gIGNvbnN0IHJhd0JvZHkgPSBzdHJpcEh0bWxDb21tZW50cyhpc3N1ZS5ib2R5KTtcbiAgY29uc3QgcHJvY2Vzc2VkQm9keSA9IGlzc3VlLnVybD8uaW5jbHVkZXMoJy9wdWxsLycpID8gc3RyaXBNZXRhZGF0YVNlY3Rpb25zKHJhd0JvZHkpIDogcmF3Qm9keTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByZW1vdmVSZWdleFBhdHRlcm4ocHJvY2Vzc2VkQm9keSwgb3B0aW9ucy5yZW1vdmVQYXR0ZXJuIHx8ICcnKTtcbiAgY29uc3QgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXSA9IGlzc3VlLmNvbW1lbnRzLm1hcCgoYykgPT4gKHtcbiAgICBhdXRob3I6IGMuYXV0aG9yLFxuICAgIGJvZHk6IG5vcm1hbGl6ZU5ld0xpbmVzKGMuYm9keSksXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjLmNyZWF0ZWRBdCkuZ2V0VGltZSgpLFxuICB9KSk7XG5cbiAgY29uc3QgaXNzdWVJbmZvOiBJc3N1ZUluZm8gPSB7XG4gICAgYXV0aG9yOiBpc3N1ZS5hdXRob3IsXG4gICAgdGl0bGU6IGlzc3VlLnRpdGxlLFxuICAgIGRlc2NyaXB0aW9uOiBub3JtYWxpemVOZXdMaW5lcyhkZXNjcmlwdGlvbiksXG4gICAgY29tbWVudHM6IFtdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBhZnRlciBzb3J0aW5nXG4gIH07XG5cbiAgaWYgKGlzc3VlLnVybD8uaW5jbHVkZXMoJy9wdWxsLycpICYmICFpc1JlZmVyZW5jZWQpIHtcbiAgICBhd2FpdCBmZXRjaFBSRGlmZihpc3N1ZU51bWJlciwgaXNzdWVJbmZvKTtcbiAgICBhd2FpdCBmZXRjaFBSUmV2aWV3VGhyZWFkcyhpc3N1ZU51bWJlciwgY29tbWVudHNXaXRoRGF0ZSk7XG4gICAgYXdhaXQgZmV0Y2hQUlJldmlld3MoaXNzdWVOdW1iZXIsIGNvbW1lbnRzV2l0aERhdGUpO1xuICB9XG5cbiAgaWYgKHJlZmVyZW5jZWROdW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICBhd2FpdCBmZXRjaFJlZmVyZW5jZWRJc3N1ZXMocmVmZXJlbmNlZE51bWJlcnMsIHByb2Nlc3NlZElzc3Vlcywgb3B0aW9ucywgaXNzdWVJbmZvKTtcbiAgfVxuXG4gIC8vIFNvcnQgY29tbWVudHMgYnkgY3JlYXRpb24gZGF0ZSAob2xkZXN0IGZpcnN0KSBhbmQgcmVtb3ZlIGNyZWF0ZWRBdCBmaWVsZFxuICBpc3N1ZUluZm8uY29tbWVudHMgPSBjb21tZW50c1dpdGhEYXRlXG4gICAgLmZpbHRlcigoYykgPT4gYy5ib2R5KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNyZWF0ZWRBdCAtIGIuY3JlYXRlZEF0KVxuICAgIC5tYXAoKHsgY3JlYXRlZEF0LCAuLi5jb21tZW50IH0pID0+IGNvbW1lbnQpO1xuXG4gIHJldHVybiBpc3N1ZUluZm87XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUFJSZXZpZXdUaHJlYWRzKGlzc3VlTnVtYmVyOiBudW1iZXIsIGNvbW1lbnRzV2l0aERhdGU6IElzc3VlQ29tbWVudFdpdGhEYXRlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsRGF0YSA9IGF3YWl0IGdldFB1bGxSZXF1ZXN0UmV2aWV3VGhyZWFkcyhpc3N1ZU51bWJlcik7XG4gICAgY29uc3QgcmV2aWV3VGhyZWFkcyA9IGdyYXBocWxEYXRhPy5yZXBvc2l0b3J5Py5wdWxsUmVxdWVzdD8ucmV2aWV3VGhyZWFkcz8ubm9kZXMgfHwgW107XG5cbiAgICBmb3IgKGNvbnN0IHRocmVhZCBvZiByZXZpZXdUaHJlYWRzKSB7XG4gICAgICBpZiAoIXRocmVhZC5pc1Jlc29sdmVkICYmIHRocmVhZC5jb21tZW50cz8ubm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc1Jldmlld1RocmVhZENvbW1lbnRzKHRocmVhZC5jb21tZW50cy5ub2RlcywgY29tbWVudHNXaXRoRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIFBSIHJldmlldyB0aHJlYWRzOicsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzUmV2aWV3VGhyZWFkQ29tbWVudHMoXG4gIGNvbW1lbnRzOiBBcnJheTx7XG4gICAgYXV0aG9yPzogVXNlckxvZ2luO1xuICAgIGJvZHk/OiBzdHJpbmc7XG4gICAgcGF0aD86IHN0cmluZztcbiAgICBsaW5lPzogbnVtYmVyO1xuICAgIGRpZmZIdW5rPzogc3RyaW5nO1xuICAgIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB9PixcbiAgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgY29tbWVudCBvZiBjb21tZW50cykge1xuICAgIGlmICghY29tbWVudC5hdXRob3IgfHwgIWNvbW1lbnQuYm9keSkgY29udGludWU7XG5cbiAgICBjb25zdCBjb2RlQ29udGVudCA9IGV4dHJhY3RDb2RlRnJvbURpZmZIdW5rKGNvbW1lbnQuZGlmZkh1bmspO1xuICAgIGNvbnN0IHJldmlld0NvbW1lbnQ6IElzc3VlQ29tbWVudFdpdGhEYXRlID0ge1xuICAgICAgYXV0aG9yOiBjb21tZW50LmF1dGhvci5sb2dpbixcbiAgICAgIGNvZGVMb2NhdGlvbjogY29tbWVudC5wYXRoICYmIGNvbW1lbnQubGluZSA/IGAke2NvbW1lbnQucGF0aH06JHtjb21tZW50LmxpbmV9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGVDb250ZW50OiBjb2RlQ29udGVudCB8fCB1bmRlZmluZWQsXG4gICAgICBib2R5OiBub3JtYWxpemVOZXdMaW5lcyhjb21tZW50LmJvZHkpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjb21tZW50LmNyZWF0ZWRBdCkuZ2V0VGltZSgpLFxuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHByb3BlcnRpZXNcbiAgICBPYmplY3Qua2V5cyhyZXZpZXdDb21tZW50KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChyZXZpZXdDb21tZW50W2tleSBhcyBrZXlvZiBJc3N1ZUNvbW1lbnRXaXRoRGF0ZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgcmV2aWV3Q29tbWVudFtrZXkgYXMga2V5b2YgSXNzdWVDb21tZW50V2l0aERhdGVdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29tbWVudHNXaXRoRGF0ZS5wdXNoKHJldmlld0NvbW1lbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDb2RlRnJvbURpZmZIdW5rKGRpZmZIdW5rOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWRpZmZIdW5rKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgbGluZXMgPSBkaWZmSHVuay5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGNvZGVMaW5lID0gbGluZXMuZmluZChcbiAgICAobGluZTogc3RyaW5nKSA9PiAobGluZS5zdGFydHNXaXRoKCcrJykgfHwgbGluZS5zdGFydHNXaXRoKCctJykpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ0BAJykgJiYgbGluZS50cmltKCkubGVuZ3RoID4gMVxuICApO1xuICByZXR1cm4gY29kZUxpbmU/LnRyaW0oKSB8fCAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQUlJldmlld3MoaXNzdWVOdW1iZXI6IG51bWJlciwgY29tbWVudHNXaXRoRGF0ZTogSXNzdWVDb21tZW50V2l0aERhdGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJldmlld3MgPSBhd2FpdCBnZXRQdWxsUmVxdWVzdFJldmlld3MoaXNzdWVOdW1iZXIpO1xuICAgIGNvbnN0IHJldmlld1Jlc3VsdENvbW1lbnRzOiBJc3N1ZUNvbW1lbnRXaXRoRGF0ZVtdID0gcmV2aWV3cy5tYXAoKHJldmlldykgPT4gKHtcbiAgICAgIGF1dGhvcjogcmV2aWV3LnVzZXIubG9naW4sXG4gICAgICByZXZpZXdTdGF0ZTogcmV2aWV3LnN0YXRlLFxuICAgICAgYm9keTogbm9ybWFsaXplTmV3TGluZXMocmV2aWV3LmJvZHkpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShyZXZpZXcuc3VibWl0dGVkX2F0KS5nZXRUaW1lKCksXG4gICAgfSkpO1xuICAgIGNvbW1lbnRzV2l0aERhdGUucHVzaCguLi5yZXZpZXdSZXN1bHRDb21tZW50cyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggUFIgcmV2aWV3czonLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdElzc3VlUmVmZXJlbmNlcyh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlZ2V4ID0gLyg/Ol58XFxzKSMoXFxkKykvZztcbiAgY29uc3QgbnVtYmVyczogbnVtYmVyW10gPSBbXTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyh0ZXh0KTtcbiAgICBpZiAoIW1hdGNoKSBicmVhaztcblxuICAgIGNvbnN0IG51bWJlciA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSA/PyAnJywgMTApO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcikpIHtcbiAgICAgIG51bWJlcnMucHVzaChudW1iZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQobnVtYmVycyldOyAvLyBSZW1vdmUgZHVwbGljYXRlc1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZmVyZW5jZWRJc3N1ZXMoXG4gIHJlZmVyZW5jZWROdW1iZXJzOiBudW1iZXJbXSxcbiAgcHJvY2Vzc2VkSXNzdWVzOiBTZXQ8bnVtYmVyPixcbiAgb3B0aW9uczogTWFpbk9wdGlvbnMsXG4gIGlzc3VlSW5mbzogSXNzdWVJbmZvXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVmZXJlbmNlZElzc3Vlc1Byb21pc2VzID0gcmVmZXJlbmNlZE51bWJlcnMubWFwKChudW0pID0+IGZldGNoSXNzdWVEYXRhKG51bSwgcHJvY2Vzc2VkSXNzdWVzLCBvcHRpb25zLCB0cnVlKSk7XG4gIGNvbnN0IHJlZmVyZW5jZWRJc3N1ZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVmZXJlbmNlZElzc3Vlc1Byb21pc2VzKSkuZmlsdGVyKChpc3N1ZSk6IGlzc3VlIGlzIElzc3VlSW5mbyA9PiAhIWlzc3VlKTtcblxuICBpZiAocmVmZXJlbmNlZElzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpc3N1ZUluZm8ucmVmZXJlbmNlZF9pc3N1ZXMgPSByZWZlcmVuY2VkSXNzdWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgZGlmZiBjb250ZW50IHRvIGhhbmRsZSBsYXJnZSBkaWZmcyBieSB0cnVuY2F0aW5nIG9yIG9taXR0aW5nIGxhcmdlIGZyYWdtZW50c1xuICovXG5mdW5jdGlvbiBwcm9jZXNzRGlmZkNvbnRlbnQoZGlmZkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IE1BWF9UT1RBTF9ESUZGX1NJWkUgPSA1MDAwMDtcbiAgY29uc3QgTUFYX0ZJTEVfRElGRl9TSVpFID0gMTAwMDA7XG4gIGNvbnN0IExBUkdFX0ZJTEVfUEFUVEVSTlMgPSBbXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9kaXN0XFwvL20sXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9idWlsZFxcLy9tLFxuICAgIC9eZGlmZiAtLWdpdCBhXFwvLipcXC5idW5kbGVcXC4vbSxcbiAgICAvXmRpZmYgLS1naXQgYVxcLy4qXFwubWluXFwuL20sXG4gICAgL15kaWZmIC0tZ2l0IGFcXC9ub2RlX21vZHVsZXNcXC8vbSxcbiAgXTtcblxuICAvLyBJZiB0aGUgZW50aXJlIGRpZmYgaXMgc21hbGwgZW5vdWdoLCByZXR1cm4gYXMtaXNcbiAgaWYgKGRpZmZDb250ZW50Lmxlbmd0aCA8PSBNQVhfVE9UQUxfRElGRl9TSVpFKSB7XG4gICAgcmV0dXJuIGRpZmZDb250ZW50O1xuICB9XG5cbiAgLy8gU3BsaXQgZGlmZiBpbnRvIGluZGl2aWR1YWwgZmlsZSBzZWN0aW9uc1xuICBjb25zdCBmaWxlU2VjdGlvbnMgPSBkaWZmQ29udGVudC5zcGxpdCgvKD89XmRpZmYgLS1naXQpL20pO1xuICBjb25zdCBwcm9jZXNzZWRTZWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGZpbGVTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbi50cmltKCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgaXNMYXJnZUZpbGUgPSBMQVJHRV9GSUxFX1BBVFRFUk5TLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzZWN0aW9uKSk7XG5cbiAgICBpZiAoaXNMYXJnZUZpbGUpIHtcbiAgICAgIC8vIEZvciBsYXJnZS9idW5kbGVkIGZpbGVzLCBpbmNsdWRlIG9ubHkgdGhlIGhlYWRlciBhbmQgYSB0cnVuY2F0aW9uIG5vdGljZVxuICAgICAgY29uc3QgbGluZXMgPSBzZWN0aW9uLnNwbGl0KCdcXG4nKTtcbiAgICAgIGNvbnN0IGhlYWRlckxpbmVzID0gbGluZXMuc2xpY2UoMCwgNCk7IC8vIGRpZmYgLS1naXQsIGluZGV4LCAtLS0sICsrK1xuICAgICAgY29uc3QgdHJ1bmNhdGVkU2VjdGlvbiA9IFtcbiAgICAgICAgLi4uaGVhZGVyTGluZXMsXG4gICAgICAgICdAQCAuLi4gQEAnLFxuICAgICAgICAnLi4uIChsYXJnZSBidW5kbGVkL2NvbXBpbGVkIGZpbGUgZGlmZiB0cnVuY2F0ZWQpIC4uLicsXG4gICAgICAgICcnLFxuICAgICAgXS5qb2luKCdcXG4nKTtcblxuICAgICAgcHJvY2Vzc2VkU2VjdGlvbnMucHVzaCh0cnVuY2F0ZWRTZWN0aW9uKTtcbiAgICAgIHRvdGFsU2l6ZSArPSB0cnVuY2F0ZWRTZWN0aW9uLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHNlY3Rpb24ubGVuZ3RoID4gTUFYX0ZJTEVfRElGRl9TSVpFKSB7XG4gICAgICAvLyBGb3Igb3RoZXIgbGFyZ2UgZmlsZXMsIHRydW5jYXRlIGJ1dCBrZWVwIHNvbWUgY29udGVudFxuICAgICAgY29uc3QgdHJ1bmNhdGVkU2VjdGlvbiA9IGAke3NlY3Rpb24uc2xpY2UoMCwgTUFYX0ZJTEVfRElGRl9TSVpFKX1cXG4uLi4gKGRpZmYgdHJ1bmNhdGVkKSAuLi5cXG5gO1xuICAgICAgcHJvY2Vzc2VkU2VjdGlvbnMucHVzaCh0cnVuY2F0ZWRTZWN0aW9uKTtcbiAgICAgIHRvdGFsU2l6ZSArPSB0cnVuY2F0ZWRTZWN0aW9uLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU21hbGwgZmlsZXMsIGluY2x1ZGUgYXMtaXNcbiAgICAgIHByb2Nlc3NlZFNlY3Rpb25zLnB1c2goc2VjdGlvbik7XG4gICAgICB0b3RhbFNpemUgKz0gc2VjdGlvbi5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBpZiB3ZSdyZSBhcHByb2FjaGluZyB0aGUgdG90YWwgc2l6ZSBsaW1pdFxuICAgIGlmICh0b3RhbFNpemUgPiBNQVhfVE9UQUxfRElGRl9TSVpFICogMC45KSB7XG4gICAgICBwcm9jZXNzZWRTZWN0aW9ucy5wdXNoKCdcXG4uLi4gKHJlbWFpbmluZyBkaWZmcyB0cnVuY2F0ZWQpIC4uLlxcbicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByb2Nlc3NlZFNlY3Rpb25zLmpvaW4oJycpO1xufVxuIiwiLyoqXG4gKiBFeHRyYWN0cyBjb250ZW50IGJldHdlZW4gc3BlY2lmaWVkIGhlYWRlcnMgZnJvbSBhIHRleHRcbiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHBhcnNlXG4gKiBAcGFyYW0gaGVhZGVycyBBcnJheSBvZiBoZWFkZXIgc3RyaW5ncyB0byBleHRyYWN0IGNvbnRlbnQgZm9yXG4gKiBAcmV0dXJucyBBcnJheSBvZiBjb250ZW50IHN0cmluZ3MsIG9yIHVuZGVmaW5lZCBpZiBhbnkgaGVhZGVycyBhcmUgbWlzc2luZyBvciBpbiBkaWZmZXJlbnQgb3JkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RIZWFkZXJDb250ZW50cyh0ZXh0OiBzdHJpbmcsIGhlYWRlcnM6IHN0cmluZ1tdKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBtb2RpZmllZFJlc3BvbnNlID0gYFxcbiR7dGV4dH1gO1xuICBjb25zdCBpbmRpY2VzID0gaGVhZGVycy5tYXAoKGhlYWRlcikgPT4gbW9kaWZpZWRSZXNwb25zZS5pbmRleE9mKGBcXG4ke2hlYWRlcn1gKSk7XG5cbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBhbnkgaGVhZGVycyBhcmUgbWlzc2luZyBvciBub3QgaW4gb3JkZXJcbiAgaWYgKFxuICAgIGluZGljZXMuc29tZSgoaW5kZXgpID0+IGluZGV4ID09PSAtMSkgfHxcbiAgICAhaW5kaWNlcy5ldmVyeSgoaW5kZXgsIGkpID0+IGkgPT09IDAgfHwgaW5kZXggPiAoaW5kaWNlc1tpIC0gMV0gYXMgbnVtYmVyKSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzLm1hcCgoaGVhZGVyLCBpKSA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSAoaW5kaWNlc1tpXSBhcyBudW1iZXIpICsgMSArIGhlYWRlci5sZW5ndGg7XG4gICAgY29uc3QgZW5kID0gaSArIDEgPCBoZWFkZXJzLmxlbmd0aCA/IChpbmRpY2VzW2kgKyAxXSBhcyBudW1iZXIpICsgMSA6IG1vZGlmaWVkUmVzcG9uc2UubGVuZ3RoO1xuICAgIHJldHVybiBtb2RpZmllZFJlc3BvbnNlLnNsaWNlKHN0YXJ0LCBlbmQpLnRyaW0oKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGlzdGluY3RGZW5jZShjb250ZW50OiBzdHJpbmcsIGZlbmNlQ2hhcjogJ2AnIHwgJ34nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAke2ZlbmNlQ2hhcn17Myx9YCwgJ2cnKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2gocmVnZXgpO1xuICBjb25zdCBtYXhMZW5ndGggPSBtYXRjaGVzID8gTWF0aC5tYXgoLi4ubWF0Y2hlcy5tYXAoKHNlcSkgPT4gc2VxLmxlbmd0aCkpIDogMDtcbiAgY29uc3QgZmVuY2VMZW5ndGggPSBNYXRoLm1heCgzLCBtYXhMZW5ndGggKyAxKTtcbiAgcmV0dXJuIGZlbmNlQ2hhci5yZXBlYXQoZmVuY2VMZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbUNvZGVCbG9ja0ZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZW1vdmUgY29kZSBibG9jayBmZW5jZXMgd2l0aCBhbnkgbnVtYmVyIG9mIGJhY2t0aWNrcyBvciB0aWxkZXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmRcbiAgcmV0dXJuIGNvbnRlbnQudHJpbSgpLnJlcGxhY2UoL14oYHszLH18fnszLH0pW1xcc1xcU10qP1xcbihbXFxzXFxTXSo/KVxcblxcMVxccyokLywgJyQyJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcbmltcG9ydCB7IGdlbmVyYXRlVGV4dCwgdHlwZSBNZXNzYWdlIH0gZnJvbSAnYWktdjQnO1xuaW1wb3J0IHsgY3JlYXRlT2xsYW1hIH0gZnJvbSAnb2xsYW1hLWFpLXByb3ZpZGVyLXYyJztcbmltcG9ydCB7IGxvZ1Jlc3VsdCB9IGZyb20gJy4vbGxtLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogQ2FsbCBBSSBTREsgdjQgcHJvdmlkZXIgQVBJIChmb3IgT2xsYW1hKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbFY0UHJvdmlkZXJBcGkoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgcmVhc29uaW5nRWZmb3J0PzogUmVhc29uaW5nRWZmb3J0XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBbcHJvdmlkZXIsIC4uLm1vZGVsUGFydHNdID0gbW9kZWwuc3BsaXQoJy8nKSBhcyBbc3RyaW5nLCAuLi5zdHJpbmdbXV07XG4gIHRyeSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxQYXJ0cy5qb2luKCcvJyk7IC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBtb2RlbCBuYW1lIGl0c2VsZiBjb250YWlucyAnLydcbiAgICBpZiAoIW1vZGVsTmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCAke3Byb3ZpZGVyfSBtb2RlbCBmb3JtYXQ6ICR7bW9kZWx9LiBFeHBlY3RlZCBmb3JtYXQ6ICR7cHJvdmlkZXJ9L21vZGVsLW5hbWVgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGxhbWFCYXNlVVJMID0gYCR7cHJvY2Vzcy5lbnYuT0xMQU1BX0JBU0VfVVJMIHx8ICdodHRwOi8vbG9jYWxob3N0OjExNDM0J30vYXBpYDtcbiAgICBjb25zdCBvbGxhbWEgPSBjcmVhdGVPbGxhbWEoe1xuICAgICAgYmFzZVVSTDogb2xsYW1hQmFzZVVSTCxcbiAgICAgIC4uLihwcm9jZXNzLmVudi5PTExBTUFfQVBJX0tFWSAmJiB7IGFwaUtleTogcHJvY2Vzcy5lbnYuT0xMQU1BX0FQSV9LRVkgfSksXG4gICAgfSk7XG4gICAgY29uc3QgcHJvdmlkZXJNb2RlbCA9IG9sbGFtYShtb2RlbE5hbWUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBwcm92aWRlck1vZGVsLFxuICAgICAgcHJvdmlkZXJPcHRpb25zOiByZWFzb25pbmdFZmZvcnQgPyB7IG9sbGFtYTogeyB0aGluazogdHJ1ZSB9IH0gOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlczogY29udmVydFRvVjRNZXNzYWdlcyhtZXNzYWdlcyksXG4gICAgfSk7XG4gICAgbG9nUmVzdWx0KG1vZGVsLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke3Byb3ZpZGVyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvdmlkZXIuc2xpY2UoMSl9IEFQSSBlcnJvciBmb3IgbW9kZWwgJHttb2RlbH06YCwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgQUkgU0RLIHY1IE1vZGVsTWVzc2FnZVtdIHRvIEFJIFNESyB2NCBNZXNzYWdlW10gZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb1Y0TWVzc2FnZXMobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogTWVzc2FnZVtdIHtcbiAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobXNnLCBpbmRleCkgPT4gKHtcbiAgICBpZDogYG1zZy0ke2luZGV4fWAsXG4gICAgcm9sZTogbXNnLnJvbGUgPT09ICd0b29sJyA/ICdkYXRhJyA6IG1zZy5yb2xlLFxuICAgIGNvbnRlbnQ6IHR5cGVvZiBtc2cuY29udGVudCA9PT0gJ3N0cmluZycgPyBtc2cuY29udGVudCA6IEpTT04uc3RyaW5naWZ5KG1zZy5jb250ZW50KSxcbiAgfSkpO1xufVxuIiwiLyoqXG4gKiBgYmxvY2tRdW90ZTogJ2xpdGVyYWwnYDogVXNlIGEgcGlwZSAoYHByb3A6IHxgKSB0byByZXByZXNlbnQgbXVsdGktbGluZSBzdHJpbmdzLlxuICogYGxpbmVXaWR0aDogMGA6IE5vIGxpbWl0IG9uIHRoZSBsaW5lIHdpZHRoLlxuICovXG5leHBvcnQgY29uc3QgeWFtbFN0cmluZ2lmeU9wdGlvbnMgPSB7IGJsb2NrUXVvdGU6ICdsaXRlcmFsJywgbGluZVdpZHRoOiAwIH0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBjcmVhdGVBbWF6b25CZWRyb2NrIH0gZnJvbSAnQGFpLXNkay9hbWF6b24tYmVkcm9jayc7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY1Byb3ZpZGVyT3B0aW9ucywgY3JlYXRlQW50aHJvcGljIH0gZnJvbSAnQGFpLXNkay9hbnRocm9waWMnO1xuaW1wb3J0IHsgY3JlYXRlQXp1cmUgfSBmcm9tICdAYWktc2RrL2F6dXJlJztcbmltcG9ydCB7IGNyZWF0ZUdvb2dsZUdlbmVyYXRpdmVBSSwgdHlwZSBHb29nbGVHZW5lcmF0aXZlQUlQcm92aWRlck9wdGlvbnMgfSBmcm9tICdAYWktc2RrL2dvb2dsZSc7XG5pbXBvcnQgeyBjcmVhdGVWZXJ0ZXggfSBmcm9tICdAYWktc2RrL2dvb2dsZS12ZXJ0ZXgnO1xuaW1wb3J0IHsgY3JlYXRlT3BlbkFJLCB0eXBlIE9wZW5BSVJlc3BvbnNlc1Byb3ZpZGVyT3B0aW9ucyB9IGZyb20gJ0BhaS1zZGsvb3BlbmFpJztcbmltcG9ydCB0eXBlIHsgTGFuZ3VhZ2VNb2RlbFYyIH0gZnJvbSAnQGFpLXNkay9wcm92aWRlcic7XG5pbXBvcnQgeyBjcmVhdGVYYWkgfSBmcm9tICdAYWktc2RrL3hhaSc7XG5pbXBvcnQgeyBjcmVhdGVPcGVuUm91dGVyIH0gZnJvbSAnQG9wZW5yb3V0ZXIvYWktc2RrLXByb3ZpZGVyJztcbmltcG9ydCB7IGdlbmVyYXRlVGV4dCwgdHlwZSBNb2RlbE1lc3NhZ2UgfSBmcm9tICdhaSc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCB7IGNhbGxWNFByb3ZpZGVyQXBpIH0gZnJvbSAnLi9sbG12NC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ0VmZm9ydCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgeWFtbFN0cmluZ2lmeU9wdGlvbnMgfSBmcm9tICcuL3lhbWwuanMnO1xuXG4vKipcbiAqIENhbGwgTExNIEFQSSB1c2luZyBBSSBTREsgNVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbExsbUFwaShcbiAgbW9kZWw6IHN0cmluZyxcbiAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdLFxuICByZWFzb25pbmdFZmZvcnQ/OiBSZWFzb25pbmdFZmZvcnRcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgT2xsYW1hIHVzaW5nIEFJIFNESyB2NFxuICAgIGlmIChtb2RlbC5zdGFydHNXaXRoKCdvbGxhbWEvJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsVjRQcm92aWRlckFwaShtb2RlbCwgbWVzc2FnZXMsIHJlYXNvbmluZ0VmZm9ydCk7XG4gICAgfVxuXG4gICAgY29uc3QgW21vZGVsSW5zdGFuY2UsIHByb3ZpZGVyLCBtb2RlbE5hbWVdID0gZ2V0TW9kZWxJbnN0YW5jZShtb2RlbCwgcmVhc29uaW5nRWZmb3J0KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnNcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zOiBQYXJhbWV0ZXJzPHR5cGVvZiBnZW5lcmF0ZVRleHQ+WzBdID0ge1xuICAgICAgbW9kZWw6IG1vZGVsSW5zdGFuY2UsXG4gICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgfTtcblxuICAgIGlmIChyZWFzb25pbmdFZmZvcnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBtb2RlbCBzdXBwb3J0cyByZWFzb25pbmcvdGhpbmtpbmcgb3B0aW9uc1xuICAgICAgY29uc3QgbW9kZWxTdXBwb3J0c1JlYXNvbmluZyA9IHN1cHBvcnRzUmVhc29uaW5nT3B0aW9ucyhwcm92aWRlciwgbW9kZWxOYW1lKTtcblxuICAgICAgaWYgKCFtb2RlbFN1cHBvcnRzUmVhc29uaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgTW9kZWwgJHttb2RlbH0gZG9lcyBub3Qgc3VwcG9ydCByZWFzb25pbmcvdGhpbmtpbmcgb3B0aW9ucy4gSWdub3JpbmcgcmVhc29uaW5nIGVmZm9ydCBwYXJhbWV0ZXIuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGhpbmtpbmdCdWRnZXQgPSBnZXRUaGlua2luZ0J1ZGdldChyZWFzb25pbmdFZmZvcnQpO1xuICAgICAgICBpZiAocHJvdmlkZXIgPT09ICdvcGVuYWknKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcGVuYWk6IHtcbiAgICAgICAgICAgICAgcmVhc29uaW5nRWZmb3J0LFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgT3BlbkFJUmVzcG9uc2VzUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgPT09ICdhbnRocm9waWMnKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbnRocm9waWM6IHtcbiAgICAgICAgICAgICAgdGhpbmtpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZW5hYmxlZCcsXG4gICAgICAgICAgICAgICAgYnVkZ2V0VG9rZW5zOiB0aGlua2luZ0J1ZGdldCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFudGhyb3BpY1Byb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyID09PSAnZ2VtaW5pJykge1xuICAgICAgICAgIHJlcXVlc3RQYXJhbXMucHJvdmlkZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgZ29vZ2xlOiB7XG4gICAgICAgICAgICAgIHRoaW5raW5nQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgdGhpbmtpbmdCdWRnZXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBHb29nbGVHZW5lcmF0aXZlQUlQcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm92aWRlciA9PT0gJ2JlZHJvY2snKSB7XG4gICAgICAgICAgLy8gVGhlIGxhdGVzdCBBSSBTREsgZG9lc24ndCB3b3JrIG9uIEJlZHJvY2sgd2l0aCByZWFzb25pbmcuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYE5vdGU6IFRoZSBjdXJyZW50IEFJIFNESyBkb2Vzbid0IHdvcmsgb24gQmVkcm9jayB3aXRoIHJlYXNvbmluZy4gTW9kZWwgJHttb2RlbE5hbWV9IHdpbGwgdXNlIGRlZmF1bHQgcmVhc29uaW5nIHNldHRpbmdzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHJlcXVlc3RQYXJhbXMucHJvdmlkZXJPcHRpb25zID0ge1xuICAgICAgICAgIC8vICAgYmVkcm9jazoge1xuICAgICAgICAgIC8vICAgICByZWFzb25pbmdDb25maWc6IHsgdHlwZTogJ2VuYWJsZWQnLCBidWRnZXRUb2tlbnM6IHRoaW5raW5nQnVkZ2V0IH0sXG4gICAgICAgICAgLy8gICB9IHNhdGlzZmllcyBCZWRyb2NrUHJvdmlkZXJPcHRpb25zLFxuICAgICAgICAgIC8vIH07XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgPT09ICd4YWknKSB7XG4gICAgICAgICAgcmVxdWVzdFBhcmFtcy5wcm92aWRlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICB4YWk6IHtcbiAgICAgICAgICAgICAgcmVhc29uaW5nRWZmb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHJlcXVlc3RQYXJhbXMpO1xuICAgIGxvZ1Jlc3VsdChtb2RlbCwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBMTE0gQVBJIGVycm9yIGZvciBtb2RlbCAke21vZGVsfTpgLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogTG9nIHRoZSByZXN1bHQgb2YgYW4gTExNIEFQSSBjYWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dSZXN1bHQobW9kZWw6IHN0cmluZywgcmVzdWx0OiB7IHRleHQ6IHN0cmluZzsgdXNhZ2U/OiB1bmtub3duOyBmaW5pc2hSZWFzb24/OiBzdHJpbmcgfSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgYCR7bW9kZWx9OmAsXG4gICAgWUFNTC5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgICB1c2FnZTogcmVzdWx0LnVzYWdlLFxuICAgICAgICBmaW5pc2hSZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gICAgICB9LFxuICAgICAgeWFtbFN0cmluZ2lmeU9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsSW5zdGFuY2UobW9kZWw6IHN0cmluZywgcmVhc29uaW5nRWZmb3J0PzogUmVhc29uaW5nRWZmb3J0KTogW0xhbmd1YWdlTW9kZWxWMiwgc3RyaW5nLCBzdHJpbmddIHtcbiAgLy8gT25seSBzdXBwb3J0IGxsbWxpdGUgZm9ybWF0IChwcm92aWRlci9tb2RlbClcbiAgaWYgKCFtb2RlbC5pbmNsdWRlcygnLycpKSB7XG4gICAgY29uc29sZS5lcnJvcihgTW9kZWwgbXVzdCBiZSBpbiBmb3JtYXQgJ3Byb3ZpZGVyL21vZGVsJy4gR290OiAke21vZGVsfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgLi4ubW9kZWxQYXJ0c10gPSBtb2RlbC5zcGxpdCgnLycpO1xuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbFBhcnRzLmpvaW4oJy8nKTsgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIG1vZGVsIG5hbWUgaXRzZWxmIGNvbnRhaW5zICcvJ1xuXG4gIHN3aXRjaCAocHJvdmlkZXIpIHtcbiAgICBjYXNlICdvcGVuYWknOiB7XG4gICAgICAvLyBjZi4gaHR0cHM6Ly9haS1zZGsuZGV2L3Byb3ZpZGVycy9haS1zZGstcHJvdmlkZXJzL29wZW5haVxuICAgICAgY29uc3Qgb3BlbmFpUHJvdmlkZXIgPSBjcmVhdGVPcGVuQUkoKTtcbiAgICAgIHJldHVybiBbb3BlbmFpUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnYW50aHJvcGljJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy9hbnRocm9waWNcbiAgICAgIGNvbnN0IGFudGhyb3BpY1Byb3ZpZGVyID0gY3JlYXRlQW50aHJvcGljKCk7XG4gICAgICByZXR1cm4gW2FudGhyb3BpY1Byb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ2dlbWluaSc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvZ29vZ2xlLWdlbmVyYXRpdmUtYWlcbiAgICAgIGNvbnN0IGdvb2dsZVByb3ZpZGVyID0gY3JlYXRlR29vZ2xlR2VuZXJhdGl2ZUFJKCk7XG4gICAgICByZXR1cm4gW2dvb2dsZVByb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ2F6dXJlJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy9henVyZVxuICAgICAgY29uc3QgYXp1cmVQcm92aWRlciA9IGNyZWF0ZUF6dXJlKCk7XG4gICAgICByZXR1cm4gW2F6dXJlUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnYmVkcm9jayc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvYW1hem9uLWJlZHJvY2tcbiAgICAgIGNvbnN0IGJlZHJvY2tQcm92aWRlciA9IGNyZWF0ZUFtYXpvbkJlZHJvY2soKTtcbiAgICAgIHJldHVybiBbYmVkcm9ja1Byb3ZpZGVyKG1vZGVsTmFtZSksIHByb3ZpZGVyLCBtb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGNhc2UgJ3ZlcnRleCc6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2FpLXNkay5kZXYvcHJvdmlkZXJzL2FpLXNkay1wcm92aWRlcnMvZ29vZ2xlLXZlcnRleFxuICAgICAgY29uc3QgdmVydGV4UHJvdmlkZXIgPSBjcmVhdGVWZXJ0ZXgoKTtcbiAgICAgIHJldHVybiBbdmVydGV4UHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAneGFpJzoge1xuICAgICAgLy8gY2YuIGh0dHBzOi8vYWktc2RrLmRldi9wcm92aWRlcnMvYWktc2RrLXByb3ZpZGVycy94YWlcbiAgICAgIGNvbnN0IGdyb2tQcm92aWRlciA9IGNyZWF0ZVhhaSgpO1xuICAgICAgcmV0dXJuIFtncm9rUHJvdmlkZXIobW9kZWxOYW1lKSwgcHJvdmlkZXIsIG1vZGVsTmFtZV07XG4gICAgfVxuXG4gICAgY2FzZSAnb3BlbnJvdXRlcic6IHtcbiAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vT3BlblJvdXRlclRlYW0vYWktc2RrLXByb3ZpZGVyXG4gICAgICBjb25zdCBvcGVucm91dGVyUHJvdmlkZXIgPSBjcmVhdGVPcGVuUm91dGVyKHtcbiAgICAgICAgYXBpS2V5OiBwcm9jZXNzLmVudi5PUEVOUk9VVEVSX0FQSV9LRVksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnSFRUUC1SZWZlcmVyJzogJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9nZW4tcHInLFxuICAgICAgICAgICdYLVRpdGxlJzogJ2dlbi1wcicsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1vZGVsT3B0aW9ucyA9IHJlYXNvbmluZ0VmZm9ydFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJlYXNvbmluZzoge1xuICAgICAgICAgICAgICBlZmZvcnQ6IHJlYXNvbmluZ0VmZm9ydCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9O1xuICAgICAgcmV0dXJuIFtvcGVucm91dGVyUHJvdmlkZXIobW9kZWxOYW1lLCBtb2RlbE9wdGlvbnMpLCBwcm92aWRlciwgbW9kZWxOYW1lXTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIHByb3ZpZGVyOiAke3Byb3ZpZGVyfS4gU3VwcG9ydGVkIHByb3ZpZGVyczogb3BlbmFpLCBhenVyZSwgZ29vZ2xlLCBhbnRocm9waWMsIGJlZHJvY2ssIHZlcnRleCwgZ3Jvaywgb3BlbnJvdXRlciwgb2xsYW1hYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgbW9kZWwgc3VwcG9ydHMgcmVhc29uaW5nL3RoaW5raW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVhc29uaW5nT3B0aW9ucyhwcm92aWRlcjogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHByb3ZpZGVyKSB7XG4gICAgY2FzZSAnb3BlbmFpJzpcbiAgICBjYXNlICdhenVyZSc6XG4gICAgICAvLyBPcGVuQUkgYW5kIEF6dXJlOiBvbmx5IG8xLCBvMywgbzQgc2VyaWVzIG1vZGVscyBzdXBwb3J0IHJlYXNvbmluZyBlZmZvcnRcbiAgICAgIHJldHVybiAvXihvMXxvM3xvNCkvLnRlc3QobW9kZWxOYW1lKTtcblxuICAgIGNhc2UgJ2FudGhyb3BpYyc6XG4gICAgICAvLyBBbnRocm9waWM6IG9ubHkgQ2xhdWRlIDMuNyBhbmQgQ2xhdWRlIDQgbW9kZWxzIHN1cHBvcnQgdGhpbmtpbmcgYnVkZ2V0XG4gICAgICByZXR1cm4gL15jbGF1ZGUtKG9wdXMtNHxzb25uZXQtNHwzLTctc29ubmV0KS8udGVzdChtb2RlbE5hbWUpO1xuXG4gICAgY2FzZSAnZ2VtaW5pJzpcbiAgICAgIC8vIEdvb2dsZTogb25seSBHZW1pbmkgMi41IG1vZGVscyBzdXBwb3J0IHRoaW5raW5nIGJ1ZGdldFxuICAgICAgcmV0dXJuIC9eZ2VtaW5pLTJcXC41Ly50ZXN0KG1vZGVsTmFtZSk7XG5cbiAgICBjYXNlICdiZWRyb2NrJzpcbiAgICAgIC8vIEJlZHJvY2s6IG9ubHkgQW50aHJvcGljIENsYXVkZSAzLjcgYW5kIDQgbW9kZWxzIHN1cHBvcnQgcmVhc29uaW5nXG4gICAgICByZXR1cm4gL14odXNcXC4pP2FudGhyb3BpY1xcLmNsYXVkZS0ob3B1cy00fHNvbm5ldC00fDMtNy1zb25uZXQpLy50ZXN0KG1vZGVsTmFtZSk7XG5cbiAgICBjYXNlICd2ZXJ0ZXgnOlxuICAgICAgLy8gVmVydGV4OiBHZW1pbmkgMi41IG1vZGVscyBhbmQgQ2xhdWRlIDMuNy80IG1vZGVscyBzdXBwb3J0IHRoaW5raW5nIGJ1ZGdldFxuICAgICAgcmV0dXJuIC9eZ2VtaW5pLTJcXC41Ly50ZXN0KG1vZGVsTmFtZSkgfHwgL15jbGF1ZGUtKDMtNy1zb25uZXR8b3B1cy00fHNvbm5ldC00KS8udGVzdChtb2RlbE5hbWUpO1xuXG4gICAgY2FzZSAneGFpJzpcbiAgICAgIC8vIEdyb2s6IEdyb2sgMyBtb2RlbHMgc3VwcG9ydCByZWFzb25pbmcgZWZmb3J0XG4gICAgICByZXR1cm4gL15ncm9rLTMvLnRlc3QobW9kZWxOYW1lKTtcblxuICAgIC8vIFdlIGNhbiBhbHdheXMgcGFzcyByZWFzb25pbmdFZmZvcnQgdG8gT3BlblJvdXRlciB3aXRob3V0IGVycm9ycy5cbiAgICBjYXNlICdvcGVucm91dGVyJzpcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGlua2luZyBidWRnZXQgdG9rZW4gY291bnQgYmFzZWQgb24gcmVhc29uaW5nIGVmZm9ydCBsZXZlbFxuICovXG5mdW5jdGlvbiBnZXRUaGlua2luZ0J1ZGdldChyZWFzb25pbmdFZmZvcnQ6IFJlYXNvbmluZ0VmZm9ydCk6IG51bWJlciB7XG4gIGNvbnN0IHRva2VuQnVkZ2V0cyA9IHtcbiAgICBsb3c6IDQwMDAsIC8vIDRLIHRva2Vuc1xuICAgIG1lZGl1bTogODAwMCwgLy8gOEsgdG9rZW5zXG4gICAgaGlnaDogMjQwMDAsIC8vIDI0SyB0b2tlbnNcbiAgfTtcblxuICByZXR1cm4gdG9rZW5CdWRnZXRzW3JlYXNvbmluZ0VmZm9ydF07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgWUFNTCBmcm9tICd5YW1sJztcbmltcG9ydCB7IERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTIH0gZnJvbSAnLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjYWxsTGxtQXBpIH0gZnJvbSAnLi9sbG0uanMnO1xuaW1wb3J0IHsgZXh0cmFjdEhlYWRlckNvbnRlbnRzLCBmaW5kRGlzdGluY3RGZW5jZSwgdHJpbUNvZGVCbG9ja0ZlbmNlcyB9IGZyb20gJy4vbWFya2Rvd24uanMnO1xuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3MsIHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyB5YW1sU3RyaW5naWZ5T3B0aW9ucyB9IGZyb20gJy4veWFtbC5qcyc7XG5cbmNvbnN0IFJFUE9NSVhfRklMRV9OQU1FID0gJ3JlcG9taXgucmVzdWx0JztcblxuZXhwb3J0IHR5cGUgUmVzb2x1dGlvblBsYW4gPSB7XG4gIHBsYW4/OiBzdHJpbmc7XG4gIGNvbW1pdE1lc3NhZ2U/OiBzdHJpbmc7XG4gIGZpbGVQYXRoczogc3RyaW5nW107XG59O1xuXG5jb25zdCBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUQgPSAnIyMgRmlsZSBQYXRocyB0byBiZSBNb2RpZmllZCc7XG5jb25zdCBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfUkVGRVJSRUQgPSAnIyMgRmlsZSBQYXRocyB0byBiZSBSZWZlcnJlZCc7XG5jb25zdCBIRUFESU5HX09GX1BMQU4gPSAnIyMgSW1wbGVtZW50YXRpb24gUGxhbic7XG5jb25zdCBIRUFESU5HX09GX0NPTU1JVF9NRVNTQUdFID0gJyMjIENvbW1pdCBNZXNzYWdlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYW5Db2RlQ2hhbmdlcyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgaXNzdWVDb250ZW50OiBzdHJpbmcsXG4gIHR3b1N0YWdlUGxhbm5pbmc6IGJvb2xlYW4sXG4gIHJlYXNvbmluZ0VmZm9ydD86IFJlYXNvbmluZ0VmZm9ydCxcbiAgcmVwb21peEV4dHJhQXJncz86IHN0cmluZyxcbiAgaXNQdWxsUmVxdWVzdCA9IGZhbHNlXG4pOiBQcm9taXNlPFJlc29sdXRpb25QbGFuPiB7XG4gIGNvbnN0IGlzc3VlRmVuY2UgPSBmaW5kRGlzdGluY3RGZW5jZShpc3N1ZUNvbnRlbnQsICd+Jyk7XG4gIGNvbnN0IGlzc3VlWWFtbFRleHQgPSBgJHtpc3N1ZUZlbmNlfXlhbWxcbiR7WUFNTC5zdHJpbmdpZnkoaXNzdWVDb250ZW50LCB5YW1sU3RyaW5naWZ5T3B0aW9ucykudHJpbSgpfVxuJHtpc3N1ZUZlbmNlfWA7XG5cbiAgLy8gQmFzZSByZXBvbWl4IGNvbW1hbmQgYXJndW1lbnRzXG4gIGNvbnN0IHJlcG9taXhBcmdzID0gWyctLXllcycsICdyZXBvbWl4QGxhdGVzdCcsICctLW91dHB1dCcsIFJFUE9NSVhfRklMRV9OQU1FXTtcbiAgcmVwb21peEFyZ3MucHVzaCguLi5wYXJzZUNvbW1hbmRMaW5lQXJncyhyZXBvbWl4RXh0cmFBcmdzIHx8IERFRkFVTFRfUkVQT01JWF9FWFRSQV9BUkdTKSk7XG5cbiAgYXdhaXQgcnVuQ29tbWFuZCgnbnB4JywgcmVwb21peEFyZ3MpO1xuICBjb25zdCByZXBvbWl4UmVzdWx0ID0gZnMucmVhZEZpbGVTeW5jKFJFUE9NSVhfRklMRV9OQU1FLCAndXRmOCcpO1xuICB2b2lkIGZzLnByb21pc2VzLnJtKFJFUE9NSVhfRklMRV9OQU1FLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICh0d29TdGFnZVBsYW5uaW5nKSB7XG4gICAgY29uc29sZS5pbmZvKGBTZWxlY3RpbmcgZmlsZXMgd2l0aCAke21vZGVsfSAocmVhc29uaW5nIGVmZm9ydDogJHtyZWFzb25pbmdFZmZvcnR9KSAuLi5gKTtcbiAgICBjb25zdCBmaWxlc1Jlc3BvbnNlID0gYXdhaXQgY2FsbExsbUFwaShcbiAgICAgIG1vZGVsLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgICAgY29udGVudDogYnVpbGRQcm9tcHRGb3JTZWxlY3RpbmdGaWxlcyhpc3N1ZVlhbWxUZXh0LCBpc1B1bGxSZXF1ZXN0KS50cmltKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgY29udGVudDogcmVwb21peFJlc3VsdCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWFzb25pbmdFZmZvcnRcbiAgICApO1xuICAgIGNvbnNvbGUuaW5mbygnU2VsZWN0aW5nIGNvbXBsZXRlIScpO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkRmlsZVBhdGhMaXN0cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKGZpbGVzUmVzcG9uc2UpLCBbXG4gICAgICBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUQsXG4gICAgICBIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfUkVGRVJSRUQsXG4gICAgXSkgYXMgW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWV4dHJhY3RlZEZpbGVQYXRoTGlzdHMpIHtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoczogW10gfTtcbiAgICB9XG4gICAgY29uc3QgW2ZpbGVQYXRoc1RvQmVNb2RpZmllZCwgZmlsZVBhdGhzVG9CZVJlZmVycmVkXSA9IGV4dHJhY3RlZEZpbGVQYXRoTGlzdHMubWFwKChmaWxlc0NvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGhSZWdleCA9IC9cXEItXFxzKmA/KFteYFxcbl0rKWA/L2c7XG4gICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmZpbGVzQ29udGVudC5tYXRjaEFsbChmaWxlUGF0aFJlZ2V4KV07XG4gICAgICByZXR1cm4gbWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXT8udHJpbSgpID8/ICcnKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfSkgYXMgW3N0cmluZ1tdLCBzdHJpbmdbXV07XG5cbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBbLi4uZmlsZVBhdGhzVG9CZU1vZGlmaWVkLCAuLi5maWxlUGF0aHNUb0JlUmVmZXJyZWRdXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykudHJpbSgpIDogJyc7XG4gICAgICAgIGNvbnN0IGZlbmNlID0gZmluZERpc3RpbmN0RmVuY2UoY29udGVudCwgJ34nKTtcbiAgICAgICAgcmV0dXJuIGAjIyBcXGAke2ZpbGVQYXRofVxcYFxuXG4ke2ZlbmNlfVxuJHtjb250ZW50fVxuJHtmZW5jZX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG5cXG4nKTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUGxhbm5pbmcgY29kZSBjaGFuZ2VzIHdpdGggJHttb2RlbH0gKHJlYXNvbmluZyBlZmZvcnQ6ICR7cmVhc29uaW5nRWZmb3J0fSkgLi4uYCk7XG4gICAgY29uc3QgcGxhblJlc3BvbnNlID0gYXdhaXQgY2FsbExsbUFwaShcbiAgICAgIG1vZGVsLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgICAgY29udGVudDogYnVpbGRQcm9tcHRGb3JQbGFubmluZ0NvZGVDaGFuZ2VzKGlzc3VlWWFtbFRleHQsIGlzUHVsbFJlcXVlc3QpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgICAgIGNvbnRlbnQ6IGZpbGVDb250ZW50cyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWFzb25pbmdFZmZvcnRcbiAgICApO1xuICAgIGNvbnNvbGUuaW5mbygnUGxhbm5pbmcgY29tcGxldGUhJyk7XG5cbiAgICBjb25zdCBleHRyYWN0ZWRDb250ZW50cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKHBsYW5SZXNwb25zZSksIFtcbiAgICAgIEhFQURJTkdfT0ZfQ09NTUlUX01FU1NBR0UsXG4gICAgICBIRUFESU5HX09GX1BMQU4sXG4gICAgXSk7XG4gICAgaWYgKCFleHRyYWN0ZWRDb250ZW50cykge1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGhzOiBmaWxlUGF0aHNUb0JlTW9kaWZpZWQgfTtcbiAgICB9XG4gICAgY29uc3QgW2NvbW1pdE1lc3NhZ2UsIHBsYW5dID0gZXh0cmFjdGVkQ29udGVudHM7XG4gICAgcmV0dXJuIHsgcGxhbiwgY29tbWl0TWVzc2FnZTogY29tbWl0TWVzc2FnZT8udHJpbSgpLCBmaWxlUGF0aHM6IGZpbGVQYXRoc1RvQmVNb2RpZmllZCB9O1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgUGxhbm5pbmcgY29kZSBjaGFuZ2VzIHdpdGggJHttb2RlbH0gKHJlYXNvbmluZyBlZmZvcnQ6ICR7cmVhc29uaW5nRWZmb3J0fSkgLi4uYCk7XG4gIGNvbnN0IGZpbGVzUmVzcG9uc2UgPSBhd2FpdCBjYWxsTGxtQXBpKFxuICAgIG1vZGVsLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgcm9sZTogJ3N5c3RlbScsXG4gICAgICAgIGNvbnRlbnQ6IGJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXNBbmRQbGFubmluZ0NvZGVDaGFuZ2VzKGlzc3VlWWFtbFRleHQsIGlzUHVsbFJlcXVlc3QpLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgY29udGVudDogcmVwb21peFJlc3VsdCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICByZWFzb25pbmdFZmZvcnRcbiAgKTtcbiAgY29uc29sZS5pbmZvKCdQbGFubmluZyBjb21wbGV0ZSEnKTtcblxuICBjb25zdCBleHRyYWN0ZWRDb250ZW50cyA9IGV4dHJhY3RIZWFkZXJDb250ZW50cyh0cmltQ29kZUJsb2NrRmVuY2VzKGZpbGVzUmVzcG9uc2UpLCBbXG4gICAgSEVBRElOR19PRl9DT01NSVRfTUVTU0FHRSxcbiAgICBIRUFESU5HX09GX1BMQU4sXG4gICAgSEVBRElOR19PRl9GSUxFX1BBVEhTX1RPX0JFX01PRElGSUVELFxuICBdKTtcbiAgaWYgKCFleHRyYWN0ZWRDb250ZW50cykge1xuICAgIHJldHVybiB7IGZpbGVQYXRoczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IFtjb21taXRNZXNzYWdlLCBwbGFuLCBmaWxlUGF0aHNUZXh0XSA9IGV4dHJhY3RlZENvbnRlbnRzO1xuXG4gIGNvbnN0IGZpbGVQYXRoUmVnZXggPSAvXFxCLVxccypgPyhbXmBcXG5dKylgPy9nO1xuICBjb25zdCBtYXRjaGVzID0gWy4uLihmaWxlUGF0aHNUZXh0ID8/ICcnKS5tYXRjaEFsbChmaWxlUGF0aFJlZ2V4KV07XG4gIGNvbnN0IGZpbGVQYXRoc1RvQmVNb2RpZmllZCA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0/LnRyaW0oKSA/PyAnJykuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4geyBwbGFuLCBjb21taXRNZXNzYWdlOiBjb21taXRNZXNzYWdlPy50cmltKCksIGZpbGVQYXRoczogZmlsZVBhdGhzVG9CZU1vZGlmaWVkIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXMoaXNzdWVZYW1sVGV4dDogc3RyaW5nLCBpc1B1bGxSZXF1ZXN0ID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBpdGVtVHlwZSA9IGlzUHVsbFJlcXVlc3QgPyAncHVsbCByZXF1ZXN0JyA6ICdpc3N1ZSc7XG4gIGNvbnN0IGV4dHJhSW5zdHJ1Y3Rpb24gPSBpc1B1bGxSZXF1ZXN0ID8gJyBDb25zaWRlciB0aGUgY29tbWVudHMgb24gdGhlIHB1bGwgcmVxdWVzdCB3aGVuIGlkZW50aWZ5aW5nIGZpbGVzLicgOiAnJztcbiAgcmV0dXJuIGBcbllvdSBhcmUgYW4gZXhwZXJ0IHNvZnR3YXJlIGRldmVsb3BlciB0YXNrZWQgd2l0aCBhbmFseXppbmcgR2l0SHViICR7aXRlbVR5cGV9cyBhbmQgaWRlbnRpZnlpbmcgcmVsZXZhbnQgZmlsZXMgZm9yIGNvZGUgY2hhbmdlcy5cblxuUmV2aWV3IHRoZSBmb2xsb3dpbmcgR2l0SHViICR7aXRlbVR5cGV9IGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZmlsZSBwYXRocyBhbmQgdGhlaXIgY29udGVudHMgKHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaW4gYSBzZXBhcmF0ZSBtZXNzYWdlKS4ke2V4dHJhSW5zdHJ1Y3Rpb259XG5Zb3VyIHRhc2sgaXMgdG8gaWRlbnRpZnk6XG4xLiBGaWxlcyB0aGF0IG5lZWQgdG8gYmUgTU9ESUZJRUQgdG8gcmVzb2x2ZSB0aGUgJHtpdGVtVHlwZX1cbjIuIEZpbGVzIHRoYXQgc2hvdWxkIGJlIFJFRkVSUkVEIHRvIChidXQgbm90IG1vZGlmaWVkKSB0byB1bmRlcnN0YW5kIHRoZSBjb2RlYmFzZSBiZXR0ZXJcblxuR2l0SHViICR7aXNQdWxsUmVxdWVzdCA/ICdQdWxsIFJlcXVlc3QnIDogJ0lzc3VlJ306XG4ke2lzc3VlWWFtbFRleHR9XG5cblBsZWFzZSBmb3JtYXQgeW91ciByZXNwb25zZSB3aXRob3V0IGFueSBleHBsYW5hdG9yeSB0ZXh0IGFzIGZvbGxvd3M6XG5cXGBcXGBcXGBtZFxuJHtIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUR9XG5cbi0gXFxgW2ZpbGVQYXRoMV1cXGBcbi0gXFxgW2ZpbGVQYXRoMl1cXGBcbi0gLi4uXG5cbiR7SEVBRElOR19PRl9GSUxFX1BBVEhTX1RPX0JFX1JFRkVSUkVEfVxuXG4tIFxcYFtmaWxlUGF0aDFdXFxgXG4tIFxcYFtmaWxlUGF0aDJdXFxgXG4tIC4uLlxuXFxgXFxgXFxgXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdEZvclBsYW5uaW5nQ29kZUNoYW5nZXMoaXNzdWVZYW1sVGV4dDogc3RyaW5nLCBpc1B1bGxSZXF1ZXN0ID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBpdGVtVHlwZSA9IGlzUHVsbFJlcXVlc3QgPyAncHVsbCByZXF1ZXN0JyA6ICdpc3N1ZSc7XG4gIGNvbnN0IGV4dHJhSW5zdHJ1Y3Rpb24gPSBpc1B1bGxSZXF1ZXN0ID8gJyBDb25zaWRlciB0aGUgY29tbWVudHMgb24gdGhlIHB1bGwgcmVxdWVzdCB3aGVuIGNyZWF0aW5nIHRoZSBwbGFuLicgOiAnJztcbiAgcmV0dXJuIGBcbllvdSBhcmUgYW4gZXhwZXJ0IHNvZnR3YXJlIGRldmVsb3BlciB0YXNrZWQgd2l0aCBjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBwbGFuIGJhc2VkIG9uIEdpdEh1YiAke2l0ZW1UeXBlfXMuXG5cblJldmlldyB0aGUgZm9sbG93aW5nIEdpdEh1YiAke2l0ZW1UeXBlfSBhbmQgdGhlIHByb3ZpZGVkIGZpbGUgY29udGVudHMgKHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaW4gYSBzZXBhcmF0ZSBtZXNzYWdlKS4ke2V4dHJhSW5zdHJ1Y3Rpb259XG5DcmVhdGUgYSBkZXRhaWxlZCwgc3RlcC1ieS1zdGVwIHBsYW4gb3V0bGluaW5nIGhvdyB0byBhZGRyZXNzIHRoZSAke2l0ZW1UeXBlfSBlZmZlY3RpdmVseS5cbkFsc28sIHByb3ZpZGUgYSBjb25jaXNlIGFuZCBkZXNjcmlwdGl2ZSBjb21taXQgbWVzc2FnZSBmb3IgdGhlIGNoYW5nZXMsIGZvbGxvd2luZyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgc3BlY2lmaWNhdGlvbi5cblxuWW91ciBwbGFuIHNob3VsZDpcbi0gRm9jdXMgb24gaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgZWFjaCBmaWxlIHRoYXQgbmVlZHMgbW9kaWZpY2F0aW9uXG4tIEJlIGNsZWFyIGFuZCBhY3Rpb25hYmxlIGZvciBhIGRldmVsb3BlciB0byBmb2xsb3dcbi0gUHJlZmVyIHNob3dpbmcgZGlmZnMgcmF0aGVyIHRoYW4gY29tcGxldGUgZmlsZSBjb250ZW50cyB3aGVuIGRlc2NyaWJpbmcgY2hhbmdlc1xuLSBFeGNsdWRlIHRlc3RpbmcgcHJvY2VkdXJlcyB1bmxlc3MgdXNlcnMgZXhwbGljaXRseSByZXF1ZXN0XG5cbkdpdEh1YiAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9OlxuJHtpc3N1ZVlhbWxUZXh0fVxuXG5QbGVhc2UgZm9ybWF0IHlvdXIgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZXhwbGFuYXRvcnkgdGV4dCBhcyBmb2xsb3dzOlxuXFxgXFxgXFxgbWRcbiR7SEVBRElOR19PRl9QTEFOfVxuXG4xLiBbU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gc3RlcF1cbjIuIFtOZXh0IGltcGxlbWVudGF0aW9uIHN0ZXBdXG4uLi5cblxuJHtIRUFESU5HX09GX0NPTU1JVF9NRVNTQUdFfVxuXG5bY29tbWl0IG1lc3NhZ2VdXG5cXGBcXGBcXGBcbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdEZvclNlbGVjdGluZ0ZpbGVzQW5kUGxhbm5pbmdDb2RlQ2hhbmdlcyhpc3N1ZVlhbWxUZXh0OiBzdHJpbmcsIGlzUHVsbFJlcXVlc3QgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IGl0ZW1UeXBlID0gaXNQdWxsUmVxdWVzdCA/ICdwdWxsIHJlcXVlc3QnIDogJ2lzc3VlJztcbiAgY29uc3QgZXh0cmFJbnN0cnVjdGlvbiA9IGlzUHVsbFJlcXVlc3QgPyAnIENvbnNpZGVyIHRoZSBjb21tZW50cyBvbiB0aGUgcHVsbCByZXF1ZXN0IHdoZW4gY3JlYXRpbmcgdGhlIHBsYW4uJyA6ICcnO1xuICByZXR1cm4gYFxuWW91IGFyZSBhbiBleHBlcnQgc29mdHdhcmUgZGV2ZWxvcGVyIHRhc2tlZCB3aXRoIGFuYWx5emluZyBHaXRIdWIgJHtpdGVtVHlwZX1zIGFuZCBjcmVhdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBwbGFuLlxuXG5SZXZpZXcgdGhlIGZvbGxvd2luZyBHaXRIdWIgJHtpdGVtVHlwZX0gYW5kIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWxlIHBhdGhzIGFuZCB0aGVpciBjb250ZW50cyAod2hpY2ggd2lsbCBiZSBwcm92aWRlZCBpbiBhIHNlcGFyYXRlIG1lc3NhZ2UpLiR7ZXh0cmFJbnN0cnVjdGlvbn1cbllvdXIgdGFzayBpcyB0bzpcbjEuIENyZWF0ZSBhIGRldGFpbGVkLCBzdGVwLWJ5LXN0ZXAgcGxhbiBvdXRsaW5pbmcgaG93IHRvIHJlc29sdmUgdGhlICR7aXRlbVR5cGV9IGVmZmVjdGl2ZWx5LlxuMi4gSWRlbnRpZnkgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIHJlc29sdmUgdGhlICR7aXRlbVR5cGV9LlxuMy4gUHJvdmlkZSBhIGNvbmNpc2UgYW5kIGRlc2NyaXB0aXZlIGNvbW1pdCBtZXNzYWdlIGZvciB0aGUgY2hhbmdlcywgZm9sbG93aW5nIHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBzcGVjaWZpY2F0aW9uLlxuXG5Zb3VyIHBsYW4gc2hvdWxkOlxuLSBGb2N1cyBvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciBlYWNoIGZpbGUgdGhhdCBuZWVkcyBtb2RpZmljYXRpb25cbi0gQmUgY2xlYXIgYW5kIGFjdGlvbmFibGUgZm9yIGEgZGV2ZWxvcGVyIHRvIGZvbGxvd1xuLSBQcmVmZXIgc2hvd2luZyBkaWZmcyByYXRoZXIgdGhhbiBjb21wbGV0ZSBmaWxlIGNvbnRlbnRzIHdoZW4gZGVzY3JpYmluZyBjaGFuZ2VzXG4tIEV4Y2x1ZGUgdGVzdGluZyBwcm9jZWR1cmVzIGFzIHRob3NlIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5XG5cbkdpdEh1YiAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9OlxuJHtpc3N1ZVlhbWxUZXh0fVxuXG5QbGVhc2UgZm9ybWF0IHlvdXIgcmVzcG9uc2Ugd2l0aG91dCBhbnkgZXhwbGFuYXRvcnkgdGV4dCBhcyBmb2xsb3dzOlxuXFxgXFxgXFxgbWRcbiR7SEVBRElOR19PRl9QTEFOfVxuXG4xLiBbU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gc3RlcF1cbjIuIFtOZXh0IGltcGxlbWVudGF0aW9uIHN0ZXBdXG4uLi5cblxuJHtIRUFESU5HX09GX0ZJTEVfUEFUSFNfVE9fQkVfTU9ESUZJRUR9XG5cbi0gXFxgW2ZpbGVQYXRoMV1cXGBcbi0gXFxgW2ZpbGVQYXRoMl1cXGBcbi0gLi4uXG5cbiR7SEVBRElOR19PRl9DT01NSVRfTUVTU0FHRX1cblxuW2NvbW1pdCBtZXNzYWdlXVxuXFxgXFxgXFxgXG5gO1xufVxuIiwiaW1wb3J0IHsgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTIH0gZnJvbSAnLi4vZGVmYXVsdE9wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYWluT3B0aW9ucyB9IGZyb20gJy4uL21haW4uanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHV0aW9uUGxhbiB9IGZyb20gJy4uL3BsYW4uanMnO1xuXG5pbXBvcnQgeyBwYXJzZUNvbW1hbmRMaW5lQXJncyB9IGZyb20gJy4uL3NwYXduLmpzJztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBBaWRlciBjb21tYW5kXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG1haW4gb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBhaWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBaWRlckFyZ3MoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBhcmdzOiB7IHByb21wdDogc3RyaW5nOyByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuIH1cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYWlkZXJBcmdzID0gW1xuICAgICctLXllcy1hbHdheXMnLFxuICAgICctLW5vLWNoZWNrLXVwZGF0ZScsXG4gICAgJy0tbm8tZ2l0aWdub3JlJyxcbiAgICAnLS1uby1zaG93LW1vZGVsLXdhcm5pbmdzJyxcbiAgICAnLS1uby1zaG93LXJlbGVhc2Utbm90ZXMnLFxuICAgIC4uLnBhcnNlQ29tbWFuZExpbmVBcmdzKG9wdGlvbnMuYWlkZXJFeHRyYUFyZ3MgfHwgREVGQVVMVF9BSURFUl9FWFRSQV9BUkdTKSxcbiAgICAnLS1tZXNzYWdlJyxcbiAgICBhcmdzLnByb21wdCxcbiAgXTtcblxuICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICBhaWRlckFyZ3MucHVzaCgnLS1kcnktcnVuJyk7XG4gIH1cbiAgaWYgKGFyZ3MucmVzb2x1dGlvblBsYW4gJiYgJ2ZpbGVQYXRocycgaW4gYXJncy5yZXNvbHV0aW9uUGxhbikge1xuICAgIGFpZGVyQXJncy5wdXNoKC4uLmFyZ3MucmVzb2x1dGlvblBsYW4uZmlsZVBhdGhzKTtcbiAgfVxuXG4gIHJldHVybiBhaWRlckFyZ3M7XG59XG4iLCJleHBvcnQgY29uc3QgaXNDSSA9IHByb2Nlc3MuZW52LkNJIHx8IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RJT05TO1xuIiwiaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL2NpLmpzJztcbmltcG9ydCB7IERFRkFVTFRfQ0xBVURFX0NPREVfRVhUUkFfQVJHUyB9IGZyb20gJy4uL2RlZmF1bHRPcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgTWFpbk9wdGlvbnMgfSBmcm9tICcuLi9tYWluLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x1dGlvblBsYW4gfSBmcm9tICcuLi9wbGFuLmpzJztcblxuaW1wb3J0IHsgcGFyc2VDb21tYW5kTGluZUFyZ3MgfSBmcm9tICcuLi9zcGF3bi5qcyc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgQ2xhdWRlIENvZGUgY29tbWFuZFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBtYWluIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW5jbHVkZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgQGFudGhyb3BpYy1haS9jbGF1ZGUtY29kZUBsYXRlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xhdWRlQ29kZUFyZ3MoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBhcmdzOiB7IHByb21wdDogc3RyaW5nOyByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuIH1cbik6IHN0cmluZ1tdIHtcbiAgLy8gY2YuIGh0dHBzOi8vZG9jcy5hbnRocm9waWMuY29tL2VuL2RvY3MvY2xhdWRlLWNvZGUvY2xpLXVzYWdlXG4gIGNvbnN0IGJhc2VBcmdzID0gW1xuICAgICctLXllcycsXG4gICAgJ0BhbnRocm9waWMtYWkvY2xhdWRlLWNvZGVAbGF0ZXN0JyxcbiAgICAuLi5wYXJzZUNvbW1hbmRMaW5lQXJncyhvcHRpb25zLmNsYXVkZUNvZGVFeHRyYUFyZ3MgfHwgREVGQVVMVF9DTEFVREVfQ09ERV9FWFRSQV9BUkdTKSxcbiAgICAvLyBCeXBhc3MgYWxsIHBlcm1pc3Npb24gY2hlY2tzXG4gICAgJy0tZGFuZ2Vyb3VzbHktc2tpcC1wZXJtaXNzaW9ucycsXG4gIF07XG4gIGlmIChpc0NJKSB7XG4gICAgYmFzZUFyZ3MucHVzaCgnLS1wcmludCcpO1xuICB9XG4gIGJhc2VBcmdzLnB1c2goYXJncy5wcm9tcHQpO1xuICByZXR1cm4gYmFzZUFyZ3M7XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MgfSBmcm9tICcuLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi4vbWFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi4vcGxhbi5qcyc7XG5cbmltcG9ydCB7IHBhcnNlQ29tbWFuZExpbmVBcmdzIH0gZnJvbSAnLi4vc3Bhd24uanMnO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIENvZGV4IENMSSBjb21tYW5kXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG1haW4gb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBAb3BlbmFpL2NvZGV4QGxhdGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleEFyZ3MoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBhcmdzOiB7IHByb21wdDogc3RyaW5nOyByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuIH1cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS15ZXMnLFxuICAgICdAb3BlbmFpL2NvZGV4QGxhdGVzdCcsXG4gICAgJ2V4ZWMnLFxuICAgIC4uLnBhcnNlQ29tbWFuZExpbmVBcmdzKG9wdGlvbnMuY29kZXhFeHRyYUFyZ3MgfHwgREVGQVVMVF9DT0RFWF9FWFRSQV9BUkdTKSxcbiAgICBhcmdzLnByb21wdCxcbiAgXTtcbn1cbiIsImltcG9ydCB7IERFRkFVTFRfR0VNSU5JX0VYVFJBX0FSR1MgfSBmcm9tICcuLi9kZWZhdWx0T3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi4vbWFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi4vcGxhbi5qcyc7XG5cbmltcG9ydCB7IHBhcnNlQ29tbWFuZExpbmVBcmdzIH0gZnJvbSAnLi4vc3Bhd24uanMnO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEdlbWluaSBDTEkgY29tbWFuZFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBtYWluIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gaW5jbHVkZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgQGdvb2dsZS9nZW1pbmktY2xpQGxhdGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW1pbmlBcmdzKFxuICBvcHRpb25zOiBNYWluT3B0aW9ucyxcbiAgYXJnczogeyBwcm9tcHQ6IHN0cmluZzsgcmVzb2x1dGlvblBsYW4/OiBSZXNvbHV0aW9uUGxhbiB9XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJy0teWVzJyxcbiAgICAnQGdvb2dsZS9nZW1pbmktY2xpQGxhdGVzdCcsXG4gICAgJy0teW9sbycsXG4gICAgLi4ucGFyc2VDb21tYW5kTGluZUFyZ3Mob3B0aW9ucy5nZW1pbmlFeHRyYUFyZ3MgfHwgREVGQVVMVF9HRU1JTklfRVhUUkFfQVJHUyksXG4gICAgJy0tcHJvbXB0JyxcbiAgICBhcmdzLnByb21wdCxcbiAgXTtcbn1cbiIsImltcG9ydCBhbnNpcyBmcm9tICdhbnNpcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi9tYWluLmpzJztcbmltcG9ydCB7IGZpbmREaXN0aW5jdEZlbmNlIH0gZnJvbSAnLi9tYXJrZG93bi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25QbGFuIH0gZnJvbSAnLi9wbGFuLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbWFuZExpbmVBcmdzLCBydW5Db21tYW5kLCBzcGF3bkFzeW5jIH0gZnJvbSAnLi9zcGF3bi5qcyc7XG5pbXBvcnQgeyBidWlsZEFpZGVyQXJncyB9IGZyb20gJy4vdG9vbHMvYWlkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRDbGF1ZGVDb2RlQXJncyB9IGZyb20gJy4vdG9vbHMvY2xhdWRlQ29kZS5qcyc7XG5pbXBvcnQgeyBidWlsZENvZGV4QXJncyB9IGZyb20gJy4vdG9vbHMvY29kZXguanMnO1xuaW1wb3J0IHsgYnVpbGRHZW1pbmlBcmdzIH0gZnJvbSAnLi90b29scy9nZW1pbmkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSZXN1bHQge1xuICBmaXhSZXN1bHQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0QW5kRml4KG9wdGlvbnM6IE1haW5PcHRpb25zLCByZXNvbHV0aW9uUGxhbj86IFJlc29sdXRpb25QbGFuKTogUHJvbWlzZTxUZXN0UmVzdWx0PiB7XG4gIGNvbnN0IFtjb21tYW5kUHJvZ3JhbSwgLi4uY29tbWFuZEFyZ3NdID0gcGFyc2VDb21tYW5kTGluZUFyZ3Mob3B0aW9ucy50ZXN0Q29tbWFuZCB8fCAnJyk7XG4gIGlmICghY29tbWFuZFByb2dyYW0pIHJldHVybiB7IGZpeFJlc3VsdDogJycsIHN1Y2Nlc3M6IHRydWUgfTtcblxuICBjb25zdCBtYXhBdHRlbXB0cyA9IG9wdGlvbnMubWF4VGVzdEF0dGVtcHRzO1xuICBsZXQgYXR0ZW1wdHMgPSAwO1xuICBsZXQgZml4UmVzdWx0ID0gJyc7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG4gIGxldCBsYXN0RXJyb3IgPSAnJztcblxuICB3aGlsZSAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgIGF0dGVtcHRzKys7XG4gICAgY29uc29sZS5pbmZvKGFuc2lzLmN5YW4oYEV4ZWN1dGluZyB0ZXN0IGNvbW1hbmQgKGF0dGVtcHQgJHthdHRlbXB0c30vJHttYXhBdHRlbXB0c30pOiAke29wdGlvbnMudGVzdENvbW1hbmR9YCkpO1xuXG4gICAgY29uc3QgdGVzdFJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZFByb2dyYW0sIGNvbW1hbmRBcmdzLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSk7XG5cbiAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhhbnNpcy5ncmVlbignVGVzdCBjb21tYW5kIHBhc3NlZCBzdWNjZXNzZnVsbHkuJykpO1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYW5zaXMueWVsbG93KGBUZXN0IGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7dGVzdFJlc3VsdC5zdGF0dXN9LmApKTtcblxuICAgIC8vIENhcHR1cmUgdGhlIGVycm9yIGRldGFpbHNcbiAgICBsYXN0RXJyb3IgPSBgVGVzdCBjb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke3Rlc3RSZXN1bHQuc3RhdHVzfVxcblxcblN0ZG91dDpcXG4ke3Rlc3RSZXN1bHQuc3Rkb3V0fVxcblxcblN0ZGVycjpcXG4ke3Rlc3RSZXN1bHQuc3RkZXJyfWA7XG5cbiAgICAvLyBPbmx5IHRyeSB0byBmaXggaWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBtYXhpbXVtIGF0dGVtcHRzXG4gICAgaWYgKGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYW5zaXMueWVsbG93KGBNYXhpbXVtIGZpeCBhdHRlbXB0cyAoJHttYXhBdHRlbXB0c30pIHJlYWNoZWQuIEdpdmluZyB1cC5gKSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBzdGRvdXRGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHRlc3RSZXN1bHQuc3Rkb3V0LCAnficpO1xuICAgIGNvbnN0IHN0ZGVyckZlbmNlID0gZmluZERpc3RpbmN0RmVuY2UodGVzdFJlc3VsdC5zdGRlcnIsICd+Jyk7XG4gICAgY29uc3QgcHJvbXB0ID0gYFxuVGhlIHByZXZpb3VzIGNoYW5nZXMgd2VyZSBhcHBsaWVkLCBidXQgdGhlIHRlc3QgY29tbWFuZCBcXGAke29wdGlvbnMudGVzdENvbW1hbmR9XFxgIGZhaWxlZC5cblxuRXhpdCBjb2RlOiAke3Rlc3RSZXN1bHQuc3RhdHVzfVxuXG5TdGRvdXQ6XG4ke3N0ZG91dEZlbmNlfVxuJHt0ZXN0UmVzdWx0LnN0ZG91dH1cbiR7c3Rkb3V0RmVuY2V9XG5cblN0ZGVycjpcbiR7c3RkZXJyRmVuY2V9XG4ke3Rlc3RSZXN1bHQuc3RkZXJyfVxuJHtzdGRlcnJGZW5jZX1cblxuUGxlYXNlIGFuYWx5emUgdGhlIG91dHB1dCBhbmQgZml4IHRoZSBlcnJvcnMuXG5gLnRyaW0oKTtcblxuICAgIGZpeFJlc3VsdCArPSBhd2FpdCBydW5Ub29sRml4KG9wdGlvbnMsIHByb21wdCwgcmVzb2x1dGlvblBsYW4pO1xuICB9XG5cbiAgcmV0dXJuIHsgZml4UmVzdWx0LCBzdWNjZXNzLCBlcnJvcjogc3VjY2VzcyA/IHVuZGVmaW5lZCA6IGxhc3RFcnJvciB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBydW4gY29kaW5nIHRvb2wgd2l0aCBhIGZpeCBwcm9tcHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRvb2xGaXgoXG4gIG9wdGlvbnM6IE1haW5PcHRpb25zLFxuICBwcm9tcHQ6IHN0cmluZyxcbiAgcmVzb2x1dGlvblBsYW4/OiBSZXNvbHV0aW9uUGxhblxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdG9vbE5hbWUgPVxuICAgIG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2FpZGVyJ1xuICAgICAgPyAnQWlkZXInXG4gICAgICA6IG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2NsYXVkZS1jb2RlJ1xuICAgICAgICA/ICdDbGF1ZGUgQ29kZSdcbiAgICAgICAgOiBvcHRpb25zLmNvZGluZ1Rvb2wgPT09ICdjb2RleC1jbGknXG4gICAgICAgICAgPyAnQ29kZXggQ0xJJ1xuICAgICAgICAgIDogJ0dlbWluaSBDTEknO1xuICBsZXQgYXNzaXN0YW50UmVzdWx0OiBzdHJpbmc7XG5cbiAgaWYgKG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2FpZGVyJykge1xuICAgIGNvbnN0IGFpZGVyQXJncyA9IGJ1aWxkQWlkZXJBcmdzKG9wdGlvbnMsIHsgcHJvbXB0LCByZXNvbHV0aW9uUGxhbiB9KTtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMuY3lhbihgQXNraW5nIEFpZGVyIHRvIGZpeCBcIiR7b3B0aW9ucy50ZXN0Q29tbWFuZH1cIi4uLmApKTtcbiAgICBhc3Npc3RhbnRSZXN1bHQgPSAoXG4gICAgICBhd2FpdCBydW5Db21tYW5kKCdhaWRlcicsIGFpZGVyQXJncywge1xuICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIE5PX0NPTE9SOiAnMScgfSxcbiAgICAgICAgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5zdGRvdXQ7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5jb2RpbmdUb29sID09PSAnY2xhdWRlLWNvZGUnKSB7XG4gICAgY29uc3QgY2xhdWRlQ29kZUFyZ3MgPSBidWlsZENsYXVkZUNvZGVBcmdzKG9wdGlvbnMsIHsgcHJvbXB0LCByZXNvbHV0aW9uUGxhbiB9KTtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMuY3lhbihgQXNraW5nIENsYXVkZSBDb2RlIHRvIGZpeCBcIiR7b3B0aW9ucy50ZXN0Q29tbWFuZH1cIi4uLmApKTtcbiAgICBhc3Npc3RhbnRSZXN1bHQgPSAoXG4gICAgICBhd2FpdCBydW5Db21tYW5kKG9wdGlvbnMubm9kZVJ1bnRpbWUsIGNsYXVkZUNvZGVBcmdzLCB7XG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgTk9fQ09MT1I6ICcxJyB9LFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICBpZ25vcmVFeGl0U3RhdHVzOiB0cnVlLFxuICAgICAgfSlcbiAgICApLnN0ZG91dDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLmNvZGluZ1Rvb2wgPT09ICdjb2RleC1jbGknKSB7XG4gICAgY29uc3QgY29kZXhBcmdzID0gYnVpbGRDb2RleEFyZ3Mob3B0aW9ucywgeyBwcm9tcHQsIHJlc29sdXRpb25QbGFuIH0pO1xuICAgIGNvbnNvbGUuaW5mbyhhbnNpcy5jeWFuKGBBc2tpbmcgQ29kZXggdG8gZml4IFwiJHtvcHRpb25zLnRlc3RDb21tYW5kfVwiLi4uYCkpO1xuICAgIGFzc2lzdGFudFJlc3VsdCA9IChcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQob3B0aW9ucy5ub2RlUnVudGltZSwgY29kZXhBcmdzLCB7XG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgTk9fQ09MT1I6ICcxJyB9LFxuICAgICAgICBpZ25vcmVFeGl0U3RhdHVzOiB0cnVlLFxuICAgICAgfSlcbiAgICApLnN0ZG91dDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBnZW1pbmlBcmdzID0gYnVpbGRHZW1pbmlBcmdzKG9wdGlvbnMsIHsgcHJvbXB0LCByZXNvbHV0aW9uUGxhbiB9KTtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMuY3lhbihgQXNraW5nIEdlbWluaSBDTEkgdG8gZml4IFwiJHtvcHRpb25zLnRlc3RDb21tYW5kfVwiLi4uYCkpO1xuICAgIGFzc2lzdGFudFJlc3VsdCA9IChcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQob3B0aW9ucy5ub2RlUnVudGltZSwgZ2VtaW5pQXJncywge1xuICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIE5PX0NPTE9SOiAnMScgfSxcbiAgICAgICAgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5zdGRvdXQ7XG4gIH1cblxuICByZXR1cm4gYFxcblxcbiMjICR7dG9vbE5hbWV9IGZpeCBhdHRlbXB0IGZvciBcIiR7b3B0aW9ucy50ZXN0Q29tbWFuZH1cIlxcblxcbiR7YXNzaXN0YW50UmVzdWx0LnRyaW0oKX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3bk9wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGFuc2lzIGZyb20gJ2Fuc2lzJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52VmFycyB9IGZyb20gJy4vZW52LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUdpdFVzZXJEZXRhaWxzSWZOZWVkZWQsIGdldEJhc2VCcmFuY2gsIGdldEN1cnJlbnRCcmFuY2gsIGdldEhlYWRlck9mRmlyc3RDb21taXQgfSBmcm9tICcuL2dpdC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVJc3N1ZUluZm8gfSBmcm9tICcuL2lzc3VlLmpzJztcbmltcG9ydCB7IGZpbmREaXN0aW5jdEZlbmNlIH0gZnJvbSAnLi9tYXJrZG93bi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQdWxsUmVxdWVzdCB9IGZyb20gJy4vb2N0b2tpdC5qcyc7XG5pbXBvcnQgeyBwbGFuQ29kZUNoYW5nZXMgfSBmcm9tICcuL3BsYW4uanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZCB9IGZyb20gJy4vc3Bhd24uanMnO1xuaW1wb3J0IHsgdGVzdEFuZEZpeCB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyBIRUFESU5HX09GX0dFTl9QUl9NRVRBREFUQSwgdHJ1bmNhdGVUZXh0IH0gZnJvbSAnLi90ZXh0LmpzJztcbmltcG9ydCB7IGJ1aWxkQWlkZXJBcmdzIH0gZnJvbSAnLi90b29scy9haWRlci5qcyc7XG5pbXBvcnQgeyBidWlsZENsYXVkZUNvZGVBcmdzIH0gZnJvbSAnLi90b29scy9jbGF1ZGVDb2RlLmpzJztcbmltcG9ydCB7IGJ1aWxkQ29kZXhBcmdzIH0gZnJvbSAnLi90b29scy9jb2RleC5qcyc7XG5pbXBvcnQgeyBidWlsZEdlbWluaUFyZ3MgfSBmcm9tICcuL3Rvb2xzL2dlbWluaS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvZGluZ1Rvb2wsIE5vZGVSdW50aW1lQWN0dWFsLCBSZWFzb25pbmdFZmZvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHlhbWxTdHJpbmdpZnlPcHRpb25zIH0gZnJvbSAnLi95YW1sLmpzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgbWFpbiBmdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW5PcHRpb25zIHtcbiAgLyoqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gQWlkZXIgKi9cbiAgYWlkZXJFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIENsYXVkZSBDb2RlICovXG4gIGNsYXVkZUNvZGVFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIENvZGV4IENMSSAqL1xuICBjb2RleEV4dHJhQXJncz86IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gR2VtaW5pIENMSSAqL1xuICBnZW1pbmlFeHRyYUFyZ3M/OiBzdHJpbmc7XG4gIC8qKiBDb2RpbmcgdG9vbCB0byB1c2UgKi9cbiAgY29kaW5nVG9vbDogQ29kaW5nVG9vbDtcbiAgLyoqIEVuYWJsZSB0d28tc3RhZ2VkIHBsYW5uaW5nOiBmaXJzdCBzZWxlY3QgcmVsZXZhbnQgZmlsZXMsIHRoZW4gZ2VuZXJhdGUgZGV0YWlsZWQgaW1wbGVtZW50YXRpb24gcGxhbnMgKi9cbiAgdHdvU3RhZ2VQbGFubmluZzogYm9vbGVhbjtcbiAgLyoqIFJ1biB3aXRob3V0IG1ha2luZyBhY3R1YWwgY2hhbmdlcyAobm8gYnJhbmNoIGNyZWF0aW9uLCBubyBQUikgKi9cbiAgZHJ5UnVuOiBib29sZWFuO1xuICAvKiogRG8gbm90IGNyZWF0ZSBhIG5ldyBicmFuY2gsIGNvbW1pdCBjaGFuZ2VzIGRpcmVjdGx5IHRvIHRoZSBiYXNlIGJyYW5jaCAqL1xuICBub0JyYW5jaDogYm9vbGVhbjtcbiAgLyoqIE5vZGUuanMgcnVudGltZSB0byB1c2UgKGFscmVhZHkgbm9ybWFsaXplZCwgd2l0aG91dCBhbGlhc2VzKSAqL1xuICBub2RlUnVudGltZTogTm9kZVJ1bnRpbWVBY3R1YWw7XG4gIC8qKiBHaXRIdWIgaXNzdWUgbnVtYmVyIHRvIHByb2Nlc3MgKi9cbiAgaXNzdWVOdW1iZXI6IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIGZpeCB0ZXN0IGZhaWx1cmVzICovXG4gIG1heFRlc3RBdHRlbXB0czogbnVtYmVyO1xuICAvKiogTExNIG1vZGVsIHRvIHVzZSBmb3IgcGxhbm5pbmcgY29kZSBjaGFuZ2VzICovXG4gIHBsYW5uaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBMZXZlbCBvZiByZWFzb25pbmcgZWZmb3J0IGZvciB0aGUgTExNICovXG4gIHJlYXNvbmluZ0VmZm9ydD86IFJlYXNvbmluZ0VmZm9ydDtcbiAgLyoqIEV4dHJhIGFyZ3VtZW50cyBmb3IgcmVwb21peCB3aGVuIGdlbmVyYXRpbmcgY29udGV4dCAqL1xuICByZXBvbWl4RXh0cmFBcmdzPzogc3RyaW5nO1xuICAvKiogQ29tbWFuZCB0byBydW4gYWZ0ZXIgY29kaW5nIHRvb2wgYXBwbGllcyBjaGFuZ2VzLiBJZiBpdCBmYWlscywgdGhlIGFzc2lzdGFudCB3aWxsIHRyeSB0byBmaXggaXQuICovXG4gIHRlc3RDb21tYW5kPzogc3RyaW5nO1xuICAvKiogUmVnRXhwIHBhdHRlcm4gdG8gcmVtb3ZlIGZyb20gaXNzdWUgYW5kIFBSIGRlc2NyaXB0aW9ucyAqL1xuICByZW1vdmVQYXR0ZXJuPzogc3RyaW5nO1xufVxuXG5jb25zdCBNQVhfUFJfQk9EWV9MRU5HVEggPSAzMDAwMDsgLy8gR2l0SHViJ3MgbGltaXQgaXMgNjU1MzYsIGxlYXZlIHNvbWUgYnVmZmVyXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IE1haW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbmZpZ3VyZUVudlZhcnMoKTtcblxuICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KCdSdW5uaW5nIGluIGRyeS1ydW4gbW9kZS4gTm8gYnJhbmNoZXMgb3IgUFJzIHdpbGwgYmUgY3JlYXRlZC4nKSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgY29uZmlndXJlR2l0VXNlckRldGFpbHNJZk5lZWRlZCgpO1xuICB9XG5cbiAgLy8gSW5zdGFsbCBjb2RpbmcgdG9vbHNcbiAgaWYgKG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2FpZGVyJykge1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ3B5dGhvbicsIFsnLW0nLCAncGlwJywgJ2luc3RhbGwnLCAnYWlkZXItaW5zdGFsbCddKTtcbiAgICBhd2FpdCByZXNoaW1Ub0RldGVjdE5ld1Rvb2xzKCk7XG4gICAgYXdhaXQgcnVuQ29tbWFuZCgndXYnLCBbJ3Rvb2wnLCAndW5pbnN0YWxsJywgJ2FpZGVyLWNoYXQnXSwgeyBpZ25vcmVFeGl0U3RhdHVzOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2FpZGVyLWluc3RhbGwnLCBbXSk7XG4gICAgYXdhaXQgcmVzaGltVG9EZXRlY3ROZXdUb29scygpO1xuXG4gICAgaWYgKG9wdGlvbnMuYWlkZXJFeHRyYUFyZ3M/LmluY2x1ZGVzKCdiZWRyb2NrLycpKSB7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKCd1dicsIFtcbiAgICAgICAgJ3Rvb2wnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgJy0tZnJvbScsXG4gICAgICAgICdhaWRlci1jaGF0JyxcbiAgICAgICAgJ3BpcCcsXG4gICAgICAgICdpbnN0YWxsJyxcbiAgICAgICAgJy0tdXBncmFkZScsXG4gICAgICAgICctLXVwZ3JhZGUtc3RyYXRlZ3knLFxuICAgICAgICAnb25seS1pZi1uZWVkZWQnLFxuICAgICAgICAnYm90bzMnLFxuICAgICAgXSk7XG4gICAgICAvLyBhd2FpdCBydW5Db21tYW5kKCdhaWRlcicsIFsnLS1pbnN0YWxsLW1haW4tYnJhbmNoJywgJy0teWVzLWFsd2F5cyddKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwckJhc2VCcmFuY2ggPSBhd2FpdCBnZXRCYXNlQnJhbmNoKG9wdGlvbnMpO1xuICBjb25zdCBpc1B1bGxSZXF1ZXN0ID0gISFwckJhc2VCcmFuY2g7XG4gIGNvbnN0IGJhc2VCcmFuY2ggPSBwckJhc2VCcmFuY2ggfHwgKGF3YWl0IGdldEN1cnJlbnRCcmFuY2goKSk7XG5cbiAgY29uc3QgaXNzdWVJbmZvID0gYXdhaXQgY3JlYXRlSXNzdWVJbmZvKG9wdGlvbnMpO1xuICBjb25zdCBpc3N1ZVRleHQgPSBZQU1MLnN0cmluZ2lmeShpc3N1ZUluZm8sIHlhbWxTdHJpbmdpZnlPcHRpb25zKS50cmltKCk7XG5cbiAgY29uc3QgcmVzb2x1dGlvblBsYW4gPVxuICAgIChvcHRpb25zLnBsYW5uaW5nTW9kZWwgJiZcbiAgICAgIChhd2FpdCBwbGFuQ29kZUNoYW5nZXMoXG4gICAgICAgIG9wdGlvbnMucGxhbm5pbmdNb2RlbCxcbiAgICAgICAgaXNzdWVUZXh0LFxuICAgICAgICBvcHRpb25zLnR3b1N0YWdlUGxhbm5pbmcsXG4gICAgICAgIG9wdGlvbnMucmVhc29uaW5nRWZmb3J0LFxuICAgICAgICBvcHRpb25zLnJlcG9taXhFeHRyYUFyZ3MsXG4gICAgICAgIGlzUHVsbFJlcXVlc3RcbiAgICAgICkpKSB8fFxuICAgIHVuZGVmaW5lZDtcbiAgY29uc29sZS5pbmZvKCdSZXNvbHV0aW9uIHBsYW46JywgcmVzb2x1dGlvblBsYW4pO1xuXG4gIGNvbnN0IHBsYW5UZXh0ID0gKHJlc29sdXRpb25QbGFuICYmICdwbGFuJyBpbiByZXNvbHV0aW9uUGxhbiAmJiByZXNvbHV0aW9uUGxhbi5wbGFuKSB8fCAnJztcbiAgY29uc3QgaXNzdWVGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKGlzc3VlVGV4dCwgJ34nKTtcbiAgY29uc3QgaXNBZ2VudGljID0gb3B0aW9ucy5jb2RpbmdUb29sICE9PSAnYWlkZXInO1xuICBjb25zdCB0YXJnZXQgPSBpc1B1bGxSZXF1ZXN0ID8gJ3RoZSBjb21tZW50cyBvbiB0aGUgZm9sbG93aW5nIEdpdEh1YiBwdWxsIHJlcXVlc3QnIDogJ3RoZSBmb2xsb3dpbmcgR2l0SHViIGlzc3VlJztcbiAgY29uc3QgcHJvbXB0ID0gYFxuTW9kaWZ5IHRoZSBjb2RlIHRvIHJlc29sdmUgJHt0YXJnZXR9JHtwbGFuVGV4dCA/ICcgYmFzZWQgb24gdGhlIHBsYW4nIDogJyd9LiR7aXNBZ2VudGljID8gJyBBZnRlciB0aGF0LCBjb21taXQgeW91ciBjaGFuZ2VzIHdpdGggYSBtZXNzYWdlLCBmb2xsb3dpbmcgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIHNwZWNpZmljYXRpb24uJyA6ICcnfVxuXG4jIyAke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCBSZXF1ZXN0JyA6ICdJc3N1ZSd9XG5cbiR7aXNzdWVGZW5jZX15bWxcbiR7aXNzdWVUZXh0fVxuJHtpc3N1ZUZlbmNlfVxuXG4ke1xuICBwbGFuVGV4dCAmJlxuICBgIyMgUGxhblxuXG4ke3BsYW5UZXh0fWBcbn1cbmAudHJpbSgpO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IG5ld0JyYW5jaE5hbWUgPSBgZ2VuLXByLSR7b3B0aW9ucy5pc3N1ZU51bWJlcn0tJHtvcHRpb25zLmNvZGluZ1Rvb2x9LSR7bm93LmdldEZ1bGxZZWFyKCl9XyR7Z2V0VHdvRGlnaXRzKG5vdy5nZXRNb250aCgpICsgMSl9JHtnZXRUd29EaWdpdHMobm93LmdldERhdGUoKSl9XyR7Z2V0VHdvRGlnaXRzKG5vdy5nZXRIb3VycygpKX0ke2dldFR3b0RpZ2l0cyhub3cuZ2V0TWludXRlcygpKX0ke2dldFR3b0RpZ2l0cyhub3cuZ2V0U2Vjb25kcygpKX1gO1xuXG4gIGlmIChvcHRpb25zLm5vQnJhbmNoKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBjb21taXQgZGlyZWN0bHkgdG8gYmFzZSBicmFuY2g6ICR7YmFzZUJyYW5jaH1gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1B1bGxSZXF1ZXN0KSB7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnZmV0Y2gnLCAnb3JpZ2luJywgYmFzZUJyYW5jaF0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydzd2l0Y2gnLCBiYXNlQnJhbmNoXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGFuc2lzLnllbGxvdyhgV291bGQgY3JlYXRlIGJyYW5jaDogJHtuZXdCcmFuY2hOYW1lfWApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHVsbFJlcXVlc3QpIHtcbiAgICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydmZXRjaCcsICdvcmlnaW4nLCBiYXNlQnJhbmNoXSk7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnc3dpdGNoJywgYmFzZUJyYW5jaF0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydzd2l0Y2gnLCAnLS1mb3JjZS1jcmVhdGUnLCBuZXdCcmFuY2hOYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhlY3V0ZSBjb2RpbmcgdG9vbFxuICBsZXQgdG9vbFJlc3VsdCA9ICcnO1xuICBsZXQgdG9vbENvbW1hbmQ6IHN0cmluZztcbiAgbGV0IHRvb2xFcnJvciA9ICcnO1xuICBsZXQgdG9vbFN1Y2Nlc3MgPSB0cnVlO1xuICBjb25zdCB0b29sTmFtZSA9XG4gICAgb3B0aW9ucy5jb2RpbmdUb29sID09PSAnYWlkZXInXG4gICAgICA/ICdBaWRlcidcbiAgICAgIDogb3B0aW9ucy5jb2RpbmdUb29sID09PSAnY2xhdWRlLWNvZGUnXG4gICAgICAgID8gJ0NsYXVkZSBDb2RlJ1xuICAgICAgICA6IG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2NvZGV4LWNsaSdcbiAgICAgICAgICA/ICdDb2RleCBDTEknXG4gICAgICAgICAgOiAnR2VtaW5pIENMSSc7XG5cbiAgLy8gQnVpbGQgdG9vbCBjb25maWd1cmF0aW9uXG4gIGxldCB0b29sQXJnczogc3RyaW5nW107XG4gIGxldCBjb21tYW5kOiBzdHJpbmc7XG4gIGxldCBydW5PcHRzOiBTcGF3bk9wdGlvbnMgJiB7IGlnbm9yZUV4aXRTdGF0dXM/OiBib29sZWFuIH0gPSB7XG4gICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBOT19DT0xPUjogJzEnIH0sXG4gICAgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSxcbiAgfTtcblxuICBpZiAob3B0aW9ucy5jb2RpbmdUb29sID09PSAnYWlkZXInKSB7XG4gICAgdG9vbEFyZ3MgPSBidWlsZEFpZGVyQXJncyhvcHRpb25zLCB7IHByb21wdDogcHJvbXB0LCByZXNvbHV0aW9uUGxhbiB9KTtcbiAgICBjb21tYW5kID0gJ2FpZGVyJztcbiAgfSBlbHNlIGlmIChvcHRpb25zLmNvZGluZ1Rvb2wgPT09ICdjbGF1ZGUtY29kZScpIHtcbiAgICB0b29sQXJncyA9IGJ1aWxkQ2xhdWRlQ29kZUFyZ3Mob3B0aW9ucywgeyBwcm9tcHQ6IHByb21wdCwgcmVzb2x1dGlvblBsYW4gfSk7XG4gICAgY29tbWFuZCA9IG9wdGlvbnMubm9kZVJ1bnRpbWU7XG4gICAgcnVuT3B0cyA9IHsgLi4ucnVuT3B0cywgc3RkaW86ICdpbmhlcml0JyB9O1xuICB9IGVsc2UgaWYgKG9wdGlvbnMuY29kaW5nVG9vbCA9PT0gJ2NvZGV4LWNsaScpIHtcbiAgICB0b29sQXJncyA9IGJ1aWxkQ29kZXhBcmdzKG9wdGlvbnMsIHsgcHJvbXB0OiBwcm9tcHQsIHJlc29sdXRpb25QbGFuIH0pO1xuICAgIGNvbW1hbmQgPSBvcHRpb25zLm5vZGVSdW50aW1lO1xuICB9IGVsc2Uge1xuICAgIHRvb2xBcmdzID0gYnVpbGRHZW1pbmlBcmdzKG9wdGlvbnMsIHsgcHJvbXB0OiBwcm9tcHQsIHJlc29sdXRpb25QbGFuIH0pO1xuICAgIGNvbW1hbmQgPSBvcHRpb25zLm5vZGVSdW50aW1lO1xuICB9XG5cbiAgdG9vbENvbW1hbmQgPSBidWlsZFRvb2xDb21tYW5kU3RyaW5nKGNvbW1hbmQsIHRvb2xBcmdzLCBwcm9tcHQpO1xuXG4gIC8vIEV4ZWN1dGUgdG9vbCBjb21tYW5kXG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbyhgXFxuPT09IERSWSBNT0RFOiAke3Rvb2xOYW1lfSBQcm9tcHQgPT09YCk7XG4gICAgY29uc29sZS5pbmZvKHByb21wdCk7XG4gICAgY29uc29sZS5pbmZvKGA9PT0gRW5kICR7dG9vbE5hbWV9IFByb21wdCA9PT1cXG5gKTtcbiAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBydW46ICR7dG9vbENvbW1hbmR9YCkpO1xuICAgIHRvb2xSZXN1bHQgPSAnU2tpcHBlZCBkdWUgdG8gZHJ5LXJ1biBtb2RlJztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0b29sUnVuUmVzdWx0ID0gYXdhaXQgcnVuQ29tbWFuZChjb21tYW5kLCB0b29sQXJncywgcnVuT3B0cyk7XG4gICAgdG9vbFJlc3VsdCA9IHRvb2xSdW5SZXN1bHQuc3Rkb3V0IHx8ICcnO1xuICAgIGlmICh0b29sUnVuUmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdG9vbFN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgIHRvb2xFcnJvciA9IGAke3Rvb2xOYW1lfSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHt0b29sUnVuUmVzdWx0LnN0YXR1c31cXG4ke3Rvb2xSdW5SZXN1bHQuc3RkZXJyfWA7XG4gICAgICBjb25zb2xlLmVycm9yKGFuc2lzLnJlZChgJHt0b29sTmFtZX0gZXhlY3V0aW9uIGZhaWxlZDogJHt0b29sRXJyb3J9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB0b29sUmVzcG9uc2UgPSAodG9vbFJlc3VsdCB8fCAnJykudHJpbSgpO1xuICBsZXQgdGVzdFN1Y2Nlc3MgPSB0cnVlO1xuICBsZXQgdGVzdEVycm9yID0gJyc7XG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3coYFdvdWxkIHJ1biB0ZXN0IGNvbW1hbmRgKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGVzdFJlc3VsdCA9IGF3YWl0IHRlc3RBbmRGaXgob3B0aW9ucywgcmVzb2x1dGlvblBsYW4pO1xuICAgIHRvb2xSZXNwb25zZSArPSB0ZXN0UmVzdWx0LmZpeFJlc3VsdDtcbiAgICB0ZXN0U3VjY2VzcyA9IHRlc3RSZXN1bHQuc3VjY2VzcztcbiAgICB0ZXN0RXJyb3IgPSB0ZXN0UmVzdWx0LmVycm9yIHx8ICcnO1xuICAgIGlmICghdGVzdFN1Y2Nlc3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihhbnNpcy55ZWxsb3coJ1Rlc3RzIGZhaWxlZCBhZnRlciBhbGwgZml4IGF0dGVtcHRzLiBXaWxsIGNyZWF0ZSBhIGRyYWZ0IFBSLicpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRvb2xTdWNjZXNzKSB7XG4gICAgY29uc29sZS53YXJuKGFuc2lzLnllbGxvdyhgJHt0b29sTmFtZX0gZXhlY3V0aW9uIGZhaWxlZC4gV2lsbCBjcmVhdGUgYSBkcmFmdCBQUi5gKSk7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgUFIgc2hvdWxkIGJlIGEgZHJhZnRcbiAgY29uc3Qgc2hvdWxkQmVEcmFmdCA9ICF0b29sU3VjY2VzcyB8fCAhdGVzdFN1Y2Nlc3M7XG4gIGxldCBlcnJvckxvZ3MgPSAnJztcbiAgaWYgKHNob3VsZEJlRHJhZnQpIHtcbiAgICBpZiAodG9vbEVycm9yKSB7XG4gICAgICBlcnJvckxvZ3MgKz0gYFxcblxcbiMjIyDinYwgJHt0b29sTmFtZX0gRXhlY3V0aW9uIEVycm9yXFxuXFxuXFxgXFxgXFxgXFxuJHt0b29sRXJyb3J9XFxuXFxgXFxgXFxgYDtcbiAgICB9XG4gICAgaWYgKHRlc3RFcnJvcikge1xuICAgICAgZXJyb3JMb2dzICs9IGBcXG5cXG4jIyMg4p2MIFRlc3QgRXhlY3V0aW9uIEVycm9yXFxuXFxuXFxgXFxgXFxgXFxuJHt0ZXN0RXJyb3J9XFxuXFxgXFxgXFxgYDtcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgY29tbWl0aW5nIGNoYW5nZXMgYmVjYXVzZSBjb2RpbmcgdG9vbCBtYXkgZmFpbCB0byBjb21taXQgY2hhbmdlcyBkdWUgdG8gcHJlLWNvbW1pdCBob29rc1xuICBjb25zdCBjb21taXRNZXNzYWdlID0gcmVzb2x1dGlvblBsYW4/LmNvbW1pdE1lc3NhZ2UgfHwgYGZpeDogQ2xvc2UgIyR7b3B0aW9ucy5pc3N1ZU51bWJlcn1gO1xuICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2FkZCcsICctQSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gIGlmIChcbiAgICAoXG4gICAgICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbW1pdCcsICctbScsIGNvbW1pdE1lc3NhZ2VdLCB7XG4gICAgICAgIGlnbm9yZUV4aXRTdGF0dXM6IHRydWUsXG4gICAgICB9KVxuICAgICkuc3RhdHVzICE9PSAwXG4gICkge1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29tbWl0JywgJy1tJywgY29tbWl0TWVzc2FnZSwgJy0tbm8tdmVyaWZ5J10sIHtcbiAgICAgIGlnbm9yZUV4aXRTdGF0dXM6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubm9CcmFuY2gpIHtcbiAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhhbnNpcy55ZWxsb3coYFdvdWxkIHB1c2ggY2hhbmdlcyBkaXJlY3RseSB0byBiYXNlIGJyYW5jaDogJHtiYXNlQnJhbmNofWApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0JywgWydwdXNoJywgJ29yaWdpbicsIGJhc2VCcmFuY2gsICctLW5vLXZlcmlmeSddKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBXb3VsZCBwdXNoIGJyYW5jaDogJHtuZXdCcmFuY2hOYW1lfSB0byBvcmlnaW5gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsncHVzaCcsICdvcmlnaW4nLCBuZXdCcmFuY2hOYW1lLCAnLS1uby12ZXJpZnknXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgUFIgdXNpbmcgR2l0SHViIENMSSAodW5sZXNzIG5vQnJhbmNoIGlzIGVuYWJsZWQpXG4gIGlmIChvcHRpb25zLm5vQnJhbmNoKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oYW5zaXMueWVsbG93KGBTa2lwcGluZyBQUiBjcmVhdGlvbiBkdWUgdG8gLS1uby1icmFuY2ggb3B0aW9uYCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZXMgY29tbWl0dGVkIGRpcmVjdGx5IHRvIGJhc2UgYnJhbmNoOiAke2Jhc2VCcmFuY2h9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByVGl0bGUgPSBnZXRIZWFkZXJPZkZpcnN0Q29tbWl0KGJhc2VCcmFuY2gpIHx8IGNvbW1pdE1lc3NhZ2U7XG4gICAgbGV0IHByQm9keSA9IGlzUHVsbFJlcXVlc3QgPyAnJyA6IGBDbG9zZSAjJHtvcHRpb25zLmlzc3VlTnVtYmVyfWA7XG5cbiAgICBpZiAob3B0aW9ucy5wbGFubmluZ01vZGVsKSB7XG4gICAgICBwckJvZHkgKz0gYFxuXG4ke0hFQURJTkdfT0ZfR0VOX1BSX01FVEFEQVRBfVxuXG4tICoqUGxhbm5pbmcgTW9kZWw6KiogJHtvcHRpb25zLnBsYW5uaW5nTW9kZWx9YDtcbiAgICB9XG5cbiAgICBwckJvZHkgKz0gYFxuLSAqKkNvZGluZyBUb29sOioqICR7dG9vbE5hbWV9XG4tICoqQ29kaW5nIENvbW1hbmQ6KiogXFxgJHt0b29sQ29tbWFuZH1cXGBgO1xuICAgIGlmIChwbGFuVGV4dCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHBsYW5UZXh0LCAnficpO1xuICAgICAgcHJCb2R5ICs9IGBcblxuIyMjIFBsYW5cblxuJHtyZXNwb25zZUZlbmNlfVxuJHt0cnVuY2F0ZVRleHQocGxhblRleHQsICh0b29sUmVzcG9uc2UubGVuZ3RoIC8gKHBsYW5UZXh0Lmxlbmd0aCArIHRvb2xSZXNwb25zZS5sZW5ndGgpKSAqIE1BWF9QUl9CT0RZX0xFTkdUSCl9XG4ke3Jlc3BvbnNlRmVuY2V9YDtcbiAgICB9XG4gICAgaWYgKHRvb2xSZXNwb25zZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VGZW5jZSA9IGZpbmREaXN0aW5jdEZlbmNlKHRvb2xSZXNwb25zZSwgJ34nKTtcbiAgICAgIHByQm9keSArPSBgXG5cbiMjIyAke3Rvb2xOYW1lfSBMb2dcblxuJHtyZXNwb25zZUZlbmNlfVxuJHt0cnVuY2F0ZVRleHQodG9vbFJlc3BvbnNlLCAodG9vbFJlc3BvbnNlLmxlbmd0aCAvIChwbGFuVGV4dC5sZW5ndGggKyB0b29sUmVzcG9uc2UubGVuZ3RoKSkgKiBNQVhfUFJfQk9EWV9MRU5HVEgpfVxuJHtyZXNwb25zZUZlbmNlfWA7XG4gICAgfVxuICAgIHByQm9keSA9IHByQm9keS5yZXBsYWNlQWxsKC8oPzpcXHMqXFxuKXsyLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcblxuICAgIC8vIEFkZCBlcnJvciBsb2dzIHRvIFBSIGJvZHkgaWYgaXQncyBhIGRyYWZ0IGR1ZSB0byBmYWlsdXJlc1xuICAgIGlmIChzaG91bGRCZURyYWZ0KSB7XG4gICAgICBwckJvZHkgKz0gZXJyb3JMb2dzO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGFuc2lzLnllbGxvdyhgV291bGQgY3JlYXRlIFBSIHdpdGggdGl0bGU6ICR7cHJUaXRsZX0ke3Nob3VsZEJlRHJhZnQgPyAnIChhcyBkcmFmdCknIDogJyd9YCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjcmVhdGVQdWxsUmVxdWVzdCh7XG4gICAgICAgIHRpdGxlOiBwclRpdGxlLFxuICAgICAgICBib2R5OiBwckJvZHksXG4gICAgICAgIGhlYWQ6IG5ld0JyYW5jaE5hbWUsXG4gICAgICAgIGJhc2U6IGJhc2VCcmFuY2gsXG4gICAgICAgIGRyYWZ0OiBzaG91bGRCZURyYWZ0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5pbmZvKGBcXG4ke2lzUHVsbFJlcXVlc3QgPyAnUHVsbCByZXF1ZXN0JyA6ICdJc3N1ZSd9ICMke29wdGlvbnMuaXNzdWVOdW1iZXJ9IHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc2hpbVRvRGV0ZWN0TmV3VG9vbHMoKSB7XG4gIHRyeSB7XG4gICAgLy8gTWFrZSB1diBhdmFpbGFibGUgb24gYXNkZiBlbnZpcm9ubWVudFxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2FzZGYnLCBbJ3Jlc2hpbSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUd29EaWdpdHModmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgY29tbWFuZCBzdHJpbmcgZm9yIGRpc3BsYXksIHJlcGxhY2luZyB0aGUgcHJvbXB0IGFyZ3VtZW50IHdpdGggLi4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVG9vbENvbW1hbmRTdHJpbmcoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgcHJvbXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlc2NhcGVkQXJncyA9IGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoYXJnID09PSBwcm9tcHQpIHtcbiAgICAgIHJldHVybiAnLi4uJztcbiAgICB9XG4gICAgaWYgKGFyZy5pbmNsdWRlcygnICcpIHx8IGFyZy5pbmNsdWRlcygnXCInKSB8fCBhcmcuaW5jbHVkZXMoXCInXCIpKSB7XG4gICAgICByZXR1cm4gYFwiJHthcmcucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbiAgICB9XG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG4gIHJldHVybiBgJHtjb21tYW5kfSAke2VzY2FwZWRBcmdzLmpvaW4oJyAnKX1gO1xufVxuIiwiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudlZhcnMoKTogdm9pZCB7XG4gIGNvbmZpZygpO1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiAmJiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OX05BTUUpIHtcbiAgICBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID0gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTl9OQU1FO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LkFXU19SRUdJT04gJiYgIXByb2Nlc3MuZW52LkFXU19SRUdJT05fTkFNRSkge1xuICAgIHByb2Nlc3MuZW52LkFXU19SRUdJT05fTkFNRSA9IHByb2Nlc3MuZW52LkFXU19SRUdJT047XG4gIH1cblxuICBpZiAoIXByb2Nlc3MuZW52LkdFTUlOSV9BUElfS0VZICYmIHByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVkpIHtcbiAgICBwcm9jZXNzLmVudi5HRU1JTklfQVBJX0tFWSA9IHByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuR0VNSU5JX0FQSV9LRVkgJiYgIXByb2Nlc3MuZW52LkdPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVkpIHtcbiAgICBwcm9jZXNzLmVudi5HT09HTEVfR0VORVJBVElWRV9BSV9BUElfS0VZID0gcHJvY2Vzcy5lbnYuR0VNSU5JX0FQSV9LRVk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IE1haW5PcHRpb25zIH0gZnJvbSAnLi9tYWluLmpzJztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL3NwYXduLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUdpdFVzZXJEZXRhaWxzSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGdpdFVzZXJOYW1lID0gKGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29uZmlnJywgJ3VzZXIubmFtZSddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSkpLnN0ZG91dC50cmltKCk7XG4gIGNvbnN0IGdpdFVzZXJFbWFpbCA9IChhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbmZpZycsICd1c2VyLmVtYWlsJ10sIHsgaWdub3JlRXhpdFN0YXR1czogdHJ1ZSB9KSkuc3Rkb3V0LnRyaW0oKTtcbiAgaWYgKCFnaXRVc2VyTmFtZSB8fCAhZ2l0VXNlckVtYWlsKSB7XG4gICAgY29uc3QgZ2l0aHViVXNlckluZm9Kc29uID0gKGF3YWl0IHJ1bkNvbW1hbmQoJ2doJywgWydhcGknLCAndXNlciddLCB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfSkpLnN0ZG91dC50cmltKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgZW1haWwgfSA9IEpTT04ucGFyc2UoZ2l0aHViVXNlckluZm9Kc29uKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnY29uZmlnJywgJ3VzZXIubmFtZScsIG5hbWVdKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICBhd2FpdCBydW5Db21tYW5kKCdnaXQnLCBbJ2NvbmZpZycsICd1c2VyLmVtYWlsJywgZW1haWxdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRCcmFuY2goKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY3VycmVudEJyYW5jaFJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCcsIFsnYnJhbmNoJywgJy0tc2hvdy1jdXJyZW50J10pO1xuICByZXR1cm4gY3VycmVudEJyYW5jaFJlc3VsdC5zdGRvdXQudHJpbSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZUJyYW5jaChvcHRpb25zOiBNYWluT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgc3Rkb3V0OiBwclZpZXdSZXN1bHQgfSA9IGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgJ2doJyxcbiAgICBbJ3ByJywgJ3ZpZXcnLCBvcHRpb25zLmlzc3VlTnVtYmVyLnRvU3RyaW5nKCksICctLWpzb24nLCAnaGVhZFJlZk5hbWUnXSxcbiAgICB7IGlnbm9yZUV4aXRTdGF0dXM6IHRydWUgfVxuICApO1xuICB0cnkge1xuICAgIGlmIChwclZpZXdSZXN1bHQpIHtcbiAgICAgIGNvbnN0IHByRGF0YSA9IEpTT04ucGFyc2UocHJWaWV3UmVzdWx0KTtcbiAgICAgIHJldHVybiBwckRhdGEuaGVhZFJlZk5hbWU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBOb3QgYSBQUiBvciBlcnJvciBwYXJzaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdFJlcG9OYW1lKCk6IHN0cmluZyB7XG4gIGNvbnN0IHJlcG9VcmxSZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZW1vdGUnLCAnZ2V0LXVybCcsICdvcmlnaW4nXSwge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIGNvbnN0IHJlcG9VcmwgPSByZXBvVXJsUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIGNvbnN0IHJlcG9NYXRjaCA9IHJlcG9VcmwubWF0Y2goL2dpdGh1YlxcLmNvbVsvOl0oW1xcdy1dK1xcL1tcXHctXSspKFxcLmdpdCk/JC8pO1xuICByZXR1cm4gcmVwb01hdGNoPy5bMV0gPz8gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJPZkZpcnN0Q29tbWl0KGJhc2VCcmFuY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0Q29tbWl0UmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnbG9nJywgYCR7YmFzZUJyYW5jaH0uLkhFQURgLCAnLS1yZXZlcnNlJywgJy0tcHJldHR5PSVzJ10sIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiAncGlwZScsXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIGZpcnN0Q29tbWl0UmVzdWx0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpKSA/PyAnJ1xuICApO1xufVxuIl0sIm5hbWVzIjpbImxvYWRDb25maWdGaWxlIiwiY29uZmlnT3B0aW9ucyIsIm5hbWUiLCJjZmdQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzIiwiY3dkIiwiZnMiLCJleGlzdHNTeW5jIiwiWUFNTCIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiY29uc29sZSIsImluZm8iLCJlcnIiLCJlcnJvciIsImV4aXQiLCJERUZBVUxUX0FJREVSX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NMQVVERV9DT0RFX0VYVFJBX0FSR1MiLCJERUZBVUxUX0NPREVYX0VYVFJBX0FSR1MiLCJERUZBVUxUX0dFTUlOSV9FWFRSQV9BUkdTIiwiREVGQVVMVF9SRVBPTUlYX0VYVFJBX0FSR1MiLCJERUZBVUxUX01BWF9URVNUX0FUVEVNUFRTIiwiREVGQVVMVF9DT0RJTkdfVE9PTCIsIkRFRkFVTFRfTk9ERV9SVU5USU1FIiwiSEVBRElOR19PRl9HRU5fUFJfTUVUQURBVEEiLCJ0cnVuY2F0ZVRleHQiLCJ0ZXh0IiwibWF4TGVuZ3RoIiwibGVuZ3RoIiwidHJ1bmNhdGVkIiwic2xpY2UiLCJvbWl0dGVkIiwiTWF0aCIsImZsb29yIiwibm9ybWFsaXplTmV3TGluZXMiLCJyZXBsYWNlQWxsIiwidHJpbSIsIm5vcm1hbGl6ZU5vZGVSdW50aW1lIiwicnVudGltZSIsImFzeW5jIiwicnVuQ29tbWFuZCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImlnbm9yZUV4aXRTdGF0dXMiLCJzcGF3bk9wdGlvbnMiLCJhcmdzVGV4dCIsIm1hcCIsImEiLCJpbmNsdWRlcyIsImpvaW4iLCJhbnNpcyIsImdyZWVuIiwicmV0Iiwic3Bhd25Bc3luYyIsInRydW5jYXRlU3Rkb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwidHJ1bmNhdGVkU3RkZXJyIiwieWVsbG93IiwibWFnZW50YSIsInN0YXR1cyIsIlByb21pc2UiLCJyZWplY3QiLCJzYW5pdGl6ZWRBcmdzIiwiYXJnIiwicmVwbGFjZSIsInByb2MiLCJzcGF3biIsInNldEVuY29kaW5nIiwib24iLCJkYXRhIiwid3JpdGUiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwicGlkIiwiRXJyb3IiLCJwYXJzZUNvbW1hbmRMaW5lQXJncyIsImFyZ3NTdHJpbmciLCJyZXN1bHQiLCJjdXJyZW50IiwiaW5Eb3VibGVRdW90ZSIsImluU2luZ2xlUXVvdGUiLCJpIiwiY2hhciIsInB1c2giLCJ0b2tlbiIsImVudiIsIkdIX1RPS0VOIiwiR0lUSFVCX1RPS0VOIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsImVuY29kaW5nIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ3JhcGhxbENsaWVudCIsImdyYXBocWwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJhdXRob3JpemF0aW9uIiwicmVwb093bmVyIiwicmVwb05hbWUiLCJnZXRSZXBvSW5mbyIsIm1hdGNoIiwib3duZXIiLCJyZXBvIiwiZmV0Y2hQUkRpZmYiLCJpc3N1ZU51bWJlciIsImlzc3VlSW5mbyIsInByRGlmZiIsInB1bGxOdW1iZXIiLCJwdWxscyIsImdldCIsInB1bGxfbnVtYmVyIiwibWVkaWFUeXBlIiwiZm9ybWF0IiwiZ2V0UHVsbFJlcXVlc3REaWZmIiwiY29kZV9jaGFuZ2VzIiwiZGlmZkNvbnRlbnQiLCJNQVhfVE9UQUxfRElGRl9TSVpFIiwiTUFYX0ZJTEVfRElGRl9TSVpFIiwiTEFSR0VfRklMRV9QQVRURVJOUyIsImZpbGVTZWN0aW9ucyIsInNwbGl0IiwicHJvY2Vzc2VkU2VjdGlvbnMiLCJ0b3RhbFNpemUiLCJzZWN0aW9uIiwic29tZSIsInBhdHRlcm4iLCJ0ZXN0IiwidHJ1bmNhdGVkU2VjdGlvbiIsInByb2Nlc3NEaWZmQ29udGVudCIsIndhcm4iLCJmZXRjaElzc3VlRGF0YSIsInByb2Nlc3NlZElzc3VlcyIsImlzUmVmZXJlbmNlZCIsImhhcyIsImlzc3VlIiwiYWRkIiwiaXNzdWVEYXRhIiwiaXNzdWVzIiwiaXNzdWVfbnVtYmVyIiwiaXNzdWVPclB1bGxSZXF1ZXN0IiwicHVsbF9yZXF1ZXN0IiwicHJEYXRhIiwiY29tbWVudHNSZXNwb25zZSIsImxpc3RDb21tZW50cyIsImF1dGhvciIsInVzZXIiLCJsb2dpbiIsInRpdGxlIiwiYm9keSIsImxhYmVscyIsImxhYmVsIiwiY29tbWVudHMiLCJjb21tZW50IiwiY3JlYXRlZEF0IiwiY3JlYXRlZF9hdCIsInVybCIsImh0bWxfdXJsIiwiZ2V0SXNzdWUiLCJyZWZlcmVuY2VkTnVtYmVycyIsInJlZ2V4IiwibnVtYmVycyIsImV4ZWMiLCJudW1iZXIiLCJOdW1iZXIiLCJwYXJzZUludCIsImlzSW50ZWdlciIsIlNldCIsImV4dHJhY3RJc3N1ZVJlZmVyZW5jZXMiLCJjIiwicmF3Qm9keSIsInByb2Nlc3NlZEJvZHkiLCJtYXJrZG93bkNvbnRlbnQiLCJpbmRleCIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJzdHJpcE1ldGFkYXRhU2VjdGlvbnMiLCJkZXNjcmlwdGlvbiIsIlJlZ0V4cCIsInJlbW92ZVJlZ2V4UGF0dGVybiIsInJlbW92ZVBhdHRlcm4iLCJjb21tZW50c1dpdGhEYXRlIiwiRGF0ZSIsImdldFRpbWUiLCJncmFwaHFsRGF0YSIsInByIiwiZ2V0UHVsbFJlcXVlc3RSZXZpZXdUaHJlYWRzIiwicmV2aWV3VGhyZWFkcyIsInJlcG9zaXRvcnkiLCJwdWxsUmVxdWVzdCIsIm5vZGVzIiwidGhyZWFkIiwiaXNSZXNvbHZlZCIsInByb2Nlc3NSZXZpZXdUaHJlYWRDb21tZW50cyIsImZldGNoUFJSZXZpZXdUaHJlYWRzIiwicmV2aWV3UmVzdWx0Q29tbWVudHMiLCJsaXN0UmV2aWV3cyIsInJldmlldyIsInN0YXRlIiwic3VibWl0dGVkX2F0IiwiZ2V0UHVsbFJlcXVlc3RSZXZpZXdzIiwicmV2aWV3U3RhdGUiLCJmZXRjaFBSUmV2aWV3cyIsInJlZmVyZW5jZWRJc3N1ZXNQcm9taXNlcyIsIm51bSIsInJlZmVyZW5jZWRJc3N1ZXMiLCJhbGwiLCJmaWx0ZXIiLCJyZWZlcmVuY2VkX2lzc3VlcyIsImZldGNoUmVmZXJlbmNlZElzc3VlcyIsInNvcnQiLCJiIiwiY29kZUNvbnRlbnQiLCJleHRyYWN0Q29kZUZyb21EaWZmSHVuayIsImRpZmZIdW5rIiwicmV2aWV3Q29tbWVudCIsImNvZGVMb2NhdGlvbiIsImxpbmUiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImNvZGVMaW5lIiwiZmluZCIsInN0YXJ0c1dpdGgiLCJleHRyYWN0SGVhZGVyQ29udGVudHMiLCJtb2RpZmllZFJlc3BvbnNlIiwiaW5kaWNlcyIsImhlYWRlciIsImV2ZXJ5Iiwic3RhcnQiLCJlbmQiLCJmaW5kRGlzdGluY3RGZW5jZSIsImNvbnRlbnQiLCJmZW5jZUNoYXIiLCJtYXRjaGVzIiwibWF4Iiwic2VxIiwiZmVuY2VMZW5ndGgiLCJyZXBlYXQiLCJ0cmltQ29kZUJsb2NrRmVuY2VzIiwiY29udmVydFRvVjRNZXNzYWdlcyIsIm1lc3NhZ2VzIiwibXNnIiwiaWQiLCJyb2xlIiwiSlNPTiIsInN0cmluZ2lmeSIsInlhbWxTdHJpbmdpZnlPcHRpb25zIiwiYmxvY2tRdW90ZSIsImxpbmVXaWR0aCIsImNhbGxMbG1BcGkiLCJtb2RlbCIsInJlYXNvbmluZ0VmZm9ydCIsInByb3ZpZGVyIiwibW9kZWxQYXJ0cyIsIm1vZGVsTmFtZSIsIm9sbGFtYUJhc2VVUkwiLCJPTExBTUFfQkFTRV9VUkwiLCJwcm92aWRlck1vZGVsIiwiY3JlYXRlT2xsYW1hIiwiYmFzZVVSTCIsIk9MTEFNQV9BUElfS0VZIiwiYXBpS2V5Iiwib2xsYW1hIiwiZ2VuZXJhdGVUZXh0IiwicHJvdmlkZXJPcHRpb25zIiwidGhpbmsiLCJsb2dSZXN1bHQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsImNhbGxWNFByb3ZpZGVyQXBpIiwibW9kZWxJbnN0YW5jZSIsImNyZWF0ZU9wZW5BSSIsIm9wZW5haVByb3ZpZGVyIiwiY3JlYXRlQW50aHJvcGljIiwiYW50aHJvcGljUHJvdmlkZXIiLCJjcmVhdGVHb29nbGVHZW5lcmF0aXZlQUkiLCJnb29nbGVQcm92aWRlciIsImNyZWF0ZUF6dXJlIiwiYXp1cmVQcm92aWRlciIsImNyZWF0ZUFtYXpvbkJlZHJvY2siLCJiZWRyb2NrUHJvdmlkZXIiLCJjcmVhdGVWZXJ0ZXgiLCJ2ZXJ0ZXhQcm92aWRlciIsImNyZWF0ZVhhaSIsImdyb2tQcm92aWRlciIsImNyZWF0ZU9wZW5Sb3V0ZXIiLCJPUEVOUk9VVEVSX0FQSV9LRVkiLCJvcGVucm91dGVyUHJvdmlkZXIiLCJyZWFzb25pbmciLCJlZmZvcnQiLCJnZXRNb2RlbEluc3RhbmNlIiwicmVxdWVzdFBhcmFtcyIsIm1vZGVsU3VwcG9ydHNSZWFzb25pbmciLCJzdXBwb3J0c1JlYXNvbmluZ09wdGlvbnMiLCJ0aGlua2luZ0J1ZGdldCIsImxvdyIsIm1lZGl1bSIsImhpZ2giLCJnZXRUaGlua2luZ0J1ZGdldCIsIm9wZW5haSIsImFudGhyb3BpYyIsInRoaW5raW5nIiwidHlwZSIsImJ1ZGdldFRva2VucyIsImdvb2dsZSIsInRoaW5raW5nQ29uZmlnIiwieGFpIiwidXNhZ2UiLCJmaW5pc2hSZWFzb24iLCJSRVBPTUlYX0ZJTEVfTkFNRSIsIkhFQURJTkdfT0ZfRklMRV9QQVRIU19UT19CRV9NT0RJRklFRCIsIkhFQURJTkdfT0ZfRklMRV9QQVRIU19UT19CRV9SRUZFUlJFRCIsIkhFQURJTkdfT0ZfUExBTiIsIkhFQURJTkdfT0ZfQ09NTUlUX01FU1NBR0UiLCJidWlsZFByb21wdEZvclNlbGVjdGluZ0ZpbGVzIiwiaXNzdWVZYW1sVGV4dCIsImlzUHVsbFJlcXVlc3QiLCJpdGVtVHlwZSIsImJ1aWxkUHJvbXB0Rm9yUGxhbm5pbmdDb2RlQ2hhbmdlcyIsImJ1aWxkUHJvbXB0Rm9yU2VsZWN0aW5nRmlsZXNBbmRQbGFubmluZ0NvZGVDaGFuZ2VzIiwiYnVpbGRBaWRlckFyZ3MiLCJhaWRlckFyZ3MiLCJhaWRlckV4dHJhQXJncyIsInByb21wdCIsImRyeVJ1biIsInJlc29sdXRpb25QbGFuIiwiZmlsZVBhdGhzIiwiaXNDSSIsIkNJIiwiR0lUSFVCX0FDVElPTlMiLCJidWlsZENsYXVkZUNvZGVBcmdzIiwiYmFzZUFyZ3MiLCJjbGF1ZGVDb2RlRXh0cmFBcmdzIiwiYnVpbGRDb2RleEFyZ3MiLCJjb2RleEV4dHJhQXJncyIsImJ1aWxkR2VtaW5pQXJncyIsImdlbWluaUV4dHJhQXJncyIsInJ1blRvb2xGaXgiLCJ0b29sTmFtZSIsImNvZGluZ1Rvb2wiLCJhc3Npc3RhbnRSZXN1bHQiLCJjeWFuIiwidGVzdENvbW1hbmQiLCJOT19DT0xPUiIsImNsYXVkZUNvZGVBcmdzIiwibm9kZVJ1bnRpbWUiLCJzdGRpbyIsImNvZGV4QXJncyIsImdlbWluaUFyZ3MiLCJtYWluIiwiY29uZmlnIiwiQVdTX1JFR0lPTiIsIkFXU19SRUdJT05fTkFNRSIsIkdFTUlOSV9BUElfS0VZIiwiR09PR0xFX0dFTkVSQVRJVkVfQUlfQVBJX0tFWSIsImdpdFVzZXJOYW1lIiwiZ2l0VXNlckVtYWlsIiwiZ2l0aHViVXNlckluZm9Kc29uIiwiZW1haWwiLCJjb25maWd1cmVHaXRVc2VyRGV0YWlsc0lmTmVlZGVkIiwicmVzaGltVG9EZXRlY3ROZXdUb29scyIsInByQmFzZUJyYW5jaCIsInByVmlld1Jlc3VsdCIsInRvU3RyaW5nIiwiaGVhZFJlZk5hbWUiLCJnZXRCYXNlQnJhbmNoIiwiYmFzZUJyYW5jaCIsImdldEN1cnJlbnRCcmFuY2giLCJjcmVhdGVJc3N1ZUluZm8iLCJpc3N1ZVRleHQiLCJwbGFubmluZ01vZGVsIiwiaXNzdWVDb250ZW50IiwidHdvU3RhZ2VQbGFubmluZyIsInJlcG9taXhFeHRyYUFyZ3MiLCJpc3N1ZUZlbmNlIiwicmVwb21peEFyZ3MiLCJyZXBvbWl4UmVzdWx0IiwicHJvbWlzZXMiLCJybSIsImZvcmNlIiwiZmlsZXNSZXNwb25zZSIsImV4dHJhY3RlZEZpbGVQYXRoTGlzdHMiLCJmaWxlUGF0aHNUb0JlTW9kaWZpZWQiLCJmaWxlUGF0aHNUb0JlUmVmZXJyZWQiLCJmaWxlc0NvbnRlbnQiLCJtYXRjaEFsbCIsIkJvb2xlYW4iLCJmaWxlQ29udGVudHMiLCJmaWxlUGF0aCIsImZlbmNlIiwicGxhblJlc3BvbnNlIiwiZXh0cmFjdGVkQ29udGVudHMiLCJjb21taXRNZXNzYWdlIiwicGxhbiIsImZpbGVQYXRoc1RleHQiLCJwbGFuQ29kZUNoYW5nZXMiLCJwbGFuVGV4dCIsIm5vdyIsIm5ld0JyYW5jaE5hbWUiLCJnZXRGdWxsWWVhciIsImdldFR3b0RpZ2l0cyIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJub0JyYW5jaCIsInRvb2xDb21tYW5kIiwidG9vbFJlc3VsdCIsInRvb2xFcnJvciIsInRvb2xTdWNjZXNzIiwidG9vbEFyZ3MiLCJydW5PcHRzIiwiZXNjYXBlZEFyZ3MiLCJidWlsZFRvb2xDb21tYW5kU3RyaW5nIiwidG9vbFJ1blJlc3VsdCIsInJlZCIsInRvb2xSZXNwb25zZSIsInRlc3RTdWNjZXNzIiwidGVzdEVycm9yIiwidGVzdFJlc3VsdCIsImNvbW1hbmRQcm9ncmFtIiwiY29tbWFuZEFyZ3MiLCJmaXhSZXN1bHQiLCJzdWNjZXNzIiwibWF4QXR0ZW1wdHMiLCJtYXhUZXN0QXR0ZW1wdHMiLCJhdHRlbXB0cyIsImxhc3RFcnJvciIsInN0ZG91dEZlbmNlIiwic3RkZXJyRmVuY2UiLCJ0ZXN0QW5kRml4Iiwic2hvdWxkQmVEcmFmdCIsImVycm9yTG9ncyIsInByVGl0bGUiLCJnZXRIZWFkZXJPZkZpcnN0Q29tbWl0IiwicHJCb2R5IiwicmVzcG9uc2VGZW5jZSIsInBhcmFtcyIsImNyZWF0ZSIsImhlYWQiLCJiYXNlIiwiZHJhZnQiLCJjcmVhdGVQdWxsUmVxdWVzdCIsInZhbHVlIiwiU3RyaW5nIiwicGFkU3RhcnQiXSwibWFwcGluZ3MiOiJ1eEJBSU8sU0FBU0EsSUFFZCxJQUFJQyxFQUF5QyxDQUFBLEVBQzdDLElBQUssTUFBTUMsSUFBUSxDQUFDLG9CQUFxQixzQkFBdUIsQ0FDOUQsTUFBTUMsRUFBVUMsRUFBS0MsUUFBUUMsUUFBUUMsTUFBT0wsR0FDNUMsR0FBSU0sRUFBR0MsV0FBV04sR0FBVSxDQUMxQixJQUNFRixFQUFnQlMsRUFBS0MsTUFBTUgsRUFBR0ksYUFBYVQsRUFBUyxTQUNwRFUsUUFBUUMsS0FBSyw2QkFBNkJaLElBQzVDLENBQUUsTUFBT2EsR0FDUEYsUUFBUUcsTUFBTSwrQkFBK0JkLEtBQVNhLEdBQ3REVCxRQUFRVyxLQUFLLEVBQ2YsQ0FDQSxLQUNGLENBQ0YsQ0FDQSxPQUFPaEIsQ0FDVCxDQ2xCTyxNQUFNaUIsRUFBMkIsMERBRTNCQyxFQUFpQyxpQ0FFakNDLEVBQTJCLGNBRTNCQyxFQUE0QixHQUM1QkMsRUFBNkIsd0VBQzdCQyxFQUE0QixFQUM1QkMsRUFBc0IsUUFDdEJDLEVBQTBDLE1DYmhELE1BQU1DLEVBQTZCLHFCQUtuQyxTQUFTQyxFQUFhQyxFQUFjQyxHQUN6QyxHQUFJRCxFQUFLRSxPQUFTRCxFQUFXLENBQzNCLE1BQU1FLEVBQVlILEVBQUtJLE1BQU0sRUFBR0gsR0FDMUJJLEVBQVVMLEVBQUtFLE9BQVNELEVBQzlCLE1BQU8sR0FBR0UsYUFBcUJHLEtBQUtDLE1BQU1GLDhCQUM1QyxDQUVBLE9BQU9MLENBQ1QsQ0FvQk8sU0FBU1EsRUFBa0JSLEdBQ2hDLE9BQU9BLEVBQUtTLFdBQVcsT0FBUSxNQUFNQyxNQUN2QyxDQ3BCTyxTQUFTQyxFQUFxQkMsR0FDbkMsT0FBUUEsR0FDTixJQUFLLE9BQ0wsSUFBSyxNQUNILE1BQU8sTUFDVCxJQUFLLE1BQ0wsSUFBSyxPQUNILE1BQU8sT0FFYixDQUVPQyxlQUFlQyxFQUNwQkMsRUFDQUMsRUFDQUMsR0FF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