"use strict"; require("typings-global"); var plugins = require("./smartfile.plugins"); var SmartfileInterpreter = require("./smartfile.interpreter"); /*=============================================================== ============================ Checks ============================= ===============================================================*/ /** * * @param filePath * @returns {boolean} */ exports.fileExistsSync = function (filePath) { var fileExistsBool = false; try { plugins.fs.readFileSync(filePath); fileExistsBool = true; } catch (err) { fileExistsBool = false; } return fileExistsBool; }; /** * * @param filePath * @returns {any} */ exports.fileExists = function (filePath) { var done = plugins.q.defer(); plugins.fs.access(filePath, plugins.fs.R_OK, function (err) { err ? done.reject() : done.resolve(); }); return done.promise; }; /** * Checks if given path points to an existing directory */ exports.isDirectory = function (pathArg) { return plugins.fs.statSync(pathArg).isDirectory(); }; /** * Checks if a given path points to an existing file */ exports.isFile = function (pathArg) { return plugins.fs.statSync(pathArg).isFile(); }; /*=============================================================== ============================ FS ACTIONS ========================= ===============================================================*/ /** * ensures that a directory is in place */ exports.ensureDir = function (dirPathArg) { var done = plugins.q.defer(); plugins.fs.ensureDir(dirPathArg, done.resolve); return done.promise; }; /** * ensures that a directory is in place */ exports.ensureDirSync = function (dirPathArg) { plugins.fs.ensureDirSync(dirPathArg); }; /** * copies a file from A to B on the local disk */ exports.copy = function (fromArg, toArg) { var done = plugins.q.defer(); plugins.fs.copy(fromArg, toArg, {}, function () { done.resolve(); }); return done.promise; }; /** * copies a file SYNCHRONOUSLY from A to B on the local disk */ exports.copySync = function (fromArg, toArg) { plugins.fs.copySync(fromArg, toArg); return true; }; /** * removes a file or folder from local disk */ exports.remove = function (pathArg) { var done = plugins.q.defer(); plugins.fs.remove(pathArg, function () { done.resolve(); }); return done.promise; }; /** * removes a file SYNCHRONOUSLY from local disk */ exports.removeSync = function (pathArg) { plugins.fs.removeSync(pathArg); return true; }; /*=============================================================== ============================ Write/Read ========================= ===============================================================*/ /** * * @param filePathArg * @returns {*} */ exports.toGulpStreamSync = function (filePathArg) { var stream = plugins.gulp.src(filePathArg); return stream; }; exports.toGulpDestSync = function (folderPathArg) { return plugins.gulp.dest(folderPathArg); }; /** * * @param filePathArg * @param fileTypeArg * @returns {any} */ exports.toObjectSync = function (filePathArg, fileTypeArg) { var fileString = plugins.fs.readFileSync(filePathArg, 'utf8'); var fileType; fileTypeArg ? fileType = fileTypeArg : fileType = SmartfileInterpreter.filetype(filePathArg); return SmartfileInterpreter.objectFile(fileString, fileType); }; /** * reads a file content to a String * @param filePath * @returns {string|Buffer|any} */ exports.toStringSync = function (filePath) { var fileString; fileString = plugins.fs.readFileSync(filePath, "utf8"); return fileString; }; /** * * @param filePathArg * @param options * @returns {number} */ exports.toVinylSync = function (filePathArg, options) { if (options === void 0) { options = {}; } return plugins.vinylFile.readSync(filePathArg, options); }; /** * lets you reload files hot. * @param path * @returns {any} */ exports.requireReload = function (path) { return plugins.requireReload(path); }; /** * lists Folders in a directory on local disk * @returns Promise */ exports.listFolders = function (pathArg, regexFilter) { var done = plugins.q.defer(); var folderArray = plugins.fs.readdirSync(pathArg).filter(function (file) { return plugins.fs.statSync(plugins.path.join(pathArg, file)).isDirectory(); }); if (regexFilter) { folderArray = folderArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } done.resolve(folderArray); return done.promise; }; /** * lists Folders SYNCHRONOUSLY in a directory on local disk * @returns an array with the folder names as strings */ exports.listFoldersSync = function (pathArg, regexFilter) { var folderArray = plugins.fs.readdirSync(pathArg).filter(function (file) { return plugins.fs.statSync(plugins.path.join(pathArg, file)).isDirectory(); }); if (regexFilter) { folderArray = folderArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } ; return folderArray; }; /** * lists Files in a directory on local disk * @returns Promise */ exports.listFiles = function (pathArg, regexFilter) { var done = plugins.q.defer(); var fileArray = plugins.fs.readdirSync(pathArg).filter(function (file) { return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile(); }); if (regexFilter) { fileArray = fileArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } ; done.resolve(fileArray); return done.promise; }; /** * lists Files SYNCHRONOUSLY in a directory on local disk * @returns an array with the folder names as strings */ exports.listFilesSync = function (pathArg, regexFilter) { var fileArray = plugins.fs.readdirSync(pathArg).filter(function (file) { return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile(); }); if (regexFilter) { fileArray = fileArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } ; return fileArray; }; /** * lists all items (folders AND files) in a directory on local disk * @returns Promise */ exports.listAllItems = function (pathArg, regexFilter) { var done = plugins.q.defer(); var allItmesArray = plugins.fs.readdirSync(pathArg); if (regexFilter) { allItmesArray = allItmesArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } ; done.resolve(allItmesArray); return done.promise; }; /** * lists all items (folders AND files) SYNCHRONOUSLY in a directory on local disk * @returns an array with the folder names as strings */ exports.listAllItemsSync = function (pathArg, regexFilter) { var allItmesArray = plugins.fs.readdirSync(pathArg).filter(function (file) { return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile(); }); if (regexFilter) { allItmesArray = allItmesArray.filter(function (fileItem) { return regexFilter.test(fileItem); }); } ; return allItmesArray; }; exports.listFileTree = function (dirPath, miniMatchFilter) { var done = plugins.q.defer(); var options = { cwd: dirPath }; plugins.glob(miniMatchFilter, options, function (err, files) { if (err) { console.log(err); done.reject(); } ; done.resolve(files); }); return done.promise; }; //# sourceMappingURL=data:application/json;charset=utf8;base64,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ekIsQ0FBQyxDQUFDO0FBRVMsb0JBQVksR0FBRyxVQUFDLE9BQWMsRUFBRSxlQUFzQjtJQUM3RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLElBQUksT0FBTyxHQUFHO1FBQ1YsR0FBRyxFQUFDLE9BQU87S0FDZCxDQUFBO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUMsT0FBTyxFQUFDLFVBQUMsR0FBRyxFQUFDLEtBQWM7UUFDcEQsRUFBRSxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQztZQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFBQSxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsImZpbGUiOiJzbWFydGZpbGUuZnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJ0eXBpbmdzLWdsb2JhbFwiO1xuXG5pbXBvcnQgcGx1Z2lucyA9IHJlcXVpcmUoXCIuL3NtYXJ0ZmlsZS5wbHVnaW5zXCIpO1xuaW1wb3J0IFNtYXJ0ZmlsZUludGVycHJldGVyID0gcmVxdWlyZShcIi4vc21hcnRmaWxlLmludGVycHJldGVyXCIpO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGVja3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBsZXQgZmlsZUV4aXN0c1N5bmMgPSBmdW5jdGlvbihmaWxlUGF0aCk6Ym9vbGVhbiB7XG4gICAgbGV0IGZpbGVFeGlzdHNCb29sOmJvb2xlYW4gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBwbHVnaW5zLmZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG4gICAgICAgIGZpbGVFeGlzdHNCb29sID0gdHJ1ZVxuICAgIH1cbiAgICBjYXRjaChlcnIpe1xuICAgICAgICBmaWxlRXhpc3RzQm9vbCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZUV4aXN0c0Jvb2w7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBsZXQgZmlsZUV4aXN0cyA9IGZ1bmN0aW9uKGZpbGVQYXRoKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHBsdWdpbnMuZnMuYWNjZXNzKGZpbGVQYXRoLCBwbHVnaW5zLmZzLlJfT0ssIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZXJyID8gZG9uZS5yZWplY3QoKSA6IGRvbmUucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBnaXZlbiBwYXRoIHBvaW50cyB0byBhbiBleGlzdGluZyBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGxldCBpc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKHBhdGhBcmcpOmJvb2xlYW57XG4gICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGF0aEFyZykuaXNEaXJlY3RvcnkoKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gcGF0aCBwb2ludHMgdG8gYW4gZXhpc3RpbmcgZmlsZVxuICovXG5leHBvcnQgbGV0IGlzRmlsZSA9IGZ1bmN0aW9uKHBhdGhBcmcpOmJvb2xlYW57XG4gICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGF0aEFyZykuaXNGaWxlKCk7XG59O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGUyBBQ1RJT05TID09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICogZW5zdXJlcyB0aGF0IGEgZGlyZWN0b3J5IGlzIGluIHBsYWNlXG4gKi9cbmV4cG9ydCBsZXQgZW5zdXJlRGlyID0gKGRpclBhdGhBcmc6c3RyaW5nKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBwbHVnaW5zLmZzLmVuc3VyZURpcihkaXJQYXRoQXJnLGRvbmUucmVzb2x2ZSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBlbnN1cmVzIHRoYXQgYSBkaXJlY3RvcnkgaXMgaW4gcGxhY2VcbiAqL1xuZXhwb3J0IGxldCBlbnN1cmVEaXJTeW5jID0gKGRpclBhdGhBcmc6c3RyaW5nKSA9PiB7XG4gICAgcGx1Z2lucy5mcy5lbnN1cmVEaXJTeW5jKGRpclBhdGhBcmcpO1xufVxuXG4vKipcbiAqIGNvcGllcyBhIGZpbGUgZnJvbSBBIHRvIEIgb24gdGhlIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCBjb3B5ID0gZnVuY3Rpb24oZnJvbUFyZzpzdHJpbmcsIHRvQXJnOnN0cmluZyl7XG4gICAgdmFyIGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBwbHVnaW5zLmZzLmNvcHkoZnJvbUFyZyx0b0FyZyx7fSxmdW5jdGlvbigpe1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBjb3BpZXMgYSBmaWxlIFNZTkNIUk9OT1VTTFkgZnJvbSBBIHRvIEIgb24gdGhlIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCBjb3B5U3luYyA9IGZ1bmN0aW9uKGZyb21Bcmc6c3RyaW5nLHRvQXJnOnN0cmluZyk6Ym9vbGVhbntcbiAgICBwbHVnaW5zLmZzLmNvcHlTeW5jKGZyb21BcmcsdG9BcmcpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbiBcbiAvKipcbiAgKiByZW1vdmVzIGEgZmlsZSBvciBmb2xkZXIgZnJvbSBsb2NhbCBkaXNrXG4gICovXG5leHBvcnQgbGV0IHJlbW92ZSA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nKXtcbiAgICB2YXIgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHBsdWdpbnMuZnMucmVtb3ZlKHBhdGhBcmcsZnVuY3Rpb24oKXtcbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBhIGZpbGUgU1lOQ0hST05PVVNMWSBmcm9tIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCByZW1vdmVTeW5jID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcpOmJvb2xlYW57XG4gICAgcGx1Z2lucy5mcy5yZW1vdmVTeW5jKHBhdGhBcmcpO1xuICAgIHJldHVybiB0cnVlO1xufTtcblxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXcml0ZS9SZWFkID09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBsZXQgdG9HdWxwU3RyZWFtU3luYyA9IGZ1bmN0aW9uKGZpbGVQYXRoQXJnOnN0cmluZyl7XG4gICAgbGV0IHN0cmVhbSA9IHBsdWdpbnMuZ3VscC5zcmMoZmlsZVBhdGhBcmcpO1xuICAgIHJldHVybiBzdHJlYW07XG59O1xuXG5leHBvcnQgbGV0IHRvR3VscERlc3RTeW5jID0gZnVuY3Rpb24oZm9sZGVyUGF0aEFyZzpzdHJpbmcpe1xuICAgIHJldHVybiBwbHVnaW5zLmd1bHAuZGVzdChmb2xkZXJQYXRoQXJnKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHBhcmFtIGZpbGVUeXBlQXJnXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgbGV0IHRvT2JqZWN0U3luYyA9IGZ1bmN0aW9uKGZpbGVQYXRoQXJnLGZpbGVUeXBlQXJnPykge1xuICAgIGxldCBmaWxlU3RyaW5nID0gcGx1Z2lucy5mcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGhBcmcsICd1dGY4Jyk7XG4gICAgbGV0IGZpbGVUeXBlO1xuICAgIGZpbGVUeXBlQXJnID8gZmlsZVR5cGUgPSBmaWxlVHlwZUFyZyA6IGZpbGVUeXBlID0gU21hcnRmaWxlSW50ZXJwcmV0ZXIuZmlsZXR5cGUoZmlsZVBhdGhBcmcpO1xuICAgIHJldHVybiBTbWFydGZpbGVJbnRlcnByZXRlci5vYmplY3RGaWxlKGZpbGVTdHJpbmcsZmlsZVR5cGUpO1xufTtcblxuLyoqXG4gKiByZWFkcyBhIGZpbGUgY29udGVudCB0byBhIFN0cmluZ1xuICogQHBhcmFtIGZpbGVQYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfEJ1ZmZlcnxhbnl9XG4gKi9cbmV4cG9ydCBsZXQgdG9TdHJpbmdTeW5jID0gZnVuY3Rpb24oZmlsZVBhdGgpIHtcbiAgICBsZXQgZmlsZVN0cmluZztcbiAgICBmaWxlU3RyaW5nID0gcGx1Z2lucy5mcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICByZXR1cm4gZmlsZVN0cmluZztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBsZXQgdG9WaW55bFN5bmMgPSBmdW5jdGlvbihmaWxlUGF0aEFyZyxvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gcGx1Z2lucy52aW55bEZpbGUucmVhZFN5bmMoZmlsZVBhdGhBcmcsb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIGxldHMgeW91IHJlbG9hZCBmaWxlcyBob3QuXG4gKiBAcGFyYW0gcGF0aFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGxldCByZXF1aXJlUmVsb2FkID0gZnVuY3Rpb24ocGF0aDpzdHJpbmcpe1xuICAgIHJldHVybiBwbHVnaW5zLnJlcXVpcmVSZWxvYWQocGF0aCk7XG59O1xuXG4vKipcbiAqIGxpc3RzIEZvbGRlcnMgaW4gYSBkaXJlY3Rvcnkgb24gbG9jYWwgZGlza1xuICogQHJldHVybnMgUHJvbWlzZVxuICovXG5leHBvcnQgbGV0IGxpc3RGb2xkZXJzID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcscmVnZXhGaWx0ZXI/OlJlZ0V4cCl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBsZXQgZm9sZGVyQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpLmZpbHRlcihmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHJldHVybiBwbHVnaW5zLmZzLnN0YXRTeW5jKHBsdWdpbnMucGF0aC5qb2luKHBhdGhBcmcsIGZpbGUpKS5pc0RpcmVjdG9yeSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgZm9sZGVyQXJyYXkgPSBmb2xkZXJBcnJheS5maWx0ZXIoKGZpbGVJdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZXhGaWx0ZXIudGVzdChmaWxlSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb25lLnJlc29sdmUoZm9sZGVyQXJyYXkpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG4vKipcbiAqIGxpc3RzIEZvbGRlcnMgU1lOQ0hST05PVVNMWSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBmb2xkZXIgbmFtZXMgYXMgc3RyaW5nc1xuICovXG5leHBvcnQgbGV0IGxpc3RGb2xkZXJzU3luYyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLHJlZ2V4RmlsdGVyPzpSZWdFeHApOnN0cmluZ1tde1xuICAgIGxldCBmb2xkZXJBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRGlyZWN0b3J5KCk7XG4gICAgfSk7XG4gICAgaWYocmVnZXhGaWx0ZXIpe1xuICAgICAgICBmb2xkZXJBcnJheSA9IGZvbGRlckFycmF5LmZpbHRlcigoZmlsZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWdleEZpbHRlci50ZXN0KGZpbGVJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gZm9sZGVyQXJyYXk7XG59O1xuXG5cbi8qKlxuICogbGlzdHMgRmlsZXMgaW4gYSBkaXJlY3Rvcnkgb24gbG9jYWwgZGlza1xuICogQHJldHVybnMgUHJvbWlzZVxuICovXG5leHBvcnQgbGV0IGxpc3RGaWxlcyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLCByZWdleEZpbHRlcj86UmVnRXhwKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCBmaWxlQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpLmZpbHRlcihmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHJldHVybiBwbHVnaW5zLmZzLnN0YXRTeW5jKHBsdWdpbnMucGF0aC5qb2luKHBhdGhBcmcsIGZpbGUpKS5pc0ZpbGUoKTtcbiAgICB9KTtcbiAgICBpZihyZWdleEZpbHRlcil7XG4gICAgICAgIGZpbGVBcnJheSA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGVJdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZXhGaWx0ZXIudGVzdChmaWxlSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgZG9uZS5yZXNvbHZlKGZpbGVBcnJheSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07XG5cbi8qKlxuICogbGlzdHMgRmlsZXMgU1lOQ0hST05PVVNMWSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBmb2xkZXIgbmFtZXMgYXMgc3RyaW5nc1xuICovXG5leHBvcnQgbGV0IGxpc3RGaWxlc1N5bmMgPSBmdW5jdGlvbihwYXRoQXJnOnN0cmluZywgcmVnZXhGaWx0ZXI/OlJlZ0V4cCk6c3RyaW5nW117XG4gICAgbGV0IGZpbGVBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRmlsZSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgZmlsZUFycmF5ID0gZmlsZUFycmF5LmZpbHRlcigoZmlsZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWdleEZpbHRlci50ZXN0KGZpbGVJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZUFycmF5O1xufTtcblxuLyoqXG4gKiBsaXN0cyBhbGwgaXRlbXMgKGZvbGRlcnMgQU5EIGZpbGVzKSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBQcm9taXNlXG4gKi9cbmV4cG9ydCBsZXQgbGlzdEFsbEl0ZW1zID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcsIHJlZ2V4RmlsdGVyPzpSZWdFeHApe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgbGV0IGFsbEl0bWVzQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgYWxsSXRtZXNBcnJheSA9IGFsbEl0bWVzQXJyYXkuZmlsdGVyKChmaWxlSXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4RmlsdGVyLnRlc3QoZmlsZUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRvbmUucmVzb2x2ZShhbGxJdG1lc0FycmF5KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBsaXN0cyBhbGwgaXRlbXMgKGZvbGRlcnMgQU5EIGZpbGVzKSBTWU5DSFJPTk9VU0xZIGluIGEgZGlyZWN0b3J5IG9uIGxvY2FsIGRpc2tcbiAqIEByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGZvbGRlciBuYW1lcyBhcyBzdHJpbmdzXG4gKi9cbmV4cG9ydCBsZXQgbGlzdEFsbEl0ZW1zU3luYyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLCByZWdleEZpbHRlcj86UmVnRXhwKTpzdHJpbmdbXXtcbiAgICBsZXQgYWxsSXRtZXNBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRmlsZSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgYWxsSXRtZXNBcnJheSA9IGFsbEl0bWVzQXJyYXkuZmlsdGVyKChmaWxlSXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4RmlsdGVyLnRlc3QoZmlsZUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBhbGxJdG1lc0FycmF5O1xufTtcblxuZXhwb3J0IGxldCBsaXN0RmlsZVRyZWUgPSAoZGlyUGF0aDpzdHJpbmcsIG1pbmlNYXRjaEZpbHRlcjpzdHJpbmcpID0+IHtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICBjd2Q6ZGlyUGF0aFxuICAgIH1cbiAgICBwbHVnaW5zLmdsb2IobWluaU1hdGNoRmlsdGVyLG9wdGlvbnMsKGVycixmaWxlczpzdHJpbmdbXSkgPT4ge1xuICAgICAgICBpZihlcnIpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIGRvbmUucmVqZWN0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGRvbmUucmVzb2x2ZShmaWxlcyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07Il19