@aws-cdk-testing/cli-integ 3.28.0 → 3.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +8 -8
  2. package/lib/assertions.d.ts +14 -0
  3. package/lib/assertions.js +29 -0
  4. package/lib/shell.d.ts +6 -0
  5. package/lib/shell.js +2 -2
  6. package/lib/with-sam.js +3 -8
  7. package/npm-shrinkwrap.json +110 -179
  8. package/package.json +2 -3
  9. package/resources/cdk-apps/guard-hook-app/app.js +99 -0
  10. package/resources/cdk-apps/guard-hook-app/cdk.json +4 -0
  11. package/resources/cdk-apps/nested-stack-with-iam/app.js +38 -0
  12. package/resources/cdk-apps/nested-stack-with-iam/cdk.json +7 -0
  13. package/resources/cdk-apps/tty-app/app.js +29 -0
  14. package/resources/cdk-apps/tty-app/cdk.json +4 -0
  15. package/tests/cli-integ-tests/deploy/cdk-deploy-guard-hook-failure-displays-annotations.integtest.js +19 -0
  16. package/tests/cli-integ-tests/deploy/cdk-deploy-skips-unnecessary-updates-for-nested-stacks.integtest.js +36 -0
  17. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-can-be-run-twice-on-a-new-stack.integtest.js +13 -0
  18. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-doubly-nested-stacks.integtest.d.ts +1 -0
  19. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-doubly-nested-stacks.integtest.js +16 -0
  20. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-nested-stacks-through-full-lifecycle.integtest.d.ts +1 -0
  21. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-nested-stacks-through-full-lifecycle.integtest.js +30 -0
  22. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only--method-change-set-detects-security-changes-in-nested-stacks.integtest.d.ts +1 -0
  23. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only--method-change-set-detects-security-changes-in-nested-stacks.integtest.js +15 -0
  24. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only-detects-security-changes-in-nested-stacks.integtest.d.ts +1 -0
  25. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only-detects-security-changes-in-nested-stacks.integtest.js +15 -0
  26. package/tests/cli-integ-tests/output/cdk-apps-must-have-terminal.integtest.d.ts +1 -0
  27. package/tests/cli-integ-tests/output/cdk-apps-must-have-terminal.integtest.js +11 -0
  28. package/tests/cli-integ-tests/output/cdk-ci-output-to-stderr.integtest.d.ts +1 -0
  29. package/tests/cli-integ-tests/output/cdk-ci-true-output-to-stdout.integtest.d.ts +1 -0
  30. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-idempotent-and-force.integtest.d.ts +1 -0
  31. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-idempotent-and-force.integtest.js +18 -0
  32. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-then-deploy.integtest.d.ts +1 -0
  33. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-then-deploy.integtest.js +17 -0
  34. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-without-deploying.integtest.d.ts +1 -0
  35. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-without-deploying.integtest.js +15 -0
  36. package/tests/telemetry-integ-tests/cdk-synth-telemetry.integtest.js +4 -1
  37. package/tests/cli-integ-tests/deploy/cdk-fast-deploy.integtest.js +0 -33
  38. /package/tests/cli-integ-tests/{ci-output/cdk-ci-output-to-stderr.integtest.d.ts → deploy/cdk-deploy-guard-hook-failure-displays-annotations.integtest.d.ts} +0 -0
  39. /package/tests/cli-integ-tests/{ci-output/cdk-ci-true-output-to-stdout.integtest.d.ts → deploy/cdk-deploy-skips-unnecessary-updates-for-nested-stacks.integtest.d.ts} +0 -0
  40. /package/tests/cli-integ-tests/{deploy/cdk-fast-deploy.integtest.d.ts → diff/cdk-cdk-diff---method-change-set-can-be-run-twice-on-a-new-stack.integtest.d.ts} +0 -0
  41. /package/tests/cli-integ-tests/{ci-output → output}/cdk-ci-output-to-stderr.integtest.js +0 -0
  42. /package/tests/cli-integ-tests/{ci-output → output}/cdk-ci-true-output-to-stdout.integtest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-cdk-testing/cli-integ",
3
- "version": "3.28.0",
3
+ "version": "3.29.0",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -646,16 +646,6 @@
646
646
  "tslib": "^2.6.2"
