filestack-js
Version:
Official JavaScript library for Filestack
232 lines (230 loc) • 24.2 kB
JavaScript
/*
* 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.
*/
import { __assign, __awaiter, __generator } from "tslib";
import { ExtensionsMap } from './extensions';
import { fromBuffer } from 'file-type';
import isutf8 from 'isutf8';
/**
* Resolve cdn url based on handle type
*
* @private
* @param session session object
* @param handle file handle (hash, src://alias, url)
*/
export 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;
};
/**
* Resolve all urls with provided cnames
*
* @private
* @param urls
* @param cname
*/
export 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;
};
/**
* Removes empty options from object
*
* @private
* @param obj
*/
export var removeEmpty = function (obj) {
var newObj = __assign({}, obj);
Object.keys(newObj).forEach(function (k) { return !newObj[k] && typeof newObj[k] !== 'boolean' && delete newObj[k]; });
return newObj;
};
/**
* Returns unique time
*/
var last;
export var uniqueTime = function () {
var time = Date.now();
last = time === last ? time + 1 : time;
return last;
};
/**
* Generates random string with provided length
*
* @param len
*/
export 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'](); });
};
/**
* Check if input is a svg
*
* @param {Uint8Array | Buffer} file
* @returns {string} - mimetype
*/
export var getMimetype = function (file, name) { return __awaiter(void 0, void 0, void 0, function () {
var type, e_1, excludedMimetypes, mime_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, 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'];
if (type && excludedMimetypes.indexOf(type.mime) === -1) {
return [2 /*return*/, type.mime];
}
if (name && name.indexOf('.') > -1) {
mime_1 = extensionToMime(name);
if (mime_1) {
return [2 /*return*/, mime_1];
}
}
try {
if (isutf8(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'];
}
});
}); };
/**
* Change extension to according mimetype using ext=>mimetype map
*
* @param ext - string
* @return string|boolean
*/
export 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(ExtensionsMap);
var mapLen = keys.length;
for (var i = 0; i < mapLen; i++) {
if (ExtensionsMap[keys[i]].indexOf(ext) > -1) {
return keys[i];
}
}
return;
};
/**
* 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 - `['\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']`
*/
export 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 : '');
};
/**
* Filter object to given fields
*
* @param toFilter
* @param requiredFields
*/
export 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 (__assign(__assign({}, obj), (_a = {}, _a[key] = toFilter[key], _a)));
}, {});
};
/**
* Deep cleanup object from functions
*
* @param obj
*/
export 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] = cleanUpCallbacks(obj[k]);
}
});
return obj;
};
export * from './index.node';
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQUlILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLElBQU0sYUFBYSxHQUFHLFVBQUMsT0FBZ0IsRUFBRSxNQUFjO0lBQzVELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRW5DLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCx3REFBd0Q7UUFDeEQsT0FBTyxVQUFHLE1BQU0sY0FBSSxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUM7S0FDdEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsSUFBTSxXQUFXLEdBQUcsVUFBQyxJQUFXLEVBQUUsS0FBYTtJQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQU0sS0FBSyxHQUFHLHdDQUF3QyxDQUFDO0lBRXZELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcs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QUEsQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixjQUFjLGNBQWMsQ0FBQyIsImZpbGUiOiJsaWIvdXRpbHMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTZXNzaW9uIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IEhvc3RzIH0gZnJvbSAnLi8uLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc01hcCB9IGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBmcm9tQnVmZmVyIH0gZnJvbSAnZmlsZS10eXBlJztcbmltcG9ydCBpc3V0ZjggZnJvbSAnaXN1dGY4JztcblxuLyoqXG4gKiBSZXNvbHZlIGNkbiB1cmwgYmFzZWQgb24gaGFuZGxlIHR5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHNlc3Npb24gc2Vzc2lvbiBvYmplY3RcbiAqIEBwYXJhbSBoYW5kbGUgZmlsZSBoYW5kbGUgKGhhc2gsIHNyYzovL2FsaWFzLCB1cmwpXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQ2RuVXJsID0gKHNlc3Npb246IFNlc3Npb24sIGhhbmRsZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2RuVVJMID0gc2Vzc2lvbi51cmxzLmNkblVybDtcblxuICBpZiAoaGFuZGxlICYmIChoYW5kbGUuaW5kZXhPZignc3JjOicpID09PSAwIHx8IGhhbmRsZS5pbmRleE9mKCdodHRwJykgPT09IDApKSB7XG4gICAgaWYgKCFzZXNzaW9uLmFwaWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcGkga2V5IGlzIHJlcXVpcmVkIHdoZW4gc3RvcmFnZSBhbGlhcyBpcyBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIC8vIGFwaWtleSBpcyByZXF1aXJlZCBmb3IgYWxpYXMgb3IgZXh0ZXJuYWwgc291cmNlcyBjYWxsXG4gICAgcmV0dXJuIGAke2NkblVSTH0vJHtzZXNzaW9uLmFwaWtleX1gO1xuICB9XG5cbiAgcmV0dXJuIGNkblVSTDtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBhbGwgdXJscyB3aXRoIHByb3ZpZGVkIGNuYW1lc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gdXJsc1xuICogQHBhcmFtIGNuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlSG9zdCA9ICh1cmxzOiBIb3N0cywgY25hbWU6IHN0cmluZyk6IEhvc3RzID0+IHtcbiAgaWYgKCFjbmFtZSkge1xuICAgIHJldHVybiB1cmxzO1xuICB9XG5cbiAgY29uc3QgaG9zdHMgPSAvZmlsZXN0YWNrYXBpLmNvbXxmaWxlc3RhY2tjb250ZW50LmNvbS9pO1xuXG4gIE9iamVjdC5rZXlzKHVybHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICB1cmxzW2tleV0gPSB1cmxzW2tleV0ucmVwbGFjZShob3N0cywgY25hbWUpO1xuICB9KTtcblxuICByZXR1cm4gdXJscztcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBlbXB0eSBvcHRpb25zIGZyb20gb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvYmpcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUVtcHR5ID0gKG9iajogYW55KSA9PiB7XG4gIGNvbnN0IG5ld09iaiA9IHsgLi4ub2JqIH07XG4gIE9iamVjdC5rZXlzKG5ld09iaikuZm9yRWFjaChrID0+ICFuZXdPYmpba10gJiYgdHlwZW9mIG5ld09ialtrXSAhPT0gJ2Jvb2xlYW4nICYmIGRlbGV0ZSBuZXdPYmpba10pO1xuICByZXR1cm4gbmV3T2JqO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHVuaXF1ZSB0aW1lXG4gKi9cbmxldCBsYXN0O1xuZXhwb3J0IGNvbnN0IHVuaXF1ZVRpbWUgPSAoKSA9PiB7XG4gIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICBsYXN0ID0gdGltZSA9PT0gbGFzdCA/IHRpbWUgKyAxIDogdGltZTtcbiAgcmV0dXJuIGxhc3Q7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyByYW5kb20gc3RyaW5nIHdpdGggcHJvdmlkZWQgbGVuZ3RoXG4gKlxuICogQHBhcmFtIGxlblxuICovXG5leHBvcnQgY29uc3QgdW5pcXVlSWQgPSAobGVuOiBudW1iZXIgPSAxMCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBuZXcgQXJyYXkobGVuKS5qb2luKCkucmVwbGFjZSgvKC58JCkvZywgKCkgPT4gKChNYXRoLnJhbmRvbSgpICogMzYpIHwgMCkudG9TdHJpbmcoMzYpW01hdGgucmFuZG9tKCkgPCAwLjUgPyAndG9TdHJpbmcnIDogJ3RvVXBwZXJDYXNlJ10oKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGlucHV0IGlzIGEgc3ZnXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5IHwgQnVmZmVyfSBmaWxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIG1pbWV0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNaW1ldHlwZSA9IGFzeW5jKGZpbGU6IFVpbnQ4QXJyYXkgfCBCdWZmZXIsIG5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBsZXQgdHlwZTtcblxuICB0cnkge1xuICAgIHR5cGUgPSBhd2FpdCBmcm9tQnVmZmVyKGZpbGUpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLndhcm4oXCJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgYnVmZmVyOlwiLCBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWRNaW1ldHlwZXMgPSBbJ3RleHQvcGxhaW4nLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2FwcGxpY2F0aW9uL3gtbXMnLCAnYXBwbGljYXRpb24veC1tc2knLCAnYXBwbGljYXRpb24vemlwJ107XG5cbiAgaWYgKHR5cGUgJiYgZXhjbHVkZWRNaW1ldHlwZXMuaW5kZXhPZih0eXBlLm1pbWUpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlLm1pbWU7XG4gIH1cblxuICBpZiAobmFtZSAmJiBuYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgY29uc3QgbWltZSA9IGV4dGVuc2lvblRvTWltZShuYW1lKTtcblxuICAgIGlmIChtaW1lKSB7XG4gICAgICByZXR1cm4gbWltZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChpc3V0ZjgoZmlsZSkpIHtcbiAgICAgIHJldHVybiAndGV4dC9wbGFpbic7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zb2xlLndhcm4oJ0FkZGl0aW9uYWwgbWltZXR5cGUgY2hlY2tzICh0ZXh0L3BsYWluKSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIGJyb3dzZXJzJyk7XG4gIH1cbiAgLy8gdGhpcyBpcyBvbmx5IGZhbGxiYWNrLCBvbWl0IGl0IGluIGNvdmVyYWdlXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgLy8gaWYgd2UgY2FudCBmaW5kIHR5cGVzIGJ5IGV4dGVuc2lvbnMgYW5kIHdlIGhhdmUgbWFnaWMgYnl0ZXMgZmFsbGJhY2sgdG8gaXRcbiAgaWYgKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZS5taW1lO1xuICB9XG5cbiAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgZXh0ZW5zaW9uIHRvIGFjY29yZGluZyBtaW1ldHlwZSB1c2luZyBleHQ9Pm1pbWV0eXBlIG1hcFxuICpcbiAqIEBwYXJhbSBleHQgLSBzdHJpbmdcbiAqIEByZXR1cm4gc3RyaW5nfGJvb2xlYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvblRvTWltZSA9IChleHQ6IHN0cmluZykgPT4ge1xuICBpZiAoIWV4dCB8fCBleHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4dC5zcGxpdCgnLycpLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBleHQ7XG4gIH1cblxuICBpZiAoZXh0LmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgZXh0ID0gZXh0LnNwbGl0KCcuJykucG9wKCk7XG4gIH1cblxuICBleHQgPSBleHQudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoRXh0ZW5zaW9uc01hcCk7XG4gIGNvbnN0IG1hcExlbiA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwTGVuOyBpKyspIHtcbiAgICBpZiAoRXh0ZW5zaW9uc01hcFtrZXlzW2ldXS5pbmRleE9mKGV4dCkgPiAtMSkge1xuICAgICAgcmV0dXJuIGtleXNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcblxuLyoqXG4gKiBTYW5pdGl6ZXIgT3B0aW9uc1xuICovXG5leHBvcnQgdHlwZSBTYW5pdGl6ZU9wdGlvbnMgPVxuICB8IGJvb2xlYW5cbiAgfCB7XG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAgIHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuICB9O1xuXG4vKipcbiAqIFNhbml0aXplIGZpbGUgbmFtZVxuICpcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2x9IG9wdGlvbnMgIC0gZW5hYmxlLGRpc2FibGUgc2FuaXRpemVyLCBkZWZhdWx0IGVuYWJsZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnJlcGxhY2VtZW50IC0gcmVwbGFjZW1lbnQgZm9yIHNhbml0aXplZCBjaGFycyBkZWZhdWx0cyB0byBcIi1cIlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9ucy5leGNsdWRlIC0gYXJyYXkgd2l0aCBleGNsdWRlZCBjaGFycyBkZWZhdWx0IC0gYFsnXFwnLCAneycsICd9JywnfCcsICclJywgJ2AnLCAnXCInLCBcIidcIiwgJ34nLCAnWycsICddJywgJyMnLCAnfCcsICdeJywgJzwnLCAnPiddYFxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemVOYW1lID0gKG5hbWU6IHN0cmluZywgb3B0aW9uczogU2FuaXRpemVPcHRpb25zID0gdHJ1ZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICBsZXQgZXh0O1xuXG4gIGNvbnN0IHJlcGxhY2VtZW50ID0gdHlwZW9mIG9wdGlvbnMgIT09ICdib29sZWFuJyAmJiBvcHRpb25zLnJlcGxhY2VtZW50ID8gb3B0aW9ucy5yZXBsYWNlbWVudCA6ICctJztcbiAgY29uc3QgZXhjbHVkZSA9IHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5leGNsdWRlID8gb3B0aW9ucy5leGNsdWRlIDogWydcXFxcJywgJ3snLCAnfScsICd8JywgJyUnLCAnYCcsICdcIicsIFwiJ1wiLCAnficsICdbJywgJ10nLCAnIycsICd8JywgJ14nLCAnPCcsICc+J107XG5cbiAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhcnRzID0gbmFtZS5zcGxpdCgnLicpO1xuXG4gIGlmIChmaWxlUGFydHMubGVuZ3RoID4gMSkge1xuICAgIGV4dCA9IGZpbGVQYXJ0cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBgJHtmaWxlUGFydHNcbiAgICAuam9pbignLicpXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoY2hhciA9PiAoZXhjbHVkZS5pbmRleE9mKGNoYXIpID4gLTEgPyByZXBsYWNlbWVudCA6IGNoYXIpKVxuICAgIC5qb2luKCcnKX0ke2V4dCA/ICcuJyArIGV4dCA6ICcnfWA7XG59O1xuXG4vKipcbiAqIEZpbHRlciBvYmplY3QgdG8gZ2l2ZW4gZmllbGRzXG4gKlxuICogQHBhcmFtIHRvRmlsdGVyXG4gKiBAcGFyYW0gcmVxdWlyZWRGaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlck9iamVjdCA9ICh0b0ZpbHRlciwgcmVxdWlyZWRGaWVsZHM6IHN0cmluZ1tdKSA9PiB7XG4gIGlmICghcmVxdWlyZWRGaWVsZHMgfHwgcmVxdWlyZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRvRmlsdGVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRvRmlsdGVyKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdG9GaWx0ZXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXModG9GaWx0ZXIpXG4gICAgLmZpbHRlcihmID0+IHJlcXVpcmVkRmllbGRzLmluZGV4T2YoZikgPiAtMSlcbiAgICAucmVkdWNlKChvYmosIGtleSkgPT4gKHsgLi4ub2JqLCBba2V5XTogdG9GaWx0ZXJba2V5XSB9KSwge30pO1xufTtcblxuLyoqXG4gKiBEZWVwIGNsZWFudXAgb2JqZWN0IGZyb20gZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtIG9ialxuICovXG5leHBvcnQgY29uc3QgY2xlYW5VcENhbGxiYWNrcyA9IChvYmo6IGFueSkgPT4ge1xuICBpZiAoIW9iaiB8fCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9ialtrXSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAob2JqW2tdID09PSBPYmplY3Qob2JqW2tdKSkge1xuICAgICAgb2JqW2tdID0gY2xlYW5VcENhbGxiYWNrcyhvYmpba10pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgubm9kZSc7XG4iXX0=