UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

245 lines (243 loc) 25.1 kB
"use strict"; /* * Copyright (c) 2018 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.cleanUpCallbacks = exports.filterObject = exports.sanitizeName = exports.extensionToMime = exports.getMimetype = exports.uniqueId = exports.uniqueTime = exports.removeEmpty = exports.resolveHost = exports.resolveCdnUrl = void 0; var tslib_1 = require("tslib"); var extensions_1 = require("./extensions"); var file_type_1 = require("file-type"); var isutf8_1 = tslib_1.__importDefault(require("isutf8")); /** * Resolve cdn url based on handle type * * @private * @param session session object * @param handle file handle (hash, src://alias, url) */ var resolveCdnUrl = function (session, handle) { var cdnURL = session.urls.cdnUrl; if (handle && (handle.indexOf('src:') === 0 || handle.indexOf('http') === 0)) { if (!session.apikey) { throw new Error('Api key is required when storage alias is provided'); } // apikey is required for alias or external sources call return "".concat(cdnURL, "/").concat(session.apikey); } return cdnURL; }; exports.resolveCdnUrl = resolveCdnUrl; /** * Resolve all urls with provided cnames * * @private * @param urls * @param cname */ var resolveHost = function (urls, cname) { if (!cname) { return urls; } var hosts = /filestackapi.com|filestackcontent.com/i; Object.keys(urls).forEach(function (key) { urls[key] = urls[key].replace(hosts, cname); }); return urls; }; exports.resolveHost = resolveHost; /** * Removes empty options from object * * @private * @param obj */ var removeEmpty = function (obj) { var newObj = tslib_1.__assign({}, obj); Object.keys(newObj).forEach(function (k) { return !newObj[k] && typeof newObj[k] !== 'boolean' && delete newObj[k]; }); return newObj; }; exports.removeEmpty = removeEmpty; /** * Returns unique time */ var last; var uniqueTime = function () { var time = Date.now(); last = time === last ? time + 1 : time; return last; }; exports.uniqueTime = uniqueTime; /** * Generates random string with provided length * * @param len */ var uniqueId = function (len) { if (len === void 0) { len = 10; } return new Array(len).join().replace(/(.|$)/g, function () { return ((Math.random() * 36) | 0).toString(36)[Math.random() < 0.5 ? 'toString' : 'toUpperCase'](); }); }; exports.uniqueId = uniqueId; /** * Check if input is a svg * * @param {Uint8Array | Buffer} file * @returns {string} - mimetype */ var getMimetype = function (file, name) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var type, e_1, excludedMimetypes, mime_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, (0, file_type_1.fromBuffer)(file)]; case 1: type = _a.sent(); return [3 /*break*/, 3]; case 2: e_1 = _a.sent(); console.warn('An exception occurred while processing the buffer:', e_1.message); return [3 /*break*/, 3]; case 3: excludedMimetypes = ['text/plain', 'application/octet-stream', 'application/x-ms', 'application/x-msi', 'application/zip', 'audio/x-m4a']; if (type && excludedMimetypes.indexOf(type.mime) === -1) { return [2 /*return*/, type.mime]; } if (name && name.indexOf('.') > -1) { mime_1 = (0, exports.extensionToMime)(name); if (mime_1) { return [2 /*return*/, mime_1]; } } try { if ((0, isutf8_1.default)(file)) { return [2 /*return*/, 'text/plain']; } } catch (e) { /* istanbul ignore next */ console.warn('Additional mimetype checks (text/plain) are currently not supported for browsers'); } // this is only fallback, omit it in coverage /* istanbul ignore next */ // if we cant find types by extensions and we have magic bytes fallback to it if (type) { return [2 /*return*/, type.mime]; } return [2 /*return*/, 'application/octet-stream']; } }); }); }; exports.getMimetype = getMimetype; /** * Change extension to according mimetype using ext=>mimetype map * * @param ext - string * @return string|boolean */ var extensionToMime = function (ext) { if (!ext || ext.length === 0) { return; } if (ext.split('/').length === 2) { return ext; } if (ext.indexOf('.') > -1) { ext = ext.split('.').pop(); } ext = ext.toLocaleLowerCase(); var keys = Object.keys(extensions_1.ExtensionsMap); var mapLen = keys.length; for (var i = 0; i < mapLen; i++) { if (extensions_1.ExtensionsMap[keys[i]].indexOf(ext) > -1) { return keys[i]; } } return; }; exports.extensionToMime = extensionToMime; /** * Sanitize file name * * @param name * @param {bool} options - enable,disable sanitizer, default enabled * @param {string} options.replacement - replacement for sanitized chars defaults to "-" * @param {string[]} options.exclude - array with excluded chars default - `['\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']` */ var sanitizeName = function (name, options) { if (options === void 0) { options = true; } if (typeof options === 'boolean' && !options) { return name; } var ext; var replacement = typeof options !== 'boolean' && options.replacement ? options.replacement : '-'; var exclude = typeof options !== 'boolean' && options.exclude ? options.exclude : ['\\', '{', '}', '|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']; if (!name || name.length === 0) { return 'undefined'; } var fileParts = name.split('.'); if (fileParts.length > 1) { ext = fileParts.pop(); } return "".concat(fileParts .join('.') .split('') .map(function (char) { return (exclude.indexOf(char) > -1 ? replacement : char); }) .join('')).concat(ext ? '.' + ext : ''); }; exports.sanitizeName = sanitizeName; /** * Filter object to given fields * * @param toFilter * @param requiredFields */ var filterObject = function (toFilter, requiredFields) { if (!requiredFields || requiredFields.length === 0) { return toFilter; } if (Object.keys(toFilter).length === 0) { return toFilter; } return Object.keys(toFilter) .filter(function (f) { return requiredFields.indexOf(f) > -1; }) .reduce(function (obj, key) { var _a; return (tslib_1.__assign(tslib_1.__assign({}, obj), (_a = {}, _a[key] = toFilter[key], _a))); }, {}); }; exports.filterObject = filterObject; /** * Deep cleanup object from functions * * @param obj */ var cleanUpCallbacks = function (obj) { if (!obj || Object.keys(obj).length === 0) { return obj; } Object.keys(obj).forEach(function (k) { if (typeof obj[k] === 'function') { obj[k] = undefined; } if (obj[k] === Object(obj[k])) { obj[k] = (0, exports.cleanUpCallbacks)(obj[k]); } }); return obj; }; exports.cleanUpCallbacks = cleanUpCallbacks; tslib_1.__exportStar(require("./index.node"), exports); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUlILDJDQUE2QztBQUM3Qyx1Q0FBdUM7QUFDdkMsMERBQTRCO0FBRTVCOzs7Ozs7R0FNRztBQUNJLElBQU0sYUFBYSxHQUFHLFVBQUMsT0FBZ0IsRUFBRSxNQUFjO0lBQzVELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRW5DLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCx3REFBd0Q7UUFDeEQsT0FBTyxVQUFHLE1BQU0sY0FBSSxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUM7S0FDdEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFiVyxRQUFBLGFBQWEsaUJBYXhCO0FBRUY7Ozs7OztHQU1HO0FBQ0ksSUFBTSxXQUFXLEdBQUcsVUFBQyxJQUFXLEVBQUUsS0FBYTtJQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQU0sS0FBSyxHQUFHLHdDQUF3QyxDQUFDO0lBRXZELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFF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O0tBQ1o7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7UUFDeEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztTQUNwQjtRQUVELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBQSx3QkFBZ0IsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFoQlcsUUFBQSxnQkFBZ0Isb0JBZ0IzQjtBQUVGLHVEQUE2QiIsImZpbGUiOiJsaWIvdXRpbHMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTZXNzaW9uIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IEhvc3RzIH0gZnJvbSAnLi8uLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc01hcCB9IGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBmcm9tQnVmZmVyIH0gZnJvbSAnZmlsZS10eXBlJztcbmltcG9ydCBpc3V0ZjggZnJvbSAnaXN1dGY4JztcblxuLyoqXG4gKiBSZXNvbHZlIGNkbiB1cmwgYmFzZWQgb24gaGFuZGxlIHR5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHNlc3Npb24gc2Vzc2lvbiBvYmplY3RcbiAqIEBwYXJhbSBoYW5kbGUgZmlsZSBoYW5kbGUgKGhhc2gsIHNyYzovL2FsaWFzLCB1cmwpXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQ2RuVXJsID0gKHNlc3Npb246IFNlc3Npb24sIGhhbmRsZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2RuVVJMID0gc2Vzc2lvbi51cmxzLmNkblVybDtcblxuICBpZiAoaGFuZGxlICYmIChoYW5kbGUuaW5kZXhPZignc3JjOicpID09PSAwIHx8IGhhbmRsZS5pbmRleE9mKCdodHRwJykgPT09IDApKSB7XG4gICAgaWYgKCFzZXNzaW9uLmFwaWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcGkga2V5IGlzIHJlcXVpcmVkIHdoZW4gc3RvcmFnZSBhbGlhcyBpcyBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIC8vIGFwaWtleSBpcyByZXF1aXJlZCBmb3IgYWxpYXMgb3IgZXh0ZXJuYWwgc291cmNlcyBjYWxsXG4gICAgcmV0dXJuIGAke2NkblVSTH0vJHtzZXNzaW9uLmFwaWtleX1gO1xuICB9XG5cbiAgcmV0dXJuIGNkblVSTDtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBhbGwgdXJscyB3aXRoIHByb3ZpZGVkIGNuYW1lc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gdXJsc1xuICogQHBhcmFtIGNuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlSG9zdCA9ICh1cmxzOiBIb3N0cywgY25hbWU6IHN0cmluZyk6IEhvc3RzID0+IHtcbiAgaWYgKCFjbmFtZSkge1xuICAgIHJldHVybiB1cmxzO1xuICB9XG5cbiAgY29uc3QgaG9zdHMgPSAvZmlsZXN0YWNrYXBpLmNvbXxmaWxlc3RhY2tjb250ZW50LmNvbS9pO1xuXG4gIE9iamVjdC5rZXlzKHVybHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICB1cmxzW2tleV0gPSB1cmxzW2tleV0ucmVwbGFjZShob3N0cywgY25hbWUpO1xuICB9KTtcblxuICByZXR1cm4gdXJscztcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBlbXB0eSBvcHRpb25zIGZyb20gb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvYmpcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUVtcHR5ID0gKG9iajogYW55KSA9PiB7XG4gIGNvbnN0IG5ld09iaiA9IHsgLi4ub2JqIH07XG4gIE9iamVjdC5rZXlzKG5ld09iaikuZm9yRWFjaChrID0+ICFuZXdPYmpba10gJiYgdHlwZW9mIG5ld09ialtrXSAhPT0gJ2Jvb2xlYW4nICYmIGRlbGV0ZSBuZXdPYmpba10pO1xuICByZXR1cm4gbmV3T2JqO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHVuaXF1ZSB0aW1lXG4gKi9cbmxldCBsYXN0O1xuZXhwb3J0IGNvbnN0IHVuaXF1ZVRpbWUgPSAoKSA9PiB7XG4gIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICBsYXN0ID0gdGltZSA9PT0gbGFzdCA/IHRpbWUgKyAxIDogdGltZTtcbiAgcmV0dXJuIGxhc3Q7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyByYW5kb20gc3RyaW5nIHdpdGggcHJvdmlkZWQgbGVuZ3RoXG4gKlxuICogQHBhcmFtIGxlblxuICovXG5leHBvcnQgY29uc3QgdW5pcXVlSWQgPSAobGVuOiBudW1iZXIgPSAxMCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBuZXcgQXJyYXkobGVuKS5qb2luKCkucmVwbGFjZSgvKC58JCkvZywgKCkgPT4gKChNYXRoLnJhbmRvbSgpICogMzYpIHwgMCkudG9TdHJpbmcoMzYpW01hdGgucmFuZG9tKCkgPCAwLjUgPyAndG9TdHJpbmcnIDogJ3RvVXBwZXJDYXNlJ10oKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGlucHV0IGlzIGEgc3ZnXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5IHwgQnVmZmVyfSBmaWxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIG1pbWV0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaW1ldHlwZSA9IGFzeW5jIChmaWxlOiBVaW50OEFycmF5IHwgQnVmZmVyLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgbGV0IHR5cGU7XG5cbiAgdHJ5IHtcbiAgICB0eXBlID0gYXdhaXQgZnJvbUJ1ZmZlcihmaWxlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlcjonLCBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWRNaW1ldHlwZXMgPSBbJ3RleHQvcGxhaW4nLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2FwcGxpY2F0aW9uL3gtbXMnLCAnYXBwbGljYXRpb24veC1tc2knLCAnYXBwbGljYXRpb24vemlwJywgJ2F1ZGlvL3gtbTRhJ107XG5cbiAgaWYgKHR5cGUgJiYgZXhjbHVkZWRNaW1ldHlwZXMuaW5kZXhPZih0eXBlLm1pbWUpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlLm1pbWU7XG4gIH1cblxuICBpZiAobmFtZSAmJiBuYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgY29uc3QgbWltZSA9IGV4dGVuc2lvblRvTWltZShuYW1lKTtcblxuICAgIGlmIChtaW1lKSB7XG4gICAgICByZXR1cm4gbWltZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChpc3V0ZjgoZmlsZSkpIHtcbiAgICAgIHJldHVybiAndGV4dC9wbGFpbic7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zb2xlLndhcm4oJ0FkZGl0aW9uYWwgbWltZXR5cGUgY2hlY2tzICh0ZXh0L3BsYWluKSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIGJyb3dzZXJzJyk7XG4gIH1cbiAgLy8gdGhpcyBpcyBvbmx5IGZhbGxiYWNrLCBvbWl0IGl0IGluIGNvdmVyYWdlXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgLy8gaWYgd2UgY2FudCBmaW5kIHR5cGVzIGJ5IGV4dGVuc2lvbnMgYW5kIHdlIGhhdmUgbWFnaWMgYnl0ZXMgZmFsbGJhY2sgdG8gaXRcbiAgaWYgKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZS5taW1lO1xuICB9XG5cbiAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgZXh0ZW5zaW9uIHRvIGFjY29yZGluZyBtaW1ldHlwZSB1c2luZyBleHQ9Pm1pbWV0eXBlIG1hcFxuICpcbiAqIEBwYXJhbSBleHQgLSBzdHJpbmdcbiAqIEByZXR1cm4gc3RyaW5nfGJvb2xlYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvblRvTWltZSA9IChleHQ6IHN0cmluZykgPT4ge1xuICBpZiAoIWV4dCB8fCBleHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4dC5zcGxpdCgnLycpLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBleHQ7XG4gIH1cblxuICBpZiAoZXh0LmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgZXh0ID0gZXh0LnNwbGl0KCcuJykucG9wKCk7XG4gIH1cblxuICBleHQgPSBleHQudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoRXh0ZW5zaW9uc01hcCk7XG4gIGNvbnN0IG1hcExlbiA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwTGVuOyBpKyspIHtcbiAgICBpZiAoRXh0ZW5zaW9uc01hcFtrZXlzW2ldXS5pbmRleE9mKGV4dCkgPiAtMSkge1xuICAgICAgcmV0dXJuIGtleXNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcblxuLyoqXG4gKiBTYW5pdGl6ZXIgT3B0aW9uc1xuICovXG5leHBvcnQgdHlwZSBTYW5pdGl6ZU9wdGlvbnMgPVxuICB8IGJvb2xlYW5cbiAgfCB7XG4gICAgICBleGNsdWRlPzogc3RyaW5nW107XG4gICAgICByZXBsYWNlbWVudD86IHN0cmluZztcbiAgICB9O1xuXG4vKipcbiAqIFNhbml0aXplIGZpbGUgbmFtZVxuICpcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2x9IG9wdGlvbnMgIC0gZW5hYmxlLGRpc2FibGUgc2FuaXRpemVyLCBkZWZhdWx0IGVuYWJsZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnJlcGxhY2VtZW50IC0gcmVwbGFjZW1lbnQgZm9yIHNhbml0aXplZCBjaGFycyBkZWZhdWx0cyB0byBcIi1cIlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9ucy5leGNsdWRlIC0gYXJyYXkgd2l0aCBleGNsdWRlZCBjaGFycyBkZWZhdWx0IC0gYFsnXFwnLCAneycsICd9JywnfCcsICclJywgJ2AnLCAnXCInLCBcIidcIiwgJ34nLCAnWycsICddJywgJyMnLCAnfCcsICdeJywgJzwnLCAnPiddYFxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemVOYW1lID0gKG5hbWU6IHN0cmluZywgb3B0aW9uczogU2FuaXRpemVPcHRpb25zID0gdHJ1ZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICBsZXQgZXh0O1xuXG4gIGNvbnN0IHJlcGxhY2VtZW50ID0gdHlwZW9mIG9wdGlvbnMgIT09ICdib29sZWFuJyAmJiBvcHRpb25zLnJlcGxhY2VtZW50ID8gb3B0aW9ucy5yZXBsYWNlbWVudCA6ICctJztcbiAgY29uc3QgZXhjbHVkZSA9IHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5leGNsdWRlID8gb3B0aW9ucy5leGNsdWRlIDogWydcXFxcJywgJ3snLCAnfScsICd8JywgJyUnLCAnYCcsICdcIicsIFwiJ1wiLCAnficsICdbJywgJ10nLCAnIycsICd8JywgJ14nLCAnPCcsICc+J107XG5cbiAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhcnRzID0gbmFtZS5zcGxpdCgnLicpO1xuXG4gIGlmIChmaWxlUGFydHMubGVuZ3RoID4gMSkge1xuICAgIGV4dCA9IGZpbGVQYXJ0cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBgJHtmaWxlUGFydHNcbiAgICAuam9pbignLicpXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoY2hhciA9PiAoZXhjbHVkZS5pbmRleE9mKGNoYXIpID4gLTEgPyByZXBsYWNlbWVudCA6IGNoYXIpKVxuICAgIC5qb2luKCcnKX0ke2V4dCA/ICcuJyArIGV4dCA6ICcnfWA7XG59O1xuXG4vKipcbiAqIEZpbHRlciBvYmplY3QgdG8gZ2l2ZW4gZmllbGRzXG4gKlxuICogQHBhcmFtIHRvRmlsdGVyXG4gKiBAcGFyYW0gcmVxdWlyZWRGaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlck9iamVjdCA9ICh0b0ZpbHRlciwgcmVxdWlyZWRGaWVsZHM6IHN0cmluZ1tdKSA9PiB7XG4gIGlmICghcmVxdWlyZWRGaWVsZHMgfHwgcmVxdWlyZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRvRmlsdGVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRvRmlsdGVyKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdG9GaWx0ZXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXModG9GaWx0ZXIpXG4gICAgLmZpbHRlcihmID0+IHJlcXVpcmVkRmllbGRzLmluZGV4T2YoZikgPiAtMSlcbiAgICAucmVkdWNlKChvYmosIGtleSkgPT4gKHsgLi4ub2JqLCBba2V5XTogdG9GaWx0ZXJba2V5XSB9KSwge30pO1xufTtcblxuLyoqXG4gKiBEZWVwIGNsZWFudXAgb2JqZWN0IGZyb20gZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtIG9ialxuICovXG5leHBvcnQgY29uc3QgY2xlYW5VcENhbGxiYWNrcyA9IChvYmo6IGFueSkgPT4ge1xuICBpZiAoIW9iaiB8fCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9ialtrXSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAob2JqW2tdID09PSBPYmplY3Qob2JqW2tdKSkge1xuICAgICAgb2JqW2tdID0gY2xlYW5VcENhbGxiYWNrcyhvYmpba10pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgubm9kZSc7XG4iXX0=