@aws-solutions-constructs/aws-cloudfront-s3 2.46.0 → 2.48.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 (36) hide show
  1. package/.eslintignore +2 -2
  2. package/.jsii +61 -24
  3. package/README.md +7 -6
  4. package/lib/index.d.ts +1 -0
  5. package/lib/index.js +70 -8
  6. package/package.json +7 -5
  7. package/test/integ.cfts3-bucket-encrypted-with-cmk-provided-as-existingbucket.expected.json +958 -0
  8. package/test/integ.cfts3-bucket-encrypted-with-cmk-provided-as-existingbucket.js +44 -0
  9. package/test/integ.cfts3-bucket-encrypted-with-managed-key-provided-as-existingbucket.expected.json +592 -0
  10. package/test/integ.cfts3-bucket-encrypted-with-managed-key-provided-as-existingbucket.js +39 -0
  11. package/test/integ.cfts3-bucket-with-http-origin.d.ts +13 -0
  12. package/test/integ.cfts3-bucket-with-http-origin.expected.json +559 -0
  13. package/test/integ.cfts3-bucket-with-http-origin.js +44 -0
  14. package/test/integ.cfts3-cmk-encryption.expected.json +527 -0
  15. package/test/integ.cfts3-cmk-provided-as-bucket-prop.d.ts +13 -0
  16. package/test/integ.cfts3-cmk-provided-as-bucket-prop.expected.json +958 -0
  17. package/test/integ.cfts3-cmk-provided-as-bucket-prop.js +41 -0
  18. package/test/integ.cfts3-custom-headers.expected.json +307 -27
  19. package/test/integ.cfts3-custom-headers.js +6 -2
  20. package/test/integ.cfts3-custom-originPath.expected.json +307 -27
  21. package/test/integ.cfts3-custom-originPath.js +6 -2
  22. package/test/integ.cfts3-customCloudFrontLoggingBucket.expected.json +54 -23
  23. package/test/integ.cfts3-customLoggingBuckets.d.ts +13 -0
  24. package/test/{integ.cfts3-customLoggingBucket.expected.json → integ.cfts3-customLoggingBuckets.expected.json} +285 -31
  25. package/test/integ.cfts3-customLoggingBuckets.js +58 -0
  26. package/test/integ.cfts3-existing-bucket.expected.json +493 -80
  27. package/test/integ.cfts3-existing-bucket.js +2 -2
  28. package/test/integ.cfts3-no-arguments.expected.json +430 -27
  29. package/test/integ.cfts3-no-arguments.js +5 -2
  30. package/test/integ.cfts3-no-security-headers.expected.json +307 -27
  31. package/test/integ.cfts3-no-security-headers.js +5 -1
  32. package/test/test.cloudfront-s3.test.js +149 -28
  33. package/test/integ.cfts3-customCloudFrontLoggingBucket.js +0 -39
  34. package/test/integ.cfts3-customLoggingBucket.js +0 -42
  35. /package/test/{integ.cfts3-customCloudFrontLoggingBucket.d.ts → integ.cfts3-bucket-encrypted-with-cmk-provided-as-existingbucket.d.ts} +0 -0
  36. /package/test/{integ.cfts3-customLoggingBucket.d.ts → integ.cfts3-bucket-encrypted-with-managed-key-provided-as-existingbucket.d.ts} +0 -0
@@ -12,7 +12,19 @@
12
12
  }
13
13
  ]
14
14
  },
15
- "BucketName": "custom-logging-bucket",
15
+ "LifecycleConfiguration": {
16
+ "Rules": [
17
+ {
18
+ "Status": "Enabled",
19
+ "Transitions": [
20
+ {
21
+ "StorageClass": "GLACIER",
22
+ "TransitionInDays": 7
23
+ }
24
+ ]
25
+ }
26
+ ]
27
+ },
16
28
  "PublicAccessBlockConfiguration": {
17
29
  "BlockPublicAcls": true,
18
30
  "BlockPublicPolicy": true,
@@ -315,14 +327,28 @@
315
327
  },
