antfarm
Version:
File automation framework for ants.
179 lines (177 loc) • 18.9 kB
JavaScript
;
var tunnel_1 = require("./tunnel/tunnel");
var ftpNest_1 = require("./nest/ftpNest");
var folderNest_1 = require("./nest/folderNest");
var environment_1 = require("./environment/environment");
var webhookNest_1 = require("./nest/webhookNest");
var autoFolderNest_1 = require("./nest/autoFolderNest");
var s3Nest_1 = require("./nest/s3Nest");
/**
* Expose `Antfarm`.
*/
var Antfarm = (function () {
/**
* Antfarm constructor
* @param options Antfarm options
*/
function Antfarm(options) {
this.e = new environment_1.Environment(options);
this.e.log(1, "Started antfarm", this);
}
Antfarm.prototype.version = function () {
return "0.0.1";
};
/**
* Factory method which returns a Tunnel.
* @param name
* @returns {Tunnel}
*/
Antfarm.prototype.createTunnel = function (name) {
return new tunnel_1.Tunnel(this.e, name);
};
/**
* Factory method which returns a FolderNest.
* @param path Path of the folder.
* @param allowCreate Optional boolean flag to allow creation of folder if it does not exist.
* @returns {FolderNest}
* #### Example
* ```js
* var out_folder = af.createFolderNest("/Users/dominick/Desktop/My Folder/");
* ```
*/
Antfarm.prototype.createFolderNest = function (path, allowCreate) {
if (allowCreate === void 0) { allowCreate = false; }
return new folderNest_1.FolderNest(this.e, path, allowCreate);
};
/**
* Factory method which returns an AutoFolderNest. If the auto managed directory does not exist, it is created.
* @param hierarchy Path of the folder as a string or an array of strings as _path segments.
* @returns {AutoFolderNest}
*
* #### Example
* ```js
* af.createAutoFolderNest("outfolder")
* // /Users/dominick/My Automanaged Directory/outfolder
* ```
* #### Example
* ```js
* af.createAutoFolderNest(["proofing", "others"])
* // /Users/dominick/My Automanaged Directory/proofing/others
* ```
*/
Antfarm.prototype.createAutoFolderNest = function (hierarchy) {
return new autoFolderNest_1.AutoFolderNest(this.e, hierarchy);
};
/**
* Factory method which returns an FtpNest.
* @param host Hostname or IP address of the FTP server.
* @param port Port number of the FTP server.
* @param username FTP account username.
* @param password FTP account password.
* @param checkEvery Frequency of re-checking FTP in minutes.
* @returns {FtpNest}
* #### Example
* ```js
* // Check FTP directory every 2 minutes
* var my_ftp = af.createFtpNest("ftp.example.com", 21, "", "", 2);
* ```
*/
Antfarm.prototype.createFtpNest = function (host, port, username, password, checkEvery) {
if (port === void 0) { port = 21; }
if (username === void 0) { username = ""; }
if (password === void 0) { password = ""; }
if (checkEvery === void 0) { checkEvery = 10; }
return new ftpNest_1.FtpNest(this.e, host, port, username, password, checkEvery);
};
/**
* Factory method to create and return an S3 nest.
* @param bucket
* @param keyPrefix
* @param checkEvery
* @param allowCreation
* @returns {S3Nest}
* ```js
* var bucket = af.createS3Nest("my-bucket-_name", "", 1, true);
* ```
*/
Antfarm.prototype.createS3Nest = function (bucket, keyPrefix, checkEvery, allowCreation) {
if (checkEvery === void 0) { checkEvery = 5; }
if (allowCreation === void 0) { allowCreation = false; }
return new s3Nest_1.S3Nest(this.e, bucket, keyPrefix, checkEvery, allowCreation);
};
/**
* Factory method which returns a WebhookNest.
* @param path The _path which is generated in the webhook's route. You can supply a string or array of strings.
* @param httpMethod HTTP method for this webhook. Choose "all" for any HTTP method.
* @param handleRequest Optional callback function to handle the request, for sending a custom response.
* @returns {WebhookNest}
*
* #### Example
* ```js
* var webhook = af.createWebhookNest(["proof", "create"], "post");
* ```
*
* #### Example returning custom response
* ```js
* var webhook = af.createWebhookNest(["proof", "create"], "post", function(req, res, job, nest){
* res.setHeader("Content-Type", "application/json; charset=utf-8");
* res.end(JSON.stringify({
* job_name: job.getName(),
* job_id: job.getId(),
* message: "Proof created!"
* }));
* });
* ```
*/
Antfarm.prototype.createWebhookNest = function (path, httpMethod, handleRequest) {
if (httpMethod === void 0) { httpMethod = "all"; }
return new webhookNest_1.WebhookNest(this.e, path, httpMethod, handleRequest);
};
/**
* Load an entire directory of workflow modules.
* @param directory Path to the workflow modules.
* #### Example
* ```js
* af.loadDir("./workflows");
* ```
*/
Antfarm.prototype.loadDir = function (directory) {
var af = this;
var workflows = require("require-dir-all")(directory, {
_parentsToSkip: 1,
indexAsParent: true,
throwNoDir: true
});
var loaded_counter = 0;
for (var workflow in workflows) {
try {
new workflows[workflow](af);
loaded_counter++;
}
catch (e) {
af.e.log(3, "Couldn't load workflow module \"" + workflow + "\". " + e, af);
}
}
af.e.log(1, "Loaded " + loaded_counter + " workflows.", af);
};
/**
* Log messages into the antfarm logger.
* @param type {number} The log level. 0 = debug, 1 = info, 2 = warning, 3 = error
* @param message {string} Log message.
* @param actor {any} Instance which triggers the action being logged.
* @param instances {any[]} Array of of other involved instances.
* #### Example
* ```js
* job.e.log(1, `Transferred to Tunnel "${tunnel.getName()}".`, job, [oldTunnel]);
* ```
*/
Antfarm.prototype.log = function (type, message, actor, instances) {
if (instances === void 0) { instances = []; }
var af = this;
af.e.log(type, message, actor, instances);
};
return Antfarm;
}());
exports.Antfarm = Antfarm;
module.exports = Antfarm;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFFO1lBQ2xELGNBQWMsRUFBRSxDQUFDO1lBQ2pCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFVBQVUsRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQztRQUNILElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztRQUV2QixHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQztnQkFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUIsY0FBYyxFQUFFLENBQUM7WUFDckIsQ0FBRTtZQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1QsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHFDQUFrQyxRQUFRLFlBQU0sQ0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDTCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVUsY0FBYyxnQkFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0kscUJBQUcsR0FBVixVQUFXLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBVyxFQUFFLFNBQWM7UUFBZCx5QkFBYyxHQUFkLGNBQWM7UUFDakUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNMLGNBQUM7QUFBRCxDQXJLQSxBQXFLQyxJQUFBO0FBcktZLGVBQU8sVUFxS25CLENBQUE7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyIsImZpbGUiOiJsaWIvYW50ZmFybS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0dW5uZWwgPSByZXF1aXJlKFwiLi90dW5uZWwvdHVubmVsXCIpO1xuaW1wb3J0IG5lc3QgPSByZXF1aXJlKFwiLi9uZXN0L25lc3RcIik7XG5pbXBvcnQgZm9sZGVyTmVzdCA9IHJlcXVpcmUoXCIuL25lc3QvZm9sZGVyTmVzdFwiKTtcbmltcG9ydCBqb2IgPSByZXF1aXJlKFwiLi9qb2Ivam9iXCIpO1xuaW1wb3J0IHtUdW5uZWx9IGZyb20gXCIuL3R1bm5lbC90dW5uZWxcIjtcbmltcG9ydCB7RnRwTmVzdH0gZnJvbSBcIi4vbmVzdC9mdHBOZXN0XCI7XG5pbXBvcnQge0ZvbGRlck5lc3R9IGZyb20gXCIuL25lc3QvZm9sZGVyTmVzdFwiO1xuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSBcIi4vZW52aXJvbm1lbnQvZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7V2ViaG9va05lc3R9IGZyb20gXCIuL25lc3Qvd2ViaG9va05lc3RcIjtcbmltcG9ydCB7QXV0b0ZvbGRlck5lc3R9IGZyb20gXCIuL25lc3QvYXV0b0ZvbGRlck5lc3RcIjtcbmltcG9ydCB7QW50ZmFybU9wdGlvbnN9IGZyb20gXCIuL2Vudmlyb25tZW50L29wdGlvbnNcIjtcbmltcG9ydCB7UzNOZXN0fSBmcm9tIFwiLi9uZXN0L3MzTmVzdFwiO1xuXG4vKipcbiAqIEV4cG9zZSBgQW50ZmFybWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnRmYXJtIHtcblxuICAgIHByb3RlY3RlZCBlOiBFbnZpcm9ubWVudDtcblxuICAgIC8qKlxuICAgICAqIEFudGZhcm0gY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAgIEFudGZhcm0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBBbnRmYXJtT3B0aW9ucykge1xuICAgICAgICB0aGlzLmUgPSBuZXcgRW52aXJvbm1lbnQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZS5sb2coMSwgXCJTdGFydGVkIGFudGZhcm1cIiwgdGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiBcIjAuMC4xXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmFjdG9yeSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIFR1bm5lbC5cbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqIEByZXR1cm5zIHtUdW5uZWx9XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVR1bm5lbChuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHVubmVsKHRoaXMuZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmFjdG9yeSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIEZvbGRlck5lc3QuXG4gICAgICogQHBhcmFtIHBhdGggICAgICAgICAgUGF0aCBvZiB0aGUgZm9sZGVyLlxuICAgICAqIEBwYXJhbSBhbGxvd0NyZWF0ZSAgIE9wdGlvbmFsIGJvb2xlYW4gZmxhZyB0byBhbGxvdyBjcmVhdGlvbiBvZiBmb2xkZXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICogQHJldHVybnMge0ZvbGRlck5lc3R9XG4gICAgICogIyMjIyBFeGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiB2YXIgb3V0X2ZvbGRlciA9IGFmLmNyZWF0ZUZvbGRlck5lc3QoXCIvVXNlcnMvZG9taW5pY2svRGVza3RvcC9NeSBGb2xkZXIvXCIpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGb2xkZXJOZXN0KHBhdGg/OiBzdHJpbmcsIGFsbG93Q3JlYXRlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb2xkZXJOZXN0KHRoaXMuZSwgcGF0aCwgYWxsb3dDcmVhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gQXV0b0ZvbGRlck5lc3QuIElmIHRoZSBhdXRvIG1hbmFnZWQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSBoaWVyYXJjaHkgICAgIFBhdGggb2YgdGhlIGZvbGRlciBhcyBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzIGFzIF9wYXRoIHNlZ21lbnRzLlxuICAgICAqIEByZXR1cm5zIHtBdXRvRm9sZGVyTmVzdH1cbiAgICAgKlxuICAgICAqICMjIyMgRXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYWYuY3JlYXRlQXV0b0ZvbGRlck5lc3QoXCJvdXRmb2xkZXJcIilcbiAgICAgKiAvLyAvVXNlcnMvZG9taW5pY2svTXkgQXV0b21hbmFnZWQgRGlyZWN0b3J5L291dGZvbGRlclxuICAgICAqIGBgYFxuICAgICAqICMjIyMgRXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYWYuY3JlYXRlQXV0b0ZvbGRlck5lc3QoW1wicHJvb2ZpbmdcIiwgXCJvdGhlcnNcIl0pXG4gICAgICogLy8gL1VzZXJzL2RvbWluaWNrL015IEF1dG9tYW5hZ2VkIERpcmVjdG9yeS9wcm9vZmluZy9vdGhlcnNcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQXV0b0ZvbGRlck5lc3QoaGllcmFyY2h5OiBzdHJpbmd8c3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRvRm9sZGVyTmVzdCh0aGlzLmUsIGhpZXJhcmNoeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmFjdG9yeSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBGdHBOZXN0LlxuICAgICAqIEBwYXJhbSBob3N0ICAgICAgICAgIEhvc3RuYW1lIG9yIElQIGFkZHJlc3Mgb2YgdGhlIEZUUCBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHBvcnQgICAgICAgICAgUG9ydCBudW1iZXIgb2YgdGhlIEZUUCBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHVzZXJuYW1lICAgICAgRlRQIGFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHBhcmFtIHBhc3N3b3JkICAgICAgRlRQIGFjY291bnQgcGFzc3dvcmQuXG4gICAgICogQHBhcmFtIGNoZWNrRXZlcnkgICAgRnJlcXVlbmN5IG9mIHJlLWNoZWNraW5nIEZUUCBpbiBtaW51dGVzLlxuICAgICAqIEByZXR1cm5zIHtGdHBOZXN0fVxuICAgICAqICMjIyMgRXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQ2hlY2sgRlRQIGRpcmVjdG9yeSBldmVyeSAyIG1pbnV0ZXNcbiAgICAgKiB2YXIgbXlfZnRwID0gYWYuY3JlYXRlRnRwTmVzdChcImZ0cC5leGFtcGxlLmNvbVwiLCAyMSwgXCJcIiwgXCJcIiwgMik7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZ0cE5lc3QoaG9zdDogc3RyaW5nLCBwb3J0ID0gMjEsIHVzZXJuYW1lID0gXCJcIiwgcGFzc3dvcmQgPSBcIlwiLCBjaGVja0V2ZXJ5ID0gMTApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdHBOZXN0KHRoaXMuZSwgaG9zdCwgcG9ydCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBjaGVja0V2ZXJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW5kIHJldHVybiBhbiBTMyBuZXN0LlxuICAgICAqIEBwYXJhbSBidWNrZXRcbiAgICAgKiBAcGFyYW0ga2V5UHJlZml4XG4gICAgICogQHBhcmFtIGNoZWNrRXZlcnlcbiAgICAgKiBAcGFyYW0gYWxsb3dDcmVhdGlvblxuICAgICAqIEByZXR1cm5zIHtTM05lc3R9XG4gICAgICogYGBganNcbiAgICAgKiB2YXIgYnVja2V0ID0gYWYuY3JlYXRlUzNOZXN0KFwibXktYnVja2V0LV9uYW1lXCIsIFwiXCIsIDEsIHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTM05lc3QoYnVja2V0OiBzdHJpbmcsIGtleVByZWZpeD86IHN0cmluZywgY2hlY2tFdmVyeTogbnVtYmVyID0gNSwgYWxsb3dDcmVhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUzNOZXN0KHRoaXMuZSwgYnVja2V0LCBrZXlQcmVmaXgsIGNoZWNrRXZlcnksIGFsbG93Q3JlYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgbWV0aG9kIHdoaWNoIHJldHVybnMgYSBXZWJob29rTmVzdC5cbiAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgICAgICAgVGhlIF9wYXRoIHdoaWNoIGlzIGdlbmVyYXRlZCBpbiB0aGUgd2ViaG9vaydzIHJvdXRlLiBZb3UgY2FuIHN1cHBseSBhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBodHRwTWV0aG9kICAgICAgICBIVFRQIG1ldGhvZCBmb3IgdGhpcyB3ZWJob29rLiBDaG9vc2UgXCJhbGxcIiBmb3IgYW55IEhUVFAgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBoYW5kbGVSZXF1ZXN0ICAgICBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlcXVlc3QsIGZvciBzZW5kaW5nIGEgY3VzdG9tIHJlc3BvbnNlLlxuICAgICAqIEByZXR1cm5zIHtXZWJob29rTmVzdH1cbiAgICAgKlxuICAgICAqICMjIyMgRXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogdmFyIHdlYmhvb2sgPSBhZi5jcmVhdGVXZWJob29rTmVzdChbXCJwcm9vZlwiLCBcImNyZWF0ZVwiXSwgXCJwb3N0XCIpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogIyMjIyBFeGFtcGxlIHJldHVybmluZyBjdXN0b20gcmVzcG9uc2VcbiAgICAgKiBgYGBqc1xuICAgICAqIHZhciB3ZWJob29rID0gYWYuY3JlYXRlV2ViaG9va05lc3QoW1wicHJvb2ZcIiwgXCJjcmVhdGVcIl0sIFwicG9zdFwiLCBmdW5jdGlvbihyZXEsIHJlcywgam9iLCBuZXN0KXtcbiAgICAgKiAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICogICAgIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAqICAgICAgICAgIGpvYl9uYW1lOiBqb2IuZ2V0TmFtZSgpLFxuICAgICAqICAgICAgICAgIGpvYl9pZDogam9iLmdldElkKCksXG4gICAgICogICAgICAgICAgbWVzc2FnZTogXCJQcm9vZiBjcmVhdGVkIVwiXG4gICAgICogICAgIH0pKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlV2ViaG9va05lc3QocGF0aDogc3RyaW5nfHN0cmluZ1tdLCBodHRwTWV0aG9kID0gXCJhbGxcIiwgaGFuZGxlUmVxdWVzdD86IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IFdlYmhvb2tOZXN0KHRoaXMuZSwgcGF0aCwgaHR0cE1ldGhvZCwgaGFuZGxlUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhbiBlbnRpcmUgZGlyZWN0b3J5IG9mIHdvcmtmbG93IG1vZHVsZXMuXG4gICAgICogQHBhcmFtIGRpcmVjdG9yeSAgICAgUGF0aCB0byB0aGUgd29ya2Zsb3cgbW9kdWxlcy5cbiAgICAgKiAjIyMjIEV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGFmLmxvYWREaXIoXCIuL3dvcmtmbG93c1wiKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZERpcihkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICBsZXQgYWYgPSB0aGlzO1xuICAgICAgICBsZXQgd29ya2Zsb3dzID0gcmVxdWlyZShcInJlcXVpcmUtZGlyLWFsbFwiKShkaXJlY3RvcnksIHtcbiAgICAgICAgICAgIF9wYXJlbnRzVG9Ta2lwOiAxLFxuICAgICAgICAgICAgaW5kZXhBc1BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIHRocm93Tm9EaXI6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsb2FkZWRfY291bnRlciA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgd29ya2Zsb3cgaW4gd29ya2Zsb3dzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG5ldyB3b3JrZmxvd3Nbd29ya2Zsb3ddKGFmKTtcbiAgICAgICAgICAgICAgICBsb2FkZWRfY291bnRlcisrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFmLmUubG9nKDMsIGBDb3VsZG4ndCBsb2FkIHdvcmtmbG93IG1vZHVsZSBcIiR7d29ya2Zsb3d9XCIuICR7ZX1gLCBhZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhZi5lLmxvZygxLCBgTG9hZGVkICR7bG9hZGVkX2NvdW50ZXJ9IHdvcmtmbG93cy5gLCBhZik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIG1lc3NhZ2VzIGludG8gdGhlIGFudGZhcm0gbG9nZ2VyLlxuICAgICAqIEBwYXJhbSB0eXBlIHtudW1iZXJ9ICAgICAgICAgVGhlIGxvZyBsZXZlbC4gMCA9IGRlYnVnLCAxID0gaW5mbywgMiA9IHdhcm5pbmcsIDMgPSBlcnJvclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHtzdHJpbmd9ICAgICAgIExvZyBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBhY3RvciAge2FueX0gICAgICAgICAgIEluc3RhbmNlIHdoaWNoIHRyaWdnZXJzIHRoZSBhY3Rpb24gYmVpbmcgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZXMge2FueVtdfSAgICAgIEFycmF5IG9mIG9mIG90aGVyIGludm9sdmVkIGluc3RhbmNlcy5cbiAgICAgKiAjIyMjIEV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGpvYi5lLmxvZygxLCBgVHJhbnNmZXJyZWQgdG8gVHVubmVsIFwiJHt0dW5uZWwuZ2V0TmFtZSgpfVwiLmAsIGpvYiwgW29sZFR1bm5lbF0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBsb2codHlwZTogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIGFjdG9yPzogYW55LCBpbnN0YW5jZXMgPSBbXSkge1xuICAgICAgICBsZXQgYWYgPSB0aGlzO1xuICAgICAgICBhZi5lLmxvZyh0eXBlLCBtZXNzYWdlLCBhY3RvciwgaW5zdGFuY2VzKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQW50ZmFybTsiXX0=