@macedon-technologies/batman 1.21.3 → 1.21.5

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
@@ -1247,6 +1247,6 @@
1247
1247
  "symbolId": "src/WorkflowAutoDiscover:WorkflowAutoDiscover"
1248
1248
  }
1249
1249
  },
1250
- "version": "1.21.3",
1251
- "fingerprint": "kDp7F9ODbuWpSZSqCrE0MBz9qDeOBbPDgBjitrD5Z5Q="
1250
+ "version": "1.21.5",
1251
+ "fingerprint": "ZnfyOiP+3KEsv08pG4KCEWTK3Yg10Wjh5HNz4wC1cuE="
1252
1252
  }
@@ -12,7 +12,7 @@ const SoftwareFactoryFiles_1 = require("./SoftwareFactoryFiles");
12
12
  const utils_1 = require("./utils");
13
13
  const ViteReactProject_1 = require("./ViteReactProject");
14
14
  class BatmanProject extends awscdk_1.AwsCdkTypeScriptApp {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.21.3" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BatmanProject", version: "1.21.5" };
16
16
  constructor(options) {
17
17
  super({
18
18
  ...options,
@@ -12,7 +12,7 @@ const SoftwareFactoryFiles_1 = require("./SoftwareFactoryFiles");
12
12
  const utils_1 = require("./utils");
13
13
  const ViteReactProject_1 = require("./ViteReactProject");
14
14
  class BootcampProject extends awscdk_1.AwsCdkTypeScriptApp {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BootcampProject", version: "1.21.3" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.BootcampProject", version: "1.21.5" };
16
16
  constructor(options) {
17
17
  super({
18
18
  ...options,
@@ -4,7 +4,7 @@ exports.CodeOwnersFile = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const projen_1 = require("projen");
6
6
  class CodeOwnersFile extends projen_1.TextFile {
7
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.21.3" };
7
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.CodeOwnersFile", version: "1.21.5" };
8
8
  constructor(project, options = {}) {
9
9
  const defaultOwners = ['* @macedon-technologies/platform', '* @macedon-technologies/ai-development-team'];
10
10
  const allOwners = [...defaultOwners, ...(options.additionalOwners || [])];
@@ -17,6 +17,10 @@ class PrCleanupWorkflow extends projen_1.YamlFile {
17
17
  types: ['closed'],
18
18
  },
19
19
  },
20
+ concurrency: {
21
+ 'group': 'pr-stack-${{ github.event.pull_request.number }}',
22
+ 'cancel-in-progress': false,
23
+ },
20
24
  permissions: {
21
25
  'id-token': 'write',
22
26
  'contents': 'read',
@@ -113,4 +117,4 @@ class PrCleanupWorkflow extends projen_1.YamlFile {
113
117
  }
114
118
  }
115
119
  exports.PrCleanupWorkflow = PrCleanupWorkflow;
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJDbGVhbnVwV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUHJDbGVhbnVwV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBRWxDLG1DQUFtRDtBQUNuRCxxRUFBeUY7QUFhekYsTUFBYSxpQkFBa0IsU0FBUSxpQkFBUTtJQUM3QyxZQUFZLE9BQTRCLEVBQUUsT0FBaUM7UUFDekUsTUFBTSxjQUFjLEdBQUcsSUFBQSw4Q0FBcUIsRUFBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRTtZQUNqRCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsR0FBRyxFQUFFO2dCQUNILElBQUksRUFBRSxZQUFZO2dCQUNsQixFQUFFLEVBQUU7b0JBQ0YsWUFBWSxFQUFFO3dCQUNaLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztxQkFDbEI7aUJBQ0Y7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxPQUFPO29CQUNuQixVQUFVLEVBQUUsTUFBTTtvQkFDbEIsZUFBZSxFQUFFLE9BQU87aUJBQ3pCO2dCQUNELElBQUksRUFBRTtvQkFDSixPQUFPLEVBQUU7d0JBQ1AsU0FBUyxFQUFFLGVBQWU7d0JBQzFCLElBQUksRUFBRSwyR0FBMkc7d0JBQ2pILE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxJQUFJLEVBQUUsVUFBVTtnQ0FDaEIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxRQUFRO2dDQUM3QixJQUFJLEVBQUU7b0NBQ0oscUJBQXFCLEVBQUUsS0FBSztpQ0FDN0I7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLDJCQUEyQjtnQ0FDakMsSUFBSSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUI7Z0NBQzVDLElBQUksRUFBRTtvQ0FDSixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsT0FBTztvQ0FDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lDQUNoQzs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsNkJBQTZCO2dDQUNuQyxFQUFFLEVBQUUsY0FBYztnQ0FDbEIsR0FBRyxFQUFFO29DQUNILFdBQVcsRUFBRSx3QkFBd0I7aUNBQ3RDO2dDQUNELEdBQUcsRUFBRTtvQ0FDSCxnRUFBZ0U7b0NBQ2hFLHFDQUFxQztvQ0FDckMsNERBQTREO29DQUM1RCxHQUFHLElBQUEsZ0NBQXdCLEdBQUU7b0NBQzdCLHNDQUFzQztvQ0FDdEMseUNBQXlDO29DQUN6QyxlQUFlLE9BQU8sQ0FBQyxXQUFXLDBCQUEwQjtvQ0FDNUQsb0NBQW9DO29DQUNwQyxFQUFFO29DQUNGLDJCQUEyQjtvQ0FDM0IsMERBQTBEO29DQUMxRCxFQUFFO29DQUNGLHVDQUF1QztvQ0FDdkMsa0RBQWtEO29DQUNsRCx3RUFBd0U7b0NBQ3hFLEVBQUU7b0NBQ0YsOENBQThDO2lDQUMvQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NkJBQ2I7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxZQUFZO2dDQUNqQyxFQUFFLEVBQUUsV0FBVztnQ0FDZixHQUFHLEVBQUU7b0NBQ0gsUUFBUSxFQUFFLHdCQUF3QjtpQ0FDbkM7Z0NBQ0QsSUFBSSxFQUFFO29DQUNKLE1BQU0sRUFBRTt3Q0FDTixvQ0FBb0M7d0NBQ3BDLHVDQUF1Qzt3Q0FDdkMsOEJBQThCO3dDQUM5Qiw0QkFBNEI7d0NBQzVCLDZGQUE2Rjt3Q0FDN0YsSUFBSTtxQ0FDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUNBQ2I7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLHNCQUFzQjtnQ0FDNUIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxZQUFZO2dDQUNqQyxFQUFFLEVBQUUsV0FBVztnQ0FDZixHQUFHLEVBQUU7b0NBQ0gsUUFBUSxFQUFFLHdCQUF3QjtpQ0FDbkM7Z0NBQ0QsSUFBSSxFQUFFO29DQUNKLE1BQU0sRUFBRTt3Q0FDTix1R0FBdUc7d0NBQ3ZHLG9DQUFvQzt3Q0FDcEMsdUNBQXVDO3dDQUN2Qyw4QkFBOEI7d0NBQzlCLDRCQUE0Qjt3Q0FDNUIsZ0pBQWdKO3dDQUNoSixJQUFJO3FDQUNMLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQ0FDYjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0dELDhDQTJHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFlhbWxGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBzYW5pdGl6ZUJyYW5jaE5hbWVTY3JpcHQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHJlc29sdmVBY3Rpb25WZXJzaW9ucywgV29ya2Zsb3dBY3Rpb25WZXJzaW9ucyB9IGZyb20gJy4vV29ya2Zsb3dBY3Rpb25WZXJzaW9ucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJDbGVhbnVwV29ya2Zsb3dPcHRpb25zIHtcbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuICByZWFkb25seSBhd3NSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvamVjdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGZvciB0aGUgcGlubmVkIGFjdGlvbiB2ZXJzaW9ucyB1c2VkIGJ5IHRoaXMgd29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25WZXJzaW9ucz86IFdvcmtmbG93QWN0aW9uVmVyc2lvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBQckNsZWFudXBXb3JrZmxvdyBleHRlbmRzIFlhbWxGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcCwgb3B0aW9uczogUHJDbGVhbnVwV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uVmVyc2lvbnMgPSByZXNvbHZlQWN0aW9uVmVyc2lvbnMob3B0aW9ucy5hY3Rpb25WZXJzaW9ucyk7XG4gICAgc3VwZXIocHJvamVjdCwgJy5naXRodWIvd29ya2Zsb3dzL3ByLWNsZWFudXAueW1sJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogJ1BSIENsZWFudXAnLFxuICAgICAgICBvbjoge1xuICAgICAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAgICAgdHlwZXM6IFsnY2xvc2VkJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgICAgICdjb250ZW50cyc6ICdyZWFkJyxcbiAgICAgICAgICAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYnM6IHtcbiAgICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgICAgICdpZic6IFwic3RhcnRzV2l0aChnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnRpdGxlLCAnZml4JykgfHwgc3RhcnRzV2l0aChnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnRpdGxlLCAnZmVhdCcpXCIsXG4gICAgICAgICAgICAnc3RlcHMnOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLmNoZWNrb3V0LFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdwZXJzaXN0LWNyZWRlbnRpYWxzJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5jb25maWd1cmVBd3NDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IG9wdGlvbnMuYXdzUmVnaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRGVsZXRlIENsb3VkRm9ybWF0aW9uIHN0YWNrJyxcbiAgICAgICAgICAgICAgICBpZDogJ2RlbGV0ZS1zdGFjaycsXG4gICAgICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgICBCUkFOQ0hfTkFNRTogJyR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICAgICAnIyBTdHJpcCBjb252ZW50aW9uYWwgY29tbWl0IHByZWZpeCAoZmVhdC8sIGZpeC8sIGNob3JlLywgZXRjLiknLFxuICAgICAgICAgICAgICAgICAgJ0NMRUFOX0JSQU5DSF9OQU1FPSR7QlJBTkNIX05BTUUjKi99JyxcbiAgICAgICAgICAgICAgICAgICcjIFNhbml0aXplIGludG8gYSBsZWdhbCBDbG91ZEZvcm1hdGlvbiBzdGFjay1uYW1lIGZyYWdtZW50JyxcbiAgICAgICAgICAgICAgICAgIC4uLnNhbml0aXplQnJhbmNoTmFtZVNjcmlwdCgpLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJPcmlnaW5hbCBicmFuY2g6ICRCUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiQ2xlYW4gYnJhbmNoOiAkQ0xFQU5fQlJBTkNIX05BTUVcIicsXG4gICAgICAgICAgICAgICAgICBgU1RBQ0tfTkFNRT1cIiR7b3B0aW9ucy5wcm9qZWN0TmFtZX0tZGV2LSRDTEVBTl9CUkFOQ0hfTkFNRVwiYCxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiRGVsZXRpbmcgc3RhY2s6ICRTVEFDS19OQU1FXCInLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnIyBJbml0aWF0ZSBzdGFjayBkZWxldGlvbicsXG4gICAgICAgICAgICAgICAgICAnYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJFNUQUNLX05BTUUnLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnIyBXYWl0IGZvciBzdGFjayBkZWxldGlvbiB0byBjb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIldhaXRpbmcgZm9yIHN0YWNrIGRlbGV0aW9uIHRvIGNvbXBsZXRlLi4uXCInLFxuICAgICAgICAgICAgICAgICAgJ2F3cyBjbG91ZGZvcm1hdGlvbiB3YWl0IHN0YWNrLWRlbGV0ZS1jb21wbGV0ZSAtLXN0YWNrLW5hbWUgJFNUQUNLX05BTUUnLFxuICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIlN0YWNrIGRlbGV0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21tZW50IFBSIC0gU3VjY2VzcycsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuZ2l0aHViU2NyaXB0LFxuICAgICAgICAgICAgICAgIGlmOiAnc3VjY2VzcygpJyxcbiAgICAgICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAgIEhFQURfUkVGOiAnJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgICBzY3JpcHQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2dpdGh1Yi5yZXN0Lmlzc3Vlcy5jcmVhdGVDb21tZW50KHsnLFxuICAgICAgICAgICAgICAgICAgICAnICBpc3N1ZV9udW1iZXI6IGNvbnRleHQuaXNzdWUubnVtYmVyLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIG93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgcmVwbzogY29udGV4dC5yZXBvLnJlcG8sJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgYm9keTogYPCfp7kgU3VjY2Vzc2Z1bGx5IGNsZWFuZWQgdXAgQVdTIHJlc291cmNlcyBmb3IgYnJhbmNoIFxcXFxgJHtwcm9jZXNzLmVudi5IRUFEX1JFRn1cXFxcYGAnLFxuICAgICAgICAgICAgICAgICAgICAnfSknLFxuICAgICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbW1lbnQgUFIgLSBGYWlsdXJlJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5naXRodWJTY3JpcHQsXG4gICAgICAgICAgICAgICAgaWY6ICdmYWlsdXJlKCknLFxuICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgSEVBRF9SRUY6ICcke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgIHNjcmlwdDogW1xuICAgICAgICAgICAgICAgICAgICAnY29uc3QgcnVuVXJsID0gYCR7eyBnaXRodWIuc2VydmVyX3VybCB9fS8ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX0vYWN0aW9ucy9ydW5zLyR7eyBnaXRodWIucnVuX2lkIH19YDsnLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGlzc3VlX251bWJlcjogY29udGV4dC5pc3N1ZS5udW1iZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwnLFxuICAgICAgICAgICAgICAgICAgICAnICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywnLFxuICAgICAgICAgICAgICAgICAgICAnICBib2R5OiBg4p2MIEZhaWxlZCB0byBjbGVhbiB1cCBBV1MgcmVzb3VyY2VzIGZvciBicmFuY2ggXFxcXGAke3Byb2Nlc3MuZW52LkhFQURfUkVGfVxcXFxgLiBQbGVhc2UgY2hlY2sgdGhlIFt3b3JrZmxvdyBydW5dKCR7cnVuVXJsfSkgZm9yIGRldGFpbHMuYCcsXG4gICAgICAgICAgICAgICAgICAgICd9KScsXG4gICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJDbGVhbnVwV29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUHJDbGVhbnVwV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWtDO0FBRWxDLG1DQUFtRDtBQUNuRCxxRUFBeUY7QUFhekYsTUFBYSxpQkFBa0IsU0FBUSxpQkFBUTtJQUM3QyxZQUFZLE9BQTRCLEVBQUUsT0FBaUM7UUFDekUsTUFBTSxjQUFjLEdBQUcsSUFBQSw4Q0FBcUIsRUFBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRTtZQUNqRCxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsR0FBRyxFQUFFO2dCQUNILElBQUksRUFBRSxZQUFZO2dCQUNsQixFQUFFLEVBQUU7b0JBQ0YsWUFBWSxFQUFFO3dCQUNaLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztxQkFDbEI7aUJBQ0Y7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxrREFBa0Q7b0JBQzNELG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsT0FBTztvQkFDbkIsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLGVBQWUsRUFBRSxPQUFPO2lCQUN6QjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFO3dCQUNQLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixJQUFJLEVBQUUsMkdBQTJHO3dCQUNqSCxPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUTtnQ0FDN0IsSUFBSSxFQUFFO29DQUNKLHFCQUFxQixFQUFFLEtBQUs7aUNBQzdCOzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSwyQkFBMkI7Z0NBQ2pDLElBQUksRUFBRSxjQUFjLENBQUMsdUJBQXVCO2dDQUM1QyxJQUFJLEVBQUU7b0NBQ0osZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE9BQU87b0NBQ2pDLFlBQVksRUFBRSxPQUFPLENBQUMsU0FBUztpQ0FDaEM7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLDZCQUE2QjtnQ0FDbkMsRUFBRSxFQUFFLGNBQWM7Z0NBQ2xCLEdBQUcsRUFBRTtvQ0FDSCxXQUFXLEVBQUUsd0JBQXdCO2lDQUN0QztnQ0FDRCxHQUFHLEVBQUU7b0NBQ0gsZ0VBQWdFO29DQUNoRSxxQ0FBcUM7b0NBQ3JDLDREQUE0RDtvQ0FDNUQsR0FBRyxJQUFBLGdDQUF3QixHQUFFO29DQUM3QixzQ0FBc0M7b0NBQ3RDLHlDQUF5QztvQ0FDekMsZUFBZSxPQUFPLENBQUMsV0FBVywwQkFBMEI7b0NBQzVELG9DQUFvQztvQ0FDcEMsRUFBRTtvQ0FDRiwyQkFBMkI7b0NBQzNCLDBEQUEwRDtvQ0FDMUQsRUFBRTtvQ0FDRix1Q0FBdUM7b0NBQ3ZDLGtEQUFrRDtvQ0FDbEQsd0VBQXdFO29DQUN4RSxFQUFFO29DQUNGLDhDQUE4QztpQ0FDL0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzZCQUNiOzRCQUNEO2dDQUNFLElBQUksRUFBRSxzQkFBc0I7Z0NBQzVCLElBQUksRUFBRSxjQUFjLENBQUMsWUFBWTtnQ0FDakMsRUFBRSxFQUFFLFdBQVc7Z0NBQ2YsR0FBRyxFQUFFO29DQUNILFFBQVEsRUFBRSx3QkFBd0I7aUNBQ25DO2dDQUNELElBQUksRUFBRTtvQ0FDSixNQUFNLEVBQUU7d0NBQ04sb0NBQW9DO3dDQUNwQyx1Q0FBdUM7d0NBQ3ZDLDhCQUE4Qjt3Q0FDOUIsNEJBQTRCO3dDQUM1Qiw2RkFBNkY7d0NBQzdGLElBQUk7cUNBQ0wsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lDQUNiOzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSxzQkFBc0I7Z0NBQzVCLElBQUksRUFBRSxjQUFjLENBQUMsWUFBWTtnQ0FDakMsRUFBRSxFQUFFLFdBQVc7Z0NBQ2YsR0FBRyxFQUFFO29DQUNILFFBQVEsRUFBRSx3QkFBd0I7aUNBQ25DO2dDQUNELElBQUksRUFBRTtvQ0FDSixNQUFNLEVBQUU7d0NBQ04sdUdBQXVHO3dDQUN2RyxvQ0FBb0M7d0NBQ3BDLHVDQUF1Qzt3Q0FDdkMsOEJBQThCO3dDQUM5Qiw0QkFBNEI7d0NBQzVCLGdKQUFnSjt3Q0FDaEosSUFBSTtxQ0FDTCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUNBQ2I7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9HRCw4Q0ErR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBZYW1sRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgc2FuaXRpemVCcmFuY2hOYW1lU2NyaXB0IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyByZXNvbHZlQWN0aW9uVmVyc2lvbnMsIFdvcmtmbG93QWN0aW9uVmVyc2lvbnMgfSBmcm9tICcuL1dvcmtmbG93QWN0aW9uVmVyc2lvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByQ2xlYW51cFdvcmtmbG93T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBmb3IgdGhlIHBpbm5lZCBhY3Rpb24gdmVyc2lvbnMgdXNlZCBieSB0aGlzIHdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uVmVyc2lvbnM/OiBXb3JrZmxvd0FjdGlvblZlcnNpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgUHJDbGVhbnVwV29ya2Zsb3cgZXh0ZW5kcyBZYW1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsIG9wdGlvbnM6IFByQ2xlYW51cFdvcmtmbG93T3B0aW9ucykge1xuICAgIGNvbnN0IGFjdGlvblZlcnNpb25zID0gcmVzb2x2ZUFjdGlvblZlcnNpb25zKG9wdGlvbnMuYWN0aW9uVmVyc2lvbnMpO1xuICAgIHN1cGVyKHByb2plY3QsICcuZ2l0aHViL3dvcmtmbG93cy9wci1jbGVhbnVwLnltbCcsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6ICdQUiBDbGVhbnVwJyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgICAgIHR5cGVzOiBbJ2Nsb3NlZCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgICAgJ2dyb3VwJzogJ3ByLXN0YWNrLSR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0Lm51bWJlciB9fScsXG4gICAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAgICAgJ2NvbnRlbnRzJzogJ3JlYWQnLFxuICAgICAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyxcbiAgICAgICAgfSxcbiAgICAgICAgam9iczoge1xuICAgICAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAgICAgJ2lmJzogXCJzdGFydHNXaXRoKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QudGl0bGUsICdmaXgnKSB8fCBzdGFydHNXaXRoKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QudGl0bGUsICdmZWF0JylcIixcbiAgICAgICAgICAgICdzdGVwcyc6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuY2hlY2tvdXQsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ3BlcnNpc3QtY3JlZGVudGlhbHMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMnLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLmNvbmZpZ3VyZUF3c0NyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICAgICAgICAgICdhd3MtcmVnaW9uJzogb3B0aW9ucy5hd3NSZWdpb24sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdEZWxldGUgQ2xvdWRGb3JtYXRpb24gc3RhY2snLFxuICAgICAgICAgICAgICAgIGlkOiAnZGVsZXRlLXN0YWNrJyxcbiAgICAgICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAgIEJSQU5DSF9OQU1FOiAnJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgICcjIFN0cmlwIGNvbnZlbnRpb25hbCBjb21taXQgcHJlZml4IChmZWF0LywgZml4LywgY2hvcmUvLCBldGMuKScsXG4gICAgICAgICAgICAgICAgICAnQ0xFQU5fQlJBTkNIX05BTUU9JHtCUkFOQ0hfTkFNRSMqL30nLFxuICAgICAgICAgICAgICAgICAgJyMgU2FuaXRpemUgaW50byBhIGxlZ2FsIENsb3VkRm9ybWF0aW9uIHN0YWNrLW5hbWUgZnJhZ21lbnQnLFxuICAgICAgICAgICAgICAgICAgLi4uc2FuaXRpemVCcmFuY2hOYW1lU2NyaXB0KCksXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIk9yaWdpbmFsIGJyYW5jaDogJEJSQU5DSF9OQU1FXCInLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJDbGVhbiBicmFuY2g6ICRDTEVBTl9CUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgIGBTVEFDS19OQU1FPVwiJHtvcHRpb25zLnByb2plY3ROYW1lfS1kZXYtJENMRUFOX0JSQU5DSF9OQU1FXCJgLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJEZWxldGluZyBzdGFjazogJFNUQUNLX05BTUVcIicsXG4gICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICcjIEluaXRpYXRlIHN0YWNrIGRlbGV0aW9uJyxcbiAgICAgICAgICAgICAgICAgICdhd3MgY2xvdWRmb3JtYXRpb24gZGVsZXRlLXN0YWNrIC0tc3RhY2stbmFtZSAkU1RBQ0tfTkFNRScsXG4gICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICcjIFdhaXQgZm9yIHN0YWNrIGRlbGV0aW9uIHRvIGNvbXBsZXRlJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiV2FpdGluZyBmb3Igc3RhY2sgZGVsZXRpb24gdG8gY29tcGxldGUuLi5cIicsXG4gICAgICAgICAgICAgICAgICAnYXdzIGNsb3VkZm9ybWF0aW9uIHdhaXQgc3RhY2stZGVsZXRlLWNvbXBsZXRlIC0tc3RhY2stbmFtZSAkU1RBQ0tfTkFNRScsXG4gICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiU3RhY2sgZGVsZXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiJyxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbW1lbnQgUFIgLSBTdWNjZXNzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5naXRodWJTY3JpcHQsXG4gICAgICAgICAgICAgICAgaWY6ICdzdWNjZXNzKCknLFxuICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgSEVBRF9SRUY6ICcke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgIHNjcmlwdDogW1xuICAgICAgICAgICAgICAgICAgICAnZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGlzc3VlX251bWJlcjogY29udGV4dC5pc3N1ZS5udW1iZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwnLFxuICAgICAgICAgICAgICAgICAgICAnICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywnLFxuICAgICAgICAgICAgICAgICAgICAnICBib2R5OiBg8J+nuSBTdWNjZXNzZnVsbHkgY2xlYW5lZCB1cCBBV1MgcmVzb3VyY2VzIGZvciBicmFuY2ggXFxcXGAke3Byb2Nlc3MuZW52LkhFQURfUkVGfVxcXFxgYCcsXG4gICAgICAgICAgICAgICAgICAgICd9KScsXG4gICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29tbWVudCBQUiAtIEZhaWx1cmUnLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLmdpdGh1YlNjcmlwdCxcbiAgICAgICAgICAgICAgICBpZjogJ2ZhaWx1cmUoKScsXG4gICAgICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgICBIRUFEX1JFRjogJyR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgc2NyaXB0OiBbXG4gICAgICAgICAgICAgICAgICAgICdjb25zdCBydW5VcmwgPSBgJHt7IGdpdGh1Yi5zZXJ2ZXJfdXJsIH19LyR7eyBnaXRodWIucmVwb3NpdG9yeSB9fS9hY3Rpb25zL3J1bnMvJHt7IGdpdGh1Yi5ydW5faWQgfX1gOycsXG4gICAgICAgICAgICAgICAgICAgICdnaXRodWIucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7JyxcbiAgICAgICAgICAgICAgICAgICAgJyAgaXNzdWVfbnVtYmVyOiBjb250ZXh0Lmlzc3VlLm51bWJlciwnLFxuICAgICAgICAgICAgICAgICAgICAnICBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIGJvZHk6IGDinYwgRmFpbGVkIHRvIGNsZWFuIHVwIEFXUyByZXNvdXJjZXMgZm9yIGJyYW5jaCBcXFxcYCR7cHJvY2Vzcy5lbnYuSEVBRF9SRUZ9XFxcXGAuIFBsZWFzZSBjaGVjayB0aGUgW3dvcmtmbG93IHJ1bl0oJHtydW5Vcmx9KSBmb3IgZGV0YWlscy5gJyxcbiAgICAgICAgICAgICAgICAgICAgJ30pJyxcbiAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -19,6 +19,10 @@ class PrDeployWorkflow extends projen_1.YamlFile {
19
19
  types: ['opened', 'synchronize', 'reopened'],
20
20
  },
21
21
  },
22
+ concurrency: {
23
+ 'group': 'pr-stack-${{ github.event.pull_request.number }}',
24
+ 'cancel-in-progress': false,
25
+ },
22
26
  permissions: {
23
27
  'id-token': 'write',
24
28
  'contents': 'read',
@@ -148,4 +152,4 @@ class PrDeployWorkflow extends projen_1.YamlFile {
148
152
  }
149
153
  }
150
154
  exports.PrDeployWorkflow = PrDeployWorkflow;
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJEZXBsb3lXb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QckRlcGxveVdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUVsQyxzREFBMkQ7QUFDM0QsbUNBQXFGO0FBQ3JGLHFFQUF5RjtBQWF6RixNQUFhLGdCQUFpQixTQUFRLGlCQUFRO0lBQzVDLFlBQVksT0FBNEIsRUFBRSxPQUFnQztRQUN4RSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxJQUFBLDhDQUFxQixFQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRSxLQUFLLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFO1lBQ2hELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEVBQUUsRUFBRTtvQkFDRixZQUFZLEVBQUU7d0JBQ1osS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7cUJBQzdDO2lCQUNGO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsT0FBTztvQkFDbkIsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLGVBQWUsRUFBRSxPQUFPO2lCQUN6QjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osTUFBTSxFQUFFO3dCQUNOLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixJQUFJLEVBQUUsMkdBQTJHO3dCQUNqSCxPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUTtnQ0FDN0IsSUFBSSxFQUFFO29DQUNKLHFCQUFxQixFQUFFLEtBQUs7aUNBQzdCOzZCQUNGOzRCQUNELEdBQUcsQ0FBQyxjQUFjLEtBQUssK0JBQWtCLENBQUMsSUFBSSxDQUFD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OzZCQUNiO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE3SUQsNENBNklDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWWFtbEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcbmltcG9ydCB7IE5vZGVQYWNrYWdlTWFuYWdlciB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5pbXBvcnQgeyBpbnN0YWxsQ29tbWFuZCwgcnVuU2NyaXB0Q29tbWFuZCwgc2FuaXRpemVCcmFuY2hOYW1lU2NyaXB0IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyByZXNvbHZlQWN0aW9uVmVyc2lvbnMsIFdvcmtmbG93QWN0aW9uVmVyc2lvbnMgfSBmcm9tICcuL1dvcmtmbG93QWN0aW9uVmVyc2lvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByRGVwbG95V29ya2Zsb3dPcHRpb25zIHtcbiAgcmVhZG9ubHkgcm9sZUFybjogc3RyaW5nO1xuICByZWFkb25seSBhd3NSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgY2xlcmtQdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgZm9yIHRoZSBwaW5uZWQgYWN0aW9uIHZlcnNpb25zIHVzZWQgYnkgdGhpcyB3b3JrZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvblZlcnNpb25zPzogV29ya2Zsb3dBY3Rpb25WZXJzaW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIFByRGVwbG95V29ya2Zsb3cgZXh0ZW5kcyBZYW1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsIG9wdGlvbnM6IFByRGVwbG95V29ya2Zsb3dPcHRpb25zKSB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBwcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXI7XG4gICAgY29uc3QgYWN0aW9uVmVyc2lvbnMgPSByZXNvbHZlQWN0aW9uVmVyc2lvbnMob3B0aW9ucy5hY3Rpb25WZXJzaW9ucyk7XG4gICAgc3VwZXIocHJvamVjdCwgJy5naXRodWIvd29ya2Zsb3dzL3ByLWRlcGxveS55bWwnLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIG9iajoge1xuICAgICAgICBuYW1lOiAnUFIgRGVwbG95JyxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdzeW5jaHJvbml6ZScsICdyZW9wZW5lZCddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgICAgICAnY29udGVudHMnOiAncmVhZCcsXG4gICAgICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAnd3JpdGUnLFxuICAgICAgICB9LFxuICAgICAgICBqb2JzOiB7XG4gICAgICAgICAgZGVwbG95OiB7XG4gICAgICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgICAgICdpZic6IFwic3RhcnRzV2l0aChnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnRpdGxlLCAnZml4JykgfHwgc3RhcnRzV2l0aChnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnRpdGxlLCAnZmVhdCcpXCIsXG4gICAgICAgICAgICAnc3RlcHMnOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLmNoZWNrb3V0LFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdwZXJzaXN0LWNyZWRlbnRpYWxzJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLi4uKHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTSA/IFt7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NldHVwIHBucG0nLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLnBucG1BY3Rpb25TZXR1cCxcbiAgICAgICAgICAgICAgfV0gOiBbXSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuc2V0dXBOb2RlLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdub2RlLXZlcnNpb24nOiAnMjQnLFxuICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UtbWFuYWdlci1jYWNoZSc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJlIEFXUyBjcmVkZW50aWFscycsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuY29uZmlndXJlQXdzQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBvcHRpb25zLmF3c1JlZ2lvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBydW46IGluc3RhbGxDb21tYW5kKHBhY2thZ2VNYW5hZ2VyKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdVcGRhdGUgY29uZmlnLmpzb24nLFxuICAgICAgICAgICAgICAgIHJ1bjogYGpxICcuY2xlcmtQdWJsaXNoYWJsZUtleSA9IFwiJHtvcHRpb25zLmNsZXJrUHVibGlzaGFibGVLZXl9XCInIHdlYi9wdWJsaWMvY29uZmlnLmpzb24gPiB0bXAuanNvbiAmJiBtdiB0bXAuanNvbiB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdEZXBsb3kgdG8gQVdTJyxcbiAgICAgICAgICAgICAgICBpZDogJ2RlcGxveScsXG4gICAgICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgICBCUkFOQ0hfTkFNRTogJyR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICAgICAnIyBTdHJpcCBjb252ZW50aW9uYWwgY29tbWl0IHByZWZpeCAoZmVhdC8sIGZpeC8sIGNob3JlLywgZXRjLiknLFxuICAgICAgICAgICAgICAgICAgJ0NMRUFOX0JSQU5DSF9OQU1FPSR7QlJBTkNIX05BTUUjKi99JyxcbiAgICAgICAgICAgICAgICAgICcjIFNhbml0aXplIGludG8gYSBsZWdhbCBDbG91ZEZvcm1hdGlvbiBzdGFjay1uYW1lIGZyYWdtZW50JyxcbiAgICAgICAgICAgICAgICAgIC4uLnNhbml0aXplQnJhbmNoTmFtZVNjcmlwdCgpLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJPcmlnaW5hbCBicmFuY2g6ICRCUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwiQ2xlYW4gYnJhbmNoOiAkQ0xFQU5fQlJBTkNIX05BTUVcIicsXG4gICAgICAgICAgICAgICAgICBgJHtydW5TY3JpcHRDb21tYW5kKHBhY2thZ2VNYW5hZ2VyLCAnY2RrOmRldicpfSAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD0kQ0xFQU5fQlJBTkNIX05BTUUgZGVwbG95IC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciAtLW91dHB1dHMtZmlsZSBjZGstb3V0cHV0cy5qc29uYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0V4dHJhY3Qgb3V0cHV0cycsXG4gICAgICAgICAgICAgICAgaWQ6ICdvdXRwdXRzJyxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgICdXRUJTSVRFX1VSTD0kKGpxIC1yIFxcJy5bXSB8IC5XZWJzaXRlVXJsIC8vIGVtcHR5XFwnIGNkay1vdXRwdXRzLmpzb24pJyxcbiAgICAgICAgICAgICAgICAgICdlY2hvIFwid2Vic2l0ZV91cmw9JFdFQlNJVEVfVVJMXCIgPj4gJEdJVEhVQl9PVVRQVVQnLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJXZWJzaXRlIFVSTDogJFdFQlNJVEVfVVJMXCInLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29tbWVudCBQUicsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuZ2l0aHViU2NyaXB0LFxuICAgICAgICAgICAgICAgIGlmOiAnc3VjY2VzcygpJyxcbiAgICAgICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAgIEhFQURfUkVGOiAnJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgICAgICAgICAgICAgICBXRUJTSVRFX1VSTDogJyR7eyBzdGVwcy5vdXRwdXRzLm91dHB1dHMud2Vic2l0ZV91cmwgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgc2NyaXB0OiBbXG4gICAgICAgICAgICAgICAgICAgICdjb25zdCB3ZWJzaXRlVXJsID0gcHJvY2Vzcy5lbnYuV0VCU0lURV9VUkw7JyxcbiAgICAgICAgICAgICAgICAgICAgJ2xldCBib2R5ID0gYOKchSBTdWNjZXNzZnVsbHkgZGVwbG95ZWQgYnJhbmNoIFxcXFxgJHtwcm9jZXNzLmVudi5IRUFEX1JFRn1cXFxcYCB0byBBV1MgZGV2IGVudmlyb25tZW50XFxcXG5cXFxcbmA7JyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICdpZiAod2Vic2l0ZVVybCkgeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGJvZHkgKz0gYPCfjJAgKipXZWJzaXRlIFVSTDoqKiAke3dlYnNpdGVVcmx9YDsnLFxuICAgICAgICAgICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0aHViLnJlc3QuaXNzdWVzLmNyZWF0ZUNvbW1lbnQoeycsXG4gICAgICAgICAgICAgICAgICAgICcgIGlzc3VlX251bWJlcjogY29udGV4dC5pc3N1ZS5udW1iZXIsJyxcbiAgICAgICAgICAgICAgICAgICAgJyAgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwnLFxuICAgICAgICAgICAgICAgICAgICAnICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbywnLFxuICAgICAgICAgICAgICAgICAgICAnICBib2R5OiBib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgJ30pJyxcbiAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdOb3RpZnkgU2xhY2snLFxuICAgICAgICAgICAgICAgIGlmOiAnYWx3YXlzKCknLFxuICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgU1RBVFVTOiAnJHt7IGpvYi5zdGF0dXMgfX0nLFxuICAgICAgICAgICAgICAgICAgV0VCU0lURV9VUkw6ICcke3sgc3RlcHMub3V0cHV0cy5vdXRwdXRzLndlYnNpdGVfdXJsIH19JyxcbiAgICAgICAgICAgICAgICAgIFJFUE86ICcke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX0nLFxuICAgICAgICAgICAgICAgICAgUFJfTlVNQkVSOiAnJHt7IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICAgICAgICAgQ09NTUlUOiAnJHt7IGdpdGh1Yi5zaGEgfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICAgICAnQ09MT1I9XCJnb29kXCInLFxuICAgICAgICAgICAgICAgICAgJ2lmIFsgXCIkU1RBVFVTXCIgIT0gXCJzdWNjZXNzXCIgXTsgdGhlbicsXG4gICAgICAgICAgICAgICAgICAnICBDT0xPUj1cImRhbmdlclwiJyxcbiAgICAgICAgICAgICAgICAgICdmaScsXG4gICAgICAgICAgICAgICAgICAnTUVTU0FHRT1cIlBSIERlcGxveTogJFNUQVRVU1xcXFxuUmVwbzogJFJFUE9cXFxcblBSOiAjJFBSX05VTUJFUlxcXFxuQ29tbWl0OiAkQ09NTUlUXCInLFxuICAgICAgICAgICAgICAgICAgJ2lmIFsgLW4gXCIkV0VCU0lURV9VUkxcIiBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgICAgICcgIE1FU1NBR0U9XCIkTUVTU0FHRVxcXFxu8J+MkCBXZWJzaXRlOiA8JFdFQlNJVEVfVVJMfFZpZXcgU2l0ZT5cIicsXG4gICAgICAgICAgICAgICAgICAnZmknLFxuICAgICAgICAgICAgICAgICAgJ2N1cmwgLVggUE9TVCBodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZSBcXFxcJyxcbiAgICAgICAgICAgICAgICAgICcgIC1IIFwiQXV0aG9yaXphdGlvbjogQmVhcmVyICR7eyBzZWNyZXRzLlNMQUNLX0JPVF9UT0tFTiB9fVwiIFxcXFwnLFxuICAgICAgICAgICAgICAgICAgJyAgLUggXFwnQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uXFwnIFxcXFwnLFxuICAgICAgICAgICAgICAgICAgJyAgLS1kYXRhIFwie1xcXFxcImNoYW5uZWxcXFxcXCI6XFxcXFwiJHt7IHNlY3JldHMuU0xBQ0tfQ0hBTk5FTF9JRCB9fVxcXFxcIixcXFxcXCJhdHRhY2htZW50c1xcXFxcIjpbe1xcXFxcImNvbG9yXFxcXFwiOlxcXFxcIiRDT0xPUlxcXFxcIixcXFxcXCJ0ZXh0XFxcXFwiOlxcXFxcIiRNRVNTQUdFXFxcXFwifV19XCInLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJEZXBsb3lXb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QckRlcGxveVdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQUVsQyxzREFBMkQ7QUFDM0QsbUNBQXFGO0FBQ3JGLHFFQUF5RjtBQWF6RixNQUFhLGdCQUFpQixTQUFRLGlCQUFRO0lBQzVDLFlBQVksT0FBNEIsRUFBRSxPQUFnQztRQUN4RSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxJQUFBLDhDQUFxQixFQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRSxLQUFLLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFO1lBQ2hELE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLElBQUk7WUFDZCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEVBQUUsRUFBRTtvQkFDRixZQUFZLEVBQUU7d0JBQ1osS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7cUJBQzdDO2lCQUNGO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxPQUFPLEVBQUUsa0RBQWtEO29CQUMzRCxvQkFBb0IsRUFBRSxLQUFLO2lCQUM1QjtnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLE9BQU87b0JBQ25CLFVBQVUsRUFBRSxNQUFNO29CQUNsQixlQUFlLEVBQUUsT0FBTztpQkFDekI7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRTt3QkFDTixTQUFTLEVBQUUsZUFBZTt3QkFDMUIsSUFBSSxFQUFFLDJHQUEyRzt3QkFDakgsT0FBTyxFQUFFOzRCQUNQO2dDQUNFLElBQUksRUFBRSxVQUFVO2dDQUNoQixJQUFJLEVBQUUsY0FBYyxDQUFDLFFBQVE7Z0NBQzdCLElBQUksRUFBRTtvQ0FDSixxQkFBcUIs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Q3hELGdFQUFnRTtvQ0FDaEUsNENBQTRDO29DQUM1QywySUFBMkk7aUNBQzVJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs2QkFDYjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBakpELDRDQWlKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFlhbWxGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuaW1wb3J0IHsgaW5zdGFsbENvbW1hbmQsIHJ1blNjcmlwdENvbW1hbmQsIHNhbml0aXplQnJhbmNoTmFtZVNjcmlwdCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcmVzb2x2ZUFjdGlvblZlcnNpb25zLCBXb3JrZmxvd0FjdGlvblZlcnNpb25zIH0gZnJvbSAnLi9Xb3JrZmxvd0FjdGlvblZlcnNpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBQckRlcGxveVdvcmtmbG93T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsZXJrUHVibGlzaGFibGVLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGZvciB0aGUgcGlubmVkIGFjdGlvbiB2ZXJzaW9ucyB1c2VkIGJ5IHRoaXMgd29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25WZXJzaW9ucz86IFdvcmtmbG93QWN0aW9uVmVyc2lvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBQckRlcGxveVdvcmtmbG93IGV4dGVuZHMgWWFtbEZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwLCBvcHRpb25zOiBQckRlcGxveVdvcmtmbG93T3B0aW9ucykge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyO1xuICAgIGNvbnN0IGFjdGlvblZlcnNpb25zID0gcmVzb2x2ZUFjdGlvblZlcnNpb25zKG9wdGlvbnMuYWN0aW9uVmVyc2lvbnMpO1xuICAgIHN1cGVyKHByb2plY3QsICcuZ2l0aHViL3dvcmtmbG93cy9wci1kZXBsb3kueW1sJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogJ1BSIERlcGxveScsXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnc3luY2hyb25pemUnLCAncmVvcGVuZWQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICAgICdncm91cCc6ICdwci1zdGFjay0ke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5udW1iZXIgfX0nLFxuICAgICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgICAgICdjb250ZW50cyc6ICdyZWFkJyxcbiAgICAgICAgICAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGpvYnM6IHtcbiAgICAgICAgICBkZXBsb3k6IHtcbiAgICAgICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAgICAgJ2lmJzogXCJzdGFydHNXaXRoKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QudGl0bGUsICdmaXgnKSB8fCBzdGFydHNXaXRoKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QudGl0bGUsICdmZWF0JylcIixcbiAgICAgICAgICAgICdzdGVwcyc6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuY2hlY2tvdXQsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ3BlcnNpc3QtY3JlZGVudGlhbHMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAuLi4ocGFja2FnZU1hbmFnZXIgPT09IE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNID8gW3tcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dXAgcG5wbScsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMucG5wbUFjdGlvblNldHVwLFxuICAgICAgICAgICAgICB9XSA6IFtdKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdTZXR1cCBOb2RlLmpzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5zZXR1cE5vZGUsXG4gICAgICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6ICcyNCcsXG4gICAgICAgICAgICAgICAgICAncGFja2FnZS1tYW5hZ2VyLWNhY2hlJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgQVdTIGNyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5jb25maWd1cmVBd3NDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgICAgICAgICAnYXdzLXJlZ2lvbic6IG9wdGlvbnMuYXdzUmVnaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIHJ1bjogaW5zdGFsbENvbW1hbmQocGFja2FnZU1hbmFnZXIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZSBjb25maWcuanNvbicsXG4gICAgICAgICAgICAgICAgcnVuOiBganEgJy5jbGVya1B1Ymxpc2hhYmxlS2V5ID0gXCIke29wdGlvbnMuY2xlcmtQdWJsaXNoYWJsZUtleX1cIicgd2ViL3B1YmxpYy9jb25maWcuanNvbiA+IHRtcC5qc29uICYmIG12IHRtcC5qc29uIHdlYi9wdWJsaWMvY29uZmlnLmpzb25gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0RlcGxveSB0byBBV1MnLFxuICAgICAgICAgICAgICAgIGlkOiAnZGVwbG95JyxcbiAgICAgICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAgIEJSQU5DSF9OQU1FOiAnJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgICcjIFN0cmlwIGNvbnZlbnRpb25hbCBjb21taXQgcHJlZml4IChmZWF0LywgZml4LywgY2hvcmUvLCBldGMuKScsXG4gICAgICAgICAgICAgICAgICAnQ0xFQU5fQlJBTkNIX05BTUU9JHtCUkFOQ0hfTkFNRSMqL30nLFxuICAgICAgICAgICAgICAgICAgJyMgU2FuaXRpemUgaW50byBhIGxlZ2FsIENsb3VkRm9ybWF0aW9uIHN0YWNrLW5hbWUgZnJhZ21lbnQnLFxuICAgICAgICAgICAgICAgICAgLi4uc2FuaXRpemVCcmFuY2hOYW1lU2NyaXB0KCksXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIk9yaWdpbmFsIGJyYW5jaDogJEJSQU5DSF9OQU1FXCInLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJDbGVhbiBicmFuY2g6ICRDTEVBTl9CUkFOQ0hfTkFNRVwiJyxcbiAgICAgICAgICAgICAgICAgIGAke3J1blNjcmlwdENvbW1hbmQocGFja2FnZU1hbmFnZXIsICdjZGs6ZGV2Jyl9IC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PSRDTEVBTl9CUkFOQ0hfTkFNRSBkZXBsb3kgLS1yZXF1aXJlLWFwcHJvdmFsIG5ldmVyIC0tb3V0cHV0cy1maWxlIGNkay1vdXRwdXRzLmpzb25gLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRXh0cmFjdCBvdXRwdXRzJyxcbiAgICAgICAgICAgICAgICBpZDogJ291dHB1dHMnLFxuICAgICAgICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgICAgICAgJ1dFQlNJVEVfVVJMPSQoanEgLXIgXFwnLltdIHwgLldlYnNpdGVVcmwgLy8gZW1wdHlcXCcgY2RrLW91dHB1dHMuanNvbiknLFxuICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJ3ZWJzaXRlX3VybD0kV0VCU0lURV9VUkxcIiA+PiAkR0lUSFVCX09VVFBVVCcsXG4gICAgICAgICAgICAgICAgICAnZWNobyBcIldlYnNpdGUgVVJMOiAkV0VCU0lURV9VUkxcIicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdDb21tZW50IFBSJyxcbiAgICAgICAgICAgICAgICB1c2VzOiBhY3Rpb25WZXJzaW9ucy5naXRodWJTY3JpcHQsXG4gICAgICAgICAgICAgICAgaWY6ICdzdWNjZXNzKCknLFxuICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgSEVBRF9SRUY6ICcke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAgICAgICAgICAgICAgIFdFQlNJVEVfVVJMOiAnJHt7IHN0ZXBzLm91dHB1dHMub3V0cHV0cy53ZWJzaXRlX3VybCB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICAgICBzY3JpcHQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnN0IHdlYnNpdGVVcmwgPSBwcm9jZXNzLmVudi5XRUJTSVRFX1VSTDsnLFxuICAgICAgICAgICAgICAgICAgICAnbGV0IGJvZHkgPSBg4pyFIFN1Y2Nlc3NmdWxseSBkZXBsb3llZCBicmFuY2ggXFxcXGAke3Byb2Nlc3MuZW52LkhFQURfUkVGfVxcXFxgIHRvIEFXUyBkZXYgZW52aXJvbm1lbnRcXFxcblxcXFxuYDsnLFxuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lmICh3ZWJzaXRlVXJsKSB7JyxcbiAgICAgICAgICAgICAgICAgICAgJyAgYm9keSArPSBg8J+MkCAqKldlYnNpdGUgVVJMOioqICR7d2Vic2l0ZVVybH1gOycsXG4gICAgICAgICAgICAgICAgICAgICd9JyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICdnaXRodWIucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7JyxcbiAgICAgICAgICAgICAgICAgICAgJyAgaXNzdWVfbnVtYmVyOiBjb250ZXh0Lmlzc3VlLm51bWJlciwnLFxuICAgICAgICAgICAgICAgICAgICAnICBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCcsXG4gICAgICAgICAgICAgICAgICAgICcgIGJvZHk6IGJvZHknLFxuICAgICAgICAgICAgICAgICAgICAnfSknLFxuICAgICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ05vdGlmeSBTbGFjaycsXG4gICAgICAgICAgICAgICAgaWY6ICdhbHdheXMoKScsXG4gICAgICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgICBTVEFUVVM6ICcke3sgam9iLnN0YXR1cyB9fScsXG4gICAgICAgICAgICAgICAgICBXRUJTSVRFX1VSTDogJyR7eyBzdGVwcy5vdXRwdXRzLm91dHB1dHMud2Vic2l0ZV91cmwgfX0nLFxuICAgICAgICAgICAgICAgICAgUkVQTzogJyR7eyBnaXRodWIucmVwb3NpdG9yeSB9fScsXG4gICAgICAgICAgICAgICAgICBQUl9OVU1CRVI6ICcke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgICAgICAgICBDT01NSVQ6ICcke3sgZ2l0aHViLnNoYSB9fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgICdDT0xPUj1cImdvb2RcIicsXG4gICAgICAgICAgICAgICAgICAnaWYgWyBcIiRTVEFUVVNcIiAhPSBcInN1Y2Nlc3NcIiBdOyB0aGVuJyxcbiAgICAgICAgICAgICAgICAgICcgIENPTE9SPVwiZGFuZ2VyXCInLFxuICAgICAgICAgICAgICAgICAgJ2ZpJyxcbiAgICAgICAgICAgICAgICAgICdNRVNTQUdFPVwiUFIgRGVwbG95OiAkU1RBVFVTXFxcXG5SZXBvOiAkUkVQT1xcXFxuUFI6ICMkUFJfTlVNQkVSXFxcXG5Db21taXQ6ICRDT01NSVRcIicsXG4gICAgICAgICAgICAgICAgICAnaWYgWyAtbiBcIiRXRUJTSVRFX1VSTFwiIF07IHRoZW4nLFxuICAgICAgICAgICAgICAgICAgJyAgTUVTU0FHRT1cIiRNRVNTQUdFXFxcXG7wn4yQIFdlYnNpdGU6IDwkV0VCU0lURV9VUkx8VmlldyBTaXRlPlwiJyxcbiAgICAgICAgICAgICAgICAgICdmaScsXG4gICAgICAgICAgICAgICAgICAnY3VybCAtWCBQT1NUIGh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlIFxcXFwnLFxuICAgICAgICAgICAgICAgICAgJyAgLUggXCJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHt7IHNlY3JldHMuU0xBQ0tfQk9UX1RPS0VOIH19XCIgXFxcXCcsXG4gICAgICAgICAgICAgICAgICAnICAtSCBcXCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXCcgXFxcXCcsXG4gICAgICAgICAgICAgICAgICAnICAtLWRhdGEgXCJ7XFxcXFwiY2hhbm5lbFxcXFxcIjpcXFxcXCIke3sgc2VjcmV0cy5TTEFDS19DSEFOTkVMX0lEIH19XFxcXFwiLFxcXFxcImF0dGFjaG1lbnRzXFxcXFwiOlt7XFxcXFwiY29sb3JcXFxcXCI6XFxcXFwiJENPTE9SXFxcXFwiLFxcXFxcInRleHRcXFxcXCI6XFxcXFwiJE1FU1NBR0VcXFxcXCJ9XX1cIicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
7
7
  const utils_1 = require("./utils");
8
8
  const WorkflowActionVersions_1 = require("./WorkflowActionVersions");
9
9
  class ProductionDeployWorkflow extends projen_1.YamlFile {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.ProductionDeployWorkflow", version: "1.21.3" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.ProductionDeployWorkflow", version: "1.21.5" };
11
11
  constructor(project, options) {
12
12
  const packageManager = project.package.packageManager;
13
13
  const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
@@ -31,7 +31,7 @@ const GITHUB_OWNER = 'macedon-technologies';
31
31
  * workflows that wire them together) is templated.
32
32
  */
33
33
  class SoftwareFactoryFiles {
34
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.21.3" };
34
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.SoftwareFactoryFiles", version: "1.21.5" };
35
35
  constructor(project, options) {
36
36
  const { repoName, actionVersions } = options;
37
37
  const baseBranch = options.baseBranch || 'main';
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
7
7
  const utils_1 = require("./utils");
8
8
  const WorkflowActionVersions_1 = require("./WorkflowActionVersions");
9
9
  class StagingDeployWorkflow extends projen_1.YamlFile {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.21.3" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.21.5" };
11
11
  constructor(project, options) {
12
12
  const packageManager = project.package.packageManager;
13
13
  const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
@@ -24,6 +24,8 @@ class StaticWebsiteConstructFile extends projen_1.SampleFile {
24
24
  super(project, 'src/constructs/StaticWebsite.ts', {
25
25
  contents: `import * as path from 'path';
26
26
  import { createHash } from 'crypto';
27
+ import { execSync } from 'child_process';
28
+ import { cpSync, readFileSync, writeFileSync } from 'fs';
27
29
  import { DockerImage, Duration, RemovalPolicy } from 'aws-cdk-lib';
28
30
  import { RestApi } from 'aws-cdk-lib/aws-apigateway';
29
31
  import { Certificate, CertificateValidation } from 'aws-cdk-lib/aws-certificatemanager';
@@ -205,8 +207,9 @@ export class StaticWebsite extends Construct {
205
207
  }
206
208
 
207
209
  protected createBucketDeployment() {
210
+ const webDir = path.join(__dirname, '../../web');
208
211
  this.bucketDeployment = new BucketDeployment(this, 'BucketDeployment', {
209
- sources: [Source.asset(path.join(__dirname, '../../web'), {
212
+ sources: [Source.asset(webDir, {
210
213
  bundling: {
211
214
  image: DockerImage.fromRegistry('node:24-alpine'),
212
215
  environment: {
@@ -224,6 +227,24 @@ export class StaticWebsite extends Construct {
224
227
  'cp -r dist/* /asset-output/',
225
228
  ].join(' && '),
226
229
  ],
230
+ local: {
231
+ tryBundle: (outputDir: string): boolean => {
232
+ try {
233
+ execSync('${install}', { cwd: webDir, stdio: 'inherit' });
234
+ execSync('${build}', { cwd: webDir, stdio: 'inherit' });
235
+ const configPath = path.join(webDir, 'dist', 'config.json');
236
+ const config = readFileSync(configPath, 'utf-8');
237
+ writeFileSync(
238
+ configPath,
239
+ config.replace(/"apiBaseUrl": "[^"]*"/, \`"apiBaseUrl": "https://\${this.hostname}/api"\`),
240
+ );
241
+ cpSync(path.join(webDir, 'dist'), outputDir, { recursive: true });
242
+ return true;
243
+ } catch {
244
+ return false;
245
+ }
246
+ },
247
+ },
227
248
  },
228
249
  })],
229
250
  destinationBucket: this.bucket,
@@ -238,4 +259,4 @@ export class StaticWebsite extends Construct {
238
259
  }
239
260
  }
240
261
  exports.StaticWebsiteConstructFile = StaticWebsiteConstructFile;
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBRXBDLHNEQUEyRDtBQUUzRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxjQUFrQztJQUMxRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDdkQsS0FBSywrQkFBa0IsQ0FBQyxJQUFJO1lBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUM7UUFDOUY7WUFDRSxPQUFPLEVBQUUsT0FBTyxFQUFFLG1FQUFtRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDO0lBQzFILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSwwQkFBMkIsU0FBUSxtQkFBVTtJQUN4RCxZQUFZLE9BQTRCO1FBQ3RDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFO1lBQ2hELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFvTUMsT0FBTztpQkFDUCxLQUFLOzs7Ozs7Ozs7Ozs7OztDQWNyQjtTQUNJLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFORCxnRUEwTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYW1wbGVGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGluc3RhbGwvYnVpbGQgY29tbWFuZHMgdXNlZCBpbnNpZGUgdGhlIGJ1Y2tldC1kZXBsb3ltZW50IGJ1bmRsaW5nIGNvbnRhaW5lci5cbiAqIFRoZSBjb250YWluZXIgb25seSBoYXMgbm9kZSwgbnBtLCBhbmQgY29yZXBhY2sgYmFrZWQgaW4gKG5vIHByZS1pbnN0YWxsZWQgeWFybi9wbnBtIGJpbmFyaWVzKSxcbiAqIHNvIHlhcm4gYW5kIHBucG0gbXVzdCBiZSBpbnZva2VkIHRocm91Z2ggY29yZXBhY2suXG4gKi9cbmZ1bmN0aW9uIGJ1bmRsaW5nQ29tbWFuZHMocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHsgaW5zdGFsbDogc3RyaW5nOyBidWlsZDogc3RyaW5nIH0ge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ25wbSBjaScsIGJ1aWxkOiAnbnBtIHJ1biBidWlsZCcgfTtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ2NvcmVwYWNrIHBucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZScsIGJ1aWxkOiAnY29yZXBhY2sgcG5wbSBidWlsZCcgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ2NvcmVwYWNrIHlhcm4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWNhY2hlLWZvbGRlciAvdG1wLy55YXJuJywgYnVpbGQ6ICdjb3JlcGFjayB5YXJuIGJ1aWxkJyB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0aWNXZWJzaXRlQ29uc3RydWN0RmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgY29uc3QgeyBpbnN0YWxsLCBidWlsZCB9ID0gYnVuZGxpbmdDb21tYW5kcyhwcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXIpO1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9TdGF0aWNXZWJzaXRlLnRzJywge1xuICAgICAgY29udGVudHM6IGBpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZSwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXN0QXBpIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUsIENlcnRpZmljYXRlVmFsaWRhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0IHtcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBEaXN0cmlidXRpb24sXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBSZXN0QXBpT3JpZ2luLCBTM0J1Y2tldE9yaWdpbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBBUmVjb3JkLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0IHsgQmxvY2tQdWJsaWNBY2Nlc3MsIEJ1Y2tldCwgQnVja2V0QWNjZXNzQ29udHJvbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBTYW5pdGl6ZXMgYW4gYXJiaXRyYXJ5IHN0cmluZyAoZS5nLiBhIGdpdCBicmFuY2ggbmFtZSkgaW50byBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2VcbiAqIGFzIGEgRE5TIGxhYmVsIGFuZCBzaG9ydCBlbm91Z2ggdGhhdCBcXGBcXCR7aG9zdG5hbWV9LlxcJHt6b25lTmFtZX1cXGAgc3RheXMgd2l0aGluIHRoZSA2NFxuICogY2hhcmFjdGVyIGRvbWFpbiBuYW1lIGxpbWl0IGVuZm9yY2VkIGJ5IEFDTSBjZXJ0aWZpY2F0ZXMuXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplSG9zdG5hbWUocmF3SG9zdG5hbWU6IHN0cmluZywgem9uZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSByYXdIb3N0bmFtZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05LV0rL2csICctJylcbiAgICAucmVwbGFjZSgvLXsyLH0vZywgJy0nKVxuICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAnaG9zdCc7XG5cbiAgY29uc3QgbWF4TGVuZ3RoID0gNjMgLSB6b25lTmFtZS5sZW5ndGg7XG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocmF3SG9zdG5hbWUpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgOCk7XG4gIGNvbnN0IHByZWZpeExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCAtIGhhc2gubGVuZ3RoIC0gMSwgMCk7XG4gIGNvbnN0IHByZWZpeCA9IG5vcm1hbGl6ZWQuc2xpY2UoMCwgcHJlZml4TGVuZ3RoKS5yZXBsYWNlKC8tKyQvLCAnJyk7XG4gIHJldHVybiBwcmVmaXggPyBcXGBcXCR7cHJlZml4fS1cXCR7aGFzaH1cXGAgOiBoYXNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY1dlYnNpdGVQcm9wcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICByZWFkb25seSBhcGk6IFJlc3RBcGk7XG4gIHJlYWRvbmx5IGhvc3RuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhdGljV2Vic2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBidWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlO1xuXG4gIHByaXZhdGUgYXBpQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuICBwcml2YXRlIGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHByaXZhdGUgYnVja2V0RGVwbG95bWVudDogQnVja2V0RGVwbG95bWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJpdmF0ZSBwcm9wczogU3RhdGljV2Vic2l0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBwcm9wcy5ob3N0ZWRab25lLnpvbmVOYW1lO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gc2FuaXRpemVIb3N0bmFtZShwcm9wcy5ob3N0bmFtZSB8fCAnbXZwJywgZG9tYWluTmFtZSk7XG4gICAgdGhpcy5ob3N0bmFtZSA9IFxcYFxcJHtob3N0bmFtZX0uXFwke2RvbWFpbk5hbWV9XFxgO1xuXG4gICAgdGhpcy5jcmVhdGVDZXJ0aWZpY2F0ZSgpO1xuICAgIGlmICghdGhpcy5jZXJ0aWZpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVCdWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuYnVja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYnVja2V0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVBcGlDYWNoZVBvbGljeSgpO1xuICAgIGlmICghdGhpcy5hcGlDYWNoZVBvbGljeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIEFQSSBjYWNoZSBwb2xpY3knKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbigpO1xuICAgIGlmICghdGhpcy5kaXN0cmlidXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBkaXN0cmlidXRpb24nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZURuc1JlY29yZCgpO1xuICAgIGlmICghdGhpcy5hUmVjb3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgRE5TIEEgcmVjb3JkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRCdWNrZXRQb2xpY3koKTtcbiAgICB0aGlzLmNyZWF0ZUJ1Y2tldERlcGxveW1lbnQoKTtcbiAgICBpZiAoIXRoaXMuYnVja2V0RGVwbG95bWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGJ1Y2tldCBkZXBsb3ltZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNlcnRpZmljYXRlKCkge1xuICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgQ2VydGlmaWNhdGUodGhpcywgJ0NlcnRpZmljYXRlJywge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5ob3N0bmFtZSxcbiAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMucHJvcHMuaG9zdGVkWm9uZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlQnVja2V0KCkge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCAnQnVja2V0Jywge1xuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIGFjY2Vzc0NvbnRyb2w6IEJ1Y2tldEFjY2Vzc0NvbnRyb2wuUFJJVkFURSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUFwaUNhY2hlUG9saWN5KCkge1xuICAgIHRoaXMuYXBpQ2FjaGVQb2xpY3kgPSBuZXcgQ2FjaGVQb2xpY3kodGhpcywgJ0FwaUNhY2hlUG9saWN5Jywge1xuICAgICAgY29tbWVudDogJ0NhY2hlIHBvbGljeSBmb3IgQVBJIEdhdGV3YXkgd2l0aCBkeW5hbWljIGNvbnRlbnQnLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KCdBdXRob3JpemF0aW9uJyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRGlzdHJpYnV0aW9uKCkge1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCAnRGlzdHJpYnV0aW9uJywge1xuICAgICAgZG9tYWluTmFtZXM6IFt0aGlzLmhvc3RuYW1lXSxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLmNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5idWNrZXQpLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczoge1xuICAgICAgICAnL2FwaS8qJzoge1xuICAgICAgICAgIG9yaWdpbjogbmV3IFJlc3RBcGlPcmlnaW4odGhpcy5wcm9wcy5hcGkpLFxuICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwaUNhY2hlUG9saWN5LFxuXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVmYXVsdFJvb3RPYmplY3Q6ICdpbmRleC5odG1sJyxcbiAgICAgIGVycm9yUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBodHRwU3RhdHVzOiA0MDQsXG4gICAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogJy9pbmRleC5odG1sJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGh0dHBTdGF0dXM6IDQwMyxcbiAgICAgICAgICByZXNwb25zZVBhZ2VQYXRoOiAnL2luZGV4Lmh0bWwnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVEbnNSZWNvcmQoKSB7XG4gICAgdGhpcy5hUmVjb3JkID0gbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmQnLCB7XG4gICAgICB6b25lOiB0aGlzLnByb3BzLmhvc3RlZFpvbmUsXG4gICAgICByZWNvcmROYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkQnVja2V0UG9saWN5KCkge1xuICAgIHRoaXMuYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiAnQWxsb3dDbG91ZEZyb250U2VydmljZVByaW5jaXBhbCcsXG4gICAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICAgIHJlc291cmNlczogW1xcYFxcJHt0aGlzLmJ1Y2tldC5idWNrZXRBcm59LypcXGBdLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ0FXUzpTb3VyY2VBcm4nOiBcXGBhcm46YXdzOmNsb3VkZnJvbnQ6OlxcJHt0aGlzLmJ1Y2tldC5zdGFjay5hY2NvdW50fTpkaXN0cmlidXRpb24vXFwke3RoaXMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkfVxcYCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVCdWNrZXREZXBsb3ltZW50KCkge1xuICAgIHRoaXMuYnVja2V0RGVwbG95bWVudCA9IG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsICdCdWNrZXREZXBsb3ltZW50Jywge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vd2ViJyksIHtcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBpbWFnZTogRG9ja2VySW1hZ2UuZnJvbVJlZ2lzdHJ5KCdub2RlOjI0LWFscGluZScpLFxuICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICBucG1fY29uZmlnX2NhY2hlOiAnL3RtcC8ubnBtJyxcbiAgICAgICAgICAgIEhPTUU6ICcvdG1wJyxcbiAgICAgICAgICAgIENJOiAndHJ1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBbXG4gICAgICAgICAgICAnc2gnLFxuICAgICAgICAgICAgJy1jJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJyR7aW5zdGFsbH0nLFxuICAgICAgICAgICAgICAnJHtidWlsZH0nLFxuICAgICAgICAgICAgICBcXGBzZWQgLWkgJ3N8XCJhcGlCYXNlVXJsXCI6IFwiW15cIl0qXCJ8XCJhcGlCYXNlVXJsXCI6IFwiaHR0cHM6Ly9cXCR7dGhpcy5ob3N0bmFtZX0vYXBpXCJ8ZycgZGlzdC9jb25maWcuanNvblxcYCxcbiAgICAgICAgICAgICAgJ2NwIC1yIGRpc3QvKiAvYXNzZXQtb3V0cHV0LycsXG4gICAgICAgICAgICBdLmpvaW4oJyAmJiAnKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSldLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgZGlzdHJpYnV0aW9uOiB0aGlzLmRpc3RyaWJ1dGlvbixcbiAgICAgIGRpc3RyaWJ1dGlvblBhdGhzOiBbJy8qJ10sXG4gICAgICBtZW1vcnlMaW1pdDogMjU2XG4gICAgfSk7XG4gIH1cbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3RhdGljV2Vic2l0ZUNvbnN0cnVjdEZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBRXBDLHNEQUEyRDtBQUUzRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxjQUFrQztJQUMxRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDdkQsS0FBSywrQkFBa0IsQ0FBQyxJQUFJO1lBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUM7UUFDOUY7WUFDRSxPQUFPLEVBQUUsT0FBTyxFQUFFLG1FQUFtRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxDQUFDO0lBQzFILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSwwQkFBMkIsU0FBUSxtQkFBVTtJQUN4RCxZQUFZLE9BQTRCO1FBQ3RDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RSxLQUFLLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFO1lBQ2hELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkF1TUMsT0FBTztpQkFDUCxLQUFLOzs7Ozs7Ozs0QkFRTSxPQUFPOzRCQUNQLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUJoQztTQUNJLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9PRCxnRUErT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYW1wbGVGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGluc3RhbGwvYnVpbGQgY29tbWFuZHMgdXNlZCBpbnNpZGUgdGhlIGJ1Y2tldC1kZXBsb3ltZW50IGJ1bmRsaW5nIGNvbnRhaW5lci5cbiAqIFRoZSBjb250YWluZXIgb25seSBoYXMgbm9kZSwgbnBtLCBhbmQgY29yZXBhY2sgYmFrZWQgaW4gKG5vIHByZS1pbnN0YWxsZWQgeWFybi9wbnBtIGJpbmFyaWVzKSxcbiAqIHNvIHlhcm4gYW5kIHBucG0gbXVzdCBiZSBpbnZva2VkIHRocm91Z2ggY29yZXBhY2suXG4gKi9cbmZ1bmN0aW9uIGJ1bmRsaW5nQ29tbWFuZHMocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHsgaW5zdGFsbDogc3RyaW5nOyBidWlsZDogc3RyaW5nIH0ge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ25wbSBjaScsIGJ1aWxkOiAnbnBtIHJ1biBidWlsZCcgfTtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ2NvcmVwYWNrIHBucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZScsIGJ1aWxkOiAnY29yZXBhY2sgcG5wbSBidWlsZCcgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgaW5zdGFsbDogJ2NvcmVwYWNrIHlhcm4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWNhY2hlLWZvbGRlciAvdG1wLy55YXJuJywgYnVpbGQ6ICdjb3JlcGFjayB5YXJuIGJ1aWxkJyB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0aWNXZWJzaXRlQ29uc3RydWN0RmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgY29uc3QgeyBpbnN0YWxsLCBidWlsZCB9ID0gYnVuZGxpbmdDb21tYW5kcyhwcm9qZWN0LnBhY2thZ2UucGFja2FnZU1hbmFnZXIpO1xuICAgIHN1cGVyKHByb2plY3QsICdzcmMvY29uc3RydWN0cy9TdGF0aWNXZWJzaXRlLnRzJywge1xuICAgICAgY29udGVudHM6IGBpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3BTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZSwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXN0QXBpIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUsIENlcnRpZmljYXRlVmFsaWRhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0IHtcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBEaXN0cmlidXRpb24sXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBSZXN0QXBpT3JpZ2luLCBTM0J1Y2tldE9yaWdpbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBBUmVjb3JkLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0IHsgQmxvY2tQdWJsaWNBY2Nlc3MsIEJ1Y2tldCwgQnVja2V0QWNjZXNzQ29udHJvbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBTYW5pdGl6ZXMgYW4gYXJiaXRyYXJ5IHN0cmluZyAoZS5nLiBhIGdpdCBicmFuY2ggbmFtZSkgaW50byBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2VcbiAqIGFzIGEgRE5TIGxhYmVsIGFuZCBzaG9ydCBlbm91Z2ggdGhhdCBcXGBcXCR7aG9zdG5hbWV9LlxcJHt6b25lTmFtZX1cXGAgc3RheXMgd2l0aGluIHRoZSA2NFxuICogY2hhcmFjdGVyIGRvbWFpbiBuYW1lIGxpbWl0IGVuZm9yY2VkIGJ5IEFDTSBjZXJ0aWZpY2F0ZXMuXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplSG9zdG5hbWUocmF3SG9zdG5hbWU6IHN0cmluZywgem9uZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSByYXdIb3N0bmFtZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05LV0rL2csICctJylcbiAgICAucmVwbGFjZSgvLXsyLH0vZywgJy0nKVxuICAgIC5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAnaG9zdCc7XG5cbiAgY29uc3QgbWF4TGVuZ3RoID0gNjMgLSB6b25lTmFtZS5sZW5ndGg7XG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocmF3SG9zdG5hbWUpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgOCk7XG4gIGNvbnN0IHByZWZpeExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCAtIGhhc2gubGVuZ3RoIC0gMSwgMCk7XG4gIGNvbnN0IHByZWZpeCA9IG5vcm1hbGl6ZWQuc2xpY2UoMCwgcHJlZml4TGVuZ3RoKS5yZXBsYWNlKC8tKyQvLCAnJyk7XG4gIHJldHVybiBwcmVmaXggPyBcXGBcXCR7cHJlZml4fS1cXCR7aGFzaH1cXGAgOiBoYXNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY1dlYnNpdGVQcm9wcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICByZWFkb25seSBhcGk6IFJlc3RBcGk7XG4gIHJlYWRvbmx5IGhvc3RuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhdGljV2Vic2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBidWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICBwdWJsaWMgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlO1xuXG4gIHByaXZhdGUgYXBpQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuICBwcml2YXRlIGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHByaXZhdGUgYnVja2V0RGVwbG95bWVudDogQnVja2V0RGVwbG95bWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGhvc3RuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJpdmF0ZSBwcm9wczogU3RhdGljV2Vic2l0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBwcm9wcy5ob3N0ZWRab25lLnpvbmVOYW1lO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gc2FuaXRpemVIb3N0bmFtZShwcm9wcy5ob3N0bmFtZSB8fCAnbXZwJywgZG9tYWluTmFtZSk7XG4gICAgdGhpcy5ob3N0bmFtZSA9IFxcYFxcJHtob3N0bmFtZX0uXFwke2RvbWFpbk5hbWV9XFxgO1xuXG4gICAgdGhpcy5jcmVhdGVDZXJ0aWZpY2F0ZSgpO1xuICAgIGlmICghdGhpcy5jZXJ0aWZpY2F0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVCdWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuYnVja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYnVja2V0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVBcGlDYWNoZVBvbGljeSgpO1xuICAgIGlmICghdGhpcy5hcGlDYWNoZVBvbGljeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIEFQSSBjYWNoZSBwb2xpY3knKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbigpO1xuICAgIGlmICghdGhpcy5kaXN0cmlidXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBkaXN0cmlidXRpb24nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZURuc1JlY29yZCgpO1xuICAgIGlmICghdGhpcy5hUmVjb3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgRE5TIEEgcmVjb3JkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRCdWNrZXRQb2xpY3koKTtcbiAgICB0aGlzLmNyZWF0ZUJ1Y2tldERlcGxveW1lbnQoKTtcbiAgICBpZiAoIXRoaXMuYnVja2V0RGVwbG95bWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGJ1Y2tldCBkZXBsb3ltZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNlcnRpZmljYXRlKCkge1xuICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgQ2VydGlmaWNhdGUodGhpcywgJ0NlcnRpZmljYXRlJywge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5ob3N0bmFtZSxcbiAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMucHJvcHMuaG9zdGVkWm9uZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlQnVja2V0KCkge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCAnQnVja2V0Jywge1xuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIGFjY2Vzc0NvbnRyb2w6IEJ1Y2tldEFjY2Vzc0NvbnRyb2wuUFJJVkFURSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUFwaUNhY2hlUG9saWN5KCkge1xuICAgIHRoaXMuYXBpQ2FjaGVQb2xpY3kgPSBuZXcgQ2FjaGVQb2xpY3kodGhpcywgJ0FwaUNhY2hlUG9saWN5Jywge1xuICAgICAgY29tbWVudDogJ0NhY2hlIHBvbGljeSBmb3IgQVBJIEdhdGV3YXkgd2l0aCBkeW5hbWljIGNvbnRlbnQnLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygxKSxcbiAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KCdBdXRob3JpemF0aW9uJyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRGlzdHJpYnV0aW9uKCkge1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCAnRGlzdHJpYnV0aW9uJywge1xuICAgICAgZG9tYWluTmFtZXM6IFt0aGlzLmhvc3RuYW1lXSxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLmNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wodGhpcy5idWNrZXQpLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczoge1xuICAgICAgICAnL2FwaS8qJzoge1xuICAgICAgICAgIG9yaWdpbjogbmV3IFJlc3RBcGlPcmlnaW4odGhpcy5wcm9wcy5hcGkpLFxuICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICAgIGNhY2hlUG9saWN5OiB0aGlzLmFwaUNhY2hlUG9saWN5LFxuXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVmYXVsdFJvb3RPYmplY3Q6ICdpbmRleC5odG1sJyxcbiAgICAgIGVycm9yUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBodHRwU3RhdHVzOiA0MDQsXG4gICAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogJy9pbmRleC5odG1sJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGh0dHBTdGF0dXM6IDQwMyxcbiAgICAgICAgICByZXNwb25zZVBhZ2VQYXRoOiAnL2luZGV4Lmh0bWwnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVEbnNSZWNvcmQoKSB7XG4gICAgdGhpcy5hUmVjb3JkID0gbmV3IEFSZWNvcmQodGhpcywgJ0FSZWNvcmQnLCB7XG4gICAgICB6b25lOiB0aGlzLnByb3BzLmhvc3RlZFpvbmUsXG4gICAgICByZWNvcmROYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkQnVja2V0UG9saWN5KCkge1xuICAgIHRoaXMuYnVja2V0LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiAnQWxsb3dDbG91ZEZyb250U2VydmljZVByaW5jaXBhbCcsXG4gICAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICAgIHJlc291cmNlczogW1xcYFxcJHt0aGlzLmJ1Y2tldC5idWNrZXRBcm59LypcXGBdLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ0FXUzpTb3VyY2VBcm4nOiBcXGBhcm46YXdzOmNsb3VkZnJvbnQ6OlxcJHt0aGlzLmJ1Y2tldC5zdGFjay5hY2NvdW50fTpkaXN0cmlidXRpb24vXFwke3RoaXMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkfVxcYCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVCdWNrZXREZXBsb3ltZW50KCkge1xuICAgIGNvbnN0IHdlYkRpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi93ZWInKTtcbiAgICB0aGlzLmJ1Y2tldERlcGxveW1lbnQgPSBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCAnQnVja2V0RGVwbG95bWVudCcsIHtcbiAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQod2ViRGlyLCB7XG4gICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgaW1hZ2U6IERvY2tlckltYWdlLmZyb21SZWdpc3RyeSgnbm9kZToyNC1hbHBpbmUnKSxcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgbnBtX2NvbmZpZ19jYWNoZTogJy90bXAvLm5wbScsXG4gICAgICAgICAgICBIT01FOiAnL3RtcCcsXG4gICAgICAgICAgICBDSTogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ3NoJyxcbiAgICAgICAgICAgICctYycsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICcke2luc3RhbGx9JyxcbiAgICAgICAgICAgICAgJyR7YnVpbGR9JyxcbiAgICAgICAgICAgICAgXFxgc2VkIC1pICdzfFwiYXBpQmFzZVVybFwiOiBcIlteXCJdKlwifFwiYXBpQmFzZVVybFwiOiBcImh0dHBzOi8vXFwke3RoaXMuaG9zdG5hbWV9L2FwaVwifGcnIGRpc3QvY29uZmlnLmpzb25cXGAsXG4gICAgICAgICAgICAgICdjcCAtciBkaXN0LyogL2Fzc2V0LW91dHB1dC8nLFxuICAgICAgICAgICAgXS5qb2luKCcgJiYgJyksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgdHJ5QnVuZGxlOiAob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleGVjU3luYygnJHtpbnN0YWxsfScsIHsgY3dkOiB3ZWJEaXIsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgICAgICAgICAgZXhlY1N5bmMoJyR7YnVpbGR9JywgeyBjd2Q6IHdlYkRpciwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHdlYkRpciwgJ2Rpc3QnLCAnY29uZmlnLmpzb24nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgIGNvbmZpZ1BhdGgsXG4gICAgICAgICAgICAgICAgICBjb25maWcucmVwbGFjZSgvXCJhcGlCYXNlVXJsXCI6IFwiW15cIl0qXCIvLCBcXGBcImFwaUJhc2VVcmxcIjogXCJodHRwczovL1xcJHt0aGlzLmhvc3RuYW1lfS9hcGlcIlxcYCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjcFN5bmMocGF0aC5qb2luKHdlYkRpciwgJ2Rpc3QnKSwgb3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLFxuICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IFsnLyonXSxcbiAgICAgIG1lbW9yeUxpbWl0OiAyNTZcbiAgICB9KTtcbiAgfVxufVxuYCxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -39,7 +39,7 @@ const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
40
  const projen_1 = require("projen");
41
41
  class WorkflowAutoDiscover extends projen_1.Component {
42
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.21.3" };
42
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.21.5" };
43
43
  constructor(project) {
44
44
  super(project);
45
45
  }
@@ -0,0 +1,2 @@
1
+ schema: spec-driven
2
+ created: 2026-09-09
@@ -0,0 +1,47 @@
1
+ ## Context
2
+
3
+ `PrDeployWorkflow` (`.github/workflows/pr-deploy.yml`) and `PrCleanupWorkflow` (`.github/workflows/pr-cleanup.yml`) are two independent `YamlFile` constructs, each hand-authored as a literal `obj:` in `projen/src/PrDeployWorkflow.ts` and `projen/src/PrCleanupWorkflow.ts`. Both are instantiated together in every Batman app via `Application.ts`. `pr-deploy` runs on `pull_request: [opened, synchronize, reopened]` and deploys the PR's stack (`cdk deploy`); `pr-cleanup` runs on `pull_request: [closed]` and tears the same stack down (`aws cloudformation delete-stack` + wait). Neither declares a `concurrency` block, so GitHub Actions runs them in parallel with no ordering guarantee. Issue #87 documents a concrete incident: a PR was closed while its 59-resource stack was still creating, `pr-cleanup`'s delete raced the in-flight create, and the stack ended up `DELETE_FAILED` with an orphaned bucket.
4
+
5
+ `ProjenWorkflowHardening.ts` establishes the precedent for this class of fix: workflows projen generates on its own get patched externally via `JsonPatch`, but hand-authored workflows like these two are edited directly in their source `obj:` literal. This change follows that same convention.
6
+
7
+ ## Goals / Non-Goals
8
+
9
+ **Goals:**
10
+ - Guarantee `pr-deploy` and `pr-cleanup` never execute concurrently against the same PR's stack.
11
+ - Prefer queuing over cancellation: a run that has to wait should wait, not get killed mid-`cdk deploy`/mid-delete, since a cancelled deploy can leave CloudFormation in `UPDATE_IN_PROGRESS` and break the next run.
12
+ - Keep the group key identical between the two workflows so they queue against each other, not just against themselves.
13
+
14
+ **Non-Goals:**
15
+ - Recovering a stack already stuck in `DELETE_FAILED`/`ROLLBACK_COMPLETE` (issue #87's "Fix 2"). That requires a separate spike to pick between reaper-style detection-and-repair and `--no-rollback` on PR-stack deploys, and is tracked as follow-up work, not this change.
16
+ - Changing what `pr-deploy`/`pr-cleanup` each do once it's their turn to run — this change only affects *when* they're allowed to start.
17
+ - Deduplicating/redesigning the two workflows' trigger conditions or stack-naming logic (companion issue #88).
18
+
19
+ ## Decisions
20
+
21
+ **Concurrency group key: `pr-stack-${{ github.event.pull_request.number }}`, identical in both workflows.**
22
+ The PR number is the natural join key — it's the one thing both workflows compute their stack identity from (via the PR's branch name), and it's available on the `pull_request` event both workflows already trigger on. A key scoped to the workflow name (GitHub's default when `concurrency.group` is omitted) would only serialize `pr-deploy` runs against each other and `pr-cleanup` runs against each other — it would *not* prevent the race between the two workflows, which is the actual bug. The group must be textually identical in both files for GitHub to treat them as the same queue.
23
+
24
+ **`cancel-in-progress: false` in both workflows.**
25
+ Alternative considered: `cancel-in-progress: true`, which is the more common concurrency-group pattern (e.g. superseding stale CI runs on new pushes). Rejected here because cancelling a `pr-deploy` run mid-`cdk deploy` leaves CloudFormation in `UPDATE_IN_PROGRESS`/`CREATE_IN_PROGRESS`, which fails the *next* deploy attempt against that stack — trading one class of race for another. Queuing (`false`) means a `pr-cleanup` triggered while `pr-deploy` is running simply waits for it to finish, then deletes the now-complete stack; a `pr-deploy` triggered while a prior `pr-deploy` is still running (e.g. rapid pushes) waits its turn instead of double-deploying.
26
+
27
+ **Edit the two `YamlFile` `obj:` literals directly, not a shared external patch.**
28
+ Alternative considered: a `ProjenWorkflowHardening`-style helper that patches `concurrency` onto both workflows post-construction. Rejected because both workflows are already hand-authored in this package (unlike the projen-builtin workflows `ProjenWorkflowHardening` targets), so there's no `JsonPatch`-vs-source-edit tension to resolve — adding a two-line `concurrency` key next to each `obj:`'s existing `name`/`on`/`permissions` keys is simpler and keeps the workflow's full shape in one place.
29
+
30
+ ## Risks / Trade-offs
31
+
32
+ - [A PR merge/close event and a fast-follow `pr-deploy` push (e.g. re-opening) could still queue for a while if a prior run is slow] → Acceptable: queuing bounds this to "wait", never "corrupt state"; GitHub Actions queue depth for a single PR is small in practice.
33
+ - [Non-`pull_request`-number contexts, if a workflow is ever re-triggered via `workflow_dispatch` or similar, would evaluate `github.event.pull_request.number` as empty and could collide group keys across PRs] → Out of scope: both workflows currently only trigger on `pull_request` events, so this doesn't apply today; flag it if either workflow's `on:` trigger ever expands.
34
+ - [This change doesn't fix `DELETE_FAILED` stacks that already exist from prior races] → Those are cleaned up manually per issue #87; this change only prevents new occurrences.
35
+
36
+ ## Migration Plan
37
+
38
+ 1. Add `concurrency` to `PrDeployWorkflow`'s and `PrCleanupWorkflow`'s generated `obj:`.
39
+ 2. Add/update unit tests asserting both workflows render the same `concurrency.group` string.
40
+ 3. Run `npx projen` in this package to confirm no other synthesized output changes unexpectedly.
41
+ 4. Downstream consumers (e.g. `exman`) pick up the fix the next time they bump this package version and re-run projen synth, regenerating `.github/workflows/pr-deploy.yml` / `pr-cleanup.yml` with the new `concurrency` block. No manual migration step needed beyond the normal dependency bump.
42
+
43
+ No rollback concerns: removing the `concurrency` block is a pure revert with no state to unwind.
44
+
45
+ ## Open Questions
46
+
47
+ None — issue #87's own investigation already resolved the "queue vs. cancel" question (`cancel-in-progress: false`) and identified the exact group key needed.
@@ -0,0 +1,27 @@
1
+ ## Why
2
+
3
+ `PrDeployWorkflow` and `PrCleanupWorkflow` generate independent GitHub Actions workflows that both operate on the same CloudFormation stack (`pr-deploy` creates/updates it, `pr-cleanup` deletes it) but declare no `concurrency` block. When a PR is closed while its deploy is still in flight, `pr-cleanup` issues `aws cloudformation delete-stack` against a stack that is mid-`CREATE_IN_PROGRESS`. On 2026-09-03 this raced a 59-resource stack, cancelled the create, failed the rollback, and left the stack `DELETE_FAILED` with an orphaned S3 bucket requiring manual cleanup (see issue #87). This affects every generated Batman app, and 2 of 12 `pr-cleanup` runs failed that same day, consistent with this being a recurring class of failure rather than a one-off.
4
+
5
+ ## What Changes
6
+
7
+ - Add a `concurrency` block to `PrDeployWorkflow`'s generated `pr-deploy.yml`, keyed on the PR number.
8
+ - Add the identical `concurrency` block to `PrCleanupWorkflow`'s generated `pr-cleanup.yml`, keyed on the same PR-number-derived group name.
9
+ - Use `cancel-in-progress: false` on both so a queued run waits for the in-flight run to finish rather than being cancelled mid-`cdk deploy` (which would abandon CloudFormation in `UPDATE_IN_PROGRESS` and break the next deploy).
10
+ - Regenerate/synth downstream projects (e.g. `exman`) so the emitted workflow YAML picks up the new `concurrency` block.
11
+
12
+ Out of scope: the `DELETE_FAILED`/orphaned-bucket recovery path described as "Fix 2" in issue #87 (detecting and repairing `DELETE_FAILED`/`ROLLBACK_COMPLETE` stacks, or `--no-rollback` for PR-stack deploys). The issue itself notes neither option is settled yet and calls for a separate spike; queuing via `concurrency` prevents the race that causes `DELETE_FAILED` in the first place, so it is not required to close this change.
13
+
14
+ ## Capabilities
15
+
16
+ ### New Capabilities
17
+ - `pr-workflow-concurrency`: Generated `pr-deploy.yml` and `pr-cleanup.yml` workflows share a concurrency group so that a stack delete triggered by closing a PR is queued behind, rather than raced against, an in-flight deploy of the same stack.
18
+
19
+ ### Modified Capabilities
20
+ (none — no existing specs cover PR deploy/cleanup workflow generation)
21
+
22
+ ## Impact
23
+
24
+ - `projen/src/PrDeployWorkflow.ts` — add `concurrency` to the generated workflow object.
25
+ - `projen/src/PrCleanupWorkflow.ts` — add matching `concurrency` to the generated workflow object.
26
+ - `projen/src/BatmanProject.test.ts` (or equivalent) — add coverage asserting both workflows emit the same concurrency group.
27
+ - Any downstream project generated from these projen constructs (e.g. `exman`) needs to re-run projen synth to regenerate `.github/workflows/pr-deploy.yml` and `.github/workflows/pr-cleanup.yml` with the fix.
@@ -0,0 +1,23 @@
1
+ ## ADDED Requirements
2
+
3
+ ### Requirement: Shared concurrency group across PR deploy and cleanup workflows
4
+ The generated `pr-deploy.yml` and `pr-cleanup.yml` workflows SHALL each declare a top-level `concurrency.group` keyed on the pull request number (`pr-stack-${{ github.event.pull_request.number }}`), and the group value SHALL be identical text in both files, so that GitHub Actions serializes runs of the two workflows against the same PR into a single queue.
5
+
6
+ #### Scenario: pr-cleanup triggered while pr-deploy is still running
7
+ - **WHEN** a PR is closed while its `pr-deploy` run for that same PR is still in progress
8
+ - **THEN** the `pr-cleanup` run for that PR does not start until the in-progress `pr-deploy` run for that PR finishes
9
+
10
+ #### Scenario: Concurrent pr-deploy runs on the same PR
11
+ - **WHEN** two `pr-deploy` runs are triggered for the same PR in close succession (e.g. rapid pushes)
12
+ - **THEN** the second run queues behind the first rather than executing `cdk deploy` concurrently against the same stack
13
+
14
+ #### Scenario: Group keys match between workflows
15
+ - **WHEN** the generated `pr-deploy.yml` and `pr-cleanup.yml` are compared for a given PR event
16
+ - **THEN** their `concurrency.group` values evaluate to the same string, so GitHub Actions treats them as the same queue
17
+
18
+ ### Requirement: Queue instead of cancel in-flight runs
19
+ Both `pr-deploy.yml` and `pr-cleanup.yml` SHALL set `concurrency.cancel-in-progress: false`, so that a queued run waits for the currently running workflow to finish instead of being cancelled mid-execution.
20
+
21
+ #### Scenario: Queued run does not cancel an in-flight deploy
22
+ - **WHEN** `pr-cleanup` is queued behind a running `pr-deploy` for the same PR
23
+ - **THEN** the running `pr-deploy` job is allowed to run to completion (success or failure) rather than being cancelled by GitHub Actions
@@ -0,0 +1,15 @@
1
+ ## 1. Add concurrency block to generated workflows
2
+
3
+ - [x] 1.1 In `src/PrDeployWorkflow.ts`, add `concurrency: { group: 'pr-stack-${{ github.event.pull_request.number }}', 'cancel-in-progress': false }` to the generated `obj:` (alongside `name`, `on`, `permissions`).
4
+ - [x] 1.2 In `src/PrCleanupWorkflow.ts`, add the identical `concurrency` block to its generated `obj:`.
5
+
6
+ ## 2. Test coverage
7
+
8
+ - [x] 2.1 In `test/DeployWorkflows.test.ts`, add a test (or extend an existing one) asserting `pr-deploy.yml` and `pr-cleanup.yml` both render `concurrency.group: pr-stack-${{ github.event.pull_request.number }}` and `concurrency.cancel-in-progress: false`.
9
+ - [x] 2.2 Add an assertion that the two workflows' `concurrency.group` values are textually identical, so the test fails if they ever drift apart.
10
+ - [x] 2.3 Update `test/__snapshots__/DeployWorkflows.test.ts.snap` (and any other snapshots covering `pr-deploy.yml`/`pr-cleanup.yml`, e.g. `BatmanProject.test.ts.snap`, `BootcampProject.test.ts.snap`) by running the test suite with snapshot update, then review the diff for correctness before committing.
11
+
12
+ ## 3. Verify
13
+
14
+ - [x] 3.1 Run the full `projen`/build test suite and confirm it passes with the updated snapshots.
15
+ - [x] 3.2 Run `npx projen` in this package to confirm no unrelated synthesized output changes.
package/package.json CHANGED
@@ -49,7 +49,7 @@
49
49
  "main": "lib/index.js",
50
50
  "license": "Apache-2.0",
51
51
  "stability": "stable",
52
- "version": "1.21.3",
52
+ "version": "1.21.5",
53
53
  "jest": {
54
54
  "coverageProvider": "v8",
55
55
  "testMatch": [