647
647
  }
648
648
  },
649
- "axios": {
650
- "version": "1.14.0",
651
- "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==",
652
- "resolved": "https://registry.yarnpkg.com/axios/-/axios-1.14.0.tgz#7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb",
653
- "requires": {
654
- "follow-redirects": "^1.15.11",
655
- "form-data": "^4.0.5",
656
- "proxy-from-env": "^2.1.0"
657
- }
658
- },
659
649
  "chalk": {
660
650
  "version": "4.1.2",
661
651
  "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
@@ -884,11 +874,6 @@
884
874
  "pac-proxy-agent": "8.0.0"
885
875
  },
886
876
  "dependencies": {
887
- "proxy-from-env": {
888
- "version": "1.1.0",
889
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
890
- "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
891
- },
892
877
  "https-proxy-agent": {
893
878
  "version": "8.0.0",
894
879
  "integrity": "sha512-YYeW+iCnAS3xhvj2dvVoWgsbca3RfQy/IlaNHHOtDmU0jMqPI9euIq3Y9BJETdxk16h9NHHCKqp/KB9nIMStCQ==",
@@ -1988,28 +1973,6 @@
1988
1973
  "@smithy/types": "^4.13.1"
1989
1974
  }
1990
1975
  },
1991
- "follow-redirects": {
1992
- "version": "1.15.11",
1993
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
1994
- "resolved": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
1995
- },
1996
- "form-data": {
1997
- "version": "4.0.5",
1998
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
1999
- "resolved": "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053",
2000
- "requires": {
2001
- "asynckit": "^0.4.0",
2002
- "combined-stream": "^1.0.8",
2003
- "es-set-tostringtag": "^2.1.0",
2004
- "hasown": "^2.0.2",
2005
- "mime-types": "^2.1.12"
2006
- }
2007
- },
2008
- "proxy-from-env": {
2009
- "version": "2.1.0",
2010
- "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
2011
- "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba"
2012
- },
2013
1976
  "ansi-styles": {
2014
1977
  "version": "4.3.0",
2015
1978
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
@@ -3360,6 +3323,11 @@
3360
3323
  "ms": "^2.1.3"
3361
3324
  }
3362
3325
  },
3326
+ "proxy-from-env": {
3327
+ "version": "1.1.0",
3328
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
3329
+ "resolved": "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
3330
+ },
3363
3331
  "agent-base": {
3364
3332
  "version": "8.0.0",
3365
3333
  "integrity": "sha512-QT8i0hCz6C/KQ+KTAbSNwCHDGdmUJl2tp2ZpNlGSWCfhUNVbYG2WLE3MdZGBAgXPV4GAvjGMxo+C1hroyxmZEg==",
@@ -3827,46 +3795,6 @@
3827
3795
  "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
3828
3796
  "resolved": "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa"
3829
3797
  },
3830
- "asynckit": {
3831
- "version": "0.4.0",
3832
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
3833
- "resolved": "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
3834
- },
3835
- "combined-stream": {
3836
- "version": "1.0.8",
3837
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
3838
- "resolved": "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f",
3839
- "requires": {
3840
- "delayed-stream": "~1.0.0"
3841
- }
3842
- },
3843
- "es-set-tostringtag": {
3844
- "version": "2.1.0",
3845
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
3846
- "resolved": "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d",
3847
- "requires": {
3848
- "es-errors": "^1.3.0",
3849
- "get-intrinsic": "^1.2.6",
3850
- "has-tostringtag": "^1.0.2",
3851
- "hasown": "^2.0.2"
3852
- }
3853
- },
3854
- "hasown": {
3855
- "version": "2.0.2",
3856
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
3857
- "resolved": "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003",
3858
- "requires": {
3859
- "function-bind": "^1.1.2"
3860
- }
3861
- },
3862
- "mime-types": {
3863
- "version": "2.1.35",
3864
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
3865
- "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a",
3866
- "requires": {
3867
- "mime-db": "1.52.0"
3868
- }
3869
- },
3870
3798
  "color-convert": {
3871
3799
  "version": "2.0.1",
3872
3800
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
@@ -5432,51 +5360,6 @@
5432
5360
  "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
5433
5361
  "resolved": "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3"
5434
5362
  },