316
328
  {
317
329
  "Action": "s3:GetObject",
330
+ "Condition": {
331
+ "StringEquals": {
332
+ "AWS:SourceArn": {
333
+ "Fn::Join": [
334
+ "",
335
+ [
336
+ "arn:aws:cloudfront::",
337
+ {
338
+ "Ref": "AWS::AccountId"
339
+ },
340
+ ":distribution/",
341
+ {
342
+ "Ref": "testcloudfronts3CloudFrontDistribution0565DEE8"
343
+ }
344
+ ]
345
+ ]
346
+ }
347
+ }
348
+ },
318
349
  "Effect": "Allow",
319
350
  "Principal": {
320
- "CanonicalUser": {
321
- "Fn::GetAtt": [
322
- "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058",
323
- "S3CanonicalUserId"
324
- ]
325
- }
351
+ "Service": "cloudfront.amazonaws.com"
326
352
  },
327
353
  "Resource": {
328
354
  "Fn::Join": [
@@ -379,16 +405,15 @@
379
405
  "AutoPublish": true,
380
406
  "FunctionCode": "function handler(event) { var response = event.response; var headers = response.headers; headers['strict-transport-security'] = { value: 'max-age=63072000; includeSubdomains; preload'}; headers['content-security-policy'] = { value: \"default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'\"}; headers['x-content-type-options'] = { value: 'nosniff'}; headers['x-frame-options'] = {value: 'DENY'}; headers['x-xss-protection'] = {value: '1; mode=block'}; return response; }",
381
407
  "FunctionConfig": {
382
- "Comment": "SetHttpSecurityHeadersc8c3d2243132d57b810e98b12d9e3c4c64e6e1cabe",
408
+ "Comment": "SetHttpSecurityHeadersc844fcbc00f82925aea73bcda195f6b5551bdcf3d4",
383
409
  "Runtime": "cloudfront-js-1.0"
384
410
  },
385
- "Name": "SetHttpSecurityHeadersc8c3d2243132d57b810e98b12d9e3c4c64e6e1cabe"
411
+ "Name": "SetHttpSecurityHeadersc844fcbc00f82925aea73bcda195f6b5551bdcf3d4"
386
412
  }
387
413
  },
388
- "testcloudfronts3CloudfrontLoggingBucket985C0FE8": {
414
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58": {
389
415
  "Type": "AWS::S3::Bucket",
390
416
  "Properties": {
391
- "AccessControl": "LogDeliveryWrite",
392
417
  "BucketEncryption": {
393
418
  "ServerSideEncryptionConfiguration": [
394
419
  {
@@ -398,6 +423,19 @@
398
423
  }
399
424
  ]
400
425
  },
426
+ "LifecycleConfiguration": {
427
+ "Rules": [
428
+ {
429
+ "Status": "Enabled",
430
+ "Transitions": [
431
+ {
432
+ "StorageClass": "GLACIER",
433
+ "TransitionInDays": 7
434
+ }
435
+ ]
436
+ }
437
+ ]
438
+ },
401
439
  "OwnershipControls": {
402
440
  "Rules": [
403
441
  {
@@ -428,12 +466,210 @@
428
466
  "rules_to_suppress": [
429
467
  {
430
468
  "id": "W35",
431
- "reason": "This S3 bucket is used as the access logging bucket for CloudFront Distribution"
469
+ "reason": "This S3 bucket is used as the access logging bucket for another bucket"
432
470
  }
433
471
  ]
434
472
  }
435
473
  }
436
474
  },
475
+ "testcloudfronts3CloudfrontLoggingBucketAccessLogPolicy526F2E14": {
476
+ "Type": "AWS::S3::BucketPolicy",
477
+ "Properties": {
478
+ "Bucket": {
479
+ "Ref": "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58"
480
+ },
481
+ "PolicyDocument": {
482
+ "Statement": [
483
+ {
484
+ "Action": "s3:*",
485
+ "Condition": {
486
+ "Bool": {
487
+ "aws:SecureTransport": "false"
488
+ }
489
+ },
490
+ "Effect": "Deny",
491
+ "Principal": {
492
+ "AWS": "*"
493
+ },
494
+ "Resource": [
495
+ {
496
+ "Fn::GetAtt": [
497
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58",
498
+ "Arn"
499
+ ]
500
+ },
501
+ {
502
+ "Fn::Join": [
503
+ "",
504
+ [
505
+ {
506
+ "Fn::GetAtt": [
507
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58",
508
+ "Arn"
509
+ ]
510
+ },
511
+ "/*"
512
+ ]
513
+ ]
514
+ }
515
+ ]
516
+ },
517
+ {
518
+ "Action": [
519
+ "s3:PutBucketPolicy",
520
+ "s3:GetBucket*",
521
+ "s3:List*",
522
+ "s3:DeleteObject*"
523
+ ],
524
+ "Effect": "Allow",
525
+ "Principal": {
526
+ "AWS": {
527
+ "Fn::GetAtt": [
528
+ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092",
529
+ "Arn"
530
+ ]
531
+ }
532
+ },
533
+ "Resource": [
534
+ {
535
+ "Fn::GetAtt": [
536
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58",
537
+ "Arn"
538
+ ]
539
+ },
540
+ {
541
+ "Fn::Join": [
542
+ "",
543
+ [
544
+ {
545
+ "Fn::GetAtt": [
546
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58",
547
+ "Arn"
548
+ ]
549
+ },
550
+ "/*"
551
+ ]
552
+ ]
553
+ }
554
+ ]
555
+ },
556
+ {
557
+ "Action": "s3:PutObject",
558
+ "Condition": {
559
+ "ArnLike": {
560
+ "aws:SourceArn": {
561
+ "Fn::GetAtt": [
562
+ "testcloudfronts3CloudfrontLoggingBucket985C0FE8",
563
+ "Arn"
564
+ ]
565
+ }
566
+ },
567
+ "StringEquals": {
568
+ "aws:SourceAccount": {
569
+ "Ref": "AWS::AccountId"
570
+ }
571
+ }
572
+ },
573
+ "Effect": "Allow",
574
+ "Principal": {
575
+ "Service": "logging.s3.amazonaws.com"
576
+ },
577
+ "Resource": {
578
+ "Fn::Join": [
579
+ "",
580
+ [
581
+ {
582
+ "Fn::GetAtt": [
583
+ "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58",
584
+ "Arn"
585
+ ]
586
+ },
587
+ "/*"
588
+ ]
589
+ ]
590
+ }
591
+ }
592
+ ],
593
+ "Version": "2012-10-17"
594
+ }
595
+ }
596
+ },
597
+ "testcloudfronts3CloudfrontLoggingBucketAccessLogAutoDeleteObjectsCustomResourceE16E063D": {
598
+ "Type": "Custom::S3AutoDeleteObjects",
599
+ "Properties": {
600
+ "ServiceToken": {
601
+ "Fn::GetAtt": [
602
+ "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F",
603
+ "Arn"
604
+ ]
605
+ },
606
+ "BucketName": {
607
+ "Ref": "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58"
608
+ }
609
+ },
610
+ "DependsOn": [
611
+ "testcloudfronts3CloudfrontLoggingBucketAccessLogPolicy526F2E14"
612
+ ],
613
+ "UpdateReplacePolicy": "Delete",
614
+ "DeletionPolicy": "Delete"
615
+ },
616
+ "testcloudfronts3CloudfrontLoggingBucket985C0FE8": {
617
+ "Type": "AWS::S3::Bucket",
618
+ "Properties": {
619
+ "AccessControl": "LogDeliveryWrite",
620
+ "BucketEncryption": {
621
+ "ServerSideEncryptionConfiguration": [
622
+ {
623
+ "ServerSideEncryptionByDefault": {
624
+ "SSEAlgorithm": "AES256"
625
+ }
626
+ }
627
+ ]
628
+ },
629
+ "LifecycleConfiguration": {
630
+ "Rules": [
631
+ {
632
+ "Status": "Enabled",
633
+ "Transitions": [
634
+ {
635
+ "StorageClass": "GLACIER",
636
+ "TransitionInDays": 7
637
+ }
638
+ ]
639
+ }
640
+ ]
641
+ },
642
+ "LoggingConfiguration": {
643
+ "DestinationBucketName": {
644
+ "Ref": "testcloudfronts3CloudfrontLoggingBucketAccessLog2E738D58"
645
+ }
646
+ },
647
+ "OwnershipControls": {
648
+ "Rules": [
649
+ {
650
+ "ObjectOwnership": "ObjectWriter"
651
+ }
652
+ ]
653
+ },
654
+ "PublicAccessBlockConfiguration": {
655
+ "BlockPublicAcls": true,
656
+ "BlockPublicPolicy": true,
657
+ "IgnorePublicAcls": true,
658
+ "RestrictPublicBuckets": true
659
+ },
660
+ "Tags": [
661
+ {
662
+ "Key": "aws-cdk:auto-delete-objects",
663
+ "Value": "true"
664
+ }
665
+ ],
666
+ "VersioningConfiguration": {
667
+ "Status": "Enabled"
668
+ }
669
+ },
670
+ "UpdateReplacePolicy": "Delete",
671
+ "DeletionPolicy": "Delete"
672
+ },
437
673
  "testcloudfronts3CloudfrontLoggingBucketPolicyDF55851B": {
438
674
  "Type": "AWS::S3::BucketPolicy",
439
675
  "Properties": {
@@ -539,11 +775,35 @@
539
775
  "UpdateReplacePolicy": "Delete",
540
776
  "DeletionPolicy": "Delete"
541
777
  },
542
- "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058": {
543
- "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity",
778
+ "testcloudfronts3CloudFrontOac7A951AA6": {
779
+ "Type": "AWS::CloudFront::OriginAccessControl",
544
780
  "Properties": {
545
- "CloudFrontOriginAccessIdentityConfig": {
546
- "Comment": "Identity for cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51"
781
+ "OriginAccessControlConfig": {
782
+ "Description": "Origin access control provisioned by aws-cloudfront-s3",
783
+ "Name": {
784
+ "Fn::Join": [
785
+ "",
786
+ [
787
+ "aws-cloudfront-s3-testnt-s3-",
788
+ {
789
+ "Fn::Select": [
790
+ 2,
791
+ {
792
+ "Fn::Split": [
793
+ "/",
794
+ {
795
+ "Ref": "AWS::StackId"
796
+ }
797
+ ]
798
+ }
799
+ ]
800
+ }
801
+ ]
802
+ ]
803
+ },
804
+ "OriginAccessControlOriginType": "s3",
805
+ "SigningBehavior": "always",
806
+ "SigningProtocol": "sigv4"
547
807
  }
548
808
  }
549
809
  },
@@ -565,7 +825,7 @@
565
825
  }
566
826
  }
567
827
  ],
568
- "TargetOriginId": "cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51",
828
+ "TargetOriginId": "cfts3customLoggingBucketstestcloudfronts3CloudFrontDistributionOrigin1BBEA7E26",
569
829
  "ViewerProtocolPolicy": "redirect-to-https"
570
830
  },
571
831
  "DefaultRootObject": "index.html",
@@ -588,20 +848,14 @@
588
848
  "RegionalDomainName"
589
849
  ]
590
850
  },
