raindancers-network
Version:
Extensions to the ec2.Vpc Constructs
212 lines • 24.9 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Crawler = exports.UpdateBehavior = exports.DeleteBehavior = exports.RecrawlBehavior = exports.CrawlerLineageSettings = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs = require("constructs");
var CrawlerLineageSettings;
(function (CrawlerLineageSettings) {
CrawlerLineageSettings["ENABLE"] = "ENABLE";
CrawlerLineageSettings["DISABLE"] = "DISABLE";
})(CrawlerLineageSettings = exports.CrawlerLineageSettings || (exports.CrawlerLineageSettings = {}));
var RecrawlBehavior;
(function (RecrawlBehavior) {
RecrawlBehavior["CRAWL_EVERYTHING"] = "CRAWL_EVERTHING";
RecrawlBehavior["CRAWL_NEW_FOLDERS_ONLY"] = "CRAWL_NEW_FOLDERS_ONLY";
RecrawlBehavior["CRAWL_EVENT_MODE"] = "CRAWL_EVENT_MODE";
})(RecrawlBehavior = exports.RecrawlBehavior || (exports.RecrawlBehavior = {}));
var DeleteBehavior;
(function (DeleteBehavior) {
DeleteBehavior["LOG"] = "LOG";
DeleteBehavior["DELETE_FROM_DATABASE"] = "DELETE_FROM_DATABASE";
DeleteBehavior["DEPRECATE_IN_DATABASE"] = "DEPRECATE_IN_DATABASE";
})(DeleteBehavior = exports.DeleteBehavior || (exports.DeleteBehavior = {}));
var UpdateBehavior;
(function (UpdateBehavior) {
UpdateBehavior["LOG"] = "LOG";
UpdateBehavior["UPDATE_IN_DATABASE"] = "UPDATE_IN_DATABASE";
})(UpdateBehavior = exports.UpdateBehavior || (exports.UpdateBehavior = {}));
//https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Glue.html#createCrawler-property
class Crawler extends constructs.Construct {
constructor(scope, id, props) {
super(scope, id);
// validate that only one of s3Targets has been set. Could not use Type, as this was jsii incompatiable.
// so this has to be run time check 🔥
if (props.s3Targets && props.jdbcTargets) {
throw new Error('Can not have both S3Targets and JdbcTargets');
}
if (props.s3Targets === undefined && props.jdbcTargets === undefined) {
throw new Error('Must have at least one target type');
}
const targets = {};
if (props.s3Targets) {
const s3targets = [];
props.s3Targets.forEach((target) => {
s3targets.push(target.target);
});
targets.S3Targets = s3targets;
}
if (props.jdbcTargets) {
const jdbcTargets = [];
props.jdbcTargets.forEach((target) => {
jdbcTargets.push(target.target);
});
targets.JdbcTargets = jdbcTargets;
}
console.log(targets);
// these are the mandatory paramters
this.parameters = {
Name: props.name,
Role: props.role.roleArn,
Targets: pascalCaseKeys(targets),
DatabaseName: props.databaseName,
};
console.log('------');
console.log(this.parameters);
// targets keys, need to have their first character Capitalized.
if (props.description) {
this.parameters.Description = props.description;
}
new aws_cdk_lib_1.custom_resources.AwsCustomResource(this, 'Crawler', {
resourceType: 'Custom::Crawler',
onCreate: {
service: 'Glue',
action: 'createCrawler',
parameters: this.parameters,
physicalResourceId: aws_cdk_lib_1.custom_resources.PhysicalResourceId.of(`Crawler${props.name}`),
},
onUpdate: {
service: 'Glue',
action: 'updateCrawler',
parameters: this.parameters,
},
onDelete: {
service: 'Glue',
action: 'deleteCrawler',
parameters: {
Name: props.name,
},
},
policy: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.fromStatements([
new aws_cdk_lib_1.aws_iam.PolicyStatement({
actions: [
'glue:CreateCrawler',
'glue:UpdateCrawler',
'glue:DeleteCrawler',
'iam:PassRole',
],
resources: ['*'],
}),
]),
});
}
/**
* This will add classifers to the crawler.
* @param props addClassifierProps
*/
addClassifiers(props) {
var classiferNames = [];
props.classifiers.forEach((classifier) => {
classiferNames.push(classifier.name);
});
this.parameters.Classifiers = classiferNames;
}
/**
* Use the crawler with lakeFormation Permissions.
* @param props LakeFormationConfiguration
* @returns void
*
*/
useWithLakeFormation(props) {
this.parameters.LakeFormationConfiguration = {
UseLakeFormationCredentials: props.useLakeFormationCredentials ?? true,
};
if (props.accountId) {
this.parameters.LakeFormationConfiguration.AccountId = props.accountId;
}
}
/**
* Set the recall policy for the crawler.
* @param recallpolicy RecrawlPolicy
* @returns void
*/
addRecrawlBehaviour(recallpolicy) {
this.parameters.RecrawlBehaviour = recallpolicy;
}
/**
* Enable Lineage for the Crawler
* @param lineage
*/
enableLineage(lineage) {
this.parameters.LineageConfiguration = {
CrawlerLineageSettings: lineage,
};
}
/**
* Enable SchemaChangPolicy
* @param schemaChangePolicy
*/
addSchemaChangePolicy(schemaChangePolicy) {
this.parameters.SchemaChangePolicy = pascalCaseKeys(schemaChangePolicy);
}
/**
* set crawler Configuration
* @param configuration
*/
addConfiguration(configuration) {
this.parameters.Configuration = configuration;
}
/**
* add CrawlerSecurity Configuration
* @param configuration
* */
addCrawlerSecurityConfiguration(configuration) {
this.parameters.CrawlerSecurityConfiguration = configuration;
}
/**
* add schedule for the crawler
* @param schedule
*/
addSchedule(schedule) {
if (checkRegex(new RegExp('^((\*(\/\d+)?|\d+((-|\,)\d+)*)(\s+(\*(\/\d+)?|\d+((-|\,)\d+)*)){4})$'), schedule) == false) {
throw new Error('The schedule needs to be a valid cron expresson');
}
this.parameters.Schedule = schedule;
}
/**
* add table prefix for the crawler
* @param tablePrefix
*/
addTablePrefix(tablePrefix) {
this.parameters.TablePrefix = tablePrefix;
}
}
exports.Crawler = Crawler;
_a = JSII_RTTI_SYMBOL_1;
Crawler[_a] = { fqn: "raindancers-network.glue.Crawler", version: "1.29.3" };
// a function to check if a property is a match for a regex expression
function checkRegex(regex, property) {
return regex.test(property);
}
/**
* Converts the Keys in an arbitory object, to Pascal Case. Use this to send typescript objects
* to API
* @param obj a complex object
* @returns any
*/
function pascalCaseKeys(obj) {
if (typeof obj !== 'object') {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(pascalCaseKeys);
}
if (obj === null) {
return null;
}
const entries = Object.entries(obj);
const mappedEntries = entries.map(([k, v]) => [`${k.slice(0, 1).toUpperCase()}${k.slice(1)}`, pascalCaseKeys(v)]);
return Object.fromEntries(mappedEntries);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jhd2xlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbHVlL2NyYXdsZXIvY3Jhd2xlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUdxQjtBQUVyQix5Q0FBeUM7QUFRekMsSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQ2hDLDJDQUFpQixDQUFBO0lBQ2pCLDZDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsR0FBdEIsOEJBQXNCLEtBQXRCLDhCQUFzQixRQUdqQztBQU1ELElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6Qix1REFBb0MsQ0FBQTtJQUNwQyxvRUFBaUQsQ0FBQTtJQUNqRCx3REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBSlcsZUFBZSxHQUFmLHVCQUFlLEtBQWYsdUJBQWUsUUFJMUI7QUFNRCxJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkJBQVcsQ0FBQTtJQUNYLCtEQUE2QyxDQUFBO0lBQzdDLGlFQUErQyxDQUFBO0FBQ2pELENBQUMsRUFKVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUl6QjtBQUVELElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4Qiw2QkFBVyxDQUFBO0lBQ1gsMkRBQXlDLENBQUE7QUFDM0MsQ0FBQyxFQUhXLGNBQWMsR0FBZCxzQkFBYyxLQUFkLHNCQUFjLFFBR3pCO0FBcUNELDBGQUEwRjtBQUUxRixNQUFhLE9BQVEsU0FBUSxVQUFVLENBQUMsU0FBUztJQUcvQyxZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsd0dBQXdHO1FBQ3hHLHNDQUFzQztRQUN0QyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENB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QUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUMsQ0FBQztJQUMzRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGN1c3RvbV9yZXNvdXJjZXMgYXMgY3IsXG4gIGF3c19pYW0gYXMgaWFtLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBnbHVlIGZyb20gJy4uL2luZGV4JztcblxuZXhwb3J0IGludGVyZmFjZSBMYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbiB7XG4gIHJlYWRvbmx5IGFjY291bnRJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgdXNlTGFrZUZvcm1hdGlvbkNyZWRlbnRpYWxzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGVudW0gQ3Jhd2xlckxpbmVhZ2VTZXR0aW5ncyB7XG4gIEVOQUJMRSA9ICdFTkFCTEUnLFxuICBESVNBQkxFID0gJ0RJU0FCTEUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmVhZ2VDb25maWd1cmF0aW9uIHtcbiAgcmVhZG9ubHkgY3Jhd2xlckxpbmVhZ2VTZXR0aW5nczogQ3Jhd2xlckxpbmVhZ2VTZXR0aW5ncztcbn1cblxuZXhwb3J0IGVudW0gUmVjcmF3bEJlaGF2aW9yIHtcbiAgQ1JBV0xfRVZFUllUSElORyA9ICdDUkFXTF9FVkVSVEhJTkcnLFxuICBDUkFXTF9ORVdfRk9MREVSU19PTkxZID0gJ0NSQVdMX05FV19GT0xERVJTX09OTFknLFxuICBDUkFXTF9FVkVOVF9NT0RFID0gJ0NSQVdMX0VWRU5UX01PREUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Jhd2xQb2xpY3kge1xuICByZWFkb25seSByZWNyYXdsQmVoYXZpb3I6IFJlY3Jhd2xCZWhhdmlvcjtcbn1cblxuZXhwb3J0IGVudW0gRGVsZXRlQmVoYXZpb3Ige1xuICBMT0cgPSAnTE9HJyxcbiAgREVMRVRFX0ZST01fREFUQUJBU0UgPSAnREVMRVRFX0ZST01fREFUQUJBU0UnLFxuICBERVBSRUNBVEVfSU5fREFUQUJBU0UgPSAnREVQUkVDQVRFX0lOX0RBVEFCQVNFJyxcbn1cblxuZXhwb3J0IGVudW0gVXBkYXRlQmVoYXZpb3Ige1xuICBMT0cgPSAnTE9HJyxcbiAgVVBEQVRFX0lOX0RBVEFCQVNFID0gJ1VQREFURV9JTl9EQVRBQkFTRScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hQ2hhbmdlUG9saWN5IHtcbiAgcmVhZG9ubHkgZGVsZXRlQmVoYXZpb3I6IERlbGV0ZUJlaGF2aW9yO1xuICByZWFkb25seSB1cGRhdGVCZWhhdmlvcjogVXBkYXRlQmVoYXZpb3I7XG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUNyYXdsZXJQYXJhbWV0ZXJzIHtcbi8vICAgbmFtZTogc3RyaW5nO1xuLy8gICByb2xlOiBzdHJpbmc7XG4vLyAgIHMzVGFyZ2V0cz86IGdsdWUuUzNUYXJnZXRbXSB8IHVuZGVmaW5lZDtcbi8vICAgamRiY1RhcmdldHM/OiBnbHVlLkpEQkNUYXJnZXRbXSB8IHVuZGVmaW5lZDtcbi8vICAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4vLyAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBjbGFzc2lmaWVycz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuLy8gICBsYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbj86IExha2VGb3JtYXRpb25Db25maWd1cmF0aW9uO1xuLy8gICBsaW5lYWdlQ29uZmlndXJhdGlvbj86IExpbmVhZ2VDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuLy8gICByZWNyYXdsQmVoYXZpb3VyPzogUmVjcmF3bFBvbGljeSB8IHVuZGVmaW5lZDtcbi8vICAgc2NoZW1hQ2hhbmdlUG9saWN5PzogU2NoZW1hQ2hhbmdlUG9saWN5O1xuLy8gICBjb25maWd1cmF0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBjcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gICBzY2hlZHVsZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbi8vICAgdGFibGVQcmVmaXg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQ2xhc3NpZmllcnNQcm9wcyB7XG4gIHJlYWRvbmx5IGNsYXNzaWZpZXJzOiBnbHVlLkdsdWVDbGFzc2lmaWVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jhd2xlclByb3BzIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSByb2xlOiBpYW0uUm9sZTtcbiAgcmVhZG9ubHkgczNUYXJnZXRzPzogZ2x1ZS5TM1RhcmdldFtdIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBqZGJjVGFyZ2V0cz86IGdsdWUuSkRCQ1RhcmdldFtdO1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6c3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbi8vaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9HbHVlLmh0bWwjY3JlYXRlQ3Jhd2xlci1wcm9wZXJ0eVxuXG5leHBvcnQgY2xhc3MgQ3Jhd2xlciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcGFyYW1ldGVyczoge1trZXk6c3RyaW5nXTogYW55fTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDcmF3bGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gdmFsaWRhdGUgdGhhdCBvbmx5IG9uZSBvZiBzM1RhcmdldHMgaGFzIGJlZW4gc2V0LiBDb3VsZCBub3QgdXNlIFR5cGUsIGFzIHRoaXMgd2FzIGpzaWkgaW5jb21wYXRpYWJsZS5cbiAgICAvLyBzbyB0aGlzIGhhcyB0byBiZSBydW4gdGltZSBjaGVjayDwn5SlXG4gICAgaWYgKHByb3BzLnMzVGFyZ2V0cyAmJiBwcm9wcy5qZGJjVGFyZ2V0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGhhdmUgYm90aCBTM1RhcmdldHMgYW5kIEpkYmNUYXJnZXRzJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnMzVGFyZ2V0cyA9PT0gdW5kZWZpbmVkICYmIHByb3BzLmpkYmNUYXJnZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YXJnZXQgdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHM6IHtba2V5OnN0cmluZ106IGFueX0gPSB7fTtcblxuICAgIGlmIChwcm9wcy5zM1RhcmdldHMpIHtcbiAgICAgIGNvbnN0IHMzdGFyZ2V0czogb2JqZWN0W10gPSBbXTtcbiAgICAgIHByb3BzLnMzVGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgICAgczN0YXJnZXRzLnB1c2godGFyZ2V0LnRhcmdldCk7XG4gICAgICB9KTtcbiAgICAgIHRhcmdldHMuUzNUYXJnZXRzID0gczN0YXJnZXRzO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5qZGJjVGFyZ2V0cykge1xuICAgICAgY29uc3QgamRiY1RhcmdldHM6IG9iamVjdFtdID0gW107XG4gICAgICBwcm9wcy5qZGJjVGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcbiAgICAgICAgamRiY1RhcmdldHMucHVzaCh0YXJnZXQudGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgICAgdGFyZ2V0cy5KZGJjVGFyZ2V0cyA9IGpkYmNUYXJnZXRzO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyh0YXJnZXRzKTtcblxuICAgIC8vIHRoZXNlIGFyZSB0aGUgbWFuZGF0b3J5IHBhcmFtdGVyc1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHtcbiAgICAgIE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICBSb2xlOiBwcm9wcy5yb2xlLnJvbGVBcm4sXG4gICAgICBUYXJnZXRzOiBwYXNjYWxDYXNlS2V5cyh0YXJnZXRzKSxcbiAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coJy0tLS0tLScpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMucGFyYW1ldGVycyk7XG5cbiAgICAvLyB0YXJnZXRzIGtleXMsIG5lZWQgdG8gaGF2ZSB0aGVpciBmaXJzdCBjaGFyYWN0ZXIgQ2FwaXRhbGl6ZWQuXG5cblxuICAgIGlmIChwcm9wcy5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzLkRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdDcmF3bGVyJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpDcmF3bGVyJyxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6ICdHbHVlJyxcbiAgICAgICAgYWN0aW9uOiAnY3JlYXRlQ3Jhd2xlcicsXG4gICAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YoYENyYXdsZXIke3Byb3BzLm5hbWV9YCksXG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogJ0dsdWUnLFxuICAgICAgICBhY3Rpb246ICd1cGRhdGVDcmF3bGVyJyxcbiAgICAgICAgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzLFxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6ICdHbHVlJyxcbiAgICAgICAgYWN0aW9uOiAnZGVsZXRlQ3Jhd2xlcicsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBOYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICdnbHVlOkNyZWF0ZUNyYXdsZXInLFxuICAgICAgICAgICAgICAnZ2x1ZTpVcGRhdGVDcmF3bGVyJyxcbiAgICAgICAgICAgICAgJ2dsdWU6RGVsZXRlQ3Jhd2xlcicsXG4gICAgICAgICAgICAgICdpYW06UGFzc1JvbGUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYWRkIGNsYXNzaWZlcnMgdG8gdGhlIGNyYXdsZXIuXG4gICAqIEBwYXJhbSBwcm9wcyBhZGRDbGFzc2lmaWVyUHJvcHNcbiAgICovXG4gIHB1YmxpYyBhZGRDbGFzc2lmaWVycyhwcm9wczogQWRkQ2xhc3NpZmllcnNQcm9wcyk6IHZvaWQge1xuICAgIHZhciBjbGFzc2lmZXJOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcm9wcy5jbGFzc2lmaWVycy5mb3JFYWNoKChjbGFzc2lmaWVyKSA9PiB7XG4gICAgICBjbGFzc2lmZXJOYW1lcy5wdXNoKGNsYXNzaWZpZXIubmFtZSk7XG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLkNsYXNzaWZpZXJzID0gY2xhc3NpZmVyTmFtZXM7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGUgY3Jhd2xlciB3aXRoIGxha2VGb3JtYXRpb24gUGVybWlzc2lvbnMuXG4gICAqIEBwYXJhbSBwcm9wcyBMYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXNlV2l0aExha2VGb3JtYXRpb24ocHJvcHM6IExha2VGb3JtYXRpb25Db25maWd1cmF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLkxha2VGb3JtYXRpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgVXNlTGFrZUZvcm1hdGlvbkNyZWRlbnRpYWxzOiBwcm9wcy51c2VMYWtlRm9ybWF0aW9uQ3JlZGVudGlhbHMgPz8gdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChwcm9wcy5hY2NvdW50SWQpIHtcbiAgICAgIHRoaXMucGFyYW1ldGVycy5MYWtlRm9ybWF0aW9uQ29uZmlndXJhdGlvbi5BY2NvdW50SWQgPSBwcm9wcy5hY2NvdW50SWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHJlY2FsbCAgcG9saWN5IGZvciB0aGUgY3Jhd2xlci5cbiAgICogQHBhcmFtIHJlY2FsbHBvbGljeSBSZWNyYXdsUG9saWN5XG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHB1YmxpYyBhZGRSZWNyYXdsQmVoYXZpb3VyKHJlY2FsbHBvbGljeTogUmVjcmF3bFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5SZWNyYXdsQmVoYXZpb3VyID0gcmVjYWxscG9saWN5O1xuICB9XG4gIC8qKlxuICAgKiBFbmFibGUgTGluZWFnZSBmb3IgdGhlIENyYXdsZXJcbiAgICogQHBhcmFtIGxpbmVhZ2VcbiAgICovXG4gIHB1YmxpYyBlbmFibGVMaW5lYWdlKGxpbmVhZ2U6IENyYXdsZXJMaW5lYWdlU2V0dGluZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuTGluZWFnZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBDcmF3bGVyTGluZWFnZVNldHRpbmdzOiBsaW5lYWdlLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZSBTY2hlbWFDaGFuZ1BvbGljeVxuICAgKiBAcGFyYW0gc2NoZW1hQ2hhbmdlUG9saWN5XG4gICAqL1xuICBwdWJsaWMgYWRkU2NoZW1hQ2hhbmdlUG9saWN5KHNjaGVtYUNoYW5nZVBvbGljeTogU2NoZW1hQ2hhbmdlUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLlNjaGVtYUNoYW5nZVBvbGljeSA9IHBhc2NhbENhc2VLZXlzKHNjaGVtYUNoYW5nZVBvbGljeSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBjcmF3bGVyIENvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhZGRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5Db25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgfVxuICAvKipcbiAgICogYWRkIENyYXdsZXJTZWN1cml0eSBDb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uXG4gICAqICovXG4gIHB1YmxpYyBhZGRDcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5DcmF3bGVyU2VjdXJpdHlDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgfVxuICAvKipcbiAgICogYWRkIHNjaGVkdWxlIGZvciB0aGUgY3Jhd2xlclxuICAgKiBAcGFyYW0gc2NoZWR1bGVcbiAgICovXG4gIHB1YmxpYyBhZGRTY2hlZHVsZShzY2hlZHVsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGNoZWNrUmVnZXgobmV3IFJlZ0V4cCgnXigoXFwqKFxcL1xcZCspP3xcXGQrKCgtfFxcLClcXGQrKSopKFxccysoXFwqKFxcL1xcZCspP3xcXGQrKCgtfFxcLClcXGQrKSopKXs0fSkkJyksIHNjaGVkdWxlKSA9PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2NoZWR1bGUgbmVlZHMgdG8gYmUgYSB2YWxpZCBjcm9uIGV4cHJlc3NvbicpO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtZXRlcnMuU2NoZWR1bGUgPSBzY2hlZHVsZTtcbiAgfVxuICAvKipcbiAgICogYWRkIHRhYmxlIHByZWZpeCBmb3IgdGhlIGNyYXdsZXJcbiAgICogQHBhcmFtIHRhYmxlUHJlZml4XG4gICAqL1xuICBwdWJsaWMgYWRkVGFibGVQcmVmaXgodGFibGVQcmVmaXg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFyYW1ldGVycy5UYWJsZVByZWZpeCA9IHRhYmxlUHJlZml4O1xuICB9XG59XG5cbi8vIGEgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSBpcyBhIG1hdGNoIGZvciBhIHJlZ2V4IGV4cHJlc3Npb25cblxuZnVuY3Rpb24gY2hlY2tSZWdleChyZWdleDogUmVnRXhwLCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWdleC50ZXN0KHByb3BlcnR5KTtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIEtleXMgaW4gYW4gYXJiaXRvcnkgb2JqZWN0LCB0byBQYXNjYWwgQ2FzZS4gVXNlIHRoaXMgdG8gc2VuZCB0eXBlc2NyaXB0IG9iamVjdHNcbiAqIHRvIEFQSVxuICogQHBhcmFtIG9iaiBhIGNvbXBsZXggb2JqZWN0XG4gKiBAcmV0dXJucyBhbnlcbiAqL1xuZnVuY3Rpb24gcGFzY2FsQ2FzZUtleXMob2JqOiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChwYXNjYWxDYXNlS2V5cyk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gZW50cmllcy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gW2Ake2suc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKX0ke2suc2xpY2UoMSl9YCwgcGFzY2FsQ2FzZUtleXModildIGFzIGNvbnN0KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbn0iXX0=