filestack-js
Version:
Official JavaScript library for Filestack
232 lines (230 loc) • 24.3 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', 'audio/x-m4a'];
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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QU8sQ0FBQyxVQUFBLENBQUM7UUFDeEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztTQUNwQjtRQUVELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsY0FBYyxjQUFjLENBQUMiLCJmaWxlIjoibGliL3V0aWxzL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOCBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgeyBIb3N0cyB9IGZyb20gJy4vLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IEV4dGVuc2lvbnNNYXAgfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IHsgZnJvbUJ1ZmZlciB9IGZyb20gJ2ZpbGUtdHlwZSc7XG5pbXBvcnQgaXN1dGY4IGZyb20gJ2lzdXRmOCc7XG5cbi8qKlxuICogUmVzb2x2ZSBjZG4gdXJsIGJhc2VkIG9uIGhhbmRsZSB0eXBlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzZXNzaW9uIHNlc3Npb24gb2JqZWN0XG4gKiBAcGFyYW0gaGFuZGxlIGZpbGUgaGFuZGxlIChoYXNoLCBzcmM6Ly9hbGlhcywgdXJsKVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNkblVybCA9IChzZXNzaW9uOiBTZXNzaW9uLCBoYW5kbGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNkblVSTCA9IHNlc3Npb24udXJscy5jZG5Vcmw7XG5cbiAgaWYgKGhhbmRsZSAmJiAoaGFuZGxlLmluZGV4T2YoJ3NyYzonKSA9PT0gMCB8fCBoYW5kbGUuaW5kZXhPZignaHR0cCcpID09PSAwKSkge1xuICAgIGlmICghc2Vzc2lvbi5hcGlrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXBpIGtleSBpcyByZXF1aXJlZCB3aGVuIHN0b3JhZ2UgYWxpYXMgaXMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBhcGlrZXkgaXMgcmVxdWlyZWQgZm9yIGFsaWFzIG9yIGV4dGVybmFsIHNvdXJjZXMgY2FsbFxuICAgIHJldHVybiBgJHtjZG5VUkx9LyR7c2Vzc2lvbi5hcGlrZXl9YDtcbiAgfVxuXG4gIHJldHVybiBjZG5VUkw7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgYWxsIHVybHMgd2l0aCBwcm92aWRlZCBjbmFtZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHVybHNcbiAqIEBwYXJhbSBjbmFtZVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhvc3QgPSAodXJsczogSG9zdHMsIGNuYW1lOiBzdHJpbmcpOiBIb3N0cyA9PiB7XG4gIGlmICghY25hbWUpIHtcbiAgICByZXR1cm4gdXJscztcbiAgfVxuXG4gIGNvbnN0IGhvc3RzID0gL2ZpbGVzdGFja2FwaS5jb218ZmlsZXN0YWNrY29udGVudC5jb20vaTtcblxuICBPYmplY3Qua2V5cyh1cmxzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgdXJsc1trZXldID0gdXJsc1trZXldLnJlcGxhY2UoaG9zdHMsIGNuYW1lKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHVybHM7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgZW1wdHkgb3B0aW9ucyBmcm9tIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gb2JqXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVFbXB0eSA9IChvYmo6IGFueSkgPT4ge1xuICBjb25zdCBuZXdPYmogPSB7IC4uLm9iaiB9O1xuICBPYmplY3Qua2V5cyhuZXdPYmopLmZvckVhY2goayA9PiAhbmV3T2JqW2tdICYmIHR5cGVvZiBuZXdPYmpba10gIT09ICdib29sZWFuJyAmJiBkZWxldGUgbmV3T2JqW2tdKTtcbiAgcmV0dXJuIG5ld09iajtcbn07XG5cbi8qKlxuICogUmV0dXJucyB1bmlxdWUgdGltZVxuICovXG5sZXQgbGFzdDtcbmV4cG9ydCBjb25zdCB1bmlxdWVUaW1lID0gKCkgPT4ge1xuICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgbGFzdCA9IHRpbWUgPT09IGxhc3QgPyB0aW1lICsgMSA6IHRpbWU7XG4gIHJldHVybiBsYXN0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgcmFuZG9tIHN0cmluZyB3aXRoIHByb3ZpZGVkIGxlbmd0aFxuICpcbiAqIEBwYXJhbSBsZW5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXF1ZUlkID0gKGxlbjogbnVtYmVyID0gMTApOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gbmV3IEFycmF5KGxlbikuam9pbigpLnJlcGxhY2UoLygufCQpL2csICgpID0+ICgoTWF0aC5yYW5kb20oKSAqIDM2KSB8IDApLnRvU3RyaW5nKDM2KVtNYXRoLnJhbmRvbSgpIDwgMC41ID8gJ3RvU3RyaW5nJyA6ICd0b1VwcGVyQ2FzZSddKCkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBpbnB1dCBpcyBhIHN2Z1xuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheSB8IEJ1ZmZlcn0gZmlsZVxuICogQHJldHVybnMge3N0cmluZ30gLSBtaW1ldHlwZVxuICovXG5leHBvcnQgY29uc3QgZ2V0TWltZXR5cGUgPSBhc3luYyAoZmlsZTogVWludDhBcnJheSB8IEJ1ZmZlciwgbmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGxldCB0eXBlO1xuXG4gIHRyeSB7XG4gICAgdHlwZSA9IGF3YWl0IGZyb21CdWZmZXIoZmlsZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ0FuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBidWZmZXI6JywgZS5tZXNzYWdlKTtcbiAgfVxuXG4gIGNvbnN0IGV4Y2x1ZGVkTWltZXR5cGVzID0gWyd0ZXh0L3BsYWluJywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdhcHBsaWNhdGlvbi94LW1zJywgJ2FwcGxpY2F0aW9uL3gtbXNpJywgJ2FwcGxpY2F0aW9uL3ppcCcsICdhdWRpby94LW00YSddO1xuXG4gIGlmICh0eXBlICYmIGV4Y2x1ZGVkTWltZXR5cGVzLmluZGV4T2YodHlwZS5taW1lKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZS5taW1lO1xuICB9XG5cbiAgaWYgKG5hbWUgJiYgbmFtZS5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgIGNvbnN0IG1pbWUgPSBleHRlbnNpb25Ub01pbWUobmFtZSk7XG5cbiAgICBpZiAobWltZSkge1xuICAgICAgcmV0dXJuIG1pbWU7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoaXN1dGY4KGZpbGUpKSB7XG4gICAgICByZXR1cm4gJ3RleHQvcGxhaW4nO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgY29uc29sZS53YXJuKCdBZGRpdGlvbmFsIG1pbWV0eXBlIGNoZWNrcyAodGV4dC9wbGFpbikgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGZvciBicm93c2VycycpO1xuICB9XG4gIC8vIHRoaXMgaXMgb25seSBmYWxsYmFjaywgb21pdCBpdCBpbiBjb3ZlcmFnZVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gIC8vIGlmIHdlIGNhbnQgZmluZCB0eXBlcyBieSBleHRlbnNpb25zIGFuZCB3ZSBoYXZlIG1hZ2ljIGJ5dGVzIGZhbGxiYWNrIHRvIGl0XG4gIGlmICh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUubWltZTtcbiAgfVxuXG4gIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbn07XG5cbi8qKlxuICogQ2hhbmdlIGV4dGVuc2lvbiB0byBhY2NvcmRpbmcgbWltZXR5cGUgdXNpbmcgZXh0PT5taW1ldHlwZSBtYXBcbiAqXG4gKiBAcGFyYW0gZXh0IC0gc3RyaW5nXG4gKiBAcmV0dXJuIHN0cmluZ3xib29sZWFuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRlbnNpb25Ub01pbWUgPSAoZXh0OiBzdHJpbmcpID0+IHtcbiAgaWYgKCFleHQgfHwgZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChleHQuc3BsaXQoJy8nKS5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gZXh0O1xuICB9XG5cbiAgaWYgKGV4dC5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgIGV4dCA9IGV4dC5zcGxpdCgnLicpLnBvcCgpO1xuICB9XG5cbiAgZXh0ID0gZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKEV4dGVuc2lvbnNNYXApO1xuICBjb25zdCBtYXBMZW4gPSBrZXlzLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcExlbjsgaSsrKSB7XG4gICAgaWYgKEV4dGVuc2lvbnNNYXBba2V5c1tpXV0uaW5kZXhPZihleHQpID4gLTEpIHtcbiAgICAgIHJldHVybiBrZXlzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybjtcbn07XG5cbi8qKlxuICogU2FuaXRpemVyIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgU2FuaXRpemVPcHRpb25zID1cbiAgfCBib29sZWFuXG4gIHwge1xuICAgICAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAgICAgcmVwbGFjZW1lbnQ/OiBzdHJpbmc7XG4gICAgfTtcblxuLyoqXG4gKiBTYW5pdGl6ZSBmaWxlIG5hbWVcbiAqXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIHtib29sfSBvcHRpb25zICAtIGVuYWJsZSxkaXNhYmxlIHNhbml0aXplciwgZGVmYXVsdCBlbmFibGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5yZXBsYWNlbWVudCAtIHJlcGxhY2VtZW50IGZvciBzYW5pdGl6ZWQgY2hhcnMgZGVmYXVsdHMgdG8gXCItXCJcbiAqIEBwYXJhbSB7c3RyaW5nW119IG9wdGlvbnMuZXhjbHVkZSAtIGFycmF5IHdpdGggZXhjbHVkZWQgY2hhcnMgZGVmYXVsdCAtIGBbJ1xcJywgJ3snLCAnfScsJ3wnLCAnJScsICdgJywgJ1wiJywgXCInXCIsICd+JywgJ1snLCAnXScsICcjJywgJ3wnLCAnXicsICc8JywgJz4nXWBcbiAqL1xuZXhwb3J0IGNvbnN0IHNhbml0aXplTmFtZSA9IChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFNhbml0aXplT3B0aW9ucyA9IHRydWUpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyAmJiAhb3B0aW9ucykge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgbGV0IGV4dDtcblxuICBjb25zdCByZXBsYWNlbWVudCA9IHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5yZXBsYWNlbWVudCA/IG9wdGlvbnMucmVwbGFjZW1lbnQgOiAnLSc7XG4gIGNvbnN0IGV4Y2x1ZGUgPSB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMuZXhjbHVkZSA/IG9wdGlvbnMuZXhjbHVkZSA6IFsnXFxcXCcsICd7JywgJ30nLCAnfCcsICclJywgJ2AnLCAnXCInLCBcIidcIiwgJ34nLCAnWycsICddJywgJyMnLCAnfCcsICdeJywgJzwnLCAnPiddO1xuXG4gIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTtcblxuICBpZiAoZmlsZVBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBleHQgPSBmaWxlUGFydHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gYCR7ZmlsZVBhcnRzXG4gICAgLmpvaW4oJy4nKVxuICAgIC5zcGxpdCgnJylcbiAgICAubWFwKGNoYXIgPT4gKGV4Y2x1ZGUuaW5kZXhPZihjaGFyKSA+IC0xID8gcmVwbGFjZW1lbnQgOiBjaGFyKSlcbiAgICAuam9pbignJyl9JHtleHQgPyAnLicgKyBleHQgOiAnJ31gO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgb2JqZWN0IHRvIGdpdmVuIGZpZWxkc1xuICpcbiAqIEBwYXJhbSB0b0ZpbHRlclxuICogQHBhcmFtIHJlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBmaWx0ZXJPYmplY3QgPSAodG9GaWx0ZXIsIHJlcXVpcmVkRmllbGRzOiBzdHJpbmdbXSkgPT4ge1xuICBpZiAoIXJlcXVpcmVkRmllbGRzIHx8IHJlcXVpcmVkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0b0ZpbHRlcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0b0ZpbHRlcikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRvRmlsdGVyO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHRvRmlsdGVyKVxuICAgIC5maWx0ZXIoZiA9PiByZXF1aXJlZEZpZWxkcy5pbmRleE9mKGYpID4gLTEpXG4gICAgLnJlZHVjZSgob2JqLCBrZXkpID0+ICh7IC4uLm9iaiwgW2tleV06IHRvRmlsdGVyW2tleV0gfSksIHt9KTtcbn07XG5cbi8qKlxuICogRGVlcCBjbGVhbnVwIG9iamVjdCBmcm9tIGZ1bmN0aW9uc1xuICpcbiAqIEBwYXJhbSBvYmpcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFuVXBDYWxsYmFja3MgPSAob2JqOiBhbnkpID0+IHtcbiAgaWYgKCFvYmogfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGsgPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqW2tdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvYmpba10gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9ialtrXSA9PT0gT2JqZWN0KG9ialtrXSkpIHtcbiAgICAgIG9ialtrXSA9IGNsZWFuVXBDYWxsYmFja3Mob2JqW2tdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4Lm5vZGUnO1xuIl19