5435
- "delayed-stream": {
5436
- "version": "1.0.0",
5437
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
5438
- "resolved": "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
5439
- },
5440
- "es-errors": {
5441
- "version": "1.3.0",
5442
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
5443
- "resolved": "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
5444
- },
5445
- "get-intrinsic": {
5446
- "version": "1.3.0",
5447
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
5448
- "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01",
5449
- "requires": {
5450
- "call-bind-apply-helpers": "^1.0.2",
5451
- "es-define-property": "^1.0.1",
5452
- "es-errors": "^1.3.0",
5453
- "es-object-atoms": "^1.1.1",
5454
- "function-bind": "^1.1.2",
5455
- "get-proto": "^1.0.1",
5456
- "gopd": "^1.2.0",
5457
- "has-symbols": "^1.1.0",
5458
- "hasown": "^2.0.2",
5459
- "math-intrinsics": "^1.1.0"
5460
- }
5461
- },
5462
- "has-tostringtag": {
5463
- "version": "1.0.2",
5464
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
5465
- "resolved": "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc",
5466
- "requires": {
5467
- "has-symbols": "^1.0.3"
5468
- }
5469
- },
5470
- "function-bind": {
5471
- "version": "1.1.2",
5472
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
5473
- "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
5474
- },
5475
- "mime-db": {
5476
- "version": "1.52.0",
5477
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
5478
- "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
5479
- },
5480
5363
  "color-name": {
5481
5364
  "version": "1.1.4",
5482
5365
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
@@ -6260,6 +6143,14 @@
6260
6143
  "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
6261
6144
  "resolved": "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
6262
6145
  },
6146
+ "mime-types": {
6147
+ "version": "2.1.35",
6148
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
6149
+ "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a",
6150
+ "requires": {
6151
+ "mime-db": "1.52.0"
6152
+ }
6153
+ },
6263
6154
  "whatwg-url": {
6264
6155
  "version": "5.0.0",
6265
6156
  "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
@@ -6440,52 +6331,6 @@
6440
6331
  "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
6441
6332
  "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
6442
6333
  },
6443
- "call-bind-apply-helpers": {
6444
- "version": "1.0.2",
6445
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
6446
- "resolved": "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6",
6447
- "requires": {
6448
- "es-errors": "^1.3.0",
6449
- "function-bind": "^1.1.2"
6450
- }
6451
- },
6452
- "es-define-property": {
6453
- "version": "1.0.1",
6454
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
6455
- "resolved": "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
6456
- },
6457
- "es-object-atoms": {
6458
- "version": "1.1.1",
6459
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
6460
- "resolved": "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1",
6461
- "requires": {
6462
- "es-errors": "^1.3.0"
6463
- }
6464
- },
6465
- "get-proto": {
6466
- "version": "1.0.1",
6467
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
6468
- "resolved": "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1",
6469
- "requires": {
6470
- "dunder-proto": "^1.0.1",
6471
- "es-object-atoms": "^1.0.0"
6472
- }
6473
- },
6474
- "gopd": {
6475
- "version": "1.2.0",
6476
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
6477
- "resolved": "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
6478
- },
6479
- "has-symbols": {
6480
- "version": "1.1.0",
6481
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
6482
- "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
6483
- },
6484
- "math-intrinsics": {
6485
- "version": "1.1.0",
6486
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
6487
- "resolved": "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
6488
- },
6489
6334
  "queue-microtask": {
6490
6335
  "version": "1.2.3",
6491
6336
  "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
@@ -7111,6 +6956,11 @@
7111
6956
  "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
7112
6957
  "resolved": "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
7113
6958
  },
6959
+ "es-errors": {
6960
+ "version": "1.3.0",
6961
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
6962
+ "resolved": "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
6963
+ },
7114
6964
  "object-inspect": {
7115
6965
  "version": "1.13.4",
7116
6966
  "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
@@ -7148,6 +6998,11 @@
7148
6998
  "side-channel-map": "^1.0.1"
7149
6999
  }
7150
7000
  },