591
- "Id": "cfts3customLoggingBuckettestcloudfronts3CloudFrontDistributionOrigin169BF6A51",
592
- "S3OriginConfig": {
593
- "OriginAccessIdentity": {
594
- "Fn::Join": [
595
- "",
596
- [
597
- "origin-access-identity/cloudfront/",
598
- {
599
- "Ref": "testcloudfronts3CloudFrontDistributionOrigin1S3Origin4695F058"
600
- }
601
- ]
602
- ]
603
- }
604
- }
851
+ "Id": "cfts3customLoggingBucketstestcloudfronts3CloudFrontDistributionOrigin1BBEA7E26",
852
+ "OriginAccessControlId": {
853
+ "Fn::GetAtt": [
854
+ "testcloudfronts3CloudFrontOac7A951AA6",
855
+ "Id"
856
+ ]
857
+ },
858
+ "S3OriginConfig": {}
605
859
  }
606
860
  ]
607
861
  }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
6
+ * with the License. A copy of the License is located at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
11
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
12
+ * and limitations under the License.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ /// !cdk-integ *
16
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
17
+ const lib_1 = require("../lib");
18
+ const core_1 = require("@aws-solutions-constructs/core");
19
+ const s3 = require("aws-cdk-lib/aws-s3");
20
+ const app = new aws_cdk_lib_1.App();
21
+ // Empty arguments
22
+ const stack = new aws_cdk_lib_1.Stack(app, core_1.generateIntegStackName(__filename));
23
+ new lib_1.CloudFrontToS3(stack, 'test-cloudfront-s3', {
24
+ bucketProps: {
25
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
26
+ autoDeleteObjects: true
27
+ },
28
+ // Confirms custom log buckets for S3 AND CloudFront
29
+ loggingBucketProps: {
30
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
31
+ autoDeleteObjects: true,
32
+ // This functionality is inconsequential, it just confirms
33
+ // that these props continue to be utilized
34
+ lifecycleRules: [{
35
+ enabled: true,
36
+ transitions: [{
37
+ storageClass: s3.StorageClass.GLACIER,
38
+ transitionAfter: aws_cdk_lib_1.Duration.days(7)
39
+ }]
40
+ }]
41
+ },
42
+ cloudFrontLoggingBucketProps: {
43
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
44
+ autoDeleteObjects: true,
45
+ // This functionality is inconsequential, it just confirms
46
+ // that these props continue to be utilized
47
+ lifecycleRules: [{
48
+ enabled: true,
49
+ transitions: [{
50
+ storageClass: s3.StorageClass.GLACIER,
51
+ transitionAfter: aws_cdk_lib_1.Duration.days(7)
52
+ }]
53
+ }]
54
+ }
55
+ });
56
+ core_1.suppressAutoDeleteHandlerWarnings(stack);
57
+ app.synth();
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY2Z0czMtY3VzdG9tTG9nZ2luZ0J1Y2tldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy5jZnRzMy1jdXN0b21Mb2dnaW5nQnVja2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgsZ0JBQWdCO0FBQ2hCLDZDQUFrRTtBQUNsRSxnQ0FBd0M7QUFDeEMseURBQTJHO0FBQzNHLHlDQUF5QztBQUV6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztBQUV0QixrQkFBa0I7QUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSw2QkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBRWpFLElBQUksb0JBQWMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7SUFDOUMsV0FBVyxFQUFFO1FBQ1gsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztRQUNwQyxpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCO0lBQ0Qsb0RBQW9EO0lBQ3BELGtCQUFrQixFQUFFO1FBQ2xCLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87UUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QiwwREFBMEQ7UUFDMUQsMkNBQTJDO1FBQzNDLGNBQWMsRUFBRSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFdBQVcsRUFBRSxDQUFDO3dCQUNaLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU87d0JBQ3JDLGVBQWUsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7cUJBQ2xDLENBQUM7YUFDSCxDQUFDO0tBQ0g7SUFDRCw0QkFBNEIsRUFBRTtRQUM1QixhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1FBQ3BDLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsMERBQTBEO1FBQzFELDJDQUEyQztRQUMzQyxjQUFjLEVBQUUsQ0FBQztnQkFDZixPQUFPLEVBQUUsSUFBSTtnQkFDYixXQUFXLEVBQUUsQ0FBQzt3QkFDWixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPO3dCQUNyQyxlQUFlLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUNsQyxDQUFDO2FBQ0gsQ0FBQztLQUNIO0NBQ0YsQ0FBQyxDQUFDO0FBQ0gsd0NBQWlDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8vICFjZGstaW50ZWcgKlxuaW1wb3J0IHsgQXBwLCBTdGFjaywgUmVtb3ZhbFBvbGljeSwgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENsb3VkRnJvbnRUb1MzIH0gZnJvbSBcIi4uL2xpYlwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbnRlZ1N0YWNrTmFtZSwgc3VwcHJlc3NBdXRvRGVsZXRlSGFuZGxlcldhcm5pbmdzIH0gZnJvbSAnQGF3cy1zb2x1dGlvbnMtY29uc3RydWN0cy9jb3JlJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxuLy8gRW1wdHkgYXJndW1lbnRzXG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsIGdlbmVyYXRlSW50ZWdTdGFja05hbWUoX19maWxlbmFtZSkpO1xuXG5uZXcgQ2xvdWRGcm9udFRvUzMoc3RhY2ssICd0ZXN0LWNsb3VkZnJvbnQtczMnLCB7XG4gIGJ1Y2tldFByb3BzOiB7XG4gICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlXG4gIH0sXG4gIC8vIENvbmZpcm1zIGN1c3RvbSBsb2cgYnVja2V0cyBmb3IgUzMgQU5EIENsb3VkRnJvbnRcbiAgbG9nZ2luZ0J1Y2tldFByb3BzOiB7XG4gICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIC8vIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbmNvbnNlcXVlbnRpYWwsIGl0IGp1c3QgY29uZmlybXNcbiAgICAvLyB0aGF0IHRoZXNlIHByb3BzIGNvbnRpbnVlIHRvIGJlIHV0aWxpemVkXG4gICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdHJhbnNpdGlvbnM6IFt7XG4gICAgICAgIHN0b3JhZ2VDbGFzczogczMuU3RvcmFnZUNsYXNzLkdMQUNJRVIsXG4gICAgICAgIHRyYW5zaXRpb25BZnRlcjogRHVyYXRpb24uZGF5cyg3KVxuICAgICAgfV1cbiAgICB9XVxuICB9LFxuICBjbG91ZEZyb250TG9nZ2luZ0J1Y2tldFByb3BzOiB7XG4gICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIC8vIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbmNvbnNlcXVlbnRpYWwsIGl0IGp1c3QgY29uZmlybXNcbiAgICAvLyB0aGF0IHRoZXNlIHByb3BzIGNvbnRpbnVlIHRvIGJlIHV0aWxpemVkXG4gICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdHJhbnNpdGlvbnM6IFt7XG4gICAgICAgIHN0b3JhZ2VDbGFzczogczMuU3RvcmFnZUNsYXNzLkdMQUNJRVIsXG4gICAgICAgIHRyYW5zaXRpb25BZnRlcjogRHVyYXRpb24uZGF5cyg3KVxuICAgICAgfV1cbiAgICB9XVxuICB9XG59KTtcbnN1cHByZXNzQXV0b0RlbGV0ZUhhbmRsZXJXYXJuaW5ncyhzdGFjayk7XG5hcHAuc3ludGgoKTsiXX0=