filestack-js
Version:
Official JavaScript library for Filestack
100 lines (98 loc) • 15.5 kB
JavaScript
/*
* Copyright (c) 2019 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 * as utils from './index';
describe('utils:index', function () {
describe('getVersion', function () {
it('should return version string to replace', function () {
expect(utils.getVersion()).toEqual("JS-4.0.3");
});
});
describe('isFacebook', function () {
var originalAgent = navigator.userAgent;
var mockAgent = function (_value) { return ({
get: function () { return _value; },
set: function (v) { return _value = v; },
}); };
var defineAgent = function (agent) {
try {
Object.defineProperty(navigator, 'userAgent', mockAgent(agent));
}
catch (e) {
navigator = Object.create(navigator, {
userAgent: mockAgent(agent),
});
}
};
beforeEach(function () {
mockAgent(originalAgent);
});
describe('should recognize all of facebook browser useragents', function () {
var agents = [
'Mozilla/5.0 (Linux; Android 7.1.1; Build/LMY47O.H18; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/127.0.0.22.69;]',
'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/127.0.0.22.69;]',
'Mozilla/5.0 (Linux; Android 7.0; MHA-L29 Build/HUAWEIMHA-L29; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/127.0.0.22.69;]',
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89 [FBAN/FBIOS;FBAV/96.0.0.45.70;FBBV/60548545;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iOS;FBSV/10.3.2;FBSS/2;FBCR/E-Plus;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0]',
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 [FBAN/FBIOS;FBAV/90.0.0.51.69;FBBV/56254015;FBDV/iPhone6,2;FBMD/iPhone;FBSN/iOS;FBSV/10.2;FBSS/2;FBCR/1&1;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0]',
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89 [FBAN/FBIOS;FBAV/96.0.0.45.70;FBBV/60548545;FBDV/iPhone8,1;FBMD/iPhone;FBSN/iOS;FBSV/10.3.2;FBSS/2;FBCR/o2-de;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/0]',
'Mozilla/5.0 (Linux; Android 4.4.4; G7-L01 Build/HuaweiG7-L01) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FB_IAB/MESSENGER;FBAV/121.0.0.15.70;]',
];
var _loop_1 = function (i) {
it("Should accept: ".concat(agents[i], " as correct"), function () {
defineAgent(agents[i]);
expect(utils.isFacebook()).toBeTruthy();
});
};
for (var i in agents) {
_loop_1(i);
}
});
describe('should not recognize user agent as facebook', function () {
var agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246',
'Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1',
];
var _loop_2 = function (i) {
it("Should accept: ".concat(agents[i], " as wrong"), function () {
defineAgent(agents[i]);
expect(utils.isFacebook()).toBeTruthy();
});
};
for (var i in agents) {
_loop_2(i);
}
});
});
describe('md5', function () {
it('should return correct md5 value', function () {
expect(utils.md5(Buffer.from('test'))).toEqual('CY9rzUYh03PK3k6DJie09g==');
});
});
describe('b64', function () {
it('should return correct b65 value', function () {
expect(utils.b64('testtext')).toEqual('dGVzdHRleHQ=');
});
it('should escape chars to make b64 url without safe mode - char "+"', function () {
expect(utils.b64('*0eijATh#"I$PR)s<uTa}{t>E"LC:L', false)).toEqual('KjBlaWpBVGgjIkkkUFIpczx1VGF9e3Q+RSJMQzpM');
});
it('should escape chars to make b64 url with safe mode - char "+"', function () {
expect(utils.b64('*0eijATh#"I$PR)s<uTa}{t>E"LC:L', true)).toEqual('KjBlaWpBVGgjIkkkUFIpczx1VGF9e3Q-RSJMQzpM');
});
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXguc3BlYy5icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBRWpDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLFlBQVksRUFBRTtRQUNyQixFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksRUFBRTtRQUNyQixJQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBRTFDLElBQU0sU0FBUyxHQUFHLFVBQUEsTUFBTSxJQUFJLE9BQUEsQ0FBQztZQUMzQixHQUFHLEVBQUUsY0FBTSxPQUFBLE1BQU0sRUFBTixDQUFNO1lBQ2pCLEdBQUcsRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLE1BQU0sR0FBRyxDQUFDLEVBQVYsQ0FBVTtTQUN2QixDQUFDLEVBSDBCLENBRzFCLENBQUM7UUFFSCxJQUFNLFdBQVcsR0FBRyxVQUFDLEtBQUs7WUFDeEIsSUFBSTtnQkFDRixNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakU7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQ25DLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO2lCQUM1QixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQztRQUVGLFVBQVUsQ0FBQztZQUNULFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxxREFBcUQsRUFBRTtZQUM5RCxJQUFNLE1BQU0sR0FBRztnQkFDYix3TEFBd0w7Z0JBQ3hMLDJMQUEyTDtnQkFDM0wsaU1BQWlNO2dCQUNqTSxtUUFBbVE7Z0JBQ25RLDZQQUE2UDtnQkFDN1Asa1FBQWtRO2dCQUNsUSw4TEFBOEw7YUFDL0wsQ0FBQztvQ0FFTyxDQUFDO2dCQUNSLEVBQUUsQ0FBQyx5QkFBa0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBYSxFQUFFO29CQUMzQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLENBQUM7O1lBSkwsS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNO3dCQUFYLENBQUM7YUFLVDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLDZDQUE2QyxFQUFFO1lBQ3RELElBQU0sTUFBTSxHQUFHO2dCQUNiLGlJQUFpSTtnQkFDakksbUhBQW1IO2dCQUNuSCxzSEFBc0g7Z0JBQ3RILGdGQUFnRjthQUNqRixDQUFDO29DQUVPLENBQUM7Z0JBQ1IsRUFBRSxDQUFDLHlCQUFrQixNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQVcsRUFBRTtvQkFDekMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUFDOztZQUpMLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTTt3QkFBWCxDQUFDO2FBS1Q7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNkLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNkLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrRUFBa0UsRUFBRTtZQUNyRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFO1lBQ2xFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi91dGlscy9pbmRleC5zcGVjLmJyb3dzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9pbmRleCc7XG5cbmRlc2NyaWJlKCd1dGlsczppbmRleCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2dldFZlcnNpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdmVyc2lvbiBzdHJpbmcgdG8gcmVwbGFjZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1dGlscy5nZXRWZXJzaW9uKCkpLnRvRXF1YWwoYEpTLUB7VkVSU0lPTn1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzRmFjZWJvb2snLCAoKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICBjb25zdCBtb2NrQWdlbnQgPSBfdmFsdWUgPT4gKHtcbiAgICAgIGdldDogKCkgPT4gX3ZhbHVlLFxuICAgICAgc2V0OiAodikgPT4gX3ZhbHVlID0gdixcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlZmluZUFnZW50ID0gKGFnZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAndXNlckFnZW50JywgbW9ja0FnZW50KGFnZW50KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG5hdmlnYXRvciA9IE9iamVjdC5jcmVhdGUobmF2aWdhdG9yLCB7XG4gICAgICAgICAgdXNlckFnZW50OiBtb2NrQWdlbnQoYWdlbnQpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBtb2NrQWdlbnQob3JpZ2luYWxBZ2VudCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIHJlY29nbml6ZSBhbGwgb2YgZmFjZWJvb2sgYnJvd3NlciB1c2VyYWdlbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWdlbnRzID0gW1xuICAgICAgICAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBCdWlsZC9MTVk0N08uSDE4OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzU4LjAuMzAyOS44MyBNb2JpbGUgU2FmYXJpLzUzNy4zNiBbRkJfSUFCL0ZCNEE7RkJBVi8xMjcuMC4wLjIyLjY5O10nLFxuICAgICAgICAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgU00tRzkzMEYgQnVpbGQvTlJEOTBNOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzU4LjAuMzAyOS44MyBNb2JpbGUgU2FmYXJpLzUzNy4zNiBbRkJfSUFCL0ZCNEE7RkJBVi8xMjcuMC4wLjIyLjY5O10nLFxuICAgICAgICAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTUhBLUwyOSBCdWlsZC9IVUFXRUlNSEEtTDI5OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzU4LjAuMzAyOS44MyBNb2JpbGUgU2FmYXJpLzUzNy4zNiBbRkJfSUFCL0ZCNEE7RkJBVi8xMjcuMC4wLjIyLjY5O10nLFxuICAgICAgICAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjIuNCAoS0hUTUwsIGxpa2UgR2Vja28pIE1vYmlsZS8xNEY4OSBbRkJBTi9GQklPUztGQkFWLzk2LjAuMC40NS43MDtGQkJWLzYwNTQ4NTQ1O0ZCRFYvaVBob25lNywyO0ZCTUQvaVBob25lO0ZCU04vaU9TO0ZCU1YvMTAuMy4yO0ZCU1MvMjtGQkNSL0UtUGx1cztGQklEL3Bob25lO0ZCTEMvZGVfREU7RkJPUC81O0ZCUlYvMF0nLFxuICAgICAgICAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMi4zLjEyIChLSFRNTCwgbGlrZSBHZWNrbykgTW9iaWxlLzE0QzkyIFtGQkFOL0ZCSU9TO0ZCQVYvOTAuMC4wLjUxLjY5O0ZCQlYvNTYyNTQwMTU7RkJEVi9pUGhvbmU2LDI7RkJNRC9pUGhvbmU7RkJTTi9pT1M7RkJTVi8xMC4yO0ZCU1MvMjtGQkNSLzEmMTtGQklEL3Bob25lO0ZCTEMvZGVfREU7RkJPUC81O0ZCUlYvMF0nLFxuICAgICAgICAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjIuNCAoS0hUTUwsIGxpa2UgR2Vja28pIE1vYmlsZS8xNEY4OSBbRkJBTi9GQklPUztGQkFWLzk2LjAuMC40NS43MDtGQkJWLzYwNTQ4NTQ1O0ZCRFYvaVBob25lOCwxO0ZCTUQvaVBob25lO0ZCU04vaU9TO0ZCU1YvMTAuMy4yO0ZCU1MvMjtGQkNSL28yLWRlO0ZCSUQvcGhvbmU7RkJMQy9kZV9ERTtGQk9QLzU7RkJSVi8wXScsXG4gICAgICAgICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNC40LjQ7IEc3LUwwMSBCdWlsZC9IdWF3ZWlHNy1MMDEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS8zMy4wLjAuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNiBbRkJfSUFCL01FU1NFTkdFUjtGQkFWLzEyMS4wLjAuMTUuNzA7XScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGxldCBpIGluIGFnZW50cykge1xuICAgICAgICBpdChgU2hvdWxkIGFjY2VwdDogJHthZ2VudHNbaV19IGFzIGNvcnJlY3RgLCAoKSA9PiB7XG4gICAgICAgICAgZGVmaW5lQWdlbnQoYWdlbnRzW2ldKTtcbiAgICAgICAgICBleHBlY3QodXRpbHMuaXNGYWNlYm9vaygpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBub3QgcmVjb2duaXplIHVzZXIgYWdlbnQgYXMgZmFjZWJvb2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZ2VudHMgPSBbXG4gICAgICAgICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDIuMC4yMzExLjEzNSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTIuMjQ2JyxcbiAgICAgICAgJ01vemlsbGEvNS4wIChYMTE7IENyT1MgeDg2XzY0IDgxNzIuNDUuMCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzUxLjAuMjcwNC42NCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgJ01vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzExXzIpIEFwcGxlV2ViS2l0LzYwMS4zLjkgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzkuMC4yIFNhZmFyaS82MDEuMy45JyxcbiAgICAgICAgJ01vemlsbGEvNS4wIChYMTE7IFVidW50dTsgTGludXggeDg2XzY0OyBydjoxNS4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzE1LjAuMScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGxldCBpIGluIGFnZW50cykge1xuICAgICAgICBpdChgU2hvdWxkIGFjY2VwdDogJHthZ2VudHNbaV19IGFzIHdyb25nYCwgKCkgPT4ge1xuICAgICAgICAgIGRlZmluZUFnZW50KGFnZW50c1tpXSk7XG4gICAgICAgICAgZXhwZWN0KHV0aWxzLmlzRmFjZWJvb2soKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21kNScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IG1kNSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1dGlscy5tZDUoQnVmZmVyLmZyb20oJ3Rlc3QnKSkpLnRvRXF1YWwoJ0NZOXJ6VVloMDNQSzNrNkRKaWUwOWc9PScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYjY0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgYjY1IHZhbHVlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHV0aWxzLmI2NCgndGVzdHRleHQnKSkudG9FcXVhbCgnZEdWemRIUmxlSFE9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVzY2FwZSBjaGFycyB0byBtYWtlIGI2NCB1cmwgd2l0aG91dCBzYWZlIG1vZGUgLSBjaGFyIFwiK1wiJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHV0aWxzLmI2NCgnKjBlaWpBVGgjXCJJJFBSKXM8dVRhfXt0PkVcIkxDOkwnLCBmYWxzZSkpLnRvRXF1YWwoJ0tqQmxhV3BCVkdnaklra2tVRklwY3p4MVZHRjllM1ErUlNKTVF6cE0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXNjYXBlIGNoYXJzIHRvIG1ha2UgYjY0IHVybCB3aXRoIHNhZmUgbW9kZSAtIGNoYXIgXCIrXCInLCAoKSA9PiB7XG4gICAgICBleHBlY3QodXRpbHMuYjY0KCcqMGVpakFUaCNcIkkkUFIpczx1VGF9e3Q+RVwiTEM6TCcsIHRydWUpKS50b0VxdWFsKCdLakJsYVdwQlZHZ2pJa2trVUZJcGN6eDFWR0Y5ZTNRLVJTSk1RenBNJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=