7001
+ "mime-db": {
7002
+ "version": "1.52.0",
7003
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
7004
+ "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
7005
+ },
7151
7006
  "tr46": {
7152
7007
  "version": "0.0.3",
7153
7008
  "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
@@ -7191,16 +7046,6 @@
7191
7046
  "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
7192
7047
  "resolved": "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a"
7193
7048
  },
7194
- "dunder-proto": {
7195
- "version": "1.0.1",
7196
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
7197
- "resolved": "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a",
7198
- "requires": {
7199
- "call-bind-apply-helpers": "^1.0.1",
7200
- "es-errors": "^1.3.0",
7201
- "gopd": "^1.2.0"
7202
- }
7203
- },
7204
7049
  "is-number": {
7205
7050
  "version": "7.0.0",
7206
7051
  "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
@@ -7325,6 +7170,14 @@
7325
7170
  "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
7326
7171
  "resolved": "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
7327
7172
  },
7173
+ "hasown": {
7174
+ "version": "2.0.2",
7175
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
7176
+ "resolved": "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003",
7177
+ "requires": {
7178
+ "function-bind": "^1.1.2"
7179
+ }
7180
+ },
7328
7181
  "p-locate": {
7329
7182
  "version": "4.1.0",
7330
7183
  "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
@@ -7352,6 +7205,23 @@
7352
7205
  "get-intrinsic": "^1.3.0"
7353
7206
  }
7354
7207
  },
7208
+ "get-intrinsic": {
7209
+ "version": "1.3.0",
7210
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
7211
+ "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01",
7212
+ "requires": {
7213
+ "call-bind-apply-helpers": "^1.0.2",
7214
+ "es-define-property": "^1.0.1",
7215
+ "es-errors": "^1.3.0",
7216
+ "es-object-atoms": "^1.1.1",
7217
+ "function-bind": "^1.1.2",
7218
+ "get-proto": "^1.0.1",
7219
+ "gopd": "^1.2.0",
7220
+ "has-symbols": "^1.1.0",
7221
+ "hasown": "^2.0.2",
7222
+ "math-intrinsics": "^1.1.0"
7223
+ }
7224
+ },
7355
7225
  "estraverse": {
7356
7226
  "version": "5.3.0",
7357
7227
  "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
@@ -7409,6 +7279,57 @@
7409
7279
  "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
7410
7280
  "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
7411
7281
  },
7282
+ "function-bind": {
7283
+ "version": "1.1.2",
7284
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
7285
+ "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
7286
+ },
7287
+ "call-bind-apply-helpers": {
7288
+ "version": "1.0.2",
7289
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
7290
+ "resolved": "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6",
7291
+ "requires": {
7292
+ "es-errors": "^1.3.0",
7293
+ "function-bind": "^1.1.2"
7294
+ }
7295
+ },
7296
+ "es-define-property": {
7297
+ "version": "1.0.1",
7298
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
7299
+ "resolved": "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
7300
+ },
7301
+ "es-object-atoms": {
7302
+ "version": "1.1.1",
7303
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
7304
+ "resolved": "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1",
7305
+ "requires": {
7306
+ "es-errors": "^1.3.0"
7307
+ }
7308
+ },
7309
+ "get-proto": {
7310
+ "version": "1.0.1",
7311
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
7312
+ "resolved": "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1",
7313
+ "requires": {
7314
+ "dunder-proto": "^1.0.1",
7315
+ "es-object-atoms": "^1.0.0"
7316
+ }
7317
+ },
7318
+ "gopd": {
7319
+ "version": "1.2.0",
7320
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
7321
+ "resolved": "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
7322
+ },
7323
+ "has-symbols": {
7324
+ "version": "1.1.0",
7325
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
7326
+ "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
7327
+ },
7328
+ "math-intrinsics": {
7329
+ "version": "1.1.0",
7330
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
7331
+ "resolved": "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
7332
+ },
7412
7333
  "sprintf-js": {
7413
7334
  "version": "1.0.3",
7414
7335
  "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
@@ -7418,6 +7339,16 @@
7418
7339
  "version": "2.2.0",
7419
7340
  "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
7420
7341
  "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
7342
+ },
7343
+ "dunder-proto": {
7344
+ "version": "1.0.1",
7345
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
7346
+ "resolved": "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a",
7347
+ "requires": {
7348
+ "call-bind-apply-helpers": "^1.0.1",
7349
+ "es-errors": "^1.3.0",
7350
+ "gopd": "^1.2.0"
7351
+ }
7421
7352
  }
