projen-pipelines 0.3.24 → 0.3.25

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/.jsii CHANGED
@@ -945,7 +945,7 @@
945
945
  },
946
946
  "locationInModule": {
947
947
  "filename": "src/awscdk/base.ts",
948
- "line": 262
948
+ "line": 272
949
949
  },
950
950
  "parameters": [
951
951
  {
@@ -965,7 +965,7 @@
965
965
  "kind": "class",
966
966
  "locationInModule": {
967
967
  "filename": "src/awscdk/base.ts",
968
- "line": 249
968
+ "line": 259
969
969
  },
970
970
  "methods": [
971
971
  {
@@ -975,7 +975,7 @@
975
975
  },
976
976
  "locationInModule": {
977
977
  "filename": "src/awscdk/base.ts",
978
- "line": 504
978
+ "line": 513
979
979
  },
980
980
  "name": "createApplicationEntrypoint",
981
981
  "protected": true
@@ -987,7 +987,7 @@
987
987
  },
988
988
  "locationInModule": {
989
989
  "filename": "src/awscdk/base.ts",
990
- "line": 710
990
+ "line": 722
991
991
  },
992
992
  "name": "createFeatureStage",
993
993
  "protected": true
@@ -999,7 +999,7 @@
999
999
  },
1000
1000
  "locationInModule": {
1001
1001
  "filename": "src/awscdk/base.ts",
1002
- "line": 759
1002
+ "line": 771
1003
1003
  },
1004
1004
  "name": "createIndependentStage",
1005
1005
  "parameters": [
@@ -1022,7 +1022,7 @@
1022
1022
  },
1023
1023
  "locationInModule": {
1024
1024
  "filename": "src/awscdk/base.ts",
1025
- "line": 687
1025
+ "line": 699
1026
1026
  },
1027
1027
  "name": "createPersonalStage",
1028
1028
  "protected": true
@@ -1034,7 +1034,7 @@
1034
1034
  },
1035
1035
  "locationInModule": {
1036
1036
  "filename": "src/awscdk/base.ts",
1037
- "line": 733
1037
+ "line": 745
1038
1038
  },
1039
1039
  "name": "createPipelineStage",
1040
1040
  "parameters": [
@@ -1057,7 +1057,7 @@
1057
1057
  },
1058
1058
  "locationInModule": {
1059
1059
  "filename": "src/awscdk/base.ts",
1060
- "line": 632
1060
+ "line": 641
1061
1061
  },
1062
1062
  "name": "createReleaseTasks",
1063
1063
  "protected": true
@@ -1068,7 +1068,7 @@
1068
1068
  },
1069
1069
  "locationInModule": {
1070
1070
  "filename": "src/awscdk/base.ts",
1071
- "line": 490
1071
+ "line": 499
1072
1072
  },
1073
1073
  "name": "createSafeStageName",
1074
1074
  "parameters": [
@@ -1093,7 +1093,7 @@
1093
1093
  },
1094
1094
  "locationInModule": {
1095
1095
  "filename": "src/awscdk/base.ts",
1096
- "line": 792
1096
+ "line": 804
1097
1097
  },
1098
1098
  "name": "createVersionFetchTask",
1099
1099
  "parameters": [
@@ -1113,7 +1113,7 @@
1113
1113
  },
1114
1114
  "locationInModule": {
1115
1115
  "filename": "src/awscdk/base.ts",
1116
- "line": 324
1116
+ "line": 333
1117
1117
  },
1118
1118
  "name": "engineType",
1119
1119
  "returns": {
@@ -1129,7 +1129,7 @@
1129
1129
  },
1130
1130
  "locationInModule": {
1131
1131
  "filename": "src/awscdk/base.ts",
1132
- "line": 838
1132
+ "line": 850
1133
1133
  },
1134
1134
  "name": "generateVersioningAppCode",
1135
1135
  "parameters": [
@@ -1153,7 +1153,7 @@
1153
1153
  },
1154
1154
  "locationInModule": {
1155
1155
  "filename": "src/awscdk/base.ts",
1156
- "line": 852
1156
+ "line": 864
1157
1157
  },
1158
1158
  "name": "generateVersioningImports",
1159
1159
  "returns": {
@@ -1169,7 +1169,7 @@
1169
1169
  },
1170
1170
  "locationInModule": {
1171
1171
  "filename": "src/awscdk/base.ts",
1172
- "line": 865
1172
+ "line": 877
1173
1173
  },
1174
1174
  "name": "generateVersioningUtilities",
1175
1175
  "returns": {
@@ -1184,7 +1184,7 @@
1184
1184
  },
1185
1185
  "locationInModule": {
1186
1186
  "filename": "src/awscdk/base.ts",
1187
- "line": 781
1187
+ "line": 793
1188
1188
  },
1189
1189
  "name": "getCliStackPattern",
1190
1190
  "parameters": [
@@ -1208,7 +1208,7 @@
1208
1208
  },
1209
1209
  "locationInModule": {
1210
1210
  "filename": "src/awscdk/base.ts",
1211
- "line": 432
1211
+ "line": 441
1212
1212
  },
1213
1213
  "name": "provideAssemblyUploadStep",
1214
1214
  "protected": true,
@@ -1224,7 +1224,7 @@
1224
1224
  },
1225
1225
  "locationInModule": {
1226
1226
  "filename": "src/awscdk/base.ts",
1227
- "line": 398
1227
+ "line": 407
1228
1228
  },
1229
1229
  "name": "provideAssetUploadStep",
1230
1230
  "parameters": [
@@ -1249,7 +1249,7 @@
1249
1249
  },
1250
1250
  "locationInModule": {
1251
1251
  "filename": "src/awscdk/base.ts",
1252
- "line": 442
1252
+ "line": 451
1253
1253
  },
1254
1254
  "name": "provideDeployStep",
1255
1255
  "parameters": [
@@ -1273,7 +1273,7 @@
1273
1273
  },
1274
1274
  "locationInModule": {
1275
1275
  "filename": "src/awscdk/base.ts",
1276
- "line": 454
1276
+ "line": 463
1277
1277
  },
1278
1278
  "name": "provideDiffStep",
1279
1279
  "parameters": [
@@ -1304,7 +1304,7 @@
1304
1304
  },
1305
1305
  "locationInModule": {
1306
1306
  "filename": "src/awscdk/base.ts",
1307
- "line": 326
1307
+ "line": 335
1308
1308
  },
1309
1309
  "name": "provideInstallStep",
1310
1310
  "protected": true,
@@ -1320,7 +1320,7 @@
1320
1320
  },
1321
1321
  "locationInModule": {
1322
1322
  "filename": "src/awscdk/base.ts",
1323
- "line": 348
1323
+ "line": 357
1324
1324
  },
1325
1325
  "name": "provideSynthStep",
1326
1326
  "protected": true,
@@ -1336,7 +1336,7 @@
1336
1336
  },
1337
1337
  "locationInModule": {
1338
1338
  "filename": "src/awscdk/base.ts",
1339
- "line": 468
1339
+ "line": 477
1340
1340
  },
1341
1341
  "name": "renderInstallPackageCommands",
1342
1342
  "parameters": [
@@ -1376,7 +1376,7 @@
1376
1376
  "immutable": true,
1377
1377
  "locationInModule": {
1378
1378
  "filename": "src/awscdk/base.ts",
1379
- "line": 251
1379
+ "line": 261
1380
1380
  },
1381
1381
  "name": "branchName",
1382
1382
  "type": {
@@ -1391,7 +1391,7 @@
1391
1391
  "immutable": true,
1392
1392
  "locationInModule": {
1393
1393
  "filename": "src/awscdk/base.ts",
1394
- "line": 254
1394
+ "line": 264
1395
1395
  },
1396
1396
  "name": "namePrefix",
1397
1397
  "protected": true,
@@ -1406,7 +1406,7 @@
1406
1406
  "immutable": true,
1407
1407
  "locationInModule": {
1408
1408
  "filename": "src/awscdk/base.ts",
1409
- "line": 250
1409
+ "line": 260
1410
1410
  },
1411
1411
  "name": "stackPrefix",
1412
1412
  "type": {
@@ -1422,7 +1422,7 @@
1422
1422
  "immutable": true,
1423
1423
  "locationInModule": {
1424
1424
  "filename": "src/awscdk/base.ts",
1425
- "line": 260
1425
+ "line": 270
1426
1426
  },
1427
1427
  "name": "workingDirectory",
1428
1428
  "optional": true,
@@ -1437,7 +1437,7 @@
1437
1437
  },
1438
1438
  "locationInModule": {
1439
1439
  "filename": "src/awscdk/base.ts",
1440
- "line": 262
1440
+ "line": 272
1441
1441
  },
1442
1442
  "name": "app",
1443
1443
  "protected": true,
@@ -1451,7 +1451,7 @@
1451
1451
  },
1452
1452
  "locationInModule": {
1453
1453
  "filename": "src/awscdk/base.ts",
1454
- "line": 262
1454
+ "line": 272
1455
1455
  },
1456
1456
  "name": "baseOptions",
1457
1457
  "protected": true,
@@ -1515,6 +1515,25 @@
1515
1515
  }
1516
1516
  }
1517
1517
  },
1518
+ {
1519
+ "abstract": true,
1520
+ "docs": {
1521
+ "default": "- the CLI default (4)",
1522
+ "remarks": "Passed through as `--concurrency`. Higher values speed\nup publishing for stacks with many assets at the cost of more concurrent\nuploads.",
1523
+ "stability": "stable",
1524
+ "summary": "The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage."
1525
+ },
1526
+ "immutable": true,
1527
+ "locationInModule": {
1528
+ "filename": "src/awscdk/base.ts",
1529
+ "line": 252
1530
+ },
1531
+ "name": "assetPublishingConcurrency",
1532
+ "optional": true,
1533
+ "type": {
1534
+ "primitive": "number"
1535
+ }
1536
+ },
1518
1537
  {
1519
1538
  "abstract": true,
1520
1539
  "docs": {
@@ -9000,6 +9019,6 @@
9000
9019
  "symbolId": "src/versioning/types:VersioningStrategyComponents"
9001
9020
  }
9002
9021
  },
9003
- "version": "0.3.24",
9004
- "fingerprint": "ZorgTQB4h3gF6vzrrmgjL4sZ2EQwM4bvT0wvpg/EBFQ="
9022
+ "version": "0.3.25",
9023
+ "fingerprint": "oVyKVWPabyNBeXanBrkDhRyTOs1jvC2j4dtII33Q1kY="
9005
9024
  }
package/API.md CHANGED
@@ -3040,6 +3040,7 @@ const bashCDKPipelineOptions: BashCDKPipelineOptions = { ... }
3040
3040
  | --- | --- | --- |
3041
3041
  | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.iamRoleArns">iamRoleArns</a></code> | <code><a href="#projen-pipelines.IamRoleConfig">IamRoleConfig</a></code> | IAM config. |
3042
3042
  | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.stages">stages</a></code> | <code><a href="#projen-pipelines.DeploymentStage">DeploymentStage</a>[]</code> | This field specifies a list of stages that should be deployed using a CI/CD pipeline. |
3043
+ | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.assetPublishingConcurrency">assetPublishingConcurrency</a></code> | <code>number</code> | The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage. |
3043
3044
  | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.branchName">branchName</a></code> | <code>string</code> | the name of the branch to deploy from. |
3044
3045
  | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.deploySubStacks">deploySubStacks</a></code> | <code>boolean</code> | If set to true all CDK actions will also include <stackName>/* to deploy/diff/destroy sub stacks of the main stack. |
3045
3046
  | <code><a href="#projen-pipelines.BashCDKPipelineOptions.property.featureStages">featureStages</a></code> | <code><a href="#projen-pipelines.StageOptions">StageOptions</a></code> | This specifies details for feature stages. |
@@ -3085,6 +3086,23 @@ This field specifies a list of stages that should be deployed using a CI/CD pipe
3085
3086
 
3086
3087
  ---
3087
3088
 
3089
+ ##### `assetPublishingConcurrency`<sup>Optional</sup> <a name="assetPublishingConcurrency" id="projen-pipelines.BashCDKPipelineOptions.property.assetPublishingConcurrency"></a>
3090
+
3091
+ ```typescript
3092
+ public readonly assetPublishingConcurrency: number;
3093
+ ```
3094
+
3095
+ - *Type:* number
3096
+ - *Default:* the CLI default (4)
3097
+
3098
+ The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage.
3099
+
3100
+ Passed through as `--concurrency`. Higher values speed
3101
+ up publishing for stacks with many assets at the cost of more concurrent
3102
+ uploads.
3103
+
3104
+ ---
3105
+
3088
3106
  ##### `branchName`<sup>Optional</sup> <a name="branchName" id="projen-pipelines.BashCDKPipelineOptions.property.branchName"></a>
3089
3107
 
3090
3108
  ```typescript
@@ -3559,6 +3577,7 @@ const cDKPipelineOptions: CDKPipelineOptions = { ... }
3559
3577
  | --- | --- | --- |
3560
3578
  | <code><a href="#projen-pipelines.CDKPipelineOptions.property.iamRoleArns">iamRoleArns</a></code> | <code><a href="#projen-pipelines.IamRoleConfig">IamRoleConfig</a></code> | IAM config. |
3561
3579
  | <code><a href="#projen-pipelines.CDKPipelineOptions.property.stages">stages</a></code> | <code><a href="#projen-pipelines.DeploymentStage">DeploymentStage</a>[]</code> | This field specifies a list of stages that should be deployed using a CI/CD pipeline. |
3580
+ | <code><a href="#projen-pipelines.CDKPipelineOptions.property.assetPublishingConcurrency">assetPublishingConcurrency</a></code> | <code>number</code> | The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage. |
3562
3581
  | <code><a href="#projen-pipelines.CDKPipelineOptions.property.branchName">branchName</a></code> | <code>string</code> | the name of the branch to deploy from. |
3563
3582
  | <code><a href="#projen-pipelines.CDKPipelineOptions.property.deploySubStacks">deploySubStacks</a></code> | <code>boolean</code> | If set to true all CDK actions will also include <stackName>/* to deploy/diff/destroy sub stacks of the main stack. |
3564
3583
  | <code><a href="#projen-pipelines.CDKPipelineOptions.property.featureStages">featureStages</a></code> | <code><a href="#projen-pipelines.StageOptions">StageOptions</a></code> | This specifies details for feature stages. |
@@ -3604,6 +3623,23 @@ This field specifies a list of stages that should be deployed using a CI/CD pipe
3604
3623
 
3605
3624
  ---
3606
3625
 
3626
+ ##### `assetPublishingConcurrency`<sup>Optional</sup> <a name="assetPublishingConcurrency" id="projen-pipelines.CDKPipelineOptions.property.assetPublishingConcurrency"></a>
3627
+
3628
+ ```typescript
3629
+ public readonly assetPublishingConcurrency: number;
3630
+ ```
3631
+
3632
+ - *Type:* number
3633
+ - *Default:* the CLI default (4)
3634
+
3635
+ The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage.
3636
+
3637
+ Passed through as `--concurrency`. Higher values speed
3638
+ up publishing for stacks with many assets at the cost of more concurrent
3639
+ uploads.
3640
+
3641
+ ---
3642
+
3607
3643
  ##### `branchName`<sup>Optional</sup> <a name="branchName" id="projen-pipelines.CDKPipelineOptions.property.branchName"></a>
3608
3644
 
3609
3645
  ```typescript
@@ -4939,6 +4975,7 @@ const githubCDKPipelineOptions: GithubCDKPipelineOptions = { ... }
4939
4975
  | --- | --- | --- |
4940
4976
  | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.iamRoleArns">iamRoleArns</a></code> | <code><a href="#projen-pipelines.IamRoleConfig">IamRoleConfig</a></code> | IAM config. |
4941
4977
  | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.stages">stages</a></code> | <code><a href="#projen-pipelines.DeploymentStage">DeploymentStage</a>[]</code> | This field specifies a list of stages that should be deployed using a CI/CD pipeline. |
4978
+ | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.assetPublishingConcurrency">assetPublishingConcurrency</a></code> | <code>number</code> | The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage. |
4942
4979
  | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.branchName">branchName</a></code> | <code>string</code> | the name of the branch to deploy from. |
4943
4980
  | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.deploySubStacks">deploySubStacks</a></code> | <code>boolean</code> | If set to true all CDK actions will also include <stackName>/* to deploy/diff/destroy sub stacks of the main stack. |
4944
4981
  | <code><a href="#projen-pipelines.GithubCDKPipelineOptions.property.featureStages">featureStages</a></code> | <code><a href="#projen-pipelines.StageOptions">StageOptions</a></code> | This specifies details for feature stages. |
@@ -4988,6 +5025,23 @@ This field specifies a list of stages that should be deployed using a CI/CD pipe
4988
5025
 
4989
5026
  ---
4990
5027
 
5028
+ ##### `assetPublishingConcurrency`<sup>Optional</sup> <a name="assetPublishingConcurrency" id="projen-pipelines.GithubCDKPipelineOptions.property.assetPublishingConcurrency"></a>
5029
+
5030
+ ```typescript
5031
+ public readonly assetPublishingConcurrency: number;
5032
+ ```
5033
+
5034
+ - *Type:* number
5035
+ - *Default:* the CLI default (4)
5036
+
5037
+ The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage.
5038
+
5039
+ Passed through as `--concurrency`. Higher values speed
5040
+ up publishing for stacks with many assets at the cost of more concurrent
5041
+ uploads.
5042
+
5043
+ ---
5044
+
4991
5045
  ##### `branchName`<sup>Optional</sup> <a name="branchName" id="projen-pipelines.GithubCDKPipelineOptions.property.branchName"></a>
4992
5046
 
