UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

603 lines (602 loc) 54.5 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 }); var tslib_1 = require("tslib"); var assert = tslib_1.__importStar(require("assert")); var _1 = require("./"); describe('Transforms Schema', function () { var validator = (0, _1.getValidator)(_1.TransformSchema); var validate = function (params) { var res = validator(params); return res.errors.length === 0 ? true : false; }; var assertFail = function (res) { return assert.ok(!res); }; it('should load json schema', function () { // console.log(schema); }); describe('Watermark', function () { it('should validate correct params', function () { assert.ok(validate({ watermark: { file: 'testfilehandle', size: 300, position: 'top', }, })); }); it('should validate correct params (position array)', function () { assert.ok(validate({ watermark: { file: 'testfilehandle', size: 300, position: ['top', 'left'], }, })); }); it('should fail on wrong position params [top, bottom]', function () { assertFail(validate({ watermark: { file: 'testfilehandle', size: 300, position: ['top', 'bottom'], }, })); }); }); describe('Partial Blur', function () { it('should validate correct params', function () { assert.ok(validate({ partial_blur: { objects: [ [1, 1, 2, 2], [1, 1, 32, 15], ], amount: 18.2, blur: 12, type: 'rect', }, })); }); it('should fail on wrong params (amount, blur, type)', function () { assertFail(validate({ partial_blur: { objects: [ [1, 1, 2, 2], [1, 1, 32, 15], ], amount: -10, blur: 300, type: 'wrong_type', }, })); }); it('should fail on wrong params (objects)', function () { assertFail(validate({ partial_blur: { objects: [ [1, 1, 2], [1, 1, 32, 15, 32], ], amount: 10, blur: 20, }, })); }); }); describe('Partial Pixelate', function () { it('should validate correct params', function () { assert.ok(validate({ partial_pixelate: { objects: [ [1, 1, 2, 2], [1, 1, 32, 15], ], amount: 100, blur: 12.2, type: 'oval', }, })); }); it('should fail on wrong params (amount, blur, type)', function () { assertFail(validate({ partial_pixelate: { objects: [ [1, 1, 2, 2], [1, 1, 32, 15], ], amount: -10, blur: 300, type: 'wrong_type', }, })); }); it('should fail on wrong params (objects)', function () { assertFail(validate({ partial_pixelate: { objects: [ [1, 1, 2], [1, 1, 32, 15, 32], ], amount: 10, blur: 20, }, })); }); }); describe('Crop', function () { it('should validate correct params', function () { assert.ok(validate({ crop: { dim: [1, 1, 2, 2], }, })); }); it('should fail on empty dim params', function () { assertFail(validate({ crop: { dim: [], }, })); }); it('should fail on wrong params (minimum value for 2 first items)', function () { assertFail(validate({ crop: { dim: [2, 1, 0, 2], }, })); }); it('should fail on wrong params (5 items in array)', function () { assertFail(validate({ crop: { dim: [1, 1, 2, 2, 4], }, })); }); }); describe('Resize', function () { it('should validate correct params', function () { assert.ok(validate({ resize: { width: 10, height: 20, fit: 'crop', align: ['top', 'left'], }, })); }); it('should validate correct when only one width or height is provided', function () { assert.ok(validate({ resize: { width: 10, fit: 'crop', align: 'left', }, })); assert.ok(validate({ resize: { height: 10, fit: 'crop', align: 'left', }, })); }); it('should fail on wrong params (missing width and height)', function () { assertFail(validate({ resize: { fit: 'crop', align: 'left', }, })); }); }); describe('Resize', function () { it('should validate correct params', function () { assert.ok(validate({ rotate: { deg: 'exif', exif: false, background: 'fff', }, })); }); it('should validate correct params', function () { assert.ok(validate({ rotate: { deg: 200, exif: true, background: 'ffffff', }, })); }); it('should fail on wrong params (wrong exif rotation)', function () { assertFail(validate({ rotate: { deg: 123, exif: 'true', background: 'ffffff', }, })); }); }); describe('Pdfinfo', function () { it('should validate correct params with bool value', function () { assert.ok(validate({ pdfinfo: true, })); }); it('should validate correct params with color info', function () { assert.ok(validate({ pdfinfo: { colorinfo: true, }, })); }); }); describe('Pdfconvert', function () { describe('Pages', function () { [[1, 2], ['1-', 3], ['-2']].forEach(function (val) { it("should validate on correct page \"".concat(val, "\""), function () { assert.ok(validate({ pdfconvert: { pages: val, }, })); }); }); it('should return error on fail page "1a"', function () { assertFail(validate({ pdfconvert: { pages: '1a', }, })); }); }); describe('Page orientation', function () { it('should pass on correct orientation "landscape"', function () { assert.ok(validate({ pdfconvert: { pageorientation: 'landscape', }, })); }); it('should pass on correct orientation "portrait"', function () { assert.ok(validate({ pdfconvert: { pageorientation: 'portrait', }, })); }); it('should fail on wrong orientation "landscape1"', function () { assertFail(validate({ pdfconvert: { pageorientation: 'landscape1', }, })); }); }); describe('Page format', function () { ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach(function (val) { it("should when correct page format is provided ".concat(val), function () { assert.ok(validate({ pdfconvert: { pages: [1, 2], pageformat: val, }, })); }); }); it('should fail on wrong page format ie a22', function () { assertFail(validate({ pdfconvert: { pageformat: 'a22', }, })); }); }); }); }); // import * as assert from 'assert'; // import { getValidator, TransformSchema } from './'; // describe('Transforms Schema', () => { // const validate = getValidator(TransformSchema); // const assertFail = (val) => assert.ok(!val); // it('should load json schema', () => { // // console.log(schema); // }); // describe('Watermark', () => { // it('should validate correct params', () => { // assert.ok(validate({ // watermark: { // file: 'testfilehandle', // size: 300, // position: 'top', // }, // })); // }); // it('should validate correct params (position array)', () => { // assert.ok(validate({ // watermark: { // file: 'testfilehandle', // size: 300, // position: ['top', 'left'], // }, // })); // }); // it('should fail on wrong position params [top, bottom]', () => { // assertFail(validate({ // watermark: { // file: 'testfilehandle', // size: 300, // position: ['top', 'bottom'], // }, // })); // }); // }); // describe('Partial Blur', () => { // it('should validate correct params', () => { // assert.ok(validate({ // partial_blur: { // objects: [ // [1, 1, 2, 2], // [1, 1, 32, 15], // ], // amount: 18.2, // blur: 12, // type: 'rect', // }, // })); // }); // it('should fail on wrong params (amount, blur, type)', () => { // assertFail(validate({ // partial_blur: { // objects: [ // [1, 1, 2, 2], // [1, 1, 32, 15], // ], // amount: -10, // blur: 300, // type: 'wrong_type', // }, // })); // }); // it('should fail on wrong params (objects)', () => { // assertFail(validate({ // partial_blur: { // objects: [ // [1, 1, 2], // [1, 1, 32, 15, 32], // ], // amount: 10, // blur: 20, // }, // })); // }); // }); // describe('Partial Pixelate', () => { // it('should validate correct params', () => { // assert.ok(validate({ // partial_pixelate: { // objects: [ // [1, 1, 2, 2], // [1, 1, 32, 15], // ], // amount: 100, // blur: 12.2, // type: 'oval', // }, // })); // }); // it('should fail on wrong params (amount, blur, type)', () => { // assertFail(validate({ // partial_pixelate: { // objects: [ // [1, 1, 2, 2], // [1, 1, 32, 15], // ], // amount: -10, // blur: 300, // type: 'wrong_type', // }, // })); // }); // it('should fail on wrong params (objects)', () => { // assertFail(validate({ // partial_pixelate: { // objects: [ // [1, 1, 2], // [1, 1, 32, 15, 32], // ], // amount: 10, // blur: 20, // }, // })); // }); // }); // describe('Crop', () => { // it('should validate correct params', () => { // assert.ok(validate({ // crop: { // dim: [1, 1, 2, 2], // }, // })); // }); // it('should fail on empty dim params', () => { // assertFail(validate({ // crop: { // dim: [], // }, // })); // }); // it('should fail on wrong params (minimum value for 2 first items)', () => { // assertFail(validate({ // crop: { // dim: [2, 1, 0, 2], // }, // })); // }); // it('should fail on wrong params (5 items in array)', () => { // assertFail(validate({ // crop: { // dim: [1, 1, 2, 2, 4], // }, // })); // }); // }); // describe('Resize', () => { // it('should validate correct params', () => { // assert.ok(validate({ // resize: { // width: 10, // height: 20, // fit: 'crop', // align: ['top', 'left'], // }, // })); // }); // it('should validate correct when only one width or height is provided', () => { // assert.ok(validate({ // resize: { // width: 10, // fit: 'crop', // align: 'left', // }, // })); // assert.ok(validate({ // resize: { // height: 10, // fit: 'crop', // align: 'left', // }, // })); // }); // it('should fail on wrong params (missing width and height)', () => { // assertFail(validate({ // resize: { // fit: 'crop', // align: 'left', // }, // })); // }); // }); // describe('Resize', () => { // it('should validate correct params', () => { // assert.ok(validate({ // rotate: { // deg: 'exif', // exif: false, // background: 'fff', // }, // })); // }); // it('should validate correct params', () => { // assert.ok(validate({ // rotate: { // deg: 200, // exif: true, // background: 'ffffff', // }, // })); // }); // it('should fail on wrong params (wrong exif rotation)', () => { // assertFail(validate({ // rotate: { // deg: 123, // exif: 'true', // background: 'ffffff', // }, // })); // }); // }); // describe('Pdfinfo', () => { // it('should validate correct params with bool value', () => { // assert.ok(validate({ // pdfinfo: true, // })); // }); // it('should validate correct params with color info', () => { // assert.ok(validate({ // pdfinfo: { // colorinfo: true, // }, // })); // }); // }); // describe('Pdfconvert', () => { // describe('Pages', () => { // [[1,2], ['1-', 3], ['-2']].forEach((val) => { // it(`should validate on correct page "${val}"`, () => { // assert.ok(validate({ // pdfconvert: { // pages: val, // }, // })); // }); // }); // it('should return error on fail page "1a"', () => { // assertFail(validate({ // pdfconvert: { // pages: '1a', // }, // })); // }); // }); // describe('Page orientation', () => { // it('should pass on correct orientation "landscape"', () => { // assert.ok(validate({ // pdfconvert: { // pageorientation: 'landscape', // }, // })); // }); // it('should pass on correct orientation "portrait"', () => { // assert.ok(validate({ // pdfconvert: { // pageorientation: 'portrait', // }, // })); // }); // it('should fail on wrong orientation "landscape1"', () => { // assertFail(validate({ // pdfconvert: { // pageorientation: 'landscape1', // }, // })); // }); // }); // describe('Page format', () => { // ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach((val) => { // it(`should when correct page format is provided ${val}`, () => { // assert.ok(validate({ // pdfconvert: { // pages: [1,2], // pageformat: val, // }, // })); // }); // }); // it('should fail on wrong page format ie a22', () => { // assertFail(validate({ // pdfconvert: { // pageformat: 'a22', // }, // })); // }); // }); // }); // }); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvdHJhbnNmb3Jtcy5zY2hlbWEuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCxxREFBaUM7QUFDakMsdUJBQW1EO0FBRW5ELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUU1QixJQUFNLFNBQVMsR0FBRyxJQUFBLGVBQVksRUFBQyxrQkFBZSxDQUFDLENBQUM7SUFFaEQsSUFBTSxRQUFRLEdBQUcsVUFBQyxNQUFNO1FBQ3RCLElBQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUYsSUFBTSxVQUFVLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQWYsQ0FBZSxDQUFDO0lBRTVDLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1Qix1QkFBdUI7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ3BCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtZQUNuQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDakIsU0FBUyxFQUFFO29CQUNULElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLElBQUksRUFBRSxHQUFHO29CQUNULFFBQVEsRUFBRSxLQUFLO2lCQUNoQjthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRTtvQkFDVCxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixJQUFJLEVBQUUs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NEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1QixpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZCxZQUFZO0FBRVosNERBQTREO0FBQzVELGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUVaLFVBQVU7QUFFViwyQ0FBMkM7QUFDM0MscUVBQXFFO0FBQ3JFLCtCQUErQjtBQUMvQiwwQkFBMEI7QUFDMUIsNENBQTRDO0FBQzVDLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUVaLG9FQUFvRTtBQUNwRSwrQkFBK0I7QUFDL0IsMEJBQTBCO0FBQzFCLDJDQUEyQztBQUMzQyxlQUFlO0FBQ2YsZUFBZTtBQUNmLFlBQVk7QUFFWixvRUFBb0U7QUFDcEUsZ0NBQWdDO0FBQ2hDLDBCQUEwQjtBQUMxQiw2Q0FBNkM7QUFDN0MsZUFBZTtBQUNmLGVBQWU7QUFDZixZQUFZO0FBQ1osVUFBVTtBQUVWLHNDQUFzQztBQUN0Qyw4RkFBOEY7QUFDOUYsMkVBQTJFO0FBQzNFLGlDQUFpQztBQUNqQyw0QkFBNEI7QUFDNUIsOEJBQThCO0FBQzlCLGlDQUFpQztBQUNqQyxpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZCxZQUFZO0FBRVosOERBQThEO0FBQzlELGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsaUNBQWlDO0FBQ2pDLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUNaLFVBQVU7QUFDVixRQUFRO0FBQ1IsTUFBTSIsImZpbGUiOiJzY2hlbWEvdHJhbnNmb3Jtcy5zY2hlbWEuc3BlYy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yLCBUcmFuc2Zvcm1TY2hlbWEgfSBmcm9tICcuLyc7XG5cbmRlc2NyaWJlKCdUcmFuc2Zvcm1zIFNjaGVtYScsICgpID0+IHtcblxuICBjb25zdCB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoVHJhbnNmb3JtU2NoZW1hKTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICBjb25zdCByZXMgPSB2YWxpZGF0b3IocGFyYW1zKTtcbiAgICByZXR1cm4gcmVzLmVycm9ycy5sZW5ndGggPT09IDAgPyB0cnVlIDogZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0RmFpbCA9IChyZXMpID0+IGFzc2VydC5vayghcmVzKTtcblxuICBpdCgnc2hvdWxkIGxvYWQganNvbiBzY2hlbWEnLCAoKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coc2NoZW1hKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1dhdGVybWFyaycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgd2F0ZXJtYXJrOiB7XG4gICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbiAgICAgICAgICBzaXplOiAzMDAsXG4gICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcyAocG9zaXRpb24gYXJyYXkpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgd2F0ZXJtYXJrOiB7XG4gICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbiAgICAgICAgICBzaXplOiAzMDAsXG4gICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2xlZnQnXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwb3NpdGlvbiBwYXJhbXMgW3RvcCwgYm90dG9tXScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICB3YXRlcm1hcms6IHtcbiAgICAgICAgICBmaWxlOiAndGVzdGZpbGVoYW5kbGUnLFxuICAgICAgICAgIHNpemU6IDMwMCxcbiAgICAgICAgICBwb3NpdGlvbjogWyd0b3AnLCAnYm90dG9tJ10sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYXJ0aWFsIEJsdXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfYmx1cjoge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAxOC4yLFxuICAgICAgICAgIGJsdXI6IDEyLFxuICAgICAgICAgIHR5cGU6ICdyZWN0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IC0xMCxcbiAgICAgICAgICBibHVyOiAzMDAsXG4gICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNSwgMzJdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAxMCxcbiAgICAgICAgICBibHVyOiAyMCxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcnRpYWwgUGl4ZWxhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbiAgICAgICAgICBvYmplY3RzOiBbXG4gICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTAwLFxuICAgICAgICAgIGJsdXI6IDEyLjIsXG4gICAgICAgICAgdHlwZTogJ292YWwnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAoYW1vdW50LCBibHVyLCB0eXBlKScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IC0xMCxcbiAgICAgICAgICBibHVyOiAzMDAsXG4gICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTAsXG4gICAgICAgICAgYmx1cjogMjAsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDcm9wJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbMSwgMSwgMiwgMl0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gZW1wdHkgZGltIHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG1pbmltdW0gdmFsdWUgZm9yIDIgZmlyc3QgaXRlbXMpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIGNyb3A6IHtcbiAgICAgICAgICBkaW06IFsyLCAxLCAwLCAyXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKDUgaXRlbXMgaW4gYXJyYXkpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIGNyb3A6IHtcbiAgICAgICAgICBkaW06IFsxLCAxLCAyLCAyLCA0XSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Jlc2l6ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgICAgZml0OiAnY3JvcCcsXG4gICAgICAgICAgYWxpZ246IFsndG9wJywgJ2xlZnQnXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB3aGVuIG9ubHkgb25lIHdpZHRoIG9yIGhlaWdodCBpcyBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJlc2l6ZToge1xuICAgICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgICBmaXQ6ICdjcm9wJyxcbiAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICByZXNpemU6IHtcbiAgICAgICAgICBoZWlnaHQ6IDEwLFxuICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaXNzaW5nIHdpZHRoIGFuZCBoZWlnaHQpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIHJlc2l6ZToge1xuICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZXNpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJvdGF0ZToge1xuICAgICAgICAgIGRlZzogJ2V4aWYnLFxuICAgICAgICAgIGV4aWY6IGZhbHNlLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdmZmYnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJvdGF0ZToge1xuICAgICAgICAgIGRlZzogMjAwLFxuICAgICAgICAgIGV4aWY6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zICh3cm9uZyBleGlmIHJvdGF0aW9uKScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICByb3RhdGU6IHtcbiAgICAgICAgICBkZWc6IDEyMyxcbiAgICAgICAgICBleGlmOiAndHJ1ZScsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ2ZmZmZmZicsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQZGZpbmZvJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBib29sIHZhbHVlJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcGRmaW5mbzogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgd2l0aCBjb2xvciBpbmZvJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcGRmaW5mbzoge1xuICAgICAgICAgIGNvbG9yaW5mbzogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BkZmNvbnZlcnQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ1BhZ2VzJywgKCkgPT4ge1xuICAgICAgW1sxLDJdLCBbJzEtJywgM10sIFsnLTInXV0uZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGl0KGBzaG91bGQgdmFsaWRhdGUgb24gY29ycmVjdCBwYWdlIFwiJHt2YWx9XCJgLCAoKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgICAgcGFnZXM6IHZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvciBvbiBmYWlsIHBhZ2UgXCIxYVwiJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlczogJzFhJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1BhZ2Ugb3JpZW50YXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgb24gY29ycmVjdCBvcmllbnRhdGlvbiBcImxhbmRzY2FwZVwiJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgIHBhZ2VvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFzcyBvbiBjb3JyZWN0IG9yaWVudGF0aW9uIFwicG9ydHJhaXRcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlb3JpZW50YXRpb246ICdwb3J0cmFpdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBvcmllbnRhdGlvbiBcImxhbmRzY2FwZTFcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgcGFnZW9yaWVudGF0aW9uOiAnbGFuZHNjYXBlMScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnUGFnZSBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBbJ2EyJywgJ2EzJywgJ2E0JywgJ2E1JywgJ2I0JywgJ2I1JywgJ2xldHRlcicsICdsZWdhbCcsICd0YWJsb2lkJ10uZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGl0KGBzaG91bGQgd2hlbiBjb3JyZWN0IHBhZ2UgZm9ybWF0IGlzIHByb3ZpZGVkICR7dmFsfWAsICgpID0+IHtcbiAgICAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgICBwYWdlczogWzEsMl0sXG4gICAgICAgICAgICAgIHBhZ2Vmb3JtYXQ6IHZhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFnZSBmb3JtYXQgaWUgYTIyJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlZm9ybWF0OiAnYTIyJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG4vLyBpbXBvcnQgeyBnZXRWYWxpZGF0b3IsIFRyYW5zZm9ybVNjaGVtYSB9IGZyb20gJy4vJztcblxuLy8gZGVzY3JpYmUoJ1RyYW5zZm9ybXMgU2NoZW1hJywgKCkgPT4ge1xuXG4vLyAgIGNvbnN0IHZhbGlkYXRlID0gZ2V0VmFsaWRhdG9yKFRyYW5zZm9ybVNjaGVtYSk7XG5cbi8vICAgY29uc3QgYXNzZXJ0RmFpbCA9ICh2YWwpID0+IGFzc2VydC5vayghdmFsKTtcblxuLy8gICBpdCgnc2hvdWxkIGxvYWQganNvbiBzY2hlbWEnLCAoKSA9PiB7XG4vLyAgICAgLy8gY29uc29sZS5sb2coc2NoZW1hKTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1dhdGVybWFyaycsICgpID0+IHtcbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgd2F0ZXJtYXJrOiB7XG4vLyAgICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbi8vICAgICAgICAgICBzaXplOiAzMDAsXG4vLyAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcyAocG9zaXRpb24gYXJyYXkpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgd2F0ZXJtYXJrOiB7XG4vLyAgICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbi8vICAgICAgICAgICBzaXplOiAzMDAsXG4vLyAgICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2xlZnQnXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwb3NpdGlvbiBwYXJhbXMgW3RvcCwgYm90dG9tXScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICB3YXRlcm1hcms6IHtcbi8vICAgICAgICAgICBmaWxlOiAndGVzdGZpbGVoYW5kbGUnLFxuLy8gICAgICAgICAgIHNpemU6IDMwMCxcbi8vICAgICAgICAgICBwb3NpdGlvbjogWyd0b3AnLCAnYm90dG9tJ10sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdQYXJ0aWFsIEJsdXInLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfYmx1cjoge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAxOC4yLFxuLy8gICAgICAgICAgIGJsdXI6IDEyLFxuLy8gICAgICAgICAgIHR5cGU6ICdyZWN0Jyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IC0xMCxcbi8vICAgICAgICAgICBibHVyOiAzMDAsXG4vLyAgICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9ibHVyOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNSwgMzJdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAxMCxcbi8vICAgICAgICAgICBibHVyOiAyMCxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1BhcnRpYWwgUGl4ZWxhdGUnLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbi8vICAgICAgICAgICBvYmplY3RzOiBbXG4vLyAgICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4vLyAgICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTAwLFxuLy8gICAgICAgICAgIGJsdXI6IDEyLjIsXG4vLyAgICAgICAgICAgdHlwZTogJ292YWwnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAoYW1vdW50LCBibHVyLCB0eXBlKScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IC0xMCxcbi8vICAgICAgICAgICBibHVyOiAzMDAsXG4vLyAgICAgICAgICAgdHlwZTogJ3dyb25nX3R5cGUnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAob2JqZWN0cyknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTAsXG4vLyAgICAgICAgICAgYmx1cjogMjAsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdDcm9wJywgKCkgPT4ge1xuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbMSwgMSwgMiwgMl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gZW1wdHkgZGltIHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG1pbmltdW0gdmFsdWUgZm9yIDIgZmlyc3QgaXRlbXMpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIGNyb3A6IHtcbi8vICAgICAgICAgICBkaW06IFsyLCAxLCAwLCAyXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKDUgaXRlbXMgaW4gYXJyYXkpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIGNyb3A6IHtcbi8vICAgICAgICAgICBkaW06IFsxLCAxLCAyLCAyLCA0XSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgZGVzY3JpYmUoJ1Jlc2l6ZScsICgpID0+IHtcbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcmVzaXplOiB7XG4vLyAgICAgICAgICAgd2lkdGg6IDEwLFxuLy8gICAgICAgICAgIGhlaWdodDogMjAsXG4vLyAgICAgICAgICAgZml0OiAnY3JvcCcsXG4vLyAgICAgICAgICAgYWxpZ246IFsndG9wJywgJ2xlZnQnXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB3aGVuIG9ubHkgb25lIHdpZHRoIG9yIGhlaWdodCBpcyBwcm92aWRlZCcsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJlc2l6ZToge1xuLy8gICAgICAgICAgIHdpZHRoOiAxMCxcbi8vICAgICAgICAgICBmaXQ6ICdjcm9wJyxcbi8vICAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuXG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICByZXNpemU6IHtcbi8vICAgICAgICAgICBoZWlnaHQ6IDEwLFxuLy8gICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuLy8gICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaXNzaW5nIHdpZHRoIG