7422
7353
  }
7423
7354
  }
package/package.json CHANGED
@@ -39,7 +39,7 @@
39
39
  "organization": true
40
40
  },
41
41
  "devDependencies": {
42
- "@aws-cdk/toolkit-lib": "1.20.0",
42
+ "@aws-cdk/toolkit-lib": "1.21.0",
43
43
  "@aws-cdk/yarn-cling": "0.0.0",
44
44
  "@cdklabs/eslint-plugin": "^1.5.9",
45
45
  "@stylistic/eslint-plugin": "^3",
@@ -84,7 +84,6 @@
84
84
  "@octokit/rest": "^20",
85
85
  "@smithy/types": "^4.13.1",
86
86
  "@smithy/util-retry": "^4.2.12",
87
- "axios": "^1",
88
87
  "chalk": "^4",
89
88
  "fast-glob": "^3.3.3",
90
89
  "fs-extra": "^9",
@@ -116,7 +115,7 @@
116
115
  "publishConfig": {
117
116
  "access": "public"
118
117
  },
119
- "version": "3.28.0",
118
+ "version": "3.29.0",
120
119
  "types": "lib/index.d.ts",
121
120
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
122
121
  }
@@ -0,0 +1,99 @@
1
+ const cdk = require('aws-cdk-lib/core');
2
+ const s3 = require('aws-cdk-lib/aws-s3');
3
+ const iam = require('aws-cdk-lib/aws-iam');
4
+ const s3deploy = require('aws-cdk-lib/aws-s3-deployment');
5
+
6
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
7
+ if (!stackPrefix) {
8
+ throw new Error('the STACK_NAME_PREFIX environment variable is required');
9
+ }
10
+
11
+ const guardRuleKey = 'rules/AWS_S3_Bucket_AccessControl.guard';
12
+
13
+ const guardRuleContent = `rule AWS_S3_Bucket_AccessControl
14
+ {
15
+ let resources = Resources.*[ Type == "AWS::S3::Bucket" ]
16
+ %resources[*] {
17
+ Properties.AccessControl not exists
18
+ <<
19
+ AccessControl is deprecated
20
+ >>
21
+ }
22
+ }`;
23
+
24
+ // Setup Guard Hook that will evaluate and fail the test stack
25
+ class GuardHookSetupStack extends cdk.Stack {
26
+ constructor(scope, id, props) {
27
+ super(scope, id, props);
28
+
29
+ // S3 bucket for Guard rules
30
+ const rulesBucket = new s3.Bucket(this, 'RulesBucket', {
31
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
32
+ autoDeleteObjects: true,
33
+ });
34
+
35
+ // S3 bucket for Guard logs
36
+ const logsBucket = new s3.Bucket(this, 'LogsBucket', {
37
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
38
+ autoDeleteObjects: true,
39
+ });
40
+
41
+ // Upload Guard rule to rules bucket
42
+ new s3deploy.BucketDeployment(this, 'UploadGuardRule', {
43
+ sources: [s3deploy.Source.data(guardRuleKey, guardRuleContent)],
44
+ destinationBucket: rulesBucket,
45
+ });
46
+
47
+ // IAM role for Guard Hook execution
48
+ const hookRole = new iam.Role(this, 'GuardHookExecutionRole', {
49
+ assumedBy: new iam.ServicePrincipal('hooks.cloudformation.amazonaws.com'),
50
+ });
51
+ hookRole.addToPolicy(new iam.PolicyStatement({
52
+ effect: iam.Effect.ALLOW,
53
+ actions: ['s3:ListBucket', 's3:GetObject', 's3:GetObjectVersion'],
54
+ resources: [rulesBucket.bucketArn, rulesBucket.arnForObjects('*')],
55
+ }));
56
+ hookRole.addToPolicy(new iam.PolicyStatement({
57
+ effect: iam.Effect.ALLOW,
58
+ actions: ['s3:PutObject'],
59
+ resources: [logsBucket.arnForObjects('*')],
60
+ }));
61
+
62
+ // Guard Hook - activates and configures the AWS Guard Hook in this account/region
63
+ new cdk.CfnGuardHook(this, 'GuardHook', {
64
+ alias: 'Private::Guard::TestHook',
65
+ executionRole: hookRole.roleArn,
66
+ failureMode: 'FAIL',
67
+ hookStatus: 'ENABLED',
68
+ ruleLocation: {
69
+ uri: `s3://${rulesBucket.bucketName}/${guardRuleKey}`,
70
+ },
71
+ logBucket: logsBucket.bucketName,
72
+ targetOperations: ['RESOURCE'],
73
+ stackFilters: {
74
+ filteringCriteria: "ANY",
75
+ stackNames: {
76
+ // Do not evalute this stack with the hook
77
+ exclude: [cdk.Aws.STACK_NAME]
78
+ }
79
+ }
80
+ });
81
+ }
82
+ }
83
+
84
+ class GuardHookTestStack extends cdk.Stack {
85
+ constructor(scope, id, props) {
86
+ super(scope, id, props);
87
+
88
+ // This bucket violates the Guard rule by using the deprecated AccessControl property
89
+ new s3.CfnBucket(this, 'NonCompliantBucket', {
90
+ accessControl: 'Private',
91
+ });
92
+ }
93
+ }
94
+
95
+ const app = new cdk.App();
96
+ new GuardHookSetupStack(app, `${stackPrefix}-guard-hook-setup`);
97
+ new GuardHookTestStack(app, `${stackPrefix}-guard-hook-test`);
98
+
99
+ app.synth();
@@ -0,0 +1,4 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false
4
+ }
@@ -0,0 +1,38 @@
1
+ const { Stack, App } = require('aws-cdk-lib/core');
2
+ const { NestedStack } = require('aws-cdk-lib/aws-cloudformation');
3
+ const iam = require('aws-cdk-lib/aws-iam');
4
+ const sns = require('aws-cdk-lib/aws-sns');
5
+
6
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
7
+ if (!stackPrefix) {
8
+ throw new Error('the STACK_NAME_PREFIX environment variable is required');
9
+ }
10
+
11
+ class IamNestedStack extends NestedStack {
12
+ constructor(scope, id) {
13
+ super(scope, id);
14
+ new iam.Role(this, 'NestedRole', {
15
+ assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
16
+ });
17
+ }
18
+ }
19
+
20
+ class NoSecurityNestedStack extends NestedStack {
21
+ constructor(scope, id) {
22
+ super(scope, id);
23
+ new sns.Topic(this, 'Topic');
24
+ }
25
+ }
26
+
27
+ class ParentStack extends Stack {
28
+ constructor(scope, id) {
29
+ super(scope, id);
30
+ new IamNestedStack(this, 'IamNested');
31
+ new NoSecurityNestedStack(this, 'NoSecurityNested');
32
+ new IamNestedStack(this, 'AnotherIamNested');
33
+ }
34
+ }
35
+
36
+ const app = new App();
37
+ new ParentStack(app, `${stackPrefix}-nested-iam`);
38
+ app.synth();
@@ -0,0 +1,7 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false,
4
+ "context": {
5
+ "aws-cdk:enableDiffNoFail": "true"
6
+ }
7
+ }
@@ -0,0 +1,29 @@
1
+ var cdk = require('aws-cdk-lib');
2
+ var tty = require('tty');
3
+
4
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
5
+ if (!stackPrefix) {
6
+ throw new Error(`the STACK_NAME_PREFIX environment variable is required`);
7
+ }
8
+
9
+ class MyStack extends cdk.Stack {
10
+ constructor(parent, id, props) {
11
+ super(parent, id, props);
12
+ new cdk.aws_sns.Topic(this, 'topic');
13
+ }
14
+ }
15
+
16
+ if (!tty.isatty(1) || !tty.isatty(2)) {
17
+ throw new Error('stdout or stderr is not attached to a TTY');
18
+ }
19
+
20
+ const app = new cdk.App();
21
+
22
+ const env = {
23
+ account: process.env.CDK_DEFAULT_ACCOUNT,
24
+ region: process.env.CDK_DEFAULT_REGION
25
+ };
26
+
27
+ new MyStack(app, `${stackPrefix}-MyStack`, { env });
28
+
29
+ app.synth();
@@ -0,0 +1,4 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false
4
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ jest.setTimeout(2 * 60 * 60_000);
5
+ (0, lib_1.integTest)('deploy with guard hook failure displays hook annoations', (0, lib_1.withSpecificFixture)('guard-hook-app', async (fixture) => {
6
+ // Deploy the setup stack which creates the Guard Hook via CloudFormation
7
+ await fixture.cdkDeploy('guard-hook-setup');
8
+ // Attempt to deploy non-compliant stack (should fail due to Guard Hook)
9
+ const deployOutput = await fixture.cdkDeploy('guard-hook-test', {
10
+ options: ['--no-rollback'],
11
+ allowErrExit: true,
12
+ });
13
+ expect(deployOutput).toContain('CREATE_FAILED');
14
+ expect(deployOutput).toContain('NonCompliant Rules:');
15
+ expect(deployOutput).toContain('[AWS_S3_Bucket_AccessControl]');
16
+ expect(deployOutput).toContain('• Check was not compliant as property [/Resources/NonCompliantBucket/Properties/AccessControl[L:0,C:91]] existed.');
17
+ expect(deployOutput).toContain('Remediation: AccessControl is deprecated');
18
+ }));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1ndWFyZC1ob29rLWZhaWx1cmUtZGlzcGxheXMtYW5ub3RhdGlvbnMuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlcGxveS1ndWFyZC1ob29rLWZhaWx1cmUtZGlzcGxheXMtYW5ub3RhdGlvbnMuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUVqQyxJQUFBLGVBQVMsRUFDUCx5REFBeUQsRUFDekQsSUFBQSx5QkFBbUIsRUFBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDdEQseUVBQXlFO0lBQ3pFLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTVDLHdFQUF3RTtJQUN4RSxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUU7UUFDOUQsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO1FBQzFCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNoRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLG1IQUFtSCxDQUFDLENBQUM7SUFDcEosTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhTcGVjaWZpY0ZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTtcblxuaW50ZWdUZXN0KFxuICAnZGVwbG95IHdpdGggZ3VhcmQgaG9vayBmYWlsdXJlIGRpc3BsYXlzIGhvb2sgYW5ub2F0aW9ucycsXG4gIHdpdGhTcGVjaWZpY0ZpeHR1cmUoJ2d1YXJkLWhvb2stYXBwJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBEZXBsb3kgdGhlIHNldHVwIHN0YWNrIHdoaWNoIGNyZWF0ZXMgdGhlIEd1YXJkIEhvb2sgdmlhIENsb3VkRm9ybWF0aW9uXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2d1YXJkLWhvb2stc2V0dXAnKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gZGVwbG95IG5vbi1jb21wbGlhbnQgc3RhY2sgKHNob3VsZCBmYWlsIGR1ZSB0byBHdWFyZCBIb29rKVxuICAgIGNvbnN0IGRlcGxveU91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdndWFyZC1ob29rLXRlc3QnLCB7XG4gICAgICBvcHRpb25zOiBbJy0tbm8tcm9sbGJhY2snXSxcbiAgICAgIGFsbG93RXJyRXhpdDogdHJ1ZSxcbiAgICB9KTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ0NSRUFURV9GQUlMRUQnKTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ05vbkNvbXBsaWFudCBSdWxlczonKTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ1tBV1NfUzNfQnVja2V0X0FjY2Vzc0NvbnRyb2xdJyk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9Db250YWluKCfigKIgQ2hlY2sgd2FzIG5vdCBjb21wbGlhbnQgYXMgcHJvcGVydHkgWy9SZXNvdXJjZXMvTm9uQ29tcGxpYW50QnVja2V0L1Byb3BlcnRpZXMvQWNjZXNzQ29udHJvbFtMOjAsQzo5MV1dIGV4aXN0ZWQuJyk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9Db250YWluKCdSZW1lZGlhdGlvbjogQWNjZXNzQ29udHJvbCBpcyBkZXByZWNhdGVkJyk7XG4gIH0pLFxuKTtcbiJdfQ==