4993
5047
  ```typescript
@@ -5696,6 +5750,7 @@ const gitlabCDKPipelineOptions: GitlabCDKPipelineOptions = { ... }
5696
5750
  | --- | --- | --- |
5697
5751
  | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.iamRoleArns">iamRoleArns</a></code> | <code><a href="#projen-pipelines.IamRoleConfig">IamRoleConfig</a></code> | IAM config. |
5698
5752
  | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.stages">stages</a></code> | <code><a href="#projen-pipelines.DeploymentStage">DeploymentStage</a>[]</code> | This field specifies a list of stages that should be deployed using a CI/CD pipeline. |
5753
+ | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.assetPublishingConcurrency">assetPublishingConcurrency</a></code> | <code>number</code> | The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage. |
5699
5754
  | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.branchName">branchName</a></code> | <code>string</code> | the name of the branch to deploy from. |
5700
5755
  | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.deploySubStacks">deploySubStacks</a></code> | <code>boolean</code> | If set to true all CDK actions will also include <stackName>/* to deploy/diff/destroy sub stacks of the main stack. |
5701
5756
  | <code><a href="#projen-pipelines.GitlabCDKPipelineOptions.property.featureStages">featureStages</a></code> | <code><a href="#projen-pipelines.StageOptions">StageOptions</a></code> | This specifies details for feature stages. |
@@ -5743,6 +5798,23 @@ This field specifies a list of stages that should be deployed using a CI/CD pipe
5743
5798
 
5744
5799
  ---
5745
5800
 
5801
+ ##### `assetPublishingConcurrency`<sup>Optional</sup> <a name="assetPublishingConcurrency" id="projen-pipelines.GitlabCDKPipelineOptions.property.assetPublishingConcurrency"></a>
5802
+
5803
+ ```typescript
5804
+ public readonly assetPublishingConcurrency: number;
5805
+ ```
5806
+
5807
+ - *Type:* number
5808
+ - *Default:* the CLI default (4)
5809
+
5810
+ The number of asset uploads the `cdk publish-assets` subcommand runs in parallel per stage.
5811
+
5812
+ Passed through as `--concurrency`. Higher values speed
5813
+ up publishing for stacks with many assets at the cost of more concurrent
5814
+ uploads.
5815
+
5816
+ ---
5817
+
5746
5818
  ##### `branchName`<sup>Optional</sup> <a name="branchName" id="projen-pipelines.GitlabCDKPipelineOptions.property.branchName"></a>
5747
5819
 
5748
5820
  ```typescript
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const projen_1 = require("projen");
6
6
  class AssignApprover extends projen_1.Component {
7
7
  baseOptions;
8
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AssignApprover", version: "0.3.24" };
8
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AssignApprover", version: "0.3.25" };
9
9
  constructor(scope, baseOptions) {
10
10
  super(scope);
11
11
  this.baseOptions = baseOptions;
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const workflows_model_1 = require("projen/lib/github/workflows-model");
6
6
  const base_1 = require("./base");
7
7
  class GitHubAssignApprover extends base_1.AssignApprover {
8
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitHubAssignApprover", version: "0.3.24" };
8
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitHubAssignApprover", version: "0.3.25" };
9
9
  workflow;
10
10
  options;
11
11
  constructor(scope, options) {
@@ -199,6 +199,15 @@ export interface CDKPipelineOptions {
199
199
  * Versioning configuration
200
200
  */
201
201
  readonly versioning?: VersioningConfig;
202
+ /**
203
+ * The number of asset uploads the `cdk publish-assets` subcommand runs in
204
+ * parallel per stage. Passed through as `--concurrency`. Higher values speed
205
+ * up publishing for stacks with many assets at the cost of more concurrent
206
+ * uploads.
207
+ *
208
+ * @default - the CLI default (4)
209
+ */
210
+ readonly assetPublishingConcurrency?: number;
202
211
  }
203
212
  /**
204
213
  * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
@@ -67,7 +67,7 @@ var CdkDiffType;
67
67
  class CDKPipeline extends projen_1.Component {
68
68
  app;
69
69
  baseOptions;
70
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CDKPipeline", version: "0.3.24" };
70
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CDKPipeline", version: "0.3.25" };
71
71
  stackPrefix;
72
72
  branchName;
73
73
  /** Prefix for workflow files, concurrency groups, and artifact names to prevent collisions in monorepos. */
@@ -90,7 +90,7 @@ class CDKPipeline extends projen_1.Component {
90
90
  this.workingDirectory = rel || undefined;
91
91
  }
92
92
  // Add development dependencies
93
- this.app.addDevDeps('commit-and-tag-version', 'cdk-assets');
93
+ this.app.addDevDeps('commit-and-tag-version');
94
94
  // this.app.addDeps(
95
95
  // );
96
96
  this.project.gitignore.exclude('/cdk-outputs-*.json');
@@ -407,10 +407,13 @@ ${appCode}
407
407
  sep = '';
408
408
  }
409
409
  // Task to publish the CDK assets to all accounts
410
+ const concurrencyFlag = this.baseOptions.assetPublishingConcurrency !== undefined
411
+ ? ` --concurrency ${this.baseOptions.assetPublishingConcurrency}`
412
+ : '';
410
413
  for (const stage of stages) {
411
414
  this.project.addTask(`publish:assets:${stage.name}`, {
412
415
  steps: [{
413
- exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.stackPrefix}${sep}${stage.name}.assets.json publish`,
416
+ exec: `npx cdk publish-assets -a ${this.app.cdkConfig.cdkout} ${this.stackPrefix}${sep}${stage.name} --unstable=publish-assets${concurrencyFlag}`,
414
417
  }],
415
418
  });
416
419
  }
@@ -763,4 +766,4 @@ function addVersioningToStack(stack: Stack, stageName: string, stageOverrides?:
763
766
  }
764
767
  }
765
768
  exports.CDKPipeline = CDKPipeline;
766
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLG1DQUFxRDtBQUNyRCw4Q0FBa0Q7QUFDbEQsc0RBQTJEO0FBQzNELHNDQUEyQztBQUMzQyxvQ0FBZ0o7QUFDaEosOENBQWtFO0FBdUJsRSxNQUFNO0FBQ04seURBQXlEO0FBQ3pELE1BQU07QUFDTiwrQkFBK0I7QUFDL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQiw0RUFBNEU7QUFDNUUseUJBQXlCO0FBQ3pCLElBQUk7QUFFSixJQUFZLFdBT1g7QUFQRCxXQUFZLFdBQVc7SUFDckIsNEJBQTRCO0lBQzVCLDZDQUFJLENBQUE7SUFDSixvREFBb0Q7SUFDcEQsNkNBQUksQ0FBQTtJQUNKLHVEQUF1RDtJQUN2RCw2Q0FBSSxDQUFBO0FBQ04sQ0FBQyxFQVBXLFdBQVcsMkJBQVgsV0FBVyxRQU90QjtBQXNNRDs7O0dBR0c7QUFDSCxNQUFzQixXQUFZLFNBQVEsa0JBQVM7SUFhM0I7SUFBMkM7O0lBWmpELFdBQVcsQ0FBUztJQUNwQixVQUFVLENBQVM7SUFFbkMsNEdBQTRHO0lBQ3pGLFVBQVUsQ0FBUztJQUV0Qzs7O09BR0c7SUFDZ0IsZ0JBQWdCLENBQXFCO0lBRXhELFlBQXNCLEdBQStCLEVBQVksV0FBK0I7UUFDOUYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRFMsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFHOUYsaURBQWlEO1FBQ2pELElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFH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QUFDO1FBQ3pELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFL0MsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUpULENBQUM7SUFDRCxDQUFDOztBQWp3Qkgsa0NBa3dCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUsIGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBQUk9KRU5fTUFSS0VSIH0gZnJvbSAncHJvamVuL2xpYi9jb21tb24nO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcbmltcG9ydCB7IFBpcGVsaW5lRW5naW5lIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF3c0Fzc3VtZVJvbGVTdGVwLCBQaXBlbGluZVN0ZXAsIFByb2plblNjcmlwdFN0ZXAsIFNpbXBsZUNvbW1hbmRTdGVwLCBTdGVwU2VxdWVuY2UsIFBucG1TZXR1cFN0ZXAsIENvcmVwYWNrU2V0dXBTdGVwIH0gZnJvbSAnLi4vc3RlcHMnO1xuaW1wb3J0IHsgVmVyc2lvbmluZ0NvbmZpZywgVmVyc2lvbmluZ1NldHVwIH0gZnJvbSAnLi4vdmVyc2lvbmluZyc7XG5cbi8qKlxuICogVGhlIEVudmlyb25tZW50IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBob2xkIEFXUyByZWxhdGVkIGluZm9ybWF0aW9uXG4gKiBmb3IgYSBzcGVjaWZpYyBkZXBsb3ltZW50IGVudmlyb25tZW50IHdpdGhpbiB5b3VyIGluZnJhc3RydWN0dXJlLlxuICogRWFjaCBlbnZpcm9ubWVudCByZXF1aXJlcyBhIHNwZWNpZmljIGFjY291bnQgYW5kIHJlZ2lvbiBmb3IgaXRzIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudCB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIEFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnZpcm9ubWVudC4gSXQncyBpbXBvcnRhbnQgYmVjYXVzZVxuICAgKiBkaWZmZXJlbnQgc2VydmljZXMgb3IgZmVhdHVyZXMgY291bGQgaGF2ZSBkaXN0aW5jdCBwZXJtaXNzaW9ucyBhbmQgc2V0dGluZ3NcbiAgICogaW4gZGlmZmVyZW50IGFjY291bnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIFJlZ2lvbiBmb3IgdGhlIGVudmlyb25tZW50LiBUaGlzIGRldGVybWluZXMgd2hlcmUgeW91ciByZXNvdXJjZXNcbiAgICogYXJlIGNyZWF0ZWQgYW5kIHdoZXJlIHlvdXIgYXBwbGljYXRpb24gd2lsbCBydW4uIEl0IGNhbiBhZmZlY3QgbGF0ZW5jeSxcbiAgICogYXZhaWxhYmlsaXR5LCBhbmQgcHJpY2luZy5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG4vLyAvKipcbi8vICAqIERlc2NyaWJlcyB0aGUgdHlwZSBvZiBwaXBlbGluZSB0aGF0IHdpbGwgYmUgY3JlYXRlZFxuLy8gICovXG4vLyBleHBvcnQgZW51bSBEZXBsb3ltZW50VHlwZSB7XG4vLyAgIC8qKiBEZXBsb3kgZXZlcnkgY29tbWl0IGFzIGZhciBhcyBwb3NzaWJsZTsgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbiAqL1xuLy8gICBDT05USU5VT1VTX0RFUExPWU1FTlQsXG4vLyAgIC8qKiBCdWlsZCBldmVyeSBjb21taXQgYW5kIHByZXBhcmUgYWxsIGFzc2V0cyBmb3IgYSBsYXRlciBkZXBsb3ltZW50ICovXG4vLyAgIENPTlRJTlVPVVNfREVMSVZFUlksXG4vLyB9XG5cbmV4cG9ydCBlbnVtIENka0RpZmZUeXBlIHtcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGEgZGlmZiAqL1xuICBOT05FLFxuICAvKiogUGVyZm9ybSBhIGZhc3QgdGVtcGxhdGUgZGlmZiAoLS1uby1jaGFuZ2VzZXQpICovXG4gIEZBU1QsXG4gIC8qKiBQZXJmb3JtIGEgZnVsbCBDbG91ZEZvcm1hdGlvbiBkaWZmICgtLWNoYW5nZXNldCkgKi9cbiAgRlVMTCxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFnZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgcGlwZWxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50U3RhZ2UgZXh0ZW5kcyBOYW1lZFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG1hbnVhbEFwcHJvdmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFnZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHBpcGVsaW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXBlbmRlbnRTdGFnZSBleHRlbmRzIE5hbWVkU3RhZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoaXMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN0YWdlIHNob3VsZCBiZSBkZXBsb3llZCBvbiBwdXNoXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lPblB1c2g/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgQ0RLIHN0YWdlIHdpdGggYSBuYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRTdGFnZU9wdGlvbnMgZXh0ZW5kcyBTdGFnZU9wdGlvbnMge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBHaXRIdWIgZW52aXJvbm1lbnQgdG8gdXNlIGZvciB0aGlzIHN0YWdlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhZ2UgbmFtZSB3aWxsIGJlIHVzZWQgYXMgdGhlIEdpdEh1YiBlbnZpcm9ubWVudCBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzdGFnZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBnaXRodWJFbnZpcm9ubWVudD86IHN0cmluZztcblxuICByZWFkb25seSB3YXRjaGFibGU/OiBib29sZWFuO1xuICByZWFkb25seSBkaWZmVHlwZT86IENka0RpZmZUeXBlO1xuICByZWFkb25seSBwb3N0RGlmZlN0ZXBzPzogUGlwZWxpbmVTdGVwW107XG4gIHJlYWRvbmx5IHBvc3REZXBsb3lTdGVwcz86IFBpcGVsaW5lU3RlcFtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgQ0RLIHN0YWdlIGxpa2UgdGhlIHRhcmdldCBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIElBTSByb2xlcyB1c2VkIGluIHRoZSBDREsgcGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWFtUm9sZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IElBTSByb2xlIEFSTiB1c2VkIGlmIG5vIHNwZWNpZmljIHJvbGUgaXMgcHJvdmlkZWQuICovXG4gIHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBBUk4gZm9yIHRoZSBzeW50aGVzaXMgc3RlcC4gKi9cbiAgcmVhZG9ubHkgc3ludGg/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBBUk4gZm9yIHRoZSBhc3NldCBwdWJsaXNoaW5nIHN0ZXAuICovXG4gIHJlYWRvbmx5IGFzc2V0UHVibGlzaGluZz86IHN0cmluZztcbiAgLyoqIElBTSByb2xlIEFSTiBmb3IgdGhlIGFzc2V0IHB1Ymxpc2hpbmcgc3RlcCBmb3IgYSBzcGVjaWZpYyBzdGFnZS4gKi9cbiAgcmVhZG9ubHkgYXNzZXRQdWJsaXNoaW5nUGVyU3RhZ2U/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBJQU0gcm9sZSBBUk5zIGZvciBkaWZmZXJlbnQgZGlmZiBzdGFnZXMuICovXG4gIHJlYWRvbmx5IGRpZmY/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBJQU0gcm9sZSBBUk5zIGZvciBkaWZmZXJlbnQgZGVwbG95bWVudCBzdGFnZXMuICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnQ/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBJQU0gcm9sZSBBUk5zIGZvciB1c2luZyBhIFwianVtcFwiIHJvbGUgdG8gYXNzdW1lIHRoZSBkZXBsb3kgcm9sZSBpbiBhIGRpZmZlcmVudCBBV1MgYWNjb3VudCB1c2luZyBSb2xlIENoYWluaW5nLlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFscz90YWI9cmVhZG1lLW92LWZpbGUjYXNzdW1lcm9sZS13aXRoLXJvbGUtcHJldmlvdXNseS1hc3N1bWVkLWJ5LWFjdGlvbi1pbi1zYW1lLXdvcmtmbG93XG4gICAqICovXG4gIHJlYWRvbmx5IGp1bXA/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lT3B0aW9ucyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uXG4gKiBvcHRpb25zIGZvciBhIENESyAoQ2xvdWQgRGV2ZWxvcG1lbnQgS2l0KSBwaXBlbGluZS4gSXQgYWxsb3dzIHRoZSBkZWZpbml0aW9uXG4gKiBvZiBzZXR0aW5ncyBzdWNoIGFzIHRoZSBzdGFjayBwcmVmaXggYW5kIHBhY2thZ2UgbmFtZXNwYWNlIHRvIGJlIHVzZWQgaW4gdGhlXG4gKiBBV1Mgc3RhY2ssIGFsb25nIHdpdGggdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcblxuICAvKipcbiAgICogQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBwaXBlbGluZSwgdXNlZCBhcyBhIHByZWZpeCBmb3Igd29ya2Zsb3cgZmlsZXMsXG4gICAqIGNvbmN1cnJlbmN5IGdyb3VwcywgYW5kIGFydGlmYWN0IG5hbWVzIHRvIHByZXZlbnQgY29sbGlzaW9ucyBpbiBtb25vcmVwb3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHByb2plY3QgbmFtZSBpZiB0aGUgcHJvamVjdCBoYXMgYSBwYXJlbnQgKG1vbm9yZXBvIHN1YnByb2plY3QpLCBvdGhlcndpc2Ugbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRoZSBuYW1lIG9mIHRoZSBicmFuY2ggdG8gZGVwbG95IGZyb21cbiAgICogQGRlZmF1bHQgbWFpblxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBwYXRoIHBhdHRlcm5zIHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIHBpcGVsaW5lIHdoZW4gY2hhbmdlZC5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG1vbm9yZXBvcyB3aGVyZSB5b3Ugb25seSB3YW50IHRvIHJ1biB0aGUgcGlwZWxpbmVcbiAgICogd2hlbiBmaWxlcyBpbiBhIHNwZWNpZmljIHN1YnByb2plY3QgYXJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBGb3IgR2l0SHViLCB0aGVzZSBhcmUgdXNlZCBhcyBgb24ucHVzaC5wYXRoc2AgYW5kIGBvbi5wdWxsX3JlcXVlc3QucGF0aHNgIGZpbHRlcnMuXG4gICAqIEZvciBHaXRMYWIsIHRoZXNlIGFyZSB1c2VkIGFzIGBvbmx5LmNoYW5nZXNgIGZpbHRlcnMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsncGFja2FnZXMvbXktYXBwLyoqJywgJ3NoYXJlZC1saWJzLyoqJ11cbiAgICogQGRlZmF1bHQgLSBhbGwgcGF0aHMgdHJpZ2dlciB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHBhdGhzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBkZWZpbmUgYSBwcmVmaXggZm9yIHRoZSBBV1MgU3RhY2sgcmVzb3VyY2VzIGNyZWF0ZWRcbiAgICogZHVyaW5nIHRoZSBwaXBlbGluZSdzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgcHJvamVjdCBuYW1lXG4gICAqL1xuICByZWFkb25seSBzdGFja1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUgYWxsIENESyBhY3Rpb25zIHdpbGwgYWxzbyBpbmNsdWRlIDxzdGFja05hbWU+LyogdG8gZGVwbG95L2RpZmYvZGVzdHJveSBzdWIgc3RhY2tzIG9mIHRoZSBtYWluIHN0YWNrLlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGRlcGxveSBDRGsgYXBwbGljYXRpb25zIGNvbnRhaW5pbmcgbXVsdGlwbGUgc3RhY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95U3ViU3RhY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSBOUE0gbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiBwYWNrYWdpbmcgQ0RLIGNsb3VkXG4gICAqIGFzc2VtYmxpZXMuIEEgbmFtZXNwYWNlIGhlbHBzIGdyb3VwIHJlbGF0ZWQgcmVzb3VyY2VzIHRvZ2V0aGVyLCBwcm92aWRpbmdcbiAgICogYmV0dGVyIG9yZ2FuaXphdGlvbiBhbmQgZWFzZSBvZiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIHlvdSBuZWVkIHRvIHZlcnNpb24gYW5kIHVwbG9hZCB0aGUgY2xvdWQgYXNzZW1ibHkgdG8gYSBwYWNrYWdlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBrZ05hbWVzcGFjZT86IHN0cmluZztcblxuICAvKiogSUFNIGNvbmZpZyAqL1xuICByZWFkb25seSBpYW1Sb2xlQXJuczogSWFtUm9sZUNvbmZpZztcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgYSBsaXN0IG9mIHN0YWdlcyB0aGF0IHNob3VsZCBiZSBkZXBsb3llZCB1c2luZyBhIENJL0NEIHBpcGVsaW5lXG4gICAqL1xuICByZWFkb25seSBzdGFnZXM6IERlcGxveW1lbnRTdGFnZVtdO1xuXG4gIC8qKiBUaGlzIHNwZWNpZmllcyBkZXRhaWxzIGZvciBpbmRlcGVuZGVudCBzdGFnZXMgKi9cbiAgcmVhZG9ubHkgaW5kZXBlbmRlbnRTdGFnZXM/OiBJbmRlcGVuZGVudFN0YWdlW107XG5cbiAgLyoqIFRoaXMgc3BlY2lmaWVzIGRldGFpbHMgZm9yIGEgcGVyc29uYWwgc3RhZ2UgKi9cbiAgcmVhZG9ubHkgcGVyc29uYWxTdGFnZT86IFN0YWdlT3B0aW9ucztcblxuICAvKiogVGhpcyBzcGVjaWZpZXMgZGV0YWlscyBmb3IgZmVhdHVyZSBzdGFnZXMgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZVN0YWdlcz86IFN0YWdlT3B0aW9ucztcblxuICAvLyAvKipcbiAgLy8gICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcGlwZWxpbmUgdG8gY3JlYXRlLiBJZiBzZXQgdG8gQ09OVElOVU9VU19ERVBMT1lNRU5ULFxuICAvLyAgKiBldmVyeSBjb21taXQgaXMgZGVwbG95ZWQgYXMgZmFyIGFzIHBvc3NpYmxlLCBob3BlZnVsbHkgaW50byBwcm9kdWN0aW9uLiBJZiBzZXQgdG9cbiAgLy8gICogQ09OVElOVU9VU19ERUxJVkVSWSwgZXZlcnkgY29tbWl0IGlzIGJ1aWx0IGFuZCBhbGwgYXNzZXRzIGFyZSBwcmVwYXJlZCBmb3IgYSBsYXRlciBkZXBsb3ltZW50LlxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCBDT05USU5VT1VTX0RFTElWRVJZXG4gIC8vICAqL1xuICAvLyByZWFkb25seSBkZXBsb3ltZW50VHlwZT86IERlcGxveW1lbnRUeXBlO1xuXG4gIHJlYWRvbmx5IHByZUluc3RhbGxDb21tYW5kcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVTeW50aENvbW1hbmRzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHBvc3RTeW50aENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgcmVhZG9ubHkgcHJlSW5zdGFsbFN0ZXBzPzogUGlwZWxpbmVTdGVwW107XG4gIHJlYWRvbmx5IHByZVN5bnRoU3RlcHM/OiBQaXBlbGluZVN0ZXBbXTtcbiAgcmVhZG9ubHkgcG9zdFN5bnRoU3RlcHM/OiBQaXBlbGluZVN0ZXBbXTtcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgcGlwZWxpbmUgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGZvciBzdWJwcm9qZWN0cyBidXQgY2FuIGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgKlxuICAgKiBXaGVuIHNldCwgQ0kgam9icyB3aWxsIHJ1biBjb21tYW5kcyBpbiB0aGlzIGRpcmVjdG9yeSwgYW5kIGFydGlmYWN0IHBhdGhzXG4gICAqIHdpbGwgYmUgcHJlZml4ZWQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b21hdGljYWxseSBjb21wdXRlZCBmcm9tIHRoZSBwcm9qZWN0J3MgcG9zaXRpb24gaW4gdGhlIG1vbm9yZXBvIChlbXB0eSBzdHJpbmcgZm9yIHJvb3QgcHJvamVjdHMpXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbW1hbmQgdG8gcnVuIGJlZm9yZSB0aGUgYnVpbGQgc3RlcCwgZXhlY3V0ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgKiBXaGVuIGEgd29ya2luZ0RpcmVjdG9yeSBpcyBzZXQgKG1vbm9yZXBvIHN1YnByb2plY3QpLCB0aGUgY29tbWFuZCBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgdG8gZXhlY3V0ZSBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3QgcmVnYXJkbGVzcyBvZlxuICAgKiB0aGUgam9iJ3Mgd29ya2luZyBkaXJlY3Rvcnkgc2V0dGluZy5cbiAgICpcbiAgICogRm9yIHBucG0gd29ya3NwYWNlczogYHBucG0gLXIgLS1maWx0ZXIgPGFwcG5hbWU+Xi4uLiBydW4gYnVpbGRgXG4gICAqIEZvciBucG0gd29ya3NwYWNlczogYG5wbSBydW4gYnVpbGQgLS13b3Jrc3BhY2VzIC0taWYtcHJlc2VudGBcbiAgICogRm9yIHlhcm4gd29ya3NwYWNlczogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC1SdCBydW4gYnVpbGRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlLWJ1aWxkIGNvbW1hbmRcbiAgICovXG4gIHJlYWRvbmx5IHByZUJ1aWxkQ29tbWFuZD86IHN0cmluZztcblxuICAvKipcbiAgICogVmVyc2lvbmluZyBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uaW5nPzogVmVyc2lvbmluZ0NvbmZpZztcbn1cblxuLyoqXG4gKiBUaGUgQ0RLUGlwZWxpbmUgY2xhc3MgZXh0ZW5kcyB0aGUgQ29tcG9uZW50IGNsYXNzIGFuZCBzZXRzIHVwIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBmb3IgZGVwbG95aW5nIEFXUyBDREsgKENsb3VkIERldmVsb3BtZW50IEtpdCkgYXBwbGljYXRpb25zIGFjcm9zcyBtdWx0aXBsZSBzdGFnZXMuXG4gKiBJdCBhbHNvIG1hbmFnZXMgdGFza3Mgc3VjaCBhcyBwdWJsaXNoaW5nIENESyBhc3NldHMsIGJ1bXBpbmcgdmVyc2lvbiBiYXNlZCBvbiBnaXQgdGFncywgYW5kIGNsZWFuaW5nIHVwIGNvbmZsaWN0aW5nIHRhc2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ0RLUGlwZWxpbmUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJyYW5jaE5hbWU6IHN0cmluZztcblxuICAvKiogUHJlZml4IGZvciB3b3JrZmxvdyBmaWxlcywgY29uY3VycmVuY3kgZ3JvdXBzLCBhbmQgYXJ0aWZhY3QgbmFtZXMgdG8gcHJldmVudCBjb2xsaXNpb25zIGluIG1vbm9yZXBvcy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWVQcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIHRoaXMgcGlwZWxpbmUuXG4gICAqIFVuZGVmaW5lZCB3aGVuIHRoZSBwaXBlbGluZSBpcyBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXBwOiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCwgcHJvdGVjdGVkIGJhc2VPcHRpb25zOiBDREtQaXBlbGluZU9wdGlvbnMpIHtcbiAgICBzdXBlcihhcHApO1xuXG4gICAgLy8gQ29tcHV0ZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgbW9ub3JlcG8gc3VwcG9ydFxuICAgIGlmIChiYXNlT3B0aW9ucy53b3JraW5nRGlyZWN0b3J5KSB7XG4gICAgICB0aGlzLndvcmtpbmdEaXJlY3RvcnkgPSBiYXNlT3B0aW9ucy53b3JraW5nRGlyZWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWwgPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBwLnJvb3Qub3V0ZGlyLCB0aGlzLmFwcC5vdXRkaXIpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIHRoaXMud29ya2luZ0RpcmVjdG9yeSA9IHJlbCB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIGRldmVsb3BtZW50IGRlcGVuZGVuY2llc1xuICAgIHRoaXMuYXBwLmFkZERldkRlcHMoXG4gICAgICAnY29tbWl0LWFuZC10YWctdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLmFwcC5hZGREZXBzKFxuICAgIC8vICk7XG4gICAgdGhpcy5wcm9qZWN0LmdpdGlnbm9yZS5leGNsdWRlKCcvY2RrLW91dHB1dHMtKi5qc29uJyk7XG5cbiAgICBjb25zdCBwaXBlbGluZU5hbWUgPSBiYXNlT3B0aW9ucy5waXBlbGluZU5hbWUgPz8gKGFwcC5wYXJlbnQgPyBhcHAubmFtZSA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uYW1lUHJlZml4ID0gcGlwZWxpbmVOYW1lID8gYCR7cGlwZWxpbmVOYW1lfS1gIDogJyc7XG4gICAgdGhpcy5zdGFja1ByZWZpeCA9IGJhc2VPcHRpb25zLnN0YWNrUHJlZml4ID8/IGFwcC5uYW1lO1xuICAgIHRoaXMuYnJhbmNoTmFtZSA9IGJhc2VPcHRpb25zLmJyYW5jaE5hbWUgPz8gJ21haW4nOyAvLyBUT0RPIHVzZSBkZWZhdWx0UmVsZWFzZUJyYW5jaCBvZiBOb2RlUHJvamVjdFxuXG4gICAgLy8gUmVtb3ZlcyB0aGUgY29tcGlsZWQgY2xvdWQgYXNzZW1ibHkgYmVmb3JlIGVhY2ggc3ludGhcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGgnKT8ucHJlcGVuZEV4ZWMoYHJtIC1yZiAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoJ3N5bnRoOnNpbGVudCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcblxuICAgIC8vIFJlbW92ZSB0YXNrcyB0aGF0IG1pZ2h0IGNvbmZsaWN0IHdpdGggdGhlIHBpcGVsaW5lIHByb2Nlc3NcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGVwbG95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2RpZmYnKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGVzdHJveScpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCd3YXRjaCcpO1xuXG4gICAgLy8gU2V0dXAgdmVyc2lvbmluZyBpZiBlbmFibGVkXG4gICAgaWYgKGJhc2VPcHRpb25zLnZlcnNpb25pbmc/LmVuYWJsZWQpIHtcbiAgICAgIG5ldyBWZXJzaW9uaW5nU2V0dXAodGhpcy5wcm9qZWN0LCBiYXNlT3B0aW9ucy52ZXJzaW9uaW5nKS5zZXR1cCgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZXMgZGlmZmVyZW50IGRlcGxveW1lbnQgc3RhZ2VzXG4gICAgaWYgKGJhc2VPcHRpb25zLnBlcnNvbmFsU3RhZ2UpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuICAgIH1cbiAgICBpZiAoYmFzZU9wdGlvbnMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBiYXNlT3B0aW9ucy5zdGFnZXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgKGJhc2VPcHRpb25zLmluZGVwZW5kZW50U3RhZ2VzID8/IFtdKSkge1xuICAgICAgdGhpcy5jcmVhdGVJbmRlcGVuZGVudFN0YWdlKHN0YWdlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGVzIHRhc2tzIHRvIGhhbmRsZSB0aGUgcmVsZWFzZSBwcm9jZXNzXG4gICAgdGhpcy5jcmVhdGVSZWxlYXNlVGFza3MoKTtcblxuICAgIC8vIENyZWF0ZXMgYSBzcGVjaWFsaXplZCBDREsgQXBwIGNsYXNzXG4gICAgdGhpcy5jcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKTtcblxuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IGVuZ2luZVR5cGUoKTogUGlwZWxpbmVFbmdpbmU7XG5cbiAgcHJvdGVjdGVkIHByb3ZpZGVJbnN0YWxsU3RlcCgpOiBQaXBlbGluZVN0ZXAge1xuICAgIGNvbnN0IHNlcSA9IG5ldyBTdGVwU2VxdWVuY2UodGhpcy5wcm9qZWN0LCB0aGlzLmJhc2VPcHRpb25zLnByZUluc3RhbGxTdGVwcyA/PyBbXSk7XG5cbiAgICAvLyBEZXRlY3QgYW5kIGFkZCBwbnBtIHNldHVwIGlmIG5lZWRlZCAoR2l0SHViIG9ubHkpXG4gICAgaWYgKHRoaXMuYXBwLnBhY2thZ2UucGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNICYmIHRoaXMuZW5naW5lVHlwZSgpID09PSBQaXBlbGluZUVuZ2luZS5HSVRIVUIpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgUG5wbVNldHVwU3RlcCh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgdmVyc2lvbjogKHRoaXMuYXBwLnBhY2thZ2UgYXMgYW55KS5wbnBtVmVyc2lvbixcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgYW5kIGFkZCBjb3JlcGFjayBlbmFibGUgZm9yIFlhcm4gQmVycnlcbiAgICBpZiAodGhpcy5hcHAucGFja2FnZS5wYWNrYWdlTWFuYWdlciA9PT0gTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlkpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgQ29yZXBhY2tTZXR1cFN0ZXAodGhpcy5wcm9qZWN0KSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMucHJlSW5zdGFsbENvbW1hbmRzKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFNpbXBsZUNvbW1hbmRTdGVwKHRoaXMucHJvamVjdCwgdGhpcy5iYXNlT3B0aW9ucy5wcmVJbnN0YWxsQ29tbWFuZHMpKTtcbiAgICB9XG4gICAgc2VxLmFkZFN0ZXBzKG5ldyBTaW1wbGVDb21tYW5kU3RlcCh0aGlzLnByb2plY3QsIFt0aGlzLmFwcC5wYWNrYWdlLmluc3RhbGxDb21tYW5kXSkpO1xuICAgIHJldHVybiBzZXE7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvdmlkZVN5bnRoU3RlcCgpOiBQaXBlbGluZVN0ZXAge1xuICAgIGNvbnN0IHNlcSA9IG5ldyBTdGVwU2VxdWVuY2UodGhpcy5wcm9qZWN0LCBbXSk7XG5cbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucz8uc3ludGgpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgQXdzQXNzdW1lUm9sZVN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgIHJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuc3ludGgsXG4gICAgICAgIGp1bXBSb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmp1bXA/LnN5bnRoLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlcS5hZGRTdGVwcyguLi50aGlzLmJhc2VPcHRpb25zLnByZVN5bnRoU3RlcHMgPz8gW10pO1xuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLnByZVN5bnRoQ29tbWFuZHMpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgU2ltcGxlQ29tbWFuZFN0ZXAodGhpcy5wcm9qZWN0LCB0aGlzLmJhc2VPcHRpb25zLnByZVN5bnRoQ29tbWFuZHMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5wcmVCdWlsZENvbW1hbmQpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgU2ltcGxlQ29tbWFuZFN0ZXAodGhpcy5wcm9qZWN0LCBbdGhpcy5wcmVCdWlsZENvbW1hbmRXcmFwcGVkKCldKSk7XG4gICAgfVxuXG4gICAgc2VxLmFkZFN0ZXBzKG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgJ2J1aWxkJykpO1xuXG4gICAgc2VxLmFkZFN0ZXBzKC4uLnRoaXMuYmFzZU9wdGlvbnMucG9zdFN5bnRoU3RlcHMgPz8gW10pO1xuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLnBvc3RTeW50aENvbW1hbmRzKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFNpbXBsZUNvbW1hbmRTdGVwKHRoaXMucHJvamVjdCwgdGhpcy5iYXNlT3B0aW9ucy5wb3N0U3ludGhDb21tYW5kcykpO1xuICAgIH1cbiAgICByZXR1cm4gc2VxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByZUJ1aWxkQ29tbWFuZCB3cmFwcGVkIHRvIGV4ZWN1dGUgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgKiBXaGVuIHdvcmtpbmdEaXJlY3RvcnkgaXMgc2V0LCB0aGUgY29tbWFuZCBpcyBwcmVmaXhlZCB3aXRoIGEgY2QgdG8gdGhlXG4gICAqIHJlcG8gcm9vdCB1c2luZyBlbmdpbmUtYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVCdWlsZENvbW1hbmRXcmFwcGVkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY21kID0gdGhpcy5iYXNlT3B0aW9ucy5wcmVCdWlsZENvbW1hbmQhO1xuICAgIGlmICghdGhpcy53b3JraW5nRGlyZWN0b3J5KSB7XG4gICAgICByZXR1cm4gY21kO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRoaXMuZW5naW5lVHlwZSgpKSB7XG4gICAgICBjYXNlIFBpcGVsaW5lRW5naW5lLkdJVEhVQjpcbiAgICAgICAgcmV0dXJuIGBjZCAkR0lUSFVCX1dPUktTUEFDRSAmJiAke2NtZH1gO1xuICAgICAgY2FzZSBQaXBlbGluZUVuZ2luZS5HSVRMQUI6XG4gICAgICAgIHJldHVybiBgKGNkICRDSV9QUk9KRUNUX0RJUiAmJiAke2NtZH0pYDtcbiAgICAgIGNhc2UgUGlwZWxpbmVFbmdpbmUuQkFTSDpcbiAgICAgICAgcmV0dXJuIGAoY2QgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiICYmICR7Y21kfSlgO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvdmlkZUFzc2V0VXBsb2FkU3RlcChzdGFnZU5hbWU/OiBzdHJpbmcpOiBQaXBlbGluZVN0ZXAge1xuICAgIGNvbnN0IHNlcSA9IG5ldyBTdGVwU2VxdWVuY2UodGhpcy5wcm9qZWN0LCBbXSk7XG5cbiAgICBjb25zdCBnbG9iYWxQdWJsaXNoUm9sZSA9IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuYXNzZXRQdWJsaXNoaW5nID8/IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuZGVmYXVsdCE7XG4gICAgaWYgKHN0YWdlTmFtZSkge1xuICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBBd3NBc3N1bWVSb2xlU3RlcCh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgcm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5hc3NldFB1Ymxpc2hpbmdQZXJTdGFnZSA/XG4gICAgICAgICAgKHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuYXNzZXRQdWJsaXNoaW5nUGVyU3RhZ2Vbc3RhZ2VOYW1lXSA/PyBnbG9iYWxQdWJsaXNoUm9sZSkgOlxuICAgICAgICAgIGdsb2JhbFB1Ymxpc2hSb2xlLFxuICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5bc3RhZ2VOYW1lXSxcbiAgICAgIH0pKTtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgUHJvamVuU2NyaXB0U3RlcCh0aGlzLnByb2plY3QsIGBwdWJsaXNoOmFzc2V0czoke3N0YWdlTmFtZX1gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmFzc2V0UHVibGlzaGluZ1BlclN0YWdlKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IFsuLi50aGlzLmJhc2VPcHRpb25zLnN0YWdlcywgLi4udGhpcy5iYXNlT3B0aW9ucy5pbmRlcGVuZGVudFN0YWdlcyA/PyBbXV07XG4gICAgICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2Ygc3RhZ2VzKSB7XG4gICAgICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBBd3NBc3N1bWVSb2xlU3RlcCh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgICAgIHJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuYXNzZXRQdWJsaXNoaW5nUGVyU3RhZ2Vbc3RhZ2UubmFtZV0gPz8gZ2xvYmFsUHVibGlzaFJvbGUsXG4gICAgICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5bc3RhZ2UubmFtZV0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHNlcS5hZGRTdGVwcyhuZXcgUHJvamVuU2NyaXB0U3RlcCh0aGlzLnByb2plY3QsIGBwdWJsaXNoOmFzc2V0czoke3N0YWdlLm5hbWV9YCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXEuYWRkU3RlcHMobmV3IEF3c0Fzc3VtZVJvbGVTdGVwKHRoaXMucHJvamVjdCwge1xuICAgICAgICAgIHJvbGVBcm46IGdsb2JhbFB1Ymxpc2hSb2xlLFxuICAgICAgICAgIGp1bXBSb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmp1bXA/LmFzc2V0UHVibGlzaGluZyxcbiAgICAgICAgfSkpO1xuICAgICAgICBzZXEuYWRkU3RlcHMobmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCAncHVibGlzaDphc3NldHMnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm92aWRlQXNzZW1ibHlVcGxvYWRTdGVwKCk6IFBpcGVsaW5lU3RlcCB7XG4gICAgaWYgKCF0aGlzLmJhc2VPcHRpb25zLnBrZ05hbWVzcGFjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwa2dOYW1lc3BhY2UgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB2ZXJzaW9uZWQgYXJ0aWZhY3RzIChlLmcuIG1hbnVhbCBhcHByb3ZhbHMpJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3RlcFNlcXVlbmNlKHRoaXMucHJvamVjdCwgW1xuICAgICAgbmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCAnYnVtcCcpLFxuICAgICAgbmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCAncmVsZWFzZTpwdXNoLWFzc2VtYmx5JyksXG4gICAgXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvdmlkZURlcGxveVN0ZXAoc3RhZ2U6IE5hbWVkU3RhZ2VPcHRpb25zKTogUGlwZWxpbmVTdGVwIHtcbiAgICByZXR1cm4gbmV3IFN0ZXBTZXF1ZW5jZSh0aGlzLnByb2plY3QsIFtcbiAgICAgIG5ldyBBd3NBc3N1bWVSb2xlU3RlcCh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgcm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucz8uZGVwbG95bWVudD8uW3N0YWdlLm5hbWVdID8/IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LmRlZmF1bHQhLFxuICAgICAgICByZWdpb246IHN0YWdlLmVudi5yZWdpb24sXG4gICAgICAgIGp1bXBSb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmp1bXA/LltzdGFnZS5uYW1lXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCBgZGVwbG95OiR7c3RhZ2UubmFtZX1gKSxcbiAgICAgIC4uLnN0YWdlLnBvc3REZXBsb3lTdGVwcyA/PyBbXSxcbiAgICBdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm92aWRlRGlmZlN0ZXAoc3RhZ2U6IE5hbWVkU3RhZ2VPcHRpb25zLCBmYXN0PzogYm9vbGVhbik6IFBpcGVsaW5lU3RlcCB7XG4gICAgcmV0dXJuIG5ldyBTdGVwU2VxdWVuY2UodGhpcy5wcm9qZWN0LCBbXG4gICAgICBuZXcgQXdzQXNzdW1lUm9sZVN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgIHJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LmRpZmY/LltzdGFnZS5uYW1lXSA/P1xuICAgICAgICAgIHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LmRlcGxveW1lbnQ/LltzdGFnZS5uYW1lXSA/P1xuICAgICAgICAgIHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LmRlZmF1bHQhLFxuICAgICAgICByZWdpb246IHN0YWdlLmVudi5yZWdpb24sXG4gICAgICAgIGp1bXBSb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmp1bXA/LltzdGFnZS5uYW1lXSxcbiAgICAgIH0pLFxuICAgICAgbmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCBmYXN0ID8gYGZhc3RkaWZmOiR7c3RhZ2UubmFtZX1gIDogYGRpZmY6JHtzdGFnZS5uYW1lfWApLFxuICAgICAgLi4uc3RhZ2UucG9zdERpZmZTdGVwcyA/PyBbXSxcbiAgICBdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJJbnN0YWxsUGFja2FnZUNvbW1hbmRzKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHJ1blByZUluc3RhbGxDb21tYW5kczogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gcnVuUHJlSW5zdGFsbENvbW1hbmRzID8gdGhpcy5iYXNlT3B0aW9ucy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10gOiBbXTtcblxuICAgIHN3aXRjaCAodGhpcy5hcHAucGFja2FnZS5wYWNrYWdlTWFuYWdlcikge1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk4yOlxuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9CRVJSWTpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQ0xBU1NJQzpcbiAgICAgICAgY29tbWFuZHMucHVzaChgeWFybiBhZGQgJHtwYWNrYWdlTmFtZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICAgIGNvbW1hbmRzLnB1c2goYG5wbSBpbnN0YWxsICR7cGFja2FnZU5hbWV9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgICAgY29tbWFuZHMucHVzaChgcG5wbSBhZGQgJHtwYWNrYWdlTmFtZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGluc3RhbGwgc2NyaXB0cyBmb3IgcGFja2FnZU1hbmFnZXI6ICcgKyB0aGlzLmFwcC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVNhZmVTdGFnZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBzcGxpdCBpbnRvIHdvcmRzXG4gICAgY29uc3Qgd29yZHMgPSBuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgJyAnKS50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICAgIC8vIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmQgYW5kIGpvaW4gdGhlbVxuICAgIHJldHVybiB3b3Jkcy5tYXAoKHdvcmQpID0+IHtcbiAgICAgIHJldHVybiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGludGVyZmFjZXMgYW5kIGNsYXNzZXNcbiAgICogbmVjZXNzYXJ5IHRvIHNldCB1cCB0aGUgcGlwZWxpbmUgYW5kIGRlZmluZSB0aGUgQVdTIENESyBzdGFja3MgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCkge1xuICAgIGxldCBwcm9wc0NvZGUgPSAnJztcbiAgICBsZXQgYXBwQ29kZSA9ICcnO1xuICAgIGxldCBzZXAgPSAnLSc7XG4gICAgaWYgKHRoaXMuc3RhY2tQcmVmaXggPT09ICcnKSB7XG4gICAgICBzZXAgPSAnJztcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLnBlcnNvbmFsU3RhZ2UpIHtcbiAgICAgIHByb3BzQ29kZSArPSBgICAvKiogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBwZXJzb25hbCBzdGFjay4gKi9cbiAgcHJvdmlkZVBlcnNvbmFsU3RhY2s6IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbmA7XG4gICAgICBhcHBDb2RlICs9IGAgICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFVTRVIgaXMgc2V0IGFuZCBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhIHBlcnNvbmFsIHN0YWNrLCBpdCBpcyBjYWxsZWQgd2l0aCBuZWNlc3NhcnkgYXJndW1lbnRzLlxuICAgIGlmIChwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayAmJiBwcm9jZXNzLmVudi5VU0VSKSB7XG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSAncGVyc29uYWwtJyArIHByb2Nlc3MuZW52LlVTRVIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayh0aGlzLCAnJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfXBlcnNvbmFsJywgeyBlbnY6IHsgYWNjb3VudDogJyR7dGhpcy5iYXNlT3B0aW9ucy5wZXJzb25hbFN0YWdlLmVudi5hY2NvdW50fScsIHJlZ2lvbjogJyR7dGhpcy5iYXNlT3B0aW9ucy5wZXJzb25hbFN0YWdlLmVudi5yZWdpb259JyB9LCBzdGFja05hbWU6IFxcYCR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGZlYXR1cmUgc3RhY2suICovXG4gIHByb3ZpZGVGZWF0dXJlU3RhY2s6IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbmA7XG4gICAgICBhcHBDb2RlICs9IGAgICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJSQU5DSCBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgZmVhdHVyZSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9ZmVhdHVyZScsIHsgZW52OiB7IGFjY291bnQ6ICcke3RoaXMuYmFzZU9wdGlvbnMuZmVhdHVyZVN0YWdlcy5lbnYuYWNjb3VudH0nLCByZWdpb246ICcke3RoaXMuYmFzZU9wdGlvbnMuZmVhdHVyZVN0YWdlcy5lbnYucmVnaW9ufScgfSwgc3RhY2tOYW1lOiBcXGAke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9XFwke3N0YWdlTmFtZX1cXGAsIHN0YWdlTmFtZSB9KTtcbiAgICB9XG5gO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgdGhpcy5iYXNlT3B0aW9ucy5zdGFnZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVVcHBlckZpcnN0ID0gdGhpcy5jcmVhdGVTYWZlU3RhZ2VOYW1lKHN0YWdlLm5hbWUpO1xuXG4gICAgICBwcm9wc0NvZGUgKz0gYCAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgJHtzdGFnZS5uYW1lfSBzdGFjay4gKi9cbiAgcHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2s6IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbmA7XG4gICAgICBhcHBDb2RlICs9IGAgICAgLy8gSWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY3JlYXRpbmcgYSAke3N0YWdlLm5hbWV9IHN0YWNrLCBpdCBpcyBjYWxsZWQgd2l0aCBuZWNlc3NhcnkgYXJndW1lbnRzLlxuICAgIGlmIChwcm9wcy5wcm92aWRlJHtuYW1lVXBwZXJGaXJzdH1TdGFjaykge1xuICAgICAgcHJvcHMucHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2sodGhpcywgJyR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlLm5hbWV9JywgeyBlbnY6IHsgYWNjb3VudDogJyR7c3RhZ2UuZW52LmFjY291bnR9JywgcmVnaW9uOiAnJHtzdGFnZS5lbnYucmVnaW9ufScgfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfSR7c3RhZ2UubmFtZX0nLCBzdGFnZU5hbWU6ICcke3N0YWdlLm5hbWV9JyB9KTtcbiAgICB9XG5gO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgKHRoaXMuYmFzZU9wdGlvbnMuaW5kZXBlbmRlbnRTdGFnZXMgPz8gW10pKSB7XG4gICAgICBjb25zdCBuYW1lVXBwZXJGaXJzdCA9IHRoaXMuY3JlYXRlU2FmZVN0YWdlTmFtZShzdGFnZS5uYW1lKTtcblxuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhICR7c3RhZ2UubmFtZX0gc3RhY2suICovXG4gIHByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgJHtzdGFnZS5uYW1lfSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9JHtzdGFnZS5uYW1lfScsIHsgZW52OiB7IGFjY291bnQ6ICcke3N0YWdlLmVudi5hY2NvdW50fScsIHJlZ2lvbjogJyR7c3RhZ2UuZW52LnJlZ2lvbn0nIH0sIHN0YWNrTmFtZTogJyR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlLm5hbWV9Jywgc3RhZ2VOYW1lOiAnJHtzdGFnZS5uYW1lfScgfSk7XG4gICAgfVxuYDtcbiAgICB9XG5cbiAgICAvLyBBZGQgdmVyc2lvbmluZyBsb2dpYyB0byBhcHBseSB0byBhbGwgc3RhY2tzXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZz8uZW5hYmxlZCkge1xuICAgICAgYXBwQ29kZSArPSB0aGlzLmdlbmVyYXRlVmVyc2lvbmluZ0FwcENvZGUodGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBGaWxlID0gbmV3IFRleHRGaWxlKHRoaXMucHJvamVjdCwgYCR7dGhpcy5hcHAuc3JjZGlyfS9hcHAudHNgKTtcblxuICAgIC8vIEdlbmVyYXRlIHZlcnNpb25pbmctYXdhcmUgaW1wb3J0cyBhbmQgdXRpbGl0aWVzXG4gICAgY29uc3QgdmVyc2lvbmluZ0ltcG9ydHMgPSB0aGlzLmJhc2VPcHRpb25zLnZlcnNpb25pbmc/LmVuYWJsZWRcbiAgICAgID8gdGhpcy5nZW5lcmF0ZVZlcnNpb25pbmdJbXBvcnRzKClcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCB2ZXJzaW9uaW5nVXRpbGl0aWVzID0gdGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkXG4gICAgICA/IHRoaXMuZ2VuZXJhdGVWZXJzaW9uaW5nVXRpbGl0aWVzKClcbiAgICAgIDogJyc7XG5cbiAgICBjb25zdCB2ZXJzaW9uaW5nQ29uZmlnRGVjbGFyYXRpb24gPSB0aGlzLmJhc2VPcHRpb25zLnZlcnNpb25pbmc/LmVuYWJsZWRcbiAgICAgID8gYFxuY29uc3QgdmVyc2lvbmluZ0NvbmZpZyA9ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nLCBudWxsLCAyKX07XG5gXG4gICAgICA6ICcnO1xuXG4gICAgYXBwRmlsZS5hZGRMaW5lKGAvLyAke1BST0pFTl9NQVJLRVJ9XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgQXBwLCBBcHBQcm9wcywgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG4ke3ZlcnNpb25pbmdJbXBvcnRzfVxuJHt2ZXJzaW9uaW5nQ29uZmlnRGVjbGFyYXRpb259XG4ke3ZlcnNpb25pbmdVdGlsaXRpZXN9XG5cbi8qKlxuICogUGlwZWxpbmVBcHBQcm9wcyBpcyBhbiBleHRlbnNpb24gb2YgQXBwUHJvcHMsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFXUyBDREsgY29yZS5cbiAqIEl0IGluY2x1ZGVzIG9wdGlvbmFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIEFXUyBTdGFja3MgZm9yIGRpZmZlcmVudCBzdGFnZXMuXG4gKlxuICogVXNlIHRoZXNlIGZ1bmN0aW9ucyB0byBpbnN0YW50aWF0ZSB5b3VyIGFwcGxpY2F0aW9uIHN0YWNrcyB3aXRoIHRoZSBwYXJhbWV0ZXJzIGZvclxuICogZWFjaCBzdGFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwUHJvcHMgZXh0ZW5kcyBBcHBQcm9wcyB7XG4ke3Byb3BzQ29kZX1cbn1cblxuLyoqXG4gKiBQaXBlbGluZUFwcFN0YWNrUHJvcHMgaXMgYW4gZXh0ZW5zaW9uIG9mIFN0YWNrUHJvcHMsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFXUyBDREsgY29yZS5cbiAqIEl0IGluY2x1ZGVzIGFuIGFkZGl0aW9uYWwgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgc3RhZ2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIFBpcGVsaW5lQXBwIGNsYXNzIGV4dGVuZHMgdGhlIEFwcCBjbGFzcyBmcm9tIEFXUyBDREsgYW5kIG92ZXJyaWRlcyB0aGUgY29uc3RydWN0b3IgdG8gc3VwcG9ydFxuICogZGlmZmVyZW50IHN0YWdlcyBvZiB0aGUgYXBwbGljYXRpb24gKGRldmVsb3BtZW50LCBwcm9kdWN0aW9uLCBwZXJzb25hbCwgZmVhdHVyZSkgYnkgaW52b2tpbmcgdGhlIHByb3ZpZGVkXG4gKiBzdGFjay1wcm92aWRpbmcgZnVuY3Rpb25zIGZyb20gdGhlIHByb3BzLlxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVBcHAgZXh0ZW5kcyBBcHAge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogUGlwZWxpbmVBcHBQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuJHthcHBDb2RlfVxuXG4gIH1cbn1cbmApO1xuICB9XG5cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyB0byBwdWJsaXNoIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzIGFuZCBoYW5kbGUgdmVyc2lvbmluZywgaW5jbHVkaW5nIGJ1bXBpbmcgdGhlIHZlcnNpb25cbiAgICogYmFzZWQgb24gdGhlIGxhdGVzdCBnaXQgdGFnIGFuZCBwdXNoaW5nIHRoZSBDREsgYXNzZW1ibHkgdG8gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeS5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZWxlYXNlVGFza3MoKSB7XG4gICAgY29uc3Qgc3RhZ2VzID0gWy4uLnRoaXMuYmFzZU9wdGlvbnMuc3RhZ2VzLCAuLi50aGlzLmJhc2VPcHRpb25zLmluZGVwZW5kZW50U3RhZ2VzID8/IFtdXTtcbiAgICBsZXQgc2VwID0gJy0nO1xuICAgIGlmICh0aGlzLnN0YWNrUHJlZml4ID09PSAnJykge1xuICAgICAgc2VwID0gJyc7XG4gICAgfVxuICAgIC8vIFRhc2sgdG8gcHVibGlzaCB0aGUgQ0RLIGFzc2V0cyB0byBhbGwgYWNjb3VudHNcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYHB1Ymxpc2g6YXNzZXRzOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICAgIHN0ZXBzOiBbe1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9LyR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlLm5hbWV9LmFzc2V0cy5qc29uIHB1Ymxpc2hgLFxuICAgICAgICB9XSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncHVibGlzaDphc3NldHMnLCB7XG4gICAgICBzdGVwczogc3RhZ2VzLm1hcChzdGFnZSA9PiAoe1xuICAgICAgICBzcGF3bjogYHB1Ymxpc2g6YXNzZXRzOiR7c3RhZ2UubmFtZX1gLFxuICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMucGtnTmFtZXNwYWNlKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnYnVtcCcsIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdCdW1wcyB2ZXJzaW9uIGJhc2VkIG9uIGxhdGVzdCBnaXQgdGFnJyxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleGVjOiAncGlwZWxpbmVzLXJlbGVhc2UgYnVtcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleGVjOiAnZ2l0IHB1c2ggLS10YWdzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncmVsZWFzZTpwdXNoLWFzc2VtYmx5Jywge1xuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4ZWM6IGBwaXBlbGluZXMtcmVsZWFzZSBjcmVhdGUtbWFuaWZlc3QgXCIke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9XCIgIFwiJHt0aGlzLmJhc2VPcHRpb25zLnBrZ05hbWVzcGFjZX1cImAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgICBleGVjOiAnbnBtIHZlcnNpb24gLS1uby1naXQtdGFnLXZlcnNpb24gZnJvbS1naXQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3dkOiB0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0LFxuICAgICAgICAgICAgZXhlYzogJ25wbSBwdWJsaXNoJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIHBlcnNvbmFsIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCB3YXRjaGluZyBmb3IgY2hhbmdlcyxcbiAgICogY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLCBhbmQgZGVzdHJveWluZyB0aGUgc3RhY2sgd2hlbiBubyBsb25nZXIgbmVlZGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVBlcnNvbmFsU3RhZ2UoKSB7XG4gICAgY29uc3Qgc3RhY2tJZCA9IHRoaXMuZ2V0Q2xpU3RhY2tQYXR0ZXJuKCdwZXJzb25hbCcpO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXBsb3k6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy1wZXJzb25hbC5qc29uICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCd3YXRjaDpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLXBlcnNvbmFsLmpzb24gLS13YXRjaCAtLWhvdHN3YXAgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRpZmYgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Zhc3RkaWZmOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmIC0tbm8tY2hhbmdlc2V0ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgZm9yIHRoZSBmZWF0dXJlIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksXG4gICAqIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmVhdHVyZVN0YWdlKCkge1xuICAgIGNvbnN0IHN0YWNrSWQgPSB0aGlzLmdldENsaVN0YWNrUGF0dGVybignZmVhdHVyZScpO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXBsb3k6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1vdXRwdXRzLWZpbGUgY2RrLW91dHB1dHMtZmVhdHVyZS5qc29uIC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZmFzdGRpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAtLW5vLWNoYW5nZXNldCAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVzdHJveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95IC0tZm9yY2UgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3dhdGNoOmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy1mZWF0dXJlLmpzb24gLS13YXRjaCAtLWhvdHN3YXAgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIGdlbmVyYWwgcGlwZWxpbmUgc3RhZ2VzIChkZXYsIHByb2QpLCBpbmNsdWRpbmcgZGVwbG95bWVudCBhbmQgY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLlxuICAgKiBAcGFyYW0ge0RlcGxveVN0YWdlT3B0aW9uc30gc3RhZ2UgLSBUaGUgc3RhZ2UgdG8gY3JlYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZTogRGVwbG95bWVudFN0YWdlKSB7XG4gICAgY29uc3Qgc3RhY2tJZCA9IHRoaXMuZ2V0Q2xpU3RhY2tQYXR0ZXJuKHN0YWdlLm5hbWUpO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy0ke3N0YWdlLm5hbWV9Lmpzb24gLS1wcm9ncmVzcyBldmVudHMgLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyIGRlcGxveSAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZGlmZjoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IGRpZmYgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGZhc3RkaWZmOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICBleGVjOiBgY2RrIC0tYXBwICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0gZGlmZiAtLW5vLWNoYW5nZXNldCAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICBpZiAoc3RhZ2Uud2F0Y2hhYmxlKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgd2F0Y2g6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgICAgZXhlYzogYGNkayBkZXBsb3kgLS1vdXRwdXRzLWZpbGUgY2RrLW91dHB1dHMtJHtzdGFnZS5uYW1lfS5qc29uIC0td2F0Y2ggLS1ob3Rzd2FwICR7c3RhY2tJZH1gLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB2ZXJzaW9uIGZldGNoIHRhc2sgaWYgdmVyc2lvbmluZyBpcyBlbmFibGVkXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZz8uZW5hYmxlZCkge1xuICAgICAgdGhpcy5jcmVhdGVWZXJzaW9uRmV0Y2hUYXNrKHN0YWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIGluZGVwZW5kZW50IHN0YWdlcyBpbmNsdWRpbmcgZGVwbG95bWVudCBhbmQgY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLlxuICAgKiBAcGFyYW0ge05hbWVkU3RhZ2VPcHRpb25zfSBzdGFnZSAtIFRoZSBzdGFnZSB0byBjcmVhdGVcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbmRlcGVuZGVudFN0YWdlKHN0YWdlOiBJbmRlcGVuZGVudFN0YWdlKSB7XG4gICAgY29uc3Qgc3RhY2tJZCA9IHRoaXMuZ2V0Q2xpU3RhY2tQYXR0ZXJuKHN0YWdlLm5hbWUpO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy0ke3N0YWdlLm5hbWV9Lmpzb24gLS1wcm9ncmVzcyBldmVudHMgLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyIGRlcGxveSAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZGlmZjoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IGRpZmYgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGZhc3RkaWZmOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICBleGVjOiBgY2RrIC0tYXBwICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0gZGlmZiAtLW5vLWNoYW5nZXNldCAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICBpZiAoc3RhZ2Uud2F0Y2hhYmxlKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgd2F0Y2g6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgICAgZXhlYzogYGNkayBkZXBsb3kgLS1vdXRwdXRzLWZpbGUgY2RrLW91dHB1dHMtJHtzdGFnZS5uYW1lfS5qc29uIC0td2F0Y2ggLS1ob3Rzd2FwICR7c3RhY2tJZH1gLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB2ZXJzaW9uIGZldGNoIHRhc2sgaWYgdmVyc2lvbmluZyBpcyBlbmFibGVkXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZz8uZW5hYmxlZCkge1xuICAgICAgdGhpcy5jcmVhdGVWZXJzaW9uRmV0Y2hUYXNrKHN0YWdlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xpU3RhY2tQYXR0ZXJuKHN0YWdlOiBzdHJpbmcpIHtcbiAgICBsZXQgc2VwID0gJy0nO1xuICAgIGlmICh0aGlzLnN0YWNrUHJlZml4ID09PSAnJykge1xuICAgICAgc2VwID0gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VPcHRpb25zLmRlcGxveVN1YlN0YWNrcyA/IGAke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9JHtzdGFnZX0gJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfSR7c3RhZ2V9LypgIDogYCR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlfWA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHZlcnNpb246ZmV0Y2g6PHN0YWdlPiB0YXNrIHRvIGZldGNoIHZlcnNpb24gZGF0YSBmcm9tIGRlcGxveWVkIHN0YWNrXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVmVyc2lvbkZldGNoVGFzayhzdGFnZTogTmFtZWRTdGFnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBgJHt0aGlzLnN0YWNrUHJlZml4fSR7dGhpcy5zdGFja1ByZWZpeCA/ICctJyA6ICcnfSR7c3RhZ2UubmFtZX1gO1xuICAgIGNvbnN0IHN0YWdlQ29uZmlnID0gdGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5zdGFnZU92ZXJyaWRlcz8uW3N0YWdlLm5hbWVdIHx8IHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZztcblxuICAgIGlmICghc3RhZ2VDb25maWc/Lm91dHB1dHMpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gRmV0Y2ggZnJvbSBDbG91ZEZvcm1hdGlvbiBvdXRwdXRzXG4gICAgaWYgKHN0YWdlQ29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24/LmVuYWJsZWQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICAgIGBlY2hvIFwiRmV0Y2hpbmcgdmVyc2lvbiBkYXRhIGZyb20gQ2xvdWRGb3JtYXRpb24gb3V0cHV0cyBmb3IgJHtzdGFnZS5uYW1lfS4uLlwiYCxcbiAgICAgICAgYGF3cyBjbG91ZGZvcm1hdGlvbiBkZXNjcmliZS1zdGFja3MgLS1zdGFjay1uYW1lICR7c3RhY2tOYW1lfSAtLXJlZ2lvbiAke3N0YWdlLmVudi5yZWdpb259IC0tcXVlcnkgXCJTdGFja3NbMF0uT3V0cHV0c1s/c3RhcnRzX3dpdGgoT3V0cHV0S2V5LCAnQXBwVmVyc2lvbicpXS57S2V5Ok91dHB1dEtleSxWYWx1ZTpPdXRwdXRWYWx1ZX1cIiAtLW91dHB1dCB0YWJsZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZldGNoIGZyb20gU1NNIFBhcmFtZXRlciBTdG9yZVxuICAgIGlmIChzdGFnZUNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlPy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gKHN0YWdlQ29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUucGFyYW1ldGVyTmFtZSB8fCAnL3tzdGFja05hbWV9L3ZlcnNpb24nKVxuICAgICAgICAucmVwbGFjZSgne3N0YWNrTmFtZX0nLCBzdGFja05hbWUpXG4gICAgICAgIC5yZXBsYWNlKCd7c3RhZ2VOYW1lfScsIHN0YWdlLm5hbWUpO1xuXG4gICAgICBpZiAoKHN0YWdlQ29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUgYXMgYW55KT8uaGllcmFyY2hpY2FsKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICAgICAgYGVjaG8gXCJGZXRjaGluZyB2ZXJzaW9uIGRhdGEgZnJvbSBTU00gUGFyYW1ldGVyIFN0b3JlIChoaWVyYXJjaGljYWwpIGZvciAke3N0YWdlLm5hbWV9Li4uXCJgLFxuICAgICAgICAgIGBhd3Mgc3NtIGdldC1wYXJhbWV0ZXJzLWJ5LXBhdGggLS1wYXRoIFwiJHtwYXJhbWV0ZXJOYW1lfVwiIC0tcmVnaW9uICR7c3RhZ2UuZW52LnJlZ2lvbn0gLS1yZWN1cnNpdmUgLS1xdWVyeSBcIlBhcmFtZXRlcnNbXS57TmFtZTpOYW1lLFZhbHVlOlZhbHVlfVwiIC0tb3V0cHV0IHRhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICAgICAgYGVjaG8gXCJGZXRjaGluZyB2ZXJzaW9uIGRhdGEgZnJvbSBTU00gUGFyYW1ldGVyIFN0b3JlIGZvciAke3N0YWdlLm5hbWV9Li4uXCJgLFxuICAgICAgICAgIGBhd3Mgc3NtIGdldC1wYXJhbWV0ZXIgLS1uYW1lIFwiJHtwYXJhbWV0ZXJOYW1lfVwiIC0tcmVnaW9uICR7c3RhZ2UuZW52LnJlZ2lvbn0gLS1xdWVyeSBcIlBhcmFtZXRlci57TmFtZTpOYW1lLFZhbHVlOlZhbHVlfVwiIC0tb3V0cHV0IHRhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYHZlcnNpb246ZmV0Y2g6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBGZXRjaCB2ZXJzaW9uIGRhdGEgZnJvbSBkZXBsb3llZCAke3N0YWdlLm5hbWV9IHN0YWNrYCxcbiAgICAgICAgZXhlYzogY29tbWFuZHMuam9pbignICYmICcpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIENESyBhcHBsaWNhdGlvbiBjb2RlIGZvciB2ZXJzaW9uaW5nXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVWZXJzaW9uaW5nQXBwQ29kZShjb25maWc6IFZlcnNpb25pbmdDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4gICAgLy8gQXBwbHkgdmVyc2lvbmluZyB0byBhbGwgc3RhY2tzXG4gICAgdGhpcy5ub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTdGFjaykge1xuICAgICAgICBjb25zdCBzdGFnZU5hbWUgPSBjaGlsZC5zdGFja05hbWUuc3BsaXQoJy0nKS5wb3AoKSB8fCAnZGVmYXVsdCc7XG4gICAgICAgIGFkZFZlcnNpb25pbmdUb1N0YWNrKGNoaWxkLCBzdGFnZU5hbWUsICR7Y29uZmlnLnN0YWdlT3ZlcnJpZGVzID8gJ3ZlcnNpb25pbmdDb25maWcuc3RhZ2VPdmVycmlkZXMnIDogJ3VuZGVmaW5lZCd9KTtcbiAgICAgIH1cbiAgICB9KTtgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHZlcnNpb25pbmcgaW1wb3J0cyBmb3IgQ0RLIGFwcGxpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVWZXJzaW9uaW5nSW1wb3J0cygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpbXBvcnRzLnB1c2goXCJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tICdhd3MtY2RrLWxpYic7XCIpO1xuICAgIGltcG9ydHMucHVzaChcImltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1wiKTtcbiAgICBpbXBvcnRzLnB1c2goXCJpbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcIik7XG5cbiAgICByZXR1cm4gaW1wb3J0cy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB2ZXJzaW9uaW5nIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBDREsgYXBwbGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVZlcnNpb25pbmdVdGlsaXRpZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxuLyoqXG4gKiBWZXJzaW9uIGluZm9ybWF0aW9uIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25JbmZvIHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBjb21taXRIYXNoOiBzdHJpbmc7XG4gIGNvbW1pdEhhc2hTaG9ydDogc3RyaW5nO1xuICBicmFuY2g6IHN0cmluZztcbiAgY29tbWl0Q291bnQ6IG51bWJlcjtcbiAgcGFja2FnZVZlcnNpb246IHN0cmluZztcbiAgZGVwbG95ZWRBdDogc3RyaW5nO1xuICBkZXBsb3llZEJ5OiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTG9hZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gZ2VuZXJhdGVkIGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRWZXJzaW9uSW5mbygpOiBWZXJzaW9uSW5mbyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKCcudmVyc2lvbi50bXAuanNvbicsICd1dGY4JykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgdmVyc2lvbiBpbmZvLCB1c2luZyBmYWxsYmFjaycpO1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAnMC4wLjAnLFxuICAgICAgY29tbWl0SGFzaDogJ3Vua25vd24nLFxuICAgICAgY29tbWl0SGFzaFNob3J0OiAndW5rbm93bicsXG4gICAgICBicmFuY2g6ICd1bmtub3duJyxcbiAgICAgIGNvbW1pdENvdW50OiAwLFxuICAgICAgcGFja2FnZVZlcnNpb246ICcwLjAuMCcsXG4gICAgICBkZXBsb3llZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZXBsb3llZEJ5OiAndW5rbm93bicsXG4gICAgICBlbnZpcm9ubWVudDogJ3Vua25vd24nXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB2ZXJzaW9uaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgc3RhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhZ2VDb25maWcoc3RhZ2VOYW1lOiBzdHJpbmcsIGJhc2VDb25maWc6IGFueSwgc3RhZ2VPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgaWYgKCFzdGFnZU92ZXJyaWRlcyB8fCAhc3RhZ2VPdmVycmlkZXNbc3RhZ2VOYW1lXSkge1xuICAgIHJldHVybiBiYXNlQ29uZmlnO1xuICB9XG4gIFxuICAvLyBNZXJnZSBzdGFnZSBvdmVycmlkZSB3aXRoIGJhc2UgY29uZmlnXG4gIGNvbnN0IG92ZXJyaWRlID0gc3RhZ2VPdmVycmlkZXNbc3RhZ2VOYW1lXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlQ29uZmlnLFxuICAgIG91dHB1dHM6IHtcbiAgICAgIGNsb3VkRm9ybWF0aW9uOiBvdmVycmlkZS5vdXRwdXRzPy5jbG91ZEZvcm1hdGlvbiB8fCBiYXNlQ29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24sXG4gICAgICBwYXJhbWV0ZXJTdG9yZTogb3ZlcnJpZGUub3V0cHV0cz8ucGFyYW1ldGVyU3RvcmUgfHwgYmFzZUNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlLFxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBBZGQgdmVyc2lvbmluZyBvdXRwdXRzIHRvIGEgc3RhY2tcbiAqL1xuZnVuY3Rpb24gYWRkVmVyc2lvbmluZ1RvU3RhY2soc3RhY2s6IFN0YWNrLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VPdmVycmlkZXM/OiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgdmVyc2lvbkluZm8gPSBsb2FkVmVyc2lvbkluZm8oKTtcbiAgY29uc3QgYmFzZUNvbmZpZyA9IHZlcnNpb25pbmdDb25maWc7XG4gIGNvbnN0IGNvbmZpZyA9IGdldFN0YWdlQ29uZmlnKHN0YWdlTmFtZSwgYmFzZUNvbmZpZywgc3RhZ2VPdmVycmlkZXMpO1xuICBcbiAgLy8gQ2hlY2sgaWYgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiBDbG91ZEZvcm1hdGlvbiBvciBQYXJhbWV0ZXJTdG9yZSBjb25maWdzXG4gIGNvbnN0IGNmRm9ybWF0ID0gY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24/LmZvcm1hdCB8fCAnc3RydWN0dXJlZCc7XG4gIGNvbnN0IHNzbUZvcm1hdCA9IGNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlPy5mb3JtYXQgfHwgJ3N0cnVjdHVyZWQnO1xuICBcbiAgLy8gQWRkIENsb3VkRm9ybWF0aW9uIG91dHB1dHNcbiAgaWYgKGNvbmZpZy5vdXRwdXRzLmNsb3VkRm9ybWF0aW9uPy5lbmFibGVkKSB7XG4gICAgaWYgKGNmRm9ybWF0ID09PSAncGxhaW4nKSB7XG4gICAgICAvLyBQbGFpbiBmb3JtYXQgLSBzaW5nbGUgb3V0cHV0IHdpdGggdmVyc2lvbiBzdHJpbmdcbiAgICAgIG5ldyBDZm5PdXRwdXQoc3RhY2ssICdBcHBWZXJzaW9uJywge1xuICAgICAgICB2YWx1ZTogdmVyc2lvbkluZm8udmVyc2lvbixcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBsaWNhdGlvbiB2ZXJzaW9uJyxcbiAgICAgICAgZXhwb3J0TmFtZTogY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdHJ1Y3R1cmVkIGZvcm1hdCAtIG11bHRpcGxlIG91dHB1dHNcbiAgICAgIG5ldyBDZm5PdXRwdXQoc3RhY2ssICdBcHBWZXJzaW9uJywge1xuICAgICAgICB2YWx1ZTogdmVyc2lvbkluZm8udmVyc2lvbixcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBsaWNhdGlvbiB2ZXJzaW9uJyxcbiAgICAgICAgZXhwb3J0TmFtZTogY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZSxcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHN0YWNrLCAnQXBwVmVyc2lvbkNvbW1pdEhhc2gnLCB7XG4gICAgICAgIHZhbHVlOiB2ZXJzaW9uSW5mby5jb21taXRIYXNoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0dpdCBjb21taXQgaGFzaCcsXG4gICAgICAgIGV4cG9ydE5hbWU6IGNvbmZpZy5vdXRwdXRzLmNsb3VkRm9ybWF0aW9uLmV4cG9ydE5hbWUgPyBcXGBcXCR7Y29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZX1Db21taXRIYXNoXFxgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG5ldyBDZm5PdXRwdXQoc3RhY2ssICdBcHBWZXJzaW9uQnJhbmNoJywge1xuICAgICAgICB2YWx1ZTogdmVyc2lvbkluZm8uYnJhbmNoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0dpdCBicmFuY2gnLFxuICAgICAgICBleHBvcnROYW1lOiBjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lID8gXFxgXFwke2NvbmZpZy5vdXRwdXRzLmNsb3VkRm9ybWF0aW9uLmV4cG9ydE5hbWV9QnJhbmNoXFxgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQoc3RhY2ssICdBcHBWZXJzaW9uSW5mbycsIHtcbiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHZlcnNpb25JbmZvKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdDb21wbGV0ZSB2ZXJzaW9uIGluZm9ybWF0aW9uJyxcbiAgICAgICAgZXhwb3J0TmFtZTogY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZSA/IFxcYFxcJHtjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lfUluZm9cXGAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEFkZCBTU00gUGFyYW1ldGVyIFN0b3JlIHBhcmFtZXRlcnNcbiAgaWYgKGNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlPy5lbmFibGVkKSB7XG4gICAgaWYgKGNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlLmhpZXJhcmNoaWNhbCkge1xuICAgICAgLy8gSGllcmFyY2hpY2FsIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGJhc2VQYXJhbWV0ZXJOYW1lID0gKGNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlLnBhcmFtZXRlck5hbWUgfHwgJy97c3RhY2tOYW1lfS92ZXJzaW9uJylcbiAgICAgICAgLnJlcGxhY2UoJ3tzdGFja05hbWV9Jywgc3RhY2suc3RhY2tOYW1lKVxuICAgICAgICAucmVwbGFjZSgne3N0YWdlTmFtZX0nLCBzdGFnZU5hbWUpO1xuICAgICAgICBcbiAgICAgIC8vIENyZWF0ZSBoaWVyYXJjaGljYWwgcGFyYW1ldGVyc1xuICAgICAgbmV3IFN0cmluZ1BhcmFtZXRlcihzdGFjaywgJ1ZlcnNpb25QYXJhbWV0ZXJWZXJzaW9uJywge1xuICAgICAgICBwYXJhbWV0ZXJOYW1lOiBcXGBcXCR7YmFzZVBhcmFtZXRlck5hbWV9L3ZlcnNpb25cXGAsXG4gICAgICAgIHN0cmluZ1ZhbHVlOiB2ZXJzaW9uSW5mby52ZXJzaW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIHZlcnNpb24nLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIoc3RhY2ssICdWZXJzaW9uUGFyYW1ldGVyQ29tbWl0SGFzaCcsIHtcbiAgICAgICAgcGFyYW1ldGVyTmFtZTogXFxgXFwke2Jhc2VQYXJhbWV0ZXJOYW1lfS9jb21taXRIYXNoXFxgLFxuICAgICAgICBzdHJpbmdWYWx1ZTogdmVyc2lvbkluZm8uY29tbWl0SGFzaCxcbiAgICAgICAgZGVzY3JpcHRpb246ICdHaXQgY29tbWl0IGhhc2gnLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIoc3RhY2ssICdWZXJzaW9uUGFyYW1ldGVyQnJhbmNoJywge1xuICAgICAgICBwYXJhbWV0ZXJOYW1lOiBcXGBcXCR7YmFzZVBhcmFtZXRlck5hbWV9L2JyYW5jaFxcYCxcbiAgICAgICAgc3RyaW5nVmFsdWU6IHZlcnNpb25JbmZvLmJyYW5jaCxcbiAgICAgICAgZGVzY3JpcHRpb246ICdHaXQgYnJhbmNoJyxcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBuZXcgU3RyaW5nUGFyYW1ldGVyKHN0YWNrLCAnVmVyc2lvblBhcmFtZXRlckluZm8nLCB7XG4gICAgICAgIHBhcmFtZXRlck5hbWU6IFxcYFxcJHtiYXNlUGFyYW1ldGVyTmFtZX0vaW5mb1xcYCxcbiAgICAgICAgc3RyaW5nVmFsdWU6IEpTT04uc3RyaW5naWZ5KHZlcnNpb25JbmZvKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdDb21wbGV0ZSB2ZXJzaW9uIGluZm9ybWF0aW9uJyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTaW5nbGUgcGFyYW1ldGVyXG4gICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID0gKGNvbmZpZy5vdXRwdXRzLnBhcmFtZXRlclN0b3JlLnBhcmFtZXRlck5hbWUgfHwgJy97c3RhY2tOYW1lfS92ZXJzaW9uJylcbiAgICAgICAgLnJlcGxhY2UoJ3tzdGFja05hbWV9Jywgc3RhY2suc3RhY2tOYW1lKVxuICAgICAgICAucmVwbGFjZSgne3N0YWdlTmFtZX0nLCBzdGFnZU5hbWUpO1xuICAgICAgICBcbiAgICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIoc3RhY2ssICdWZXJzaW9uUGFyYW1ldGVyJywge1xuICAgICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgICBzdHJpbmdWYWx1ZTogc3NtRm9ybWF0ID09PSAncGxhaW4nID8gdmVyc2lvbkluZm8udmVyc2lvbiA6IEpTT04uc3RyaW5naWZ5KHZlcnNpb25JbmZvKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNzbUZvcm1hdCA9PT0gJ3BsYWluJyA/ICdBcHBsaWNhdGlvbiB2ZXJzaW9uJyA6ICdDb21wbGV0ZSB2ZXJzaW9uIGluZm9ybWF0aW9uJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufWA7XG4gIH1cbn1cbiJdfQ==
769
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLG1DQUFxRDtBQUNyRCw4Q0FBa0Q7QUFDbEQsc0RBQTJEO0FBQzNELHNDQUEyQztBQUMzQyxvQ0FBZ0o7QUFDaEosOENBQWtFO0FBdUJsRSxNQUFNO0FBQ04seURBQXlEO0FBQ3pELE1BQU07QUFDTiwrQkFBK0I7QUFDL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQiw0RUFBNEU7QUFDNUUseUJBQXlCO0FBQ3pCLElBQUk7QUFFSixJQUFZLFdBT1g7QUFQRCxXQUFZLFdBQVc7SUFDckIsNEJBQTRCO0lBQzVCLDZDQUFJLENBQUE7SUFDSixvREFBb0Q7SUFDcEQsNkNBQUksQ0FBQTtJQUNKLHVEQUF1RDtJQUN2RCw2Q0FBSSxDQUFBO0FBQ04sQ0FBQyxFQVBXLFdBQVcsMkJBQVgsV0FBVyxRQU90QjtBQWdORDs7O0dBR0c7QUFDSCxNQUFzQixXQUFZLFNBQVEsa0JBQVM7SUFhM0I7SUFBMkM7O0lBWmpELFdBQVcsQ0FBUztJQUNwQixVQUFVLENBQVM7SUFFbkMsNEdBQTRHO0lBQ3pGLFVBQVUsQ0FBUztJQUV0Qzs7O09BR0c7SUFDZ0IsZ0JBQWdCLENBQXFCO0lBRXhELFlBQXNCLEdBQStCLEVBQVksV0FBK0I7UUFDOUYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRFMsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFHOUYsaURBQWlEO1FBQ2pELElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFH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aUMsQ0FBQyxDQUFDLENBQUMsV0FBVzs7UUFFaEgsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLHlCQUF5QjtRQUM5QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFFN0IsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFL0MsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUpULENBQUM7SUFDRCxDQUFDOztBQW53Qkgsa0NBb3dCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUsIGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBQUk9KRU5fTUFSS0VSIH0gZnJvbSAncHJvamVuL2xpYi9jb21tb24nO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcbmltcG9ydCB7IFBpcGVsaW5lRW5naW5lIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEF3c0Fzc3VtZVJvbGVTdGVwLCBQaXBlbGluZVN0ZXAsIFByb2plblNjcmlwdFN0ZXAsIFNpbXBsZUNvbW1hbmRTdGVwLCBTdGVwU2VxdWVuY2UsIFBucG1TZXR1cFN0ZXAsIENvcmVwYWNrU2V0dXBTdGVwIH0gZnJvbSAnLi4vc3RlcHMnO1xuaW1wb3J0IHsgVmVyc2lvbmluZ0NvbmZpZywgVmVyc2lvbmluZ1NldHVwIH0gZnJvbSAnLi4vdmVyc2lvbmluZyc7XG5cbi8qKlxuICogVGhlIEVudmlyb25tZW50IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBob2xkIEFXUyByZWxhdGVkIGluZm9ybWF0aW9uXG4gKiBmb3IgYSBzcGVjaWZpYyBkZXBsb3ltZW50IGVudmlyb25tZW50IHdpdGhpbiB5b3VyIGluZnJhc3RydWN0dXJlLlxuICogRWFjaCBlbnZpcm9ubWVudCByZXF1aXJlcyBhIHNwZWNpZmljIGFjY291bnQgYW5kIHJlZ2lvbiBmb3IgaXRzIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudCB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIEFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnZpcm9ubWVudC4gSXQncyBpbXBvcnRhbnQgYmVjYXVzZVxuICAgKiBkaWZmZXJlbnQgc2VydmljZXMgb3IgZmVhdHVyZXMgY291bGQgaGF2ZSBkaXN0aW5jdCBwZXJtaXNzaW9ucyBhbmQgc2V0dGluZ3NcbiAgICogaW4gZGlmZmVyZW50IGFjY291bnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIFJlZ2lvbiBmb3IgdGhlIGVudmlyb25tZW50LiBUaGlzIGRldGVybWluZXMgd2hlcmUgeW91ciByZXNvdXJjZXNcbiAgICogYXJlIGNyZWF0ZWQgYW5kIHdoZXJlIHlvdXIgYXBwbGljYXRpb24gd2lsbCBydW4uIEl0IGNhbiBhZmZlY3QgbGF0ZW5jeSxcbiAgICogYXZhaWxhYmlsaXR5LCBhbmQgcHJpY2luZy5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG4vLyAvKipcbi8vICAqIERlc2NyaWJlcyB0aGUgdHlwZSBvZiBwaXBlbGluZSB0aGF0IHdpbGwgYmUgY3JlYXRlZFxuLy8gICovXG4vLyBleHBvcnQgZW51bSBEZXBsb3ltZW50VHlwZSB7XG4vLyAgIC8qKiBEZXBsb3kgZXZlcnkgY29tbWl0IGFzIGZhciBhcyBwb3NzaWJsZTsgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbiAqL1xuLy8gICBDT05USU5VT1VTX0RFUExPWU1FTlQsXG4vLyAgIC8qKiBCdWlsZCBldmVyeSBjb21taXQgYW5kIHByZXBhcmUgYWxsIGFzc2V0cyBmb3IgYSBsYXRlciBkZXBsb3ltZW50ICovXG4vLyAgIENPTlRJTlVPVVNfREVMSVZFUlksXG4vLyB9XG5cbmV4cG9ydCBlbnVtIENka0RpZmZUeXBlIHtcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGEgZGlmZiAqL1xuICBOT05FLFxuICAvKiogUGVyZm9ybSBhIGZhc3QgdGVtcGxhdGUgZGlmZiAoLS1uby1jaGFuZ2VzZXQpICovXG4gIEZBU1QsXG4gIC8qKiBQZXJmb3JtIGEgZnVsbCBDbG91ZEZvcm1hdGlvbiBkaWZmICgtLWNoYW5nZXNldCkgKi9cbiAgRlVMTCxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFnZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgcGlwZWxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50U3RhZ2UgZXh0ZW5kcyBOYW1lZFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG1hbnVhbEFwcHJvdmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFnZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHBpcGVsaW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXBlbmRlbnRTdGFnZSBleHRlbmRzIE5hbWVkU3RhZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoaXMgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN0YWdlIHNob3VsZCBiZSBkZXBsb3llZCBvbiBwdXNoXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lPblB1c2g/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgQ0RLIHN0YWdlIHdpdGggYSBuYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRTdGFnZU9wdGlvbnMgZXh0ZW5kcyBTdGFnZU9wdGlvbnMge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBHaXRIdWIgZW52aXJvbm1lbnQgdG8gdXNlIGZvciB0aGlzIHN0YWdlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhZ2UgbmFtZSB3aWxsIGJlIHVzZWQgYXMgdGhlIEdpdEh1YiBlbnZpcm9ubWVudCBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzdGFnZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBnaXRodWJFbnZpcm9ubWVudD86IHN0cmluZztcblxuICByZWFkb25seSB3YXRjaGFibGU/OiBib29sZWFuO1xuICByZWFkb25seSBkaWZmVHlwZT86IENka0RpZmZUeXBlO1xuICByZWFkb25seSBwb3N0RGlmZlN0ZXBzPzogUGlwZWxpbmVTdGVwW107XG4gIHJlYWRvbmx5IHBvc3REZXBsb3lTdGVwcz86IFBpcGVsaW5lU3RlcFtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgQ0RLIHN0YWdlIGxpa2UgdGhlIHRhcmdldCBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIElBTSByb2xlcyB1c2VkIGluIHRoZSBDREsgcGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWFtUm9sZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IElBTSByb2xlIEFSTiB1c2VkIGlmIG5vIHNwZWNpZmljIHJvbGUgaXMgcHJvdmlkZWQuICovXG4gIHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBBUk4gZm9yIHRoZSBzeW50aGVzaXMgc3RlcC4gKi9cbiAgcmVhZG9ubHkgc3ludGg/OiBzdHJpbmc7XG4gIC8qKiBJQU0gcm9sZSBBUk4gZm9yIHRoZSBhc3NldCBwdWJsaXNoaW5nIHN0ZXAuICovXG4gIHJlYWRvbmx5IGFzc2V0UHVibGlzaGluZz86IHN0cmluZztcbiAgLyoqIElBTSByb2xlIEFSTiBmb3IgdGhlIGFzc2V0IHB1Ymxpc2hpbmcgc3RlcCBmb3IgYSBzcGVjaWZpYyBzdGFnZS4gKi9cbiAgcmVhZG9ubHkgYXNzZXRQdWJsaXNoaW5nUGVyU3RhZ2U/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBJQU0gcm9sZSBBUk5zIGZvciBkaWZmZXJlbnQgZGlmZiBzdGFnZXMuICovXG4gIHJlYWRvbmx5IGRpZmY/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBJQU0gcm9sZSBBUk5zIGZvciBkaWZmZXJlbnQgZGVwbG95bWVudCBzdGFnZXMuICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnQ/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBJQU0gcm9sZSBBUk5zIGZvciB1c2luZyBhIFwianVtcFwiIHJvbGUgdG8gYXNzdW1lIHRoZSBkZXBsb3kgcm9sZSBpbiBhIGRpZmZlcmVudCBBV1MgYWNjb3VudCB1c2luZyBSb2xlIENoYWluaW5nLlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFscz90YWI9cmVhZG1lLW92LWZpbGUjYXNzdW1lcm9sZS13aXRoLXJvbGUtcHJldmlvdXNseS1hc3N1bWVkLWJ5LWFjdGlvbi1pbi1zYW1lLXdvcmtmbG93XG4gICAqICovXG4gIHJlYWRvbmx5IGp1bXA/OiB7IFtzdGFnZTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lT3B0aW9ucyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uXG4gKiBvcHRpb25zIGZvciBhIENESyAoQ2xvdWQgRGV2ZWxvcG1lbnQgS2l0KSBwaXBlbGluZS4gSXQgYWxsb3dzIHRoZSBkZWZpbml0aW9uXG4gKiBvZiBzZXR0aW5ncyBzdWNoIGFzIHRoZSBzdGFjayBwcmVmaXggYW5kIHBhY2thZ2UgbmFtZXNwYWNlIHRvIGJlIHVzZWQgaW4gdGhlXG4gKiBBV1Mgc3RhY2ssIGFsb25nIHdpdGggdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcblxuICAvKipcbiAgICogQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBwaXBlbGluZSwgdXNlZCBhcyBhIHByZWZpeCBmb3Igd29ya2Zsb3cgZmlsZXMsXG4gICAqIGNvbmN1cnJlbmN5IGdyb3VwcywgYW5kIGFydGlmYWN0IG5hbWVzIHRvIHByZXZlbnQgY29sbGlzaW9ucyBpbiBtb25vcmVwb3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHByb2plY3QgbmFtZSBpZiB0aGUgcHJvamVjdCBoYXMgYSBwYXJlbnQgKG1vbm9yZXBvIHN1YnByb2plY3QpLCBvdGhlcndpc2Ugbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRoZSBuYW1lIG9mIHRoZSBicmFuY2ggdG8gZGVwbG95IGZyb21cbiAgICogQGRlZmF1bHQgbWFpblxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBwYXRoIHBhdHRlcm5zIHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIHBpcGVsaW5lIHdoZW4gY2hhbmdlZC5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG1vbm9yZXBvcyB3aGVyZSB5b3Ugb25seSB3YW50IHRvIHJ1biB0aGUgcGlwZWxpbmVcbiAgICogd2hlbiBmaWxlcyBpbiBhIHNwZWNpZmljIHN1YnByb2plY3QgYXJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBGb3IgR2l0SHViLCB0aGVzZSBhcmUgdXNlZCBhcyBgb24ucHVzaC5wYXRoc2AgYW5kIGBvbi5wdWxsX3JlcXVlc3QucGF0aHNgIGZpbHRlcnMuXG4gICAqIEZvciBHaXRMYWIsIHRoZXNlIGFyZSB1c2VkIGFzIGBvbmx5LmNoYW5nZXNgIGZpbHRlcnMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsncGFja2FnZXMvbXktYXBwLyoqJywgJ3NoYXJlZC1saWJzLyoqJ11cbiAgICogQGRlZmF1bHQgLSBhbGwgcGF0aHMgdHJpZ2dlciB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHBhdGhzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBkZWZpbmUgYSBwcmVmaXggZm9yIHRoZSBBV1MgU3RhY2sgcmVzb3VyY2VzIGNyZWF0ZWRcbiAgICogZHVyaW5nIHRoZSBwaXBlbGluZSdzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgcHJvamVjdCBuYW1lXG4gICAqL1xuICByZWFkb25seSBzdGFja1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUgYWxsIENESyBhY3Rpb25zIHdpbGwgYWxzbyBpbmNsdWRlIDxzdGFja05hbWU+LyogdG8gZGVwbG95L2RpZmYvZGVzdHJveSBzdWIgc3RhY2tzIG9mIHRoZSBtYWluIHN0YWNrLlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGRlcGxveSBDRGsgYXBwbGljYXRpb25zIGNvbnRhaW5pbmcgbXVsdGlwbGUgc3RhY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95U3ViU3RhY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSBOUE0gbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiBwYWNrYWdpbmcgQ0RLIGNsb3VkXG4gICAqIGFzc2VtYmxpZXMuIEEgbmFtZXNwYWNlIGhlbHBzIGdyb3VwIHJlbGF0ZWQgcmVzb3VyY2VzIHRvZ2V0aGVyLCBwcm92aWRpbmdcbiAgICogYmV0dGVyIG9yZ2FuaXphdGlvbiBhbmQgZWFzZSBvZiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIHlvdSBuZWVkIHRvIHZlcnNpb24gYW5kIHVwbG9hZCB0aGUgY2xvdWQgYXNzZW1ibHkgdG8gYSBwYWNrYWdlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBrZ05hbWVzcGFjZT86IHN0cmluZztcblxuICAvKiogSUFNIGNvbmZpZyAqL1xuICByZWFkb25seSBpYW1Sb2xlQXJuczogSWFtUm9sZUNvbmZpZztcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgYSBsaXN0IG9mIHN0YWdlcyB0aGF0IHNob3VsZCBiZSBkZXBsb3llZCB1c2luZyBhIENJL0NEIHBpcGVsaW5lXG4gICAqL1xuICByZWFkb25seSBzdGFnZXM6IERlcGxveW1lbnRTdGFnZVtdO1xuXG4gIC8qKiBUaGlzIHNwZWNpZmllcyBkZXRhaWxzIGZvciBpbmRlcGVuZGVudCBzdGFnZXMgKi9cbiAgcmVhZG9ubHkgaW5kZXBlbmRlbnRTdGFnZXM/OiBJbmRlcGVuZGVudFN0YWdlW107XG5cbiAgLyoqIFRoaXMgc3BlY2lmaWVzIGRldGFpbHMgZm9yIGEgcGVyc29uYWwgc3RhZ2UgKi9cbiAgcmVhZG9ubHkgcGVyc29uYWxTdGFnZT86IFN0YWdlT3B0aW9ucztcblxuICAvKiogVGhpcyBzcGVjaWZpZXMgZGV0YWlscyBmb3IgZmVhdHVyZSBzdGFnZXMgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZVN0YWdlcz86IFN0YWdlT3B0aW9ucztcblxuICAvLyAvKipcbiAgLy8gICogVGhpcyBmaWVsZCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgcGlwZWxpbmUgdG8gY3JlYXRlLiBJZiBzZXQgdG8gQ09OVElOVU9VU19ERVBMT1lNRU5ULFxuICAvLyAgKiBldmVyeSBjb21taXQgaXMgZGVwbG95ZWQgYXMgZmFyIGFzIHBvc3NpYmxlLCBob3BlZnVsbHkgaW50byBwcm9kdWN0aW9uLiBJZiBzZXQgdG9cbiAgLy8gICogQ09OVElOVU9VU19ERUxJVkVSWSwgZXZlcnkgY29tbWl0IGlzIGJ1aWx0IGFuZCBhbGwgYXNzZXRzIGFyZSBwcmVwYXJlZCBmb3IgYSBsYXRlciBkZXBsb3ltZW50LlxuICAvLyAgKlxuICAvLyAgKiBAZGVmYXVsdCBDT05USU5VT1VTX0RFTElWRVJZXG4gIC8vICAqL1xuICAvLyByZWFkb25seSBkZXBsb3ltZW50VHlwZT86IERlcGxveW1lbnRUeXBlO1xuXG4gIHJlYWRvbmx5IHByZUluc3RhbGxDb21tYW5kcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVTeW50aENvbW1hbmRzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHBvc3RTeW50aENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgcmVhZG9ubHkgcHJlSW5zdGFsbFN0ZXBzPzogUGlwZWxpbmVTdGVwW107XG4gIHJlYWRvbmx5IHByZVN5bnRoU3RlcHM/OiBQaXBlbGluZVN0ZXBbXTtcbiAgcmVhZG9ubHkgcG9zdFN5bnRoU3RlcHM/OiBQaXBlbGluZVN0ZXBbXTtcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgcGlwZWxpbmUgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGZvciBzdWJwcm9qZWN0cyBidXQgY2FuIGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgKlxuICAgKiBXaGVuIHNldCwgQ0kgam9icyB3aWxsIHJ1biBjb21tYW5kcyBpbiB0aGlzIGRpcmVjdG9yeSwgYW5kIGFydGlmYWN0IHBhdGhzXG4gICAqIHdpbGwgYmUgcHJlZml4ZWQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b21hdGljYWxseSBjb21wdXRlZCBmcm9tIHRoZSBwcm9qZWN0J3MgcG9zaXRpb24gaW4gdGhlIG1vbm9yZXBvIChlbXB0eSBzdHJpbmcgZm9yIHJvb3QgcHJvamVjdHMpXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbW1hbmQgdG8gcnVuIGJlZm9yZSB0aGUgYnVpbGQgc3RlcCwgZXhlY3V0ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgKiBXaGVuIGEgd29ya2luZ0RpcmVjdG9yeSBpcyBzZXQgKG1vbm9yZXBvIHN1YnByb2plY3QpLCB0aGUgY29tbWFuZCBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgdG8gZXhlY3V0ZSBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3QgcmVnYXJkbGVzcyBvZlxuICAgKiB0aGUgam9iJ3Mgd29ya2luZyBkaXJlY3Rvcnkgc2V0dGluZy5cbiAgICpcbiAgICogRm9yIHBucG0gd29ya3NwYWNlczogYHBucG0gLXIgLS1maWx0ZXIgPGFwcG5hbWU+Xi4uLiBydW4gYnVpbGRgXG4gICAqIEZvciBucG0gd29ya3NwYWNlczogYG5wbSBydW4gYnVpbGQgLS13b3Jrc3BhY2VzIC0taWYtcHJlc2VudGBcbiAgICogRm9yIHlhcm4gd29ya3NwYWNlczogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC1SdCBydW4gYnVpbGRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlLWJ1aWxkIGNvbW1hbmRcbiAgICovXG4gIHJlYWRvbmx5IHByZUJ1aWxkQ29tbWFuZD86IHN0cmluZztcblxuICAvKipcbiAgICogVmVyc2lvbmluZyBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uaW5nPzogVmVyc2lvbmluZ0NvbmZpZztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBhc3NldCB1cGxvYWRzIHRoZSBgY2RrIHB1Ymxpc2gtYXNzZXRzYCBzdWJjb21tYW5kIHJ1bnMgaW5cbiAgICogcGFyYWxsZWwgcGVyIHN0YWdlLiBQYXNzZWQgdGhyb3VnaCBhcyBgLS1jb25jdXJyZW5jeWAuIEhpZ2hlciB2YWx1ZXMgc3BlZWRcbiAgICogdXAgcHVibGlzaGluZyBmb3Igc3RhY2tzIHdpdGggbWFueSBhc3NldHMgYXQgdGhlIGNvc3Qgb2YgbW9yZSBjb25jdXJyZW50XG4gICAqIHVwbG9hZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIENMSSBkZWZhdWx0ICg0KVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQdWJsaXNoaW5nQ29uY3VycmVuY3k/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lIGNsYXNzIGV4dGVuZHMgdGhlIENvbXBvbmVudCBjbGFzcyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZm9yIGRlcGxveWluZyBBV1MgQ0RLIChDbG91ZCBEZXZlbG9wbWVudCBLaXQpIGFwcGxpY2F0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgc3RhZ2VzLlxuICogSXQgYWxzbyBtYW5hZ2VzIHRhc2tzIHN1Y2ggYXMgcHVibGlzaGluZyBDREsgYXNzZXRzLCBidW1waW5nIHZlcnNpb24gYmFzZWQgb24gZ2l0IHRhZ3MsIGFuZCBjbGVhbmluZyB1cCBjb25mbGljdGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENES1BpcGVsaW5lIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YWNrUHJlZml4OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBicmFuY2hOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFByZWZpeCBmb3Igd29ya2Zsb3cgZmlsZXMsIGNvbmN1cnJlbmN5IGdyb3VwcywgYW5kIGFydGlmYWN0IG5hbWVzIHRvIHByZXZlbnQgY29sbGlzaW9ucyBpbiBtb25vcmVwb3MuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290IGZvciB0aGlzIHBpcGVsaW5lLlxuICAgKiBVbmRlZmluZWQgd2hlbiB0aGUgcGlwZWxpbmUgaXMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByb3RlY3RlZCBiYXNlT3B0aW9uczogQ0RLUGlwZWxpbmVPcHRpb25zKSB7XG4gICAgc3VwZXIoYXBwKTtcblxuICAgIC8vIENvbXB1dGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIG1vbm9yZXBvIHN1cHBvcnRcbiAgICBpZiAoYmFzZU9wdGlvbnMud29ya2luZ0RpcmVjdG9yeSkge1xuICAgICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gYmFzZU9wdGlvbnMud29ya2luZ0RpcmVjdG9yeTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwcC5yb290Lm91dGRpciwgdGhpcy5hcHAub3V0ZGlyKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICB0aGlzLndvcmtpbmdEaXJlY3RvcnkgPSByZWwgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEFkZCBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXNcbiAgICB0aGlzLmFwcC5hZGREZXZEZXBzKFxuICAgICAgJ2NvbW1pdC1hbmQtdGFnLXZlcnNpb24nLFxuICAgICk7XG4gICAgLy8gdGhpcy5hcHAuYWRkRGVwcyhcbiAgICAvLyApO1xuICAgIHRoaXMucHJvamVjdC5naXRpZ25vcmUuZXhjbHVkZSgnL2Nkay1vdXRwdXRzLSouanNvbicpO1xuXG4gICAgY29uc3QgcGlwZWxpbmVOYW1lID0gYmFzZU9wdGlvbnMucGlwZWxpbmVOYW1lID8/IChhcHAucGFyZW50ID8gYXBwLm5hbWUgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFtZVByZWZpeCA9IHBpcGVsaW5lTmFtZSA/IGAke3BpcGVsaW5lTmFtZX0tYCA6ICcnO1xuICAgIHRoaXMuc3RhY2tQcmVmaXggPSBiYXNlT3B0aW9ucy5zdGFja1ByZWZpeCA/PyBhcHAubmFtZTtcbiAgICB0aGlzLmJyYW5jaE5hbWUgPSBiYXNlT3B0aW9ucy5icmFuY2hOYW1lID8/ICdtYWluJzsgLy8gVE9ETyB1c2UgZGVmYXVsdFJlbGVhc2VCcmFuY2ggb2YgTm9kZVByb2plY3RcblxuICAgIC8vIFJlbW92ZXMgdGhlIGNvbXBpbGVkIGNsb3VkIGFzc2VtYmx5IGJlZm9yZSBlYWNoIHN5bnRoXG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoJ3N5bnRoJyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aDpzaWxlbnQnKT8ucHJlcGVuZEV4ZWMoYHJtIC1yZiAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9YCk7XG5cbiAgICAvLyBSZW1vdmUgdGFza3MgdGhhdCBtaWdodCBjb25mbGljdCB3aXRoIHRoZSBwaXBlbGluZSBwcm9jZXNzXG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2RlcGxveScpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkaWZmJyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2Rlc3Ryb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnd2F0Y2gnKTtcblxuICAgIC8vIFNldHVwIHZlcnNpb25pbmcgaWYgZW5hYmxlZFxuICAgIGlmIChiYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkKSB7XG4gICAgICBuZXcgVmVyc2lvbmluZ1NldHVwKHRoaXMucHJvamVjdCwgYmFzZU9wdGlvbnMudmVyc2lvbmluZykuc2V0dXAoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGVzIGRpZmZlcmVudCBkZXBsb3ltZW50IHN0YWdlc1xuICAgIGlmIChiYXNlT3B0aW9ucy5wZXJzb25hbFN0YWdlKSB7XG4gICAgICB0aGlzLmNyZWF0ZVBlcnNvbmFsU3RhZ2UoKTtcbiAgICB9XG4gICAgaWYgKGJhc2VPcHRpb25zLmZlYXR1cmVTdGFnZXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlRmVhdHVyZVN0YWdlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgYmFzZU9wdGlvbnMuc3RhZ2VzKSB7XG4gICAgICB0aGlzLmNyZWF0ZVBpcGVsaW5lU3RhZ2Uoc3RhZ2UpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIChiYXNlT3B0aW9ucy5pbmRlcGVuZGVudFN0YWdlcyA/PyBbXSkpIHtcbiAgICAgIHRoaXMuY3JlYXRlSW5kZXBlbmRlbnRTdGFnZShzdGFnZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlcyB0YXNrcyB0byBoYW5kbGUgdGhlIHJlbGVhc2UgcHJvY2Vzc1xuICAgIHRoaXMuY3JlYXRlUmVsZWFzZVRhc2tzKCk7XG5cbiAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgQ0RLIEFwcCBjbGFzc1xuICAgIHRoaXMuY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCk7XG5cbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBlbmdpbmVUeXBlKCk6IFBpcGVsaW5lRW5naW5lO1xuXG4gIHByb3RlY3RlZCBwcm92aWRlSW5zdGFsbFN0ZXAoKTogUGlwZWxpbmVTdGVwIHtcbiAgICBjb25zdCBzZXEgPSBuZXcgU3RlcFNlcXVlbmNlKHRoaXMucHJvamVjdCwgdGhpcy5iYXNlT3B0aW9ucy5wcmVJbnN0YWxsU3RlcHMgPz8gW10pO1xuXG4gICAgLy8gRGV0ZWN0IGFuZCBhZGQgcG5wbSBzZXR1cCBpZiBuZWVkZWQgKEdpdEh1YiBvbmx5KVxuICAgIGlmICh0aGlzLmFwcC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTSAmJiB0aGlzLmVuZ2luZVR5cGUoKSA9PT0gUGlwZWxpbmVFbmdpbmUuR0lUSFVCKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFBucG1TZXR1cFN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgIHZlcnNpb246ICh0aGlzLmFwcC5wYWNrYWdlIGFzIGFueSkucG5wbVZlcnNpb24sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IGFuZCBhZGQgY29yZXBhY2sgZW5hYmxlIGZvciBZYXJuIEJlcnJ5XG4gICAgaWYgKHRoaXMuYXBwLnBhY2thZ2UucGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0JFUlJZKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IENvcmVwYWNrU2V0dXBTdGVwKHRoaXMucHJvamVjdCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLnByZUluc3RhbGxDb21tYW5kcykge1xuICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBTaW1wbGVDb21tYW5kU3RlcCh0aGlzLnByb2plY3QsIHRoaXMuYmFzZU9wdGlvbnMucHJlSW5zdGFsbENvbW1hbmRzKSk7XG4gICAgfVxuICAgIHNlcS5hZGRTdGVwcyhuZXcgU2ltcGxlQ29tbWFuZFN0ZXAodGhpcy5wcm9qZWN0LCBbdGhpcy5hcHAucGFja2FnZS5pbnN0YWxsQ29tbWFuZF0pKTtcbiAgICByZXR1cm4gc2VxO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb3ZpZGVTeW50aFN0ZXAoKTogUGlwZWxpbmVTdGVwIHtcbiAgICBjb25zdCBzZXEgPSBuZXcgU3RlcFNlcXVlbmNlKHRoaXMucHJvamVjdCwgW10pO1xuXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LnN5bnRoKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IEF3c0Fzc3VtZVJvbGVTdGVwKHRoaXMucHJvamVjdCwge1xuICAgICAgICByb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLnN5bnRoLFxuICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5zeW50aCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXEuYWRkU3RlcHMoLi4udGhpcy5iYXNlT3B0aW9ucy5wcmVTeW50aFN0ZXBzID8/IFtdKTtcbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5wcmVTeW50aENvbW1hbmRzKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFNpbXBsZUNvbW1hbmRTdGVwKHRoaXMucHJvamVjdCwgdGhpcy5iYXNlT3B0aW9ucy5wcmVTeW50aENvbW1hbmRzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZU9wdGlvbnMucHJlQnVpbGRDb21tYW5kKSB7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFNpbXBsZUNvbW1hbmRTdGVwKHRoaXMucHJvamVjdCwgW3RoaXMucHJlQnVpbGRDb21tYW5kV3JhcHBlZCgpXSkpO1xuICAgIH1cblxuICAgIHNlcS5hZGRTdGVwcyhuZXcgUHJvamVuU2NyaXB0U3RlcCh0aGlzLnByb2plY3QsICdidWlsZCcpKTtcblxuICAgIHNlcS5hZGRTdGVwcyguLi50aGlzLmJhc2VPcHRpb25zLnBvc3RTeW50aFN0ZXBzID8/IFtdKTtcbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5wb3N0U3ludGhDb21tYW5kcykge1xuICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBTaW1wbGVDb21tYW5kU3RlcCh0aGlzLnByb2plY3QsIHRoaXMuYmFzZU9wdGlvbnMucG9zdFN5bnRoQ29tbWFuZHMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcmVCdWlsZENvbW1hbmQgd3JhcHBlZCB0byBleGVjdXRlIGZyb20gdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICogV2hlbiB3b3JraW5nRGlyZWN0b3J5IGlzIHNldCwgdGhlIGNvbW1hbmQgaXMgcHJlZml4ZWQgd2l0aCBhIGNkIHRvIHRoZVxuICAgKiByZXBvIHJvb3QgdXNpbmcgZW5naW5lLWFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHByaXZhdGUgcHJlQnVpbGRDb21tYW5kV3JhcHBlZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNtZCA9IHRoaXMuYmFzZU9wdGlvbnMucHJlQnVpbGRDb21tYW5kITtcbiAgICBpZiAoIXRoaXMud29ya2luZ0RpcmVjdG9yeSkge1xuICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLmVuZ2luZVR5cGUoKSkge1xuICAgICAgY2FzZSBQaXBlbGluZUVuZ2luZS5HSVRIVUI6XG4gICAgICAgIHJldHVybiBgY2QgJEdJVEhVQl9XT1JLU1BBQ0UgJiYgJHtjbWR9YDtcbiAgICAgIGNhc2UgUGlwZWxpbmVFbmdpbmUuR0lUTEFCOlxuICAgICAgICByZXR1cm4gYChjZCAkQ0lfUFJPSkVDVF9ESVIgJiYgJHtjbWR9KWA7XG4gICAgICBjYXNlIFBpcGVsaW5lRW5naW5lLkJBU0g6XG4gICAgICAgIHJldHVybiBgKGNkIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiAmJiAke2NtZH0pYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHByb3ZpZGVBc3NldFVwbG9hZFN0ZXAoc3RhZ2VOYW1lPzogc3RyaW5nKTogUGlwZWxpbmVTdGVwIHtcbiAgICBjb25zdCBzZXEgPSBuZXcgU3RlcFNlcXVlbmNlKHRoaXMucHJvamVjdCwgW10pO1xuXG4gICAgY29uc3QgZ2xvYmFsUHVibGlzaFJvbGUgPSB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmFzc2V0UHVibGlzaGluZyA/PyB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmRlZmF1bHQhO1xuICAgIGlmIChzdGFnZU5hbWUpIHtcbiAgICAgIHNlcS5hZGRTdGVwcyhuZXcgQXdzQXNzdW1lUm9sZVN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgIHJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuYXNzZXRQdWJsaXNoaW5nUGVyU3RhZ2UgP1xuICAgICAgICAgICh0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmFzc2V0UHVibGlzaGluZ1BlclN0YWdlW3N0YWdlTmFtZV0gPz8gZ2xvYmFsUHVibGlzaFJvbGUpIDpcbiAgICAgICAgICBnbG9iYWxQdWJsaXNoUm9sZSxcbiAgICAgICAganVtcFJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuanVtcD8uW3N0YWdlTmFtZV0sXG4gICAgICB9KSk7XG4gICAgICBzZXEuYWRkU3RlcHMobmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCBgcHVibGlzaDphc3NldHM6JHtzdGFnZU5hbWV9YCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5hc3NldFB1Ymxpc2hpbmdQZXJTdGFnZSkge1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBbLi4udGhpcy5iYXNlT3B0aW9ucy5zdGFnZXMsIC4uLnRoaXMuYmFzZU9wdGlvbnMuaW5kZXBlbmRlbnRTdGFnZXMgPz8gW11dO1xuICAgICAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgICAgICAgIHNlcS5hZGRTdGVwcyhuZXcgQXdzQXNzdW1lUm9sZVN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgICAgICByb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zLmFzc2V0UHVibGlzaGluZ1BlclN0YWdlW3N0YWdlLm5hbWVdID8/IGdsb2JhbFB1Ymxpc2hSb2xlLFxuICAgICAgICAgICAganVtcFJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnMuanVtcD8uW3N0YWdlLm5hbWVdLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBzZXEuYWRkU3RlcHMobmV3IFByb2plblNjcmlwdFN0ZXAodGhpcy5wcm9qZWN0LCBgcHVibGlzaDphc3NldHM6JHtzdGFnZS5uYW1lfWApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBBd3NBc3N1bWVSb2xlU3RlcCh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgICByb2xlQXJuOiBnbG9iYWxQdWJsaXNoUm9sZSxcbiAgICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5hc3NldFB1Ymxpc2hpbmcsXG4gICAgICAgIH0pKTtcbiAgICAgICAgc2VxLmFkZFN0ZXBzKG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgJ3B1Ymxpc2g6YXNzZXRzJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXE7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvdmlkZUFzc2VtYmx5VXBsb2FkU3RlcCgpOiBQaXBlbGluZVN0ZXAge1xuICAgIGlmICghdGhpcy5iYXNlT3B0aW9ucy5wa2dOYW1lc3BhY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGtnTmFtZXNwYWNlIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdmVyc2lvbmVkIGFydGlmYWN0cyAoZS5nLiBtYW51YWwgYXBwcm92YWxzKScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN0ZXBTZXF1ZW5jZSh0aGlzLnByb2plY3QsIFtcbiAgICAgIG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgJ2J1bXAnKSxcbiAgICAgIG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgJ3JlbGVhc2U6cHVzaC1hc3NlbWJseScpLFxuICAgIF0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb3ZpZGVEZXBsb3lTdGVwKHN0YWdlOiBOYW1lZFN0YWdlT3B0aW9ucyk6IFBpcGVsaW5lU3RlcCB7XG4gICAgcmV0dXJuIG5ldyBTdGVwU2VxdWVuY2UodGhpcy5wcm9qZWN0LCBbXG4gICAgICBuZXcgQXdzQXNzdW1lUm9sZVN0ZXAodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgIHJvbGVBcm46IHRoaXMuYmFzZU9wdGlvbnMuaWFtUm9sZUFybnM/LmRlcGxveW1lbnQ/LltzdGFnZS5uYW1lXSA/PyB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zPy5kZWZhdWx0ISxcbiAgICAgICAgcmVnaW9uOiBzdGFnZS5lbnYucmVnaW9uLFxuICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5bc3RhZ2UubmFtZV0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgYGRlcGxveToke3N0YWdlLm5hbWV9YCksXG4gICAgICAuLi5zdGFnZS5wb3N0RGVwbG95U3RlcHMgPz8gW10sXG4gICAgXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvdmlkZURpZmZTdGVwKHN0YWdlOiBOYW1lZFN0YWdlT3B0aW9ucywgZmFzdD86IGJvb2xlYW4pOiBQaXBlbGluZVN0ZXAge1xuICAgIHJldHVybiBuZXcgU3RlcFNlcXVlbmNlKHRoaXMucHJvamVjdCwgW1xuICAgICAgbmV3IEF3c0Fzc3VtZVJvbGVTdGVwKHRoaXMucHJvamVjdCwge1xuICAgICAgICByb2xlQXJuOiB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zPy5kaWZmPy5bc3RhZ2UubmFtZV0gPz9cbiAgICAgICAgICB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zPy5kZXBsb3ltZW50Py5bc3RhZ2UubmFtZV0gPz9cbiAgICAgICAgICB0aGlzLmJhc2VPcHRpb25zLmlhbVJvbGVBcm5zPy5kZWZhdWx0ISxcbiAgICAgICAgcmVnaW9uOiBzdGFnZS5lbnYucmVnaW9uLFxuICAgICAgICBqdW1wUm9sZUFybjogdGhpcy5iYXNlT3B0aW9ucy5pYW1Sb2xlQXJucy5qdW1wPy5bc3RhZ2UubmFtZV0sXG4gICAgICB9KSxcbiAgICAgIG5ldyBQcm9qZW5TY3JpcHRTdGVwKHRoaXMucHJvamVjdCwgZmFzdCA/IGBmYXN0ZGlmZjoke3N0YWdlLm5hbWV9YCA6IGBkaWZmOiR7c3RhZ2UubmFtZX1gKSxcbiAgICAgIC4uLnN0YWdlLnBvc3REaWZmU3RlcHMgPz8gW10sXG4gICAgXSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVySW5zdGFsbFBhY2thZ2VDb21tYW5kcyhwYWNrYWdlTmFtZTogc3RyaW5nLCBydW5QcmVJbnN0YWxsQ29tbWFuZHM6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IHJ1blByZUluc3RhbGxDb21tYW5kcyA/IHRoaXMuYmFzZU9wdGlvbnMucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdIDogW107XG5cbiAgICBzd2l0Y2ggKHRoaXMuYXBwLnBhY2thZ2UucGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk46XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOMjpcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLllBUk5fQkVSUlk6XG4gICAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUM6XG4gICAgICAgIGNvbW1hbmRzLnB1c2goYHlhcm4gYWRkICR7cGFja2FnZU5hbWV9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgICBjb21tYW5kcy5wdXNoKGBucG0gaW5zdGFsbCAke3BhY2thZ2VOYW1lfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICAgIGNvbW1hbmRzLnB1c2goYHBucG0gYWRkICR7cGFja2FnZU5hbWV9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbnN0YWxsIHNjcmlwdHMgZm9yIHBhY2thZ2VNYW5hZ2VyOiAnICsgdGhpcy5hcHAucGFja2FnZS5wYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTYWZlU3RhZ2VOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgc3BsaXQgaW50byB3b3Jkc1xuICAgIGNvbnN0IHdvcmRzID0gbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csICcgJykudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG5cbiAgICAvLyBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIGFuZCBqb2luIHRoZW1cbiAgICByZXR1cm4gd29yZHMubWFwKCh3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzXG4gICAqIG5lY2Vzc2FyeSB0byBzZXQgdXAgdGhlIHBpcGVsaW5lIGFuZCBkZWZpbmUgdGhlIEFXUyBDREsgc3RhY2tzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUFwcGxpY2F0aW9uRW50cnlwb2ludCgpIHtcbiAgICBsZXQgcHJvcHNDb2RlID0gJyc7XG4gICAgbGV0IGFwcENvZGUgPSAnJztcbiAgICBsZXQgc2VwID0gJy0nO1xuICAgIGlmICh0aGlzLnN0YWNrUHJlZml4ID09PSAnJykge1xuICAgICAgc2VwID0gJyc7XG4gICAgfVxuXG5cbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5wZXJzb25hbFN0YWdlKSB7XG4gICAgICBwcm9wc0NvZGUgKz0gYCAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcGVyc29uYWwgc3RhY2suICovXG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVU0VSIGlzIHNldCBhbmQgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY3JlYXRpbmcgYSBwZXJzb25hbCBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sgJiYgcHJvY2Vzcy5lbnYuVVNFUikge1xuICAgICAgY29uc3Qgc3RhZ2VOYW1lID0gJ3BlcnNvbmFsLScgKyBwcm9jZXNzLmVudi5VU0VSLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxcXFxcLy9nLCAnLScpO1xuICAgICAgcHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sodGhpcywgJyR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH1wZXJzb25hbCcsIHsgZW52OiB7IGFjY291bnQ6ICcke3RoaXMuYmFzZU9wdGlvbnMucGVyc29uYWxTdGFnZS5lbnYuYWNjb3VudH0nLCByZWdpb246ICcke3RoaXMuYmFzZU9wdGlvbnMucGVyc29uYWxTdGFnZS5lbnYucmVnaW9ufScgfSwgc3RhY2tOYW1lOiBcXGAke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9XFwke3N0YWdlTmFtZX1cXGAsIHN0YWdlTmFtZSB9KTtcbiAgICB9XG5gO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLmZlYXR1cmVTdGFnZXMpIHtcbiAgICAgIHByb3BzQ29kZSArPSBgICAvKiogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBmZWF0dXJlIHN0YWNrLiAqL1xuICBwcm92aWRlRmVhdHVyZVN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBCUkFOQ0ggaXMgc2V0IGFuZCBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhIGZlYXR1cmUgc3RhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIG5lY2Vzc2FyeSBhcmd1bWVudHMuXG4gICAgaWYgKHByb3BzLnByb3ZpZGVGZWF0dXJlU3RhY2sgJiYgcHJvY2Vzcy5lbnYuQlJBTkNIKSB7XG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSAnZmVhdHVyZS0nICsgcHJvY2Vzcy5lbnYuQlJBTkNILnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxcXFxcLy9nLCAnLScpO1xuICAgICAgcHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayh0aGlzLCAnJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfWZlYXR1cmUnLCB7IGVudjogeyBhY2NvdW50OiAnJHt0aGlzLmJhc2VPcHRpb25zLmZlYXR1cmVTdGFnZXMuZW52LmFjY291bnR9JywgcmVnaW9uOiAnJHt0aGlzLmJhc2VPcHRpb25zLmZlYXR1cmVTdGFnZXMuZW52LnJlZ2lvbn0nIH0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfVxcJHtzdGFnZU5hbWV9XFxgLCBzdGFnZU5hbWUgfSk7XG4gICAgfVxuYDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHRoaXMuYmFzZU9wdGlvbnMuc3RhZ2VzKSB7XG4gICAgICBjb25zdCBuYW1lVXBwZXJGaXJzdCA9IHRoaXMuY3JlYXRlU2FmZVN0YWdlTmFtZShzdGFnZS5uYW1lKTtcblxuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhICR7c3RhZ2UubmFtZX0gc3RhY2suICovXG4gIHByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgJHtzdGFnZS5uYW1lfSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9JHtzdGFnZS5uYW1lfScsIHsgZW52OiB7IGFjY291bnQ6ICcke3N0YWdlLmVudi5hY2NvdW50fScsIHJlZ2lvbjogJyR7c3RhZ2UuZW52LnJlZ2lvbn0nIH0sIHN0YWNrTmFtZTogJyR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlLm5hbWV9Jywgc3RhZ2VOYW1lOiAnJHtzdGFnZS5uYW1lfScgfSk7XG4gICAgfVxuYDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mICh0aGlzLmJhc2VPcHRpb25zLmluZGVwZW5kZW50U3RhZ2VzID8/IFtdKSkge1xuICAgICAgY29uc3QgbmFtZVVwcGVyRmlyc3QgPSB0aGlzLmNyZWF0ZVNhZmVTdGFnZU5hbWUoc3RhZ2UubmFtZSk7XG5cbiAgICAgIHByb3BzQ29kZSArPSBgICAvKiogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSAke3N0YWdlLm5hbWV9IHN0YWNrLiAqL1xuICBwcm92aWRlJHtuYW1lVXBwZXJGaXJzdH1TdGFjazogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuYDtcbiAgICAgIGFwcENvZGUgKz0gYCAgICAvLyBJZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhICR7c3RhZ2UubmFtZX0gc3RhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIG5lY2Vzc2FyeSBhcmd1bWVudHMuXG4gICAgaWYgKHByb3BzLnByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrKSB7XG4gICAgICBwcm9wcy5wcm92aWRlJHtuYW1lVXBwZXJGaXJzdH1TdGFjayh0aGlzLCAnJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfSR7c3RhZ2UubmFtZX0nLCB7IGVudjogeyBhY2NvdW50OiAnJHtzdGFnZS5lbnYuYWNjb3VudH0nLCByZWdpb246ICcke3N0YWdlLmVudi5yZWdpb259JyB9LCBzdGFja05hbWU6ICcke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9JHtzdGFnZS5uYW1lfScsIHN0YWdlTmFtZTogJyR7c3RhZ2UubmFtZX0nIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgLy8gQWRkIHZlcnNpb25pbmcgbG9naWMgdG8gYXBwbHkgdG8gYWxsIHN0YWNrc1xuICAgIGlmICh0aGlzLmJhc2VPcHRpb25zLnZlcnNpb25pbmc/LmVuYWJsZWQpIHtcbiAgICAgIGFwcENvZGUgKz0gdGhpcy5nZW5lcmF0ZVZlcnNpb25pbmdBcHBDb2RlKHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwRmlsZSA9IG5ldyBUZXh0RmlsZSh0aGlzLnByb2plY3QsIGAke3RoaXMuYXBwLnNyY2Rpcn0vYXBwLnRzYCk7XG5cbiAgICAvLyBHZW5lcmF0ZSB2ZXJzaW9uaW5nLWF3YXJlIGltcG9ydHMgYW5kIHV0aWxpdGllc1xuICAgIGNvbnN0IHZlcnNpb25pbmdJbXBvcnRzID0gdGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkXG4gICAgICA/IHRoaXMuZ2VuZXJhdGVWZXJzaW9uaW5nSW1wb3J0cygpXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgdmVyc2lvbmluZ1V0aWxpdGllcyA9IHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZz8uZW5hYmxlZFxuICAgICAgPyB0aGlzLmdlbmVyYXRlVmVyc2lvbmluZ1V0aWxpdGllcygpXG4gICAgICA6ICcnO1xuXG4gICAgY29uc3QgdmVyc2lvbmluZ0NvbmZpZ0RlY2xhcmF0aW9uID0gdGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkXG4gICAgICA/IGBcbmNvbnN0IHZlcnNpb25pbmdDb25maWcgPSAke0pTT04uc3RyaW5naWZ5KHRoaXMuYmFzZU9wdGlvbnMudmVyc2lvbmluZywgbnVsbCwgMil9O1xuYFxuICAgICAgOiAnJztcblxuICAgIGFwcEZpbGUuYWRkTGluZShgLy8gJHtQUk9KRU5fTUFSS0VSfVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IEFwcCwgQXBwUHJvcHMsIFN0YWNrLCBTdGFja1Byb3BzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuJHt2ZXJzaW9uaW5nSW1wb3J0c31cbiR7dmVyc2lvbmluZ0NvbmZpZ0RlY2xhcmF0aW9ufVxuJHt2ZXJzaW9uaW5nVXRpbGl0aWVzfVxuXG4vKipcbiAqIFBpcGVsaW5lQXBwUHJvcHMgaXMgYW4gZXh0ZW5zaW9uIG9mIEFwcFByb3BzLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBV1MgQ0RLIGNvcmUuXG4gKiBJdCBpbmNsdWRlcyBvcHRpb25hbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSBBV1MgU3RhY2tzIGZvciBkaWZmZXJlbnQgc3RhZ2VzLlxuICpcbiAqIFVzZSB0aGVzZSBmdW5jdGlvbnMgdG8gaW5zdGFudGlhdGUgeW91ciBhcHBsaWNhdGlvbiBzdGFja3Mgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3JcbiAqIGVhY2ggc3RhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFByb3BzIGV4dGVuZHMgQXBwUHJvcHMge1xuJHtwcm9wc0NvZGV9XG59XG5cbi8qKlxuICogUGlwZWxpbmVBcHBTdGFja1Byb3BzIGlzIGFuIGV4dGVuc2lvbiBvZiBTdGFja1Byb3BzLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBV1MgQ0RLIGNvcmUuXG4gKiBJdCBpbmNsdWRlcyBhbiBhZGRpdGlvbmFsIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIHN0YWdlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVBcHBTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBQaXBlbGluZUFwcCBjbGFzcyBleHRlbmRzIHRoZSBBcHAgY2xhc3MgZnJvbSBBV1MgQ0RLIGFuZCBvdmVycmlkZXMgdGhlIGNvbnN0cnVjdG9yIHRvIHN1cHBvcnRcbiAqIGRpZmZlcmVudCBzdGFnZXMgb2YgdGhlIGFwcGxpY2F0aW9uIChkZXZlbG9wbWVudCwgcHJvZHVjdGlvbiwgcGVyc29uYWwsIGZlYXR1cmUpIGJ5IGludm9raW5nIHRoZSBwcm92aWRlZFxuICogc3RhY2stcHJvdmlkaW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBwcm9wcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiR7YXBwQ29kZX1cblxuICB9XG59XG5gKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgdG8gcHVibGlzaCBDREsgYXNzZXRzIHRvIGFsbCBhY2NvdW50cyBhbmQgaGFuZGxlIHZlcnNpb25pbmcsIGluY2x1ZGluZyBidW1waW5nIHRoZSB2ZXJzaW9uXG4gICAqIGJhc2VkIG9uIHRoZSBsYXRlc3QgZ2l0IHRhZyBhbmQgcHVzaGluZyB0aGUgQ0RLIGFzc2VtYmx5IHRvIHRoZSBwYWNrYWdlIHJlcG9zaXRvcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVsZWFzZVRhc2tzKCkge1xuICAgIGNvbnN0IHN0YWdlcyA9IFsuLi50aGlzLmJhc2VPcHRpb25zLnN0YWdlcywgLi4udGhpcy5iYXNlT3B0aW9ucy5pbmRlcGVuZGVudFN0YWdlcyA/PyBbXV07XG4gICAgbGV0IHNlcCA9ICctJztcbiAgICBpZiAodGhpcy5zdGFja1ByZWZpeCA9PT0gJycpIHtcbiAgICAgIHNlcCA9ICcnO1xuICAgIH1cbiAgICAvLyBUYXNrIHRvIHB1Ymxpc2ggdGhlIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzXG4gICAgY29uc3QgY29uY3VycmVuY3lGbGFnID0gdGhpcy5iYXNlT3B0aW9ucy5hc3NldFB1Ymxpc2hpbmdDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGAgLS1jb25jdXJyZW5jeSAke3RoaXMuYmFzZU9wdGlvbnMuYXNzZXRQdWJsaXNoaW5nQ29uY3VycmVuY3l9YFxuICAgICAgOiAnJztcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYHB1Ymxpc2g6YXNzZXRzOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICAgIHN0ZXBzOiBbe1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrIHB1Ymxpc2gtYXNzZXRzIC1hICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0gJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfSR7c3RhZ2UubmFtZX0gLS11bnN0YWJsZT1wdWJsaXNoLWFzc2V0cyR7Y29uY3VycmVuY3lGbGFnfWAsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdwdWJsaXNoOmFzc2V0cycsIHtcbiAgICAgIHN0ZXBzOiBzdGFnZXMubWFwKHN0YWdlID0+ICh7XG4gICAgICAgIHNwYXduOiBgcHVibGlzaDphc3NldHM6JHtzdGFnZS5uYW1lfWAsXG4gICAgICB9KSksXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy5wa2dOYW1lc3BhY2UpIHtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdidW1wJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0J1bXBzIHZlcnNpb24gYmFzZWQgb24gbGF0ZXN0IGdpdCB0YWcnLFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4ZWM6ICdwaXBlbGluZXMtcmVsZWFzZSBidW1wJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4ZWM6ICdnaXQgcHVzaCAtLXRhZ3MnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdyZWxlYXNlOnB1c2gtYXNzZW1ibHknLCB7XG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhlYzogYHBpcGVsaW5lcy1yZWxlYXNlIGNyZWF0ZS1tYW5pZmVzdCBcIiR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1cIiAgXCIke3RoaXMuYmFzZU9wdGlvbnMucGtnTmFtZXNwYWNlfVwiYCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5hcHAuY2RrQ29uZmlnLmNka291dCxcbiAgICAgICAgICAgIGV4ZWM6ICducG0gdmVyc2lvbiAtLW5vLWdpdC10YWctdmVyc2lvbiBmcm9tLWdpdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgICBleGVjOiAnbnBtIHB1Ymxpc2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgcGVyc29uYWwgZGVwbG95bWVudCBzdGFnZSwgaW5jbHVkaW5nIGRlcGxveW1lbnQsIHdhdGNoaW5nIGZvciBjaGFuZ2VzLFxuICAgKiBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUGVyc29uYWxTdGFnZSgpIHtcbiAgICBjb25zdCBzdGFja0lkID0gdGhpcy5nZXRDbGlTdGFja1BhdHRlcm4oJ3BlcnNvbmFsJyk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLXBlcnNvbmFsLmpzb24gJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3dhdGNoOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXBsb3kgLS1vdXRwdXRzLWZpbGUgY2RrLW91dHB1dHMtcGVyc29uYWwuanNvbiAtLXdhdGNoIC0taG90c3dhcCAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZmFzdGRpZmY6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRpZmYgLS1uby1jaGFuZ2VzZXQgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Rlc3Ryb3k6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHtzdGFja0lkfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIGZlYXR1cmUgZGVwbG95bWVudCBzdGFnZSwgaW5jbHVkaW5nIGRlcGxveW1lbnQsIGNvbXBhcmluZyBjaGFuZ2VzIChkaWZmKSxcbiAgICogYW5kIGRlc3Ryb3lpbmcgdGhlIHN0YWNrIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVGZWF0dXJlU3RhZ2UoKSB7XG4gICAgY29uc3Qgc3RhY2tJZCA9IHRoaXMuZ2V0Q2xpU3RhY2tQYXR0ZXJuKCdmZWF0dXJlJyk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy1mZWF0dXJlLmpzb24gLS1wcm9ncmVzcyBldmVudHMgLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyIGRlcGxveSAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdmYXN0ZGlmZjpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmIC0tbm8tY2hhbmdlc2V0ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgLS1mb3JjZSAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnd2F0Y2g6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLWZlYXR1cmUuanNvbiAtLXdhdGNoIC0taG90c3dhcCAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgZ2VuZXJhbCBwaXBlbGluZSBzdGFnZXMgKGRldiwgcHJvZCksIGluY2x1ZGluZyBkZXBsb3ltZW50IGFuZCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZikuXG4gICAqIEBwYXJhbSB7RGVwbG95U3RhZ2VPcHRpb25zfSBzdGFnZSAtIFRoZSBzdGFnZSB0byBjcmVhdGVcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVQaXBlbGluZVN0YWdlKHN0YWdlOiBEZXBsb3ltZW50U3RhZ2UpIHtcbiAgICBjb25zdCBzdGFja0lkID0gdGhpcy5nZXRDbGlTdGFja1BhdHRlcm4oc3RhZ2UubmFtZSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGRlcGxveToke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLSR7c3RhZ2UubmFtZX0uanNvbiAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICBleGVjOiBgY2RrIC0tYXBwICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0gZGlmZiAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZmFzdGRpZmY6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmIC0tbm8tY2hhbmdlc2V0ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIGlmIChzdGFnZS53YXRjaGFibGUpIHtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGB3YXRjaDoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgICBleGVjOiBgY2RrIGRlcGxveSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy0ke3N0YWdlLm5hbWV9Lmpzb24gLS13YXRjaCAtLWhvdHN3YXAgJHtzdGFja0lkfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWRkIHZlcnNpb24gZmV0Y2ggdGFzayBpZiB2ZXJzaW9uaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVZlcnNpb25GZXRjaFRhc2soc3RhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgaW5kZXBlbmRlbnQgc3RhZ2VzIGluY2x1ZGluZyBkZXBsb3ltZW50IGFuZCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZikuXG4gICAqIEBwYXJhbSB7TmFtZWRTdGFnZU9wdGlvbnN9IHN0YWdlIC0gVGhlIHN0YWdlIHRvIGNyZWF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUluZGVwZW5kZW50U3RhZ2Uoc3RhZ2U6IEluZGVwZW5kZW50U3RhZ2UpIHtcbiAgICBjb25zdCBzdGFja0lkID0gdGhpcy5nZXRDbGlTdGFja1BhdHRlcm4oc3RhZ2UubmFtZSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGRlcGxveToke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLSR7c3RhZ2UubmFtZX0uanNvbiAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2UubmFtZX1gLCB7XG4gICAgICBleGVjOiBgY2RrIC0tYXBwICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0gZGlmZiAke3N0YWNrSWR9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZmFzdGRpZmY6JHtzdGFnZS5uYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmIC0tbm8tY2hhbmdlc2V0ICR7c3RhY2tJZH1gLFxuICAgIH0pO1xuICAgIGlmIChzdGFnZS53YXRjaGFibGUpIHtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGB3YXRjaDoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgICBleGVjOiBgY2RrIGRlcGxveSAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy0ke3N0YWdlLm5hbWV9Lmpzb24gLS13YXRjaCAtLWhvdHN3YXAgJHtzdGFja0lkfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gQWRkIHZlcnNpb24gZmV0Y2ggdGFzayBpZiB2ZXJzaW9uaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nPy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVZlcnNpb25GZXRjaFRhc2soc3RhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGlTdGFja1BhdHRlcm4oc3RhZ2U6IHN0cmluZykge1xuICAgIGxldCBzZXAgPSAnLSc7XG4gICAgaWYgKHRoaXMuc3RhY2tQcmVmaXggPT09ICcnKSB7XG4gICAgICBzZXAgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZU9wdGlvbnMuZGVwbG95U3ViU3RhY2tzID8gYCR7dGhpcy5zdGFja1ByZWZpeH0ke3NlcH0ke3N0YWdlfSAke3RoaXMuc3RhY2tQcmVmaXh9JHtzZXB9JHtzdGFnZX0vKmAgOiBgJHt0aGlzLnN0YWNrUHJlZml4fSR7c2VwfSR7c3RhZ2V9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdmVyc2lvbjpmZXRjaDo8c3RhZ2U+IHRhc2sgdG8gZmV0Y2ggdmVyc2lvbiBkYXRhIGZyb20gZGVwbG95ZWQgc3RhY2tcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVWZXJzaW9uRmV0Y2hUYXNrKHN0YWdlOiBOYW1lZFN0YWdlT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGAke3RoaXMuc3RhY2tQcmVmaXh9JHt0aGlzLnN0YWNrUHJlZml4ID8gJy0nIDogJyd9JHtzdGFnZS5uYW1lfWA7XG4gICAgY29uc3Qgc3RhZ2VDb25maWcgPSB0aGlzLmJhc2VPcHRpb25zLnZlcnNpb25pbmc/LnN0YWdlT3ZlcnJpZGVzPy5bc3RhZ2UubmFtZV0gfHwgdGhpcy5iYXNlT3B0aW9ucy52ZXJzaW9uaW5nO1xuXG4gICAgaWYgKCFzdGFnZUNvbmZpZz8ub3V0cHV0cykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBGZXRjaCBmcm9tIENsb3VkRm9ybWF0aW9uIG91dHB1dHNcbiAgICBpZiAoc3RhZ2VDb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbj8uZW5hYmxlZCkge1xuICAgICAgY29tbWFuZHMucHVzaChcbiAgICAgICAgYGVjaG8gXCJGZXRjaGluZyB2ZXJzaW9uIGRhdGEgZnJvbSBDbG91ZEZvcm1hdGlvbiBvdXRwdXRzIGZvciAke3N0YWdlLm5hbWV9Li4uXCJgLFxuICAgICAgICBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlc2NyaWJlLXN0YWNrcyAtLXN0YWNrLW5hbWUgJHtzdGFja05hbWV9IC0tcmVnaW9uICR7c3RhZ2UuZW52LnJlZ2lvbn0gLS1xdWVyeSBcIlN0YWNrc1swXS5PdXRwdXRzWz9zdGFydHNfd2l0aChPdXRwdXRLZXksICdBcHBWZXJzaW9uJyldLntLZXk6T3V0cHV0S2V5LFZhbHVlOk91dHB1dFZhbHVlfVwiIC0tb3V0cHV0IHRhYmxlYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggZnJvbSBTU00gUGFyYW1ldGVyIFN0b3JlXG4gICAgaWYgKHN0YWdlQ29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmU/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSAoc3RhZ2VDb25maWcub3V0cHV0cy5wYXJhbWV0ZXJTdG9yZS5wYXJhbWV0ZXJOYW1lIHx8ICcve3N0YWNrTmFtZX0vdmVyc2lvbicpXG4gICAgICAgIC5yZXBsYWNlKCd7c3RhY2tOYW1lfScsIHN0YWNrTmFtZSlcbiAgICAgICAgLnJlcGxhY2UoJ3tzdGFnZU5hbWV9Jywgc3RhZ2UubmFtZSk7XG5cbiAgICAgIGlmICgoc3RhZ2VDb25maWcub3V0cHV0cy5wYXJhbWV0ZXJTdG9yZSBhcyBhbnkpPy5oaWVyYXJjaGljYWwpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChcbiAgICAgICAgICBgZWNobyBcIkZldGNoaW5nIHZlcnNpb24gZGF0YSBmcm9tIFNTTSBQYXJhbWV0ZXIgU3RvcmUgKGhpZXJhcmNoaWNhbCkgZm9yICR7c3RhZ2UubmFtZX0uLi5cImAsXG4gICAgICAgICAgYGF3cyBzc20gZ2V0LXBhcmFtZXRlcnMtYnktcGF0aCAtLXBhdGggXCIke3BhcmFtZXRlck5hbWV9XCIgLS1yZWdpb24gJHtzdGFnZS5lbnYucmVnaW9ufSAtLXJlY3Vyc2l2ZSAtLXF1ZXJ5IFwiUGFyYW1ldGVyc1tdLntOYW1lOk5hbWUsVmFsdWU6VmFsdWV9XCIgLS1vdXRwdXQgdGFibGVgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWFuZHMucHVzaChcbiAgICAgICAgICBgZWNobyBcIkZldGNoaW5nIHZlcnNpb24gZGF0YSBmcm9tIFNTTSBQYXJhbWV0ZXIgU3RvcmUgZm9yICR7c3RhZ2UubmFtZX0uLi5cImAsXG4gICAgICAgICAgYGF3cyBzc20gZ2V0LXBhcmFtZXRlciAtLW5hbWUgXCIke3BhcmFtZXRlck5hbWV9XCIgLS1yZWdpb24gJHtzdGFnZS5lbnYucmVnaW9ufSAtLXF1ZXJ5IFwiUGFyYW1ldGVyLntOYW1lOk5hbWUsVmFsdWU6VmFsdWV9XCIgLS1vdXRwdXQgdGFibGVgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgdmVyc2lvbjpmZXRjaDoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgICBkZXNjcmlwdGlvbjogYEZldGNoIHZlcnNpb24gZGF0YSBmcm9tIGRlcGxveWVkICR7c3RhZ2UubmFtZX0gc3RhY2tgLFxuICAgICAgICBleGVjOiBjb21tYW5kcy5qb2luKCcgJiYgJyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgQ0RLIGFwcGxpY2F0aW9uIGNvZGUgZm9yIHZlcnNpb25pbmdcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVZlcnNpb25pbmdBcHBDb2RlKGNvbmZpZzogVmVyc2lvbmluZ0NvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcbiAgICAvLyBBcHBseSB2ZXJzaW9uaW5nIHRvIGFsbCBzdGFja3NcbiAgICB0aGlzLm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN0YWNrKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlTmFtZSA9IGNoaWxkLnN0YWNrTmFtZS5zcGxpdCgnLScpLnBvcCgpIHx8ICdkZWZhdWx0JztcbiAgICAgICAgYWRkVmVyc2lvbmluZ1RvU3RhY2soY2hpbGQsIHN0YWdlTmFtZSwgJHtjb25maWcuc3RhZ2VPdmVycmlkZXMgPyAndmVyc2lvbmluZ0NvbmZpZy5zdGFnZU92ZXJyaWRlcycgOiAndW5kZWZpbmVkJ30pO1xuICAgICAgfVxuICAgIH0pO2A7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdmVyc2lvbmluZyBpbXBvcnRzIGZvciBDREsgYXBwbGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVZlcnNpb25pbmdJbXBvcnRzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGltcG9ydHMucHVzaChcImltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gJ2F3cy1jZGstbGliJztcIik7XG4gICAgaW1wb3J0cy5wdXNoKFwiaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XCIpO1xuICAgIGltcG9ydHMucHVzaChcImltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1wiKTtcblxuICAgIHJldHVybiBpbXBvcnRzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHZlcnNpb25pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIENESyBhcHBsaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlVmVyc2lvbmluZ1V0aWxpdGllcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4vKipcbiAqIFZlcnNpb24gaW5mb3JtYXRpb24gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkluZm8ge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGNvbW1pdEhhc2g6IHN0cmluZztcbiAgY29tbWl0SGFzaFNob3J0OiBzdHJpbmc7XG4gIGJyYW5jaDogc3RyaW5nO1xuICBjb21taXRDb3VudDogbnVtYmVyO1xuICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nO1xuICBkZXBsb3llZEF0OiBzdHJpbmc7XG4gIGRlcGxveWVkQnk6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBMb2FkIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBnZW5lcmF0ZWQgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFZlcnNpb25JbmZvKCk6IFZlcnNpb25JbmZvIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoJy52ZXJzaW9uLnRtcC5qc29uJywgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCB2ZXJzaW9uIGluZm8sIHVzaW5nIGZhbGxiYWNrJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICBjb21taXRIYXNoOiAndW5rbm93bicsXG4gICAgICBjb21taXRIYXNoU2hvcnQ6ICd1bmtub3duJyxcbiAgICAgIGJyYW5jaDogJ3Vua25vd24nLFxuICAgICAgY29tbWl0Q291bnQ6IDAsXG4gICAgICBwYWNrYWdlVmVyc2lvbjogJzAuMC4wJyxcbiAgICAgIGRlcGxveWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGRlcGxveWVkQnk6ICd1bmtub3duJyxcbiAgICAgIGVudmlyb25tZW50OiAndW5rbm93bidcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0IHZlcnNpb25pbmcgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBzdGFnZVxuICovXG5mdW5jdGlvbiBnZXRTdGFnZUNvbmZpZyhzdGFnZU5hbWU6IHN0cmluZywgYmFzZUNvbmZpZzogYW55LCBzdGFnZU92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICBpZiAoIXN0YWdlT3ZlcnJpZGVzIHx8ICFzdGFnZU92ZXJyaWRlc1tzdGFnZU5hbWVdKSB7XG4gICAgcmV0dXJuIGJhc2VDb25maWc7XG4gIH1cbiAgXG4gIC8vIE1lcmdlIHN0YWdlIG92ZXJyaWRlIHdpdGggYmFzZSBjb25maWdcbiAgY29uc3Qgb3ZlcnJpZGUgPSBzdGFnZU92ZXJyaWRlc1tzdGFnZU5hbWVdO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VDb25maWcsXG4gICAgb3V0cHV0czoge1xuICAgICAgY2xvdWRGb3JtYXRpb246IG92ZXJyaWRlLm91dHB1dHM/LmNsb3VkRm9ybWF0aW9uIHx8IGJhc2VDb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbixcbiAgICAgIHBhcmFtZXRlclN0b3JlOiBvdmVycmlkZS5vdXRwdXRzPy5wYXJhbWV0ZXJTdG9yZSB8fCBiYXNlQ29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUsXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEFkZCB2ZXJzaW9uaW5nIG91dHB1dHMgdG8gYSBzdGFja1xuICovXG5mdW5jdGlvbiBhZGRWZXJzaW9uaW5nVG9TdGFjayhzdGFjazogU3RhY2ssIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZU92ZXJyaWRlcz86IGFueSk6IHZvaWQge1xuICBjb25zdCB2ZXJzaW9uSW5mbyA9IGxvYWRWZXJzaW9uSW5mbygpO1xuICBjb25zdCBiYXNlQ29uZmlnID0gdmVyc2lvbmluZ0NvbmZpZztcbiAgY29uc3QgY29uZmlnID0gZ2V0U3RhZ2VDb25maWcoc3RhZ2VOYW1lLCBiYXNlQ29uZmlnLCBzdGFnZU92ZXJyaWRlcyk7XG4gIFxuICAvLyBDaGVjayBpZiBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIENsb3VkRm9ybWF0aW9uIG9yIFBhcmFtZXRlclN0b3JlIGNvbmZpZ3NcbiAgY29uc3QgY2ZGb3JtYXQgPSBjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbj8uZm9ybWF0IHx8ICdzdHJ1Y3R1cmVkJztcbiAgY29uc3Qgc3NtRm9ybWF0ID0gY29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmU/LmZvcm1hdCB8fCAnc3RydWN0dXJlZCc7XG4gIFxuICAvLyBBZGQgQ2xvdWRGb3JtYXRpb24gb3V0cHV0c1xuICBpZiAoY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24/LmVuYWJsZWQpIHtcbiAgICBpZiAoY2ZGb3JtYXQgPT09ICdwbGFpbicpIHtcbiAgICAgIC8vIFBsYWluIGZvcm1hdCAtIHNpbmdsZSBvdXRwdXQgd2l0aCB2ZXJzaW9uIHN0cmluZ1xuICAgICAgbmV3IENmbk91dHB1dChzdGFjaywgJ0FwcFZlcnNpb24nLCB7XG4gICAgICAgIHZhbHVlOiB2ZXJzaW9uSW5mby52ZXJzaW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIHZlcnNpb24nLFxuICAgICAgICBleHBvcnROYW1lOiBjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0cnVjdHVyZWQgZm9ybWF0IC0gbXVsdGlwbGUgb3V0cHV0c1xuICAgICAgbmV3IENmbk91dHB1dChzdGFjaywgJ0FwcFZlcnNpb24nLCB7XG4gICAgICAgIHZhbHVlOiB2ZXJzaW9uSW5mby52ZXJzaW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIHZlcnNpb24nLFxuICAgICAgICBleHBvcnROYW1lOiBjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG5ldyBDZm5PdXRwdXQoc3RhY2ssICdBcHBWZXJzaW9uQ29tbWl0SGFzaCcsIHtcbiAgICAgICAgdmFsdWU6IHZlcnNpb25JbmZvLmNvbW1pdEhhc2gsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnR2l0IGNvbW1pdCBoYXNoJyxcbiAgICAgICAgZXhwb3J0TmFtZTogY29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZSA/IFxcYFxcJHtjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lfUNvbW1pdEhhc2hcXGAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbmV3IENmbk91dHB1dChzdGFjaywgJ0FwcFZlcnNpb25CcmFuY2gnLCB7XG4gICAgICAgIHZhbHVlOiB2ZXJzaW9uSW5mby5icmFuY2gsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnR2l0IGJyYW5jaCcsXG4gICAgICAgIGV4cG9ydE5hbWU6IGNvbmZpZy5vdXRwdXRzLmNsb3VkRm9ybWF0aW9uLmV4cG9ydE5hbWUgPyBcXGBcXCR7Y29uZmlnLm91dHB1dHMuY2xvdWRGb3JtYXRpb24uZXhwb3J0TmFtZX1CcmFuY2hcXGAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dChzdGFjaywgJ0FwcFZlcnNpb25JbmZvJywge1xuICAgICAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkodmVyc2lvbkluZm8pLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIHZlcnNpb24gaW5mb3JtYXRpb24nLFxuICAgICAgICBleHBvcnROYW1lOiBjb25maWcub3V0cHV0cy5jbG91ZEZvcm1hdGlvbi5leHBvcnROYW1lID8gXFxgXFwke2NvbmZpZy5vdXRwdXRzLmNsb3VkRm9ybWF0aW9uLmV4cG9ydE5hbWV9SW5mb1xcYCA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gQWRkIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGFyYW1ldGVyc1xuICBpZiAoY29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmU/LmVuYWJsZWQpIHtcbiAgICBpZiAoY29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUuaGllcmFyY2hpY2FsKSB7XG4gICAgICAvLyBIaWVyYXJjaGljYWwgcGFyYW1ldGVyc1xuICAgICAgY29uc3QgYmFzZVBhcmFtZXRlck5hbWUgPSAoY29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUucGFyYW1ldGVyTmFtZSB8fCAnL3tzdGFja05hbWV9L3ZlcnNpb24nKVxuICAgICAgICAucmVwbGFjZSgne3N0YWNrTmFtZX0nLCBzdGFjay5zdGFja05hbWUpXG4gICAgICAgIC5yZXBsYWNlKCd7c3RhZ2VOYW1lfScsIHN0YWdlTmFtZSk7XG4gICAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGhpZXJhcmNoaWNhbCBwYXJhbWV0ZXJzXG4gICAgICBuZXcgU3RyaW5nUGFyYW1ldGVyKHN0YWNrLCAnVmVyc2lvblBhcmFtZXRlclZlcnNpb24nLCB7XG4gICAgICAgIHBhcmFtZXRlck5hbWU6IFxcYFxcJHtiYXNlUGFyYW1ldGVyTmFtZX0vdmVyc2lvblxcYCxcbiAgICAgICAgc3RyaW5nVmFsdWU6IHZlcnNpb25JbmZvLnZlcnNpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGljYXRpb24gdmVyc2lvbicsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbmV3IFN0cmluZ1BhcmFtZXRlcihzdGFjaywgJ1ZlcnNpb25QYXJhbWV0ZXJDb21taXRIYXNoJywge1xuICAgICAgICBwYXJhbWV0ZXJOYW1lOiBcXGBcXCR7YmFzZVBhcmFtZXRlck5hbWV9L2NvbW1pdEhhc2hcXGAsXG4gICAgICAgIHN0cmluZ1ZhbHVlOiB2ZXJzaW9uSW5mby5jb21taXRIYXNoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0dpdCBjb21taXQgaGFzaCcsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbmV3IFN0cmluZ1BhcmFtZXRlcihzdGFjaywgJ1ZlcnNpb25QYXJhbWV0ZXJCcmFuY2gnLCB7XG4gICAgICAgIHBhcmFtZXRlck5hbWU6IFxcYFxcJHtiYXNlUGFyYW1ldGVyTmFtZX0vYnJhbmNoXFxgLFxuICAgICAgICBzdHJpbmdWYWx1ZTogdmVyc2lvbkluZm8uYnJhbmNoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0dpdCBicmFuY2gnLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIoc3RhY2ssICdWZXJzaW9uUGFyYW1ldGVySW5mbycsIHtcbiAgICAgICAgcGFyYW1ldGVyTmFtZTogXFxgXFwke2Jhc2VQYXJhbWV0ZXJOYW1lfS9pbmZvXFxgLFxuICAgICAgICBzdHJpbmdWYWx1ZTogSlNPTi5zdHJpbmdpZnkodmVyc2lvbkluZm8pLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIHZlcnNpb24gaW5mb3JtYXRpb24nLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmdsZSBwYXJhbWV0ZXJcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSAoY29uZmlnLm91dHB1dHMucGFyYW1ldGVyU3RvcmUucGFyYW1ldGVyTmFtZSB8fCAnL3tzdGFja05hbWV9L3ZlcnNpb24nKVxuICAgICAgICAucmVwbGFjZSgne3N0YWNrTmFtZX0nLCBzdGFjay5zdGFja05hbWUpXG4gICAgICAgIC5yZXBsYWNlKCd7c3RhZ2VOYW1lfScsIHN0YWdlTmFtZSk7XG4gICAgICAgIFxuICAgICAgbmV3IFN0cmluZ1BhcmFtZXRlcihzdGFjaywgJ1ZlcnNpb25QYXJhbWV0ZXInLCB7XG4gICAgICAgIHBhcmFtZXRlck5hbWUsXG4gICAgICAgIHN0cmluZ1ZhbHVlOiBzc21Gb3JtYXQgPT09ICdwbGFpbicgPyB2ZXJzaW9uSW5mby52ZXJzaW9uIDogSlNPTi5zdHJpbmdpZnkodmVyc2lvbkluZm8pLFxuICAgICAgICBkZXNjcmlwdGlvbjogc3NtRm9ybWF0ID09PSAncGxhaW4nID8gJ0FwcGxpY2F0aW9uIHZlcnNpb24nIDogJ0NvbXBsZXRlIHZlcnNpb24gaW5mb3JtYXRpb24nLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59YDtcbiAgfVxufVxuIl19
@@ -6,7 +6,7 @@ const projen_1 = require("projen");
6
6
  const base_1 = require("./base");
7
7
  const engine_1 = require("../engine");
8
8
  class BashCDKPipeline extends base_1.CDKPipeline {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.BashCDKPipeline", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.BashCDKPipeline", version: "0.3.25" };
10
10
  constructor(app, options) {
11
11
  super(app, options);
12
12
  const readme = new projen_1.TextFile(this, 'pipeline.md', { lines: [] });
@@ -18,7 +18,7 @@ const WORKFLOW_DIR = '.github/workflows';
18
18
  */
19
19
  class GithubCDKPipeline extends base_1.CDKPipeline {
20
20
  options;
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GithubCDKPipeline", version: "0.3.24" };
21
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GithubCDKPipeline", version: "0.3.25" };
22
22
  /** Indicates if versioned artifacts are needed based on manual approval requirements. */
23
23
  needsVersionedArtifacts;
24
24
  /** The GitHub workflow associated with the pipeline. */
@@ -13,7 +13,7 @@ const github_summary_step_1 = require("../steps/github-summary.step");
13
13
  */
14
14
  class GitlabCDKPipeline extends base_1.CDKPipeline {
15
15
  options;
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitlabCDKPipeline", version: "0.3.24" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitlabCDKPipeline", version: "0.3.25" };
17
17
  /** Indicates if versioned artifacts are required. Currently set to false */
18
18
  needsVersionedArtifacts;
19
19
  /** The Docker image used for pipeline jobs. Defaults to a specified image or a default value. */
package/lib/drift/base.js CHANGED
@@ -6,7 +6,7 @@ const projen_1 = require("projen");
6
6
  const javascript_1 = require("projen/lib/javascript");
7
7
  const steps_1 = require("../steps");
8
8
  class DriftDetectionWorkflow extends projen_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DriftDetectionWorkflow", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DriftDetectionWorkflow", version: "0.3.25" };
10
10
  name;
11
11
  schedule;
12
12
  stages;
package/lib/drift/bash.js CHANGED
@@ -6,7 +6,7 @@ const projen_1 = require("projen");
6
6
  const base_1 = require("./base");
7
7
  const step_1 = require("./step");
8
8
  class BashDriftDetectionWorkflow extends base_1.DriftDetectionWorkflow {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.BashDriftDetectionWorkflow", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.BashDriftDetectionWorkflow", version: "0.3.25" };
10
10
  scriptPath;
11
11
  constructor(project, options) {
12
12
  super(project, options);
@@ -6,7 +6,7 @@ const workflows_model_1 = require("projen/lib/github/workflows-model");
6
6
  const base_1 = require("./base");
7
7
  const step_1 = require("./step");
8
8
  class GitHubDriftDetectionWorkflow extends base_1.DriftDetectionWorkflow {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitHubDriftDetectionWorkflow", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitHubDriftDetectionWorkflow", version: "0.3.25" };
10
10
  permissions;
11
11
  createIssues;
12
12
  workflow;
@@ -6,7 +6,7 @@ const projen_1 = require("projen");
6
6
  const base_1 = require("./base");
7
7
  const step_1 = require("./step");
8
8
  class GitLabDriftDetectionWorkflow extends base_1.DriftDetectionWorkflow {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitLabDriftDetectionWorkflow", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GitLabDriftDetectionWorkflow", version: "0.3.25" };
10
10
  runnerTags;
11
11
  image;
12
12
  config;
package/lib/drift/step.js CHANGED
@@ -4,7 +4,7 @@ exports.DriftDetectionStep = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const steps_1 = require("../steps");
6
6
  class DriftDetectionStep extends steps_1.StepSequence {
7
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DriftDetectionStep", version: "0.3.24" };
7
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DriftDetectionStep", version: "0.3.25" };
8
8
  static generateCommand(props) {
9
9
  const args = [
10
10
  'detect-drift',
@@ -8,7 +8,7 @@ const step_1 = require("./step");
8
8
  */
9
9
  class AmplifyDeployStep extends step_1.PipelineStep {
10
10
  config;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AmplifyDeployStep", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AmplifyDeployStep", version: "0.3.25" };
12
12
  branchName;
13
13
  region;
14
14
  constructor(project, config) {
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const step_1 = require("./step");
6
6
  class DownloadArtifactStep extends step_1.PipelineStep {
7
7
  config;
8
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DownloadArtifactStep", version: "0.3.24" };
8
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.DownloadArtifactStep", version: "0.3.25" };
9
9
  constructor(project, config) {
10
10
  super(project);
11
11
  this.config = config;
@@ -37,7 +37,7 @@ class DownloadArtifactStep extends step_1.PipelineStep {
37
37
  exports.DownloadArtifactStep = DownloadArtifactStep;
38
38
  class UploadArtifactStep extends step_1.PipelineStep {
39
39
  config;
40
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.UploadArtifactStep", version: "0.3.24" };
40
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.UploadArtifactStep", version: "0.3.25" };
41
41
  constructor(project, config) {
42
42
  super(project);
43
43
  this.config = config;
@@ -9,7 +9,7 @@ const step_1 = require("./step");
9
9
  */
10
10
  class AwsAssumeRoleStep extends step_1.PipelineStep {
11
11
  config;
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AwsAssumeRoleStep", version: "0.3.24" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.AwsAssumeRoleStep", version: "0.3.25" };
13
13
  constructor(project, config) {
14
14
  super(project);
15
15
  this.config = config;
@@ -14,7 +14,7 @@ const step_1 = require("./step");
14
14
  */
15
15
  class CdkOutputsSummaryStep extends step_1.PipelineStep {
16
16
  options;
17
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CdkOutputsSummaryStep", version: "0.3.24" };
17
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CdkOutputsSummaryStep", version: "0.3.25" };
18
18
  constructor(project, options) {
19
19
  super(project);
20
20
  this.options = options;
@@ -12,7 +12,7 @@ const step_1 = require("./step");
12
12
  */
13
13
  class PnpmSetupStep extends step_1.PipelineStep {
14
14
  options;
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.PnpmSetupStep", version: "0.3.24" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.PnpmSetupStep", version: "0.3.25" };
16
16
  constructor(project, options = {}) {
17
17
  super(project);
18
18
  this.options = options;
@@ -53,7 +53,7 @@ exports.PnpmSetupStep = PnpmSetupStep;
53
53
  * which is required for Yarn Berry (v2+) to work correctly.
54
54
  */
55
55
  class CorepackSetupStep extends step_1.PipelineStep {
56
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CorepackSetupStep", version: "0.3.24" };
56
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CorepackSetupStep", version: "0.3.25" };
57
57
  constructor(project) {
58
58
  super(project);
59
59
  }
@@ -13,7 +13,7 @@ const step_1 = require("./step");
13
13
  */
14
14
  class GithubPackagesLoginStep extends step_1.PipelineStep {
15
15
  options;
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GithubPackagesLoginStep", version: "0.3.24" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.GithubPackagesLoginStep", version: "0.3.25" };
17
17
  constructor(project, options) {
18
18
  super(project);
19
19
  this.options = options;
@@ -38,7 +38,7 @@ exports.GithubPackagesLoginStep = GithubPackagesLoginStep;
38
38
  */
39
39
  class NpmSecretStep extends step_1.PipelineStep {
40
40
  options;
41
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.NpmSecretStep", version: "0.3.24" };
41
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.NpmSecretStep", version: "0.3.25" };
42
42
  constructor(project, options) {
43
43
  super(project);
44
44
  this.options = options;
@@ -63,7 +63,7 @@ exports.NpmSecretStep = NpmSecretStep;
63
63
  */
64
64
  class CodeArtifactLoginStep extends step_1.StepSequence {
65
65
  options;
66
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CodeArtifactLoginStep", version: "0.3.24" };
66
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CodeArtifactLoginStep", version: "0.3.25" };
67
67
  constructor(project, options) {
68
68
  super(project, [
69
69
  new aws_assume_role_step_1.AwsAssumeRoleStep(project, { roleArn: options.role, sessionName: 'CodeArtifact' }),
package/lib/steps/step.js CHANGED
@@ -8,7 +8,7 @@ const engines_1 = require("../engines");
8
8
  */
9
9
  class PipelineStep {
10
10
  project;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.PipelineStep", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.PipelineStep", version: "0.3.25" };
12
12
  /**
13
13
  * Initializes a new instance of a PipelineStep with a reference to a projen project.
14
14
  * @param project - The projen project reference.
@@ -41,7 +41,7 @@ exports.PipelineStep = PipelineStep;
41
41
  * Concrete implementation of PipelineStep that executes simple commands.
42
42
  */
43
43
  class SimpleCommandStep extends PipelineStep {
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.SimpleCommandStep", version: "0.3.24" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.SimpleCommandStep", version: "0.3.25" };
45
45
  commands;
46
46
  env;
47
47
  /**
@@ -89,7 +89,7 @@ class SimpleCommandStep extends PipelineStep {
89
89
  }
90
90
  exports.SimpleCommandStep = SimpleCommandStep;
91
91
  class ProjenScriptStep extends SimpleCommandStep {
92
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.ProjenScriptStep", version: "0.3.24" };
92
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.ProjenScriptStep", version: "0.3.25" };
93
93
  constructor(project, scriptName, args) {
94
94
  super(project, [`${project.projenCommand} ${scriptName}${args ? ` ${args}` : ''}`]);
95
95
  }
@@ -97,7 +97,7 @@ class ProjenScriptStep extends SimpleCommandStep {
97
97
  exports.ProjenScriptStep = ProjenScriptStep;
98
98
  // Add class that is a sequence of pipleine steps but is a pipeline step in itself
99
99
  class StepSequence extends PipelineStep {
100
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.StepSequence", version: "0.3.24" };
100
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.StepSequence", version: "0.3.25" };
101
101
  steps;
102
102
  /**
103
103
  * Constructs a sequence of pipeline steps.
@@ -8,7 +8,7 @@ const version_info_1 = require("./version-info");
8
8
  */
9
9
  class VersionComputationStrategy {
10
10
  strategy;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionComputationStrategy", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionComputationStrategy", version: "0.3.25" };
12
12
  constructor(strategy) {
13
13
  this.strategy = strategy;
14
14
  }
@@ -40,7 +40,7 @@ exports.VersionComputationStrategy = VersionComputationStrategy;
40
40
  * Composite version computation that combines multiple strategies
41
41
  */
42
42
  class CompositeComputation extends VersionComputationStrategy {
43
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CompositeComputation", version: "0.3.24" };
43
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CompositeComputation", version: "0.3.25" };
44
44
  constructor(strategy) {
45
45
  super(strategy);
46
46
  }
@@ -92,7 +92,7 @@ exports.CompositeComputation = CompositeComputation;
92
92
  * Main version computer that handles strategy selection
93
93
  */
94
94
  class VersionComputer {
95
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionComputer", version: "0.3.24" };
95
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionComputer", version: "0.3.25" };
96
96
  strategy;
97
97
  constructor(strategy) {
98
98
  this.strategy = this.createStrategy(strategy);
@@ -8,7 +8,7 @@ const strategy_1 = require("./strategy");
8
8
  * Main versioning configuration class with factory methods
9
9
  */
10
10
  class VersioningConfigurations {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningConfigurations", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningConfigurations", version: "0.3.25" };
12
12
  /**
13
13
  * Standard configuration with commit count strategy
14
14
  */
@@ -49,7 +49,7 @@ exports.VersioningConfigurations = VersioningConfigurations;
49
49
  * Utility functions for versioning configuration
50
50
  */
51
51
  class VersioningConfigUtils {
52
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningConfigUtils", version: "0.3.24" };
52
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningConfigUtils", version: "0.3.25" };
53
53
  /**
54
54
  * Resolve configuration for a specific stage
55
55
  */
@@ -7,7 +7,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
7
  */
8
8
  class OutputConfigBase {
9
9
  type;
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.OutputConfigBase", version: "0.3.24" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.OutputConfigBase", version: "0.3.25" };
11
11
  constructor(type) {
12
12
  this.type = type;
13
13
  }
@@ -18,7 +18,7 @@ exports.OutputConfigBase = OutputConfigBase;
18
18
  */
19
19
  class CloudFormationOutput extends OutputConfigBase {
20
20
  config;
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CloudFormationOutput", version: "0.3.24" };
21
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.CloudFormationOutput", version: "0.3.25" };
22
22
  static TYPE = 'cloudformation';
23
23
  /**
24
24
  * Enable CloudFormation outputs with default configuration
@@ -55,7 +55,7 @@ exports.CloudFormationOutput = CloudFormationOutput;
55
55
  */
56
56
  class ParameterStoreOutput extends OutputConfigBase {
57
57
  config;
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.ParameterStoreOutput", version: "0.3.24" };
58
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.ParameterStoreOutput", version: "0.3.25" };
59
59
  static TYPE = 'parameterStore';
60
60
  /**
61
61
  * Enable Parameter Store outputs with parameter name
@@ -103,7 +103,7 @@ exports.ParameterStoreOutput = ParameterStoreOutput;
103
103
  * Output format types
104
104
  */
105
105
  class OutputFormat {
106
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.OutputFormat", version: "0.3.24" };
106
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.OutputFormat", version: "0.3.25" };
107
107
  static PLAIN = 'plain';
108
108
  static STRUCTURED = 'structured';
109
109
  constructor() { }
@@ -113,7 +113,7 @@ exports.OutputFormat = OutputFormat;
113
113
  * Factory class for output configurations
114
114
  */
115
115
  class VersioningOutputs {
116
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningOutputs", version: "0.3.24" };
116
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningOutputs", version: "0.3.25" };
117
117
  /**
118
118
  * Create output configuration with CloudFormation and SSM Parameter Store
119
119
  */
@@ -8,7 +8,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
8
8
  class VersioningSetup {
9
9
  project;
10
10
  config;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningSetup", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningSetup", version: "0.3.25" };
12
12
  constructor(project, config) {
13
13
  this.project = project;
14
14
  this.config = config;
@@ -8,7 +8,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
8
8
  class VersioningStrategy {
9
9
  format;
10
10
  components;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningStrategy", version: "0.3.24" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersioningStrategy", version: "0.3.25" };
12
12
  /**
13
13
  * Create a composite strategy with custom format and components
14
14
  */
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Represents complete version information for a deployment
7
7
  */
8
8
  class VersionInfo {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionInfo", version: "0.3.24" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionInfo", version: "0.3.25" };
10
10
  /**
11
11
  * Create a VersionInfo instance from raw data
12
12
  */
@@ -185,7 +185,7 @@ exports.VersionInfo = VersionInfo;
185
185
  * Builder class for creating VersionInfo instances
186
186
  */
187
187
  class VersionInfoBuilder {
188
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionInfoBuilder", version: "0.3.24" };
188
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-pipelines.VersionInfoBuilder", version: "0.3.25" };
189
189
  props = {};
190
190
  /**
191
191
  * Set the version string
package/package.json CHANGED
@@ -90,7 +90,7 @@
90
90
  "publishConfig": {
91
91
  "access": "public"
92
92
  },
93
- "version": "0.3.24",
93
+ "version": "0.3.25",
94
94
  "jest": {
95
95
  "coverageProvider": "v8",
96
96
  "testMatch": [