From 8ed32286d62b0a4e1ec8752be19cc64784e3b849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Mon, 23 Mar 2020 14:57:15 +0800 Subject: [PATCH 01/13] fix: _unSupportBrowserTip (#755) --- lib/browser/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/browser/client.js b/lib/browser/client.js index 982beab39..44c4379bc 100644 --- a/lib/browser/client.js +++ b/lib/browser/client.js @@ -27,7 +27,7 @@ function getHeader(headers, name) { function _unSupportBrowserTip() { const { name, version } = platform; - if (name.toLowerCase() === 'ie' && version.split('.')[0] < 10) { + if (name && name.toLowerCase && name.toLowerCase() === 'ie' && version.split('.')[0] < 10) { // eslint-disable-next-line no-console console.warn('ali-oss does not support the current browser'); } From 67275bd567a26093aab803260a161c986c3b9771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Mon, 23 Mar 2020 14:58:32 +0800 Subject: [PATCH 02/13] fix: checkBucketName bug (#749) --- lib/browser/bucket.js | 10 ------- lib/browser/client.js | 9 ------ lib/bucket.js | 43 --------------------------- lib/common/bucket/_checkBucketName.js | 9 ++++++ lib/common/bucket/index.js | 2 ++ lib/common/bucket/putBucket.js | 26 ++++++++++++++++ lib/common/utils/checkBucketName.js | 4 +-- test/node/bucket.test.js | 6 ---- 8 files changed, 39 insertions(+), 70 deletions(-) create mode 100644 lib/common/bucket/_checkBucketName.js create mode 100644 lib/common/bucket/putBucket.js diff --git a/lib/browser/bucket.js b/lib/browser/bucket.js index 9ff7c2ca6..57ddae862 100644 --- a/lib/browser/bucket.js +++ b/lib/browser/bucket.js @@ -77,16 +77,6 @@ proto.getBucket = function getBucket() { return this.options.bucket; }; -proto.putBucket = async function putBucket(name, options) { - const params = this._bucketRequestParams('PUT', name, '', options); - params.successStatuses = [200]; - const result = await this.request(params); - return { - bucket: (result.headers.location && result.headers.location.substring(1)) || null, - res: result.res - }; -}; - proto.deleteBucket = async function deleteBucket(name, options) { const params = this._bucketRequestParams('DELETE', name, '', options); const result = await this.request(params); diff --git a/lib/browser/client.js b/lib/browser/client.js index 44c4379bc..b7f9a416e 100644 --- a/lib/browser/client.js +++ b/lib/browser/client.js @@ -16,7 +16,6 @@ const dateFormat = require('dateformat'); const bowser = require('bowser'); const signUtils = require('../common/signUtils'); const _isIP = require('../common/utils/isIP'); -const _checkBucketName = require('../common/utils/checkBucketName'); const _initOptions = require('../common/client/initOptions'); const globalHttpAgent = new AgentKeepalive(); @@ -102,15 +101,7 @@ merge(proto, require('./object')); // /** // * Bucket operations // */ -/** - * check Bucket Name - */ -proto._checkBucketName = function (name) { - if (!_checkBucketName(name)) { - throw new Error('The bucket must be conform to the specifications'); - } -}; // merge(proto, require('./bucket')); diff --git a/lib/bucket.js b/lib/bucket.js index 271a0cb5d..f406b7b0f 100644 --- a/lib/bucket.js +++ b/lib/bucket.js @@ -1,7 +1,6 @@ const assert = require('assert'); -const _checkBucketName = require('./common/utils/checkBucketName'); const proto = exports; @@ -17,16 +16,6 @@ function toArray(obj) { return [obj]; } -/** - * check Bucket Name - */ - -proto._checkBucketName = function (name) { - if (!_checkBucketName(name)) { - throw new Error('The bucket must be conform to the specifications'); - } -}; - /** * Bucket opertaions */ @@ -113,38 +102,6 @@ proto.getBucketInfo = async function getBucketInfo(name, options) { }; }; -proto.putBucket = async function putBucket(name, options) { - this._checkBucketName(name); - options = options || {}; - const params = this._bucketRequestParams('PUT', name, '', options); - - const startTag = '\n'; - const endTag = ''; - let paramlXML = ''; - - // server not support - // if (region) { - // paramlXML += `${region}`; - // params.content = `${startTag}${paramlXML}${endTag}`; - // } - - if (options.StorageClass) { - paramlXML += `${options.StorageClass}`; - } - - if (paramlXML) { - params.mime = 'xml'; - params.content = `${startTag}${paramlXML}${endTag}`; - } - - params.successStatuses = [200]; - const result = await this.request(params); - return { - bucket: (result.headers.location && result.headers.location.substring(1)) || null, - res: result.res - }; -}; - proto.deleteBucket = async function deleteBucket(name, options) { this._checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, '', options); diff --git a/lib/common/bucket/_checkBucketName.js b/lib/common/bucket/_checkBucketName.js new file mode 100644 index 000000000..bddbbc622 --- /dev/null +++ b/lib/common/bucket/_checkBucketName.js @@ -0,0 +1,9 @@ +const checkBucketName = require('../utils/checkBucketName'); + +const proto = exports; + +proto._checkBucketName = function (name, createBucket) { + if (!checkBucketName(name, createBucket)) { + throw new Error('The bucket must be conform to the specifications'); + } +}; diff --git a/lib/common/bucket/index.js b/lib/common/bucket/index.js index 9fa19b897..59e8de83b 100644 --- a/lib/common/bucket/index.js +++ b/lib/common/bucket/index.js @@ -10,3 +10,5 @@ merge(proto, require('./deleteBucketEncryption')); merge(proto, require('./getBucketTags')); merge(proto, require('./putBucketTags')); merge(proto, require('./deleteBucketTags')); +merge(proto, require('./putBucket')); +merge(proto, require('./_checkBucketName')); diff --git a/lib/common/bucket/putBucket.js b/lib/common/bucket/putBucket.js new file mode 100644 index 000000000..86f54251d --- /dev/null +++ b/lib/common/bucket/putBucket.js @@ -0,0 +1,26 @@ +const proto = exports; +const obj2xml = require('../utils/obj2xml'); + +proto.putBucket = async function putBucket(name, options) { + this._checkBucketName(name, true); + options = options || {}; + const params = this._bucketRequestParams('PUT', name, '', options); + + const CreateBucketConfiguration = {}; + const paramlXMLObJ = { + CreateBucketConfiguration + }; + + if (options.StorageClass) { + CreateBucketConfiguration.StorageClass = options.StorageClass; + params.mime = 'xml'; + params.content = obj2xml(paramlXMLObJ, { headers: true }); + } + + params.successStatuses = [200]; + const result = await this.request(params); + return { + bucket: (result.headers.location && result.headers.location.substring(1)) || null, + res: result.res + }; +}; diff --git a/lib/common/utils/checkBucketName.js b/lib/common/utils/checkBucketName.js index b5d59466a..531ff21fc 100644 --- a/lib/common/utils/checkBucketName.js +++ b/lib/common/utils/checkBucketName.js @@ -2,8 +2,8 @@ * check Bucket Name */ -module.exports = function (name) { - const bucketRegex = /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/; +module.exports = function (name, createBucket) { + const bucketRegex = createBucket ? /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/ : /^[a-z0-9_][a-z0-9-_]{1,61}[a-z0-9_]$/; const checkBucket = bucketRegex.test(name); return checkBucket; }; diff --git a/test/node/bucket.test.js b/test/node/bucket.test.js index d9cdf028b..af2e12bfc 100644 --- a/test/node/bucket.test.js +++ b/test/node/bucket.test.js @@ -83,11 +83,6 @@ describe('test/bucket.test.js', () => { const result1 = await store.putBucket(name); assert.equal(result1.bucket, name); assert.equal(result1.res.status, 200); - - // create a exists should work - const result2 = await store.putBucket(name); - assert.equal(result2.res.status, 200); - assert.equal(result2.bucket, name); }); it('should create an archive bucket', async () => { @@ -95,7 +90,6 @@ describe('test/bucket.test.js', () => { const result2 = await store.listBuckets(); const { buckets } = result2; const m = buckets.some(item => item.name === archvieBucket); - console.log(buckets); assert(m === true); buckets.map((item) => { if (item.name === archvieBucket) { From 02d59dae9f258abeef1189ed7bb15a299b709e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Tue, 24 Mar 2020 14:28:49 +0800 Subject: [PATCH 03/13] feat: image processing (#744) close #676 --- README.md | 27 +++++++++++ lib/browser/object.js | 1 + lib/client.js | 1 + lib/common/image/index.js | 5 ++ lib/common/image/processObjectSave.js | 42 ++++++++++++++++ package.json | 1 + test/node/object.test.js | 69 +++++++++++++++++++++++++++ 7 files changed, 146 insertions(+) create mode 100644 lib/common/image/index.js create mode 100644 lib/common/image/processObjectSave.js diff --git a/README.md b/README.md index b96edf7e2..c0f379218 100644 --- a/README.md +++ b/README.md @@ -2673,6 +2673,33 @@ object: - status {Number} response status - res {Object} response info +### .processObjectSave(sourceObject, targetObject, process[, targetBucket]) + +Persistency indicates that images are asynchronously stored in the specified Bucket + +parameters: + +- sourceObject {String} source object name +- targetObject {String} target object name +- process {String} process string +- [targetBucket] {String} target bucket + +Success will return the channel information. + +object: + +- status {Number} response status +- res {Object} response info + + +```js +const sourceObject = 'a.png' +const targetObject = 'b.png' +const process = 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00' + +await this.store.processObjectSave(sourceObject, targetObject, process); +``` + ## RTMP Operations All operations function is [async], except `getRtmpUrl`. diff --git a/lib/browser/object.js b/lib/browser/object.js index acf9569e3..da4e3526a 100644 --- a/lib/browser/object.js +++ b/lib/browser/object.js @@ -278,6 +278,7 @@ merge(proto, require('../common/object/copyObject')); merge(proto, require('../common/object/getObjectTagging')); merge(proto, require('../common/object/putObjectTagging')); merge(proto, require('../common/object/deleteObjectTagging')); +merge(proto, require('../common/image')); proto.putMeta = async function putMeta(name, meta, options) { const copyResult = await this.copy(name, name, { diff --git a/lib/client.js b/lib/client.js index b2027e01b..5009b4314 100644 --- a/lib/client.js +++ b/lib/client.js @@ -73,6 +73,7 @@ const proto = Client.prototype; */ merge(proto, require('./common/object')); merge(proto, require('./object')); +merge(proto, require('./common/image')); /** * Bucket operations */ diff --git a/lib/common/image/index.js b/lib/common/image/index.js new file mode 100644 index 000000000..1e319c289 --- /dev/null +++ b/lib/common/image/index.js @@ -0,0 +1,5 @@ +const merge = require('merge-descriptors'); + +const proto = exports; + +merge(proto, require('./processObjectSave')); diff --git a/lib/common/image/processObjectSave.js b/lib/common/image/processObjectSave.js new file mode 100644 index 000000000..320864f2d --- /dev/null +++ b/lib/common/image/processObjectSave.js @@ -0,0 +1,42 @@ +/* eslint-disable no-use-before-define */ +const querystring = require('querystring'); +const { Base64: { encode: str2Base64 } } = require('js-base64'); + +const proto = exports; + +proto.processObjectSave = async function processObjectSave(sourceObject, targetObject, process, targetBucket) { + checkArgs(sourceObject, 'sourceObject'); + checkArgs(targetObject, 'targetObject'); + checkArgs(process, 'process'); + targetObject = this._objectName(targetObject); + if (targetBucket) { + this._checkBucketName(targetBucket); + } + + const params = this._objectRequestParams('POST', sourceObject, { + subres: 'x-oss-process' + }); + + const bucketParam = targetBucket ? `,b_${str2Base64(targetBucket)}` : ''; + targetObject = str2Base64(targetObject); + + const content = { + 'x-oss-process': `${process}|sys/saveas,o_${targetObject}${bucketParam}` + }; + params.content = querystring.stringify(content); + + const result = await this.request(params); + return { + res: result.res, + status: result.res.status + }; +}; + +function checkArgs(name, key) { + if (!name) { + throw new Error(`${key} is required`); + } + if (typeof name !== 'string') { + throw new Error(`${key} must be String`); + } +} diff --git a/package.json b/package.json index 8a97fe001..d386b6abf 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ "get-ready": "^1.0.0", "humanize-ms": "^1.2.0", "is-type-of": "^1.0.0", + "js-base64": "^2.5.2", "jstoxml": "^0.2.3", "merge-descriptors": "^1.0.1", "mime": "^1.3.4", diff --git a/test/node/object.test.js b/test/node/object.test.js index 73dba4aff..86ea7d7ee 100644 --- a/test/node/object.test.js +++ b/test/node/object.test.js @@ -161,6 +161,75 @@ describe('test/object.test.js', () => { }); }); + describe('processObjectSave()', () => { + const name = 'sourceObject.png'; + before(async () => { + const imagepath = path.join(__dirname, 'nodejs-1024x768.png'); + await store.putStream(name, fs.createReadStream(imagepath), { + mime: 'image/png' + }); + }); + const target = `processObject_target${Date.now()}.jpg`; + it('should process image', async () => { + try { + const result = await store.processObjectSave(name, target, 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,'); + assert.strictEqual(result.res.status, 200); + } catch (error) { + assert(false, error); + } + }); + it('should process image with targetBucket', async () => { + try { + const result = await store.processObjectSave(name, target, 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,', archvieBucket); + assert.strictEqual(result.res.status, 200); + } catch (error) { + assert(false, error); + } + }); + it('should throw error when sourceObjectName is invalid', async () => { + try { + await store.processObjectSave('', target, 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,'); + assert(false); + } catch (error) { + assert(error.message.includes('required')); + } + try { + await store.processObjectSave({}, target, 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,'); + assert(false); + } catch (error) { + assert(error.message.includes('must be String')); + } + }); + it('should throw error when targetObjectName is invalid', async () => { + try { + await store.processObjectSave(name, '', 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,'); + assert(false); + } catch (error) { + assert(error.message.includes('required')); + } + try { + await store.processObjectSave(name, {}, 'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00,'); + assert(false); + } catch (error) { + assert(error.message.includes('must be String')); + } + }); + it('should throw error when process is invalid', async () => { + try { + await store.processObjectSave(name, target, ''); + assert(false); + } catch (error) { + assert(error.message.includes('required')); + } + try { + await store.processObjectSave(name, target, {}); + assert(false); + } catch (error) { + assert(error.message.includes('must be String')); + } + }); + }); + describe('getObjectUrl()', () => { it('should return object url', () => { let name = 'test.js'; From e1cb4387c5436258a68993ceddf7d72e16ee7cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Tue, 24 Mar 2020 14:35:38 +0800 Subject: [PATCH 04/13] feat: putBucketWebsite support new parameter (#736) --- README.md | 6 ++ lib/browser/bucket.js | 43 --------- lib/browser/client.js | 9 +- lib/bucket.js | 52 +--------- lib/common/bucket/deleteBucketWebsite.js | 11 +++ lib/common/bucket/getBucketWebsite.js | 27 ++++++ lib/common/bucket/index.js | 3 + lib/common/bucket/putBucketWebsite.js | 49 ++++++++++ lib/common/utils/isArray.js | 3 + test/node/bucket.test.js | 117 +++++++++++++++++++++-- 10 files changed, 214 insertions(+), 106 deletions(-) create mode 100644 lib/common/bucket/deleteBucketWebsite.js create mode 100644 lib/common/bucket/getBucketWebsite.js create mode 100644 lib/common/bucket/putBucketWebsite.js create mode 100644 lib/common/utils/isArray.js diff --git a/README.md b/README.md index c0f379218..9afda8883 100644 --- a/README.md +++ b/README.md @@ -638,6 +638,9 @@ parameters: - config {Object} website config, contains blow properties: - index {String} default page, e.g.: `index.html` - [error] {String} error page, e.g.: 'error.html' + - [supportSubDir] {String} default vaule false + - [type] {String} default value 0 + - [routingRules] {Array} RoutingRules - [options] {Object} optional parameters - [timeout] {Number} the operation timeout @@ -672,6 +675,9 @@ Success will return: - index {String} index page - error {String} error page, maybe `null` +- supportSubDir {String} +- type {String} +- routingRules {Array} - res {Object} response info, including - status {Number} response status - headers {Object} response headers diff --git a/lib/browser/bucket.js b/lib/browser/bucket.js index 57ddae862..bad425ccf 100644 --- a/lib/browser/bucket.js +++ b/lib/browser/bucket.js @@ -159,49 +159,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { }; }; -// website - -proto.putBucketWebsite = async function putBucketWebsite(name, config, options) { - // config: index, [error] - const params = this._bucketRequestParams('PUT', name, 'website', options); - config = config || {}; - config.index = config.index || 'index.html'; - let xml = `${'\n\n' + - ' '}${config.index}\n`; - if (config.error) { - xml += `${config.error}\n`; - } - xml += ''; - params.content = xml; - params.mime = 'xml'; - params.successStatuses = [200]; - const result = await this.request(params); - return { - res: result.res - }; -}; - -proto.getBucketWebsite = async function getBucketWebsite(name, options) { - const params = this._bucketRequestParams('GET', name, 'website', options); - params.successStatuses = [200]; - params.xmlResponse = true; - const result = await this.request(params); - return { - index: result.data.IndexDocument.Suffix, - error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null, - res: result.res - }; -}; - -proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) { - const params = this._bucketRequestParams('DELETE', name, 'website', options); - params.successStatuses = [204]; - const result = await this.request(params); - return { - res: result.res - }; -}; - // lifecycle proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { diff --git a/lib/browser/client.js b/lib/browser/client.js index b7f9a416e..e8f7fd659 100644 --- a/lib/browser/client.js +++ b/lib/browser/client.js @@ -98,9 +98,12 @@ proto.debug = debug; * Object operations */ merge(proto, require('./object')); -// /** -// * Bucket operations -// */ +/** + * Bucket operations + */ +merge(proto, require('../common/bucket/getBucketWebsite')); +merge(proto, require('../common/bucket/putBucketWebsite')); +merge(proto, require('../common/bucket/deleteBucketWebsite')); // merge(proto, require('./bucket')); diff --git a/lib/bucket.js b/lib/bucket.js index f406b7b0f..18ec769a9 100644 --- a/lib/bucket.js +++ b/lib/bucket.js @@ -1,15 +1,11 @@ const assert = require('assert'); +const isArray = require('./common/utils/isArray'); const proto = exports; -function isArray(arr) { - if (Array.isArray) return Array.isArray(arr); - return Object.prototype.toString.call(arr) === '[object Array]'; -} - function toArray(obj) { if (!obj) return []; if (isArray(obj)) return obj; @@ -190,52 +186,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { }; }; -// website - -proto.putBucketWebsite = async function putBucketWebsite(name, config, options) { - this._checkBucketName(name); - // config: index, [error] - const params = this._bucketRequestParams('PUT', name, 'website', options); - config = config || {}; - config.index = config.index || 'index.html'; - let xml = `${'\n\n' + - ' '}${config.index}\n`; - if (config.error) { - xml += `${config.error}\n`; - } - xml += ''; - params.content = xml; - params.mime = 'xml'; - params.successStatuses = [200]; - const result = await this.request(params); - return { - res: result.res - }; -}; - -proto.getBucketWebsite = async function getBucketWebsite(name, options) { - this._checkBucketName(name); - const params = this._bucketRequestParams('GET', name, 'website', options); - params.successStatuses = [200]; - params.xmlResponse = true; - const result = await this.request(params); - return { - index: result.data.IndexDocument.Suffix, - error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null, - res: result.res - }; -}; - -proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) { - this._checkBucketName(name); - const params = this._bucketRequestParams('DELETE', name, 'website', options); - params.successStatuses = [204]; - const result = await this.request(params); - return { - res: result.res - }; -}; - // lifecycle proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { diff --git a/lib/common/bucket/deleteBucketWebsite.js b/lib/common/bucket/deleteBucketWebsite.js new file mode 100644 index 000000000..4defbc6fe --- /dev/null +++ b/lib/common/bucket/deleteBucketWebsite.js @@ -0,0 +1,11 @@ +const proto = exports; + +proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) { + this._checkBucketName(name); + const params = this._bucketRequestParams('DELETE', name, 'website', options); + params.successStatuses = [204]; + const result = await this.request(params); + return { + res: result.res + }; +}; diff --git a/lib/common/bucket/getBucketWebsite.js b/lib/common/bucket/getBucketWebsite.js new file mode 100644 index 000000000..fe6be62f7 --- /dev/null +++ b/lib/common/bucket/getBucketWebsite.js @@ -0,0 +1,27 @@ +const isObject = require('../utils/isObject'); + +const proto = exports; + +proto.getBucketWebsite = async function getBucketWebsite(name, options) { + this._checkBucketName(name); + const params = this._bucketRequestParams('GET', name, 'website', options); + params.successStatuses = [200]; + params.xmlResponse = true; + const result = await this.request(params); + let routingRules = []; + if (result.data.RoutingRules && result.data.RoutingRules.RoutingRule) { + if (isObject(result.data.RoutingRules.RoutingRule)) { + routingRules = [result.data.RoutingRules.RoutingRule]; + } else { + routingRules = result.data.RoutingRules.RoutingRule; + } + } + return { + index: (result.data.IndexDocument && result.data.IndexDocument.Suffix) || '', + supportSubDir: (result.data.IndexDocument && result.data.IndexDocument.SupportSubDir) || 'false', + type: (result.data.IndexDocument && result.data.IndexDocument.Type), + routingRules, + error: (result.data.ErrorDocument && result.data.ErrorDocument.Key) || null, + res: result.res + }; +}; diff --git a/lib/common/bucket/index.js b/lib/common/bucket/index.js index 59e8de83b..fe95ddb11 100644 --- a/lib/common/bucket/index.js +++ b/lib/common/bucket/index.js @@ -12,3 +12,6 @@ merge(proto, require('./putBucketTags')); merge(proto, require('./deleteBucketTags')); merge(proto, require('./putBucket')); merge(proto, require('./_checkBucketName')); +merge(proto, require('./getBucketWebsite')); +merge(proto, require('./putBucketWebsite')); +merge(proto, require('./deleteBucketWebsite')); diff --git a/lib/common/bucket/putBucketWebsite.js b/lib/common/bucket/putBucketWebsite.js new file mode 100644 index 000000000..87b5e2293 --- /dev/null +++ b/lib/common/bucket/putBucketWebsite.js @@ -0,0 +1,49 @@ +const obj2xml = require('../utils/obj2xml'); +const isArray = require('../utils/isArray'); + +const proto = exports; +proto.putBucketWebsite = async function putBucketWebsite(name, config = {}, options) { + this._checkBucketName(name); + const params = this._bucketRequestParams('PUT', name, 'website', options); + const IndexDocument = { + Suffix: config.index || 'index.html' + }; + const WebsiteConfiguration = { + IndexDocument + }; + let website = { + WebsiteConfiguration + }; + + if (config.supportSubDir) { + IndexDocument.SupportSubDir = config.supportSubDir; + } + + if (config.type) { + IndexDocument.Type = config.type; + } + + if (config.error) { + WebsiteConfiguration.ErrorDocument = { + Key: config.error + }; + } + + if (config.routingRules !== undefined) { + if (!isArray(config.routingRules)) { + throw new Error('RoutingRules must be Array'); + } + WebsiteConfiguration.RoutingRules = { + RoutingRule: config.routingRules + }; + } + + website = obj2xml(website); + params.content = website; + params.mime = 'xml'; + params.successStatuses = [200]; + const result = await this.request(params); + return { + res: result.res + }; +}; diff --git a/lib/common/utils/isArray.js b/lib/common/utils/isArray.js new file mode 100644 index 000000000..8e28d0b2b --- /dev/null +++ b/lib/common/utils/isArray.js @@ -0,0 +1,3 @@ +module.exports = function isArray(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; +}; diff --git a/test/node/bucket.test.js b/test/node/bucket.test.js index af2e12bfc..47378be01 100644 --- a/test/node/bucket.test.js +++ b/test/node/bucket.test.js @@ -251,17 +251,10 @@ describe('test/bucket.test.js', () => { }); describe('putBucketWebsite(), getBucketWebsite(), deleteBucketWebsite()', () => { - it('should create, get and delete the website settings', async () => { - const result1 = await store.putBucketWebsite(bucket, { + it('should get and delete the website settings', async () => { + await store.putBucketWebsite(bucket, { index: 'index.html' }); - assert.equal(result1.res.status, 200); - // put again will be fine - const result2 = await store.putBucketWebsite(bucket, { - index: 'index.htm', - error: 'error.htm' - }); - assert.equal(result2.res.status, 200); await utils.sleep(ms(metaSyncTime)); @@ -274,6 +267,112 @@ describe('test/bucket.test.js', () => { const del = await store.deleteBucketWebsite(bucket); assert.equal(del.res.status, 204); }); + + it('should create when RoutingRules is Array or Object', async () => { + const routingRule1 = { + RuleNumber: '1', + Condition: { + KeyPrefixEquals: 'abc/', + HttpErrorCodeReturnedEquals: '404' + }, + Redirect: { + RedirectType: 'Mirror', + MirrorUsingRole: 'false', + MirrorUserLastModified: 'false', + PassQueryString: 'true', + MirrorIsExpressTunnel: 'false', + MirrorPassOriginalSlashes: 'false', + MirrorAllowHeadObject: 'false', + MirrorURL: 'http://www.test.com/', + MirrorPassQueryString: 'true', + MirrorFollowRedirect: 'true', + MirrorCheckMd5: 'true', + MirrorHeaders: { + PassAll: 'true', + Pass: ['myheader-key1', 'myheader-key2'], + Remove: ['remove1', 'remove2'], + Set: { + Key: 'myheader-key5', + Value: 'myheader-value5' + } + } + } + }; + const routingRules = [ + { + RuleNumber: '2', + Condition: { + KeyPrefixEquals: 'a1bc/', + HttpErrorCodeReturnedEquals: '404' + }, + Redirect: { + RedirectType: 'Mirror', + MirrorUsingRole: 'false', + MirrorUserLastModified: 'false', + MirrorAllowHeadObject: 'false', + MirrorIsExpressTunnel: 'false', + MirrorPassOriginalSlashes: 'false', + PassQueryString: 'true', + MirrorURL: 'http://www.test1.com/', + MirrorPassQueryString: 'true', + MirrorFollowRedirect: 'true', + MirrorCheckMd5: 'true', + MirrorHeaders: { + PassAll: 'true', + Pass: ['myheader-key12', 'myheader-key22'], + Remove: ['remove1', 'remove2'], + Set: { + Key: 'myheader-key5', + Value: 'myheader-value5' + } + } + } + }]; + const website = { + index: 'index1.html', + supportSubDir: 'true', + type: '1', + error: 'error1.html', + routingRules + }; + + const result1 = await store.putBucketWebsite(bucket, website); + assert.strictEqual(result1.res.status, 200); + const rules1 = await store.getBucketWebsite(bucket); + assert.deepStrictEqual(rules1.routingRules, routingRules); + assert.strictEqual(rules1.supportSubDir, website.supportSubDir); + assert.strictEqual(rules1.type, website.type); + + website.routingRules = [routingRule1]; + const result2 = await store.putBucketWebsite(bucket, website); + assert.strictEqual(result2.res.status, 200); + const rules2 = await store.getBucketWebsite(bucket); + assert.deepStrictEqual(rules2.routingRules, website.routingRules); + }); + + it('should throw error when RoutingRules is not Array', async () => { + const website = { + index: 'index1.html', + supportSubDir: 'true', + type: '1', + error: 'error1.html', + routingRules: '' + }; + + try { + await store.putBucketWebsite(bucket, website); + assert(false); + } catch (error) { + assert.strictEqual(error.message, 'RoutingRules must be Array'); + } + try { + website.RoutingRules = 0; + await store.putBucketWebsite(bucket, website); + assert(false); + } catch (error) { + assert.strictEqual(error.message, 'RoutingRules must be Array'); + } + }); }); describe('putBucketLifecycle(), getBucketLifecycle(), deleteBucketLifecycle()', () => { From 17c29843f9f82f1534886ac76ccbe0aa36a295c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Wed, 25 Mar 2020 13:34:07 +0800 Subject: [PATCH 05/13] feat: support for the latest putBucketLifecycle api features (#757) --- README.md | 21 +- lib/browser/bucket.js | 70 --- lib/browser/client.js | 5 +- lib/bucket.js | 73 --- lib/common/bucket/deleteBucketLifecycle.js | 11 + lib/common/bucket/getBucketLifecycle.js | 33 ++ lib/common/bucket/index.js | 3 + lib/common/bucket/putBucketLifecycle.js | 122 +++++ lib/common/utils/formatObjKey.js | 29 ++ lib/common/utils/getStrBytesCount.js | 12 + lib/common/utils/obj2xml.js | 5 + test/node/bucket.test.js | 501 +++++++++++++++++++-- 12 files changed, 699 insertions(+), 186 deletions(-) create mode 100644 lib/common/bucket/deleteBucketLifecycle.js create mode 100644 lib/common/bucket/getBucketLifecycle.js create mode 100644 lib/common/bucket/putBucketLifecycle.js create mode 100644 lib/common/utils/formatObjKey.js create mode 100644 lib/common/utils/getStrBytesCount.js diff --git a/README.md b/README.md index 9afda8883..7f808219f 100644 --- a/README.md +++ b/README.md @@ -791,9 +791,24 @@ parameters: - [id] {String} rule id, if not set, OSS will auto create it with random string. - prefix {String} store prefix - status {String} rule status, allow values: `Enabled` or `Disabled` - - [days] {Number|String} expire after the `days` - - [date] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z` - `date` and `days` only set one. + - [expiration] {Object} specifies the expiration attribute of the lifecycle rules for the object. + - [days] {Number|String} expire after the `days` + - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z` + `createdBeforeDate` and `days` must have one. + - [abortMultipartUpload] {Object} Specifies the expiration attribute of the multipart upload tasks that are not complete. + - [days] {Number|String} expire after the `days` + - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z` + `createdBeforeDate` and `days` must have one. + - [transition] {Object} Specifies the time when an object is converted to the IA or archive storage class during a valid life cycle. + - storageClass {String} Specifies the storage class that objects that conform to the rule are converted into. allow values: `IA` or `Archive` + - [days] {Number|String} expire after the `days` + - [createdBeforeDate] {String} expire date, e.g.: `2022-10-11T00:00:00.000Z` + `createdBeforeDate` and `days` must have one. + `expiration`、 `abortMultipartUpload`、 `transition` must have one. + - [tag] {Object} Specifies the object tag applicable to a rule. Multiple tags are supported. + - key {String} Indicates the tag key. + - value {String} Indicates the tag value. + `tag` cannot be used with `abortMultipartUpload` - [options] {Object} optional parameters - [timeout] {Number} the operation timeout diff --git a/lib/browser/bucket.js b/lib/browser/bucket.js index bad425ccf..42045b571 100644 --- a/lib/browser/bucket.js +++ b/lib/browser/bucket.js @@ -159,76 +159,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { }; }; -// lifecycle - -proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { - // rules: [rule, ...] - // rule: [id], prefix, status, expiration, [days or date] - // status: 'Enabled' or 'Disabled' - const params = this._bucketRequestParams('PUT', name, 'lifecycle', options); - let xml = '\n\n'; - for (let i = 0; i < rules.length; i++) { - const rule = rules[i]; - const expiration = rule.days ? - `${rule.days}` - : - `${rule.date}`; - const id = rule.id ? `${rule.id}\n` : ''; - xml += ` \n${id - } ${rule.prefix}\n` + - ` ${rule.status}\n` + - ` ${expiration}\n` + - ' \n'; - } - xml += ''; - params.content = xml; - params.mime = 'xml'; - params.successStatuses = [200]; - const result = await this.request(params); - return { - res: result.res - }; -}; - -proto.getBucketLifecycle = async function getBucketLifecycle(name, options) { - const params = this._bucketRequestParams('GET', name, 'lifecycle', options); - params.successStatuses = [200]; - params.xmlResponse = true; - const result = await this.request(params); - let rules = result.data.Rule || null; - if (rules) { - if (!isArray(rules)) { - rules = [rules]; - } - rules = rules.map((rule) => { - const item = { - id: rule.ID, - prefix: rule.Prefix, - status: rule.Status - }; - if (rule.Expiration.Days) { - item.days = rule.Expiration.Days; - } else { - item.date = rule.Expiration.Date; - } - return item; - }); - } - return { - rules, - res: result.res - }; -}; - -proto.deleteBucketLifecycle = async function deleteBucketLifecycle(name, options) { - const params = this._bucketRequestParams('DELETE', name, 'lifecycle', options); - params.successStatuses = [204]; - const result = await this.request(params); - return { - res: result.res - }; -}; - proto.putBucketCORS = async function putBucketCORS(name, rules, options) { rules = rules || []; assert(rules.length, 'rules is required'); diff --git a/lib/browser/client.js b/lib/browser/client.js index e8f7fd659..7fd8a8f40 100644 --- a/lib/browser/client.js +++ b/lib/browser/client.js @@ -105,7 +105,10 @@ merge(proto, require('../common/bucket/getBucketWebsite')); merge(proto, require('../common/bucket/putBucketWebsite')); merge(proto, require('../common/bucket/deleteBucketWebsite')); -// merge(proto, require('./bucket')); +// lifecycle +merge(proto, require('../common/bucket/getBucketLifecycle')); +merge(proto, require('../common/bucket/putBucketLifecycle')); +merge(proto, require('../common/bucket/deleteBucketLifecycle')); // multipart upload diff --git a/lib/bucket.js b/lib/bucket.js index 18ec769a9..2f6ebb9fe 100644 --- a/lib/bucket.js +++ b/lib/bucket.js @@ -186,79 +186,6 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { }; }; -// lifecycle - -proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { - this._checkBucketName(name); - // rules: [rule, ...] - // rule: [id], prefix, status, expiration, [days or date] - // status: 'Enabled' or 'Disabled' - const params = this._bucketRequestParams('PUT', name, 'lifecycle', options); - let xml = '\n\n'; - for (let i = 0; i < rules.length; i++) { - const rule = rules[i]; - const expiration = rule.days ? - `${rule.days}` - : - `${rule.date}`; - const id = rule.id ? `${rule.id}\n` : ''; - xml += ` \n${id - } ${rule.prefix}\n` + - ` ${rule.status}\n` + - ` ${expiration}\n` + - ' \n'; - } - xml += ''; - params.content = xml; - params.mime = 'xml'; - params.successStatuses = [200]; - const result = await this.request(params); - return { - res: result.res - }; -}; - -proto.getBucketLifecycle = async function getBucketLifecycle(name, options) { - this._checkBucketName(name); - const params = this._bucketRequestParams('GET', name, 'lifecycle', options); - params.successStatuses = [200]; - params.xmlResponse = true; - const result = await this.request(params); - let rules = result.data.Rule || null; - if (rules) { - if (!isArray(rules)) { - rules = [rules]; - } - rules = rules.map((rule) => { - const item = { - id: rule.ID, - prefix: rule.Prefix, - status: rule.Status - }; - if (rule.Expiration.Days) { - item.days = rule.Expiration.Days; - } else { - item.date = rule.Expiration.Date; - } - return item; - }); - } - return { - rules, - res: result.res - }; -}; - -proto.deleteBucketLifecycle = async function deleteBucketLifecycle(name, options) { - this._checkBucketName(name); - const params = this._bucketRequestParams('DELETE', name, 'lifecycle', options); - params.successStatuses = [204]; - const result = await this.request(params); - return { - res: result.res - }; -}; - proto.putBucketCORS = async function putBucketCORS(name, rules, options) { this._checkBucketName(name); rules = rules || []; diff --git a/lib/common/bucket/deleteBucketLifecycle.js b/lib/common/bucket/deleteBucketLifecycle.js new file mode 100644 index 000000000..f4c1d955a --- /dev/null +++ b/lib/common/bucket/deleteBucketLifecycle.js @@ -0,0 +1,11 @@ +const proto = exports; + +proto.deleteBucketLifecycle = async function deleteBucketLifecycle(name, options) { + this._checkBucketName(name); + const params = this._bucketRequestParams('DELETE', name, 'lifecycle', options); + params.successStatuses = [204]; + const result = await this.request(params); + return { + res: result.res + }; +}; diff --git a/lib/common/bucket/getBucketLifecycle.js b/lib/common/bucket/getBucketLifecycle.js new file mode 100644 index 000000000..72509a3e9 --- /dev/null +++ b/lib/common/bucket/getBucketLifecycle.js @@ -0,0 +1,33 @@ +const isArray = require('../utils/isArray'); +const formatObjKey = require('../utils/formatObjKey'); + +const proto = exports; + +proto.getBucketLifecycle = async function getBucketLifecycle(name, options) { + this._checkBucketName(name); + const params = this._bucketRequestParams('GET', name, 'lifecycle', options); + params.successStatuses = [200]; + params.xmlResponse = true; + const result = await this.request(params); + let rules = result.data.Rule || null; + if (rules) { + if (!isArray(rules)) { + rules = [rules]; + } + rules = rules.map((_) => { + if (_.ID) { + _.id = _.ID; + delete _.ID; + } + if (_.Tag && !isArray(_.Tag)) { + _.Tag = [_.Tag]; + } + return formatObjKey(_, 'firstLowerCase'); + }); + } + return { + rules, + res: result.res + }; +}; + diff --git a/lib/common/bucket/index.js b/lib/common/bucket/index.js index fe95ddb11..557224b27 100644 --- a/lib/common/bucket/index.js +++ b/lib/common/bucket/index.js @@ -15,3 +15,6 @@ merge(proto, require('./_checkBucketName')); merge(proto, require('./getBucketWebsite')); merge(proto, require('./putBucketWebsite')); merge(proto, require('./deleteBucketWebsite')); +merge(proto, require('./getBucketLifecycle')); +merge(proto, require('./putBucketLifecycle')); +merge(proto, require('./deleteBucketLifecycle')); diff --git a/lib/common/bucket/putBucketLifecycle.js b/lib/common/bucket/putBucketLifecycle.js new file mode 100644 index 000000000..7f8bdf211 --- /dev/null +++ b/lib/common/bucket/putBucketLifecycle.js @@ -0,0 +1,122 @@ +/* eslint-disable no-use-before-define */ + +const isArray = require('../utils/isArray'); +const deepCopy = require('../utils/deepCopy'); +const isObject = require('../utils/isObject'); +const obj2xml = require('../utils/obj2xml'); +const checkObjectTag = require('../utils/checkObjectTag'); +const getStrBytesCount = require('../utils/getStrBytesCount'); + +const proto = exports; + + +proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { + this._checkBucketName(name); + + if (!isArray(rules)) { + throw new Error('rules must be Array'); + } + + const params = this._bucketRequestParams('PUT', name, 'lifecycle', options); + const Rule = []; + const paramXMLObj = { + LifecycleConfiguration: { + Rule + } + }; + + rules.forEach((_) => { + defaultDaysAndDate2Expiration(_); // todo delete, 兼容旧版本 + checkRule(_); + if (_.id) { + _.ID = _.id; + delete _.id; + } + Rule.push(_); + }); + + const paramXML = obj2xml(paramXMLObj, { + headers: true, + firstUpperCase: true + }); + + params.content = paramXML; + params.mime = 'xml'; + params.successStatuses = [200]; + const result = await this.request(params); + return { + res: result.res + }; +}; + +// todo delete, 兼容旧版本 +function defaultDaysAndDate2Expiration(obj) { + if (obj.days) { + obj.expiration = { + days: obj.days + }; + } + if (obj.date) { + obj.expiration = { + createdBeforeDate: obj.date + }; + } +} + +function checkDaysAndDate(obj, key) { + const { days, createdBeforeDate } = obj; + if (!days && !createdBeforeDate) { + throw new Error(`${key} must includes days or createdBeforeDate`); + } else if (days && !/^[1-9][0-9]*$/.test(days)) { + throw new Error('days must be a positive integer'); + } else if (createdBeforeDate && !/\d{4}-\d{2}-\d{2}T00:00:00.000Z/.test(createdBeforeDate)) { + throw new Error('createdBeforeDate must be date and conform to iso8601 format'); + } +} + +function handleCheckTag(tag) { + if (!isArray(tag) && !isObject(tag)) { + throw new Error('tag must be Object or Array'); + } + tag = isObject(tag) ? [tag] : tag; + const tagObj = {}; + const tagClone = deepCopy(tag); + tagClone.forEach((v) => { + tagObj[v.key] = v.value; + }); + + checkObjectTag(tagObj); +} + +function checkRule(rule) { + if (rule.id && getStrBytesCount(rule.id) > 255) throw new Error('ID is composed of 255 bytes at most'); + + if (rule.prefix === '' || rule.prefix === undefined) throw new Error('Rule must includes prefix'); + + if (!['Enabled', 'Disabled'].includes(rule.status)) throw new Error('Status must be Enabled or Disabled'); + + if (rule.transition) { + if (!['IA', 'Archive'].includes(rule.transition.storageClass)) throw new Error('StorageClass must be IA or Archive'); + checkDaysAndDate(rule.transition, 'Transition'); + } + + if (rule.expiration) { + checkDaysAndDate(rule.expiration, 'Expiration'); + } + + if (rule.abortMultipartUpload) { + checkDaysAndDate(rule.abortMultipartUpload, 'AbortMultipartUpload'); + } + + if (!rule.expiration && !rule.abortMultipartUpload && !rule.transition) { + throw new Error('Rule must includes expiration or abortMultipartUpload or transition'); + } + + if (rule.tag) { + if (rule.abortMultipartUpload) { + throw new Error('Tag cannot be used with abortMultipartUpload'); + } + handleCheckTag(rule.tag); + } +} + diff --git a/lib/common/utils/formatObjKey.js b/lib/common/utils/formatObjKey.js new file mode 100644 index 000000000..7e4760429 --- /dev/null +++ b/lib/common/utils/formatObjKey.js @@ -0,0 +1,29 @@ +/* eslint-disable no-use-before-define */ +module.exports = function formatObjKey(obj, type) { + if (obj === null || typeof obj !== 'object') { + return obj; + } + + let o; + if (Array.isArray(obj)) { + o = []; + for (let i = 0; i < obj.length; i++) { + o.push(formatObjKey(obj[i], type)); + } + } else { + o = {}; + Object.keys(obj).forEach((key) => { + o[handelFormat(key, type)] = formatObjKey(obj[key], type); + }); + } + return o; +}; + +function handelFormat(key, type) { + if (type === 'firstUpperCase') { + key = key.replace(/^./, _ => _.toUpperCase()); + } else if (type === 'firstLowerCase') { + key = key.replace(/^./, _ => _.toLowerCase()); + } + return key; +} diff --git a/lib/common/utils/getStrBytesCount.js b/lib/common/utils/getStrBytesCount.js new file mode 100644 index 000000000..fc5e09571 --- /dev/null +++ b/lib/common/utils/getStrBytesCount.js @@ -0,0 +1,12 @@ +module.exports = function getStrBytesCount(str) { + let bytesCount = 0; + for (let i = 0; i < str.length; i++) { + const c = str.charAt(i); + if (/^[\u00-\uff]$/.test(c)) { + bytesCount += 1; + } else { + bytesCount += 2; + } + } + return bytesCount; +}; diff --git a/lib/common/utils/obj2xml.js b/lib/common/utils/obj2xml.js index 19664f977..5b24d5f87 100644 --- a/lib/common/utils/obj2xml.js +++ b/lib/common/utils/obj2xml.js @@ -1,3 +1,5 @@ +const formatObjKey = require('./formatObjKey'); + function type(params) { return Object.prototype.toString .call(params) @@ -10,6 +12,9 @@ function obj2xml(obj, options) { if (options && options.headers) { s = '\n'; } + if (options && options.firstUpperCase) { + obj = formatObjKey(obj, 'firstUpperCase'); + } if (type(obj) === 'object') { Object.keys(obj).forEach((key) => { if (type(obj[key]) === 'string' || type(obj[key]) === 'number') { diff --git a/test/node/bucket.test.js b/test/node/bucket.test.js index 47378be01..27973966f 100644 --- a/test/node/bucket.test.js +++ b/test/node/bucket.test.js @@ -375,45 +375,6 @@ describe('test/bucket.test.js', () => { }); }); - describe('putBucketLifecycle(), getBucketLifecycle(), deleteBucketLifecycle()', () => { - it('should create, get and delete the lifecycle', async () => { - const putresult1 = await store.putBucketLifecycle(bucket, [{ - id: 'delete after one day', - prefix: 'logs/', - status: 'Enabled', - days: 1 - }]); - assert.equal(putresult1.res.status, 200); - - // put again will be fine - const putresult2 = await store.putBucketLifecycle(bucket, [ - { - id: 'delete after one day', - prefix: 'logs/', - status: 'Enabled', - days: 1 - }, - { - prefix: 'logs2/', - status: 'Disabled', - date: '2022-10-11T00:00:00.000Z' - } - ]); - assert.equal(putresult2.res.status, 200); - - await utils.sleep(ms(metaSyncTime)); - - // get - const getBucketLifecycle = await store.getBucketLifecycle(bucket); - assert(getBucketLifecycle.rules.length > 0); - assert.equal(getBucketLifecycle.res.status, 200); - - // delete it - const deleteResult = await store.deleteBucketLifecycle(bucket); - assert.equal(deleteResult.res.status, 204); - }); - }); - describe('putBucketReferer(), getBucketReferer(), deleteBucketReferer()', () => { it('should create, get and delete the referer', async () => { const putresult = await store.putBucketReferer(bucket, true, [ @@ -706,4 +667,466 @@ describe('test/bucket.test.js', () => { assert.equal(deleteResult.res.status, 204); }); }); + + describe('putBucketLifecycle()', () => { + // todo delete + it('should put the lifecycle with old api', async () => { + const putresult1 = await store.putBucketLifecycle(bucket, [{ + id: 'expiration1', + prefix: 'logs/', + status: 'Enabled', + days: 1 + }]); + assert.equal(putresult1.res.status, 200); + + const putresult2 = await store.putBucketLifecycle(bucket, [{ + id: 'expiration2', + prefix: 'logs/', + status: 'Enabled', + date: '2020-02-18T00:00:00.000Z' + }]); + assert.equal(putresult2.res.status, 200); + }); + + it('should put the lifecycle with expiration and id', async () => { + const putresult1 = await store.putBucketLifecycle(bucket, [{ + id: 'expiration1', + prefix: 'logs/', + status: 'Enabled', + expiration: { + days: 1 + } + }]); + assert.equal(putresult1.res.status, 200); + + const getBucketLifecycle = await store.getBucketLifecycle(bucket); + assert(getBucketLifecycle.rules.length > 0 && getBucketLifecycle.rules.find(v => v.id === 'expiration1')); + + const putresult2 = await store.putBucketLifecycle(bucket, [{ + id: 'expiration2', + prefix: 'logs/', + status: 'Enabled', + expiration: { + createdBeforeDate: '2020-02-18T00:00:00.000Z' + } + }]); + assert.equal(putresult2.res.status, 200); + }); + + it('should put the lifecycle with AbortMultipartUpload', async () => { + const putresult1 = await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload1', + prefix: 'logs/', + status: 'Enabled', + abortMultipartUpload: { + days: 1 + } + }]); + assert.equal(putresult1.res.status, 200); + + const putresult2 = await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload2', + prefix: 'logs/', + status: 'Enabled', + abortMultipartUpload: { + createdBeforeDate: '2020-02-18T00:00:00.000Z' + } + }]); + assert.equal(putresult2.res.status, 200); + }); + + it('should put the lifecycle with Transition', async () => { + const putresult1 = await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'logs/', + status: 'Enabled', + transition: { + createdBeforeDate: '2020-02-18T00:00:00.000Z', + storageClass: 'Archive' + }, + expiration: { + createdBeforeDate: '2020-02-19T00:00:00.000Z' + }, + tag: { + key: 'test', + value: '123' + } + }]); + assert.equal(putresult1.res.status, 200); + + const putresult2 = await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'logs/', + status: 'Enabled', + transition: { + days: 20, + storageClass: 'Archive' + }, + tag: { + key: 'test', + value: '123' + } + }]); + assert.equal(putresult2.res.status, 200); + }); + + it('should put the lifecycle with expiration and Tag', async () => { + const putresult1 = await store.putBucketLifecycle(bucket, [{ + id: 'tag1', + prefix: 'logs/', + status: 'Enabled', + expiration: { + days: 1 + }, + tag: { + key: 1, + value: '2' + } + }]); + assert.equal(putresult1.res.status, 200); + + const putresult2 = await store.putBucketLifecycle(bucket, [{ + id: 'tag2', + prefix: 'logs/', + status: 'Enabled', + expiration: { + createdBeforeDate: '2020-02-18T00:00:00.000Z' + }, + tag: { + key: 1, + value: '2' + } + }]); + assert.equal(putresult2.res.status, 200); + + const putresult3 = await store.putBucketLifecycle(bucket, [{ + id: 'tag2', + prefix: 'logs/', + status: 'Enabled', + expiration: { + createdBeforeDate: '2020-02-18T00:00:00.000Z' + }, + tag: [{ + key: 1, + value: '2' + }, { + key: 'testkey', + value: 'testvalue' + }] + }]); + assert.equal(putresult3.res.status, 200); + }); + + it('should throw error when id more than 255 bytes ', async () => { + const testID = Array(256).fill('a').join(''); + try { + await store.putBucketLifecycle(bucket, [{ + id: testID, + prefix: 'testid/', + status: 'Enabled' + }]); + assert(false); + } catch (error) { + assert(error.message.includes('255')); + } + }); + + it('should throw error when no prefix', async () => { + try { + await store.putBucketLifecycle(bucket, [{ + id: 'prefix', + status: 'Enabled' + }]); + assert(false); + } catch (error) { + assert(error.message.includes('prefix')); + } + }); + + it('should throw error when status is not Enabled or Disabled', async () => { + try { + await store.putBucketLifecycle(bucket, [{ + id: 'status', + prefix: 'fix/', + status: 'test' + }]); + assert(false); + } catch (error) { + assert(error.message.includes('Enabled or Disabled')); + } + try { + await store.putBucketLifecycle(bucket, [{ + id: 'status', + prefix: 'fix/', + status: '' + }]); + assert(false); + } catch (error) { + assert(error.message.includes('Enabled or Disabled')); + } + }); + + it('should throw error when storageClass is not Archive or IA', async () => { + try { + await store.putBucketLifecycle(bucket, [{ + id: 'storageClass', + prefix: 'fix/', + status: 'Enabled', + transition: { + createdBeforeDate: '2020-02-18T00:00:00.000Z', + storageClass: 'test' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes('IA or Archive')); + } + }); + + it('should throw error when transition must have days or createdBeforeDate', async () => { + try { + await store.putBucketLifecycle(bucket, [{ + id: 'storageClass', + prefix: 'fix/', + status: 'Enabled', + transition: { + storageClass: 'Archive' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes('days or createdBeforeDate')); + } + }); + + it('should throw error when days of transition is not a positive integer', async () => { + const errorMessage = 'a positive integer'; + try { + await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'fix/', + status: 'Enabled', + transition: { + days: 1.1, + storageClass: 'Archive' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + + try { + await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'fix/', + status: 'Enabled', + transition: { + days: 'asd', + storageClass: 'Archive' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + + it('should throw error when createdBeforeDate of transition is not iso8601 format', async () => { + const errorMessage = 'iso8601'; + try { + await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'fix/', + status: 'Enabled', + transition: { + createdBeforeDate: new Date().toISOString(), // eg: YYYY-MM-DDT00:00:00.000Z + storageClass: 'Archive' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + + try { + await store.putBucketLifecycle(bucket, [{ + id: 'transition', + prefix: 'fix/', + status: 'Enabled', + transition: { + createdBeforeDate: new Date().toString(), + storageClass: 'Archive' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + + it('should throw error when abortMultipartUpload must have days or createdBeforeDate', async () => { + try { + await store.putBucketLifecycle(bucket, [{ + id: 'storageClass', + prefix: 'fix/', + status: 'Enabled', + abortMultipartUpload: {} + }]); + assert(false); + } catch (error) { + assert(error.message.includes('days or createdBeforeDate')); + } + }); + + it('should throw error when days of abortMultipartUpload is not a positive integer', async () => { + const errorMessage = 'a positive integer'; + try { + await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload', + prefix: 'fix/', + status: 'Enabled', + abortMultipartUpload: { + days: 1.1 + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + + try { + await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload', + prefix: 'fix/', + status: 'Enabled', + abortMultipartUpload: { + days: 'a' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + + it('should throw error when createdBeforeDate of abortMultipartUpload is not iso8601 format', async () => { + const errorMessage = 'iso8601'; + try { + await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload', + prefix: 'fix/', + status: 'Enabled', + abortMultipartUpload: { + createdBeforeDate: new Date().toISOString() // eg: YYYY-MM-DDT00:00:00.000Z + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + + try { + await store.putBucketLifecycle(bucket, [{ + id: 'abortMultipartUpload', + prefix: 'fix/', + status: 'Enabled', + abortMultipartUpload: { + createdBeforeDate: new Date().toString() // eg: YYYY-MM-DDT00:00:00.000Z + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + + it('should throw error when rule have no expiration or abortMultipartUpload', async () => { + const errorMessage = 'expiration or abortMultipartUpload'; + try { + await store.putBucketLifecycle(bucket, [{ + prefix: 'expirationAndAbortMultipartUpload/', + status: 'Enabled' + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + + it('should throw error when tag is used with abortMultipartUpload', async () => { + const errorMessage = 'Tag cannot be used with abortMultipartUpload'; + try { + await store.putBucketLifecycle(bucket, [{ + prefix: 'expirationAndAbortMultipartUpload/', + status: 'Enabled', + abortMultipartUpload: { + days: 1 + }, + expiration: { + days: 1 + }, + tag: { + value: '1', + key: 'test' + } + }]); + assert(false); + } catch (error) { + assert(error.message.includes(errorMessage)); + } + }); + }); + + describe('getBucketLifecycle()', () => { + it('should get the lifecycle', async () => { + const putresult = await store.putBucketLifecycle(bucket, [{ + id: 'get_test', + prefix: 'logs/', + status: 'Enabled', + expiration: { + days: 1 + }, + tag: [{ + key: 'test', + value: '1' + }, + { + key: 'test1', + value: '2' + }] + }]); + assert.equal(putresult.res.status, 200); + + const getBucketLifecycle = await store.getBucketLifecycle(bucket); + assert(getBucketLifecycle.rules.length > 0); + assert.equal(getBucketLifecycle.res.status, 200); + }); + }); + + describe('deleteBucketLifecycle()', () => { + it('should delete the lifecycle', async () => { + const putresult = await store.putBucketLifecycle(bucket, [{ + id: 'delete', + prefix: 'logs/', + status: 'Enabled', + expiration: { + days: 1 + }, + tag: [{ + key: 'test', + value: '1' + }, + { + key: 'test1', + value: '2' + }] + }]); + assert.equal(putresult.res.status, 200); + + // delete it + const deleteResult = await store.deleteBucketLifecycle(bucket); + assert.equal(deleteResult.res.status, 204); + }); + }); }); From a57315fd86159420d512542df1e12a2dabfdebe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Wed, 25 Mar 2020 13:34:22 +0800 Subject: [PATCH 06/13] feat: signatureUrl support trafficLimit (#756) --- README.md | 1 + lib/common/signUtils.js | 7 ++++++- test/node/object.test.js | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f808219f..dc60b299c 100644 --- a/README.md +++ b/README.md @@ -1817,6 +1817,7 @@ parameters: - [Content-Type] {String} set the request content type - [process] {String} image process params, will send with `x-oss-process` e.g.: `{process: 'image/resize,w_200'}` + - [trafficLimit] {Number} traffic limit, range: `819200`~`838860800`. - [response] {Object} set the response headers for download - [content-type] {String} set the response content type - [content-disposition] {String} set the response content disposition diff --git a/lib/common/signUtils.js b/lib/common/signUtils.js index de757a9ff..926c2099f 100644 --- a/lib/common/signUtils.js +++ b/lib/common/signUtils.js @@ -112,6 +112,11 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r subResource[processKeyword] = options.process; } + if (options.trafficLimit) { + const trafficLimitKey = 'x-oss-traffic-limit'; + subResource[trafficLimitKey] = options.trafficLimit; + } + if (options.response) { Object.keys(options.response).forEach((k) => { const key = `response-${k.toLowerCase()}`; @@ -128,7 +133,7 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r headers[key] = value; } else if (lowerKey.indexOf('content-type') === 0) { headers[key] = value; - } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method') { + } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method' && lowerKey !== 'trafficLimit') { subResource[lowerKey] = value; } }); diff --git a/test/node/object.test.js b/test/node/object.test.js index 86ea7d7ee..30b17ff29 100644 --- a/test/node/object.test.js +++ b/test/node/object.test.js @@ -1038,6 +1038,41 @@ describe('test/object.test.js', () => { // http://www.aliyun.com/darwin-v4.4.2/ali-sdk/oss/get-meta.js?OSSAccessKeyId= assert.equal(url.indexOf('http://www.aliyun.com/'), 0); }); + + it('should signature url with traffic limit', async () => { + const name = `${prefix}ali-sdk/oss/trafficLimit.js`; + let url, result; + const file_1mb = path.join(__dirname, '.tmp', 'bigfile-1mb.bin'); + fs.writeFileSync(file_1mb, Buffer.alloc(1 * 1024 * 1024).fill('a\n')); + + try { + url = store.signatureUrl(name, { + trafficLimit: 8 * 1024 * 100 * 4, + method: 'PUT' + }) + + result = await store.urllib.request(url, { + method: 'PUT', + stream: fs.createReadStream(file_1mb), + timeout: 600000, + }); + assert.strictEqual(200, result.status) + } catch (error) { + assert(false, error.message) + } + + try { + url = store.signatureUrl(name, { + trafficLimit: 8 * 1024 * 100 * 4, + }) + result = await store.urllib.request(url, { + timeout: 600000, + }); + assert.strictEqual(200, result.status) + } catch (error) { + assert(false, error.message) + } + }); }); describe('getStream()', () => { From 2d2b33ae35b9996fadc74bbcf7a9bfe7f8ab3706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Wed, 25 Mar 2020 14:06:56 +0800 Subject: [PATCH 07/13] feat(node): bucket policy (#751) --- README.md | 70 +++++++++++++++++++++++++ lib/common/bucket/deleteBucketPolicy.js | 19 +++++++ lib/common/bucket/getBucketPolicy.js | 26 +++++++++ lib/common/bucket/index.js | 3 ++ lib/common/bucket/putBucketPolicy.js | 27 ++++++++++ test/node/bucket.test.js | 36 +++++++++++++ 6 files changed, 181 insertions(+) create mode 100644 lib/common/bucket/deleteBucketPolicy.js create mode 100644 lib/common/bucket/getBucketPolicy.js create mode 100644 lib/common/bucket/putBucketPolicy.js diff --git a/README.md b/README.md index dc60b299c..d881dc75d 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,10 @@ All operation use es7 async/await to implement. All api is async function. - [.putBucketTags(name, tag[, options])](#putBucketTagsname-tag-options) - [.getBucketTags(name, [, options])](#getBucketTagsname-options) - [.deleteBucketTags(name, [, options])](#deleteBucketTagsname-options) + - policy + - [.putBucketPolicy(name, policy[, options])](#putBucketPolicyname-policy-options) + - [.getBucketPolicy(name, [, options])](#getBucketPolicyname-options) + - [.deleteBucketPolicy(name, [, options])](#deleteBucketPolicyname-options) - [Object Operations](#object-operations) - [.list(query[, options])](#listquery-options) - [.put(name, file[, options])](#putname-file-options) @@ -1087,6 +1091,72 @@ Success will return: --- +### .putBucketPolicy(name, policy[, options]) + +Adds or modify policy for a bucket. + +parameters: + +- name {String} the bucket name +- policy {Object} bucket policy +- [options] {Object} optional args + +Success will return: + +- status {Number} response status +- res {Object} response info + +example: +```js +const policy = { + Version: '1', + Statement: [ + { + Action: ['oss:PutObject', 'oss:GetObject'], + Effect: 'Deny', + Principal: ['1234567890'], + Resource: ['acs:oss:*:1234567890:*/*'] + } + ] +}; +const result = await store.putBucketPolicy(bucket, policy); +console.log(result); +``` +--- + +### .getBucketPolicy(name[, options]) + +Obtains the policy for a bucket. + +parameters: + +- name {String} the bucket name +- [options] {Object} optional args + +Success will return: + +- policy {Object} the policy of bucket, if not exist, the value is null +- res {Object} response info +- status {Number} response status + +--- + +### .deleteBucketPolicy(name[, options]) + +Deletes the policy added for a bucket. + +parameters: + +- name {String} the bucket name +- [options] {Object} optional args + +Success will return: + +- status {Number} response status +- res {Object} response info + +--- + ## Object Operations All operations function return Promise, except `signatureUrl`. diff --git a/lib/common/bucket/deleteBucketPolicy.js b/lib/common/bucket/deleteBucketPolicy.js new file mode 100644 index 000000000..052560388 --- /dev/null +++ b/lib/common/bucket/deleteBucketPolicy.js @@ -0,0 +1,19 @@ +const proto = exports; +/** + * deleteBucketPolicy + * @param {String} bucketName - bucket name + * @param {Object} options + */ + +proto.deleteBucketPolicy = async function deleteBucketPolicy(bucketName, options = {}) { + this._checkBucketName(bucketName); + + const params = this._bucketRequestParams('DELETE', bucketName, 'policy', options); + + const result = await this.request(params); + + return { + status: result.status, + res: result.res + }; +}; diff --git a/lib/common/bucket/getBucketPolicy.js b/lib/common/bucket/getBucketPolicy.js new file mode 100644 index 000000000..ccb7dbd63 --- /dev/null +++ b/lib/common/bucket/getBucketPolicy.js @@ -0,0 +1,26 @@ +const proto = exports; +/** + * getBucketPolicy + * @param {String} bucketName - bucket name + * @param {Object} options + */ + +proto.getBucketPolicy = async function getBucketPolicy(bucketName, options = {}) { + this._checkBucketName(bucketName); + + const params = this._bucketRequestParams('GET', bucketName, 'policy', options); + + const result = await this.request(params); + + let policy = null; + + if (result.res.status === 200) { + policy = JSON.parse(result.res.data.toString()); + } + + return { + policy, + status: result.status, + res: result.res + }; +}; diff --git a/lib/common/bucket/index.js b/lib/common/bucket/index.js index 557224b27..29d7017b9 100644 --- a/lib/common/bucket/index.js +++ b/lib/common/bucket/index.js @@ -18,3 +18,6 @@ merge(proto, require('./deleteBucketWebsite')); merge(proto, require('./getBucketLifecycle')); merge(proto, require('./putBucketLifecycle')); merge(proto, require('./deleteBucketLifecycle')); +merge(proto, require('./getBucketPolicy')); +merge(proto, require('./putBucketPolicy')); +merge(proto, require('./deleteBucketPolicy')); diff --git a/lib/common/bucket/putBucketPolicy.js b/lib/common/bucket/putBucketPolicy.js new file mode 100644 index 000000000..bb68c6967 --- /dev/null +++ b/lib/common/bucket/putBucketPolicy.js @@ -0,0 +1,27 @@ + +const policy2Str = require('../utils/policy2Str'); +const isObject = require('../utils/isObject'); + +const proto = exports; +/** + * putBucketPolicy + * @param {String} bucketName - bucket name + * @param {Object} policy - bucket policy + * @param {Object} options + */ + +proto.putBucketPolicy = async function putBucketPolicy(bucketName, policy, options = {}) { + this._checkBucketName(bucketName); + + if (!isObject(policy)) { + throw new Error('policy is not Object'); + } + const params = this._bucketRequestParams('PUT', bucketName, 'policy', options); + params.content = policy2Str(policy); + + const result = await this.request(params); + return { + status: result.status, + res: result.res + }; +}; diff --git a/test/node/bucket.test.js b/test/node/bucket.test.js index 27973966f..2919648a3 100644 --- a/test/node/bucket.test.js +++ b/test/node/bucket.test.js @@ -1129,4 +1129,40 @@ describe('test/bucket.test.js', () => { assert.equal(deleteResult.res.status, 204); }); }); + + describe('getBucketPolicy() putBucketPolicy() deleteBucketPolicy()', () => { + it('should put, get, delete, when policy is Object', async () => { + try { + const policy = { + Version: '1', + Statement: [ + { + Action: ['oss:PutObject', 'oss:GetObject'], + Effect: 'Deny', + Principal: ['1234567890'], + Resource: ['acs:oss:*:1234567890:*/*'] + } + ] + }; + const result = await store.putBucketPolicy(bucket, policy); + assert.strictEqual(result.status, 200); + const result1 = await store.getBucketPolicy(bucket); + assert.deepStrictEqual(policy, result1.policy); + const result2 = await store.deleteBucketPolicy(bucket); + assert.strictEqual(result2.status, 204); + const result3 = await store.getBucketPolicy(bucket); + assert.deepStrictEqual(null, result3.policy); + } catch (err) { + assert(false, err.message); + } + }); + it('should throw error, when policy is not Object', async () => { + try { + await store.putBucketPolicy(bucket, 'policy'); + assert(false); + } catch (err) { + assert(true); + } + }); + }); }); From 92b0880b8dcfda9fc36a7d94b5b5b673321a5b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Wed, 25 Mar 2020 14:32:37 +0800 Subject: [PATCH 08/13] test: getBucketTags/getObjectTagging/calculatePostSignature (#739) * test: getBucketTags/getObjectTagging/calculatePostSignature * fix: trafficLimit error --- lib/common/object/calculatePostSignature.js | 12 +++++++-- lib/common/signUtils.js | 2 +- test/node/bucket.test.js | 13 +++++++++ test/node/object.test.js | 30 +++++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/lib/common/object/calculatePostSignature.js b/lib/common/object/calculatePostSignature.js index b6b1ec87b..42de38525 100644 --- a/lib/common/object/calculatePostSignature.js +++ b/lib/common/object/calculatePostSignature.js @@ -1,6 +1,7 @@ const policy2Str = require('../utils/policy2Str'); const signHelper = require('../signUtils'); +const isObject = require('../utils/isObject'); const proto = exports; @@ -12,8 +13,15 @@ const proto = exports; * {String} params.policy JSON text encoded with UTF-8 and Base64. */ proto.calculatePostSignature = function calculatePostSignature(policy) { - if (!policy) { - throw new Error('policy must be JSON or Object'); + if (!isObject(policy) && typeof policy !== 'string') { + throw new Error('policy must be JSON string or Object'); + } + if (!isObject(policy)) { + try { + JSON.stringify(JSON.parse(policy)); + } catch (error) { + throw new Error('policy must be JSON string or Object'); + } } policy = Buffer.from(policy2Str(policy), 'utf8').toString('base64'); diff --git a/lib/common/signUtils.js b/lib/common/signUtils.js index 926c2099f..c95e27e79 100644 --- a/lib/common/signUtils.js +++ b/lib/common/signUtils.js @@ -133,7 +133,7 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r headers[key] = value; } else if (lowerKey.indexOf('content-type') === 0) { headers[key] = value; - } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method' && lowerKey !== 'trafficLimit') { + } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method' && lowerKey !== 'trafficlimit') { subResource[lowerKey] = value; } }); diff --git a/test/node/bucket.test.js b/test/node/bucket.test.js index 2919648a3..f552831f5 100644 --- a/test/node/bucket.test.js +++ b/test/node/bucket.test.js @@ -552,6 +552,18 @@ describe('test/bucket.test.js', () => { } catch (error) { assert(false, error); } + + try { + const tag = { a: '1' }; + result = await store.putBucketTags(bucket, tag); + assert.strictEqual(result.status, 200); + + result = await store.getBucketTags(bucket); + assert.strictEqual(result.status, 200); + assert.deepEqual(result.tag, tag); + } catch (error) { + assert(false, error); + } }); it('maximum of 20 tags for a bucket', async () => { @@ -641,6 +653,7 @@ describe('test/bucket.test.js', () => { } }); }); + describe('putBucketEncryption(), getBucketEncryption(), deleteBucketEncryption()', () => { it('should create, get and delete the bucket encryption', async () => { // put with AES256 diff --git a/test/node/object.test.js b/test/node/object.test.js index 30b17ff29..8c0cd88db 100644 --- a/test/node/object.test.js +++ b/test/node/object.test.js @@ -1916,6 +1916,24 @@ describe('test/object.test.js', () => { const headRes = await store.head(name); assert.equal(headRes.status, 200); }); + + it('should throw error when policy is not JSON or Object', async () => { + let policy = 'string' + const errorMessage = 'policy must be JSON string or Object' + try { + store.calculatePostSignature(policy) + assert(false) + } catch (error) { + assert.strictEqual(errorMessage, error.message) + } + try { + policy = 123 + store.calculatePostSignature(policy) + assert(false) + } catch (error) { + assert.strictEqual(errorMessage, error.message) + } + }); }); describe('getObjectTagging() putObjectTagging() deleteObjectTagging()', () => { @@ -1948,6 +1966,18 @@ describe('test/object.test.js', () => { } catch (error) { assert(false, error); } + + try { + const tag = { a: '1' }; + result = await store.putObjectTagging(name, tag); + assert.strictEqual(result.status, 200); + + result = await store.getObjectTagging(name); + assert.strictEqual(result.status, 200); + assert.deepEqual(result.tag, tag); + } catch (error) { + assert(false, error); + } }); it('maximum of 10 tags for a object', async () => { From 63f7d5a7087b7acd6c342402aa9432c5ce09daf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Mon, 30 Mar 2020 10:57:50 +0800 Subject: [PATCH 09/13] chore: browserify close debug (#759) --- browser-build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser-build.js b/browser-build.js index 80d7a4123..0593b9cba 100644 --- a/browser-build.js +++ b/browser-build.js @@ -28,7 +28,7 @@ function build(options, callback) { basedir: path.resolve(__dirname, '.'), fullPaths: false, standalone: 'OSS', - debug: true + debug: false }; browserify(brOpts).add('./lib/browser.js') .transform(babelify, { From 0ef0fe25572836f0913e76883d995069e03af80d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Thu, 2 Apr 2020 10:38:58 +0800 Subject: [PATCH 10/13] fix: add successStatus (#762) --- lib/common/bucket/deleteBucketPolicy.js | 2 +- lib/common/bucket/getBucketPolicy.js | 2 +- lib/common/bucket/putBucketPolicy.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/common/bucket/deleteBucketPolicy.js b/lib/common/bucket/deleteBucketPolicy.js index 052560388..2e9f5e2d6 100644 --- a/lib/common/bucket/deleteBucketPolicy.js +++ b/lib/common/bucket/deleteBucketPolicy.js @@ -9,7 +9,7 @@ proto.deleteBucketPolicy = async function deleteBucketPolicy(bucketName, options this._checkBucketName(bucketName); const params = this._bucketRequestParams('DELETE', bucketName, 'policy', options); - + params.successStatuses = [204]; const result = await this.request(params); return { diff --git a/lib/common/bucket/getBucketPolicy.js b/lib/common/bucket/getBucketPolicy.js index ccb7dbd63..0d46b5720 100644 --- a/lib/common/bucket/getBucketPolicy.js +++ b/lib/common/bucket/getBucketPolicy.js @@ -11,7 +11,7 @@ proto.getBucketPolicy = async function getBucketPolicy(bucketName, options = {}) const params = this._bucketRequestParams('GET', bucketName, 'policy', options); const result = await this.request(params); - + params.successStatuses = [200]; let policy = null; if (result.res.status === 200) { diff --git a/lib/common/bucket/putBucketPolicy.js b/lib/common/bucket/putBucketPolicy.js index bb68c6967..8c88d2ef1 100644 --- a/lib/common/bucket/putBucketPolicy.js +++ b/lib/common/bucket/putBucketPolicy.js @@ -18,7 +18,7 @@ proto.putBucketPolicy = async function putBucketPolicy(bucketName, policy, optio } const params = this._bucketRequestParams('PUT', bucketName, 'policy', options); params.content = policy2Str(policy); - + params.successStatuses = [200]; const result = await this.request(params); return { status: result.status, From 0a3c64c0c300487033ccdba49cf26f7b59bb1309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E8=8B=A5=E9=9C=9C=E5=AF=92?= <912881342@qq.com> Date: Fri, 3 Apr 2020 11:31:28 +0800 Subject: [PATCH 11/13] fix: checkBucketName bug (#763) --- lib/browser/bucket.js | 5 +-- lib/bucket.js | 33 ++++++++++---------- lib/common/bucket/_checkBucketName.js | 9 ------ lib/common/bucket/deleteBucketEncryption.js | 4 ++- lib/common/bucket/deleteBucketLifecycle.js | 4 ++- lib/common/bucket/deleteBucketPolicy.js | 4 ++- lib/common/bucket/deleteBucketTags.js | 4 ++- lib/common/bucket/deleteBucketWebsite.js | 4 ++- lib/common/bucket/getBucketEncryption.js | 4 ++- lib/common/bucket/getBucketLifecycle.js | 3 +- lib/common/bucket/getBucketPolicy.js | 4 ++- lib/common/bucket/getBucketRequestPayment.js | 4 ++- lib/common/bucket/getBucketTags.js | 3 +- lib/common/bucket/getBucketWebsite.js | 3 +- lib/common/bucket/index.js | 1 - lib/common/bucket/putBucket.js | 3 +- lib/common/bucket/putBucketEncryption.js | 3 +- lib/common/bucket/putBucketLifecycle.js | 4 +-- lib/common/bucket/putBucketPolicy.js | 4 +-- lib/common/bucket/putBucketRequestPayment.js | 3 +- lib/common/bucket/putBucketTags.js | 3 +- lib/common/bucket/putBucketWebsite.js | 3 +- lib/common/client/initOptions.js | 4 +-- lib/common/image/processObjectSave.js | 3 +- lib/common/object/copyObject.js | 4 ++- lib/common/utils/checkBucketName.js | 5 +-- 26 files changed, 74 insertions(+), 54 deletions(-) delete mode 100644 lib/common/bucket/_checkBucketName.js diff --git a/lib/browser/bucket.js b/lib/browser/bucket.js index 42045b571..9b8a557be 100644 --- a/lib/browser/bucket.js +++ b/lib/browser/bucket.js @@ -1,5 +1,6 @@ const assert = require('assert'); +const _checkBucketName = require('../common/utils/checkBucketName'); const proto = exports; @@ -62,13 +63,13 @@ function toArray(obj) { // }; proto.useBucket = function useBucket(name) { - this._checkBucketName(name); + _checkBucketName(name); this.options.bucket = name; return this; }; proto.setBucket = function useBucket(name) { - this._checkBucketName(name); + _checkBucketName(name); this.options.bucket = name; return this; }; diff --git a/lib/bucket.js b/lib/bucket.js index 2f6ebb9fe..b81d51b3d 100644 --- a/lib/bucket.js +++ b/lib/bucket.js @@ -2,6 +2,7 @@ const assert = require('assert'); const isArray = require('./common/utils/isArray'); +const _checkBucketName = require('../lib/common/utils/checkBucketName'); const proto = exports; @@ -58,12 +59,12 @@ proto.listBuckets = async function listBuckets(query, options) { }; proto.useBucket = function useBucket(name) { - this._checkBucketName(name); + _checkBucketName(name); return this.setBucket(name); }; proto.setBucket = function useBucket(name) { - this._checkBucketName(name); + _checkBucketName(name); this.options.bucket = name; return this; }; @@ -73,7 +74,7 @@ proto.getBucket = function getBucket() { }; proto.getBucketLocation = async function getBucketLocation(name, options) { - this._checkBucketName(name); + _checkBucketName(name); name = name || this.getBucket(); const params = this._bucketRequestParams('GET', name, 'location', options); params.successStatuses = [200]; @@ -86,7 +87,7 @@ proto.getBucketLocation = async function getBucketLocation(name, options) { }; proto.getBucketInfo = async function getBucketInfo(name, options) { - this._checkBucketName(name); + _checkBucketName(name); name = name || this.getBucket(); const params = this._bucketRequestParams('GET', name, 'bucketInfo', options); params.successStatuses = [200]; @@ -99,7 +100,7 @@ proto.getBucketInfo = async function getBucketInfo(name, options) { }; proto.deleteBucket = async function deleteBucket(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, '', options); const result = await this.request(params); if (result.status === 200 || result.status === 204) { @@ -113,7 +114,7 @@ proto.deleteBucket = async function deleteBucket(name, options) { // acl proto.putBucketACL = async function putBucketACL(name, acl, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('PUT', name, 'acl', options); params.headers = { 'x-oss-acl': acl @@ -127,7 +128,7 @@ proto.putBucketACL = async function putBucketACL(name, acl, options) { }; proto.getBucketACL = async function getBucketACL(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'acl', options); params.successStatuses = [200]; params.xmlResponse = true; @@ -145,7 +146,7 @@ proto.getBucketACL = async function getBucketACL(name, options) { // logging proto.putBucketLogging = async function putBucketLogging(name, prefix, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('PUT', name, 'logging', options); let xml = `${'\n\n' + '\n'}${name}\n`; @@ -163,7 +164,7 @@ proto.putBucketLogging = async function putBucketLogging(name, prefix, options) }; proto.getBucketLogging = async function getBucketLogging(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'logging', options); params.successStatuses = [200]; params.xmlResponse = true; @@ -177,7 +178,7 @@ proto.getBucketLogging = async function getBucketLogging(name, options) { }; proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, 'logging', options); params.successStatuses = [204, 200]; const result = await this.request(params); @@ -187,7 +188,7 @@ proto.deleteBucketLogging = async function deleteBucketLogging(name, options) { }; proto.putBucketCORS = async function putBucketCORS(name, rules, options) { - this._checkBucketName(name); + _checkBucketName(name); rules = rules || []; assert(rules.length, 'rules is required'); rules.forEach((rule) => { @@ -233,7 +234,7 @@ proto.putBucketCORS = async function putBucketCORS(name, rules, options) { }; proto.getBucketCORS = async function getBucketCORS(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'cors', options); params.successStatuses = [200]; params.xmlResponse = true; @@ -257,7 +258,7 @@ proto.getBucketCORS = async function getBucketCORS(name, options) { }; proto.deleteBucketCORS = async function deleteBucketCORS(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, 'cors', options); params.successStatuses = [204]; const result = await this.request(params); @@ -269,7 +270,7 @@ proto.deleteBucketCORS = async function deleteBucketCORS(name, options) { // referer proto.putBucketReferer = async function putBucketReferer(name, allowEmpty, referers, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('PUT', name, 'referer', options); let xml = '\n\n'; xml += ` ${allowEmpty ? 'true' : 'false'}\n`; @@ -293,7 +294,7 @@ proto.putBucketReferer = async function putBucketReferer(name, allowEmpty, refer }; proto.getBucketReferer = async function getBucketReferer(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'referer', options); params.successStatuses = [200]; params.xmlResponse = true; @@ -312,7 +313,7 @@ proto.getBucketReferer = async function getBucketReferer(name, options) { }; proto.deleteBucketReferer = async function deleteBucketReferer(name, options) { - this._checkBucketName(name); + _checkBucketName(name); return await this.putBucketReferer(name, true, null, options); }; diff --git a/lib/common/bucket/_checkBucketName.js b/lib/common/bucket/_checkBucketName.js deleted file mode 100644 index bddbbc622..000000000 --- a/lib/common/bucket/_checkBucketName.js +++ /dev/null @@ -1,9 +0,0 @@ -const checkBucketName = require('../utils/checkBucketName'); - -const proto = exports; - -proto._checkBucketName = function (name, createBucket) { - if (!checkBucketName(name, createBucket)) { - throw new Error('The bucket must be conform to the specifications'); - } -}; diff --git a/lib/common/bucket/deleteBucketEncryption.js b/lib/common/bucket/deleteBucketEncryption.js index 1b9b28efc..1df352906 100644 --- a/lib/common/bucket/deleteBucketEncryption.js +++ b/lib/common/bucket/deleteBucketEncryption.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; // const jstoxml = require('jstoxml'); /** @@ -6,7 +8,7 @@ const proto = exports; */ proto.deleteBucketEncryption = async function deleteBucketEncryption(bucketName) { - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('DELETE', bucketName, 'encryption'); params.successStatuses = [204]; params.xmlResponse = true; diff --git a/lib/common/bucket/deleteBucketLifecycle.js b/lib/common/bucket/deleteBucketLifecycle.js index f4c1d955a..9f49845e5 100644 --- a/lib/common/bucket/deleteBucketLifecycle.js +++ b/lib/common/bucket/deleteBucketLifecycle.js @@ -1,7 +1,9 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; proto.deleteBucketLifecycle = async function deleteBucketLifecycle(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, 'lifecycle', options); params.successStatuses = [204]; const result = await this.request(params); diff --git a/lib/common/bucket/deleteBucketPolicy.js b/lib/common/bucket/deleteBucketPolicy.js index 2e9f5e2d6..de2218430 100644 --- a/lib/common/bucket/deleteBucketPolicy.js +++ b/lib/common/bucket/deleteBucketPolicy.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; /** * deleteBucketPolicy @@ -6,7 +8,7 @@ const proto = exports; */ proto.deleteBucketPolicy = async function deleteBucketPolicy(bucketName, options = {}) { - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('DELETE', bucketName, 'policy', options); params.successStatuses = [204]; diff --git a/lib/common/bucket/deleteBucketTags.js b/lib/common/bucket/deleteBucketTags.js index 623d7768e..127c8a576 100644 --- a/lib/common/bucket/deleteBucketTags.js +++ b/lib/common/bucket/deleteBucketTags.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; /** * deleteBucketTags @@ -6,7 +8,7 @@ const proto = exports; */ proto.deleteBucketTags = async function deleteBucketTags(name, options = {}) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, 'tagging', options); params.successStatuses = [204]; diff --git a/lib/common/bucket/deleteBucketWebsite.js b/lib/common/bucket/deleteBucketWebsite.js index 4defbc6fe..f607432a5 100644 --- a/lib/common/bucket/deleteBucketWebsite.js +++ b/lib/common/bucket/deleteBucketWebsite.js @@ -1,7 +1,9 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; proto.deleteBucketWebsite = async function deleteBucketWebsite(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('DELETE', name, 'website', options); params.successStatuses = [204]; const result = await this.request(params); diff --git a/lib/common/bucket/getBucketEncryption.js b/lib/common/bucket/getBucketEncryption.js index 2f004cd2a..e689dd65f 100644 --- a/lib/common/bucket/getBucketEncryption.js +++ b/lib/common/bucket/getBucketEncryption.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; /** * getBucketEncryption @@ -5,7 +7,7 @@ const proto = exports; */ proto.getBucketEncryption = async function getBucketEncryption(bucketName) { - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('GET', bucketName, 'encryption'); params.successStatuses = [200]; params.xmlResponse = true; diff --git a/lib/common/bucket/getBucketLifecycle.js b/lib/common/bucket/getBucketLifecycle.js index 72509a3e9..0d12ca133 100644 --- a/lib/common/bucket/getBucketLifecycle.js +++ b/lib/common/bucket/getBucketLifecycle.js @@ -1,10 +1,11 @@ +const _checkBucketName = require('../utils/checkBucketName'); const isArray = require('../utils/isArray'); const formatObjKey = require('../utils/formatObjKey'); const proto = exports; proto.getBucketLifecycle = async function getBucketLifecycle(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'lifecycle', options); params.successStatuses = [200]; params.xmlResponse = true; diff --git a/lib/common/bucket/getBucketPolicy.js b/lib/common/bucket/getBucketPolicy.js index 0d46b5720..42c3b4e3d 100644 --- a/lib/common/bucket/getBucketPolicy.js +++ b/lib/common/bucket/getBucketPolicy.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; /** * getBucketPolicy @@ -6,7 +8,7 @@ const proto = exports; */ proto.getBucketPolicy = async function getBucketPolicy(bucketName, options = {}) { - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('GET', bucketName, 'policy', options); diff --git a/lib/common/bucket/getBucketRequestPayment.js b/lib/common/bucket/getBucketRequestPayment.js index 4f62a3f84..6e070ab57 100644 --- a/lib/common/bucket/getBucketRequestPayment.js +++ b/lib/common/bucket/getBucketRequestPayment.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; /** * getBucketRequestPayment @@ -8,7 +10,7 @@ const proto = exports; proto.getBucketRequestPayment = async function getBucketRequestPayment(bucketName, options) { options = options || {}; - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('GET', bucketName, 'requestPayment', options); params.successStatuses = [200]; params.xmlResponse = true; diff --git a/lib/common/bucket/getBucketTags.js b/lib/common/bucket/getBucketTags.js index 017adb6a5..08e98371c 100644 --- a/lib/common/bucket/getBucketTags.js +++ b/lib/common/bucket/getBucketTags.js @@ -1,4 +1,5 @@ const proto = exports; +const _checkBucketName = require('../utils/checkBucketName'); const isObject = require('../utils/isObject'); /** * getBucketTags @@ -8,7 +9,7 @@ const isObject = require('../utils/isObject'); */ proto.getBucketTags = async function getBucketTags(name, options = {}) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'tagging', options); params.successStatuses = [200]; const result = await this.request(params); diff --git a/lib/common/bucket/getBucketWebsite.js b/lib/common/bucket/getBucketWebsite.js index fe6be62f7..d18549a88 100644 --- a/lib/common/bucket/getBucketWebsite.js +++ b/lib/common/bucket/getBucketWebsite.js @@ -1,9 +1,10 @@ +const _checkBucketName = require('../utils/checkBucketName'); const isObject = require('../utils/isObject'); const proto = exports; proto.getBucketWebsite = async function getBucketWebsite(name, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('GET', name, 'website', options); params.successStatuses = [200]; params.xmlResponse = true; diff --git a/lib/common/bucket/index.js b/lib/common/bucket/index.js index 29d7017b9..4f7622c8b 100644 --- a/lib/common/bucket/index.js +++ b/lib/common/bucket/index.js @@ -11,7 +11,6 @@ merge(proto, require('./getBucketTags')); merge(proto, require('./putBucketTags')); merge(proto, require('./deleteBucketTags')); merge(proto, require('./putBucket')); -merge(proto, require('./_checkBucketName')); merge(proto, require('./getBucketWebsite')); merge(proto, require('./putBucketWebsite')); merge(proto, require('./deleteBucketWebsite')); diff --git a/lib/common/bucket/putBucket.js b/lib/common/bucket/putBucket.js index 86f54251d..4471dde3a 100644 --- a/lib/common/bucket/putBucket.js +++ b/lib/common/bucket/putBucket.js @@ -1,8 +1,9 @@ const proto = exports; +const _checkBucketName = require('../utils/checkBucketName'); const obj2xml = require('../utils/obj2xml'); proto.putBucket = async function putBucket(name, options) { - this._checkBucketName(name, true); + _checkBucketName(name, true); options = options || {}; const params = this._bucketRequestParams('PUT', name, '', options); diff --git a/lib/common/bucket/putBucketEncryption.js b/lib/common/bucket/putBucketEncryption.js index 9f2859470..eb0e76211 100644 --- a/lib/common/bucket/putBucketEncryption.js +++ b/lib/common/bucket/putBucketEncryption.js @@ -1,5 +1,6 @@ const proto = exports; // const jstoxml = require('jstoxml'); +const _checkBucketName = require('../utils/checkBucketName'); const obj2xml = require('../utils/obj2xml'); /** * putBucketEncryption @@ -9,7 +10,7 @@ const obj2xml = require('../utils/obj2xml'); proto.putBucketEncryption = async function putBucketEncryption(bucketName, options) { options = options || {}; - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams('PUT', bucketName, 'encryption', options); params.successStatuses = [200]; const paramXMLObj = { diff --git a/lib/common/bucket/putBucketLifecycle.js b/lib/common/bucket/putBucketLifecycle.js index 7f8bdf211..e9f4e47de 100644 --- a/lib/common/bucket/putBucketLifecycle.js +++ b/lib/common/bucket/putBucketLifecycle.js @@ -1,5 +1,5 @@ /* eslint-disable no-use-before-define */ - +const _checkBucketName = require('../utils/checkBucketName'); const isArray = require('../utils/isArray'); const deepCopy = require('../utils/deepCopy'); const isObject = require('../utils/isObject'); @@ -11,7 +11,7 @@ const proto = exports; proto.putBucketLifecycle = async function putBucketLifecycle(name, rules, options) { - this._checkBucketName(name); + _checkBucketName(name); if (!isArray(rules)) { throw new Error('rules must be Array'); diff --git a/lib/common/bucket/putBucketPolicy.js b/lib/common/bucket/putBucketPolicy.js index 8c88d2ef1..d8d8c8b9a 100644 --- a/lib/common/bucket/putBucketPolicy.js +++ b/lib/common/bucket/putBucketPolicy.js @@ -1,4 +1,4 @@ - +const _checkBucketName = require('../utils/checkBucketName'); const policy2Str = require('../utils/policy2Str'); const isObject = require('../utils/isObject'); @@ -11,7 +11,7 @@ const proto = exports; */ proto.putBucketPolicy = async function putBucketPolicy(bucketName, policy, options = {}) { - this._checkBucketName(bucketName); + _checkBucketName(bucketName); if (!isObject(policy)) { throw new Error('policy is not Object'); diff --git a/lib/common/bucket/putBucketRequestPayment.js b/lib/common/bucket/putBucketRequestPayment.js index 743546001..59416e6e0 100644 --- a/lib/common/bucket/putBucketRequestPayment.js +++ b/lib/common/bucket/putBucketRequestPayment.js @@ -1,3 +1,4 @@ +const _checkBucketName = require('../utils/checkBucketName'); const obj2xml = require('../utils/obj2xml'); const proto = exports; @@ -19,7 +20,7 @@ proto.putBucketRequestPayment = async function putBucketRequestPayment( throw new Error('payer must be BucketOwner or Requester'); } - this._checkBucketName(bucketName); + _checkBucketName(bucketName); const params = this._bucketRequestParams( 'PUT', bucketName, diff --git a/lib/common/bucket/putBucketTags.js b/lib/common/bucket/putBucketTags.js index ff3b18313..16b02eeb7 100644 --- a/lib/common/bucket/putBucketTags.js +++ b/lib/common/bucket/putBucketTags.js @@ -1,3 +1,4 @@ +const _checkBucketName = require('../utils/checkBucketName'); const obj2xml = require('../utils/obj2xml'); const checkTag = require('../utils/checkBucketTag'); @@ -10,7 +11,7 @@ const proto = exports; */ proto.putBucketTags = async function putBucketTags(name, tag, options = {}) { - this._checkBucketName(name); + _checkBucketName(name); checkTag(tag); const params = this._bucketRequestParams('PUT', name, 'tagging', options); params.successStatuses = [200]; diff --git a/lib/common/bucket/putBucketWebsite.js b/lib/common/bucket/putBucketWebsite.js index 87b5e2293..a52e3b594 100644 --- a/lib/common/bucket/putBucketWebsite.js +++ b/lib/common/bucket/putBucketWebsite.js @@ -1,9 +1,10 @@ +const _checkBucketName = require('../utils/checkBucketName'); const obj2xml = require('../utils/obj2xml'); const isArray = require('../utils/isArray'); const proto = exports; proto.putBucketWebsite = async function putBucketWebsite(name, config = {}, options) { - this._checkBucketName(name); + _checkBucketName(name); const params = this._bucketRequestParams('PUT', name, 'website', options); const IndexDocument = { Suffix: config.index || 'index.html' diff --git a/lib/common/client/initOptions.js b/lib/common/client/initOptions.js index b7a665d62..e1290c3cb 100644 --- a/lib/common/client/initOptions.js +++ b/lib/common/client/initOptions.js @@ -35,8 +35,8 @@ module.exports = function (options) { || !options.accessKeySecret) { throw new Error('require accessKeyId, accessKeySecret'); } - if (options.bucket && !_checkBucketName(options.bucket)) { - throw new Error('The bucket must be conform to the specifications'); + if (options.bucket) { + _checkBucketName(options.bucket); } const opts = Object.assign({ region: 'oss-cn-hangzhou', diff --git a/lib/common/image/processObjectSave.js b/lib/common/image/processObjectSave.js index 320864f2d..3f4a26d26 100644 --- a/lib/common/image/processObjectSave.js +++ b/lib/common/image/processObjectSave.js @@ -1,4 +1,5 @@ /* eslint-disable no-use-before-define */ +const _checkBucketName = require('../utils/checkBucketName'); const querystring = require('querystring'); const { Base64: { encode: str2Base64 } } = require('js-base64'); @@ -10,7 +11,7 @@ proto.processObjectSave = async function processObjectSave(sourceObject, targetO checkArgs(process, 'process'); targetObject = this._objectName(targetObject); if (targetBucket) { - this._checkBucketName(targetBucket); + _checkBucketName(targetBucket); } const params = this._objectRequestParams('POST', sourceObject, { diff --git a/lib/common/object/copyObject.js b/lib/common/object/copyObject.js index 400790ebf..553a2a925 100644 --- a/lib/common/object/copyObject.js +++ b/lib/common/object/copyObject.js @@ -1,3 +1,5 @@ +const _checkBucketName = require('../utils/checkBucketName'); + const proto = exports; proto.copy = async function copy(name, sourceName, bucketName, options) { @@ -50,7 +52,7 @@ proto._getSourceName = function _getSourceName(sourceName, bucketName) { sourceName = sourceName.replace(/(\/.+?\/)(.*)/, '$2'); } - this._checkBucketName(bucketName); + _checkBucketName(bucketName); sourceName = `/${bucketName}/${encodeURIComponent(sourceName)}`; return sourceName; diff --git a/lib/common/utils/checkBucketName.js b/lib/common/utils/checkBucketName.js index 531ff21fc..b1d736afc 100644 --- a/lib/common/utils/checkBucketName.js +++ b/lib/common/utils/checkBucketName.js @@ -4,6 +4,7 @@ module.exports = function (name, createBucket) { const bucketRegex = createBucket ? /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/ : /^[a-z0-9_][a-z0-9-_]{1,61}[a-z0-9_]$/; - const checkBucket = bucketRegex.test(name); - return checkBucket; + if (!bucketRegex.test(name)) { + throw new Error('The bucket must be conform to the specifications'); + } }; From 449f908b1752e04a6b5189d9da739908b030a5f0 Mon Sep 17 00:00:00 2001 From: PeterRao Date: Tue, 7 Apr 2020 11:53:39 +0800 Subject: [PATCH 12/13] fix: add CORS for server-side-encryption --- test/browser/browser.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/browser/browser.test.js b/test/browser/browser.test.js index 1bcedd900..2eeaf4f51 100644 --- a/test/browser/browser.test.js +++ b/test/browser/browser.test.js @@ -948,7 +948,7 @@ describe('browser', () => { }); describe('multipartUpload()', () => { - it.skip('should initMultipartUpload with x-oss-server-side-encryption', async () => { + it('should initMultipartUpload with x-oss-server-side-encryption', async () => { // wait server bucket cors on line, this case need set cors exposed header x-oss-server-side-encryption with bucket const name = 'multipart-x-oss-server-side-encryption'; const result = await store.initMultipartUpload(name, { From 1c6e4bd8409d23dc93591e7c7b15280a17236a00 Mon Sep 17 00:00:00 2001 From: PeterRao Date: Tue, 7 Apr 2020 14:07:32 +0800 Subject: [PATCH 13/13] chore: bump 6.6.0 --- CHANGELOG.md | 22 + bower.json | 2 +- dist/aliyun-oss-sdk.js | 1528 +++++++++++++++++++++++++++--------- dist/aliyun-oss-sdk.min.js | 29 +- package.json | 4 +- 5 files changed, 1206 insertions(+), 379 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25ea972c4..6e27c9393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +# [6.6.0](https://github.com/aliyun/oss-nodejs-sdk/compare/v6.5.0...v6.6.0) (2020-04-07) + + +### Bug Fixes + +* _unSupportBrowserTip ([#755](https://github.com/aliyun/oss-nodejs-sdk/issues/755)) ([8ed3228](https://github.com/aliyun/oss-nodejs-sdk/commit/8ed3228)) +* add successStatus ([#762](https://github.com/aliyun/oss-nodejs-sdk/issues/762)) ([0ef0fe2](https://github.com/aliyun/oss-nodejs-sdk/commit/0ef0fe2)) +* checkBucketName bug ([#763](https://github.com/aliyun/oss-nodejs-sdk/issues/763)) ([0a3c64c](https://github.com/aliyun/oss-nodejs-sdk/commit/0a3c64c)) + + +### Features + +* add CORS for server-side-encryption ([449f908](https://github.com/aliyun/oss-nodejs-sdk/commit/449f908)) +* image processing ([#744](https://github.com/aliyun/oss-nodejs-sdk/issues/744)) ([02d59da](https://github.com/aliyun/oss-nodejs-sdk/commit/02d59da)), closes [#676](https://github.com/aliyun/oss-nodejs-sdk/issues/676) +* putBucketWebsite support new parameter ([#736](https://github.com/aliyun/oss-nodejs-sdk/issues/736)) ([e1cb438](https://github.com/aliyun/oss-nodejs-sdk/commit/e1cb438)) +* signatureUrl support trafficLimit ([#756](https://github.com/aliyun/oss-nodejs-sdk/issues/756)) ([a57315f](https://github.com/aliyun/oss-nodejs-sdk/commit/a57315f)) +* support for the latest putBucketLifecycle api features ([#757](https://github.com/aliyun/oss-nodejs-sdk/issues/757)) ([17c2984](https://github.com/aliyun/oss-nodejs-sdk/commit/17c2984)) +* **node:** bucket policy ([#751](https://github.com/aliyun/oss-nodejs-sdk/issues/751)) ([2d2b33a](https://github.com/aliyun/oss-nodejs-sdk/commit/2d2b33a)) + + + # [6.5.0](https://github.com/aliyun/oss-nodejs-sdk/compare/v6.4.0...v6.5.0) (2020-01-16) diff --git a/bower.json b/bower.json index 7f23af2ae..93c067902 100644 --- a/bower.json +++ b/bower.json @@ -8,5 +8,5 @@ "package.json" ], "main": "dist/aliyun-oss-sdk.js", - "version": "6.5.0" + "version": "6.6.0" } diff --git a/dist/aliyun-oss-sdk.js b/dist/aliyun-oss-sdk.js index 673b5d24e..a6e92149c 100644 --- a/dist/aliyun-oss-sdk.js +++ b/dist/aliyun-oss-sdk.js @@ -11,7 +11,7 @@ OSS.version = require('./browser/version').version; module.exports = OSS; -},{"../shims/xhr":313,"./browser/client":2,"./browser/version":5,"buffer":49}],2:[function(require,module,exports){ +},{"../shims/xhr":325,"./browser/client":2,"./browser/version":5,"buffer":60}],2:[function(require,module,exports){ (function (process,Buffer){ 'use strict'; @@ -47,7 +47,6 @@ var dateFormat = require('dateformat'); var bowser = require('bowser'); var signUtils = require('../common/signUtils'); var _isIP = require('../common/utils/isIP'); -var _checkBucketName = require('../common/utils/checkBucketName'); var _initOptions = require('../common/client/initOptions'); var globalHttpAgent = new AgentKeepalive(); @@ -60,7 +59,7 @@ function _unSupportBrowserTip() { var name = platform.name, version = platform.version; - if (name.toLowerCase() === 'ie' && version.split('.')[0] < 10) { + if (name && name.toLowerCase && name.toLowerCase() === 'ie' && version.split('.')[0] < 10) { // eslint-disable-next-line no-console console.warn('ali-oss does not support the current browser'); } @@ -131,20 +130,17 @@ proto.debug = debug; * Object operations */ merge(proto, require('./object')); -// /** -// * Bucket operations -// */ /** - * check Bucket Name + * Bucket operations */ +merge(proto, require('../common/bucket/getBucketWebsite')); +merge(proto, require('../common/bucket/putBucketWebsite')); +merge(proto, require('../common/bucket/deleteBucketWebsite')); -proto._checkBucketName = function (name) { - if (!_checkBucketName(name)) { - throw new Error('The bucket must be conform to the specifications'); - } -}; -// merge(proto, require('./bucket')); - +// lifecycle +merge(proto, require('../common/bucket/getBucketLifecycle')); +merge(proto, require('../common/bucket/putBucketLifecycle')); +merge(proto, require('../common/bucket/deleteBucketLifecycle')); // multipart upload merge(proto, require('./managed-upload')); @@ -622,8 +618,7 @@ proto.requestError = function requestError(result) { }; }).call(this,require('_process'),require("buffer").Buffer) - -},{"../common/client/initOptions":7,"../common/multipart":8,"../common/parallel":13,"../common/signUtils":14,"../common/utils/checkBucketName":15,"../common/utils/isIP":19,"./../../shims/crypto/crypto.js":306,"./managed-upload":3,"./object":4,"./version":5,"_process":227,"agentkeepalive":22,"babel-runtime/core-js/object/assign":28,"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44,"bowser":46,"buffer":49,"copy-to":52,"dateformat":166,"debug":167,"is-type-of":212,"merge-descriptors":215,"mime":311,"path":224,"platform":225,"url":257,"urllib":313,"utility":312,"xml2js":271}],3:[function(require,module,exports){ +},{"../common/bucket/deleteBucketLifecycle":6,"../common/bucket/deleteBucketWebsite":7,"../common/bucket/getBucketLifecycle":8,"../common/bucket/getBucketWebsite":9,"../common/bucket/putBucketLifecycle":10,"../common/bucket/putBucketWebsite":11,"../common/client/initOptions":13,"../common/multipart":16,"../common/parallel":21,"../common/signUtils":22,"../common/utils/isIP":30,"./../../shims/crypto/crypto.js":318,"./managed-upload":3,"./object":4,"./version":5,"_process":239,"agentkeepalive":33,"babel-runtime/core-js/object/assign":39,"babel-runtime/core-js/promise":46,"babel-runtime/regenerator":55,"bowser":57,"buffer":60,"copy-to":63,"dateformat":177,"debug":178,"is-type-of":223,"merge-descriptors":227,"mime":323,"path":236,"platform":237,"url":269,"urllib":325,"utility":324,"xml2js":283}],3:[function(require,module,exports){ (function (Buffer){ 'use strict'; @@ -1157,8 +1152,7 @@ proto._divideParts = function _divideParts(fileSize, partSize) { }; }).call(this,require("buffer").Buffer) - -},{"babel-runtime/core-js/array/from":26,"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44,"buffer":49,"copy-to":52,"is-type-of":212,"mime":311,"path":224,"stream":249,"util":265}],4:[function(require,module,exports){ +},{"babel-runtime/core-js/array/from":37,"babel-runtime/core-js/promise":46,"babel-runtime/regenerator":55,"buffer":60,"copy-to":63,"is-type-of":223,"mime":323,"path":236,"stream":261,"util":277}],4:[function(require,module,exports){ 'use strict'; var _promise = require('babel-runtime/core-js/promise'); @@ -1627,6 +1621,7 @@ merge(proto, require('../common/object/copyObject')); merge(proto, require('../common/object/getObjectTagging')); merge(proto, require('../common/object/putObjectTagging')); merge(proto, require('../common/object/deleteObjectTagging')); +merge(proto, require('../common/image')); proto.putMeta = function putMeta(name, meta, options) { var copyResult; @@ -1985,12 +1980,452 @@ proto._deleteFileSafe = function _deleteFileSafe(filepath) { }); }; -},{"../common/callback":6,"../common/object/copyObject":9,"../common/object/deleteObjectTagging":10,"../common/object/getObjectTagging":11,"../common/object/putObjectTagging":12,"../common/signUtils":14,"babel-runtime/core-js/object/keys":34,"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44,"copy-to":52,"fs":47,"is-type-of":212,"merge-descriptors":215,"mime":311,"path":224,"url":257,"utility":312}],5:[function(require,module,exports){ +},{"../common/callback":12,"../common/image":14,"../common/object/copyObject":17,"../common/object/deleteObjectTagging":18,"../common/object/getObjectTagging":19,"../common/object/putObjectTagging":20,"../common/signUtils":22,"babel-runtime/core-js/object/keys":45,"babel-runtime/core-js/promise":46,"babel-runtime/regenerator":55,"copy-to":63,"fs":58,"is-type-of":223,"merge-descriptors":227,"mime":323,"path":236,"url":269,"utility":324}],5:[function(require,module,exports){ "use strict"; exports.version = "6.5.0"; },{}],6:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _checkBucketName = require('../utils/checkBucketName'); + +var proto = exports; + +proto.deleteBucketLifecycle = function deleteBucketLifecycle(name, options) { + var params, result; + return _regenerator2.default.async(function deleteBucketLifecycle$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + params = this._bucketRequestParams('DELETE', name, 'lifecycle', options); + + params.successStatuses = [204]; + _context.next = 5; + return _regenerator2.default.awrap(this.request(params)); + + case 5: + result = _context.sent; + return _context.abrupt('return', { + res: result.res + }); + + case 7: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +},{"../utils/checkBucketName":23,"babel-runtime/regenerator":55}],7:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _checkBucketName = require('../utils/checkBucketName'); + +var proto = exports; + +proto.deleteBucketWebsite = function deleteBucketWebsite(name, options) { + var params, result; + return _regenerator2.default.async(function deleteBucketWebsite$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + params = this._bucketRequestParams('DELETE', name, 'website', options); + + params.successStatuses = [204]; + _context.next = 5; + return _regenerator2.default.awrap(this.request(params)); + + case 5: + result = _context.sent; + return _context.abrupt('return', { + res: result.res + }); + + case 7: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +},{"../utils/checkBucketName":23,"babel-runtime/regenerator":55}],8:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _checkBucketName = require('../utils/checkBucketName'); +var isArray = require('../utils/isArray'); +var formatObjKey = require('../utils/formatObjKey'); + +var proto = exports; + +proto.getBucketLifecycle = function getBucketLifecycle(name, options) { + var params, result, rules; + return _regenerator2.default.async(function getBucketLifecycle$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + params = this._bucketRequestParams('GET', name, 'lifecycle', options); + + params.successStatuses = [200]; + params.xmlResponse = true; + _context.next = 6; + return _regenerator2.default.awrap(this.request(params)); + + case 6: + result = _context.sent; + rules = result.data.Rule || null; + + if (rules) { + if (!isArray(rules)) { + rules = [rules]; + } + rules = rules.map(function (_) { + if (_.ID) { + _.id = _.ID; + delete _.ID; + } + if (_.Tag && !isArray(_.Tag)) { + _.Tag = [_.Tag]; + } + return formatObjKey(_, 'firstLowerCase'); + }); + } + return _context.abrupt('return', { + rules: rules, + res: result.res + }); + + case 10: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +},{"../utils/checkBucketName":23,"../utils/formatObjKey":27,"../utils/isArray":29,"babel-runtime/regenerator":55}],9:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _checkBucketName = require('../utils/checkBucketName'); +var isObject = require('../utils/isObject'); + +var proto = exports; + +proto.getBucketWebsite = function getBucketWebsite(name, options) { + var params, result, routingRules; + return _regenerator2.default.async(function getBucketWebsite$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + params = this._bucketRequestParams('GET', name, 'website', options); + + params.successStatuses = [200]; + params.xmlResponse = true; + _context.next = 6; + return _regenerator2.default.awrap(this.request(params)); + + case 6: + result = _context.sent; + routingRules = []; + + if (result.data.RoutingRules && result.data.RoutingRules.RoutingRule) { + if (isObject(result.data.RoutingRules.RoutingRule)) { + routingRules = [result.data.RoutingRules.RoutingRule]; + } else { + routingRules = result.data.RoutingRules.RoutingRule; + } + } + return _context.abrupt('return', { + index: result.data.IndexDocument && result.data.IndexDocument.Suffix || '', + supportSubDir: result.data.IndexDocument && result.data.IndexDocument.SupportSubDir || 'false', + type: result.data.IndexDocument && result.data.IndexDocument.Type, + routingRules: routingRules, + error: result.data.ErrorDocument && result.data.ErrorDocument.Key || null, + res: result.res + }); + + case 10: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +},{"../utils/checkBucketName":23,"../utils/isObject":31,"babel-runtime/regenerator":55}],10:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-use-before-define */ +var _checkBucketName = require('../utils/checkBucketName'); +var isArray = require('../utils/isArray'); +var deepCopy = require('../utils/deepCopy'); +var isObject = require('../utils/isObject'); +var obj2xml = require('../utils/obj2xml'); +var checkObjectTag = require('../utils/checkObjectTag'); +var getStrBytesCount = require('../utils/getStrBytesCount'); + +var proto = exports; + +proto.putBucketLifecycle = function putBucketLifecycle(name, rules, options) { + var params, Rule, paramXMLObj, paramXML, result; + return _regenerator2.default.async(function putBucketLifecycle$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + + if (isArray(rules)) { + _context.next = 3; + break; + } + + throw new Error('rules must be Array'); + + case 3: + params = this._bucketRequestParams('PUT', name, 'lifecycle', options); + Rule = []; + paramXMLObj = { + LifecycleConfiguration: { + Rule: Rule + } + }; + + + rules.forEach(function (_) { + defaultDaysAndDate2Expiration(_); // todo delete, 兼容旧版本 + checkRule(_); + if (_.id) { + _.ID = _.id; + delete _.id; + } + Rule.push(_); + }); + + paramXML = obj2xml(paramXMLObj, { + headers: true, + firstUpperCase: true + }); + + + params.content = paramXML; + params.mime = 'xml'; + params.successStatuses = [200]; + _context.next = 13; + return _regenerator2.default.awrap(this.request(params)); + + case 13: + result = _context.sent; + return _context.abrupt('return', { + res: result.res + }); + + case 15: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +// todo delete, 兼容旧版本 +function defaultDaysAndDate2Expiration(obj) { + if (obj.days) { + obj.expiration = { + days: obj.days + }; + } + if (obj.date) { + obj.expiration = { + createdBeforeDate: obj.date + }; + } +} + +function checkDaysAndDate(obj, key) { + var days = obj.days, + createdBeforeDate = obj.createdBeforeDate; + + if (!days && !createdBeforeDate) { + throw new Error(key + ' must includes days or createdBeforeDate'); + } else if (days && !/^[1-9][0-9]*$/.test(days)) { + throw new Error('days must be a positive integer'); + } else if (createdBeforeDate && !/\d{4}-\d{2}-\d{2}T00:00:00.000Z/.test(createdBeforeDate)) { + throw new Error('createdBeforeDate must be date and conform to iso8601 format'); + } +} + +function handleCheckTag(tag) { + if (!isArray(tag) && !isObject(tag)) { + throw new Error('tag must be Object or Array'); + } + tag = isObject(tag) ? [tag] : tag; + var tagObj = {}; + var tagClone = deepCopy(tag); + tagClone.forEach(function (v) { + tagObj[v.key] = v.value; + }); + + checkObjectTag(tagObj); +} + +function checkRule(rule) { + if (rule.id && getStrBytesCount(rule.id) > 255) throw new Error('ID is composed of 255 bytes at most'); + + if (rule.prefix === '' || rule.prefix === undefined) throw new Error('Rule must includes prefix'); + + if (!['Enabled', 'Disabled'].includes(rule.status)) throw new Error('Status must be Enabled or Disabled'); + + if (rule.transition) { + if (!['IA', 'Archive'].includes(rule.transition.storageClass)) throw new Error('StorageClass must be IA or Archive'); + checkDaysAndDate(rule.transition, 'Transition'); + } + + if (rule.expiration) { + checkDaysAndDate(rule.expiration, 'Expiration'); + } + + if (rule.abortMultipartUpload) { + checkDaysAndDate(rule.abortMultipartUpload, 'AbortMultipartUpload'); + } + + if (!rule.expiration && !rule.abortMultipartUpload && !rule.transition) { + throw new Error('Rule must includes expiration or abortMultipartUpload or transition'); + } + + if (rule.tag) { + if (rule.abortMultipartUpload) { + throw new Error('Tag cannot be used with abortMultipartUpload'); + } + handleCheckTag(rule.tag); + } +} + +},{"../utils/checkBucketName":23,"../utils/checkObjectTag":24,"../utils/deepCopy":26,"../utils/getStrBytesCount":28,"../utils/isArray":29,"../utils/isObject":31,"../utils/obj2xml":32,"babel-runtime/regenerator":55}],11:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var _checkBucketName = require('../utils/checkBucketName'); +var obj2xml = require('../utils/obj2xml'); +var isArray = require('../utils/isArray'); + +var proto = exports; +proto.putBucketWebsite = function putBucketWebsite(name) { + var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var options = arguments[2]; + var params, IndexDocument, WebsiteConfiguration, website, result; + return _regenerator2.default.async(function putBucketWebsite$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _checkBucketName(name); + params = this._bucketRequestParams('PUT', name, 'website', options); + IndexDocument = { + Suffix: config.index || 'index.html' + }; + WebsiteConfiguration = { + IndexDocument: IndexDocument + }; + website = { + WebsiteConfiguration: WebsiteConfiguration + }; + + + if (config.supportSubDir) { + IndexDocument.SupportSubDir = config.supportSubDir; + } + + if (config.type) { + IndexDocument.Type = config.type; + } + + if (config.error) { + WebsiteConfiguration.ErrorDocument = { + Key: config.error + }; + } + + if (!(config.routingRules !== undefined)) { + _context.next = 12; + break; + } + + if (isArray(config.routingRules)) { + _context.next = 11; + break; + } + + throw new Error('RoutingRules must be Array'); + + case 11: + WebsiteConfiguration.RoutingRules = { + RoutingRule: config.routingRules + }; + + case 12: + + website = obj2xml(website); + params.content = website; + params.mime = 'xml'; + params.successStatuses = [200]; + _context.next = 18; + return _regenerator2.default.awrap(this.request(params)); + + case 18: + result = _context.sent; + return _context.abrupt('return', { + res: result.res + }); + + case 20: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +},{"../utils/checkBucketName":23,"../utils/isArray":29,"../utils/obj2xml":32,"babel-runtime/regenerator":55}],12:[function(require,module,exports){ (function (Buffer){ 'use strict'; @@ -2033,8 +2468,7 @@ exports.encodeCallback = function encodeCallback(reqParams, options) { }; }).call(this,require("buffer").Buffer) - -},{"babel-runtime/core-js/json/stringify":27,"babel-runtime/core-js/object/keys":34,"buffer":49}],7:[function(require,module,exports){ +},{"babel-runtime/core-js/json/stringify":38,"babel-runtime/core-js/object/keys":45,"buffer":60}],13:[function(require,module,exports){ 'use strict'; var _assign = require('babel-runtime/core-js/object/assign'); @@ -2077,8 +2511,8 @@ module.exports = function (options) { if (!options || !options.accessKeyId || !options.accessKeySecret) { throw new Error('require accessKeyId, accessKeySecret'); } - if (options.bucket && !_checkBucketName(options.bucket)) { - throw new Error('The bucket must be conform to the specifications'); + if (options.bucket) { + _checkBucketName(options.bucket); } var opts = (0, _assign2.default)({ region: 'oss-cn-hangzhou', @@ -2111,7 +2545,88 @@ module.exports = function (options) { return opts; }; -},{"../utils/checkBucketName":15,"babel-runtime/core-js/object/assign":28,"humanize-ms":203,"url":257}],8:[function(require,module,exports){ +},{"../utils/checkBucketName":23,"babel-runtime/core-js/object/assign":39,"humanize-ms":214,"url":269}],14:[function(require,module,exports){ +'use strict'; + +var merge = require('merge-descriptors'); + +var proto = exports; + +merge(proto, require('./processObjectSave')); + +},{"./processObjectSave":15,"merge-descriptors":227}],15:[function(require,module,exports){ +'use strict'; + +var _regenerator = require('babel-runtime/regenerator'); + +var _regenerator2 = _interopRequireDefault(_regenerator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-use-before-define */ +var _checkBucketName = require('../utils/checkBucketName'); +var querystring = require('querystring'); + +var _require = require('js-base64'), + str2Base64 = _require.Base64.encode; + +var proto = exports; + +proto.processObjectSave = function processObjectSave(sourceObject, targetObject, process, targetBucket) { + var params, bucketParam, content, result; + return _regenerator2.default.async(function processObjectSave$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + checkArgs(sourceObject, 'sourceObject'); + checkArgs(targetObject, 'targetObject'); + checkArgs(process, 'process'); + targetObject = this._objectName(targetObject); + if (targetBucket) { + _checkBucketName(targetBucket); + } + + params = this._objectRequestParams('POST', sourceObject, { + subres: 'x-oss-process' + }); + bucketParam = targetBucket ? ',b_' + str2Base64(targetBucket) : ''; + + targetObject = str2Base64(targetObject); + + content = { + 'x-oss-process': process + '|sys/saveas,o_' + targetObject + bucketParam + }; + + params.content = querystring.stringify(content); + + _context.next = 12; + return _regenerator2.default.awrap(this.request(params)); + + case 12: + result = _context.sent; + return _context.abrupt('return', { + res: result.res, + status: result.res.status + }); + + case 14: + case 'end': + return _context.stop(); + } + } + }, null, this); +}; + +function checkArgs(name, key) { + if (!name) { + throw new Error(key + ' is required'); + } + if (typeof name !== 'string') { + throw new Error(key + ' must be String'); + } +} + +},{"../utils/checkBucketName":23,"babel-runtime/regenerator":55,"js-base64":226,"querystring":243}],16:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2507,7 +3022,7 @@ proto._uploadPart = function _uploadPart(name, uploadId, partNo, data, options) }, null, this); }; -},{"./callback":6,"./utils/deepCopy":18,"babel-runtime/regenerator":44,"copy-to":52}],9:[function(require,module,exports){ +},{"./callback":12,"./utils/deepCopy":26,"babel-runtime/regenerator":55,"copy-to":63}],17:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2524,6 +3039,8 @@ var _typeof3 = _interopRequireDefault(_typeof2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _checkBucketName = require('../utils/checkBucketName'); + var proto = exports; proto.copy = function copy(name, sourceName, bucketName, options) { @@ -2593,13 +3110,13 @@ proto._getSourceName = function _getSourceName(sourceName, bucketName) { sourceName = sourceName.replace(/(\/.+?\/)(.*)/, '$2'); } - this._checkBucketName(bucketName); + _checkBucketName(bucketName); sourceName = '/' + bucketName + '/' + encodeURIComponent(sourceName); return sourceName; }; -},{"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43,"babel-runtime/regenerator":44}],10:[function(require,module,exports){ +},{"../utils/checkBucketName":23,"babel-runtime/core-js/object/keys":45,"babel-runtime/helpers/typeof":54,"babel-runtime/regenerator":55}],18:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2645,7 +3162,7 @@ proto.deleteObjectTagging = function deleteObjectTagging(name) { }, null, this); }; -},{"babel-runtime/regenerator":44}],11:[function(require,module,exports){ +},{"babel-runtime/regenerator":55}],19:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2710,7 +3227,7 @@ proto.getObjectTagging = function getObjectTagging(name) { }, null, this); }; -},{"../utils/isObject":20,"babel-runtime/regenerator":44}],12:[function(require,module,exports){ +},{"../utils/isObject":31,"babel-runtime/regenerator":55}],20:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2785,7 +3302,7 @@ proto.putObjectTagging = function putObjectTagging(name, tag) { }, null, this); }; -},{"../utils/checkObjectTag":16,"../utils/obj2xml":21,"babel-runtime/core-js/object/keys":34,"babel-runtime/regenerator":44}],13:[function(require,module,exports){ +},{"../utils/checkObjectTag":24,"../utils/obj2xml":32,"babel-runtime/core-js/object/keys":45,"babel-runtime/regenerator":55}],21:[function(require,module,exports){ 'use strict'; var _regenerator = require('babel-runtime/regenerator'); @@ -2998,7 +3515,7 @@ proto._makeCancelEvent = function _makeCancelEvent() { return cancelEvent; }; -},{"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44}],14:[function(require,module,exports){ +},{"babel-runtime/core-js/promise":46,"babel-runtime/regenerator":55}],22:[function(require,module,exports){ (function (Buffer){ 'use strict'; @@ -3120,6 +3637,11 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r subResource[processKeyword] = options.process; } + if (options.trafficLimit) { + var trafficLimitKey = 'x-oss-traffic-limit'; + subResource[trafficLimitKey] = options.trafficLimit; + } + if (options.response) { (0, _keys2.default)(options.response).forEach(function (k) { var key = 'response-' + k.toLowerCase(); @@ -3136,7 +3658,7 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r headers[key] = value; } else if (lowerKey.indexOf('content-type') === 0) { headers[key] = value; - } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method') { + } else if (lowerKey !== 'expires' && lowerKey !== 'response' && lowerKey !== 'process' && lowerKey !== 'method' && lowerKey !== 'trafficlimit') { subResource[lowerKey] = value; } }); @@ -3179,21 +3701,21 @@ exports._signatureForURL = function _signatureForURL(accessKeySecret, options, r }; }).call(this,require("buffer").Buffer) - -},{"./../../shims/crypto/crypto.js":306,"babel-runtime/core-js/json/stringify":27,"babel-runtime/core-js/object/keys":34,"buffer":49,"is-type-of":212}],15:[function(require,module,exports){ -"use strict"; +},{"./../../shims/crypto/crypto.js":318,"babel-runtime/core-js/json/stringify":38,"babel-runtime/core-js/object/keys":45,"buffer":60,"is-type-of":223}],23:[function(require,module,exports){ +'use strict'; /** * check Bucket Name */ -module.exports = function (name) { - var bucketRegex = /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/; - var checkBucket = bucketRegex.test(name); - return checkBucket; +module.exports = function (name, createBucket) { + var bucketRegex = createBucket ? /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/ : /^[a-z0-9_][a-z0-9-_]{1,61}[a-z0-9_]$/; + if (!bucketRegex.test(name)) { + throw new Error('The bucket must be conform to the specifications'); + } }; -},{}],16:[function(require,module,exports){ +},{}],24:[function(require,module,exports){ 'use strict'; var _entries = require('babel-runtime/core-js/object/entries'); @@ -3247,7 +3769,7 @@ module.exports = function checkTag(tag) { }); }; -},{"./checkValid":17,"./isObject":20,"babel-runtime/core-js/object/entries":31}],17:[function(require,module,exports){ +},{"./checkValid":25,"./isObject":31,"babel-runtime/core-js/object/entries":42}],25:[function(require,module,exports){ "use strict"; module.exports = function checkValid(_value, _rules) { @@ -3260,7 +3782,7 @@ module.exports = function checkValid(_value, _rules) { }); }; -},{}],18:[function(require,module,exports){ +},{}],26:[function(require,module,exports){ 'use strict'; var _keys = require('babel-runtime/core-js/object/keys'); @@ -3298,7 +3820,77 @@ module.exports = function deepCopy(obj) { return copy; }; -},{"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43}],19:[function(require,module,exports){ +},{"babel-runtime/core-js/object/keys":45,"babel-runtime/helpers/typeof":54}],27:[function(require,module,exports){ +'use strict'; + +var _keys = require('babel-runtime/core-js/object/keys'); + +var _keys2 = _interopRequireDefault(_keys); + +var _typeof2 = require('babel-runtime/helpers/typeof'); + +var _typeof3 = _interopRequireDefault(_typeof2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-use-before-define */ +module.exports = function formatObjKey(obj, type) { + if (obj === null || (typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) !== 'object') { + return obj; + } + + var o = void 0; + if (Array.isArray(obj)) { + o = []; + for (var i = 0; i < obj.length; i++) { + o.push(formatObjKey(obj[i], type)); + } + } else { + o = {}; + (0, _keys2.default)(obj).forEach(function (key) { + o[handelFormat(key, type)] = formatObjKey(obj[key], type); + }); + } + return o; +}; + +function handelFormat(key, type) { + if (type === 'firstUpperCase') { + key = key.replace(/^./, function (_) { + return _.toUpperCase(); + }); + } else if (type === 'firstLowerCase') { + key = key.replace(/^./, function (_) { + return _.toLowerCase(); + }); + } + return key; +} + +},{"babel-runtime/core-js/object/keys":45,"babel-runtime/helpers/typeof":54}],28:[function(require,module,exports){ +"use strict"; + +module.exports = function getStrBytesCount(str) { + var bytesCount = 0; + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + if (/^[\u00-\uff]$/.test(c)) { + bytesCount += 1; + } else { + bytesCount += 2; + } + } + return bytesCount; +}; + +},{}],29:[function(require,module,exports){ +'use strict'; + +module.exports = function isArray(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; +}; + +},{}],30:[function(require,module,exports){ "use strict"; // it provide commont methods for node and browser , we will add more solutions later in this file @@ -3314,14 +3906,14 @@ module.exports = function (host) { return isIP; }; -},{}],20:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ 'use strict'; module.exports = function isObject(obj) { return Object.prototype.toString.call(obj) === '[object Object]'; }; -},{}],21:[function(require,module,exports){ +},{}],32:[function(require,module,exports){ 'use strict'; var _keys = require('babel-runtime/core-js/object/keys'); @@ -3330,6 +3922,8 @@ var _keys2 = _interopRequireDefault(_keys); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var formatObjKey = require('./formatObjKey'); + function type(params) { return Object.prototype.toString.call(params).replace(/(.*? |])/g, '').toLowerCase(); } @@ -3339,6 +3933,9 @@ function obj2xml(obj, options) { if (options && options.headers) { s = '\n'; } + if (options && options.firstUpperCase) { + obj = formatObjKey(obj, 'firstUpperCase'); + } if (type(obj) === 'object') { (0, _keys2.default)(obj).forEach(function (key) { if (type(obj[key]) === 'string' || type(obj[key]) === 'number') { @@ -3361,17 +3958,17 @@ function obj2xml(obj, options) { module.exports = obj2xml; -},{"babel-runtime/core-js/object/keys":34}],22:[function(require,module,exports){ +},{"./formatObjKey":27,"babel-runtime/core-js/object/keys":45}],33:[function(require,module,exports){ module.exports = noop; module.exports.HttpsAgent = noop; // Noop function for browser since native api's don't use agents. function noop () {} -},{}],23:[function(require,module,exports){ +},{}],34:[function(require,module,exports){ module.exports = require('./register')().Promise -},{"./register":25}],24:[function(require,module,exports){ +},{"./register":36}],35:[function(require,module,exports){ "use strict" // global key for user preferred registration var REGISTRATION_KEY = '@@any-promise/REGISTRATION', @@ -3451,7 +4048,7 @@ module.exports = function(root, loadImplementation){ } } -},{}],25:[function(require,module,exports){ +},{}],36:[function(require,module,exports){ "use strict"; module.exports = require('./loader')(window, loadImplementation) @@ -3471,37 +4068,37 @@ function loadImplementation(){ } } -},{"./loader":24}],26:[function(require,module,exports){ +},{"./loader":35}],37:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/array/from"), __esModule: true }; -},{"core-js/library/fn/array/from":53}],27:[function(require,module,exports){ +},{"core-js/library/fn/array/from":64}],38:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/json/stringify"), __esModule: true }; -},{"core-js/library/fn/json/stringify":54}],28:[function(require,module,exports){ +},{"core-js/library/fn/json/stringify":65}],39:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/assign"), __esModule: true }; -},{"core-js/library/fn/object/assign":55}],29:[function(require,module,exports){ +},{"core-js/library/fn/object/assign":66}],40:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/create"), __esModule: true }; -},{"core-js/library/fn/object/create":56}],30:[function(require,module,exports){ +},{"core-js/library/fn/object/create":67}],41:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/define-property"), __esModule: true }; -},{"core-js/library/fn/object/define-property":57}],31:[function(require,module,exports){ +},{"core-js/library/fn/object/define-property":68}],42:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/entries"), __esModule: true }; -},{"core-js/library/fn/object/entries":58}],32:[function(require,module,exports){ +},{"core-js/library/fn/object/entries":69}],43:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/get-own-property-names"), __esModule: true }; -},{"core-js/library/fn/object/get-own-property-names":59}],33:[function(require,module,exports){ +},{"core-js/library/fn/object/get-own-property-names":70}],44:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/get-prototype-of"), __esModule: true }; -},{"core-js/library/fn/object/get-prototype-of":60}],34:[function(require,module,exports){ +},{"core-js/library/fn/object/get-prototype-of":71}],45:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/keys"), __esModule: true }; -},{"core-js/library/fn/object/keys":61}],35:[function(require,module,exports){ +},{"core-js/library/fn/object/keys":72}],46:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/promise"), __esModule: true }; -},{"core-js/library/fn/promise":62}],36:[function(require,module,exports){ +},{"core-js/library/fn/promise":73}],47:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/set-immediate"), __esModule: true }; -},{"core-js/library/fn/set-immediate":63}],37:[function(require,module,exports){ +},{"core-js/library/fn/set-immediate":74}],48:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/string/from-code-point"), __esModule: true }; -},{"core-js/library/fn/string/from-code-point":64}],38:[function(require,module,exports){ +},{"core-js/library/fn/string/from-code-point":75}],49:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/symbol"), __esModule: true }; -},{"core-js/library/fn/symbol":66}],39:[function(require,module,exports){ +},{"core-js/library/fn/symbol":77}],50:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/symbol/has-instance"), __esModule: true }; -},{"core-js/library/fn/symbol/has-instance":65}],40:[function(require,module,exports){ +},{"core-js/library/fn/symbol/has-instance":76}],51:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/symbol/iterator"), __esModule: true }; -},{"core-js/library/fn/symbol/iterator":67}],41:[function(require,module,exports){ +},{"core-js/library/fn/symbol/iterator":78}],52:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -3511,7 +4108,7 @@ exports.default = function (instance, Constructor) { throw new TypeError("Cannot call a class as a function"); } }; -},{}],42:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -3539,7 +4136,7 @@ exports.default = function () { return Constructor; }; }(); -},{"../core-js/object/define-property":30}],43:[function(require,module,exports){ +},{"../core-js/object/define-property":41}],54:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -3561,10 +4158,10 @@ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.d } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); }; -},{"../core-js/symbol":38,"../core-js/symbol/iterator":40}],44:[function(require,module,exports){ +},{"../core-js/symbol":49,"../core-js/symbol/iterator":51}],55:[function(require,module,exports){ module.exports = require("regenerator-runtime"); -},{"regenerator-runtime":245}],45:[function(require,module,exports){ +},{"regenerator-runtime":257}],56:[function(require,module,exports){ 'use strict' exports.byteLength = byteLength @@ -3717,7 +4314,7 @@ function fromByteArray (uint8) { return parts.join('') } -},{}],46:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ /*! * Bowser - a browser detector * https://github.com/ded/bowser @@ -4363,9 +4960,9 @@ function fromByteArray (uint8) { return bowser }); -},{}],47:[function(require,module,exports){ +},{}],58:[function(require,module,exports){ -},{}],48:[function(require,module,exports){ +},{}],59:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -4588,7 +5185,7 @@ function base64DetectIncompleteChar(buffer) { this.charLength = this.charReceived ? 3 : 0; } -},{"buffer":49}],49:[function(require,module,exports){ +},{"buffer":60}],60:[function(require,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. @@ -6381,8 +6978,7 @@ function isnan (val) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"base64-js":45,"ieee754":204,"isarray":213}],50:[function(require,module,exports){ +},{"base64-js":56,"ieee754":215,"isarray":224}],61:[function(require,module,exports){ module.exports = { "100": "Continue", "101": "Switching Protocols", @@ -6448,7 +7044,7 @@ module.exports = { "511": "Network Authentication Required" } -},{}],51:[function(require,module,exports){ +},{}],62:[function(require,module,exports){ module.exports={ "O_RDONLY": 0, "O_WRONLY": 1, @@ -6659,7 +7255,7 @@ module.exports={ "UV_UDP_REUSEADDR": 4 } -},{}],52:[function(require,module,exports){ +},{}],63:[function(require,module,exports){ /*! * copy-to - index.js * Copyright(c) 2014 dead_horse @@ -6822,56 +7418,56 @@ function notDefined(obj, key) { && obj.__lookupSetter__(key) === undefined; } -},{}],53:[function(require,module,exports){ +},{}],64:[function(require,module,exports){ require('../../modules/es6.string.iterator'); require('../../modules/es6.array.from'); module.exports = require('../../modules/_core').Array.from; -},{"../../modules/_core":75,"../../modules/es6.array.from":144,"../../modules/es6.string.iterator":156}],54:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.array.from":155,"../../modules/es6.string.iterator":167}],65:[function(require,module,exports){ var core = require('../../modules/_core'); var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify }); module.exports = function stringify(it) { // eslint-disable-line no-unused-vars return $JSON.stringify.apply($JSON, arguments); }; -},{"../../modules/_core":75}],55:[function(require,module,exports){ +},{"../../modules/_core":86}],66:[function(require,module,exports){ require('../../modules/es6.object.assign'); module.exports = require('../../modules/_core').Object.assign; -},{"../../modules/_core":75,"../../modules/es6.object.assign":147}],56:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.assign":158}],67:[function(require,module,exports){ require('../../modules/es6.object.create'); var $Object = require('../../modules/_core').Object; module.exports = function create(P, D) { return $Object.create(P, D); }; -},{"../../modules/_core":75,"../../modules/es6.object.create":148}],57:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.create":159}],68:[function(require,module,exports){ require('../../modules/es6.object.define-property'); var $Object = require('../../modules/_core').Object; module.exports = function defineProperty(it, key, desc) { return $Object.defineProperty(it, key, desc); }; -},{"../../modules/_core":75,"../../modules/es6.object.define-property":149}],58:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.define-property":160}],69:[function(require,module,exports){ require('../../modules/es7.object.entries'); module.exports = require('../../modules/_core').Object.entries; -},{"../../modules/_core":75,"../../modules/es7.object.entries":158}],59:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es7.object.entries":169}],70:[function(require,module,exports){ require('../../modules/es6.object.get-own-property-names'); var $Object = require('../../modules/_core').Object; module.exports = function getOwnPropertyNames(it) { return $Object.getOwnPropertyNames(it); }; -},{"../../modules/_core":75,"../../modules/es6.object.get-own-property-names":150}],60:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.get-own-property-names":161}],71:[function(require,module,exports){ require('../../modules/es6.object.get-prototype-of'); module.exports = require('../../modules/_core').Object.getPrototypeOf; -},{"../../modules/_core":75,"../../modules/es6.object.get-prototype-of":151}],61:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.get-prototype-of":162}],72:[function(require,module,exports){ require('../../modules/es6.object.keys'); module.exports = require('../../modules/_core').Object.keys; -},{"../../modules/_core":75,"../../modules/es6.object.keys":152}],62:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.keys":163}],73:[function(require,module,exports){ require('../modules/es6.object.to-string'); require('../modules/es6.string.iterator'); require('../modules/web.dom.iterable'); @@ -6880,54 +7476,54 @@ require('../modules/es7.promise.finally'); require('../modules/es7.promise.try'); module.exports = require('../modules/_core').Promise; -},{"../modules/_core":75,"../modules/es6.object.to-string":153,"../modules/es6.promise":154,"../modules/es6.string.iterator":156,"../modules/es7.promise.finally":159,"../modules/es7.promise.try":160,"../modules/web.dom.iterable":163}],63:[function(require,module,exports){ +},{"../modules/_core":86,"../modules/es6.object.to-string":164,"../modules/es6.promise":165,"../modules/es6.string.iterator":167,"../modules/es7.promise.finally":170,"../modules/es7.promise.try":171,"../modules/web.dom.iterable":174}],74:[function(require,module,exports){ require('../modules/web.immediate'); module.exports = require('../modules/_core').setImmediate; -},{"../modules/_core":75,"../modules/web.immediate":164}],64:[function(require,module,exports){ +},{"../modules/_core":86,"../modules/web.immediate":175}],75:[function(require,module,exports){ require('../../modules/es6.string.from-code-point'); module.exports = require('../../modules/_core').String.fromCodePoint; -},{"../../modules/_core":75,"../../modules/es6.string.from-code-point":155}],65:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.string.from-code-point":166}],76:[function(require,module,exports){ require('../../modules/es6.function.has-instance'); module.exports = require('../../modules/_wks-ext').f('hasInstance'); -},{"../../modules/_wks-ext":141,"../../modules/es6.function.has-instance":146}],66:[function(require,module,exports){ +},{"../../modules/_wks-ext":152,"../../modules/es6.function.has-instance":157}],77:[function(require,module,exports){ require('../../modules/es6.symbol'); require('../../modules/es6.object.to-string'); require('../../modules/es7.symbol.async-iterator'); require('../../modules/es7.symbol.observable'); module.exports = require('../../modules/_core').Symbol; -},{"../../modules/_core":75,"../../modules/es6.object.to-string":153,"../../modules/es6.symbol":157,"../../modules/es7.symbol.async-iterator":161,"../../modules/es7.symbol.observable":162}],67:[function(require,module,exports){ +},{"../../modules/_core":86,"../../modules/es6.object.to-string":164,"../../modules/es6.symbol":168,"../../modules/es7.symbol.async-iterator":172,"../../modules/es7.symbol.observable":173}],78:[function(require,module,exports){ require('../../modules/es6.string.iterator'); require('../../modules/web.dom.iterable'); module.exports = require('../../modules/_wks-ext').f('iterator'); -},{"../../modules/_wks-ext":141,"../../modules/es6.string.iterator":156,"../../modules/web.dom.iterable":163}],68:[function(require,module,exports){ +},{"../../modules/_wks-ext":152,"../../modules/es6.string.iterator":167,"../../modules/web.dom.iterable":174}],79:[function(require,module,exports){ module.exports = function (it) { if (typeof it != 'function') throw TypeError(it + ' is not a function!'); return it; }; -},{}],69:[function(require,module,exports){ +},{}],80:[function(require,module,exports){ module.exports = function () { /* empty */ }; -},{}],70:[function(require,module,exports){ +},{}],81:[function(require,module,exports){ module.exports = function (it, Constructor, name, forbiddenField) { if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { throw TypeError(name + ': incorrect invocation!'); } return it; }; -},{}],71:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ var isObject = require('./_is-object'); module.exports = function (it) { if (!isObject(it)) throw TypeError(it + ' is not an object!'); return it; }; -},{"./_is-object":95}],72:[function(require,module,exports){ +},{"./_is-object":106}],83:[function(require,module,exports){ // false -> Array#indexOf // true -> Array#includes var toIObject = require('./_to-iobject'); @@ -6952,7 +7548,7 @@ module.exports = function (IS_INCLUDES) { }; }; -},{"./_to-absolute-index":132,"./_to-iobject":134,"./_to-length":135}],73:[function(require,module,exports){ +},{"./_to-absolute-index":143,"./_to-iobject":145,"./_to-length":146}],84:[function(require,module,exports){ // getting tag from 19.1.3.6 Object.prototype.toString() var cof = require('./_cof'); var TAG = require('./_wks')('toStringTag'); @@ -6977,18 +7573,18 @@ module.exports = function (it) { : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; }; -},{"./_cof":74,"./_wks":142}],74:[function(require,module,exports){ +},{"./_cof":85,"./_wks":153}],85:[function(require,module,exports){ var toString = {}.toString; module.exports = function (it) { return toString.call(it).slice(8, -1); }; -},{}],75:[function(require,module,exports){ +},{}],86:[function(require,module,exports){ var core = module.exports = { version: '2.5.7' }; if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef -},{}],76:[function(require,module,exports){ +},{}],87:[function(require,module,exports){ 'use strict'; var $defineProperty = require('./_object-dp'); var createDesc = require('./_property-desc'); @@ -6998,7 +7594,7 @@ module.exports = function (object, index, value) { else object[index] = value; }; -},{"./_object-dp":108,"./_property-desc":122}],77:[function(require,module,exports){ +},{"./_object-dp":119,"./_property-desc":133}],88:[function(require,module,exports){ // optional / simple context binding var aFunction = require('./_a-function'); module.exports = function (fn, that, length) { @@ -7020,20 +7616,20 @@ module.exports = function (fn, that, length) { }; }; -},{"./_a-function":68}],78:[function(require,module,exports){ +},{"./_a-function":79}],89:[function(require,module,exports){ // 7.2.1 RequireObjectCoercible(argument) module.exports = function (it) { if (it == undefined) throw TypeError("Can't call method on " + it); return it; }; -},{}],79:[function(require,module,exports){ +},{}],90:[function(require,module,exports){ // Thank's IE8 for his funny defineProperty module.exports = !require('./_fails')(function () { return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; }); -},{"./_fails":84}],80:[function(require,module,exports){ +},{"./_fails":95}],91:[function(require,module,exports){ var isObject = require('./_is-object'); var document = require('./_global').document; // typeof document.createElement is 'object' in old IE @@ -7042,13 +7638,13 @@ module.exports = function (it) { return is ? document.createElement(it) : {}; }; -},{"./_global":86,"./_is-object":95}],81:[function(require,module,exports){ +},{"./_global":97,"./_is-object":106}],92:[function(require,module,exports){ // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); -},{}],82:[function(require,module,exports){ +},{}],93:[function(require,module,exports){ // all enumerable object keys, includes symbols var getKeys = require('./_object-keys'); var gOPS = require('./_object-gops'); @@ -7065,7 +7661,7 @@ module.exports = function (it) { } return result; }; -},{"./_object-gops":113,"./_object-keys":116,"./_object-pie":117}],83:[function(require,module,exports){ +},{"./_object-gops":124,"./_object-keys":127,"./_object-pie":128}],94:[function(require,module,exports){ var global = require('./_global'); var core = require('./_core'); var ctx = require('./_ctx'); @@ -7129,7 +7725,7 @@ $export.U = 64; // safe $export.R = 128; // real proto method for `library` module.exports = $export; -},{"./_core":75,"./_ctx":77,"./_global":86,"./_has":87,"./_hide":88}],84:[function(require,module,exports){ +},{"./_core":86,"./_ctx":88,"./_global":97,"./_has":98,"./_hide":99}],95:[function(require,module,exports){ module.exports = function (exec) { try { return !!exec(); @@ -7138,7 +7734,7 @@ module.exports = function (exec) { } }; -},{}],85:[function(require,module,exports){ +},{}],96:[function(require,module,exports){ var ctx = require('./_ctx'); var call = require('./_iter-call'); var isArrayIter = require('./_is-array-iter'); @@ -7165,7 +7761,7 @@ var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) exports.BREAK = BREAK; exports.RETURN = RETURN; -},{"./_an-object":71,"./_ctx":77,"./_is-array-iter":93,"./_iter-call":96,"./_to-length":135,"./core.get-iterator-method":143}],86:[function(require,module,exports){ +},{"./_an-object":82,"./_ctx":88,"./_is-array-iter":104,"./_iter-call":107,"./_to-length":146,"./core.get-iterator-method":154}],97:[function(require,module,exports){ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self @@ -7173,13 +7769,13 @@ var global = module.exports = typeof window != 'undefined' && window.Math == Mat : Function('return this')(); if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef -},{}],87:[function(require,module,exports){ +},{}],98:[function(require,module,exports){ var hasOwnProperty = {}.hasOwnProperty; module.exports = function (it, key) { return hasOwnProperty.call(it, key); }; -},{}],88:[function(require,module,exports){ +},{}],99:[function(require,module,exports){ var dP = require('./_object-dp'); var createDesc = require('./_property-desc'); module.exports = require('./_descriptors') ? function (object, key, value) { @@ -7189,16 +7785,16 @@ module.exports = require('./_descriptors') ? function (object, key, value) { return object; }; -},{"./_descriptors":79,"./_object-dp":108,"./_property-desc":122}],89:[function(require,module,exports){ +},{"./_descriptors":90,"./_object-dp":119,"./_property-desc":133}],100:[function(require,module,exports){ var document = require('./_global').document; module.exports = document && document.documentElement; -},{"./_global":86}],90:[function(require,module,exports){ +},{"./_global":97}],101:[function(require,module,exports){ module.exports = !require('./_descriptors') && !require('./_fails')(function () { return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7; }); -},{"./_descriptors":79,"./_dom-create":80,"./_fails":84}],91:[function(require,module,exports){ +},{"./_descriptors":90,"./_dom-create":91,"./_fails":95}],102:[function(require,module,exports){ // fast apply, http://jsperf.lnkit.com/fast-apply/5 module.exports = function (fn, args, that) { var un = that === undefined; @@ -7216,7 +7812,7 @@ module.exports = function (fn, args, that) { } return fn.apply(that, args); }; -},{}],92:[function(require,module,exports){ +},{}],103:[function(require,module,exports){ // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = require('./_cof'); // eslint-disable-next-line no-prototype-builtins @@ -7224,7 +7820,7 @@ module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { return cof(it) == 'String' ? it.split('') : Object(it); }; -},{"./_cof":74}],93:[function(require,module,exports){ +},{"./_cof":85}],104:[function(require,module,exports){ // check on default Array iterator var Iterators = require('./_iterators'); var ITERATOR = require('./_wks')('iterator'); @@ -7234,19 +7830,19 @@ module.exports = function (it) { return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); }; -},{"./_iterators":101,"./_wks":142}],94:[function(require,module,exports){ +},{"./_iterators":112,"./_wks":153}],105:[function(require,module,exports){ // 7.2.2 IsArray(argument) var cof = require('./_cof'); module.exports = Array.isArray || function isArray(arg) { return cof(arg) == 'Array'; }; -},{"./_cof":74}],95:[function(require,module,exports){ +},{"./_cof":85}],106:[function(require,module,exports){ module.exports = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; -},{}],96:[function(require,module,exports){ +},{}],107:[function(require,module,exports){ // call something on iterator step with safe closing on error var anObject = require('./_an-object'); module.exports = function (iterator, fn, value, entries) { @@ -7260,7 +7856,7 @@ module.exports = function (iterator, fn, value, entries) { } }; -},{"./_an-object":71}],97:[function(require,module,exports){ +},{"./_an-object":82}],108:[function(require,module,exports){ 'use strict'; var create = require('./_object-create'); var descriptor = require('./_property-desc'); @@ -7275,7 +7871,7 @@ module.exports = function (Constructor, NAME, next) { setToStringTag(Constructor, NAME + ' Iterator'); }; -},{"./_hide":88,"./_object-create":107,"./_property-desc":122,"./_set-to-string-tag":126,"./_wks":142}],98:[function(require,module,exports){ +},{"./_hide":99,"./_object-create":118,"./_property-desc":133,"./_set-to-string-tag":137,"./_wks":153}],109:[function(require,module,exports){ 'use strict'; var LIBRARY = require('./_library'); var $export = require('./_export'); @@ -7346,7 +7942,7 @@ module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCE return methods; }; -},{"./_export":83,"./_hide":88,"./_iter-create":97,"./_iterators":101,"./_library":102,"./_object-gpo":114,"./_redefine":124,"./_set-to-string-tag":126,"./_wks":142}],99:[function(require,module,exports){ +},{"./_export":94,"./_hide":99,"./_iter-create":108,"./_iterators":112,"./_library":113,"./_object-gpo":125,"./_redefine":135,"./_set-to-string-tag":137,"./_wks":153}],110:[function(require,module,exports){ var ITERATOR = require('./_wks')('iterator'); var SAFE_CLOSING = false; @@ -7370,18 +7966,18 @@ module.exports = function (exec, skipClosing) { return safe; }; -},{"./_wks":142}],100:[function(require,module,exports){ +},{"./_wks":153}],111:[function(require,module,exports){ module.exports = function (done, value) { return { value: value, done: !!done }; }; -},{}],101:[function(require,module,exports){ +},{}],112:[function(require,module,exports){ module.exports = {}; -},{}],102:[function(require,module,exports){ +},{}],113:[function(require,module,exports){ module.exports = true; -},{}],103:[function(require,module,exports){ +},{}],114:[function(require,module,exports){ var META = require('./_uid')('meta'); var isObject = require('./_is-object'); var has = require('./_has'); @@ -7436,7 +8032,7 @@ var meta = module.exports = { onFreeze: onFreeze }; -},{"./_fails":84,"./_has":87,"./_is-object":95,"./_object-dp":108,"./_uid":138}],104:[function(require,module,exports){ +},{"./_fails":95,"./_has":98,"./_is-object":106,"./_object-dp":119,"./_uid":149}],115:[function(require,module,exports){ var global = require('./_global'); var macrotask = require('./_task').set; var Observer = global.MutationObserver || global.WebKitMutationObserver; @@ -7507,7 +8103,7 @@ module.exports = function () { }; }; -},{"./_cof":74,"./_global":86,"./_task":131}],105:[function(require,module,exports){ +},{"./_cof":85,"./_global":97,"./_task":142}],116:[function(require,module,exports){ 'use strict'; // 25.4.1.5 NewPromiseCapability(C) var aFunction = require('./_a-function'); @@ -7527,7 +8123,7 @@ module.exports.f = function (C) { return new PromiseCapability(C); }; -},{"./_a-function":68}],106:[function(require,module,exports){ +},{"./_a-function":79}],117:[function(require,module,exports){ 'use strict'; // 19.1.2.1 Object.assign(target, source, ...) var getKeys = require('./_object-keys'); @@ -7563,7 +8159,7 @@ module.exports = !$assign || require('./_fails')(function () { } return T; } : $assign; -},{"./_fails":84,"./_iobject":92,"./_object-gops":113,"./_object-keys":116,"./_object-pie":117,"./_to-object":136}],107:[function(require,module,exports){ +},{"./_fails":95,"./_iobject":103,"./_object-gops":124,"./_object-keys":127,"./_object-pie":128,"./_to-object":147}],118:[function(require,module,exports){ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = require('./_an-object'); var dPs = require('./_object-dps'); @@ -7606,7 +8202,7 @@ module.exports = Object.create || function create(O, Properties) { return Properties === undefined ? result : dPs(result, Properties); }; -},{"./_an-object":71,"./_dom-create":80,"./_enum-bug-keys":81,"./_html":89,"./_object-dps":109,"./_shared-key":127}],108:[function(require,module,exports){ +},{"./_an-object":82,"./_dom-create":91,"./_enum-bug-keys":92,"./_html":100,"./_object-dps":120,"./_shared-key":138}],119:[function(require,module,exports){ var anObject = require('./_an-object'); var IE8_DOM_DEFINE = require('./_ie8-dom-define'); var toPrimitive = require('./_to-primitive'); @@ -7624,7 +8220,7 @@ exports.f = require('./_descriptors') ? Object.defineProperty : function defineP return O; }; -},{"./_an-object":71,"./_descriptors":79,"./_ie8-dom-define":90,"./_to-primitive":137}],109:[function(require,module,exports){ +},{"./_an-object":82,"./_descriptors":90,"./_ie8-dom-define":101,"./_to-primitive":148}],120:[function(require,module,exports){ var dP = require('./_object-dp'); var anObject = require('./_an-object'); var getKeys = require('./_object-keys'); @@ -7639,7 +8235,7 @@ module.exports = require('./_descriptors') ? Object.defineProperties : function return O; }; -},{"./_an-object":71,"./_descriptors":79,"./_object-dp":108,"./_object-keys":116}],110:[function(require,module,exports){ +},{"./_an-object":82,"./_descriptors":90,"./_object-dp":119,"./_object-keys":127}],121:[function(require,module,exports){ var pIE = require('./_object-pie'); var createDesc = require('./_property-desc'); var toIObject = require('./_to-iobject'); @@ -7657,7 +8253,7 @@ exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); }; -},{"./_descriptors":79,"./_has":87,"./_ie8-dom-define":90,"./_object-pie":117,"./_property-desc":122,"./_to-iobject":134,"./_to-primitive":137}],111:[function(require,module,exports){ +},{"./_descriptors":90,"./_has":98,"./_ie8-dom-define":101,"./_object-pie":128,"./_property-desc":133,"./_to-iobject":145,"./_to-primitive":148}],122:[function(require,module,exports){ // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var toIObject = require('./_to-iobject'); var gOPN = require('./_object-gopn').f; @@ -7678,7 +8274,7 @@ module.exports.f = function getOwnPropertyNames(it) { return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); }; -},{"./_object-gopn":112,"./_to-iobject":134}],112:[function(require,module,exports){ +},{"./_object-gopn":123,"./_to-iobject":145}],123:[function(require,module,exports){ // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var $keys = require('./_object-keys-internal'); var hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype'); @@ -7687,10 +8283,10 @@ exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return $keys(O, hiddenKeys); }; -},{"./_enum-bug-keys":81,"./_object-keys-internal":115}],113:[function(require,module,exports){ +},{"./_enum-bug-keys":92,"./_object-keys-internal":126}],124:[function(require,module,exports){ exports.f = Object.getOwnPropertySymbols; -},{}],114:[function(require,module,exports){ +},{}],125:[function(require,module,exports){ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = require('./_has'); var toObject = require('./_to-object'); @@ -7705,7 +8301,7 @@ module.exports = Object.getPrototypeOf || function (O) { } return O instanceof Object ? ObjectProto : null; }; -},{"./_has":87,"./_shared-key":127,"./_to-object":136}],115:[function(require,module,exports){ +},{"./_has":98,"./_shared-key":138,"./_to-object":147}],126:[function(require,module,exports){ var has = require('./_has'); var toIObject = require('./_to-iobject'); var arrayIndexOf = require('./_array-includes')(false); @@ -7724,7 +8320,7 @@ module.exports = function (object, names) { return result; }; -},{"./_array-includes":72,"./_has":87,"./_shared-key":127,"./_to-iobject":134}],116:[function(require,module,exports){ +},{"./_array-includes":83,"./_has":98,"./_shared-key":138,"./_to-iobject":145}],127:[function(require,module,exports){ // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = require('./_object-keys-internal'); var enumBugKeys = require('./_enum-bug-keys'); @@ -7733,10 +8329,10 @@ module.exports = Object.keys || function keys(O) { return $keys(O, enumBugKeys); }; -},{"./_enum-bug-keys":81,"./_object-keys-internal":115}],117:[function(require,module,exports){ +},{"./_enum-bug-keys":92,"./_object-keys-internal":126}],128:[function(require,module,exports){ exports.f = {}.propertyIsEnumerable; -},{}],118:[function(require,module,exports){ +},{}],129:[function(require,module,exports){ // most Object methods by ES6 should accept primitives var $export = require('./_export'); var core = require('./_core'); @@ -7748,7 +8344,7 @@ module.exports = function (KEY, exec) { $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); }; -},{"./_core":75,"./_export":83,"./_fails":84}],119:[function(require,module,exports){ +},{"./_core":86,"./_export":94,"./_fails":95}],130:[function(require,module,exports){ var getKeys = require('./_object-keys'); var toIObject = require('./_to-iobject'); var isEnum = require('./_object-pie').f; @@ -7766,7 +8362,7 @@ module.exports = function (isEntries) { }; }; -},{"./_object-keys":116,"./_object-pie":117,"./_to-iobject":134}],120:[function(require,module,exports){ +},{"./_object-keys":127,"./_object-pie":128,"./_to-iobject":145}],131:[function(require,module,exports){ module.exports = function (exec) { try { return { e: false, v: exec() }; @@ -7775,7 +8371,7 @@ module.exports = function (exec) { } }; -},{}],121:[function(require,module,exports){ +},{}],132:[function(require,module,exports){ var anObject = require('./_an-object'); var isObject = require('./_is-object'); var newPromiseCapability = require('./_new-promise-capability'); @@ -7789,7 +8385,7 @@ module.exports = function (C, x) { return promiseCapability.promise; }; -},{"./_an-object":71,"./_is-object":95,"./_new-promise-capability":105}],122:[function(require,module,exports){ +},{"./_an-object":82,"./_is-object":106,"./_new-promise-capability":116}],133:[function(require,module,exports){ module.exports = function (bitmap, value) { return { enumerable: !(bitmap & 1), @@ -7799,7 +8395,7 @@ module.exports = function (bitmap, value) { }; }; -},{}],123:[function(require,module,exports){ +},{}],134:[function(require,module,exports){ var hide = require('./_hide'); module.exports = function (target, src, safe) { for (var key in src) { @@ -7808,10 +8404,10 @@ module.exports = function (target, src, safe) { } return target; }; -},{"./_hide":88}],124:[function(require,module,exports){ +},{"./_hide":99}],135:[function(require,module,exports){ module.exports = require('./_hide'); -},{"./_hide":88}],125:[function(require,module,exports){ +},{"./_hide":99}],136:[function(require,module,exports){ 'use strict'; var global = require('./_global'); var core = require('./_core'); @@ -7827,7 +8423,7 @@ module.exports = function (KEY) { }); }; -},{"./_core":75,"./_descriptors":79,"./_global":86,"./_object-dp":108,"./_wks":142}],126:[function(require,module,exports){ +},{"./_core":86,"./_descriptors":90,"./_global":97,"./_object-dp":119,"./_wks":153}],137:[function(require,module,exports){ var def = require('./_object-dp').f; var has = require('./_has'); var TAG = require('./_wks')('toStringTag'); @@ -7836,14 +8432,14 @@ module.exports = function (it, tag, stat) { if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); }; -},{"./_has":87,"./_object-dp":108,"./_wks":142}],127:[function(require,module,exports){ +},{"./_has":98,"./_object-dp":119,"./_wks":153}],138:[function(require,module,exports){ var shared = require('./_shared')('keys'); var uid = require('./_uid'); module.exports = function (key) { return shared[key] || (shared[key] = uid(key)); }; -},{"./_shared":128,"./_uid":138}],128:[function(require,module,exports){ +},{"./_shared":139,"./_uid":149}],139:[function(require,module,exports){ var core = require('./_core'); var global = require('./_global'); var SHARED = '__core-js_shared__'; @@ -7857,7 +8453,7 @@ var store = global[SHARED] || (global[SHARED] = {}); copyright: '© 2018 Denis Pushkarev (zloirock.ru)' }); -},{"./_core":75,"./_global":86,"./_library":102}],129:[function(require,module,exports){ +},{"./_core":86,"./_global":97,"./_library":113}],140:[function(require,module,exports){ // 7.3.20 SpeciesConstructor(O, defaultConstructor) var anObject = require('./_an-object'); var aFunction = require('./_a-function'); @@ -7868,7 +8464,7 @@ module.exports = function (O, D) { return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); }; -},{"./_a-function":68,"./_an-object":71,"./_wks":142}],130:[function(require,module,exports){ +},{"./_a-function":79,"./_an-object":82,"./_wks":153}],141:[function(require,module,exports){ var toInteger = require('./_to-integer'); var defined = require('./_defined'); // true -> String#at @@ -7887,7 +8483,7 @@ module.exports = function (TO_STRING) { }; }; -},{"./_defined":78,"./_to-integer":133}],131:[function(require,module,exports){ +},{"./_defined":89,"./_to-integer":144}],142:[function(require,module,exports){ var ctx = require('./_ctx'); var invoke = require('./_invoke'); var html = require('./_html'); @@ -7973,7 +8569,7 @@ module.exports = { clear: clearTask }; -},{"./_cof":74,"./_ctx":77,"./_dom-create":80,"./_global":86,"./_html":89,"./_invoke":91}],132:[function(require,module,exports){ +},{"./_cof":85,"./_ctx":88,"./_dom-create":91,"./_global":97,"./_html":100,"./_invoke":102}],143:[function(require,module,exports){ var toInteger = require('./_to-integer'); var max = Math.max; var min = Math.min; @@ -7982,7 +8578,7 @@ module.exports = function (index, length) { return index < 0 ? max(index + length, 0) : min(index, length); }; -},{"./_to-integer":133}],133:[function(require,module,exports){ +},{"./_to-integer":144}],144:[function(require,module,exports){ // 7.1.4 ToInteger var ceil = Math.ceil; var floor = Math.floor; @@ -7990,7 +8586,7 @@ module.exports = function (it) { return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); }; -},{}],134:[function(require,module,exports){ +},{}],145:[function(require,module,exports){ // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = require('./_iobject'); var defined = require('./_defined'); @@ -7998,7 +8594,7 @@ module.exports = function (it) { return IObject(defined(it)); }; -},{"./_defined":78,"./_iobject":92}],135:[function(require,module,exports){ +},{"./_defined":89,"./_iobject":103}],146:[function(require,module,exports){ // 7.1.15 ToLength var toInteger = require('./_to-integer'); var min = Math.min; @@ -8006,14 +8602,14 @@ module.exports = function (it) { return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; -},{"./_to-integer":133}],136:[function(require,module,exports){ +},{"./_to-integer":144}],147:[function(require,module,exports){ // 7.1.13 ToObject(argument) var defined = require('./_defined'); module.exports = function (it) { return Object(defined(it)); }; -},{"./_defined":78}],137:[function(require,module,exports){ +},{"./_defined":89}],148:[function(require,module,exports){ // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = require('./_is-object'); // instead of the ES6 spec version, we didn't implement @@toPrimitive case @@ -8027,20 +8623,20 @@ module.exports = function (it, S) { throw TypeError("Can't convert object to primitive value"); }; -},{"./_is-object":95}],138:[function(require,module,exports){ +},{"./_is-object":106}],149:[function(require,module,exports){ var id = 0; var px = Math.random(); module.exports = function (key) { return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; -},{}],139:[function(require,module,exports){ +},{}],150:[function(require,module,exports){ var global = require('./_global'); var navigator = global.navigator; module.exports = navigator && navigator.userAgent || ''; -},{"./_global":86}],140:[function(require,module,exports){ +},{"./_global":97}],151:[function(require,module,exports){ var global = require('./_global'); var core = require('./_core'); var LIBRARY = require('./_library'); @@ -8051,10 +8647,10 @@ module.exports = function (name) { if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); }; -},{"./_core":75,"./_global":86,"./_library":102,"./_object-dp":108,"./_wks-ext":141}],141:[function(require,module,exports){ +},{"./_core":86,"./_global":97,"./_library":113,"./_object-dp":119,"./_wks-ext":152}],152:[function(require,module,exports){ exports.f = require('./_wks'); -},{"./_wks":142}],142:[function(require,module,exports){ +},{"./_wks":153}],153:[function(require,module,exports){ var store = require('./_shared')('wks'); var uid = require('./_uid'); var Symbol = require('./_global').Symbol; @@ -8067,7 +8663,7 @@ var $exports = module.exports = function (name) { $exports.store = store; -},{"./_global":86,"./_shared":128,"./_uid":138}],143:[function(require,module,exports){ +},{"./_global":97,"./_shared":139,"./_uid":149}],154:[function(require,module,exports){ var classof = require('./_classof'); var ITERATOR = require('./_wks')('iterator'); var Iterators = require('./_iterators'); @@ -8077,7 +8673,7 @@ module.exports = require('./_core').getIteratorMethod = function (it) { || Iterators[classof(it)]; }; -},{"./_classof":73,"./_core":75,"./_iterators":101,"./_wks":142}],144:[function(require,module,exports){ +},{"./_classof":84,"./_core":86,"./_iterators":112,"./_wks":153}],155:[function(require,module,exports){ 'use strict'; var ctx = require('./_ctx'); var $export = require('./_export'); @@ -8116,7 +8712,7 @@ $export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Arr } }); -},{"./_create-property":76,"./_ctx":77,"./_export":83,"./_is-array-iter":93,"./_iter-call":96,"./_iter-detect":99,"./_to-length":135,"./_to-object":136,"./core.get-iterator-method":143}],145:[function(require,module,exports){ +},{"./_create-property":87,"./_ctx":88,"./_export":94,"./_is-array-iter":104,"./_iter-call":107,"./_iter-detect":110,"./_to-length":146,"./_to-object":147,"./core.get-iterator-method":154}],156:[function(require,module,exports){ 'use strict'; var addToUnscopables = require('./_add-to-unscopables'); var step = require('./_iter-step'); @@ -8152,7 +8748,7 @@ addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); -},{"./_add-to-unscopables":69,"./_iter-define":98,"./_iter-step":100,"./_iterators":101,"./_to-iobject":134}],146:[function(require,module,exports){ +},{"./_add-to-unscopables":80,"./_iter-define":109,"./_iter-step":111,"./_iterators":112,"./_to-iobject":145}],157:[function(require,module,exports){ 'use strict'; var isObject = require('./_is-object'); var getPrototypeOf = require('./_object-gpo'); @@ -8167,29 +8763,29 @@ if (!(HAS_INSTANCE in FunctionProto)) require('./_object-dp').f(FunctionProto, H return false; } }); -},{"./_is-object":95,"./_object-dp":108,"./_object-gpo":114,"./_wks":142}],147:[function(require,module,exports){ +},{"./_is-object":106,"./_object-dp":119,"./_object-gpo":125,"./_wks":153}],158:[function(require,module,exports){ // 19.1.3.1 Object.assign(target, source) var $export = require('./_export'); $export($export.S + $export.F, 'Object', { assign: require('./_object-assign') }); -},{"./_export":83,"./_object-assign":106}],148:[function(require,module,exports){ +},{"./_export":94,"./_object-assign":117}],159:[function(require,module,exports){ var $export = require('./_export'); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) $export($export.S, 'Object', { create: require('./_object-create') }); -},{"./_export":83,"./_object-create":107}],149:[function(require,module,exports){ +},{"./_export":94,"./_object-create":118}],160:[function(require,module,exports){ var $export = require('./_export'); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) $export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f }); -},{"./_descriptors":79,"./_export":83,"./_object-dp":108}],150:[function(require,module,exports){ +},{"./_descriptors":90,"./_export":94,"./_object-dp":119}],161:[function(require,module,exports){ // 19.1.2.7 Object.getOwnPropertyNames(O) require('./_object-sap')('getOwnPropertyNames', function () { return require('./_object-gopn-ext').f; }); -},{"./_object-gopn-ext":111,"./_object-sap":118}],151:[function(require,module,exports){ +},{"./_object-gopn-ext":122,"./_object-sap":129}],162:[function(require,module,exports){ // 19.1.2.9 Object.getPrototypeOf(O) var toObject = require('./_to-object'); var $getPrototypeOf = require('./_object-gpo'); @@ -8200,7 +8796,7 @@ require('./_object-sap')('getPrototypeOf', function () { }; }); -},{"./_object-gpo":114,"./_object-sap":118,"./_to-object":136}],152:[function(require,module,exports){ +},{"./_object-gpo":125,"./_object-sap":129,"./_to-object":147}],163:[function(require,module,exports){ // 19.1.2.14 Object.keys(O) var toObject = require('./_to-object'); var $keys = require('./_object-keys'); @@ -8211,9 +8807,9 @@ require('./_object-sap')('keys', function () { }; }); -},{"./_object-keys":116,"./_object-sap":118,"./_to-object":136}],153:[function(require,module,exports){ -arguments[4][47][0].apply(exports,arguments) -},{"dup":47}],154:[function(require,module,exports){ +},{"./_object-keys":127,"./_object-sap":129,"./_to-object":147}],164:[function(require,module,exports){ +arguments[4][58][0].apply(exports,arguments) +},{"dup":58}],165:[function(require,module,exports){ 'use strict'; var LIBRARY = require('./_library'); var global = require('./_global'); @@ -8501,7 +9097,7 @@ $export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(functi } }); -},{"./_a-function":68,"./_an-instance":70,"./_classof":73,"./_core":75,"./_ctx":77,"./_export":83,"./_for-of":85,"./_global":86,"./_is-object":95,"./_iter-detect":99,"./_library":102,"./_microtask":104,"./_new-promise-capability":105,"./_perform":120,"./_promise-resolve":121,"./_redefine-all":123,"./_set-species":125,"./_set-to-string-tag":126,"./_species-constructor":129,"./_task":131,"./_user-agent":139,"./_wks":142}],155:[function(require,module,exports){ +},{"./_a-function":79,"./_an-instance":81,"./_classof":84,"./_core":86,"./_ctx":88,"./_export":94,"./_for-of":96,"./_global":97,"./_is-object":106,"./_iter-detect":110,"./_library":113,"./_microtask":115,"./_new-promise-capability":116,"./_perform":131,"./_promise-resolve":132,"./_redefine-all":134,"./_set-species":136,"./_set-to-string-tag":137,"./_species-constructor":140,"./_task":142,"./_user-agent":150,"./_wks":153}],166:[function(require,module,exports){ var $export = require('./_export'); var toAbsoluteIndex = require('./_to-absolute-index'); var fromCharCode = String.fromCharCode; @@ -8526,7 +9122,7 @@ $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1) } }); -},{"./_export":83,"./_to-absolute-index":132}],156:[function(require,module,exports){ +},{"./_export":94,"./_to-absolute-index":143}],167:[function(require,module,exports){ 'use strict'; var $at = require('./_string-at')(true); @@ -8545,7 +9141,7 @@ require('./_iter-define')(String, 'String', function (iterated) { return { value: point, done: false }; }); -},{"./_iter-define":98,"./_string-at":130}],157:[function(require,module,exports){ +},{"./_iter-define":109,"./_string-at":141}],168:[function(require,module,exports){ 'use strict'; // ECMAScript 6 symbols shim var global = require('./_global'); @@ -8781,7 +9377,7 @@ setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] setToStringTag(global.JSON, 'JSON', true); -},{"./_an-object":71,"./_descriptors":79,"./_enum-keys":82,"./_export":83,"./_fails":84,"./_global":86,"./_has":87,"./_hide":88,"./_is-array":94,"./_is-object":95,"./_library":102,"./_meta":103,"./_object-create":107,"./_object-dp":108,"./_object-gopd":110,"./_object-gopn":112,"./_object-gopn-ext":111,"./_object-gops":113,"./_object-keys":116,"./_object-pie":117,"./_property-desc":122,"./_redefine":124,"./_set-to-string-tag":126,"./_shared":128,"./_to-iobject":134,"./_to-primitive":137,"./_uid":138,"./_wks":142,"./_wks-define":140,"./_wks-ext":141}],158:[function(require,module,exports){ +},{"./_an-object":82,"./_descriptors":90,"./_enum-keys":93,"./_export":94,"./_fails":95,"./_global":97,"./_has":98,"./_hide":99,"./_is-array":105,"./_is-object":106,"./_library":113,"./_meta":114,"./_object-create":118,"./_object-dp":119,"./_object-gopd":121,"./_object-gopn":123,"./_object-gopn-ext":122,"./_object-gops":124,"./_object-keys":127,"./_object-pie":128,"./_property-desc":133,"./_redefine":135,"./_set-to-string-tag":137,"./_shared":139,"./_to-iobject":145,"./_to-primitive":148,"./_uid":149,"./_wks":153,"./_wks-define":151,"./_wks-ext":152}],169:[function(require,module,exports){ // https://github.com/tc39/proposal-object-values-entries var $export = require('./_export'); var $entries = require('./_object-to-array')(true); @@ -8792,7 +9388,7 @@ $export($export.S, 'Object', { } }); -},{"./_export":83,"./_object-to-array":119}],159:[function(require,module,exports){ +},{"./_export":94,"./_object-to-array":130}],170:[function(require,module,exports){ // https://github.com/tc39/proposal-promise-finally 'use strict'; var $export = require('./_export'); @@ -8814,7 +9410,7 @@ $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { ); } }); -},{"./_core":75,"./_export":83,"./_global":86,"./_promise-resolve":121,"./_species-constructor":129}],160:[function(require,module,exports){ +},{"./_core":86,"./_export":94,"./_global":97,"./_promise-resolve":132,"./_species-constructor":140}],171:[function(require,module,exports){ 'use strict'; // https://github.com/tc39/proposal-promise-try var $export = require('./_export'); @@ -8828,13 +9424,13 @@ $export($export.S, 'Promise', { 'try': function (callbackfn) { return promiseCapability.promise; } }); -},{"./_export":83,"./_new-promise-capability":105,"./_perform":120}],161:[function(require,module,exports){ +},{"./_export":94,"./_new-promise-capability":116,"./_perform":131}],172:[function(require,module,exports){ require('./_wks-define')('asyncIterator'); -},{"./_wks-define":140}],162:[function(require,module,exports){ +},{"./_wks-define":151}],173:[function(require,module,exports){ require('./_wks-define')('observable'); -},{"./_wks-define":140}],163:[function(require,module,exports){ +},{"./_wks-define":151}],174:[function(require,module,exports){ require('./es6.array.iterator'); var global = require('./_global'); var hide = require('./_hide'); @@ -8855,7 +9451,7 @@ for (var i = 0; i < DOMIterables.length; i++) { Iterators[NAME] = Iterators.Array; } -},{"./_global":86,"./_hide":88,"./_iterators":101,"./_wks":142,"./es6.array.iterator":145}],164:[function(require,module,exports){ +},{"./_global":97,"./_hide":99,"./_iterators":112,"./_wks":153,"./es6.array.iterator":156}],175:[function(require,module,exports){ var $export = require('./_export'); var $task = require('./_task'); $export($export.G + $export.B, { @@ -8863,7 +9459,7 @@ $export($export.G + $export.B, { clearImmediate: $task.clear }); -},{"./_export":83,"./_task":131}],165:[function(require,module,exports){ +},{"./_export":94,"./_task":142}],176:[function(require,module,exports){ (function (Buffer){ 'use strict'; @@ -8978,8 +9574,7 @@ function objectToString(o) { } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) - -},{"../../is-buffer/index.js":206,"babel-runtime/helpers/typeof":43}],166:[function(require,module,exports){ +},{"../../is-buffer/index.js":217,"babel-runtime/helpers/typeof":54}],177:[function(require,module,exports){ 'use strict'; var _typeof2 = require('babel-runtime/helpers/typeof'); @@ -9206,7 +9801,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de } })(undefined); -},{"babel-runtime/helpers/typeof":43}],167:[function(require,module,exports){ +},{"babel-runtime/helpers/typeof":54}],178:[function(require,module,exports){ (function (process){ /** * This is the web browser implementation of `debug()`. @@ -9395,8 +9990,7 @@ function localstorage() { } }).call(this,require('_process')) - -},{"./debug":168,"_process":227}],168:[function(require,module,exports){ +},{"./debug":179,"_process":239}],179:[function(require,module,exports){ /** * This is the common logic for both the Node.js and web browser @@ -9600,7 +10194,7 @@ function coerce(val) { return val; } -},{"ms":216}],169:[function(require,module,exports){ +},{"ms":228}],180:[function(require,module,exports){ 'use strict'; var keys = require('object-keys'); @@ -9658,7 +10252,7 @@ defineProperties.supportsDescriptors = !!supportsDescriptors; module.exports = defineProperties; -},{"foreach":196,"object-keys":218}],170:[function(require,module,exports){ +},{"foreach":207,"object-keys":230}],181:[function(require,module,exports){ 'use strict'; /* globals @@ -9815,7 +10409,7 @@ module.exports = function GetIntrinsic(name, allowMissing) { return INTRINSICS[key]; }; -},{}],171:[function(require,module,exports){ +},{}],182:[function(require,module,exports){ 'use strict'; var has = require('has'); @@ -11199,7 +11793,7 @@ delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible module.exports = ES6; -},{"./GetIntrinsic":170,"./es5":173,"./helpers/assertRecord":175,"./helpers/assign":176,"./helpers/callBind":177,"./helpers/every":178,"./helpers/forEach":179,"./helpers/isFinite":180,"./helpers/isNaN":181,"./helpers/isPrimitive":182,"./helpers/isPropertyDescriptor":183,"./helpers/isSamePropertyDescriptor":184,"./helpers/mod":185,"./helpers/sign":186,"es-to-primitive/es6":192,"has":201,"has-symbols":199,"is-regex":210,"object-inspect":217,"object-keys":188}],172:[function(require,module,exports){ +},{"./GetIntrinsic":181,"./es5":184,"./helpers/assertRecord":186,"./helpers/assign":187,"./helpers/callBind":188,"./helpers/every":189,"./helpers/forEach":190,"./helpers/isFinite":191,"./helpers/isNaN":192,"./helpers/isPrimitive":193,"./helpers/isPropertyDescriptor":194,"./helpers/isSamePropertyDescriptor":195,"./helpers/mod":196,"./helpers/sign":197,"es-to-primitive/es6":203,"has":212,"has-symbols":210,"is-regex":221,"object-inspect":229,"object-keys":199}],183:[function(require,module,exports){ 'use strict'; var GetIntrinsic = require('./GetIntrinsic'); @@ -11281,7 +11875,7 @@ var ES2016 = assign(assign({}, ES2015), { module.exports = ES2016; -},{"./GetIntrinsic":170,"./es2015":171,"./helpers/assign":176,"./helpers/callBind":177,"has-symbols":199}],173:[function(require,module,exports){ +},{"./GetIntrinsic":181,"./es2015":182,"./helpers/assign":187,"./helpers/callBind":188,"has-symbols":210}],184:[function(require,module,exports){ 'use strict'; var GetIntrinsic = require('./GetIntrinsic'); @@ -11605,12 +12199,12 @@ var ES5 = { module.exports = ES5; -},{"./GetIntrinsic":170,"./helpers/assertRecord":175,"./helpers/callBind":177,"./helpers/isFinite":180,"./helpers/isNaN":181,"./helpers/isPropertyDescriptor":183,"./helpers/mod":185,"./helpers/sign":186,"es-to-primitive/es5":191,"has":201,"is-callable":207}],174:[function(require,module,exports){ +},{"./GetIntrinsic":181,"./helpers/assertRecord":186,"./helpers/callBind":188,"./helpers/isFinite":191,"./helpers/isNaN":192,"./helpers/isPropertyDescriptor":194,"./helpers/mod":196,"./helpers/sign":197,"es-to-primitive/es5":202,"has":212,"is-callable":218}],185:[function(require,module,exports){ 'use strict'; module.exports = require('./es2016'); -},{"./es2016":172}],175:[function(require,module,exports){ +},{"./es2016":183}],186:[function(require,module,exports){ 'use strict'; var GetIntrinsic = require('../GetIntrinsic'); @@ -11660,7 +12254,7 @@ module.exports = function assertRecord(ES, recordType, argumentName, value) { } }; -},{"../GetIntrinsic":170,"has":201}],176:[function(require,module,exports){ +},{"../GetIntrinsic":181,"has":212}],187:[function(require,module,exports){ 'use strict'; var GetIntrinsic = require('../GetIntrinsic'); @@ -11683,7 +12277,7 @@ module.exports = function assign(target, source) { return target; }; -},{"../GetIntrinsic":170,"has":201}],177:[function(require,module,exports){ +},{"../GetIntrinsic":181,"has":212}],188:[function(require,module,exports){ 'use strict'; var bind = require('function-bind'); @@ -11702,7 +12296,7 @@ module.exports.apply = function applyBind() { return bind.apply($apply, arguments); }; -},{"../GetIntrinsic":170,"function-bind":198}],178:[function(require,module,exports){ +},{"../GetIntrinsic":181,"function-bind":209}],189:[function(require,module,exports){ 'use strict'; module.exports = function every(array, predicate) { @@ -11714,7 +12308,7 @@ module.exports = function every(array, predicate) { return true; }; -},{}],179:[function(require,module,exports){ +},{}],190:[function(require,module,exports){ 'use strict'; module.exports = function forEach(array, callback) { @@ -11723,28 +12317,28 @@ module.exports = function forEach(array, callback) { } }; -},{}],180:[function(require,module,exports){ +},{}],191:[function(require,module,exports){ 'use strict'; var $isNaN = Number.isNaN || function (a) { return a !== a; }; module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; }; -},{}],181:[function(require,module,exports){ +},{}],192:[function(require,module,exports){ 'use strict'; module.exports = Number.isNaN || function isNaN(a) { return a !== a; }; -},{}],182:[function(require,module,exports){ +},{}],193:[function(require,module,exports){ 'use strict'; module.exports = function isPrimitive(value) { return value === null || (typeof value !== 'function' && typeof value !== 'object'); }; -},{}],183:[function(require,module,exports){ +},{}],194:[function(require,module,exports){ 'use strict'; var GetIntrinsic = require('../GetIntrinsic'); @@ -11777,7 +12371,7 @@ module.exports = function IsPropertyDescriptor(ES, Desc) { return true; }; -},{"../GetIntrinsic":170,"has":201}],184:[function(require,module,exports){ +},{"../GetIntrinsic":181,"has":212}],195:[function(require,module,exports){ 'use strict'; var every = require('./every'); @@ -11799,7 +12393,7 @@ module.exports = function isSamePropertyDescriptor(ES, D1, D2) { }); }; -},{"./every":178}],185:[function(require,module,exports){ +},{"./every":189}],196:[function(require,module,exports){ 'use strict'; module.exports = function mod(number, modulo) { @@ -11807,14 +12401,14 @@ module.exports = function mod(number, modulo) { return Math.floor(remain >= 0 ? remain : remain + modulo); }; -},{}],186:[function(require,module,exports){ +},{}],197:[function(require,module,exports){ 'use strict'; module.exports = function sign(number) { return number >= 0 ? 1 : -1; }; -},{}],187:[function(require,module,exports){ +},{}],198:[function(require,module,exports){ 'use strict'; var keysShim; @@ -11938,7 +12532,7 @@ if (!Object.keys) { } module.exports = keysShim; -},{"./isArguments":189}],188:[function(require,module,exports){ +},{"./isArguments":200}],199:[function(require,module,exports){ 'use strict'; var slice = Array.prototype.slice; @@ -11972,7 +12566,7 @@ keysShim.shim = function shimObjectKeys() { module.exports = keysShim; -},{"./implementation":187,"./isArguments":189}],189:[function(require,module,exports){ +},{"./implementation":198,"./isArguments":200}],200:[function(require,module,exports){ 'use strict'; var toStr = Object.prototype.toString; @@ -11991,7 +12585,7 @@ module.exports = function isArguments(value) { return isArgs; }; -},{}],190:[function(require,module,exports){ +},{}],201:[function(require,module,exports){ 'use strict'; var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol'; @@ -12068,7 +12662,7 @@ module.exports = function ToPrimitive(input) { return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint); }; -},{"./helpers/isPrimitive":193,"is-callable":207,"is-date-object":209,"is-symbol":211}],191:[function(require,module,exports){ +},{"./helpers/isPrimitive":204,"is-callable":218,"is-date-object":220,"is-symbol":222}],202:[function(require,module,exports){ 'use strict'; var toStr = Object.prototype.toString; @@ -12115,17 +12709,17 @@ module.exports = function ToPrimitive(input) { return ES5internalSlots['[[DefaultValue]]'](input); }; -},{"./helpers/isPrimitive":193,"is-callable":207}],192:[function(require,module,exports){ +},{"./helpers/isPrimitive":204,"is-callable":218}],203:[function(require,module,exports){ 'use strict'; module.exports = require('./es2015'); -},{"./es2015":190}],193:[function(require,module,exports){ +},{"./es2015":201}],204:[function(require,module,exports){ module.exports = function isPrimitive(value) { return value === null || (typeof value !== 'function' && typeof value !== 'object'); }; -},{}],194:[function(require,module,exports){ +},{}],205:[function(require,module,exports){ /*! * escape-html * Copyright(c) 2012-2013 TJ Holowaychuk @@ -12205,7 +12799,7 @@ function escapeHtml(string) { : html; } -},{}],195:[function(require,module,exports){ +},{}],206:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -12509,7 +13103,7 @@ function isUndefined(arg) { return arg === void 0; } -},{}],196:[function(require,module,exports){ +},{}],207:[function(require,module,exports){ var hasOwn = Object.prototype.hasOwnProperty; var toString = Object.prototype.toString; @@ -12533,7 +13127,7 @@ module.exports = function forEach (obj, fn, ctx) { }; -},{}],197:[function(require,module,exports){ +},{}],208:[function(require,module,exports){ 'use strict'; /* eslint no-invalid-this: 1 */ @@ -12587,14 +13181,14 @@ module.exports = function bind(that) { return bound; }; -},{}],198:[function(require,module,exports){ +},{}],209:[function(require,module,exports){ 'use strict'; var implementation = require('./implementation'); module.exports = Function.prototype.bind || implementation; -},{"./implementation":197}],199:[function(require,module,exports){ +},{"./implementation":208}],210:[function(require,module,exports){ (function (global){ 'use strict'; @@ -12611,8 +13205,7 @@ module.exports = function hasNativeSymbols() { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./shams":200}],200:[function(require,module,exports){ +},{"./shams":211}],211:[function(require,module,exports){ 'use strict'; /* eslint complexity: [2, 17], max-statements: [2, 33] */ @@ -12656,14 +13249,14 @@ module.exports = function hasSymbols() { return true; }; -},{}],201:[function(require,module,exports){ +},{}],212:[function(require,module,exports){ 'use strict'; var bind = require('function-bind'); module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); -},{"function-bind":198}],202:[function(require,module,exports){ +},{"function-bind":209}],213:[function(require,module,exports){ var http = require('http'); var https = module.exports; @@ -12679,7 +13272,7 @@ https.request = function (params, cb) { return http.request.call(this, params, cb); } -},{"http":250}],203:[function(require,module,exports){ +},{"http":262}],214:[function(require,module,exports){ /*! * humanize-ms - index.js * Copyright(c) 2014 dead_horse @@ -12705,7 +13298,7 @@ module.exports = function (t) { return r; }; -},{"ms":216,"util":265}],204:[function(require,module,exports){ +},{"ms":228,"util":277}],215:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 @@ -12791,7 +13384,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],205:[function(require,module,exports){ +},{}],216:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { @@ -12816,7 +13409,7 @@ if (typeof Object.create === 'function') { } } -},{}],206:[function(require,module,exports){ +},{}],217:[function(require,module,exports){ /*! * Determine if an object is a Buffer * @@ -12839,7 +13432,7 @@ function isSlowBuffer (obj) { return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } -},{}],207:[function(require,module,exports){ +},{}],218:[function(require,module,exports){ 'use strict'; var fnToStr = Function.prototype.toString; @@ -12878,7 +13471,7 @@ module.exports = function isCallable(value) { return strClass === fnClass || strClass === genClass; }; -},{}],208:[function(require,module,exports){ +},{}],219:[function(require,module,exports){ (function(root) { var toString = Function.prototype.toString; @@ -12908,7 +13501,7 @@ module.exports = function isCallable(value) { })(this); -},{}],209:[function(require,module,exports){ +},{}],220:[function(require,module,exports){ 'use strict'; var getDay = Date.prototype.getDay; @@ -12930,7 +13523,7 @@ module.exports = function isDateObject(value) { return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass; }; -},{}],210:[function(require,module,exports){ +},{}],221:[function(require,module,exports){ 'use strict'; var has = require('has'); @@ -12971,7 +13564,7 @@ module.exports = function isRegex(value) { return tryRegexExecCall(value); }; -},{"has":201}],211:[function(require,module,exports){ +},{"has":212}],222:[function(require,module,exports){ 'use strict'; var toStr = Object.prototype.toString; @@ -13008,7 +13601,7 @@ if (hasSymbols) { }; } -},{"has-symbols":199}],212:[function(require,module,exports){ +},{"has-symbols":210}],223:[function(require,module,exports){ 'use strict'; var utils = require('core-util-is'); @@ -13130,14 +13723,14 @@ function transform(m) { return name; } -},{"core-util-is":165,"is-class-hotfix":208,"isstream":214}],213:[function(require,module,exports){ +},{"core-util-is":176,"is-class-hotfix":219,"isstream":225}],224:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; -},{}],214:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ var stream = require('stream') @@ -13166,7 +13759,236 @@ module.exports.isReadable = isReadable module.exports.isWritable = isWritable module.exports.isDuplex = isDuplex -},{"stream":249}],215:[function(require,module,exports){ +},{"stream":261}],226:[function(require,module,exports){ +(function (global){ +/* + * base64.js + * + * Licensed under the BSD 3-Clause License. + * http://opensource.org/licenses/BSD-3-Clause + * + * References: + * http://en.wikipedia.org/wiki/Base64 + */ +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + ? module.exports = factory(global) + : typeof define === 'function' && define.amd + ? define(factory) : factory(global) +}(( + typeof self !== 'undefined' ? self + : typeof window !== 'undefined' ? window + : typeof global !== 'undefined' ? global +: this +), function(global) { + 'use strict'; + // existing version for noConflict() + global = global || {}; + var _Base64 = global.Base64; + var version = "2.5.2"; + // if node.js and NOT React Native, we use Buffer + var buffer; + if (typeof module !== 'undefined' && module.exports) { + try { + buffer = eval("require('buffer').Buffer"); + } catch (err) { + buffer = undefined; + } + } + // constants + var b64chars + = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var b64tab = function(bin) { + var t = {}; + for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; + return t; + }(b64chars); + var fromCharCode = String.fromCharCode; + // encoder stuff + var cb_utob = function(c) { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 0x80 ? c + : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) + + fromCharCode(0x80 | (cc & 0x3f))) + : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) + + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + + fromCharCode(0x80 | ( cc & 0x3f))); + } else { + var cc = 0x10000 + + (c.charCodeAt(0) - 0xD800) * 0x400 + + (c.charCodeAt(1) - 0xDC00); + return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) + + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) + + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + + fromCharCode(0x80 | ( cc & 0x3f))); + } + }; + var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; + var utob = function(u) { + return u.replace(re_utob, cb_utob); + }; + var cb_encode = function(ccc) { + var padlen = [0, 2, 1][ccc.length % 3], + ord = ccc.charCodeAt(0) << 16 + | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) + | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), + chars = [ + b64chars.charAt( ord >>> 18), + b64chars.charAt((ord >>> 12) & 63), + padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), + padlen >= 1 ? '=' : b64chars.charAt(ord & 63) + ]; + return chars.join(''); + }; + var btoa = global.btoa ? function(b) { + return global.btoa(b); + } : function(b) { + return b.replace(/[\s\S]{1,3}/g, cb_encode); + }; + var _encode = function(u) { + var isUint8Array = Object.prototype.toString.call(u) === '[object Uint8Array]'; + return isUint8Array ? u.toString('base64') + : btoa(utob(String(u))); + } + var encode = function(u, urisafe) { + return !urisafe + ? _encode(u) + : _encode(String(u)).replace(/[+\/]/g, function(m0) { + return m0 == '+' ? '-' : '_'; + }).replace(/=/g, ''); + }; + var encodeURI = function(u) { return encode(u, true) }; + // decoder stuff + var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; + var cb_btou = function(cccc) { + switch(cccc.length) { + case 4: + var cp = ((0x07 & cccc.charCodeAt(0)) << 18) + | ((0x3f & cccc.charCodeAt(1)) << 12) + | ((0x3f & cccc.charCodeAt(2)) << 6) + | (0x3f & cccc.charCodeAt(3)), + offset = cp - 0x10000; + return (fromCharCode((offset >>> 10) + 0xD800) + + fromCharCode((offset & 0x3FF) + 0xDC00)); + case 3: + return fromCharCode( + ((0x0f & cccc.charCodeAt(0)) << 12) + | ((0x3f & cccc.charCodeAt(1)) << 6) + | (0x3f & cccc.charCodeAt(2)) + ); + default: + return fromCharCode( + ((0x1f & cccc.charCodeAt(0)) << 6) + | (0x3f & cccc.charCodeAt(1)) + ); + } + }; + var btou = function(b) { + return b.replace(re_btou, cb_btou); + }; + var cb_decode = function(cccc) { + var len = cccc.length, + padlen = len % 4, + n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) + | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) + | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) + | (len > 3 ? b64tab[cccc.charAt(3)] : 0), + chars = [ + fromCharCode( n >>> 16), + fromCharCode((n >>> 8) & 0xff), + fromCharCode( n & 0xff) + ]; + chars.length -= [0, 0, 2, 1][padlen]; + return chars.join(''); + }; + var _atob = global.atob ? function(a) { + return global.atob(a); + } : function(a){ + return a.replace(/\S{1,4}/g, cb_decode); + }; + var atob = function(a) { + return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, '')); + }; + var _decode = buffer ? + buffer.from && Uint8Array && buffer.from !== Uint8Array.from + ? function(a) { + return (a.constructor === buffer.constructor + ? a : buffer.from(a, 'base64')).toString(); + } + : function(a) { + return (a.constructor === buffer.constructor + ? a : new buffer(a, 'base64')).toString(); + } + : function(a) { return btou(_atob(a)) }; + var decode = function(a){ + return _decode( + String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) + .replace(/[^A-Za-z0-9\+\/]/g, '') + ); + }; + var noConflict = function() { + var Base64 = global.Base64; + global.Base64 = _Base64; + return Base64; + }; + // export Base64 + global.Base64 = { + VERSION: version, + atob: atob, + btoa: btoa, + fromBase64: decode, + toBase64: encode, + utob: utob, + encode: encode, + encodeURI: encodeURI, + btou: btou, + decode: decode, + noConflict: noConflict, + __buffer__: buffer + }; + // if ES5 is available, make Base64.extendString() available + if (typeof Object.defineProperty === 'function') { + var noEnum = function(v){ + return {value:v,enumerable:false,writable:true,configurable:true}; + }; + global.Base64.extendString = function () { + Object.defineProperty( + String.prototype, 'fromBase64', noEnum(function () { + return decode(this) + })); + Object.defineProperty( + String.prototype, 'toBase64', noEnum(function (urisafe) { + return encode(this, urisafe) + })); + Object.defineProperty( + String.prototype, 'toBase64URI', noEnum(function () { + return encode(this, true) + })); + }; + } + // + // export Base64 to the namespace + // + if (global['Meteor']) { // Meteor.js + Base64 = global.Base64; + } + // module.exports and AMD are mutually exclusive. + // module.exports has precedence. + if (typeof module !== 'undefined' && module.exports) { + module.exports.Base64 = global.Base64; + } + else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function(){ return global.Base64 }); + } + // that's it! + return {Base64: global.Base64} +})); + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],227:[function(require,module,exports){ /*! * merge-descriptors * Copyright(c) 2014 Jonathan Ong @@ -13228,7 +14050,7 @@ function merge(dest, src, redefine) { return dest } -},{}],216:[function(require,module,exports){ +},{}],228:[function(require,module,exports){ /** * Helpers. */ @@ -13382,7 +14204,7 @@ function plural(ms, n, name) { return Math.ceil(ms / n) + ' ' + name + 's'; } -},{}],217:[function(require,module,exports){ +},{}],229:[function(require,module,exports){ var hasMap = typeof Map === 'function' && Map.prototype; var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; @@ -13641,7 +14463,7 @@ function arrObjKeys (obj, inspect) { return xs; } -},{"./util.inspect":47}],218:[function(require,module,exports){ +},{"./util.inspect":58}],230:[function(require,module,exports){ 'use strict'; // modified from https://github.com/es-shims/es5-shim @@ -13784,9 +14606,9 @@ keysShim.shim = function shimObjectKeys() { module.exports = keysShim; -},{"./isArguments":219}],219:[function(require,module,exports){ -arguments[4][189][0].apply(exports,arguments) -},{"dup":189}],220:[function(require,module,exports){ +},{"./isArguments":231}],231:[function(require,module,exports){ +arguments[4][200][0].apply(exports,arguments) +},{"dup":200}],232:[function(require,module,exports){ 'use strict'; var ES = require('es-abstract/es7'); @@ -13832,7 +14654,7 @@ module.exports = function getOwnPropertyDescriptors(value) { }, {}); }; -},{"es-abstract/es7":174}],221:[function(require,module,exports){ +},{"es-abstract/es7":185}],233:[function(require,module,exports){ 'use strict'; var define = require('define-properties'); @@ -13849,7 +14671,7 @@ define(implementation, { module.exports = implementation; -},{"./implementation":220,"./polyfill":222,"./shim":223,"define-properties":169}],222:[function(require,module,exports){ +},{"./implementation":232,"./polyfill":234,"./shim":235,"define-properties":180}],234:[function(require,module,exports){ 'use strict'; var implementation = require('./implementation'); @@ -13858,7 +14680,7 @@ module.exports = function getPolyfill() { return typeof Object.getOwnPropertyDescriptors === 'function' ? Object.getOwnPropertyDescriptors : implementation; }; -},{"./implementation":220}],223:[function(require,module,exports){ +},{"./implementation":232}],235:[function(require,module,exports){ 'use strict'; var getPolyfill = require('./polyfill'); @@ -13874,7 +14696,7 @@ module.exports = function shimGetOwnPropertyDescriptors() { return polyfill; }; -},{"./polyfill":222,"define-properties":169}],224:[function(require,module,exports){ +},{"./polyfill":234,"define-properties":180}],236:[function(require,module,exports){ (function (process){ // .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, // backported and transplited with Babel, with backwards-compat fixes @@ -14180,8 +15002,7 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) - -},{"_process":227}],225:[function(require,module,exports){ +},{"_process":239}],237:[function(require,module,exports){ (function (global){ /*! * Platform.js @@ -15402,8 +16223,7 @@ var substr = 'ab'.substr(-1) === 'b' }.call(this)); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],226:[function(require,module,exports){ +},{}],238:[function(require,module,exports){ (function (process){ 'use strict'; @@ -15451,8 +16271,7 @@ function nextTick(fn, arg1, arg2, arg3) { }).call(this,require('_process')) - -},{"_process":227}],227:[function(require,module,exports){ +},{"_process":239}],239:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -15638,7 +16457,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],228:[function(require,module,exports){ +},{}],240:[function(require,module,exports){ (function (global){ /*! https://mths.be/punycode v1.4.1 by @mathias */ ;(function(root) { @@ -16175,8 +16994,7 @@ process.umask = function() { return 0; }; }(this)); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],229:[function(require,module,exports){ +},{}],241:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16262,7 +17080,7 @@ var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; -},{}],230:[function(require,module,exports){ +},{}],242:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16349,16 +17167,16 @@ var objectKeys = Object.keys || function (obj) { return res; }; -},{}],231:[function(require,module,exports){ +},{}],243:[function(require,module,exports){ 'use strict'; exports.decode = exports.parse = require('./decode'); exports.encode = exports.stringify = require('./encode'); -},{"./decode":229,"./encode":230}],232:[function(require,module,exports){ +},{"./decode":241,"./encode":242}],244:[function(require,module,exports){ module.exports = require('./lib/_stream_duplex.js'); -},{"./lib/_stream_duplex.js":233}],233:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":245}],245:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16497,7 +17315,7 @@ Duplex.prototype._destroy = function (err, cb) { pna.nextTick(cb, err); }; -},{"./_stream_readable":235,"./_stream_writable":237,"babel-runtime/core-js/object/keys":34,"core-util-is":165,"inherits":205,"process-nextick-args":226}],234:[function(require,module,exports){ +},{"./_stream_readable":247,"./_stream_writable":249,"babel-runtime/core-js/object/keys":45,"core-util-is":176,"inherits":216,"process-nextick-args":238}],246:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16546,7 +17364,7 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":236,"core-util-is":165,"inherits":205}],235:[function(require,module,exports){ +},{"./_stream_transform":248,"core-util-is":176,"inherits":216}],247:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -17575,8 +18393,7 @@ function indexOf(xs, x) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./_stream_duplex":233,"./internal/streams/BufferList":238,"./internal/streams/destroy":239,"./internal/streams/stream":240,"_process":227,"babel-runtime/core-js/object/get-prototype-of":33,"core-util-is":165,"events":195,"inherits":205,"isarray":213,"process-nextick-args":226,"safe-buffer":247,"string_decoder/":254,"util":47}],236:[function(require,module,exports){ +},{"./_stream_duplex":245,"./internal/streams/BufferList":250,"./internal/streams/destroy":251,"./internal/streams/stream":252,"_process":239,"babel-runtime/core-js/object/get-prototype-of":44,"core-util-is":176,"events":206,"inherits":216,"isarray":224,"process-nextick-args":238,"safe-buffer":259,"string_decoder/":266,"util":58}],248:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -17792,7 +18609,7 @@ function done(stream, er, data) { return stream.push(null); } -},{"./_stream_duplex":233,"core-util-is":165,"inherits":205}],237:[function(require,module,exports){ +},{"./_stream_duplex":245,"core-util-is":176,"inherits":216}],249:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -18501,8 +19318,7 @@ Writable.prototype._destroy = function (err, cb) { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./_stream_duplex":233,"./internal/streams/destroy":239,"./internal/streams/stream":240,"_process":227,"babel-runtime/core-js/object/define-property":30,"babel-runtime/core-js/set-immediate":36,"babel-runtime/core-js/symbol":38,"babel-runtime/core-js/symbol/has-instance":39,"core-util-is":165,"inherits":205,"process-nextick-args":226,"safe-buffer":247,"util-deprecate":259}],238:[function(require,module,exports){ +},{"./_stream_duplex":245,"./internal/streams/destroy":251,"./internal/streams/stream":252,"_process":239,"babel-runtime/core-js/object/define-property":41,"babel-runtime/core-js/set-immediate":47,"babel-runtime/core-js/symbol":49,"babel-runtime/core-js/symbol/has-instance":50,"core-util-is":176,"inherits":216,"process-nextick-args":238,"safe-buffer":259,"util-deprecate":271}],250:[function(require,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { @@ -18587,7 +19403,7 @@ if (util && util.inspect && util.inspect.custom) { }; } -},{"safe-buffer":247,"util":47}],239:[function(require,module,exports){ +},{"safe-buffer":259,"util":58}],251:[function(require,module,exports){ 'use strict'; /**/ @@ -18663,15 +19479,15 @@ module.exports = { undestroy: undestroy }; -},{"process-nextick-args":226}],240:[function(require,module,exports){ +},{"process-nextick-args":238}],252:[function(require,module,exports){ 'use strict'; module.exports = require('events').EventEmitter; -},{"events":195}],241:[function(require,module,exports){ +},{"events":206}],253:[function(require,module,exports){ module.exports = require('./readable').PassThrough -},{"./readable":242}],242:[function(require,module,exports){ +},{"./readable":254}],254:[function(require,module,exports){ exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = exports; exports.Readable = exports; @@ -18680,13 +19496,13 @@ exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); -},{"./lib/_stream_duplex.js":233,"./lib/_stream_passthrough.js":234,"./lib/_stream_readable.js":235,"./lib/_stream_transform.js":236,"./lib/_stream_writable.js":237}],243:[function(require,module,exports){ +},{"./lib/_stream_duplex.js":245,"./lib/_stream_passthrough.js":246,"./lib/_stream_readable.js":247,"./lib/_stream_transform.js":248,"./lib/_stream_writable.js":249}],255:[function(require,module,exports){ module.exports = require('./readable').Transform -},{"./readable":242}],244:[function(require,module,exports){ +},{"./readable":254}],256:[function(require,module,exports){ module.exports = require('./lib/_stream_writable.js'); -},{"./lib/_stream_writable.js":237}],245:[function(require,module,exports){ +},{"./lib/_stream_writable.js":249}],257:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * @@ -18723,7 +19539,7 @@ if (hadRuntime) { } } -},{"./runtime":246}],246:[function(require,module,exports){ +},{"./runtime":258}],258:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * @@ -19452,7 +20268,7 @@ if (hadRuntime) { (function() { return this })() || Function("return this")() ); -},{}],247:[function(require,module,exports){ +},{}],259:[function(require,module,exports){ /* eslint-disable node/no-deprecated-api */ var buffer = require('buffer') var Buffer = buffer.Buffer @@ -19516,7 +20332,7 @@ SafeBuffer.allocUnsafeSlow = function (size) { return buffer.SlowBuffer(size) } -},{"buffer":49}],248:[function(require,module,exports){ +},{"buffer":60}],260:[function(require,module,exports){ (function (Buffer){ 'use strict'; @@ -21087,8 +21903,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de })(typeof exports === 'undefined' ? undefined.sax = {} : exports); }).call(this,require("buffer").Buffer) - -},{"babel-runtime/core-js/json/stringify":27,"babel-runtime/core-js/object/create":29,"babel-runtime/core-js/object/define-property":30,"babel-runtime/core-js/object/keys":34,"babel-runtime/core-js/string/from-code-point":37,"babel-runtime/helpers/typeof":43,"buffer":49,"stream":249,"string_decoder":48}],249:[function(require,module,exports){ +},{"babel-runtime/core-js/json/stringify":38,"babel-runtime/core-js/object/create":40,"babel-runtime/core-js/object/define-property":41,"babel-runtime/core-js/object/keys":45,"babel-runtime/core-js/string/from-code-point":48,"babel-runtime/helpers/typeof":54,"buffer":60,"stream":261,"string_decoder":59}],261:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -21217,7 +22032,7 @@ Stream.prototype.pipe = function(dest, options) { return dest; }; -},{"events":195,"inherits":205,"readable-stream/duplex.js":232,"readable-stream/passthrough.js":241,"readable-stream/readable.js":242,"readable-stream/transform.js":243,"readable-stream/writable.js":244}],250:[function(require,module,exports){ +},{"events":206,"inherits":216,"readable-stream/duplex.js":244,"readable-stream/passthrough.js":253,"readable-stream/readable.js":254,"readable-stream/transform.js":255,"readable-stream/writable.js":256}],262:[function(require,module,exports){ (function (global){ var ClientRequest = require('./lib/request') var response = require('./lib/response') @@ -21305,8 +22120,7 @@ http.METHODS = [ 'UNSUBSCRIBE' ] }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./lib/request":252,"./lib/response":253,"builtin-status-codes":50,"url":257,"xtend":305}],251:[function(require,module,exports){ +},{"./lib/request":264,"./lib/response":265,"builtin-status-codes":61,"url":269,"xtend":317}],263:[function(require,module,exports){ (function (global){ 'use strict'; @@ -21384,8 +22198,7 @@ function isFunction(value) { xhr = null; // Help gc }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],252:[function(require,module,exports){ +},{}],264:[function(require,module,exports){ (function (process,global,Buffer){ 'use strict'; @@ -21686,8 +22499,7 @@ ClientRequest.prototype.setSocketKeepAlive = function () {}; var unsafeHeaders = ['accept-charset', 'accept-encoding', 'access-control-request-headers', 'access-control-request-method', 'connection', 'content-length', 'cookie', 'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin', 'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'user-agent', 'via']; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) - -},{"./capability":251,"./response":253,"_process":227,"babel-runtime/core-js/object/keys":34,"buffer":49,"inherits":205,"readable-stream":242,"to-arraybuffer":256}],253:[function(require,module,exports){ +},{"./capability":263,"./response":265,"_process":239,"babel-runtime/core-js/object/keys":45,"buffer":60,"inherits":216,"readable-stream":254,"to-arraybuffer":268}],265:[function(require,module,exports){ (function (process,global,Buffer){ 'use strict'; @@ -21917,8 +22729,7 @@ IncomingMessage.prototype._onXHRProgress = function () { }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) - -},{"./capability":251,"_process":227,"babel-runtime/core-js/promise":35,"buffer":49,"inherits":205,"readable-stream":242}],254:[function(require,module,exports){ +},{"./capability":263,"_process":239,"babel-runtime/core-js/promise":46,"buffer":60,"inherits":216,"readable-stream":254}],266:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -22216,7 +23027,7 @@ function simpleEnd(buf) { return buf && buf.length ? this.write(buf) : ''; } -},{"safe-buffer":247}],255:[function(require,module,exports){ +},{"safe-buffer":259}],267:[function(require,module,exports){ (function (setImmediate,clearImmediate){ var nextTick = require('process/browser.js').nextTick; var apply = Function.prototype.apply; @@ -22295,8 +23106,7 @@ exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : delete immediateIds[id]; }; }).call(this,require("timers").setImmediate,require("timers").clearImmediate) - -},{"process/browser.js":227,"timers":255}],256:[function(require,module,exports){ +},{"process/browser.js":239,"timers":267}],268:[function(require,module,exports){ var Buffer = require('buffer').Buffer module.exports = function (buf) { @@ -22325,7 +23135,7 @@ module.exports = function (buf) { } } -},{"buffer":49}],257:[function(require,module,exports){ +},{"buffer":60}],269:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -23059,7 +23869,7 @@ Url.prototype.parseHost = function() { if (host) this.hostname = host; }; -},{"./util":258,"punycode":228,"querystring":231}],258:[function(require,module,exports){ +},{"./util":270,"punycode":240,"querystring":243}],270:[function(require,module,exports){ 'use strict'; module.exports = { @@ -23077,7 +23887,7 @@ module.exports = { } }; -},{}],259:[function(require,module,exports){ +},{}],271:[function(require,module,exports){ (function (global){ /** @@ -23148,8 +23958,7 @@ function config (name) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],260:[function(require,module,exports){ +},{}],272:[function(require,module,exports){ 'use strict'; var isES5 = typeof Object.defineProperty === 'function' @@ -23237,7 +24046,7 @@ module.exports = function promisify(orig) { module.exports.custom = kCustomPromisifiedSymbol; module.exports.customPromisifyArgs = kCustomPromisifyArgsSymbol; -},{"object.getownpropertydescriptors":221}],261:[function(require,module,exports){ +},{"object.getownpropertydescriptors":233}],273:[function(require,module,exports){ 'use strict'; var define = require('define-properties'); @@ -23263,7 +24072,7 @@ define(boundPromisify, { module.exports = boundPromisify; -},{"./implementation":260,"./polyfill":262,"./shim":263,"define-properties":169,"util":265}],262:[function(require,module,exports){ +},{"./implementation":272,"./polyfill":274,"./shim":275,"define-properties":180,"util":277}],274:[function(require,module,exports){ 'use strict'; var util = require('util'); @@ -23276,7 +24085,7 @@ module.exports = function getPolyfill() { return implementation; }; -},{"./implementation":260,"util":265}],263:[function(require,module,exports){ +},{"./implementation":272,"util":277}],275:[function(require,module,exports){ 'use strict'; var util = require('util'); @@ -23291,14 +24100,14 @@ module.exports = function shimUtilPromisify() { return polyfill; }; -},{"./polyfill":262,"util":265}],264:[function(require,module,exports){ +},{"./polyfill":274,"util":277}],276:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } -},{}],265:[function(require,module,exports){ +},{}],277:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -23888,8 +24697,7 @@ function hasOwnProperty(obj, prop) { } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./support/isBuffer":264,"_process":227,"inherits":205}],266:[function(require,module,exports){ +},{"./support/isBuffer":276,"_process":239,"inherits":216}],278:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -23905,7 +24713,7 @@ function hasOwnProperty(obj, prop) { }; }).call(undefined); -},{}],267:[function(require,module,exports){ +},{}],279:[function(require,module,exports){ 'use strict'; var _typeof2 = require('babel-runtime/helpers/typeof'); @@ -24049,7 +24857,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./defaults":268,"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43,"xmlbuilder":304}],268:[function(require,module,exports){ +},{"./defaults":280,"babel-runtime/core-js/object/keys":45,"babel-runtime/helpers/typeof":54,"xmlbuilder":316}],280:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -24124,7 +24932,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{}],269:[function(require,module,exports){ +},{}],281:[function(require,module,exports){ 'use strict'; var _getOwnPropertyNames = require('babel-runtime/core-js/object/get-own-property-names'); @@ -24532,7 +25340,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{"./bom":266,"./defaults":268,"./processors":270,"babel-runtime/core-js/object/get-own-property-names":32,"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43,"events":195,"sax":248,"timers":255,"util.promisify":261}],270:[function(require,module,exports){ +},{"./bom":278,"./defaults":280,"./processors":282,"babel-runtime/core-js/object/get-own-property-names":43,"babel-runtime/core-js/object/keys":45,"babel-runtime/helpers/typeof":54,"events":206,"sax":260,"timers":267,"util.promisify":273}],282:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -24570,7 +25378,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{}],271:[function(require,module,exports){ +},{}],283:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -24621,7 +25429,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.parseStringPromise = parser.parseStringPromise; }).call(undefined); -},{"./builder":267,"./defaults":268,"./parser":269,"./processors":270}],272:[function(require,module,exports){ +},{"./builder":279,"./defaults":280,"./parser":281,"./processors":282}],284:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -24636,7 +25444,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{}],273:[function(require,module,exports){ +},{}],285:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -24662,7 +25470,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{}],274:[function(require,module,exports){ +},{}],286:[function(require,module,exports){ 'use strict'; var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); @@ -24768,7 +25576,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de module.exports.getValue = getValue; }).call(undefined); -},{"babel-runtime/core-js/object/assign":28,"babel-runtime/core-js/object/get-prototype-of":33,"babel-runtime/helpers/typeof":43}],275:[function(require,module,exports){ +},{"babel-runtime/core-js/object/assign":39,"babel-runtime/core-js/object/get-prototype-of":44,"babel-runtime/helpers/typeof":54}],287:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -24781,7 +25589,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }; }).call(undefined); -},{}],276:[function(require,module,exports){ +},{}],288:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -24897,7 +25705,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295,"babel-runtime/core-js/object/create":29}],277:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307,"babel-runtime/core-js/object/create":40}],289:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -24949,7 +25757,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLCharacterData); }).call(undefined); -},{"./NodeType":273,"./XMLCharacterData":278,"babel-runtime/core-js/object/create":29}],278:[function(require,module,exports){ +},{"./NodeType":285,"./XMLCharacterData":290,"babel-runtime/core-js/object/create":40}],290:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -25043,7 +25851,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./XMLNode":295,"babel-runtime/core-js/object/create":29}],279:[function(require,module,exports){ +},{"./XMLNode":307,"babel-runtime/core-js/object/create":40}],291:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -25095,7 +25903,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLCharacterData); }).call(undefined); -},{"./NodeType":273,"./XMLCharacterData":278,"babel-runtime/core-js/object/create":29}],280:[function(require,module,exports){ +},{"./NodeType":285,"./XMLCharacterData":290,"babel-runtime/core-js/object/create":40}],292:[function(require,module,exports){ 'use strict'; var _keys = require('babel-runtime/core-js/object/keys'); @@ -25171,7 +25979,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./XMLDOMErrorHandler":281,"./XMLDOMStringList":283,"babel-runtime/core-js/object/create":29,"babel-runtime/core-js/object/keys":34}],281:[function(require,module,exports){ +},{"./XMLDOMErrorHandler":293,"./XMLDOMStringList":295,"babel-runtime/core-js/object/create":40,"babel-runtime/core-js/object/keys":45}],293:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -25189,7 +25997,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{}],282:[function(require,module,exports){ +},{}],294:[function(require,module,exports){ "use strict"; // Generated by CoffeeScript 1.12.7 @@ -25223,7 +26031,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{}],283:[function(require,module,exports){ +},{}],295:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25253,7 +26061,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{}],284:[function(require,module,exports){ +},{}],296:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25318,7 +26126,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295}],285:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307}],297:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25366,7 +26174,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295}],286:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307}],298:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25474,7 +26282,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./XMLNode":295}],287:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./XMLNode":307}],299:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25536,7 +26344,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295}],288:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307}],300:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25590,7 +26398,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./XMLNode":295}],289:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./XMLNode":307}],301:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -25792,7 +26600,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./XMLDTDAttList":284,"./XMLDTDElement":285,"./XMLDTDEntity":286,"./XMLDTDNotation":287,"./XMLNamedNodeMap":294,"./XMLNode":295}],290:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./XMLDTDAttList":296,"./XMLDTDElement":297,"./XMLDTDEntity":298,"./XMLDTDNotation":299,"./XMLNamedNodeMap":306,"./XMLNode":307}],302:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -26049,7 +26857,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./XMLDOMConfiguration":280,"./XMLDOMImplementation":282,"./XMLNode":295,"./XMLStringWriter":300,"./XMLStringifier":301}],291:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./XMLDOMConfiguration":292,"./XMLDOMImplementation":294,"./XMLNode":307,"./XMLStringWriter":312,"./XMLStringifier":313}],303:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -26602,7 +27410,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./WriterState":275,"./XMLAttribute":276,"./XMLCData":277,"./XMLComment":279,"./XMLDTDAttList":284,"./XMLDTDElement":285,"./XMLDTDEntity":286,"./XMLDTDNotation":287,"./XMLDeclaration":288,"./XMLDocType":289,"./XMLDocument":290,"./XMLElement":293,"./XMLProcessingInstruction":297,"./XMLRaw":298,"./XMLStringWriter":300,"./XMLStringifier":301,"./XMLText":302}],292:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./WriterState":287,"./XMLAttribute":288,"./XMLCData":289,"./XMLComment":291,"./XMLDTDAttList":296,"./XMLDTDElement":297,"./XMLDTDEntity":298,"./XMLDTDNotation":299,"./XMLDeclaration":300,"./XMLDocType":301,"./XMLDocument":302,"./XMLElement":305,"./XMLProcessingInstruction":309,"./XMLRaw":310,"./XMLStringWriter":312,"./XMLStringifier":313,"./XMLText":314}],304:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -26649,7 +27457,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295,"babel-runtime/core-js/object/create":29}],293:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307,"babel-runtime/core-js/object/create":40}],305:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -26969,7 +27777,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./XMLAttribute":276,"./XMLNamedNodeMap":294,"./XMLNode":295,"babel-runtime/core-js/object/create":29}],294:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./XMLAttribute":288,"./XMLNamedNodeMap":306,"./XMLNode":307,"babel-runtime/core-js/object/create":40}],306:[function(require,module,exports){ "use strict"; var _keys = require("babel-runtime/core-js/object/keys"); @@ -27035,7 +27843,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"babel-runtime/core-js/object/keys":34}],295:[function(require,module,exports){ +},{"babel-runtime/core-js/object/keys":45}],307:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -27840,7 +28648,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./DocumentPosition":272,"./NodeType":273,"./Utility":274,"./XMLCData":277,"./XMLComment":279,"./XMLDeclaration":288,"./XMLDocType":289,"./XMLDummy":292,"./XMLElement":293,"./XMLNamedNodeMap":294,"./XMLNodeList":296,"./XMLProcessingInstruction":297,"./XMLRaw":298,"./XMLText":302}],296:[function(require,module,exports){ +},{"./DocumentPosition":284,"./NodeType":285,"./Utility":286,"./XMLCData":289,"./XMLComment":291,"./XMLDeclaration":300,"./XMLDocType":301,"./XMLDummy":304,"./XMLElement":305,"./XMLNamedNodeMap":306,"./XMLNodeList":308,"./XMLProcessingInstruction":309,"./XMLRaw":310,"./XMLText":314}],308:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -27870,7 +28678,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{}],297:[function(require,module,exports){ +},{}],309:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -27935,7 +28743,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLCharacterData); }).call(undefined); -},{"./NodeType":273,"./XMLCharacterData":278,"babel-runtime/core-js/object/create":29}],298:[function(require,module,exports){ +},{"./NodeType":285,"./XMLCharacterData":290,"babel-runtime/core-js/object/create":40}],310:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -27986,7 +28794,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLNode); }).call(undefined); -},{"./NodeType":273,"./XMLNode":295,"babel-runtime/core-js/object/create":29}],299:[function(require,module,exports){ +},{"./NodeType":285,"./XMLNode":307,"babel-runtime/core-js/object/create":40}],311:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -28173,7 +28981,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLWriterBase); }).call(undefined); -},{"./NodeType":273,"./WriterState":275,"./XMLWriterBase":303}],300:[function(require,module,exports){ +},{"./NodeType":285,"./WriterState":287,"./XMLWriterBase":315}],312:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -28217,7 +29025,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLWriterBase); }).call(undefined); -},{"./XMLWriterBase":303}],301:[function(require,module,exports){ +},{"./XMLWriterBase":315}],313:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -28463,7 +29271,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{}],302:[function(require,module,exports){ +},{}],314:[function(require,module,exports){ 'use strict'; var _create = require('babel-runtime/core-js/object/create'); @@ -28548,7 +29356,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(XMLCharacterData); }).call(undefined); -},{"./NodeType":273,"./XMLCharacterData":278,"babel-runtime/core-js/object/create":29}],303:[function(require,module,exports){ +},{"./NodeType":285,"./XMLCharacterData":290,"babel-runtime/core-js/object/create":40}],315:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -28994,7 +29802,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }(); }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./WriterState":275,"./XMLCData":277,"./XMLComment":279,"./XMLDTDAttList":284,"./XMLDTDElement":285,"./XMLDTDEntity":286,"./XMLDTDNotation":287,"./XMLDeclaration":288,"./XMLDocType":289,"./XMLDummy":292,"./XMLElement":293,"./XMLProcessingInstruction":297,"./XMLRaw":298,"./XMLText":302}],304:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./WriterState":287,"./XMLCData":289,"./XMLComment":291,"./XMLDTDAttList":296,"./XMLDTDElement":297,"./XMLDTDEntity":298,"./XMLDTDNotation":299,"./XMLDeclaration":300,"./XMLDocType":301,"./XMLDummy":304,"./XMLElement":305,"./XMLProcessingInstruction":309,"./XMLRaw":310,"./XMLText":314}],316:[function(require,module,exports){ 'use strict'; // Generated by CoffeeScript 1.12.7 @@ -29062,7 +29870,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de module.exports.writerState = WriterState; }).call(undefined); -},{"./NodeType":273,"./Utility":274,"./WriterState":275,"./XMLDOMImplementation":282,"./XMLDocument":290,"./XMLDocumentCB":291,"./XMLStreamWriter":299,"./XMLStringWriter":300}],305:[function(require,module,exports){ +},{"./NodeType":285,"./Utility":286,"./WriterState":287,"./XMLDOMImplementation":294,"./XMLDocument":302,"./XMLDocumentCB":303,"./XMLStreamWriter":311,"./XMLStringWriter":312}],317:[function(require,module,exports){ module.exports = extend var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -29083,7 +29891,7 @@ function extend() { return target } -},{}],306:[function(require,module,exports){ +},{}],318:[function(require,module,exports){ 'use strict'; var Buffer = require('buffer').Buffer; @@ -29170,7 +29978,7 @@ each(['createCredentials', 'createCipher', 'createCipheriv', 'createDecipher', ' }; }); -},{"./md5":308,"./sha":309,"./sha256":310,"buffer":49}],307:[function(require,module,exports){ +},{"./md5":320,"./sha":321,"./sha256":322,"buffer":60}],319:[function(require,module,exports){ 'use strict'; var Buffer = require('buffer').Buffer; @@ -29209,7 +30017,7 @@ function hash(buf, fn, hashSize, bigEndian) { module.exports = { hash: hash }; -},{"buffer":49}],308:[function(require,module,exports){ +},{"buffer":60}],320:[function(require,module,exports){ "use strict"; /* @@ -29365,7 +30173,7 @@ module.exports = function md5(buf) { return helpers.hash(buf, core_md5, 16); }; -},{"./helpers":307}],309:[function(require,module,exports){ +},{"./helpers":319}],321:[function(require,module,exports){ 'use strict'; /* @@ -29459,7 +30267,7 @@ module.exports = function sha1(buf) { return helpers.hash(buf, core_sha1, 20, true); }; -},{"./helpers":307}],310:[function(require,module,exports){ +},{"./helpers":319}],322:[function(require,module,exports){ 'use strict'; /** @@ -29541,7 +30349,7 @@ module.exports = function sha256(buf) { return helpers.hash(buf, core_sha256, 32, true); }; -},{"./helpers":307}],311:[function(require,module,exports){ +},{"./helpers":319}],323:[function(require,module,exports){ (function (global){ "use strict"; @@ -29689,8 +30497,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de }); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"babel-runtime/core-js/object/create":29,"babel-runtime/helpers/classCallCheck":41,"babel-runtime/helpers/createClass":42,"babel-runtime/helpers/typeof":43}],312:[function(require,module,exports){ +},{"babel-runtime/core-js/object/create":40,"babel-runtime/helpers/classCallCheck":52,"babel-runtime/helpers/createClass":53,"babel-runtime/helpers/typeof":54}],324:[function(require,module,exports){ 'use strict'; // copy from https://github.com/node-modules/utility for browser @@ -29719,7 +30526,7 @@ exports.timestamp = function timestamp(t) { return Math.round(Date.now() / 1000); }; -},{"escape-html":194}],313:[function(require,module,exports){ +},{"escape-html":205}],325:[function(require,module,exports){ (function (process,Buffer){ 'use strict'; @@ -30482,9 +31289,6 @@ exports.requestWithCallback = function requestWithCallback(url, args, callback) }; }).call(this,require('_process'),require("buffer").Buffer) - -},{"_process":227,"any-promise":23,"babel-runtime/core-js/json/stringify":27,"babel-runtime/helpers/typeof":43,"buffer":49,"constants":51,"debug":167,"http":250,"https":202,"humanize-ms":203,"url":257,"util":265}]},{},[1])(1) +},{"_process":239,"any-promise":34,"babel-runtime/core-js/json/stringify":38,"babel-runtime/helpers/typeof":54,"buffer":60,"constants":62,"debug":178,"http":262,"https":213,"humanize-ms":214,"url":269,"util":277}]},{},[1])(1) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYnJvd3Nlci5qcyIsImxpYi9icm93c2VyL2NsaWVudC5qcyIsImxpYi9icm93c2VyL21hbmFnZWQtdXBsb2FkLmpzIiwibGliL2Jyb3dzZXIvb2JqZWN0LmpzIiwibGliL2Jyb3dzZXIvdmVyc2lvbi5qcyIsImxpYi9jb21tb24vY2FsbGJhY2suanMiLCJsaWIvY29tbW9uL2NsaWVudC9pbml0T3B0aW9ucy5qcyIsImxpYi9jb21tb24vbXVsdGlwYXJ0LmpzIiwibGliL2NvbW1vbi9vYmplY3QvY29weU9iamVjdC5qcyIsImxpYi9jb21tb24vb2JqZWN0L2RlbGV0ZU9iamVjdFRhZ2dpbmcuanMiLCJsaWIvY29tbW9uL29iamVjdC9nZXRPYmplY3RUYWdnaW5nLmpzIiwibGliL2NvbW1vbi9vYmplY3QvcHV0T2JqZWN0VGFnZ2luZy5qcyIsImxpYi9jb21tb24vcGFyYWxsZWwuanMiLCJsaWIvY29tbW9uL3NpZ25VdGlscy5qcyIsImxpYi9jb21tb24vdXRpbHMvY2hlY2tCdWNrZXROYW1lLmpzIiwibGliL2NvbW1vbi91dGlscy9jaGVja09iamVjdFRhZy5qcyIsImxpYi9jb21tb24vdXRpbHMvY2hlY2tWYWxpZC5qcyIsImxpYi9jb21tb24vdXRpbHMvZGVlcENvcHkuanMiLCJsaWIvY29tbW9uL3V0aWxzL2lzSVAuanMiLCJsaWIvY29tbW9uL3V0aWxzL2lzT2JqZWN0LmpzIiwibGliL2NvbW1vbi91dGlscy9vYmoyeG1sLmpzIiwibm9kZV9tb2R1bGVzL2FnZW50a2VlcGFsaXZlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYW55LXByb21pc2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW55LXByb21pc2UvbG9hZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FueS1wcm9taXNlL3JlZ2lzdGVyLXNoaW0uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2pzb24vc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3Qva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc2V0LWltbWVkaWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3RyaW5nL2Zyb20tY29kZS1wb2ludC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wvaGFzLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jvd3Nlci9zcmMvYm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVpbHRpbi1zdGF0dXMtY29kZXMvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9jb25zdGFudHMtYnJvd3NlcmlmeS9jb25zdGFudHMuanNvbiIsIm5vZGVfbW9kdWxlcy9jb3B5LXRvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2Fzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3NldC1pbW1lZGlhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N0cmluZy9mcm9tLWNvZGUtcG9pbnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9oYXMtaW5zdGFuY2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19taWNyb3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1waWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC10by1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191c2VyLWFnZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9kYXRlZm9ybWF0L2xpYi9kYXRlZm9ybWF0LmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIm5vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9HZXRJbnRyaW5zaWMuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXMyMDE1LmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzMjAxNi5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczUuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXM3LmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvYXNzZXJ0UmVjb3JkLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvY2FsbEJpbmQuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9ldmVyeS5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2ZvckVhY2guanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc0Zpbml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzTmFOLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9pc1Byb3BlcnR5RGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL2lzU2FtZVByb3BlcnR5RGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL21vZC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9oZWxwZXJzL3NpZ24uanMiLCJub2RlX21vZHVsZXMvZXMtYWJzdHJhY3Qvbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L25vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2VzMjAxNS5qcyIsIm5vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXM1LmpzIiwibm9kZV9tb2R1bGVzL2VzLXRvLXByaW1pdGl2ZS9lczYuanMiLCJub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvZXNjYXBlLWh0bWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JlYWNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCJub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIm5vZGVfbW9kdWxlcy9oYXMvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaHVtYW5pemUtbXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1jYWxsYWJsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1jbGFzcy1ob3RmaXgvaXMtY2xhc3MuanMiLCJub2RlX21vZHVsZXMvaXMtZGF0ZS1vYmplY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXMtc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXR5cGUtb2YvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc3N0cmVhbS9pc3N0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9tZXJnZS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycy9pbXBsZW1lbnRhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycy9wb2x5ZmlsbC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycy9zaGltLmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wbGF0Zm9ybS9wbGF0Zm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUtbW9kdWxlLmpzIiwibm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zYXgvbGliL3NheC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvY2FwYWJpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVzcG9uc2UuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwibm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJub2RlX21vZHVsZXMvdG8tYXJyYXlidWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdXJsL3VybC5qcyIsIm5vZGVfbW9kdWxlcy91cmwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwucHJvbWlzaWZ5L2ltcGxlbWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwucHJvbWlzaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwucHJvbWlzaWZ5L3BvbHlmaWxsLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwucHJvbWlzaWZ5L3NoaW0uanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9ib20uanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9idWlsZGVyLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9saWIvZGVmYXVsdHMuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9wYXJzZXIuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9wcm9jZXNzb3JzLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9saWIveG1sMmpzLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL0RvY3VtZW50UG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvTm9kZVR5cGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvVXRpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9Xcml0ZXJTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxBdHRyaWJ1dGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ0RhdGEuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ2hhcmFjdGVyRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxDb21tZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERPTUNvbmZpZ3VyYXRpb24uanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRE9NRXJyb3JIYW5kbGVyLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERPTUltcGxlbWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERPTVN0cmluZ0xpc3QuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRFREQXR0TGlzdC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEVERFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERUREVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEVEROb3RhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEZWNsYXJhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEb2NUeXBlLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERvY3VtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERvY3VtZW50Q0IuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRHVtbXkuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxOYW1lZE5vZGVNYXAuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxOb2RlTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MUmF3LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFN0cmVhbVdyaXRlci5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxTdHJpbmdXcml0ZXIuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MU3RyaW5naWZpZXIuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MVGV4dC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxXcml0ZXJCYXNlLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsInNoaW1zL2NyeXB0by9jcnlwdG8uanMiLCJzaGltcy9jcnlwdG8vaGVscGVycy5qcyIsInNoaW1zL2NyeXB0by9tZDUuanMiLCJzaGltcy9jcnlwdG8vc2hhLmpzIiwic2hpbXMvY3J5cHRvL3NoYTI1Ni5qcyIsInNoaW1zL21pbWUuanMiLCJzaGltcy91dGlsaXR5LmpzIiwic2hpbXMveGhyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7QUNBQSxJQUFNLE1BQU0sUUFBUSxrQkFBUixDQUFaO0FBQ0EsSUFBSSxNQUFKLEdBQWEsUUFBUSxRQUFSLEVBQWtCLE1BQS9CO0FBQ0EsSUFBSSxNQUFKLEdBQWEsUUFBUSxjQUFSLENBQWI7QUFDQSxJQUFJLE9BQUosR0FBYyxRQUFRLG1CQUFSLEVBQTZCLE9BQTNDOztBQUVBLE9BQU8sT0FBUCxHQUFpQixHQUFqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMQSxJQUFNLFFBQVEsUUFBUSxPQUFSLEVBQWlCLFNBQWpCLENBQWQ7QUFDQSxJQUFNLFNBQVMsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNLE9BQU8sUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNLE9BQU8sUUFBUSxTQUFSLENBQWI7QUFDQSxJQUFNLE9BQU8sUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNLE1BQU0sUUFBUSxRQUFSLENBQVo7QUFDQSxJQUFNLGlCQUFpQixRQUFRLGdCQUFSLENBQXZCO0FBQ0EsSUFBTSxRQUFRLFFBQVEsbUJBQVIsQ0FBZDtBQUNBLElBQU0sVUFBVSxRQUFRLEtBQVIsQ0FBaEI7QUFDQSxJQUFNLEtBQUssUUFBUSxZQUFSLENBQVg7QUFDQSxJQUFNLFdBQVcsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTSxV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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcG9CQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDak5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqS0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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TkQ7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0MkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVUE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM5U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2pzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Z0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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RixDQTVoREEsRUE0aERFLE9BQU8sT0FBUCxLQUFtQixXQUFuQixHQUFpQyxVQUFLLEdBQUwsR0FBVyxFQUE1QyxHQUFpRCxPQTVoRG5EOzs7OztBQ0FEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFrQkE7QUFDQSxDQUFDLFlBQVc7QUFDVjs7QUFDQSxVQUFRLFFBQVIsR0FBbUIsVUFBUyxHQUFULEVBQWM7QUFDL0IsUUFBSSxJQUFJLENBQUosTUFBVyxRQUFmLEVBQXlCO0FBQ3ZCLGFBQU8sSUFBSSxTQUFKLENBQWMsQ0FBZCxDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBTyxHQUFQO0FBQ0Q7QUFDRixHQU5EO0FBUUQsQ0FWRCxFQVVHLElBVkg7Ozs7Ozs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1Y7O0FBQ0EsTUFBSSxPQUFKO0FBQUEsTUFBYSxRQUFiO0FBQUEsTUFBdUIsV0FBdkI7QUFBQSxNQUFvQyxhQUFwQztBQUFBLE1BQW1ELFNBQW5EO0FBQUEsTUFDRSxVQUFVLEdBQUcsY0FEZjs7QUFHQSxZQUFVLFFBQVEsWUFBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLEVBQXNCLFFBQWpDOztBQUVBLGtCQUFnQix1QkFBUyxLQUFULEVBQWdCO0FBQzlCLFdBQU8sT0FBTyxLQUFQLEtBQWlCLFFBQWpCLEtBQThCLE1BQU0sT0FBTixDQUFjLEdBQWQsS0FBc0IsQ0FBdEIsSUFBMkIsTUFBTSxPQUFOLENBQWMsR0FBZCxLQUFzQixDQUFqRCxJQUFzRCxNQUFNLE9BQU4sQ0FBYyxHQUFkLEtBQXNCLENBQTFHLENBQVA7QUFDRCxHQUZEOztBQUlBLGNBQVksbUJBQVMsS0FBVCxFQUFnQjtBQUMxQixXQUFPLGNBQWUsWUFBWSxLQUFaLENBQWYsR0FBcUMsS0FBNUM7QUFDRCxHQUZEOztBQUlBLGdCQUFjLHFCQUFTLEtBQVQsRUFBZ0I7QUFDNUIsV0FBTyxNQUFNLE9BQU4sQ0FBYyxLQUFkLEVBQXFCLGlCQUFyQixDQUFQO0FBQ0QsR0FGRDs7QUFJQSxVQUFRLE9BQVIsR0FBbUIsWUFBVztBQUM1QixhQUFTLE9BQVQsQ0FBaUIsSUFBakIsRUFBdUI7QUFDckIsVUFBSSxHQUFKLEVBQVMsR0FBVCxFQUFjLEtBQWQ7QUFDQSxXQUFLLE9BQUwsR0FBZSxFQUFmO0FBQ0EsWUFBTSxTQUFTLEtBQVQsQ0FBTjtBQUNBLFdBQUssR0FBTCxJQUFZLEdBQVosRUFBaUI7QUFDZixZQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixHQUFsQixDQUFMLEVBQTZCO0FBQzdCLGdCQUFRLElBQUksR0FBSixDQUFSO0FBQ0EsYUFBSyxPQUFMLENBQWEsR0FBYixJQUFvQixLQUFwQjtBQUNEO0FBQ0QsV0FBSyxHQUFMLElBQVksSUFBWixFQUFrQjtBQUNoQixZQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixHQUFuQixDQUFMLEVBQThCO0FBQzlCLGdCQUFRLEtBQUssR0FBTCxDQUFSO0FBQ0EsYUFBSyxPQUFMLENBQWEsR0FBYixJQUFvQixLQUFwQjtBQUNEO0FBQ0Y7O0FBRUQsWUFBUSxTQUFSLENBQWtCLFdBQWxCLEdBQWdDLFVBQVMsT0FBVCxFQUFrQjtBQUNoRCxVQUFJLE9BQUosRUFBYSxPQUFiLEVBQXNCLE1BQXRCLEVBQThCLFdBQTlCLEVBQTJDLFFBQTNDO0FBQ0EsZ0JBQVUsS0FBSyxPQUFMLENBQWEsT0FBdkI7QUFDQSxnQkFBVSxLQUFLLE9BQUwsQ0FBYSxPQUF2QjtBQUNBLFVBQUssb0JBQVksT0FBWixFQUFxQixNQUFyQixLQUFnQyxDQUFqQyxJQUF3QyxLQUFLLE9BQUwsQ0FBYSxRQUFiLEtBQTBCLFNBQVMsS0FBVCxFQUFnQixRQUF0RixFQUFpRztBQUMvRixtQkFBVyxvQkFBWSxPQUFaLEVBQXFCLENBQXJCLENBQVg7QUFDQSxrQkFBVSxRQUFRLFFBQVIsQ0FBVjtBQUNELE9BSEQsTUFHTztBQUNMLG1CQUFXLEtBQUssT0FBTCxDQUFhLFFBQXhCO0FBQ0Q7QUFDRCxlQUFVLFVBQVMsS0FBVCxFQUFnQjtBQUN4QixlQUFPLFVBQVMsT0FBVCxFQUFrQixHQUFsQixFQUF1QjtBQUM1QixjQUFJLElBQUosRUFBVSxLQUFWLEVBQWlCLEtBQWpCLEVBQXdCLEtBQXhCLEVBQStCLEdBQS9CLEVBQW9DLEtBQXBDO0FBQ0EsY0FBSSxRQUFPLEdBQVAsdURBQU8sR0FBUCxPQUFlLFFBQW5CLEVBQTZCO0FBQzNCLGdCQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsSUFBdUIsY0FBYyxHQUFkLENBQTNCLEVBQStDO0FBQzdDLHNCQUFRLEdBQVIsQ0FBWSxVQUFVLEdBQVYsQ0FBWjtBQUNELGFBRkQsTUFFTztBQUNMLHNCQUFRLEdBQVIsQ0FBWSxHQUFaO0FBQ0Q7QUFDRixXQU5ELE1BTU8sSUFBSSxNQUFNLE9BQU4sQ0FBYyxHQUFkLENBQUosRUFBd0I7QUFDN0IsaUJBQUssS0FBTCxJQUFjLEdBQWQsRUFBbUI7QUFDakIsa0JBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxHQUFiLEVBQWtCLEtBQWxCLENBQUwsRUFBK0I7QUFDL0Isc0JBQVEsSUFBSSxLQUFKLENBQVI7QUFDQSxtQkFBSyxHQUFMLElBQVksS0FBWixFQUFtQjtBQUNqQix3QkFBUSxNQUFNLEdBQU4sQ0FBUjtBQUNBLDBCQUFVLE9BQU8sUUFBUSxHQUFSLENBQVksR0FBWixDQUFQLEVBQXlCLEtBQXpCLEVBQWdDLEVBQWhDLEVBQVY7QUFDRDtBQUNGO0FBQ0YsV0FUTSxNQVNBO0FBQ0wsaUJBQUssR0FBTCxJQUFZLEdBQVosRUFBaUI7QUFDZixrQkFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBTCxFQUE2QjtBQUM3QixzQkFBUSxJQUFJLEdBQUosQ0FBUjtBQUNBLGtCQUFJLFFBQVEsT0FBWixFQUFxQjtBQUNuQixvQkFBSSxRQUFPLEtBQVAsdURBQU8sS0FBUCxPQUFpQixRQUFyQixFQUErQjtBQUM3Qix1QkFBSyxJQUFMLElBQWEsS0FBYixFQUFvQjtBQUNsQiw0QkFBUSxNQUFNLElBQU4sQ0FBUjtBQUNBLDhCQUFVLFFBQVEsR0FBUixDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FBVjtBQUNEO0FBQ0Y7QUFDRixlQVBELE1BT08sSUFBSSxRQUFRLE9BQVosRUFBcUI7QUFDMUIsb0JBQUksTUFBTSxPQUFOLENBQWMsS0FBZCxJQUF1QixjQUFjLEtBQWQsQ0FBM0IsRUFBaUQ7QUFDL0MsNEJBQVUsUUFBUSxHQUFSLENBQVksVUFBVSxLQUFWLENBQVosQ0FBVjtBQUNELGlCQUZELE1BRU87QUFDTCw0QkFBVSxRQUFRLEdBQVIsQ0FBWSxLQUFaLENBQVY7QUFDRDtBQUNGLGVBTk0sTUFNQSxJQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUMvQixxQkFBSyxLQUFMLElBQWMsS0FBZCxFQUFxQjtBQUNuQixzQkFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEtBQWIsRUFBb0IsS0FBcEIsQ0FBTCxFQUFpQztBQUNqQywwQkFBUSxNQUFNLEtBQU4sQ0FBUjtBQUNBLHNCQUFJLE9BQU8sS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3Qix3QkFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFkLElBQXVCLGNBQWMsS0FBZCxDQUEzQixFQUFpRDtBQUMvQyxnQ0FBVSxRQUFRLEdBQVIsQ0FBWSxHQUFaLEVBQWlCLEdBQWpCLENBQXFCLFVBQVUsS0FBVixDQUFyQixFQUF1QyxFQUF2QyxFQUFWO0FBQ0QscUJBRkQsTUFFTztBQUNMLGdDQUFVLFFBQVEsR0FBUixDQUFZLEdBQVosRUFBaUIsS0FBakIsRUFBd0IsRUFBeEIsRUFBVjtBQUNEO0FBQ0YsbUJBTkQsTUFNTztBQUNMLDhCQUFVLE9BQU8sUUFBUSxHQUFSLENBQVksR0FBWixDQUFQLEVBQXlCLEtBQXpCLEVBQWdDLEVBQWhDLEVBQVY7QUFDRDtBQUNGO0FBQ0YsZUFkTSxNQWNBLElBQUksUUFBTyxLQUFQLHVEQUFPLEtBQVAsT0FBaUIsUUFBckIsRUFBK0I7QUFDcEMsMEJBQVUsT0FBTyxRQUFRLEdBQVIsQ0FBWSxHQUFaLENBQVAsRUFBeUIsS0FBekIsRUFBZ0MsRUFBaEMsRUFBVjtBQUNELGVBRk0sTUFFQTtBQUNMLG9CQUFJLE9BQU8sS0FBUCxLQUFpQixRQUFqQixJQUE2QixNQUFNLE9BQU4sQ0FBYyxLQUEzQyxJQUFvRCxjQUFjLEtBQWQsQ0FBeEQsRUFBOEU7QUFDNUUsNEJBQVUsUUFBUSxHQUFSLENBQVksR0FBWixFQUFpQixHQUFqQixDQUFxQixVQUFVLEtBQVYsQ0FBckIsRUFBdUMsRUFBdkMsRUFBVjtBQUNELGlCQUZELE1BRU87QUFDTCxzQkFBSSxTQUFTLElBQWIsRUFBbUI7QUFDakIsNEJBQVEsRUFBUjtBQUNEO0FBQ0QsNEJBQVUsUUFBUSxHQUFSLENBQVksR0FBWixFQUFpQixNQUFNLFFBQU4sRUFBakIsRUFBbUMsRUFBbkMsRUFBVjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsaUJBQU8sT0FBUDtBQUNELFNBL0REO0FBZ0VELE9BakVRLENBaUVOLElBakVNLENBQVQ7QUFrRUEsb0JBQWMsUUFBUSxNQUFSLENBQWUsUUFBZixFQUF5QixLQUFLLE9BQUwsQ0FBYSxNQUF0QyxFQUE4QyxLQUFLLE9BQUwsQ0FBYSxPQUEzRCxFQUFvRTtBQUNoRixrQkFBVSxLQUFLLE9BQUwsQ0FBYSxRQUR5RDtBQUVoRiw2QkFBcUIsS0FBSyxPQUFMLENBQWE7QUFGOEMsT0FBcEUsQ0FBZDtBQUlBLGFBQU8sT0FBTyxXQUFQLEVBQW9CLE9BQXBCLEVBQTZCLEdBQTdCLENBQWlDLEtBQUssT0FBTCxDQUFhLFVBQTlDLENBQVA7QUFDRCxLQWpGRDs7QUFtRkEsV0FBTyxPQUFQO0FBRUQsR0F0R2lCLEVBQWxCO0FBd0dELENBN0hELEVBNkhHLElBN0hIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsVUFBUSxRQUFSLEdBQW1CO0FBQ2pCLFdBQU87QUFDTCx1QkFBaUIsS0FEWjtBQUVMLFlBQU0sSUFGRDtBQUdMLGlCQUFXLElBSE47QUFJTCxxQkFBZSxLQUpWO0FBS0wsZUFBUyxHQUxKO0FBTUwsZUFBUyxHQU5KO0FBT0wscUJBQWUsS0FQVjtBQVFMLG1CQUFhLEtBUlI7QUFTTCxrQkFBWSxLQVRQO0FBVUwsb0JBQWMsS0FWVDtBQVdMLGlCQUFXLElBWE47QUFZTCxhQUFPLEtBWkY7QUFhTCx3QkFBa0IsS0FiYjtBQWNMLGdCQUFVLElBZEw7QUFlTCx1QkFBaUIsS0FmWjtBQWdCTCx5QkFBbUIsS0FoQmQ7QUFpQkwsYUFBTyxLQWpCRjtBQWtCTCxjQUFRLElBbEJIO0FBbUJMLDBCQUFvQixJQW5CZjtBQW9CTCwyQkFBcUIsSUFwQmhCO0FBcUJMLHlCQUFtQixJQXJCZDtBQXNCTCx1QkFBaUIsSUF0Qlo7QUF1QkwsZ0JBQVU7QUF2QkwsS0FEVTtBQTBCakIsV0FBTztBQUNMLHVCQUFpQixLQURaO0FBRUwsWUFBTSxLQUZEO0FBR0wsaUJBQVcsS0FITjtBQUlMLHFCQUFlLEtBSlY7QUFLTCxlQUFTLEdBTEo7QUFNTCxlQUFTLEdBTko7QUFPTCxxQkFBZSxJQVBWO0FBUUwsbUJBQWEsS0FSUjtBQVNMLGtCQUFZLEtBVFA7QUFVTCxvQkFBYyxJQVZUO0FBV0wsaUJBQVcsSUFYTjtBQVlMLGFBQU8sS0FaRjtBQWFMLHdCQUFrQixLQWJiO0FBY0wsNkJBQXVCLEtBZGxCO0FBZUwsZ0JBQVUsSUFmTDtBQWdCTCx1QkFBaUIsS0FoQlo7QUFpQkwseUJBQW1CLEtBakJkO0FBa0JMLGFBQU8sS0FsQkY7QUFtQkwsY0FBUSxJQW5CSDtBQW9CTCwwQkFBb0IsSUFwQmY7QUFxQkwsMkJBQXFCLElBckJoQjtBQXNCTCx5QkFBbUIsSUF0QmQ7QUF1QkwsdUJBQWlCLElBdkJaO0FBd0JMLGdCQUFVLE1BeEJMO0FBeUJMLGNBQVE7QUFDTixtQkFBVyxLQURMO0FBRU4sb0JBQVksT0FGTjtBQUdOLHNCQUFjO0FBSFIsT0F6Qkg7QUE4QkwsZUFBUyxJQTlCSjtBQStCTCxrQkFBWTtBQUNWLGtCQUFVLElBREE7QUFFVixrQkFBVSxJQUZBO0FBR1YsbUJBQVc7QUFIRCxPQS9CUDtBQW9DTCxnQkFBVSxLQXBDTDtBQXFDTCxpQkFBVyxLQXJDTjtBQXNDTCxnQkFBVSxFQXRDTDtBQXVDTCxhQUFPO0FBdkNGO0FBMUJVLEdBQW5CO0FBcUVELENBdEVELEVBc0VHLElBdEVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVjs7QUFDQSxNQUFJLEdBQUo7QUFBQSxNQUFTLFFBQVQ7QUFBQSxNQUFtQixNQUFuQjtBQUFBLE1BQTJCLE9BQTNCO0FBQUEsTUFBb0MsV0FBcEM7QUFBQSxNQUFpRCxVQUFqRDtBQUFBLE1BQTZELFNBQTdEO0FBQUEsTUFBd0UsR0FBeEU7QUFBQSxNQUE2RSxZQUE3RTtBQUFBLE1BQ0UsT0FBTyxTQUFQLElBQU8sQ0FBUyxFQUFULEVBQWEsRUFBYixFQUFnQjtBQUFFLFdBQU8sWUFBVTtBQUFFLGFBQU8sR0FBRyxLQUFILENBQVMsRUFBVCxFQUFhLFNBQWIsQ0FBUDtBQUFpQyxLQUFwRDtBQUF1RCxHQURsRjtBQUFBLE1BRUUsU0FBUyxTQUFULE1BQVMsQ0FBUyxLQUFULEVBQWdCLE1BQWhCLEVBQXdCO0FBQUUsU0FBSyxJQUFJLEdBQVQsSUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxVQUFJLFFBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsR0FBckIsQ0FBSixFQUErQixNQUFNLEdBQU4sSUFBYSxPQUFPLEdBQVAsQ0FBYjtBQUEyQixLQUFDLFNBQVMsSUFBVCxHQUFnQjtBQUFFLFdBQUssV0FBTCxHQUFtQixLQUFuQjtBQUEyQixLQUFDLEtBQUssU0FBTCxHQUFpQixPQUFPLFNBQXhCLENBQW1DLE1BQU0sU0FBTixHQUFrQixJQUFJLElBQUosRUFBbEIsQ0FBOEIsTUFBTSxTQUFOLEdBQWtCLE9BQU8sU0FBekIsQ0FBb0MsT0FBTyxLQUFQO0FBQWUsR0FGNVI7QUFBQSxNQUdFLFVBQVUsR0FBRyxjQUhmOztBQUtBLFFBQU0sUUFBUSxLQUFSLENBQU47O0FBRUEsV0FBUyxRQUFRLFFBQVIsQ0FBVDs7QUFFQSxRQUFNLFFBQVEsT0FBUixDQUFOOztBQUVBLGVBQWEsUUFBUSxjQUFSLENBQWI7O0FBRUEsaUJBQWUsUUFBUSxRQUFSLEVBQWtCLFlBQWpDOztBQUVBLGFBQVcsUUFBUSxZQUFSLEVBQXNCLFFBQWpDOztBQUVBLGNBQVksUUFBUSxnQkFBUixDQUFaOztBQUVBLFlBQVUsaUJBQVMsS0FBVCxFQUFnQjtBQUN4QixXQUFPLFFBQU8sS0FBUCx1REFBTyxLQUFQLE9BQWlCLFFBQWpCLElBQThCLFNBQVMsSUFBdkMsSUFBZ0Qsb0JBQVksS0FBWixFQUFtQixNQUFuQixLQUE4QixDQUFyRjtBQUNELEdBRkQ7O0FBSUEsZ0JBQWMscUJBQVMsVUFBVCxFQUFxQixJQUFyQixFQUEyQixHQUEzQixFQUFnQztBQUM1QyxRQUFJLENBQUosRUFBTyxHQUFQLEVBQVksT0FBWjtBQUNBLFNBQUssSUFBSSxDQUFKLEVBQU8sTUFBTSxXQUFXLE1BQTdCLEVBQXFDLElBQUksR0FBekMsRUFBOEMsR0FBOUMsRUFBbUQ7QUFDakQsZ0JBQVUsV0FBVyxDQUFYLENBQVY7QUFDQSxhQUFPLFFBQVEsSUFBUixFQUFjLEdBQWQsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxJQUFQO0FBQ0QsR0FQRDs7QUFTQSxVQUFRLE1BQVIsR0FBa0IsVUFBUyxVQUFULEVBQXFCO0FBQ3JDLFdBQU8sTUFBUCxFQUFlLFVBQWY7O0FBRUEsYUFBUyxNQUFULENBQWdCLElBQWhCLEVBQXNCO0FBQ3BCLFdBQUssa0JBQUwsR0FBMEIsS0FBSyxLQUFLLGtCQUFWLEVBQThCLElBQTlCLENBQTFCO0FBQ0EsV0FBSyxXQUFMLEdBQW1CLEtBQUssS0FBSyxXQUFWLEVBQXVCLElBQXZCLENBQW5CO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxLQUFLLEtBQVYsRUFBaUIsSUFBakIsQ0FBYjtBQUNBLFdBQUssWUFBTCxHQUFvQixLQUFLLEtBQUssWUFBVixFQUF3QixJQUF4QixDQUFwQjtBQUNBLFdBQUssWUFBTCxHQUFvQixLQUFLLEtBQUssWUFBVixFQUF3QixJQUF4QixDQUFwQjtBQUNBLFVBQUksR0FBSixFQUFTLEdBQVQsRUFBYyxLQUFkO0FBQ0EsVUFBSSxFQUFFLGdCQUFnQixRQUFRLE1BQTFCLENBQUosRUFBdUM7QUFDckMsZUFBTyxJQUFJLFFBQVEsTUFBWixDQUFtQixJQUFuQixDQUFQO0FBQ0Q7QUFDRCxXQUFLLE9BQUwsR0FBZSxFQUFmO0FBQ0EsWUFBTSxTQUFTLEtBQVQsQ0FBTjtBQUNBLFdBQUssR0FBTCxJQUFZLEdBQVosRUFBaUI7QUFDZixZQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixHQUFsQixDQUFMLEVBQTZCO0FBQzdCLGdCQUFRLElBQUksR0FBSixDQUFSO0FBQ0EsYUFBSyxPQUFMLENBQWEsR0FBYixJQUFvQixLQUFwQjtBQUNEO0FBQ0QsV0FBSyxHQUFMLElBQVksSUFBWixFQUFrQjtBQUNoQixZQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixHQUFuQixDQUFMLEVBQThCO0FBQzlCLGdCQUFRLEtBQUssR0FBTCxDQUFSO0FBQ0EsYUFBSyxPQUFMLENBQWEsR0FBYixJQUFvQixLQUFwQjtBQUNEO0FBQ0QsVUFBSSxLQUFLLE9BQUwsQ0FBYSxLQUFqQixFQUF3QjtBQUN0QixhQUFLLE9BQUwsQ0FBYSxRQUFiLEdBQXdCLEtBQUssT0FBTCxDQUFhLE9BQWIsR0FBdUIsSUFBL0M7QUFDRDtBQUNELFVBQUksS0FBSyxPQUFMLENBQWEsYUFBakIsRUFBZ0M7QUFDOUIsWUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGlCQUFsQixFQUFxQztBQUNuQyxlQUFLLE9BQUwsQ0FBYSxpQkFBYixHQUFpQyxFQUFqQztBQUNEO0FBQ0QsYUFBSyxPQUFMLENBQWEsaUJBQWIsQ0FBK0IsT0FBL0IsQ0FBdUMsV0FBVyxTQUFsRDtBQUNEO0FBQ0QsV0FBSyxLQUFMO0FBQ0Q7O0FBRUQsV0FBTyxTQUFQLENBQWlCLFlBQWpCLEdBQWdDLFlBQVc7QUFDekMsVUFBSSxLQUFKLEVBQVcsR0FBWDtBQUNBLFVBQUk7QUFDRixZQUFJLEtBQUssU0FBTCxDQUFlLE1BQWYsSUFBeUIsS0FBSyxPQUFMLENBQWEsU0FBMUMsRUFBcUQ7QUFDbkQsa0JBQVEsS0FBSyxTQUFiO0FBQ0EsZUFBSyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0EsZUFBSyxTQUFMLEdBQWlCLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBcUIsS0FBckIsQ0FBakI7QUFDQSxpQkFBTyxLQUFLLFNBQUwsQ0FBZSxLQUFmLEVBQVA7QUFDRCxTQUxELE1BS087QUFDTCxrQkFBUSxLQUFLLFNBQUwsQ0FBZSxNQUFmLENBQXNCLENBQXRCLEVBQXlCLEtBQUssT0FBTCxDQUFhLFNBQXRDLENBQVI7QUFDQSxlQUFLLFNBQUwsR0FBaUIsS0FBSyxTQUFMLENBQWUsTUFBZixDQUFzQixLQUFLLE9BQUwsQ0FBYSxTQUFuQyxFQUE4QyxLQUFLLFNBQUwsQ0FBZSxNQUE3RCxDQUFqQjtBQUNBLGVBQUssU0FBTCxHQUFpQixLQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLEtBQXJCLENBQWpCO0FBQ0EsaUJBQU8sYUFBYSxLQUFLLFlBQWxCLENBQVA7QUFDRDtBQUNGLE9BWkQsQ0FZRSxPQUFPLE1BQVAsRUFBZTtBQUNmLGNBQU0sTUFBTjtBQUNBLFlBQUksQ0FBQyxLQUFLLFNBQUwsQ0FBZSxTQUFwQixFQUErQjtBQUM3QixlQUFLLFNBQUwsQ0FBZSxTQUFmLEdBQTJCLElBQTNCO0FBQ0EsaUJBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFQO0FBQ0Q7QUFDRjtBQUNGLEtBckJEOztBQXVCQSxXQUFPLFNBQVAsQ0FBaUIsWUFBakIsR0FBZ0MsVUFBUyxHQUFULEVBQWMsR0FBZCxFQUFtQixRQUFuQixFQUE2QjtBQUMzRCxVQUFJLEVBQUUsT0FBTyxHQUFULENBQUosRUFBbUI7QUFDakIsWUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGFBQWxCLEVBQWlDO0FBQy9CLGlCQUFPLElBQUksR0FBSixJQUFXLFFBQWxCO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsaUJBQU8sSUFBSSxHQUFKLElBQVcsQ0FBQyxRQUFELENBQWxCO0FBQ0Q7QUFDRixPQU5ELE1BTU87QUFDTCxZQUFJLEVBQUUsSUFBSSxHQUFKLGFBQW9CLEtBQXRCLENBQUosRUFBa0M7QUFDaEMsY0FBSSxHQUFKLElBQVcsQ0FBQyxJQUFJLEdBQUosQ0FBRCxDQUFYO0FBQ0Q7QUFDRCxlQUFPLElBQUksR0FBSixFQUFTLElBQVQsQ0FBYyxRQUFkLENBQVA7QUFDRDtBQUNGLEtBYkQ7O0FBZUEsV0FBTyxTQUFQLENBQWlCLEtBQWpCLEdBQXlCLFlBQVc7QUFDbEMsVUFBSSxPQUFKLEVBQWEsT0FBYixFQUFzQixNQUF0QixFQUE4QixLQUE5QjtBQUNBLFdBQUssa0JBQUw7QUFDQSxXQUFLLFNBQUwsR0FBaUIsSUFBSSxNQUFKLENBQVcsS0FBSyxPQUFMLENBQWEsTUFBeEIsRUFBZ0M7QUFDL0MsY0FBTSxLQUR5QztBQUUvQyxtQkFBVyxLQUZvQztBQUcvQyxlQUFPLEtBQUssT0FBTCxDQUFhO0FBSDJCLE9BQWhDLENBQWpCO0FBS0EsV0FBSyxTQUFMLENBQWUsU0FBZixHQUEyQixLQUEzQjtBQUNBLFdBQUssU0FBTCxDQUFlLE9BQWYsR0FBMEIsVUFBUyxLQUFULEVBQWdCO0FBQ3hDLGVBQU8sVUFBUyxLQUFULEVBQWdCO0FBQ3JCLGdCQUFNLFNBQU4sQ0FBZ0IsTUFBaEI7QUFDQSxjQUFJLENBQUMsTUFBTSxTQUFOLENBQWdCLFNBQXJCLEVBQWdDO0FBQzlCLGtCQUFNLFNBQU4sQ0FBZ0IsU0FBaEIsR0FBNEIsSUFBNUI7QUFDQSxtQkFBTyxNQUFNLElBQU4sQ0FBVyxPQUFYLEVBQW9CLEtBQXBCLENBQVA7QUFDRDtBQUNGLFNBTkQ7QUFPRCxPQVJ3QixDQVF0QixJQVJzQixDQUF6QjtBQVNBLFdBQUssU0FBTCxDQUFlLEtBQWYsR0FBd0IsVUFBUyxLQUFULEVBQWdCO0FBQ3RDLGVBQU8sWUFBVztBQUNoQixjQUFJLENBQUMsTUFBTSxTQUFOLENBQWdCLEtBQXJCLEVBQTRCO0FBQzFCLGtCQUFNLFNBQU4sQ0FBZ0IsS0FBaEIsR0FBd0IsSUFBeEI7QUFDQSxtQkFBTyxNQUFNLElBQU4sQ0FBVyxLQUFYLEVBQWtCLE1BQU0sWUFBeEIsQ0FBUDtBQUNEO0FBQ0YsU0FMRDtBQU1ELE9BUHNCLENBT3BCLElBUG9CLENBQXZCO0FBUUEsV0FBSyxTQUFMLENBQWUsS0FBZixHQUF1QixLQUF2QjtBQUNBLFdBQUssZ0JBQUwsR0FBd0IsS0FBSyxPQUFMLENBQWEsZUFBckM7QUFDQSxXQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxjQUFRLEVBQVI7QUFDQSxnQkFBVSxLQUFLLE9BQUwsQ0FBYSxPQUF2QjtBQUNBLGdCQUFVLEtBQUssT0FBTCxDQUFhLE9BQXZCO0FBQ0EsV0FBSyxTQUFMLENBQWUsU0FBZixHQUE0QixVQUFTLEtBQVQsRUFBZ0I7QUFDMUMsZUFBTyxVQUFTLElBQVQsRUFBZTtBQUNwQixjQUFJLEdBQUosRUFBUyxRQUFULEVBQW1CLEdBQW5CLEVBQXdCLFlBQXhCLEVBQXNDLEdBQXRDO0FBQ0EsZ0JBQU0sRUFBTjtBQUNBLGNBQUksT0FBSixJQUFlLEVBQWY7QUFDQSxjQUFJLENBQUMsTUFBTSxPQUFOLENBQWMsV0FBbkIsRUFBZ0M7QUFDOUIsa0JBQU0sS0FBSyxVQUFYO0FBQ0EsaUJBQUssR0FBTCxJQUFZLEdBQVosRUFBaUI7QUFDZixrQkFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBTCxFQUE2QjtBQUM3QixrQkFBSSxFQUFFLFdBQVcsR0FBYixLQUFxQixDQUFDLE1BQU0sT0FBTixDQUFjLFVBQXhDLEVBQW9EO0FBQ2xELG9CQUFJLE9BQUosSUFBZSxFQUFmO0FBQ0Q7QUFDRCx5QkFBVyxNQUFNLE9BQU4sQ0FBYyxtQkFBZCxHQUFvQyxZQUFZLE1BQU0sT0FBTixDQUFjLG1CQUExQixFQUErQyxLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBL0MsRUFBcUUsR0FBckUsQ0FBcEMsR0FBZ0gsS0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQTNIO0FBQ0EsNkJBQWUsTUFBTSxPQUFOLENBQWMsa0JBQWQsR0FBbUMsWUFBWSxNQUFNLE9BQU4sQ0FBYyxrQkFBMUIsRUFBOEMsR0FBOUMsQ0FBbkMsR0FBd0YsR0FBdkc7QUFDQSxrQkFBSSxNQUFNLE9BQU4sQ0FBYyxVQUFsQixFQUE4QjtBQUM1QixzQkFBTSxZQUFOLENBQW1CLEdBQW5CLEVBQXdCLFlBQXhCLEVBQXNDLFFBQXRDO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQUksT0FBSixFQUFhLFlBQWIsSUFBNkIsUUFBN0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxjQUFJLE9BQUosSUFBZSxNQUFNLE9BQU4sQ0FBYyxpQkFBZCxHQUFrQyxZQUFZLE1BQU0sT0FBTixDQUFjLGlCQUExQixFQUE2QyxLQUFLLElBQWxELENBQWxDLEdBQTRGLEtBQUssSUFBaEg7QUFDQSxjQUFJLE1BQU0sT0FBTixDQUFjLEtBQWxCLEVBQXlCO0FBQ3ZCLGdCQUFJLE1BQU0sT0FBTixDQUFjLFFBQWxCLElBQThCO0FBQzVCLG1CQUFLLEtBQUssR0FEa0I7QUFFNUIscUJBQU8sS0FBSztBQUZnQixhQUE5QjtBQUlEO0FBQ0QsaUJBQU8sTUFBTSxJQUFOLENBQVcsR0FBWCxDQUFQO0FBQ0QsU0E1QkQ7QUE2QkQsT0E5QjBCLENBOEJ4QixJQTlCd0IsQ0FBM0I7QUErQkEsV0FBSyxTQUFMLENBQWUsVUFBZixHQUE2QixVQUFTLEtBQVQsRUFBZ0I7QUFDM0MsZUFBTyxZQUFXO0FBQ2hCLGNBQUksS0FBSixFQUFXLFFBQVgsRUFBcUIsR0FBckIsRUFBMEIsSUFBMUIsRUFBZ0MsUUFBaEMsRUFBMEMsR0FBMUMsRUFBK0MsUUFBL0MsRUFBeUQsR0FBekQsRUFBOEQsQ0FBOUQsRUFBaUUsS0FBakU7QUFDQSxnQkFBTSxNQUFNLEdBQU4sRUFBTjtBQUNBLHFCQUFXLElBQUksT0FBSixDQUFYO0FBQ0EsY0FBSSxDQUFDLE1BQU0sT0FBTixDQUFjLGdCQUFmLElBQW1DLENBQUMsTUFBTSxPQUFOLENBQWMscUJBQXRELEVBQTZFO0FBQzNFLG1CQUFPLElBQUksT0FBSixDQUFQO0FBQ0Q7QUFDRCxjQUFJLElBQUksS0FBSixLQUFjLElBQWxCLEVBQXdCO0FBQ3RCLG9CQUFRLElBQUksS0FBWjtBQUNBLG1CQUFPLElBQUksS0FBWDtBQUNEO0FBQ0QsY0FBSSxNQUFNLE1BQU0sTUFBTixHQUFlLENBQXJCLENBQUo7QUFDQSxjQUFJLElBQUksT0FBSixFQUFhLEtBQWIsQ0FBbUIsT0FBbkIsS0FBK0IsQ0FBQyxLQUFwQyxFQUEyQztBQUN6Qyx1QkFBVyxJQUFJLE9BQUosQ0FBWDtBQUNBLG1CQUFPLElBQUksT0FBSixDQUFQO0FBQ0QsV0FIRCxNQUdPO0FBQ0wsZ0JBQUksTUFBTSxPQUFOLENBQWMsSUFBbEIsRUFBd0I7QUFDdEIsa0JBQUksT0FBSixJQUFlLElBQUksT0FBSixFQUFhLElBQWIsRUFBZjtBQUNEO0FBQ0QsZ0JBQUksTUFBTSxPQUFOLENBQWMsU0FBbEIsRUFBNkI7QUFDM0Isa0JBQUksT0FBSixJQUFlLElBQUksT0FBSixFQUFhLE9BQWIsQ0FBcUIsU0FBckIsRUFBZ0MsR0FBaEMsRUFBcUMsSUFBckMsRUFBZjtBQUNEO0FBQ0QsZ0JBQUksT0FBSixJQUFlLE1BQU0sT0FBTixDQUFjLGVBQWQsR0FBZ0MsWUFBWSxNQUFNLE9BQU4sQ0FBYyxlQUExQixFQUEyQyxJQUFJLE9BQUosQ0FBM0MsRUFBeUQsUUFBekQsQ0FBaEMsR0FBcUcsSUFBSSxPQUFKLENBQXBIO0FBQ0EsZ0JBQUksb0JBQVksR0FBWixFQUFpQixNQUFqQixLQUE0QixDQUE1QixJQUFpQyxXQUFXLEdBQTVDLElBQW1ELENBQUMsTUFBTSxnQkFBOUQsRUFBZ0Y7QUFDOUUsb0JBQU0sSUFBSSxPQUFKLENBQU47QUFDRDtBQUNGO0FBQ0QsY0FBSSxRQUFRLEdBQVIsQ0FBSixFQUFrQjtBQUNoQixrQkFBTSxNQUFNLE9BQU4sQ0FBYyxRQUFkLEtBQTJCLEVBQTNCLEdBQWdDLE1BQU0sT0FBTixDQUFjLFFBQTlDLEdBQXlELFFBQS9EO0FBQ0Q7QUFDRCxjQUFJLE1BQU0sT0FBTixDQUFjLFNBQWQsSUFBMkIsSUFBL0IsRUFBcUM7QUFDbkMsb0JBQVEsTUFBUSxZQUFXO0FBQ3pCLGtCQUFJLENBQUosRUFBTyxHQUFQLEVBQVksT0FBWjtBQUNBLHdCQUFVLEVBQVY7QUFDQSxtQkFBSyxJQUFJLENBQUosRUFBTyxNQUFNLE1BQU0sTUFBeEIsRUFBZ0MsSUFBSSxHQUFwQyxFQUF5QyxHQUF6QyxFQUE4QztBQUM1Qyx1QkFBTyxNQUFNLENBQU4sQ0FBUDtBQUNBLHdCQUFRLElBQVIsQ0FBYSxLQUFLLE9BQUwsQ0FBYjtBQUNEO0FBQ0QscUJBQU8sT0FBUDtBQUNELGFBUmMsRUFBRCxDQVFSLE1BUlEsQ0FRRCxRQVJDLEVBUVMsSUFSVCxDQVFjLEdBUmQsQ0FBZDtBQVNBLGFBQUMsWUFBVztBQUNWLGtCQUFJLEdBQUo7QUFDQSxrQkFBSTtBQUNGLHVCQUFPLE1BQU0sTUFBTSxPQUFOLENBQWMsU0FBZCxDQUF3QixLQUF4QixFQUErQixLQUFLLEVBQUUsUUFBRixDQUFwQyxFQUFpRCxHQUFqRCxDQUFiO0FBQ0QsZUFGRCxDQUVFLE9BQU8sTUFBUCxFQUFlO0FBQ2Ysc0JBQU0sTUFBTjtBQUNBLHVCQUFPLE1BQU0sSUFBTixDQUFXLE9BQVgsRUFBb0IsR0FBcEIsQ0FBUDtBQUNEO0FBQ0YsYUFSRDtBQVNEO0FBQ0QsY0FBSSxNQUFNLE9BQU4sQ0FBYyxnQkFBZCxJQUFrQyxDQUFDLE1BQU0sT0FBTixDQUFjLFVBQWpELElBQStELFFBQU8sR0FBUCx1REFBTyxHQUFQLE9BQWUsUUFBbEYsRUFBNEY7QUFDMUYsZ0JBQUksQ0FBQyxNQUFNLE9BQU4sQ0FBYyxxQkFBbkIsRUFBMEM7QUFDeEMscUJBQU8sRUFBUDtBQUNBLGtCQUFJLE1BQU0sT0FBTixDQUFjLE9BQWQsSUFBeUIsR0FBN0IsRUFBa0M7QUFDaEMscUJBQUssTUFBTSxPQUFOLENBQWMsT0FBbkIsSUFBOEIsSUFBSSxNQUFNLE9BQU4sQ0FBYyxPQUFsQixDQUE5QjtBQUNBLHVCQUFPLElBQUksTUFBTSxPQUFOLENBQWMsT0FBbEIsQ0FBUDtBQUNEO0FBQ0Qsa0JBQUksQ0FBQyxNQUFNLE9BQU4sQ0FBYyxlQUFmLElBQWtDLE1BQU0sT0FBTixDQUFjLE9BQWQsSUFBeUIsR0FBL0QsRUFBb0U7QUFDbEUscUJBQUssTUFBTSxPQUFOLENBQWMsT0FBbkIsSUFBOEIsSUFBSSxNQUFNLE9BQU4sQ0FBYyxPQUFsQixDQUE5QjtBQUNBLHVCQUFPLElBQUksTUFBTSxPQUFOLENBQWMsT0FBbEIsQ0FBUDtBQUNEO0FBQ0Qsa0JBQUksbUNBQTJCLEdBQTNCLEVBQWdDLE1BQWhDLEdBQXlDLENBQTdDLEVBQWdEO0FBQzlDLHFCQUFLLE1BQU0sT0FBTixDQUFjLFFBQW5CLElBQStCLEdBQS9CO0FBQ0Q7QUFDRCxvQkFBTSxJQUFOO0FBQ0QsYUFkRCxNQWNPLElBQUksQ0FBSixFQUFPO0FBQ1osZ0JBQUUsTUFBTSxPQUFOLENBQWMsUUFBaEIsSUFBNEIsRUFBRSxNQUFNLE9BQU4sQ0FBYyxRQUFoQixLQUE2QixFQUF6RDtBQUNBLHlCQUFXLEVBQVg7QUFDQSxtQkFBSyxHQUFMLElBQVksR0FBWixFQUFpQjtBQUNmLG9CQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixHQUFsQixDQUFMLEVBQTZCO0FBQzdCLHlCQUFTLEdBQVQsSUFBZ0IsSUFBSSxHQUFKLENBQWhCO0FBQ0Q7QUFDRCxnQkFBRSxNQUFNLE9BQU4sQ0FBYyxRQUFoQixFQUEwQixJQUExQixDQUErQixRQUEvQjtBQUNBLHFCQUFPLElBQUksT0FBSixDQUFQO0FBQ0Esa0JBQUksb0JBQVksR0FBWixFQUFpQixNQUFqQixLQUE0QixDQUE1QixJQUFpQyxXQUFXLEdBQTVDLElBQW1ELENBQUMsTUFBTSxnQkFBOUQsRUFBZ0Y7QUFDOUUsc0JBQU0sSUFBSSxPQUFKLENBQU47QUFDRDtBQUNGO0FBQ0Y7QUFDRCxjQUFJLE1BQU0sTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ3BCLG1CQUFPLE1BQU0sWUFBTixDQUFtQixDQUFuQixFQUFzQixRQUF0QixFQUFnQyxHQUFoQyxDQUFQO0FBQ0QsV0FGRCxNQUVPO0FBQ0wsZ0JBQUksTUFBTSxPQUFOLENBQWMsWUFBbEIsRUFBZ0M7QUFDOUIsb0JBQU0sR0FBTjtBQUNBLG9CQUFNLEVBQU47QUFDQSxrQkFBSSxRQUFKLElBQWdCLEdBQWhCO0FBQ0Q7QUFDRCxrQkFBTSxZQUFOLEdBQXFCLEdBQXJCO0FBQ0Esa0JBQU0sU0FBTixDQUFnQixLQUFoQixHQUF3QixJQUF4QjtBQUNBLG1CQUFPLE1BQU0sSUFBTixDQUFXLEtBQVgsRUFBa0IsTUFBTSxZQUF4QixDQUFQO0FBQ0Q7QUFDRixTQTNGRDtBQTRGRCxPQTdGMkIsQ0E2RnpCLElBN0Z5QixDQUE1QjtBQThGQSxlQUFVLFVBQVMsS0FBVCxFQUFnQjtBQUN4QixlQUFPLFVBQVMsSUFBVCxFQUFlO0FBQ3BCLGNBQUksU0FBSixFQUFlLENBQWY7QUFDQSxjQUFJLE1BQU0sTUFBTSxNQUFOLEdBQWUsQ0FBckIsQ0FBSjtBQUNBLGNBQUksQ0FBSixFQUFPO0FBQ0wsY0FBRSxPQUFGLEtBQWMsSUFBZDtBQUNBLGdCQUFJLE1BQU0sT0FBTixDQUFjLGdCQUFkLElBQWtDLE1BQU0sT0FBTixDQUFjLHFCQUFoRCxJQUF5RSxNQUFNLE9BQU4sQ0FBYyxlQUF2RixLQUEyRyxNQUFNLE9BQU4sQ0FBYyxpQkFBZCxJQUFtQyxLQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLEVBQXJCLEVBQXlCLElBQXpCLE9BQW9DLEVBQWxMLENBQUosRUFBMkw7QUFDekwsZ0JBQUUsTUFBTSxPQUFOLENBQWMsUUFBaEIsSUFBNEIsRUFBRSxNQUFNLE9BQU4sQ0FBYyxRQUFoQixLQUE2QixFQUF6RDtBQUNBLDBCQUFZO0FBQ1YseUJBQVM7QUFEQyxlQUFaO0FBR0Esd0JBQVUsT0FBVixJQUFxQixJQUFyQjtBQUNBLGtCQUFJLE1BQU0sT0FBTixDQUFjLFNBQWxCLEVBQTZCO0FBQzNCLDBCQUFVLE9BQVYsSUFBcUIsVUFBVSxPQUFWLEVBQW1CLE9BQW5CLENBQTJCLFNBQTNCLEVBQXNDLEdBQXRDLEVBQTJDLElBQTNDLEVBQXJCO0FBQ0Q7QUFDRCxnQkFBRSxNQUFNLE9BQU4sQ0FBYyxRQUFoQixFQUEwQixJQUExQixDQUErQixTQUEvQjtBQUNEO0FBQ0QsbUJBQU8sQ0FBUDtBQUNEO0FBQ0YsU0FsQkQ7QUFtQkQsT0FwQlEsQ0FvQk4sSUFwQk0sQ0FBVDtBQXFCQSxXQUFLLFNBQUwsQ0FBZSxNQUFmLEdBQXdCLE1BQXhCO0FBQ0EsYUFBTyxLQUFLLFNBQUwsQ0FBZSxPQUFmLEdBQTBCLFVBQVMsS0FBVCxFQUFnQjtBQUMvQyxlQUFPLFVBQVMsSUFBVCxFQUFlO0FBQ3BCLGNBQUksQ0FBSjtBQUNBLGNBQUksT0FBTyxJQUFQLENBQUo7QUFDQSxjQUFJLENBQUosRUFBTztBQUNMLG1CQUFPLEVBQUUsS0FBRixHQUFVLElBQWpCO0FBQ0Q7QUFDRixTQU5EO0FBT0QsT0FSK0IsQ0FRN0IsSUFSNkIsQ0FBaEM7QUFTRCxLQTVMRDs7QUE4TEEsV0FBTyxTQUFQLENBQWlCLFdBQWpCLEdBQStCLFVBQVMsR0FBVCxFQUFjLEVBQWQsRUFBa0I7QUFDL0MsVUFBSSxHQUFKO0FBQ0EsVUFBSyxNQUFNLElBQVAsSUFBZ0IsT0FBTyxFQUFQLEtBQWMsVUFBbEMsRUFBOEM7QUFDNUMsYUFBSyxFQUFMLENBQVEsS0FBUixFQUFlLFVBQVMsTUFBVCxFQUFpQjtBQUM5QixlQUFLLEtBQUw7QUFDQSxpQkFBTyxHQUFHLElBQUgsRUFBUyxNQUFULENBQVA7QUFDRCxTQUhEO0FBSUEsYUFBSyxFQUFMLENBQVEsT0FBUixFQUFpQixVQUFTLEdBQVQsRUFBYztBQUM3QixlQUFLLEtBQUw7QUFDQSxpQkFBTyxHQUFHLEdBQUgsQ0FBUDtBQUNELFNBSEQ7QUFJRDtBQUNELFVBQUk7QUFDRixjQUFNLElBQUksUUFBSixFQUFOO0FBQ0EsWUFBSSxJQUFJLElBQUosT0FBZSxFQUFuQixFQUF1QjtBQUNyQixlQUFLLElBQUwsQ0FBVSxLQUFWLEVBQWlCLElBQWpCO0FBQ0EsaUJBQU8sSUFBUDtBQUNEO0FBQ0QsY0FBTSxJQUFJLFFBQUosQ0FBYSxHQUFiLENBQU47QUFDQSxZQUFJLEtBQUssT0FBTCxDQUFhLEtBQWpCLEVBQXdCO0FBQ3RCLGVBQUssU0FBTCxHQUFpQixHQUFqQjtBQUNBLHVCQUFhLEtBQUssWUFBbEI7QUFDQSxpQkFBTyxLQUFLLFNBQVo7QUFDRDtBQUNELGVBQU8sS0FBSyxTQUFMLENBQWUsS0FBZixDQUFxQixHQUFyQixFQUEwQixLQUExQixFQUFQO0FBQ0QsT0FiRCxDQWFFLE9BQU8sTUFBUCxFQUFlO0FBQ2YsY0FBTSxNQUFOO0FBQ0EsWUFBSSxFQUFFLEtBQUssU0FBTCxDQUFlLFNBQWYsSUFBNEIsS0FBSyxTQUFMLENBQWUsS0FBN0MsQ0FBSixFQUF5RDtBQUN2RCxlQUFLLElBQUwsQ0FBVSxPQUFWLEVBQW1CLEdBQW5CO0FBQ0EsaUJBQU8sS0FBSyxTQUFMLENBQWUsU0FBZixHQUEyQixJQUFsQztBQUNELFNBSEQsTUFHTyxJQUFJLEtBQUssU0FBTCxDQUFlLEtBQW5CLEVBQTBCO0FBQy9CLGdCQUFNLEdBQU47QUFDRDtBQUNGO0FBQ0YsS0FsQ0Q7O0FBb0NBLFdBQU8sU0FBUCxDQUFpQixrQkFBakIsR0FBc0MsVUFBUyxHQUFULEVBQWM7QUFDbEQsYUFBTyxVQUFVLEtBQUssV0FBZixFQUE0QixHQUE1QixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLE1BQVA7QUFFRCxHQW5UZ0IsQ0FtVGQsTUFuVGMsQ0FBakI7O0FBcVRBLFVBQVEsV0FBUixHQUFzQixVQUFTLEdBQVQsRUFBYyxDQUFkLEVBQWlCLENBQWpCLEVBQW9CO0FBQ3hDLFFBQUksRUFBSixFQUFRLE9BQVIsRUFBaUIsTUFBakI7QUFDQSxRQUFJLEtBQUssSUFBVCxFQUFlO0FBQ2IsVUFBSSxPQUFPLENBQVAsS0FBYSxVQUFqQixFQUE2QjtBQUMzQixhQUFLLENBQUw7QUFDRDtBQUNELFVBQUksUUFBTyxDQUFQLHVEQUFPLENBQVAsT0FBYSxRQUFqQixFQUEyQjtBQUN6QixrQkFBVSxDQUFWO0FBQ0Q7QUFDRixLQVBELE1BT087QUFDTCxVQUFJLE9BQU8sQ0FBUCxLQUFhLFVBQWpCLEVBQTZCO0FBQzNCLGFBQUssQ0FBTDtBQUNEO0FBQ0QsZ0JBQVUsRUFBVjtBQUNEO0FBQ0QsYUFBUyxJQUFJLFFBQVEsTUFBWixDQUFtQixPQUFuQixDQUFUO0FBQ0EsV0FBTyxPQUFPLFdBQVAsQ0FBbUIsR0FBbkIsRUFBd0IsRUFBeEIsQ0FBUDtBQUNELEdBakJEOztBQW1CQSxVQUFRLGtCQUFSLEdBQTZCLFVBQVMsR0FBVCxFQUFjLENBQWQsRUFBaUI7QUFDNUMsUUFBSSxPQUFKLEVBQWEsTUFBYjtBQUNBLFFBQUksUUFBTyxDQUFQLHVEQUFPLENBQVAsT0FBYSxRQUFqQixFQUEyQjtBQUN6QixnQkFBVSxDQUFWO0FBQ0Q7QUFDRCxhQUFTLElBQUksUUFBUSxNQUFaLENBQW1CLE9BQW5CLENBQVQ7QUFDQSxXQUFPLE9BQU8sa0JBQVAsQ0FBMEIsR0FBMUIsQ0FBUDtBQUNELEdBUEQ7QUFTRCxDQW5YRCxFQW1YRyxJQW5YSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWOztBQUNBLE1BQUksV0FBSjs7QUFFQSxnQkFBYyxJQUFJLE1BQUosQ0FBVyxlQUFYLENBQWQ7O0FBRUEsVUFBUSxTQUFSLEdBQW9CLFVBQVMsR0FBVCxFQUFjO0FBQ2hDLFdBQU8sSUFBSSxXQUFKLEVBQVA7QUFDRCxHQUZEOztBQUlBLFVBQVEsa0JBQVIsR0FBNkIsVUFBUyxHQUFULEVBQWM7QUFDekMsV0FBTyxJQUFJLE1BQUosQ0FBVyxDQUFYLEVBQWMsV0FBZCxLQUE4QixJQUFJLEtBQUosQ0FBVSxDQUFWLENBQXJDO0FBQ0QsR0FGRDs7QUFJQSxVQUFRLFdBQVIsR0FBc0IsVUFBUyxHQUFULEVBQWM7QUFDbEMsV0FBTyxJQUFJLE9BQUosQ0FBWSxXQUFaLEVBQXlCLEVBQXpCLENBQVA7QUFDRCxHQUZEOztBQUlBLFVBQVEsWUFBUixHQUF1QixVQUFTLEdBQVQsRUFBYztBQUNuQyxRQUFJLENBQUMsTUFBTSxHQUFOLENBQUwsRUFBaUI7QUFDZixZQUFNLE1BQU0sQ0FBTixLQUFZLENBQVosR0FBZ0IsU0FBUyxHQUFULEVBQWMsRUFBZCxDQUFoQixHQUFvQyxXQUFXLEdBQVgsQ0FBMUM7QUFDRDtBQUNELFdBQU8sR0FBUDtBQUNELEdBTEQ7O0FBT0EsVUFBUSxhQUFSLEdBQXdCLFVBQVMsR0FBVCxFQUFjO0FBQ3BDLFFBQUksb0JBQW9CLElBQXBCLENBQXlCLEdBQXpCLENBQUosRUFBbUM7QUFDakMsWUFBTSxJQUFJLFdBQUosT0FBc0IsTUFBNUI7QUFDRDtBQUNELFdBQU8sR0FBUDtBQUNELEdBTEQ7QUFPRCxDQWhDRCxFQWdDRyxJQWhDSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWOztBQUNBLE1BQUksT0FBSjtBQUFBLE1BQWEsUUFBYjtBQUFBLE1BQXVCLE1BQXZCO0FBQUEsTUFBK0IsVUFBL0I7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxhQUFXLFFBQVEsWUFBUixDQUFYOztBQUVBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsV0FBUyxRQUFRLFVBQVIsQ0FBVDs7QUFFQSxlQUFhLFFBQVEsY0FBUixDQUFiOztBQUVBLFVBQVEsUUFBUixHQUFtQixTQUFTLFFBQTVCOztBQUVBLFVBQVEsVUFBUixHQUFxQixVQUFyQjs7QUFFQSxVQUFRLGVBQVIsR0FBMkIsVUFBUyxVQUFULEVBQXFCO0FBQzlDLFdBQU8sZUFBUCxFQUF3QixVQUF4Qjs7QUFFQSxhQUFTLGVBQVQsQ0FBeUIsT0FBekIsRUFBa0M7QUFDaEMsV0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELFdBQU8sZUFBUDtBQUVELEdBVHlCLENBU3ZCLEtBVHVCLENBQTFCOztBQVdBLFVBQVEsT0FBUixHQUFrQixRQUFRLE9BQTFCOztBQUVBLFVBQVEsTUFBUixHQUFpQixPQUFPLE1BQXhCOztBQUVBLFVBQVEsV0FBUixHQUFzQixPQUFPLFdBQTdCOztBQUVBLFVBQVEsa0JBQVIsR0FBNkIsT0FBTyxrQkFBcEM7QUFFRCxDQXJDRCxFQXFDRyxJQXJDSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLFNBQU8sT0FBUCxHQUFpQjtBQUNmLGtCQUFjLENBREM7QUFFZixlQUFXLENBRkk7QUFHZixlQUFXLENBSEk7QUFJZixjQUFVLENBSks7QUFLZixpQkFBYSxFQUxFO0FBTWYsNEJBQXdCO0FBTlQsR0FBakI7QUFTRCxDQVZELEVBVUcsSUFWSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLFNBQU8sT0FBUCxHQUFpQjtBQUNmLGFBQVMsQ0FETTtBQUVmLGVBQVcsQ0FGSTtBQUdmLFVBQU0sQ0FIUztBQUlmLFdBQU8sQ0FKUTtBQUtmLHFCQUFpQixDQUxGO0FBTWYsdUJBQW1CLENBTko7QUFPZiwyQkFBdUIsQ0FQUjtBQVFmLGFBQVMsQ0FSTTtBQVNmLGNBQVUsQ0FUSztBQVVmLGFBQVMsRUFWTTtBQVdmLHNCQUFrQixFQVhIO0FBWWYseUJBQXFCLEVBWk47QUFhZixpQkFBYSxHQWJFO0FBY2YsU0FBSyxHQWRVO0FBZWYsMEJBQXNCLEdBZlA7QUFnQmYsd0JBQW9CLEdBaEJMO0FBaUJmLFdBQU87QUFqQlEsR0FBakI7QUFvQkQsQ0FyQkQsRUFxQkcsSUFyQkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksTUFBSjtBQUFBLE1BQVksUUFBWjtBQUFBLE1BQXNCLE9BQXRCO0FBQUEsTUFBK0IsT0FBL0I7QUFBQSxNQUF3QyxVQUF4QztBQUFBLE1BQW9ELFFBQXBEO0FBQUEsTUFBOEQsYUFBOUQ7QUFBQSxNQUNFLFFBQVEsR0FBRyxLQURiO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxXQUFTLGtCQUFXO0FBQ2xCLFFBQUksQ0FBSixFQUFPLEdBQVAsRUFBWSxHQUFaLEVBQWlCLE1BQWpCLEVBQXlCLE9BQXpCLEVBQWtDLE1BQWxDO0FBQ0EsYUFBUyxVQUFVLENBQVYsQ0FBVCxFQUF1QixVQUFVLEtBQUssVUFBVSxNQUFmLEdBQXdCLE1BQU0sSUFBTixDQUFXLFNBQVgsRUFBc0IsQ0FBdEIsQ0FBeEIsR0FBbUQsRUFBcEY7QUFDQSxRQUFJLDRCQUFKLEVBQStCO0FBQzdCLHVCQUFjLEtBQWQsQ0FBb0IsSUFBcEIsRUFBMEIsU0FBMUI7QUFDRCxLQUZELE1BRU87QUFDTCxXQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sUUFBUSxNQUExQixFQUFrQyxJQUFJLEdBQXRDLEVBQTJDLEdBQTNDLEVBQWdEO0FBQzlDLGlCQUFTLFFBQVEsQ0FBUixDQUFUO0FBQ0EsWUFBSSxVQUFVLElBQWQsRUFBb0I7QUFDbEIsZUFBSyxHQUFMLElBQVksTUFBWixFQUFvQjtBQUNsQixnQkFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsR0FBckIsQ0FBTCxFQUFnQztBQUNoQyxtQkFBTyxHQUFQLElBQWMsT0FBTyxHQUFQLENBQWQ7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNELFdBQU8sTUFBUDtBQUNELEdBakJEOztBQW1CQSxlQUFhLG9CQUFTLEdBQVQsRUFBYztBQUN6QixXQUFPLENBQUMsQ0FBQyxHQUFGLElBQVMsT0FBTyxTQUFQLENBQWlCLFFBQWpCLENBQTBCLElBQTFCLENBQStCLEdBQS9CLE1BQXdDLG1CQUF4RDtBQUNELEdBRkQ7O0FBSUEsYUFBVyxrQkFBUyxHQUFULEVBQWM7QUFDdkIsUUFBSSxHQUFKO0FBQ0EsV0FBTyxDQUFDLENBQUMsR0FBRixLQUFVLENBQUMsYUFBYSxHQUFiLHVEQUFhLEdBQWIsQ0FBRCxNQUF1QixVQUF2QixJQUFxQyxRQUFRLFFBQXZELENBQVA7QUFDRCxHQUhEOztBQUtBLFlBQVUsaUJBQVMsR0FBVCxFQUFjO0FBQ3RCLFFBQUksV0FBVyxNQUFNLE9BQWpCLENBQUosRUFBK0I7QUFDN0IsYUFBTyxNQUFNLE9BQU4sQ0FBYyxHQUFkLENBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPLE9BQU8sU0FBUCxDQUFpQixRQUFqQixDQUEwQixJQUExQixDQUErQixHQUEvQixNQUF3QyxnQkFBL0M7QUFDRDtBQUNGLEdBTkQ7O0FBUUEsWUFBVSxpQkFBUyxHQUFULEVBQWM7QUFDdEIsUUFBSSxHQUFKO0FBQ0EsUUFBSSxRQUFRLEdBQVIsQ0FBSixFQUFrQjtBQUNoQixhQUFPLENBQUMsSUFBSSxNQUFaO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBSyxHQUFMLElBQVksR0FBWixFQUFpQjtBQUNmLFlBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxHQUFiLEVBQWtCLEdBQWxCLENBQUwsRUFBNkI7QUFDN0IsZUFBTyxLQUFQO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRDtBQUNGLEdBWEQ7O0FBYUEsa0JBQWdCLHVCQUFTLEdBQVQsRUFBYztBQUM1QixRQUFJLElBQUosRUFBVSxLQUFWO0FBQ0EsV0FBTyxTQUFTLEdBQVQsTUFBa0IsUUFBUSw4QkFBc0IsR0FBdEIsQ0FBMUIsTUFBMEQsT0FBTyxNQUFNLFdBQXZFLEtBQXdGLE9BQU8sSUFBUCxLQUFnQixVQUF4RyxJQUF3SCxnQkFBZ0IsSUFBeEksSUFBa0osU0FBUyxTQUFULENBQW1CLFFBQW5CLENBQTRCLElBQTVCLENBQWlDLElBQWpDLE1BQTJDLFNBQVMsU0FBVCxDQUFtQixRQUFuQixDQUE0QixJQUE1QixDQUFpQyxNQUFqQyxDQUFwTTtBQUNELEdBSEQ7O0FBS0EsYUFBVyxrQkFBUyxHQUFULEVBQWM7QUFDdkIsUUFBSSxXQUFXLElBQUksT0FBZixDQUFKLEVBQTZCO0FBQzNCLGFBQU8sSUFBSSxPQUFKLEVBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPLEdBQVA7QUFDRDtBQUNGLEdBTkQ7O0FBUUEsU0FBTyxPQUFQLENBQWUsTUFBZixHQUF3QixNQUF4Qjs7QUFFQSxTQUFPLE9BQVAsQ0FBZSxVQUFmLEdBQTRCLFVBQTVCOztBQUVBLFNBQU8sT0FBUCxDQUFlLFFBQWYsR0FBMEIsUUFBMUI7O0FBRUEsU0FBTyxPQUFQLENBQWUsT0FBZixHQUF5QixPQUF6Qjs7QUFFQSxTQUFPLE9BQVAsQ0FBZSxPQUFmLEdBQXlCLE9BQXpCOztBQUVBLFNBQU8sT0FBUCxDQUFlLGFBQWYsR0FBK0IsYUFBL0I7O0FBRUEsU0FBTyxPQUFQLENBQWUsUUFBZixHQUEwQixRQUExQjtBQUVELENBakZELEVBaUZHLElBakZIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsU0FBTyxPQUFQLEdBQWlCO0FBQ2YsVUFBTSxDQURTO0FBRWYsYUFBUyxDQUZNO0FBR2YsZUFBVyxDQUhJO0FBSWYsY0FBVTtBQUpLLEdBQWpCO0FBT0QsQ0FSRCxFQVFHLElBUkg7Ozs7Ozs7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLFFBQUosRUFBYyxZQUFkLEVBQTRCLE9BQTVCOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsWUFBVSxRQUFRLFdBQVIsQ0FBVjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsZUFBZ0IsWUFBVztBQUMxQyxhQUFTLFlBQVQsQ0FBc0IsTUFBdEIsRUFBOEIsSUFBOUIsRUFBb0MsS0FBcEMsRUFBMkM7QUFDekMsV0FBSyxNQUFMLEdBQWMsTUFBZDtBQUNBLFVBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2YsYUFBSyxPQUFMLEdBQWUsS0FBSyxNQUFMLENBQVksT0FBM0I7QUFDQSxhQUFLLFNBQUwsR0FBaUIsS0FBSyxNQUFMLENBQVksU0FBN0I7QUFDRDtBQUNELFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGNBQU0sSUFBSSxLQUFKLENBQVUsNkJBQTZCLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBdkMsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxJQUFMLEdBQVksS0FBSyxTQUFMLENBQWUsSUFBZixDQUFvQixJQUFwQixDQUFaO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxTQUFMLENBQWUsUUFBZixDQUF3QixLQUF4QixDQUFiO0FBQ0EsV0FBSyxJQUFMLEdBQVksU0FBUyxTQUFyQjtBQUNBLFdBQUssSUFBTCxHQUFZLEtBQVo7QUFDQSxXQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDRDs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsYUFBYSxTQUFuQyxFQUE4QyxVQUE5QyxFQUEwRDtBQUN4RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssSUFBWjtBQUNEO0FBSHVELEtBQTFEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLGNBQTlDLEVBQThEO0FBQzVELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxNQUFaO0FBQ0Q7QUFIMkQsS0FBOUQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLGFBQWEsU0FBbkMsRUFBOEMsYUFBOUMsRUFBNkQ7QUFDM0QsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQVo7QUFDRCxPQUgwRDtBQUkzRCxXQUFLLGFBQVMsS0FBVCxFQUFnQjtBQUNuQixlQUFPLEtBQUssS0FBTCxHQUFhLFNBQVMsRUFBN0I7QUFDRDtBQU4wRCxLQUE3RDs7QUFTQSxXQUFPLGNBQVAsQ0FBc0IsYUFBYSxTQUFuQyxFQUE4QyxjQUE5QyxFQUE4RDtBQUM1RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEVBQVA7QUFDRDtBQUgyRCxLQUE5RDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsYUFBYSxTQUFuQyxFQUE4QyxRQUE5QyxFQUF3RDtBQUN0RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEVBQVA7QUFDRDtBQUhxRCxLQUF4RDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsYUFBYSxTQUFuQyxFQUE4QyxXQUE5QyxFQUEyRDtBQUN6RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssSUFBWjtBQUNEO0FBSHdELEtBQTNEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLFdBQTlDLEVBQTJEO0FBQ3pELFdBQUssZUFBVztBQUNkLGVBQU8sSUFBUDtBQUNEO0FBSHdELEtBQTNEOztBQU1BLGlCQUFhLFNBQWIsQ0FBdUIsS0FBdkIsR0FBK0IsWUFBVztBQUN4QyxhQUFPLHNCQUFjLElBQWQsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsaUJBQWEsU0FBYixDQUF1QixRQUF2QixHQUFrQyxVQUFTLE9BQVQsRUFBa0I7QUFDbEQsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLFNBQXBCLENBQThCLElBQTlCLEVBQW9DLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBcEMsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsaUJBQWEsU0FBYixDQUF1QixTQUF2QixHQUFtQyxVQUFTLElBQVQsRUFBZTtBQUNoRCxhQUFPLFFBQVEsS0FBSyxJQUFwQjtBQUNBLFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGVBQU8sY0FBYyxLQUFLLE1BQUwsQ0FBWSxJQUExQixHQUFpQyxHQUF4QztBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8saUJBQWlCLElBQWpCLEdBQXdCLGNBQXhCLEdBQXlDLEtBQUssTUFBTCxDQUFZLElBQXJELEdBQTRELEdBQW5FO0FBQ0Q7QUFDRixLQVBEOztBQVNBLGlCQUFhLFNBQWIsQ0FBdUIsV0FBdkIsR0FBcUMsVUFBUyxJQUFULEVBQWU7QUFDbEQsVUFBSSxLQUFLLFlBQUwsS0FBc0IsS0FBSyxZQUEvQixFQUE2QztBQUMzQyxlQUFPLEtBQVA7QUFDRDtBQUNELFVBQUksS0FBSyxNQUFMLEtBQWdCLEtBQUssTUFBekIsRUFBaUM7QUFDL0IsZUFBTyxLQUFQO0FBQ0Q7QUFDRCxVQUFJLEtBQUssU0FBTCxLQUFtQixLQUFLLFNBQTVCLEVBQXVDO0FBQ3JDLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLEtBQUwsS0FBZSxLQUFLLEtBQXhCLEVBQStCO0FBQzdCLGVBQU8sS0FBUDtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0QsS0FkRDs7QUFnQkEsV0FBTyxZQUFQO0FBRUQsR0FqRytCLEVBQWhDO0FBbUdELENBMUdELEVBMEdHLElBMUdIOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxRQUFkO0FBQUEsTUFBd0IsZ0JBQXhCO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxxQkFBbUIsUUFBUSxvQkFBUixDQUFuQjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsV0FBWSxVQUFTLFVBQVQsRUFBcUI7QUFDaEQsV0FBTyxRQUFQLEVBQWlCLFVBQWpCOztBQUVBLGFBQVMsUUFBVCxDQUFrQixNQUFsQixFQUEwQixJQUExQixFQUFnQztBQUM5QixlQUFTLFNBQVQsQ0FBbUIsV0FBbkIsQ0FBK0IsSUFBL0IsQ0FBb0MsSUFBcEMsRUFBMEMsTUFBMUM7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixjQUFNLElBQUksS0FBSixDQUFVLHlCQUF5QixLQUFLLFNBQUwsRUFBbkMsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxJQUFMLEdBQVksZ0JBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLEtBQXJCO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxTQUFMLENBQWUsS0FBZixDQUFxQixJQUFyQixDQUFiO0FBQ0Q7O0FBRUQsYUFBUyxTQUFULENBQW1CLEtBQW5CLEdBQTJCLFlBQVc7QUFDcEMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLGFBQVMsU0FBVCxDQUFtQixRQUFuQixHQUE4QixVQUFTLE9BQVQsRUFBa0I7QUFDOUMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLEtBQXBCLENBQTBCLElBQTFCLEVBQWdDLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBaEMsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsV0FBTyxRQUFQO0FBRUQsR0F2QjJCLENBdUJ6QixnQkF2QnlCLENBQTVCO0FBeUJELENBbENELEVBa0NHLElBbENIOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxnQkFBSjtBQUFBLE1BQXNCLE9BQXRCO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsWUFBVSxRQUFRLFdBQVIsQ0FBVjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsbUJBQW9CLFVBQVMsVUFBVCxFQUFxQjtBQUN4RCxXQUFPLGdCQUFQLEVBQXlCLFVBQXpCOztBQUVBLGFBQVMsZ0JBQVQsQ0FBMEIsTUFBMUIsRUFBa0M7QUFDaEMsdUJBQWlCLFNBQWpCLENBQTJCLFdBQTNCLENBQXVDLElBQXZDLENBQTRDLElBQTVDLEVBQWtELE1BQWxEO0FBQ0EsV0FBSyxLQUFMLEdBQWEsRUFBYjtBQUNEOztBQUVELFdBQU8sY0FBUCxDQUFzQixpQkFBaUIsU0FBdkMsRUFBa0QsTUFBbEQsRUFBMEQ7QUFDeEQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQVo7QUFDRCxPQUh1RDtBQUl4RCxXQUFLLGFBQVMsS0FBVCxFQUFnQjtBQUNuQixlQUFPLEtBQUssS0FBTCxHQUFhLFNBQVMsRUFBN0I7QUFDRDtBQU51RCxLQUExRDs7QUFTQSxXQUFPLGNBQVAsQ0FBc0IsaUJBQWlCLFNBQXZDLEVBQWtELFFBQWxELEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxLQUFMLENBQVcsTUFBbEI7QUFDRDtBQUh5RCxLQUE1RDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsaUJBQWlCLFNBQXZDLEVBQWtELGFBQWxELEVBQWlFO0FBQy9ELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxLQUFaO0FBQ0QsT0FIOEQ7QUFJL0QsV0FBSyxhQUFTLEtBQVQsRUFBZ0I7QUFDbkIsZUFBTyxLQUFLLEtBQUwsR0FBYSxTQUFTLEVBQTdCO0FBQ0Q7QUFOOEQsS0FBakU7O0FBU0EscUJBQWlCLFNBQWpCLENBQTJCLEtBQTNCLEdBQW1DLFlBQVc7QUFDNUMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLHFCQUFpQixTQUFqQixDQUEyQixhQUEzQixHQUEyQyxVQUFTLE1BQVQsRUFBaUIsS0FBakIsRUFBd0I7QUFDakUsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLHFCQUFpQixTQUFqQixDQUEyQixVQUEzQixHQUF3QyxVQUFTLEdBQVQsRUFBYztBQUNwRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEscUJBQWlCLFNBQWpCLENBQTJCLFVBQTNCLEdBQXdDLFVBQVMsTUFBVCxFQUFpQixHQUFqQixFQUFzQjtBQUM1RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEscUJBQWlCLFNBQWpCLENBQTJCLFVBQTNCLEdBQXdDLFVBQVMsTUFBVCxFQUFpQixLQUFqQixFQUF3QjtBQUM5RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEscUJBQWlCLFNBQWpCLENBQTJCLFdBQTNCLEdBQXlDLFVBQVMsTUFBVCxFQUFpQixLQUFqQixFQUF3QixHQUF4QixFQUE2QjtBQUNwRSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEscUJBQWlCLFNBQWpCLENBQTJCLFdBQTNCLEdBQXlDLFVBQVMsSUFBVCxFQUFlO0FBQ3RELFVBQUksQ0FBQyxpQkFBaUIsU0FBakIsQ0FBMkIsV0FBM0IsQ0FBdUMsS0FBdkMsQ0FBNkMsSUFBN0MsRUFBbUQsU0FBbkQsRUFBOEQsV0FBOUQsQ0FBMEUsSUFBMUUsQ0FBTCxFQUFzRjtBQUNwRixlQUFPLEtBQVA7QUFDRDtBQUNELFVBQUksS0FBSyxJQUFMLEtBQWMsS0FBSyxJQUF2QixFQUE2QjtBQUMzQixlQUFPLEtBQVA7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNELEtBUkQ7O0FBVUEsV0FBTyxnQkFBUDtBQUVELEdBcEVtQyxDQW9FakMsT0FwRWlDLENBQXBDO0FBc0VELENBN0VELEVBNkVHLElBN0VIOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxnQkFBZDtBQUFBLE1BQWdDLFVBQWhDO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxxQkFBbUIsUUFBUSxvQkFBUixDQUFuQjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsYUFBYyxVQUFTLFVBQVQsRUFBcUI7QUFDbEQsV0FBTyxVQUFQLEVBQW1CLFVBQW5COztBQUVBLGFBQVMsVUFBVCxDQUFvQixNQUFwQixFQUE0QixJQUE1QixFQUFrQztBQUNoQyxpQkFBVyxTQUFYLENBQXFCLFdBQXJCLENBQWlDLElBQWpDLENBQXNDLElBQXRDLEVBQTRDLE1BQTVDO0FBQ0EsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsY0FBTSxJQUFJLEtBQUosQ0FBVSwyQkFBMkIsS0FBSyxTQUFMLEVBQXJDLENBQU47QUFDRDtBQUNELFdBQUssSUFBTCxHQUFZLFVBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLE9BQXJCO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxTQUFMLENBQWUsT0FBZixDQUF1QixJQUF2QixDQUFiO0FBQ0Q7O0FBRUQsZUFBVyxTQUFYLENBQXFCLEtBQXJCLEdBQTZCLFlBQVc7QUFDdEMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixRQUFyQixHQUFnQyxVQUFTLE9BQVQsRUFBa0I7QUFDaEQsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLE9BQXBCLENBQTRCLElBQTVCLEVBQWtDLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBbEMsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsV0FBTyxVQUFQO0FBRUQsR0F2QjZCLENBdUIzQixnQkF2QjJCLENBQTlCO0FBeUJELENBbENELEVBa0NHLElBbENIOzs7Ozs7Ozs7Ozs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksbUJBQUosRUFBeUIsa0JBQXpCLEVBQTZDLGdCQUE3Qzs7QUFFQSx1QkFBcUIsUUFBUSxzQkFBUixDQUFyQjs7QUFFQSxxQkFBbUIsUUFBUSxvQkFBUixDQUFuQjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsc0JBQXVCLFlBQVc7QUFDakQsYUFBUyxtQkFBVCxHQUErQjtBQUM3QixVQUFJLFVBQUo7QUFDQSxXQUFLLGFBQUwsR0FBcUI7QUFDbkIsMEJBQWtCLEtBREM7QUFFbkIsMEJBQWtCLEtBRkM7QUFHbkIsb0JBQVksS0FITztBQUluQixrQ0FBMEIsS0FKUDtBQUtuQixzQ0FBOEIsSUFMWDtBQU1uQixvQkFBWSxJQU5PO0FBT25CLHlCQUFpQixJQUFJLGtCQUFKLEVBUEU7QUFRbkIsbUJBQVcsSUFSUTtBQVNuQiw4QkFBc0IsS0FUSDtBQVVuQixzQkFBYyxJQVZLO0FBV25CLGtDQUEwQixJQVhQO0FBWW5CLGdDQUF3QixLQVpMO0FBYW5CLDJCQUFtQixFQWJBO0FBY25CLHVCQUFlLEVBZEk7QUFlbkIsZ0NBQXdCLElBZkw7QUFnQm5CLG9CQUFZLEtBaEJPO0FBaUJuQix1QkFBZTtBQWpCSSxPQUFyQjtBQW1CQSxXQUFLLE1BQUwsR0FBYyxhQUFhLHNCQUFjLEtBQUssYUFBbkIsQ0FBM0I7QUFDRDs7QUFFRCxXQUFPLGNBQVAsQ0FBc0Isb0JBQW9CLFNBQTFDLEVBQXFELGdCQUFyRCxFQUF1RTtBQUNyRSxXQUFLLGVBQVc7QUFDZCxlQUFPLElBQUksZ0JBQUosQ0FBcUIsb0JBQVksS0FBSyxhQUFqQixDQUFyQixDQUFQO0FBQ0Q7QUFIb0UsS0FBdkU7O0FBTUEsd0JBQW9CLFNBQXBCLENBQThCLFlBQTlCLEdBQTZDLFVBQVMsSUFBVCxFQUFlO0FBQzFELFVBQUksS0FBSyxNQUFMLENBQVksY0FBWixDQUEyQixJQUEzQixDQUFKLEVBQXNDO0FBQ3BDLGVBQU8sS0FBSyxNQUFMLENBQVksSUFBWixDQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxJQUFQO0FBQ0Q7QUFDRixLQU5EOztBQVFBLHdCQUFvQixTQUFwQixDQUE4QixlQUE5QixHQUFnRCxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ3BFLGFBQU8sSUFBUDtBQUNELEtBRkQ7O0FBSUEsd0JBQW9CLFNBQXBCLENBQThCLFlBQTlCLEdBQTZDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDakUsVUFBSSxTQUFTLElBQWIsRUFBbUI7QUFDakIsZUFBTyxLQUFLLE1BQUwsQ0FBWSxJQUFaLElBQW9CLEtBQTNCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxPQUFPLEtBQUssTUFBTCxDQUFZLElBQVosQ0FBZDtBQUNEO0FBQ0YsS0FORDs7QUFRQSxXQUFPLG1CQUFQO0FBRUQsR0FyRHNDLEVBQXZDO0FBdURELENBOURELEVBOERHLElBOURIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxrQkFBSjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIscUJBQXNCLFlBQVc7QUFDaEQsYUFBUyxrQkFBVCxHQUE4QixDQUFFOztBQUVoQyx1QkFBbUIsU0FBbkIsQ0FBNkIsV0FBN0IsR0FBMkMsVUFBUyxLQUFULEVBQWdCO0FBQ3pELFlBQU0sSUFBSSxLQUFKLENBQVUsS0FBVixDQUFOO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGtCQUFQO0FBRUQsR0FUcUMsRUFBdEM7QUFXRCxDQWRELEVBY0csSUFkSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksb0JBQUo7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLHVCQUF3QixZQUFXO0FBQ2xELGFBQVMsb0JBQVQsR0FBZ0MsQ0FBRTs7QUFFbEMseUJBQXFCLFNBQXJCLENBQStCLFVBQS9CLEdBQTRDLFVBQVMsT0FBVCxFQUFrQixPQUFsQixFQUEyQjtBQUNyRSxhQUFPLElBQVA7QUFDRCxLQUZEOztBQUlBLHlCQUFxQixTQUFyQixDQUErQixrQkFBL0IsR0FBb0QsVUFBUyxhQUFULEVBQXdCLFFBQXhCLEVBQWtDLFFBQWxDLEVBQTRDO0FBQzlGLFlBQU0sSUFBSSxLQUFKLENBQVUscUNBQVYsQ0FBTjtBQUNELEtBRkQ7O0FBSUEseUJBQXFCLFNBQXJCLENBQStCLGNBQS9CLEdBQWdELFVBQVMsWUFBVCxFQUF1QixhQUF2QixFQUFzQyxPQUF0QyxFQUErQztBQUM3RixZQUFNLElBQUksS0FBSixDQUFVLHFDQUFWLENBQU47QUFDRCxLQUZEOztBQUlBLHlCQUFxQixTQUFyQixDQUErQixrQkFBL0IsR0FBb0QsVUFBUyxLQUFULEVBQWdCO0FBQ2xFLFlBQU0sSUFBSSxLQUFKLENBQVUscUNBQVYsQ0FBTjtBQUNELEtBRkQ7O0FBSUEseUJBQXFCLFNBQXJCLENBQStCLFVBQS9CLEdBQTRDLFVBQVMsT0FBVCxFQUFrQixPQUFsQixFQUEyQjtBQUNyRSxZQUFNLElBQUksS0FBSixDQUFVLHFDQUFWLENBQU47QUFDRCxLQUZEOztBQUlBLFdBQU8sb0JBQVA7QUFFRCxHQXpCdUMsRUFBeEM7QUEyQkQsQ0E5QkQsRUE4QkcsSUE5Qkg7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLGdCQUFKOztBQUVBLFNBQU8sT0FBUCxHQUFpQixtQkFBb0IsWUFBVztBQUM5QyxhQUFTLGdCQUFULENBQTBCLEdBQTFCLEVBQStCO0FBQzdCLFdBQUssR0FBTCxHQUFXLE9BQU8sRUFBbEI7QUFDRDs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsaUJBQWlCLFNBQXZDLEVBQWtELFFBQWxELEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxHQUFMLENBQVMsTUFBaEI7QUFDRDtBQUh5RCxLQUE1RDs7QUFNQSxxQkFBaUIsU0FBakIsQ0FBMkIsSUFBM0IsR0FBa0MsVUFBUyxLQUFULEVBQWdCO0FBQ2hELGFBQU8sS0FBSyxHQUFMLENBQVMsS0FBVCxLQUFtQixJQUExQjtBQUNELEtBRkQ7O0FBSUEscUJBQWlCLFNBQWpCLENBQTJCLFFBQTNCLEdBQXNDLFVBQVMsR0FBVCxFQUFjO0FBQ2xELGFBQU8sS0FBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixHQUFqQixNQUEwQixDQUFDLENBQWxDO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGdCQUFQO0FBRUQsR0FyQm1DLEVBQXBDO0FBdUJELENBMUJELEVBMEJHLElBMUJIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxhQUFkO0FBQUEsTUFBNkIsT0FBN0I7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGdCQUFpQixVQUFTLFVBQVQsRUFBcUI7QUFDckQsV0FBTyxhQUFQLEVBQXNCLFVBQXRCOztBQUVBLGFBQVMsYUFBVCxDQUF1QixNQUF2QixFQUErQixXQUEvQixFQUE0QyxhQUE1QyxFQUEyRCxhQUEzRCxFQUEwRSxnQkFBMUUsRUFBNEYsWUFBNUYsRUFBMEc7QUFDeEcsb0JBQWMsU0FBZCxDQUF3QixXQUF4QixDQUFvQyxJQUFwQyxDQUF5QyxJQUF6QyxFQUErQyxNQUEvQztBQUNBLFVBQUksZUFBZSxJQUFuQixFQUF5QjtBQUN2QixjQUFNLElBQUksS0FBSixDQUFVLCtCQUErQixLQUFLLFNBQUwsRUFBekMsQ0FBTjtBQUNEO0FBQ0QsVUFBSSxpQkFBaUIsSUFBckIsRUFBMkI7QUFDekIsY0FBTSxJQUFJLEtBQUosQ0FBVSxpQ0FBaUMsS0FBSyxTQUFMLENBQWUsV0FBZixDQUEzQyxDQUFOO0FBQ0Q7QUFDRCxVQUFJLENBQUMsYUFBTCxFQUFvQjtBQUNsQixjQUFNLElBQUksS0FBSixDQUFVLGlDQUFpQyxLQUFLLFNBQUwsQ0FBZSxXQUFmLENBQTNDLENBQU47QUFDRDtBQUNELFVBQUksQ0FBQyxnQkFBTCxFQUF1QjtBQUNyQixjQUFNLElBQUksS0FBSixDQUFVLG9DQUFvQyxLQUFLLFNBQUwsQ0FBZSxXQUFmLENBQTlDLENBQU47QUFDRDtBQUNELFVBQUksaUJBQWlCLE9BQWpCLENBQXlCLEdBQXpCLE1BQWtDLENBQXRDLEVBQXlDO0FBQ3ZDLDJCQUFtQixNQUFNLGdCQUF6QjtBQUNEO0FBQ0QsVUFBSSxDQUFDLGlCQUFpQixLQUFqQixDQUF1Qix3Q0FBdkIsQ0FBTCxFQUF1RTtBQUNyRSxjQUFNLElBQUksS0FBSixDQUFVLG9GQUFvRixLQUFLLFNBQUwsQ0FBZSxXQUFmLENBQTlGLENBQU47QUFDRDtBQUNELFVBQUksZ0JBQWdCLENBQUMsaUJBQWlCLEtBQWpCLENBQXVCLHFCQUF2QixDQUFyQixFQUFvRTtBQUNsRSxjQUFNLElBQUksS0FBSixDQUFVLHVEQUF1RCxLQUFLLFNBQUwsQ0FBZSxXQUFmLENBQWpFLENBQU47QUFDRDtBQUNELFdBQUssV0FBTCxHQUFtQixLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLFdBQXBCLENBQW5CO0FBQ0EsV0FBSyxJQUFMLEdBQVksU0FBUyxvQkFBckI7QUFDQSxXQUFLLGFBQUwsR0FBcUIsS0FBSyxTQUFMLENBQWUsSUFBZixDQUFvQixhQUFwQixDQUFyQjtBQUNBLFdBQUssYUFBTCxHQUFxQixLQUFLLFNBQUwsQ0FBZSxVQUFmLENBQTBCLGFBQTFCLENBQXJCO0FBQ0EsVUFBSSxZQUFKLEVBQWtCO0FBQ2hCLGFBQUssWUFBTCxHQUFvQixLQUFLLFNBQUwsQ0FBZSxhQUFmLENBQTZCLFlBQTdCLENBQXBCO0FBQ0Q7QUFDRCxXQUFLLGdCQUFMLEdBQXdCLGdCQUF4QjtBQUNEOztBQUVELGtCQUFjLFNBQWQsQ0FBd0IsUUFBeEIsR0FBbUMsVUFBUyxPQUFULEVBQWtCO0FBQ25ELGFBQU8sS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixVQUFwQixDQUErQixJQUEvQixFQUFxQyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLGFBQXBCLENBQWtDLE9BQWxDLENBQXJDLENBQVA7QUFDRCxLQUZEOztBQUlBLFdBQU8sYUFBUDtBQUVELEdBMUNnQyxDQTBDOUIsT0ExQzhCLENBQWpDO0FBNENELENBckRELEVBcURHLElBckRIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxhQUFkO0FBQUEsTUFBNkIsT0FBN0I7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGdCQUFpQixVQUFTLFVBQVQsRUFBcUI7QUFDckQsV0FBTyxhQUFQLEVBQXNCLFVBQXRCOztBQUVBLGFBQVMsYUFBVCxDQUF1QixNQUF2QixFQUErQixJQUEvQixFQUFxQyxLQUFyQyxFQUE0QztBQUMxQyxvQkFBYyxTQUFkLENBQXdCLFdBQXhCLENBQW9DLElBQXBDLENBQXlDLElBQXpDLEVBQStDLE1BQS9DO0FBQ0EsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsY0FBTSxJQUFJLEtBQUosQ0FBVSwrQkFBK0IsS0FBSyxTQUFMLEVBQXpDLENBQU47QUFDRDtBQUNELFVBQUksQ0FBQyxLQUFMLEVBQVk7QUFDVixnQkFBUSxXQUFSO0FBQ0Q7QUFDRCxVQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUN4QixnQkFBUSxNQUFNLE1BQU0sSUFBTixDQUFXLEdBQVgsQ0FBTixHQUF3QixHQUFoQztBQUNEO0FBQ0QsV0FBSyxJQUFMLEdBQVksS0FBSyxTQUFMLENBQWUsSUFBZixDQUFvQixJQUFwQixDQUFaO0FBQ0EsV0FBSyxJQUFMLEdBQVksU0FBUyxrQkFBckI7QUFDQSxXQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxlQUFmLENBQStCLEtBQS9CLENBQWI7QUFDRDs7QUFFRCxrQkFBYyxTQUFkLENBQXdCLFFBQXhCLEdBQW1DLFVBQVMsT0FBVCxFQUFrQjtBQUNuRCxhQUFPLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsVUFBcEIsQ0FBK0IsSUFBL0IsRUFBcUMsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixhQUFwQixDQUFrQyxPQUFsQyxDQUFyQyxDQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGFBQVA7QUFFRCxHQXpCZ0MsQ0F5QjlCLE9BekI4QixDQUFqQztBQTJCRCxDQXBDRCxFQW9DRyxJQXBDSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksUUFBSjtBQUFBLE1BQWMsWUFBZDtBQUFBLE1BQTRCLE9BQTVCO0FBQUEsTUFBcUMsUUFBckM7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxhQUFXLFFBQVEsV0FBUixFQUFxQixRQUFoQzs7QUFFQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGVBQWdCLFVBQVMsVUFBVCxFQUFxQjtBQUNwRCxXQUFPLFlBQVAsRUFBcUIsVUFBckI7O0FBRUEsYUFBUyxZQUFULENBQXNCLE1BQXRCLEVBQThCLEVBQTlCLEVBQWtDLElBQWxDLEVBQXdDLEtBQXhDLEVBQStDO0FBQzdDLG1CQUFhLFNBQWIsQ0FBdUIsV0FBdkIsQ0FBbUMsSUFBbkMsQ0FBd0MsSUFBeEMsRUFBOEMsTUFBOUM7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixjQUFNLElBQUksS0FBSixDQUFVLDhCQUE4QixLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQXhDLENBQU47QUFDRDtBQUNELFVBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2pCLGNBQU0sSUFBSSxLQUFKLENBQVUsK0JBQStCLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBekMsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxFQUFMLEdBQVUsQ0FBQyxDQUFDLEVBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLElBQXBCLENBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLGlCQUFyQjtBQUNBLFVBQUksQ0FBQyxTQUFTLEtBQVQsQ0FBTCxFQUFzQjtBQUNwQixhQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxjQUFmLENBQThCLEtBQTlCLENBQWI7QUFDQSxhQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDRCxPQUhELE1BR087QUFDTCxZQUFJLENBQUMsTUFBTSxLQUFQLElBQWdCLENBQUMsTUFBTSxLQUEzQixFQUFrQztBQUNoQyxnQkFBTSxJQUFJLEtBQUosQ0FBVSwyRUFBMkUsS0FBSyxTQUFMLENBQWUsSUFBZixDQUFyRixDQUFOO0FBQ0Q7QUFDRCxZQUFJLE1BQU0sS0FBTixJQUFlLENBQUMsTUFBTSxLQUExQixFQUFpQztBQUMvQixnQkFBTSxJQUFJLEtBQUosQ0FBVSxpRUFBaUUsS0FBSyxTQUFMLENBQWUsSUFBZixDQUEzRSxDQUFOO0FBQ0Q7QUFDRCxhQUFLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxZQUFJLE1BQU0sS0FBTixJQUFlLElBQW5CLEVBQXlCO0FBQ3ZCLGVBQUssS0FBTCxHQUFhLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBd0IsTUFBTSxLQUE5QixDQUFiO0FBQ0Q7QUFDRCxZQUFJLE1BQU0sS0FBTixJQUFlLElBQW5CLEVBQXlCO0FBQ3ZCLGVBQUssS0FBTCxHQUFhLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBd0IsTUFBTSxLQUE5QixDQUFiO0FBQ0Q7QUFDRCxZQUFJLE1BQU0sS0FBTixJQUFlLElBQW5CLEVBQXlCO0FBQ3ZCLGVBQUssS0FBTCxHQUFhLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBd0IsTUFBTSxLQUE5QixDQUFiO0FBQ0Q7QUFDRCxZQUFJLEtBQUssRUFBTCxJQUFXLEtBQUssS0FBcEIsRUFBMkI7QUFDekIsZ0JBQU0sSUFBSSxLQUFKLENBQVUsZ0VBQWdFLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBMUUsQ0FBTjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsYUFBYSxTQUFuQyxFQUE4QyxVQUE5QyxFQUEwRDtBQUN4RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssS0FBWjtBQUNEO0FBSHVELEtBQTFEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLFVBQTlDLEVBQTBEO0FBQ3hELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxLQUFaO0FBQ0Q7QUFIdUQsS0FBMUQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLGFBQWEsU0FBbkMsRUFBOEMsY0FBOUMsRUFBOEQ7QUFDNUQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQUwsSUFBYyxJQUFyQjtBQUNEO0FBSDJELEtBQTlEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLGVBQTlDLEVBQStEO0FBQzdELFdBQUssZUFBVztBQUNkLGVBQU8sSUFBUDtBQUNEO0FBSDRELEtBQS9EOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLGFBQTlDLEVBQTZEO0FBQzNELFdBQUssZUFBVztBQUNkLGVBQU8sSUFBUDtBQUNEO0FBSDBELEtBQTdEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixhQUFhLFNBQW5DLEVBQThDLFlBQTlDLEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLGVBQU8sSUFBUDtBQUNEO0FBSHlELEtBQTVEOztBQU1BLGlCQUFhLFNBQWIsQ0FBdUIsUUFBdkIsR0FBa0MsVUFBUyxPQUFULEVBQWtCO0FBQ2xELGFBQU8sS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixTQUFwQixDQUE4QixJQUE5QixFQUFvQyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLGFBQXBCLENBQWtDLE9BQWxDLENBQXBDLENBQVA7QUFDRCxLQUZEOztBQUlBLFdBQU8sWUFBUDtBQUVELEdBbEYrQixDQWtGN0IsT0FsRjZCLENBQWhDO0FBb0ZELENBL0ZELEVBK0ZHLElBL0ZIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxjQUFkO0FBQUEsTUFBOEIsT0FBOUI7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGlCQUFrQixVQUFTLFVBQVQsRUFBcUI7QUFDdEQsV0FBTyxjQUFQLEVBQXVCLFVBQXZCOztBQUVBLGFBQVMsY0FBVCxDQUF3QixNQUF4QixFQUFnQyxJQUFoQyxFQUFzQyxLQUF0QyxFQUE2QztBQUMzQyxxQkFBZSxTQUFmLENBQXlCLFdBQXpCLENBQXFDLElBQXJDLENBQTBDLElBQTFDLEVBQWdELE1BQWhEO0FBQ0EsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsY0FBTSxJQUFJLEtBQUosQ0FBVSxnQ0FBZ0MsS0FBSyxTQUFMLENBQWUsSUFBZixDQUExQyxDQUFOO0FBQ0Q7QUFDRCxVQUFJLENBQUMsTUFBTSxLQUFQLElBQWdCLENBQUMsTUFBTSxLQUEzQixFQUFrQztBQUNoQyxjQUFNLElBQUksS0FBSixDQUFVLHVFQUF1RSxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQWpGLENBQU47QUFDRDtBQUNELFdBQUssSUFBTCxHQUFZLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBb0IsSUFBcEIsQ0FBWjtBQUNBLFdBQUssSUFBTCxHQUFZLFNBQVMsbUJBQXJCO0FBQ0EsVUFBSSxNQUFNLEtBQU4sSUFBZSxJQUFuQixFQUF5QjtBQUN2QixhQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxRQUFmLENBQXdCLE1BQU0sS0FBOUIsQ0FBYjtBQUNEO0FBQ0QsVUFBSSxNQUFNLEtBQU4sSUFBZSxJQUFuQixFQUF5QjtBQUN2QixhQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxRQUFmLENBQXdCLE1BQU0sS0FBOUIsQ0FBYjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxjQUFQLENBQXNCLGVBQWUsU0FBckMsRUFBZ0QsVUFBaEQsRUFBNEQ7QUFDMUQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQVo7QUFDRDtBQUh5RCxLQUE1RDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsZUFBZSxTQUFyQyxFQUFnRCxVQUFoRCxFQUE0RDtBQUMxRCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssS0FBWjtBQUNEO0FBSHlELEtBQTVEOztBQU1BLG1CQUFlLFNBQWYsQ0FBeUIsUUFBekIsR0FBb0MsVUFBUyxPQUFULEVBQWtCO0FBQ3BELGFBQU8sS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixXQUFwQixDQUFnQyxJQUFoQyxFQUFzQyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLGFBQXBCLENBQWtDLE9BQWxDLENBQXRDLENBQVA7QUFDRCxLQUZEOztBQUlBLFdBQU8sY0FBUDtBQUVELEdBdkNpQyxDQXVDL0IsT0F2QytCLENBQWxDO0FBeUNELENBbERELEVBa0RHLElBbERIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxjQUFkO0FBQUEsTUFBOEIsT0FBOUI7QUFBQSxNQUF1QyxRQUF2QztBQUFBLE1BQ0UsU0FBUyxTQUFULE1BQVMsQ0FBUyxLQUFULEVBQWdCLE1BQWhCLEVBQXdCO0FBQUUsU0FBSyxJQUFJLEdBQVQsSUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxVQUFJLFFBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsR0FBckIsQ0FBSixFQUErQixNQUFNLEdBQU4sSUFBYSxPQUFPLEdBQVAsQ0FBYjtBQUEyQixLQUFDLFNBQVMsSUFBVCxHQUFnQjtBQUFFLFdBQUssV0FBTCxHQUFtQixLQUFuQjtBQUEyQixLQUFDLEtBQUssU0FBTCxHQUFpQixPQUFPLFNBQXhCLENBQW1DLE1BQU0sU0FBTixHQUFrQixJQUFJLElBQUosRUFBbEIsQ0FBOEIsTUFBTSxTQUFOLEdBQWtCLE9BQU8sU0FBekIsQ0FBb0MsT0FBTyxLQUFQO0FBQWUsR0FENVI7QUFBQSxNQUVFLFVBQVUsR0FBRyxjQUZmOztBQUlBLGFBQVcsUUFBUSxXQUFSLEVBQXFCLFFBQWhDOztBQUVBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsaUJBQWtCLFVBQVMsVUFBVCxFQUFxQjtBQUN0RCxXQUFPLGNBQVAsRUFBdUIsVUFBdkI7O0FBRUEsYUFBUyxjQUFULENBQXdCLE1BQXhCLEVBQWdDLE9BQWhDLEVBQXlDLFFBQXpDLEVBQW1ELFVBQW5ELEVBQStEO0FBQzdELFVBQUksR0FBSjtBQUNBLHFCQUFlLFNBQWYsQ0FBeUIsV0FBekIsQ0FBcUMsSUFBckMsQ0FBMEMsSUFBMUMsRUFBZ0QsTUFBaEQ7QUFDQSxVQUFJLFNBQVMsT0FBVCxDQUFKLEVBQXVCO0FBQ3JCLGNBQU0sT0FBTixFQUFlLFVBQVUsSUFBSSxPQUE3QixFQUFzQyxXQUFXLElBQUksUUFBckQsRUFBK0QsYUFBYSxJQUFJLFVBQWhGO0FBQ0Q7QUFDRCxVQUFJLENBQUMsT0FBTCxFQUFjO0FBQ1osa0JBQVUsS0FBVjtBQUNEO0FBQ0QsV0FBSyxJQUFMLEdBQVksU0FBUyxXQUFyQjtBQUNBLFdBQUssT0FBTCxHQUFlLEtBQUssU0FBTCxDQUFlLFVBQWYsQ0FBMEIsT0FBMUIsQ0FBZjtBQUNBLFVBQUksWUFBWSxJQUFoQixFQUFzQjtBQUNwQixhQUFLLFFBQUwsR0FBZ0IsS0FBSyxTQUFMLENBQWUsV0FBZixDQUEyQixRQUEzQixDQUFoQjtBQUNEO0FBQ0QsVUFBSSxjQUFjLElBQWxCLEVBQXdCO0FBQ3RCLGFBQUssVUFBTCxHQUFrQixLQUFLLFNBQUwsQ0FBZSxhQUFmLENBQTZCLFVBQTdCLENBQWxCO0FBQ0Q7QUFDRjs7QUFFRCxtQkFBZSxTQUFmLENBQXlCLFFBQXpCLEdBQW9DLFVBQVMsT0FBVCxFQUFrQjtBQUNwRCxhQUFPLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsV0FBcEIsQ0FBZ0MsSUFBaEMsRUFBc0MsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixhQUFwQixDQUFrQyxPQUFsQyxDQUF0QyxDQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGNBQVA7QUFFRCxHQTVCaUMsQ0E0Qi9CLE9BNUIrQixDQUFsQztBQThCRCxDQXpDRCxFQXlDRyxJQXpDSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksUUFBSjtBQUFBLE1BQWMsYUFBZDtBQUFBLE1BQTZCLGFBQTdCO0FBQUEsTUFBNEMsWUFBNUM7QUFBQSxNQUEwRCxjQUExRDtBQUFBLE1BQTBFLFVBQTFFO0FBQUEsTUFBc0YsZUFBdEY7QUFBQSxNQUF1RyxPQUF2RztBQUFBLE1BQWdILFFBQWhIO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsYUFBVyxRQUFRLFdBQVIsRUFBcUIsUUFBaEM7O0FBRUEsWUFBVSxRQUFRLFdBQVIsQ0FBVjs7QUFFQSxhQUFXLFFBQVEsWUFBUixDQUFYOztBQUVBLGtCQUFnQixRQUFRLGlCQUFSLENBQWhCOztBQUVBLGlCQUFlLFFBQVEsZ0JBQVIsQ0FBZjs7QUFFQSxrQkFBZ0IsUUFBUSxpQkFBUixDQUFoQjs7QUFFQSxtQkFBaUIsUUFBUSxrQkFBUixDQUFqQjs7QUFFQSxvQkFBa0IsUUFBUSxtQkFBUixDQUFsQjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsYUFBYyxVQUFTLFVBQVQsRUFBcUI7QUFDbEQsV0FBTyxVQUFQLEVBQW1CLFVBQW5COztBQUVBLGFBQVMsVUFBVCxDQUFvQixNQUFwQixFQUE0QixLQUE1QixFQUFtQyxLQUFuQyxFQUEwQztBQUN4QyxVQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsR0FBZCxFQUFtQixHQUFuQixFQUF3QixJQUF4QixFQUE4QixJQUE5QjtBQUNBLGlCQUFXLFNBQVgsQ0FBcUIsV0FBckIsQ0FBaUMsSUFBakMsQ0FBc0MsSUFBdEMsRUFBNEMsTUFBNUM7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLE9BQXJCO0FBQ0EsVUFBSSxPQUFPLFFBQVgsRUFBcUI7QUFDbkIsY0FBTSxPQUFPLFFBQWI7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sSUFBSSxNQUF0QixFQUE4QixJQUFJLEdBQWxDLEVBQXVDLEdBQXZDLEVBQTRDO0FBQzFDLGtCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsY0FBSSxNQUFNLElBQU4sS0FBZSxTQUFTLE9BQTVCLEVBQXFDO0FBQ25DLGlCQUFLLElBQUwsR0FBWSxNQUFNLElBQWxCO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxXQUFLLGNBQUwsR0FBc0IsTUFBdEI7QUFDQSxVQUFJLFNBQVMsS0FBVCxDQUFKLEVBQXFCO0FBQ25CLGVBQU8sS0FBUCxFQUFjLFFBQVEsS0FBSyxLQUEzQixFQUFrQyxRQUFRLEtBQUssS0FBL0M7QUFDRDtBQUNELFVBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2pCLGVBQU8sQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFQLEVBQXVCLFFBQVEsS0FBSyxDQUFMLENBQS9CLEVBQXdDLFFBQVEsS0FBSyxDQUFMLENBQWhEO0FBQ0Q7QUFDRCxVQUFJLFNBQVMsSUFBYixFQUFtQjtBQUNqQixhQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxRQUFmLENBQXdCLEtBQXhCLENBQWI7QUFDRDtBQUNELFVBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2pCLGFBQUssS0FBTCxHQUFhLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBd0IsS0FBeEIsQ0FBYjtBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxjQUFQLENBQXNCLFdBQVcsU0FBakMsRUFBNEMsVUFBNUMsRUFBd0Q7QUFDdEQsV0FBSyxlQUFXO0FBQ2QsWUFBSSxLQUFKLEVBQVcsQ0FBWCxFQUFjLEdBQWQsRUFBbUIsS0FBbkIsRUFBMEIsR0FBMUI7QUFDQSxnQkFBUSxFQUFSO0FBQ0EsY0FBTSxLQUFLLFFBQVg7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sSUFBSSxNQUF0QixFQUE4QixJQUFJLEdBQWxDLEVBQXVDLEdBQXZDLEVBQTRDO0FBQzFDLGtCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsY0FBSyxNQUFNLElBQU4sS0FBZSxTQUFTLGlCQUF6QixJQUErQyxDQUFDLE1BQU0sRUFBMUQsRUFBOEQ7QUFDNUQsa0JBQU0sTUFBTSxJQUFaLElBQW9CLEtBQXBCO0FBQ0Q7QUFDRjtBQUNELGVBQU8sSUFBSSxlQUFKLENBQW9CLEtBQXBCLENBQVA7QUFDRDtBQVpxRCxLQUF4RDs7QUFlQSxXQUFPLGNBQVAsQ0FBc0IsV0FBVyxTQUFqQyxFQUE0QyxXQUE1QyxFQUF5RDtBQUN2RCxXQUFLLGVBQVc7QUFDZCxZQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsR0FBZCxFQUFtQixLQUFuQixFQUEwQixHQUExQjtBQUNBLGdCQUFRLEVBQVI7QUFDQSxjQUFNLEtBQUssUUFBWDtBQUNBLGFBQUssSUFBSSxDQUFKLEVBQU8sTUFBTSxJQUFJLE1BQXRCLEVBQThCLElBQUksR0FBbEMsRUFBdUMsR0FBdkMsRUFBNEM7QUFDMUMsa0JBQVEsSUFBSSxDQUFKLENBQVI7QUFDQSxjQUFJLE1BQU0sSUFBTixLQUFlLFNBQVMsbUJBQTVCLEVBQWlEO0FBQy9DLGtCQUFNLE1BQU0sSUFBWixJQUFvQixLQUFwQjtBQUNEO0FBQ0Y7QUFDRCxlQUFPLElBQUksZUFBSixDQUFvQixLQUFwQixDQUFQO0FBQ0Q7QUFac0QsS0FBekQ7O0FBZUEsV0FBTyxjQUFQLENBQXNCLFdBQVcsU0FBakMsRUFBNEMsVUFBNUMsRUFBd0Q7QUFDdEQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQVo7QUFDRDtBQUhxRCxLQUF4RDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsV0FBVyxTQUFqQyxFQUE0QyxVQUE1QyxFQUF3RDtBQUN0RCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssS0FBWjtBQUNEO0FBSHFELEtBQXhEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixXQUFXLFNBQWpDLEVBQTRDLGdCQUE1QyxFQUE4RDtBQUM1RCxXQUFLLGVBQVc7QUFDZCxjQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNEO0FBSDJELEtBQTlEOztBQU1BLGVBQVcsU0FBWCxDQUFxQixPQUFyQixHQUErQixVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ25ELFVBQUksS0FBSjtBQUNBLGNBQVEsSUFBSSxhQUFKLENBQWtCLElBQWxCLEVBQXdCLElBQXhCLEVBQThCLEtBQTlCLENBQVI7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLEtBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FMRDs7QUFPQSxlQUFXLFNBQVgsQ0FBcUIsT0FBckIsR0FBK0IsVUFBUyxXQUFULEVBQXNCLGFBQXRCLEVBQXFDLGFBQXJDLEVBQW9ELGdCQUFwRCxFQUFzRSxZQUF0RSxFQUFvRjtBQUNqSCxVQUFJLEtBQUo7QUFDQSxjQUFRLElBQUksYUFBSixDQUFrQixJQUFsQixFQUF3QixXQUF4QixFQUFxQyxhQUFyQyxFQUFvRCxhQUFwRCxFQUFtRSxnQkFBbkUsRUFBcUYsWUFBckYsQ0FBUjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsS0FBbkI7QUFDQSxhQUFPLElBQVA7QUFDRCxLQUxEOztBQU9BLGVBQVcsU0FBWCxDQUFxQixNQUFyQixHQUE4QixVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ2xELFVBQUksS0FBSjtBQUNBLGNBQVEsSUFBSSxZQUFKLENBQWlCLElBQWpCLEVBQXVCLEtBQXZCLEVBQThCLElBQTlCLEVBQW9DLEtBQXBDLENBQVI7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLEtBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FMRDs7QUFPQSxlQUFXLFNBQVgsQ0FBcUIsT0FBckIsR0FBK0IsVUFBUyxJQUFULEVBQWUsS0FBZixFQUFzQjtBQUNuRCxVQUFJLEtBQUo7QUFDQSxjQUFRLElBQUksWUFBSixDQUFpQixJQUFqQixFQUF1QixJQUF2QixFQUE2QixJQUE3QixFQUFtQyxLQUFuQyxDQUFSO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixLQUFuQjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBTEQ7O0FBT0EsZUFBVyxTQUFYLENBQXFCLFFBQXJCLEdBQWdDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDcEQsVUFBSSxLQUFKO0FBQ0EsY0FBUSxJQUFJLGNBQUosQ0FBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsS0FBL0IsQ0FBUjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsS0FBbkI7QUFDQSxhQUFPLElBQVA7QUFDRCxLQUxEOztBQU9BLGVBQVcsU0FBWCxDQUFxQixRQUFyQixHQUFnQyxVQUFTLE9BQVQsRUFBa0I7QUFDaEQsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLE9BQXBCLENBQTRCLElBQTVCLEVBQWtDLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBbEMsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLEdBQXJCLEdBQTJCLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDL0MsYUFBTyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLEtBQW5CLENBQVA7QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixHQUFyQixHQUEyQixVQUFTLFdBQVQsRUFBc0IsYUFBdEIsRUFBcUMsYUFBckMsRUFBb0QsZ0JBQXBELEVBQXNFLFlBQXRFLEVBQW9GO0FBQzdHLGFBQU8sS0FBSyxPQUFMLENBQWEsV0FBYixFQUEwQixhQUExQixFQUF5QyxhQUF6QyxFQUF3RCxnQkFBeEQsRUFBMEUsWUFBMUUsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLEdBQXJCLEdBQTJCLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDL0MsYUFBTyxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLEtBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixJQUFyQixHQUE0QixVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ2hELGFBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixLQUFuQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsR0FBckIsR0FBMkIsVUFBUyxJQUFULEVBQWUsS0FBZixFQUFzQjtBQUMvQyxhQUFPLEtBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsS0FBcEIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLEVBQXJCLEdBQTBCLFlBQVc7QUFDbkMsYUFBTyxLQUFLLElBQUwsTUFBZSxLQUFLLGNBQTNCO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsV0FBckIsR0FBbUMsVUFBUyxJQUFULEVBQWU7QUFDaEQsVUFBSSxDQUFDLFdBQVcsU0FBWCxDQUFxQixXQUFyQixDQUFpQyxLQUFqQyxDQUF1QyxJQUF2QyxFQUE2QyxTQUE3QyxFQUF3RCxXQUF4RCxDQUFvRSxJQUFwRSxDQUFMLEVBQWdGO0FBQzlFLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLElBQUwsS0FBYyxLQUFLLElBQXZCLEVBQTZCO0FBQzNCLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLFFBQUwsS0FBa0IsS0FBSyxRQUEzQixFQUFxQztBQUNuQyxlQUFPLEtBQVA7QUFDRDtBQUNELFVBQUksS0FBSyxRQUFMLEtBQWtCLEtBQUssUUFBM0IsRUFBcUM7QUFDbkMsZUFBTyxLQUFQO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRCxLQWREOztBQWdCQSxXQUFPLFVBQVA7QUFFRCxHQWpLNkIsQ0FpSzNCLE9BaksyQixDQUE5QjtBQW1LRCxDQXhMRCxFQXdMRyxJQXhMSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksUUFBSjtBQUFBLE1BQWMsbUJBQWQ7QUFBQSxNQUFtQyxvQkFBbkM7QUFBQSxNQUF5RCxXQUF6RDtBQUFBLE1BQXNFLE9BQXRFO0FBQUEsTUFBK0UsZUFBL0U7QUFBQSxNQUFnRyxjQUFoRztBQUFBLE1BQWdILGFBQWhIO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsa0JBQWdCLFFBQVEsV0FBUixFQUFxQixhQUFyQzs7QUFFQSx5QkFBdUIsUUFBUSx3QkFBUixDQUF2Qjs7QUFFQSx3QkFBc0IsUUFBUSx1QkFBUixDQUF0Qjs7QUFFQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsbUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7O0FBRUEsb0JBQWtCLFFBQVEsbUJBQVIsQ0FBbEI7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGNBQWUsVUFBUyxVQUFULEVBQXFCO0FBQ25ELFdBQU8sV0FBUCxFQUFvQixVQUFwQjs7QUFFQSxhQUFTLFdBQVQsQ0FBcUIsT0FBckIsRUFBOEI7QUFDNUIsa0JBQVksU0FBWixDQUFzQixXQUF0QixDQUFrQyxJQUFsQyxDQUF1QyxJQUF2QyxFQUE2QyxJQUE3QztBQUNBLFdBQUssSUFBTCxHQUFZLFdBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLFFBQXJCO0FBQ0EsV0FBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsV0FBSyxTQUFMLEdBQWlCLElBQUksbUJBQUosRUFBakI7QUFDQSxrQkFBWSxVQUFVLEVBQXRCO0FBQ0EsVUFBSSxDQUFDLFFBQVEsTUFBYixFQUFxQjtBQUNuQixnQkFBUSxNQUFSLEdBQWlCLElBQUksZUFBSixFQUFqQjtBQUNEO0FBQ0QsV0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLFdBQUssU0FBTCxHQUFpQixJQUFJLGNBQUosQ0FBbUIsT0FBbkIsQ0FBakI7QUFDRDs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsWUFBWSxTQUFsQyxFQUE2QyxnQkFBN0MsRUFBK0Q7QUFDN0QsYUFBTyxJQUFJLG9CQUFKO0FBRHNELEtBQS9EOztBQUlBLFdBQU8sY0FBUCxDQUFzQixZQUFZLFNBQWxDLEVBQTZDLFNBQTdDLEVBQXdEO0FBQ3RELFdBQUssZUFBVztBQUNkLFlBQUksS0FBSixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLEdBQW5CO0FBQ0EsY0FBTSxLQUFLLFFBQVg7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sSUFBSSxNQUF0QixFQUE4QixJQUFJLEdBQWxDLEVBQXVDLEdBQXZDLEVBQTRDO0FBQzFDLGtCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsY0FBSSxNQUFNLElBQU4sS0FBZSxTQUFTLE9BQTVCLEVBQXFDO0FBQ25DLG1CQUFPLEtBQVA7QUFDRDtBQUNGO0FBQ0QsZUFBTyxJQUFQO0FBQ0Q7QUFYcUQsS0FBeEQ7O0FBY0EsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsaUJBQTdDLEVBQWdFO0FBQzlELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxVQUFMLElBQW1CLElBQTFCO0FBQ0Q7QUFINkQsS0FBaEU7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsZUFBN0MsRUFBOEQ7QUFDNUQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxJQUFQO0FBQ0Q7QUFIMkQsS0FBOUQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMscUJBQTdDLEVBQW9FO0FBQ2xFLFdBQUssZUFBVztBQUNkLGVBQU8sS0FBUDtBQUNEO0FBSGlFLEtBQXBFOztBQU1BLFdBQU8sY0FBUCxDQUFzQixZQUFZLFNBQWxDLEVBQTZDLGFBQTdDLEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLFlBQUksS0FBSyxRQUFMLENBQWMsTUFBZCxLQUF5QixDQUF6QixJQUE4QixLQUFLLFFBQUwsQ0FBYyxDQUFkLEVBQWlCLElBQWpCLEtBQTBCLFNBQVMsV0FBckUsRUFBa0Y7QUFDaEYsaUJBQU8sS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQixRQUF4QjtBQUNELFNBRkQsTUFFTztBQUNMLGlCQUFPLElBQVA7QUFDRDtBQUNGO0FBUHlELEtBQTVEOztBQVVBLFdBQU8sY0FBUCxDQUFzQixZQUFZLFNBQWxDLEVBQTZDLGVBQTdDLEVBQThEO0FBQzVELFdBQUssZUFBVztBQUNkLFlBQUksS0FBSyxRQUFMLENBQWMsTUFBZCxLQUF5QixDQUF6QixJQUE4QixLQUFLLFFBQUwsQ0FBYyxDQUFkLEVBQWlCLElBQWpCLEtBQTBCLFNBQVMsV0FBckUsRUFBa0Y7QUFDaEYsaUJBQU8sS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQixVQUFqQixLQUFnQyxLQUF2QztBQUNELFNBRkQsTUFFTztBQUNMLGlCQUFPLEtBQVA7QUFDRDtBQUNGO0FBUDJELEtBQTlEOztBQVVBLFdBQU8sY0FBUCxDQUFzQixZQUFZLFNBQWxDLEVBQTZDLFlBQTdDLEVBQTJEO0FBQ3pELFdBQUssZUFBVztBQUNkLFlBQUksS0FBSyxRQUFMLENBQWMsTUFBZCxLQUF5QixDQUF6QixJQUE4QixLQUFLLFFBQUwsQ0FBYyxDQUFkLEVBQWlCLElBQWpCLEtBQTBCLFNBQVMsV0FBckUsRUFBa0Y7QUFDaEYsaUJBQU8sS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQixPQUF4QjtBQUNELFNBRkQsTUFFTztBQUNMLGlCQUFPLEtBQVA7QUFDRDtBQUNGO0FBUHdELEtBQTNEOztBQVVBLFdBQU8sY0FBUCxDQUFzQixZQUFZLFNBQWxDLEVBQTZDLEtBQTdDLEVBQW9EO0FBQ2xELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxXQUFaO0FBQ0Q7QUFIaUQsS0FBcEQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsUUFBN0MsRUFBdUQ7QUFDckQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxJQUFQO0FBQ0Q7QUFIb0QsS0FBdkQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsWUFBN0MsRUFBMkQ7QUFDekQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxJQUFQO0FBQ0Q7QUFId0QsS0FBM0Q7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsY0FBN0MsRUFBNkQ7QUFDM0QsV0FBSyxlQUFXO0FBQ2QsZUFBTyxJQUFQO0FBQ0Q7QUFIMEQsS0FBN0Q7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsYUFBN0MsRUFBNEQ7QUFDMUQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxJQUFQO0FBQ0Q7QUFIeUQsS0FBNUQ7O0FBTUEsZ0JBQVksU0FBWixDQUFzQixHQUF0QixHQUE0QixVQUFTLE1BQVQsRUFBaUI7QUFDM0MsVUFBSSxhQUFKO0FBQ0Esc0JBQWdCLEVBQWhCO0FBQ0EsVUFBSSxDQUFDLE1BQUwsRUFBYTtBQUNYLGlCQUFTLEtBQUssT0FBTCxDQUFhLE1BQXRCO0FBQ0QsT0FGRCxNQUVPLElBQUksY0FBYyxNQUFkLENBQUosRUFBMkI7QUFDaEMsd0JBQWdCLE1BQWhCO0FBQ0EsaUJBQVMsS0FBSyxPQUFMLENBQWEsTUFBdEI7QUFDRDtBQUNELGFBQU8sT0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLE9BQU8sYUFBUCxDQUFxQixhQUFyQixDQUF0QixDQUFQO0FBQ0QsS0FWRDs7QUFZQSxnQkFBWSxTQUFaLENBQXNCLFFBQXRCLEdBQWlDLFVBQVMsT0FBVCxFQUFrQjtBQUNqRCxhQUFPLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsUUFBcEIsQ0FBNkIsSUFBN0IsRUFBbUMsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixhQUFwQixDQUFrQyxPQUFsQyxDQUFuQyxDQUFQO0FBQ0QsS0FGRDs7QUFJQSxnQkFBWSxTQUFaLENBQXNCLGFBQXRCLEdBQXNDLFVBQVMsT0FBVCxFQUFrQjtBQUN0RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixzQkFBdEIsR0FBK0MsWUFBVztBQUN4RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixjQUF0QixHQUF1QyxVQUFTLElBQVQsRUFBZTtBQUNwRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixhQUF0QixHQUFzQyxVQUFTLElBQVQsRUFBZTtBQUNuRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixrQkFBdEIsR0FBMkMsVUFBUyxJQUFULEVBQWU7QUFDeEQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0IsMkJBQXRCLEdBQW9ELFVBQVMsTUFBVCxFQUFpQixJQUFqQixFQUF1QjtBQUN6RSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixlQUF0QixHQUF3QyxVQUFTLElBQVQsRUFBZTtBQUNyRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixxQkFBdEIsR0FBOEMsVUFBUyxJQUFULEVBQWU7QUFDM0QsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0Isb0JBQXRCLEdBQTZDLFVBQVMsT0FBVCxFQUFrQjtBQUM3RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixVQUF0QixHQUFtQyxVQUFTLFlBQVQsRUFBdUIsSUFBdkIsRUFBNkI7QUFDOUQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0IsZUFBdEIsR0FBd0MsVUFBUyxZQUFULEVBQXVCLGFBQXZCLEVBQXNDO0FBQzVFLFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxnQkFBWSxTQUFaLENBQXNCLGlCQUF0QixHQUEwQyxVQUFTLFlBQVQsRUFBdUIsYUFBdkIsRUFBc0M7QUFDOUUsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0Isc0JBQXRCLEdBQStDLFVBQVMsWUFBVCxFQUF1QixTQUF2QixFQUFrQztBQUMvRSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixjQUF0QixHQUF1QyxVQUFTLFNBQVQsRUFBb0I7QUFDekQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0IsU0FBdEIsR0FBa0MsVUFBUyxNQUFULEVBQWlCO0FBQ2pELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxnQkFBWSxTQUFaLENBQXNCLGlCQUF0QixHQUEwQyxZQUFXO0FBQ25ELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxnQkFBWSxTQUFaLENBQXNCLFVBQXRCLEdBQW1DLFVBQVMsSUFBVCxFQUFlLFlBQWYsRUFBNkIsYUFBN0IsRUFBNEM7QUFDN0UsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0Isc0JBQXRCLEdBQStDLFVBQVMsVUFBVCxFQUFxQjtBQUNsRSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixXQUF0QixHQUFvQyxVQUFTLGNBQVQsRUFBeUI7QUFDM0QsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0IsV0FBdEIsR0FBb0MsWUFBVztBQUM3QyxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixrQkFBdEIsR0FBMkMsVUFBUyxJQUFULEVBQWUsVUFBZixFQUEyQixNQUEzQixFQUFtQztBQUM1RSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZ0JBQVksU0FBWixDQUFzQixnQkFBdEIsR0FBeUMsVUFBUyxJQUFULEVBQWUsVUFBZixFQUEyQixNQUEzQixFQUFtQztBQUMxRSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsV0FBTyxXQUFQO0FBRUQsR0EzTjhCLENBMk41QixPQTNONEIsQ0FBL0I7QUE2TkQsQ0FoUEQsRUFnUEcsSUFoUEg7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLFFBQUo7QUFBQSxNQUFjLFdBQWQ7QUFBQSxNQUEyQixZQUEzQjtBQUFBLE1BQXlDLFFBQXpDO0FBQUEsTUFBbUQsVUFBbkQ7QUFBQSxNQUErRCxhQUEvRDtBQUFBLE1BQThFLGFBQTlFO0FBQUEsTUFBNkYsWUFBN0Y7QUFBQSxNQUEyRyxjQUEzRztBQUFBLE1BQTJILGNBQTNIO0FBQUEsTUFBMkksVUFBM0k7QUFBQSxNQUF1SixXQUF2SjtBQUFBLE1BQW9LLGFBQXBLO0FBQUEsTUFBbUwsVUFBbkw7QUFBQSxNQUErTCx3QkFBL0w7QUFBQSxNQUF5TixNQUF6TjtBQUFBLE1BQWlPLGVBQWpPO0FBQUEsTUFBa1AsY0FBbFA7QUFBQSxNQUFrUSxPQUFsUTtBQUFBLE1BQTJRLFFBQTNRO0FBQUEsTUFBcVIsVUFBclI7QUFBQSxNQUFpUyxRQUFqUztBQUFBLE1BQTJTLGFBQTNTO0FBQUEsTUFBMFQsR0FBMVQ7QUFBQSxNQUNFLFVBQVUsR0FBRyxjQURmOztBQUdBLFFBQU0sUUFBUSxXQUFSLENBQU4sRUFBNEIsV0FBVyxJQUFJLFFBQTNDLEVBQXFELGFBQWEsSUFBSSxVQUF0RSxFQUFrRixnQkFBZ0IsSUFBSSxhQUF0RyxFQUFxSCxXQUFXLElBQUksUUFBcEk7O0FBRUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxnQkFBYyxRQUFRLGVBQVIsQ0FBZDs7QUFFQSxlQUFhLFFBQVEsY0FBUixDQUFiOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsZUFBYSxRQUFRLGNBQVIsQ0FBYjs7QUFFQSxXQUFTLFFBQVEsVUFBUixDQUFUOztBQUVBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsNkJBQTJCLFFBQVEsNEJBQVIsQ0FBM0I7O0FBRUEsbUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7O0FBRUEsZUFBYSxRQUFRLGNBQVIsQ0FBYjs7QUFFQSxrQkFBZ0IsUUFBUSxpQkFBUixDQUFoQjs7QUFFQSxpQkFBZSxRQUFRLGdCQUFSLENBQWY7O0FBRUEsa0JBQWdCLFFBQVEsaUJBQVIsQ0FBaEI7O0FBRUEsbUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7O0FBRUEsaUJBQWUsUUFBUSxnQkFBUixDQUFmOztBQUVBLG1CQUFpQixRQUFRLGtCQUFSLENBQWpCOztBQUVBLG9CQUFrQixRQUFRLG1CQUFSLENBQWxCOztBQUVBLGdCQUFjLFFBQVEsZUFBUixDQUFkOztBQUVBLFNBQU8sT0FBUCxHQUFpQixnQkFBaUIsWUFBVztBQUMzQyxhQUFTLGFBQVQsQ0FBdUIsT0FBdkIsRUFBZ0MsTUFBaEMsRUFBd0MsS0FBeEMsRUFBK0M7QUFDN0MsVUFBSSxhQUFKO0FBQ0EsV0FBSyxJQUFMLEdBQVksTUFBWjtBQUNBLFdBQUssSUFBTCxHQUFZLFNBQVMsUUFBckI7QUFDQSxrQkFBWSxVQUFVLEVBQXRCO0FBQ0Esc0JBQWdCLEVBQWhCO0FBQ0EsVUFBSSxDQUFDLFFBQVEsTUFBYixFQUFxQjtBQUNuQixnQkFBUSxNQUFSLEdBQWlCLElBQUksZUFBSixFQUFqQjtBQUNELE9BRkQsTUFFTyxJQUFJLGNBQWMsUUFBUSxNQUF0QixDQUFKLEVBQW1DO0FBQ3hDLHdCQUFnQixRQUFRLE1BQXhCO0FBQ0EsZ0JBQVEsTUFBUixHQUFpQixJQUFJLGVBQUosRUFBakI7QUFDRDtBQUNELFdBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxXQUFLLE1BQUwsR0FBYyxRQUFRLE1BQXRCO0FBQ0EsV0FBSyxhQUFMLEdBQXFCLEtBQUssTUFBTCxDQUFZLGFBQVosQ0FBMEIsYUFBMUIsQ0FBckI7QUFDQSxXQUFLLFNBQUwsR0FBaUIsSUFBSSxjQUFKLENBQW1CLE9BQW5CLENBQWpCO0FBQ0EsV0FBSyxjQUFMLEdBQXNCLFVBQVUsWUFBVyxDQUFFLENBQTdDO0FBQ0EsV0FBSyxhQUFMLEdBQXFCLFNBQVMsWUFBVyxDQUFFLENBQTNDO0FBQ0EsV0FBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsV0FBSyxZQUFMLEdBQW9CLENBQUMsQ0FBckI7QUFDQSxXQUFLLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxXQUFLLGVBQUwsR0FBdUIsS0FBdkI7QUFDQSxXQUFLLGlCQUFMLEdBQXlCLEtBQXpCO0FBQ0EsV0FBSyxJQUFMLEdBQVksSUFBWjtBQUNEOztBQUVELGtCQUFjLFNBQWQsQ0FBd0IsZUFBeEIsR0FBMEMsVUFBUyxJQUFULEVBQWU7QUFDdkQsVUFBSSxHQUFKLEVBQVMsT0FBVCxFQUFrQixVQUFsQixFQUE4QixLQUE5QixFQUFxQyxDQUFyQyxFQUF3QyxHQUF4QyxFQUE2QyxJQUE3QyxFQUFtRCxJQUFuRDtBQUNBLGNBQVEsS0FBSyxJQUFiO0FBQ0UsYUFBSyxTQUFTLEtBQWQ7QUFDRSxlQUFLLEtBQUwsQ0FBVyxLQUFLLEtBQWhCO0FBQ0E7QUFDRixhQUFLLFNBQVMsT0FBZDtBQUNFLGVBQUssT0FBTCxDQUFhLEtBQUssS0FBbEI7QUFDQTtBQUNGLGFBQUssU0FBUyxPQUFkO0FBQ0UsdUJBQWEsRUFBYjtBQUNBLGlCQUFPLEtBQUssT0FBWjtBQUNBLGVBQUssT0FBTCxJQUFnQixJQUFoQixFQUFzQjtBQUNwQixnQkFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLElBQWIsRUFBbUIsT0FBbkIsQ0FBTCxFQUFrQztBQUNsQyxrQkFBTSxLQUFLLE9BQUwsQ0FBTjtBQUNBLHVCQUFXLE9BQVgsSUFBc0IsSUFBSSxLQUExQjtBQUNEO0FBQ0QsZUFBSyxJQUFMLENBQVUsS0FBSyxJQUFmLEVBQXFCLFVBQXJCO0FBQ0E7QUFDRixhQUFLLFNBQVMsS0FBZDtBQUNFLGVBQUssS0FBTDtBQUNBO0FBQ0YsYUFBSyxTQUFTLEdBQWQ7QUFDRSxlQUFLLEdBQUwsQ0FBUyxLQUFLLEtBQWQ7QUFDQTtBQUNGLGFBQUssU0FBUyxJQUFkO0FBQ0UsZUFBSyxJQUFMLENBQVUsS0FBSyxLQUFmO0FBQ0E7QUFDRixhQUFLLFNBQVMscUJBQWQ7QUFDRSxlQUFLLFdBQUwsQ0FBaUIsS0FBSyxNQUF0QixFQUE4QixLQUFLLEtBQW5DO0FBQ0E7QUFDRjtBQUNFLGdCQUFNLElBQUksS0FBSixDQUFVLHlEQUF5RCxLQUFLLFdBQUwsQ0FBaUIsSUFBcEYsQ0FBTjtBQTlCSjtBQWdDQSxhQUFPLEtBQUssUUFBWjtBQUNBLFdBQUssSUFBSSxDQUFKLEVBQU8sTUFBTSxLQUFLLE1BQXZCLEVBQStCLElBQUksR0FBbkMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDM0MsZ0JBQVEsS0FBSyxDQUFMLENBQVI7QUFDQSxhQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSxZQUFJLE1BQU0sSUFBTixLQUFlLFNBQVMsT0FBNUIsRUFBcUM7QUFDbkMsZUFBSyxFQUFMO0FBQ0Q7QUFDRjtBQUNELGFBQU8sSUFBUDtBQUNELEtBM0NEOztBQTZDQSxrQkFBYyxTQUFkLENBQXdCLEtBQXhCLEdBQWdDLFlBQVc7QUFDekMsYUFBTyxJQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLElBQXhCLEdBQStCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDOUQsVUFBSSxJQUFKO0FBQ0EsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsY0FBTSxJQUFJLEtBQUosQ0FBVSxvQkFBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJLEtBQUssSUFBTCxJQUFhLEtBQUssWUFBTCxLQUFzQixDQUFDLENBQXhDLEVBQTJDO0FBQ3pDLGNBQU0sSUFBSSxLQUFKLENBQVUsMkNBQTJDLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBckQsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxXQUFMO0FBQ0EsYUFBTyxTQUFTLElBQVQsQ0FBUDtBQUNBLFVBQUksY0FBYyxJQUFsQixFQUF3QjtBQUN0QixxQkFBYSxFQUFiO0FBQ0Q7QUFDRCxtQkFBYSxTQUFTLFVBQVQsQ0FBYjtBQUNBLFVBQUksQ0FBQyxTQUFTLFVBQVQsQ0FBTCxFQUEyQjtBQUN6QixlQUFPLENBQUMsVUFBRCxFQUFhLElBQWIsQ0FBUCxFQUEyQixPQUFPLEtBQUssQ0FBTCxDQUFsQyxFQUEyQyxhQUFhLEtBQUssQ0FBTCxDQUF4RDtBQUNEO0FBQ0QsV0FBSyxXQUFMLEdBQW1CLElBQUksVUFBSixDQUFlLElBQWYsRUFBcUIsSUFBckIsRUFBMkIsVUFBM0IsQ0FBbkI7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsUUFBakIsR0FBNEIsS0FBNUI7QUFDQSxXQUFLLFlBQUw7QUFDQSxXQUFLLFFBQUwsQ0FBYyxLQUFLLFlBQW5CLElBQW1DLEtBQUssV0FBeEM7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixhQUFLLElBQUwsQ0FBVSxJQUFWO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRCxLQXpCRDs7QUEyQkEsa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLElBQTNCLEVBQWlDO0FBQ2pFLFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLGlCQUFuQixFQUFzQyxJQUF0QyxFQUE0QyxJQUE1QztBQUNBLFVBQUksS0FBSyxXQUFMLElBQW9CLEtBQUssV0FBTCxDQUFpQixJQUFqQixLQUEwQixTQUFTLE9BQTNELEVBQW9FO0FBQ2xFLGFBQUssVUFBTCxDQUFnQixLQUFoQixDQUFzQixJQUF0QixFQUE0QixTQUE1QjtBQUNELE9BRkQsTUFFTztBQUNMLFlBQUksTUFBTSxPQUFOLENBQWMsSUFBZCxLQUF1QixTQUFTLElBQVQsQ0FBdkIsSUFBeUMsV0FBVyxJQUFYLENBQTdDLEVBQStEO0FBQzdELDhCQUFvQixLQUFLLE9BQUwsQ0FBYSxZQUFqQztBQUNBLGVBQUssT0FBTCxDQUFhLFlBQWIsR0FBNEIsSUFBNUI7QUFDQSxpQkFBTyxJQUFJLFdBQUosQ0FBZ0IsS0FBSyxPQUFyQixFQUE4QixPQUE5QixDQUFzQyxXQUF0QyxDQUFQO0FBQ0EsZUFBSyxPQUFMLENBQWEsSUFBYjtBQUNBLGVBQUssT0FBTCxDQUFhLFlBQWIsR0FBNEIsaUJBQTVCO0FBQ0EsaUJBQU8sS0FBSyxRQUFaO0FBQ0EsZUFBSyxJQUFJLENBQUosRUFBTyxNQUFNLEtBQUssTUFBdkIsRUFBK0IsSUFBSSxHQUFuQyxFQUF3QyxHQUF4QyxFQUE2QztBQUMzQyxvQkFBUSxLQUFLLENBQUwsQ0FBUjtBQUNBLGlCQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSxnQkFBSSxNQUFNLElBQU4sS0FBZSxTQUFTLE9BQTVCLEVBQXFDO0FBQ25DLG1CQUFLLEVBQUw7QUFDRDtBQUNGO0FBQ0YsU0FkRCxNQWNPO0FBQ0wsZUFBSyxJQUFMLENBQVUsSUFBVixFQUFnQixVQUFoQixFQUE0QixJQUE1QjtBQUNEO0FBQ0Y7QUFDRCxhQUFPLElBQVA7QUFDRCxLQXhCRDs7QUEwQkEsa0JBQWMsU0FBZCxDQUF3QixTQUF4QixHQUFvQyxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ3hELFVBQUksT0FBSixFQUFhLFFBQWI7QUFDQSxVQUFJLENBQUMsS0FBSyxXQUFOLElBQXFCLEtBQUssV0FBTCxDQUFpQixRQUExQyxFQUFvRDtBQUNsRCxjQUFNLElBQUksS0FBSixDQUFVLDhFQUE4RSxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQXhGLENBQU47QUFDRDtBQUNELFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGVBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNELFVBQUksU0FBUyxJQUFULENBQUosRUFBb0I7QUFDbEIsYUFBSyxPQUFMLElBQWdCLElBQWhCLEVBQXNCO0FBQ3BCLGNBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLENBQUwsRUFBa0M7QUFDbEMscUJBQVcsS0FBSyxPQUFMLENBQVg7QUFDQSxlQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFFBQXhCO0FBQ0Q7QUFDRixPQU5ELE1BTU87QUFDTCxZQUFJLFdBQVcsS0FBWCxDQUFKLEVBQXVCO0FBQ3JCLGtCQUFRLE1BQU0sS0FBTixFQUFSO0FBQ0Q7QUFDRCxZQUFJLEtBQUssT0FBTCxDQUFhLGtCQUFiLElBQW9DLFNBQVMsSUFBakQsRUFBd0Q7QUFDdEQsZUFBSyxXQUFMLENBQWlCLE9BQWpCLENBQXlCLElBQXpCLElBQWlDLElBQUksWUFBSixDQUFpQixJQUFqQixFQUF1QixJQUF2QixFQUE2QixFQUE3QixDQUFqQztBQUNELFNBRkQsTUFFTyxJQUFJLFNBQVMsSUFBYixFQUFtQjtBQUN4QixlQUFLLFdBQUwsQ0FBaUIsT0FBakIsQ0FBeUIsSUFBekIsSUFBaUMsSUFBSSxZQUFKLENBQWlCLElBQWpCLEVBQXVCLElBQXZCLEVBQTZCLEtBQTdCLENBQWpDO0FBQ0Q7QUFDRjtBQUNELGFBQU8sSUFBUDtBQUNELEtBekJEOztBQTJCQSxrQkFBYyxTQUFkLENBQXdCLElBQXhCLEdBQStCLFVBQVMsS0FBVCxFQUFnQjtBQUM3QyxVQUFJLElBQUo7QUFDQSxXQUFLLFdBQUw7QUFDQSxhQUFPLElBQUksT0FBSixDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FBUDtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLElBQVosQ0FBaUIsSUFBakIsRUFBdUIsS0FBSyxhQUE1QixFQUEyQyxLQUFLLFlBQUwsR0FBb0IsQ0FBL0QsQ0FBWixFQUErRSxLQUFLLFlBQUwsR0FBb0IsQ0FBbkc7QUFDQSxhQUFPLElBQVA7QUFDRCxLQU5EOztBQVFBLGtCQUFjLFNBQWQsQ0FBd0IsS0FBeEIsR0FBZ0MsVUFBUyxLQUFULEVBQWdCO0FBQzlDLFVBQUksSUFBSjtBQUNBLFdBQUssV0FBTDtBQUNBLGFBQU8sSUFBSSxRQUFKLENBQWEsSUFBYixFQUFtQixLQUFuQixDQUFQO0FBQ0EsV0FBSyxNQUFMLENBQVksS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixJQUFsQixFQUF3QixLQUFLLGFBQTdCLEVBQTRDLEtBQUssWUFBTCxHQUFvQixDQUFoRSxDQUFaLEVBQWdGLEtBQUssWUFBTCxHQUFvQixDQUFwRztBQUNBLGFBQU8sSUFBUDtBQUNELEtBTkQ7O0FBUUEsa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQsVUFBSSxJQUFKO0FBQ0EsV0FBSyxXQUFMO0FBQ0EsYUFBTyxJQUFJLFVBQUosQ0FBZSxJQUFmLEVBQXFCLEtBQXJCLENBQVA7QUFDQSxXQUFLLE1BQUwsQ0FBWSxLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLElBQXBCLEVBQTBCLEtBQUssYUFBL0IsRUFBOEMsS0FBSyxZQUFMLEdBQW9CLENBQWxFLENBQVosRUFBa0YsS0FBSyxZQUFMLEdBQW9CLENBQXRHO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLEdBQXhCLEdBQThCLFVBQVMsS0FBVCxFQUFnQjtBQUM1QyxVQUFJLElBQUo7QUFDQSxXQUFLLFdBQUw7QUFDQSxhQUFPLElBQUksTUFBSixDQUFXLElBQVgsRUFBaUIsS0FBakIsQ0FBUDtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLEdBQVosQ0FBZ0IsSUFBaEIsRUFBc0IsS0FBSyxhQUEzQixFQUEwQyxLQUFLLFlBQUwsR0FBb0IsQ0FBOUQsQ0FBWixFQUE4RSxLQUFLLFlBQUwsR0FBb0IsQ0FBbEc7QUFDQSxhQUFPLElBQVA7QUFDRCxLQU5EOztBQVFBLGtCQUFjLFNBQWQsQ0FBd0IsV0FBeEIsR0FBc0MsVUFBUyxNQUFULEVBQWlCLEtBQWpCLEVBQXdCO0FBQzVELFVBQUksQ0FBSixFQUFPLFNBQVAsRUFBa0IsUUFBbEIsRUFBNEIsR0FBNUIsRUFBaUMsSUFBakM7QUFDQSxXQUFLLFdBQUw7QUFDQSxVQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUNsQixpQkFBUyxTQUFTLE1BQVQsQ0FBVDtBQUNEO0FBQ0QsVUFBSSxTQUFTLElBQWIsRUFBbUI7QUFDakIsZ0JBQVEsU0FBUyxLQUFULENBQVI7QUFDRDtBQUNELFVBQUksTUFBTSxPQUFOLENBQWMsTUFBZCxDQUFKLEVBQTJCO0FBQ3pCLGFBQUssSUFBSSxDQUFKLEVBQU8sTUFBTSxPQUFPLE1BQXpCLEVBQWlDLElBQUksR0FBckMsRUFBMEMsR0FBMUMsRUFBK0M7QUFDN0Msc0JBQVksT0FBTyxDQUFQLENBQVo7QUFDQSxlQUFLLFdBQUwsQ0FBaUIsU0FBakI7QUFDRDtBQUNGLE9BTEQsTUFLTyxJQUFJLFNBQVMsTUFBVCxDQUFKLEVBQXNCO0FBQzNCLGFBQUssU0FBTCxJQUFrQixNQUFsQixFQUEwQjtBQUN4QixjQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixTQUFyQixDQUFMLEVBQXNDO0FBQ3RDLHFCQUFXLE9BQU8sU0FBUCxDQUFYO0FBQ0EsZUFBSyxXQUFMLENBQWlCLFNBQWpCLEVBQTRCLFFBQTVCO0FBQ0Q7QUFDRixPQU5NLE1BTUE7QUFDTCxZQUFJLFdBQVcsS0FBWCxDQUFKLEVBQXVCO0FBQ3JCLGtCQUFRLE1BQU0sS0FBTixFQUFSO0FBQ0Q7QUFDRCxlQUFPLElBQUksd0JBQUosQ0FBNkIsSUFBN0IsRUFBbUMsTUFBbkMsRUFBMkMsS0FBM0MsQ0FBUDtBQUNBLGFBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLHFCQUFaLENBQWtDLElBQWxDLEVBQXdDLEtBQUssYUFBN0MsRUFBNEQsS0FBSyxZQUFMLEdBQW9CLENBQWhGLENBQVosRUFBZ0csS0FBSyxZQUFMLEdBQW9CLENBQXBIO0FBQ0Q7QUFDRCxhQUFPLElBQVA7QUFDRCxLQTVCRDs7QUE4QkEsa0JBQWMsU0FBZCxDQUF3QixXQUF4QixHQUFzQyxVQUFTLE9BQVQsRUFBa0IsUUFBbEIsRUFBNEIsVUFBNUIsRUFBd0M7QUFDNUUsVUFBSSxJQUFKO0FBQ0EsV0FBSyxXQUFMO0FBQ0EsVUFBSSxLQUFLLGVBQVQsRUFBMEI7QUFDeEIsY0FBTSxJQUFJLEtBQUosQ0FBVSx1Q0FBVixDQUFOO0FBQ0Q7QUFDRCxhQUFPLElBQUksY0FBSixDQUFtQixJQUFuQixFQUF5QixPQUF6QixFQUFrQyxRQUFsQyxFQUE0QyxVQUE1QyxDQUFQO0FBQ0EsV0FBSyxNQUFMLENBQVksS0FBSyxNQUFMLENBQVksV0FBWixDQUF3QixJQUF4QixFQUE4QixLQUFLLGFBQW5DLEVBQWtELEtBQUssWUFBTCxHQUFvQixDQUF0RSxDQUFaLEVBQXNGLEtBQUssWUFBTCxHQUFvQixDQUExRztBQUNBLGFBQU8sSUFBUDtBQUNELEtBVEQ7O0FBV0Esa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCLEtBQXRCLEVBQTZCO0FBQzdELFdBQUssV0FBTDtBQUNBLFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGNBQU0sSUFBSSxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSSxLQUFLLElBQVQsRUFBZTtBQUNiLGNBQU0sSUFBSSxLQUFKLENBQVUsdUNBQVYsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxXQUFMLEdBQW1CLElBQUksVUFBSixDQUFlLElBQWYsRUFBcUIsS0FBckIsRUFBNEIsS0FBNUIsQ0FBbkI7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsWUFBakIsR0FBZ0MsSUFBaEM7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsUUFBakIsR0FBNEIsS0FBNUI7QUFDQSxXQUFLLFlBQUw7QUFDQSxXQUFLLFFBQUwsQ0FBYyxLQUFLLFlBQW5CLElBQW1DLEtBQUssV0FBeEM7QUFDQSxhQUFPLElBQVA7QUFDRCxLQWREOztBQWdCQSxrQkFBYyxTQUFkLENBQXdCLFVBQXhCLEdBQXFDLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDekQsVUFBSSxJQUFKO0FBQ0EsV0FBSyxXQUFMO0FBQ0EsYUFBTyxJQUFJLGFBQUosQ0FBa0IsSUFBbEIsRUFBd0IsSUFBeEIsRUFBOEIsS0FBOUIsQ0FBUDtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLFVBQVosQ0FBdUIsSUFBdkIsRUFBNkIsS0FBSyxhQUFsQyxFQUFpRCxLQUFLLFlBQUwsR0FBb0IsQ0FBckUsQ0FBWixFQUFxRixLQUFLLFlBQUwsR0FBb0IsQ0FBekc7QUFDQSxhQUFPLElBQVA7QUFDRCxLQU5EOztBQVFBLGtCQUFjLFNBQWQsQ0FBd0IsT0FBeEIsR0FBa0MsVUFBUyxXQUFULEVBQXNCLGFBQXRCLEVBQXFDLGFBQXJDLEVBQW9ELGdCQUFwRCxFQUFzRSxZQUF0RSxFQUFvRjtBQUNwSCxVQUFJLElBQUo7QUFDQSxXQUFLLFdBQUw7QUFDQSxhQUFPLElBQUksYUFBSixDQUFrQixJQUFsQixFQUF3QixXQUF4QixFQUFxQyxhQUFyQyxFQUFvRCxhQUFwRCxFQUFtRSxnQkFBbkUsRUFBcUYsWUFBckYsQ0FBUDtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLFVBQVosQ0FBdUIsSUFBdkIsRUFBNkIsS0FBSyxhQUFsQyxFQUFpRCxLQUFLLFlBQUwsR0FBb0IsQ0FBckUsQ0FBWixFQUFxRixLQUFLLFlBQUwsR0FBb0IsQ0FBekc7QUFDQSxhQUFPLElBQVA7QUFDRCxLQU5EOztBQVFBLGtCQUFjLFNBQWQsQ0FBd0IsTUFBeEIsR0FBaUMsVUFBUyxJQUFULEVBQWUsS0FBZixFQUFzQjtBQUNyRCxVQUFJLElBQUo7QUFDQSxXQUFLLFdBQUw7QUFDQSxhQUFPLElBQUksWUFBSixDQUFpQixJQUFqQixFQUF1QixLQUF2QixFQUE4QixJQUE5QixFQUFvQyxLQUFwQyxDQUFQO0FBQ0EsV0FBSyxNQUFMLENBQVksS0FBSyxNQUFMLENBQVksU0FBWixDQUFzQixJQUF0QixFQUE0QixLQUFLLGFBQWpDLEVBQWdELEtBQUssWUFBTCxHQUFvQixDQUFwRSxDQUFaLEVBQW9GLEtBQUssWUFBTCxHQUFvQixDQUF4RztBQUNBLGFBQU8sSUFBUDtBQUNELEtBTkQ7O0FBUUEsa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ3RELFVBQUksSUFBSjtBQUNBLFdBQUssV0FBTDtBQUNBLGFBQU8sSUFBSSxZQUFKLENBQWlCLElBQWpCLEVBQXVCLElBQXZCLEVBQTZCLElBQTdCLEVBQW1DLEtBQW5DLENBQVA7QUFDQSxXQUFLLE1BQUwsQ0FBWSxLQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLElBQXRCLEVBQTRCLEtBQUssYUFBakMsRUFBZ0QsS0FBSyxZQUFMLEdBQW9CLENBQXBFLENBQVosRUFBb0YsS0FBSyxZQUFMLEdBQW9CLENBQXhHO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLFFBQXhCLEdBQW1DLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDdkQsVUFBSSxJQUFKO0FBQ0EsV0FBSyxXQUFMO0FBQ0EsYUFBTyxJQUFJLGNBQUosQ0FBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsS0FBL0IsQ0FBUDtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQUssTUFBTCxDQUFZLFdBQVosQ0FBd0IsSUFBeEIsRUFBOEIsS0FBSyxhQUFuQyxFQUFrRCxLQUFLLFlBQUwsR0FBb0IsQ0FBdEUsQ0FBWixFQUFzRixLQUFLLFlBQUwsR0FBb0IsQ0FBMUc7QUFDQSxhQUFPLElBQVA7QUFDRCxLQU5EOztBQVFBLGtCQUFjLFNBQWQsQ0FBd0IsRUFBeEIsR0FBNkIsWUFBVztBQUN0QyxVQUFJLEtBQUssWUFBTCxHQUFvQixDQUF4QixFQUEyQjtBQUN6QixjQUFNLElBQUksS0FBSixDQUFVLGtDQUFWLENBQU47QUFDRDtBQUNELFVBQUksS0FBSyxXQUFULEVBQXNCO0FBQ3BCLFlBQUksS0FBSyxXQUFMLENBQWlCLFFBQXJCLEVBQStCO0FBQzdCLGVBQUssU0FBTCxDQUFlLEtBQUssV0FBcEI7QUFDRCxTQUZELE1BRU87QUFDTCxlQUFLLFFBQUwsQ0FBYyxLQUFLLFdBQW5CO0FBQ0Q7QUFDRCxhQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDRCxPQVBELE1BT087QUFDTCxhQUFLLFNBQUwsQ0FBZSxLQUFLLFFBQUwsQ0FBYyxLQUFLLFlBQW5CLENBQWY7QUFDRDtBQUNELGFBQU8sS0FBSyxRQUFMLENBQWMsS0FBSyxZQUFuQixDQUFQO0FBQ0EsV0FBSyxZQUFMO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FqQkQ7O0FBbUJBLGtCQUFjLFNBQWQsQ0FBd0IsR0FBeEIsR0FBOEIsWUFBVztBQUN2QyxhQUFPLEtBQUssWUFBTCxJQUFxQixDQUE1QixFQUErQjtBQUM3QixhQUFLLEVBQUw7QUFDRDtBQUNELGFBQU8sS0FBSyxLQUFMLEVBQVA7QUFDRCxLQUxEOztBQU9BLGtCQUFjLFNBQWQsQ0FBd0IsV0FBeEIsR0FBc0MsWUFBVztBQUMvQyxVQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNwQixhQUFLLFdBQUwsQ0FBaUIsUUFBakIsR0FBNEIsSUFBNUI7QUFDQSxlQUFPLEtBQUssUUFBTCxDQUFjLEtBQUssV0FBbkIsQ0FBUDtBQUNEO0FBQ0YsS0FMRDs7QUFPQSxrQkFBYyxTQUFkLENBQXdCLFFBQXhCLEdBQW1DLFVBQVMsSUFBVCxFQUFlO0FBQ2hELFVBQUksR0FBSixFQUFTLEtBQVQsRUFBZ0IsSUFBaEIsRUFBc0IsSUFBdEI7QUFDQSxVQUFJLENBQUMsS0FBSyxNQUFWLEVBQWtCO0FBQ2hCLFlBQUksQ0FBQyxLQUFLLElBQU4sSUFBYyxLQUFLLFlBQUwsS0FBc0IsQ0FBcEMsSUFBeUMsS0FBSyxJQUFMLEtBQWMsU0FBUyxPQUFwRSxFQUE2RTtBQUMzRSxlQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0Q7QUFDRCxnQkFBUSxFQUFSO0FBQ0EsWUFBSSxLQUFLLElBQUwsS0FBYyxTQUFTLE9BQTNCLEVBQW9DO0FBQ2xDLGVBQUssYUFBTCxDQUFtQixLQUFuQixHQUEyQixZQUFZLE9BQXZDO0FBQ0Esa0JBQVEsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixJQUFuQixFQUF5QixLQUFLLGFBQTlCLEVBQTZDLEtBQUssWUFBbEQsSUFBa0UsR0FBbEUsR0FBd0UsS0FBSyxJQUFyRjtBQUNBLGlCQUFPLEtBQUssT0FBWjtBQUNBLGVBQUssSUFBTCxJQUFhLElBQWIsRUFBbUI7QUFDakIsZ0JBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxJQUFiLEVBQW1CLElBQW5CLENBQUwsRUFBK0I7QUFDL0Isa0JBQU0sS0FBSyxJQUFMLENBQU47QUFDQSxxQkFBUyxLQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLEdBQXRCLEVBQTJCLEtBQUssYUFBaEMsRUFBK0MsS0FBSyxZQUFwRCxDQUFUO0FBQ0Q7QUFDRCxtQkFBUyxDQUFDLEtBQUssUUFBTCxHQUFnQixHQUFoQixHQUFzQixJQUF2QixJQUErQixLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLElBQXBCLEVBQTBCLEtBQUssYUFBL0IsRUFBOEMsS0FBSyxZQUFuRCxDQUF4QztBQUNBLGVBQUssYUFBTCxDQUFtQixLQUFuQixHQUEyQixZQUFZLFNBQXZDO0FBQ0QsU0FYRCxNQVdPO0FBQ0wsZUFBSyxhQUFMLENBQW1CLEtBQW5CLEdBQTJCLFlBQVksT0FBdkM7QUFDQSxrQkFBUSxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLElBQW5CLEVBQXlCLEtBQUssYUFBOUIsRUFBNkMsS0FBSyxZQUFsRCxJQUFrRSxZQUFsRSxHQUFpRixLQUFLLFlBQTlGO0FBQ0EsY0FBSSxLQUFLLEtBQUwsSUFBYyxLQUFLLEtBQXZCLEVBQThCO0FBQzVCLHFCQUFTLGNBQWMsS0FBSyxLQUFuQixHQUEyQixLQUEzQixHQUFtQyxLQUFLLEtBQXhDLEdBQWdELEdBQXpEO0FBQ0QsV0FGRCxNQUVPLElBQUksS0FBSyxLQUFULEVBQWdCO0FBQ3JCLHFCQUFTLGNBQWMsS0FBSyxLQUFuQixHQUEyQixHQUFwQztBQUNEO0FBQ0QsY0FBSSxLQUFLLFFBQVQsRUFBbUI7QUFDakIscUJBQVMsSUFBVDtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsS0FBbkIsR0FBMkIsWUFBWSxTQUF2QztBQUNELFdBSEQsTUFHTztBQUNMLGlCQUFLLGFBQUwsQ0FBbUIsS0FBbkIsR0FBMkIsWUFBWSxRQUF2QztBQUNBLHFCQUFTLEdBQVQ7QUFDRDtBQUNELG1CQUFTLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsRUFBMEIsS0FBSyxhQUEvQixFQUE4QyxLQUFLLFlBQW5ELENBQVQ7QUFDRDtBQUNELGFBQUssTUFBTCxDQUFZLEtBQVosRUFBbUIsS0FBSyxZQUF4QjtBQUNBLGVBQU8sS0FBSyxNQUFMLEdBQWMsSUFBckI7QUFDRDtBQUNGLEtBdENEOztBQXdDQSxrQkFBYyxTQUFkLENBQXdCLFNBQXhCLEdBQW9DLFVBQVMsSUFBVCxFQUFlO0FBQ2pELFVBQUksS0FBSjtBQUNBLFVBQUksQ0FBQyxLQUFLLFFBQVYsRUFBb0I7QUFDbEIsZ0JBQVEsRUFBUjtBQUNBLGFBQUssYUFBTCxDQUFtQixLQUFuQixHQUEyQixZQUFZLFFBQXZDO0FBQ0EsWUFBSSxLQUFLLElBQUwsS0FBYyxTQUFTLE9BQTNCLEVBQW9DO0FBQ2xDLGtCQUFRLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsSUFBbkIsRUFBeUIsS0FBSyxhQUE5QixFQUE2QyxLQUFLLFlBQWxELElBQWtFLElBQWxFLEdBQXlFLEtBQUssSUFBOUUsR0FBcUYsR0FBckYsR0FBMkYsS0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixJQUFwQixFQUEwQixLQUFLLGFBQS9CLEVBQThDLEtBQUssWUFBbkQsQ0FBbkc7QUFDRCxTQUZELE1BRU87QUFDTCxrQkFBUSxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLElBQW5CLEVBQXlCLEtBQUssYUFBOUIsRUFBNkMsS0FBSyxZQUFsRCxJQUFrRSxJQUFsRSxHQUF5RSxLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLElBQXBCLEVBQTBCLEtBQUssYUFBL0IsRUFBOEMsS0FBSyxZQUFuRCxDQUFqRjtBQUNEO0FBQ0QsYUFBSyxhQUFMLENBQW1CLEtBQW5CLEdBQTJCLFlBQVksSUFBdkM7QUFDQSxhQUFLLE1BQUwsQ0FBWSxLQUFaLEVBQW1CLEtBQUssWUFBeEI7QUFDQSxlQUFPLEtBQUssUUFBTCxHQUFnQixJQUF2QjtBQUNEO0FBQ0YsS0FkRDs7QUFnQkEsa0JBQWMsU0FBZCxDQUF3QixNQUF4QixHQUFpQyxVQUFTLEtBQVQsRUFBZ0IsS0FBaEIsRUFBdUI7QUFDdEQsV0FBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0EsYUFBTyxLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsUUFBUSxDQUFuQyxDQUFQO0FBQ0QsS0FIRDs7QUFLQSxrQkFBYyxTQUFkLENBQXdCLEtBQXhCLEdBQWdDLFlBQVc7QUFDekMsV0FBSyxpQkFBTCxHQUF5QixJQUF6QjtBQUNBLGFBQU8sS0FBSyxhQUFMLEVBQVA7QUFDRCxLQUhEOztBQUtBLGtCQUFjLFNBQWQsQ0FBd0IsU0FBeEIsR0FBb0MsVUFBUyxJQUFULEVBQWU7QUFDakQsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsZUFBTyxFQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxZQUFZLElBQVosR0FBbUIsR0FBMUI7QUFDRDtBQUNGLEtBTkQ7O0FBUUEsa0JBQWMsU0FBZCxDQUF3QixHQUF4QixHQUE4QixZQUFXO0FBQ3ZDLGFBQU8sS0FBSyxPQUFMLENBQWEsS0FBYixDQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLEdBQXhCLEdBQThCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDN0QsYUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQWdCLFVBQWhCLEVBQTRCLElBQTVCLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsR0FBeEIsR0FBOEIsVUFBUyxLQUFULEVBQWdCO0FBQzVDLGFBQU8sS0FBSyxJQUFMLENBQVUsS0FBVixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLEdBQXhCLEdBQThCLFVBQVMsS0FBVCxFQUFnQjtBQUM1QyxhQUFPLEtBQUssS0FBTCxDQUFXLEtBQVgsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsa0JBQWMsU0FBZCxDQUF3QixHQUF4QixHQUE4QixVQUFTLEtBQVQsRUFBZ0I7QUFDNUMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsR0FBeEIsR0FBOEIsVUFBUyxNQUFULEVBQWlCLEtBQWpCLEVBQXdCO0FBQ3BELGFBQU8sS0FBSyxXQUFMLENBQWlCLE1BQWpCLEVBQXlCLEtBQXpCLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsR0FBeEIsR0FBOEIsVUFBUyxPQUFULEVBQWtCLFFBQWxCLEVBQTRCLFVBQTVCLEVBQXdDO0FBQ3BFLGFBQU8sS0FBSyxXQUFMLENBQWlCLE9BQWpCLEVBQTBCLFFBQTFCLEVBQW9DLFVBQXBDLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsR0FBeEIsR0FBOEIsVUFBUyxJQUFULEVBQWUsS0FBZixFQUFzQixLQUF0QixFQUE2QjtBQUN6RCxhQUFPLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsS0FBbkIsRUFBMEIsS0FBMUIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsa0JBQWMsU0FBZCxDQUF3QixDQUF4QixHQUE0QixVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLElBQTNCLEVBQWlDO0FBQzNELGFBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixVQUFuQixFQUErQixJQUEvQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLENBQXhCLEdBQTRCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDM0QsYUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQWdCLFVBQWhCLEVBQTRCLElBQTVCLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsQ0FBeEIsR0FBNEIsVUFBUyxLQUFULEVBQWdCO0FBQzFDLGFBQU8sS0FBSyxJQUFMLENBQVUsS0FBVixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLENBQXhCLEdBQTRCLFVBQVMsS0FBVCxFQUFnQjtBQUMxQyxhQUFPLEtBQUssS0FBTCxDQUFXLEtBQVgsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsa0JBQWMsU0FBZCxDQUF3QixDQUF4QixHQUE0QixVQUFTLEtBQVQsRUFBZ0I7QUFDMUMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsQ0FBeEIsR0FBNEIsVUFBUyxLQUFULEVBQWdCO0FBQzFDLGFBQU8sS0FBSyxHQUFMLENBQVMsS0FBVCxDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLENBQXhCLEdBQTRCLFVBQVMsTUFBVCxFQUFpQixLQUFqQixFQUF3QjtBQUNsRCxhQUFPLEtBQUssV0FBTCxDQUFpQixNQUFqQixFQUF5QixLQUF6QixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxrQkFBYyxTQUFkLENBQXdCLEdBQXhCLEdBQThCLFlBQVc7QUFDdkMsVUFBSSxLQUFLLFdBQUwsSUFBb0IsS0FBSyxXQUFMLENBQWlCLElBQWpCLEtBQTBCLFNBQVMsT0FBM0QsRUFBb0U7QUFDbEUsZUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQW1CLElBQW5CLEVBQXlCLFNBQXpCLENBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBcUIsSUFBckIsRUFBMkIsU0FBM0IsQ0FBUDtBQUNEO0FBQ0YsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLENBQXhCLEdBQTRCLFlBQVc7QUFDckMsVUFBSSxLQUFLLFdBQUwsSUFBb0IsS0FBSyxXQUFMLENBQWlCLElBQWpCLEtBQTBCLFNBQVMsT0FBM0QsRUFBb0U7QUFDbEUsZUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQW1CLElBQW5CLEVBQXlCLFNBQXpCLENBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBcUIsSUFBckIsRUFBMkIsU0FBM0IsQ0FBUDtBQUNEO0FBQ0YsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLEdBQXhCLEdBQThCLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDbEQsYUFBTyxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLEtBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLGtCQUFjLFNBQWQsQ0FBd0IsSUFBeEIsR0FBK0IsVUFBUyxJQUFULEVBQWUsS0FBZixFQUFzQjtBQUNuRCxhQUFPLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsS0FBbkIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsa0JBQWMsU0FBZCxDQUF3QixHQUF4QixHQUE4QixVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ2xELGFBQU8sS0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixLQUFwQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGFBQVA7QUFFRCxHQWxlZ0MsRUFBakM7QUFvZUQsQ0E5Z0JELEVBOGdCRyxJQTlnQkg7Ozs7Ozs7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLFFBQUo7QUFBQSxNQUFjLFFBQWQ7QUFBQSxNQUF3QixPQUF4QjtBQUFBLE1BQ0UsU0FBUyxTQUFULE1BQVMsQ0FBUyxLQUFULEVBQWdCLE1BQWhCLEVBQXdCO0FBQUUsU0FBSyxJQUFJLEdBQVQsSUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxVQUFJLFFBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsR0FBckIsQ0FBSixFQUErQixNQUFNLEdBQU4sSUFBYSxPQUFPLEdBQVAsQ0FBYjtBQUEyQixLQUFDLFNBQVMsSUFBVCxHQUFnQjtBQUFFLFdBQUssV0FBTCxHQUFtQixLQUFuQjtBQUEyQixLQUFDLEtBQUssU0FBTCxHQUFpQixPQUFPLFNBQXhCLENBQW1DLE1BQU0sU0FBTixHQUFrQixJQUFJLElBQUosRUFBbEIsQ0FBOEIsTUFBTSxTQUFOLEdBQWtCLE9BQU8sU0FBekIsQ0FBb0MsT0FBTyxLQUFQO0FBQWUsR0FENVI7QUFBQSxNQUVFLFVBQVUsR0FBRyxjQUZmOztBQUlBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsV0FBWSxVQUFTLFVBQVQsRUFBcUI7QUFDaEQsV0FBTyxRQUFQLEVBQWlCLFVBQWpCOztBQUVBLGFBQVMsUUFBVCxDQUFrQixNQUFsQixFQUEwQjtBQUN4QixlQUFTLFNBQVQsQ0FBbUIsV0FBbkIsQ0FBK0IsSUFBL0IsQ0FBb0MsSUFBcEMsRUFBMEMsTUFBMUM7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLEtBQXJCO0FBQ0Q7O0FBRUQsYUFBUyxTQUFULENBQW1CLEtBQW5CLEdBQTJCLFlBQVc7QUFDcEMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLGFBQVMsU0FBVCxDQUFtQixRQUFuQixHQUE4QixVQUFTLE9BQVQsRUFBa0I7QUFDOUMsYUFBTyxFQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLFFBQVA7QUFFRCxHQWxCMkIsQ0FrQnpCLE9BbEJ5QixDQUE1QjtBQW9CRCxDQTdCRCxFQTZCRyxJQTdCSDs7Ozs7Ozs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksUUFBSjtBQUFBLE1BQWMsWUFBZDtBQUFBLE1BQTRCLFVBQTVCO0FBQUEsTUFBd0MsZUFBeEM7QUFBQSxNQUF5RCxPQUF6RDtBQUFBLE1BQWtFLFFBQWxFO0FBQUEsTUFBNEUsVUFBNUU7QUFBQSxNQUF3RixRQUF4RjtBQUFBLE1BQWtHLEdBQWxHO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsUUFBTSxRQUFRLFdBQVIsQ0FBTixFQUE0QixXQUFXLElBQUksUUFBM0MsRUFBcUQsYUFBYSxJQUFJLFVBQXRFLEVBQWtGLFdBQVcsSUFBSSxRQUFqRzs7QUFFQSxZQUFVLFFBQVEsV0FBUixDQUFWOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsaUJBQWUsUUFBUSxnQkFBUixDQUFmOztBQUVBLG9CQUFrQixRQUFRLG1CQUFSLENBQWxCOztBQUVBLFNBQU8sT0FBUCxHQUFpQixhQUFjLFVBQVMsVUFBVCxFQUFxQjtBQUNsRCxXQUFPLFVBQVAsRUFBbUIsVUFBbkI7O0FBRUEsYUFBUyxVQUFULENBQW9CLE1BQXBCLEVBQTRCLElBQTVCLEVBQWtDLFVBQWxDLEVBQThDO0FBQzVDLFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLElBQW5CO0FBQ0EsaUJBQVcsU0FBWCxDQUFxQixXQUFyQixDQUFpQyxJQUFqQyxDQUFzQyxJQUF0QyxFQUE0QyxNQUE1QztBQUNBLFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGNBQU0sSUFBSSxLQUFKLENBQVUsMkJBQTJCLEtBQUssU0FBTCxFQUFyQyxDQUFOO0FBQ0Q7QUFDRCxXQUFLLElBQUwsR0FBWSxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLElBQXBCLENBQVo7QUFDQSxXQUFLLElBQUwsR0FBWSxTQUFTLE9BQXJCO0FBQ0EsV0FBSyxPQUFMLEdBQWUsRUFBZjtBQUNBLFdBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLFVBQUksY0FBYyxJQUFsQixFQUF3QjtBQUN0QixhQUFLLFNBQUwsQ0FBZSxVQUFmO0FBQ0Q7QUFDRCxVQUFJLE9BQU8sSUFBUCxLQUFnQixTQUFTLFFBQTdCLEVBQXVDO0FBQ3JDLGFBQUssTUFBTCxHQUFjLElBQWQ7QUFDQSxhQUFLLGNBQUwsR0FBc0IsTUFBdEI7QUFDQSxlQUFPLFVBQVAsR0FBb0IsSUFBcEI7QUFDQSxZQUFJLE9BQU8sUUFBWCxFQUFxQjtBQUNuQixpQkFBTyxPQUFPLFFBQWQ7QUFDQSxlQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sS0FBSyxNQUF2QixFQUErQixJQUFJLEdBQW5DLEVBQXdDLEdBQXhDLEVBQTZDO0FBQzNDLG9CQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsZ0JBQUksTUFBTSxJQUFOLEtBQWUsU0FBUyxPQUE1QixFQUFxQztBQUNuQyxvQkFBTSxJQUFOLEdBQWEsS0FBSyxJQUFsQjtBQUNBO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7QUFDRjs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsV0FBVyxTQUFqQyxFQUE0QyxTQUE1QyxFQUF1RDtBQUNyRCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssSUFBWjtBQUNEO0FBSG9ELEtBQXZEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixXQUFXLFNBQWpDLEVBQTRDLGNBQTVDLEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLGVBQU8sRUFBUDtBQUNEO0FBSHlELEtBQTVEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixXQUFXLFNBQWpDLEVBQTRDLFFBQTVDLEVBQXNEO0FBQ3BELFdBQUssZUFBVztBQUNkLGVBQU8sRUFBUDtBQUNEO0FBSG1ELEtBQXREOztBQU1BLFdBQU8sY0FBUCxDQUFzQixXQUFXLFNBQWpDLEVBQTRDLFdBQTVDLEVBQXlEO0FBQ3ZELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxJQUFaO0FBQ0Q7QUFIc0QsS0FBekQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFdBQVcsU0FBakMsRUFBNEMsSUFBNUMsRUFBa0Q7QUFDaEQsV0FBSyxlQUFXO0FBQ2QsY0FBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRDtBQUgrQyxLQUFsRDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsV0FBVyxTQUFqQyxFQUE0QyxXQUE1QyxFQUF5RDtBQUN2RCxXQUFLLGVBQVc7QUFDZCxjQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNEO0FBSHNELEtBQXpEOztBQU1BLFdBQU8sY0FBUCxDQUFzQixXQUFXLFNBQWpDLEVBQTRDLFdBQTVDLEVBQXlEO0FBQ3ZELFdBQUssZUFBVztBQUNkLGNBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0Q7QUFIc0QsS0FBekQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFdBQVcsU0FBakMsRUFBNEMsWUFBNUMsRUFBMEQ7QUFDeEQsV0FBSyxlQUFXO0FBQ2QsWUFBSSxDQUFDLEtBQUssWUFBTixJQUFzQixDQUFDLEtBQUssWUFBTCxDQUFrQixLQUE3QyxFQUFvRDtBQUNsRCxlQUFLLFlBQUwsR0FBb0IsSUFBSSxlQUFKLENBQW9CLEtBQUssT0FBekIsQ0FBcEI7QUFDRDtBQUNELGVBQU8sS0FBSyxZQUFaO0FBQ0Q7QUFOdUQsS0FBMUQ7O0FBU0EsZUFBVyxTQUFYLENBQXFCLEtBQXJCLEdBQTZCLFlBQVc7QUFDdEMsVUFBSSxHQUFKLEVBQVMsT0FBVCxFQUFrQixVQUFsQixFQUE4QixJQUE5QjtBQUNBLG1CQUFhLHNCQUFjLElBQWQsQ0FBYjtBQUNBLFVBQUksV0FBVyxNQUFmLEVBQXVCO0FBQ3JCLG1CQUFXLGNBQVgsR0FBNEIsSUFBNUI7QUFDRDtBQUNELGlCQUFXLE9BQVgsR0FBcUIsRUFBckI7QUFDQSxhQUFPLEtBQUssT0FBWjtBQUNBLFdBQUssT0FBTCxJQUFnQixJQUFoQixFQUFzQjtBQUNwQixZQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixPQUFuQixDQUFMLEVBQWtDO0FBQ2xDLGNBQU0sS0FBSyxPQUFMLENBQU47QUFDQSxtQkFBVyxPQUFYLENBQW1CLE9BQW5CLElBQThCLElBQUksS0FBSixFQUE5QjtBQUNEO0FBQ0QsaUJBQVcsUUFBWCxHQUFzQixFQUF0QjtBQUNBLFdBQUssUUFBTCxDQUFjLE9BQWQsQ0FBc0IsVUFBUyxLQUFULEVBQWdCO0FBQ3BDLFlBQUksV0FBSjtBQUNBLHNCQUFjLE1BQU0sS0FBTixFQUFkO0FBQ0Esb0JBQVksTUFBWixHQUFxQixVQUFyQjtBQUNBLGVBQU8sV0FBVyxRQUFYLENBQW9CLElBQXBCLENBQXlCLFdBQXpCLENBQVA7QUFDRCxPQUxEO0FBTUEsYUFBTyxVQUFQO0FBQ0QsS0FyQkQ7O0FBdUJBLGVBQVcsU0FBWCxDQUFxQixTQUFyQixHQUFpQyxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ3JELFVBQUksT0FBSixFQUFhLFFBQWI7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixlQUFPLFNBQVMsSUFBVCxDQUFQO0FBQ0Q7QUFDRCxVQUFJLFNBQVMsSUFBVCxDQUFKLEVBQW9CO0FBQ2xCLGFBQUssT0FBTCxJQUFnQixJQUFoQixFQUFzQjtBQUNwQixjQUFJLENBQUMsUUFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixPQUFuQixDQUFMLEVBQWtDO0FBQ2xDLHFCQUFXLEtBQUssT0FBTCxDQUFYO0FBQ0EsZUFBSyxTQUFMLENBQWUsT0FBZixFQUF3QixRQUF4QjtBQUNEO0FBQ0YsT0FORCxNQU1PO0FBQ0wsWUFBSSxXQUFXLEtBQVgsQ0FBSixFQUF1QjtBQUNyQixrQkFBUSxNQUFNLEtBQU4sRUFBUjtBQUNEO0FBQ0QsWUFBSSxLQUFLLE9BQUwsQ0FBYSxrQkFBYixJQUFvQyxTQUFTLElBQWpELEVBQXdEO0FBQ3RELGVBQUssT0FBTCxDQUFhLElBQWIsSUFBcUIsSUFBSSxZQUFKLENBQWlCLElBQWpCLEVBQXVCLElBQXZCLEVBQTZCLEVBQTdCLENBQXJCO0FBQ0QsU0FGRCxNQUVPLElBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ3hCLGVBQUssT0FBTCxDQUFhLElBQWIsSUFBcUIsSUFBSSxZQUFKLENBQWlCLElBQWpCLEVBQXVCLElBQXZCLEVBQTZCLEtBQTdCLENBQXJCO0FBQ0Q7QUFDRjtBQUNELGFBQU8sSUFBUDtBQUNELEtBdEJEOztBQXdCQSxlQUFXLFNBQVgsQ0FBcUIsZUFBckIsR0FBdUMsVUFBUyxJQUFULEVBQWU7QUFDcEQsVUFBSSxPQUFKLEVBQWEsQ0FBYixFQUFnQixHQUFoQjtBQUNBLFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGNBQU0sSUFBSSxLQUFKLENBQVUsNkJBQTZCLEtBQUssU0FBTCxFQUF2QyxDQUFOO0FBQ0Q7QUFDRCxhQUFPLFNBQVMsSUFBVCxDQUFQO0FBQ0EsVUFBSSxNQUFNLE9BQU4sQ0FBYyxJQUFkLENBQUosRUFBeUI7QUFDdkIsYUFBSyxJQUFJLENBQUosRUFBTyxNQUFNLEtBQUssTUFBdkIsRUFBK0IsSUFBSSxHQUFuQyxFQUF3QyxHQUF4QyxFQUE2QztBQUMzQyxvQkFBVSxLQUFLLENBQUwsQ0FBVjtBQUNBLGlCQUFPLEtBQUssT0FBTCxDQUFhLE9BQWIsQ0FBUDtBQUNEO0FBQ0YsT0FMRCxNQUtPO0FBQ0wsZUFBTyxLQUFLLE9BQUwsQ0FBYSxJQUFiLENBQVA7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNELEtBZkQ7O0FBaUJBLGVBQVcsU0FBWCxDQUFxQixRQUFyQixHQUFnQyxVQUFTLE9BQVQsRUFBa0I7QUFDaEQsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLE9BQXBCLENBQTRCLElBQTVCLEVBQWtDLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBbEMsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLEdBQXJCLEdBQTJCLFVBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDL0MsYUFBTyxLQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLEtBQXJCLENBQVA7QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixDQUFyQixHQUF5QixVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQzdDLGFBQU8sS0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixLQUFyQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsWUFBckIsR0FBb0MsVUFBUyxJQUFULEVBQWU7QUFDakQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxjQUFiLENBQTRCLElBQTVCLENBQUosRUFBdUM7QUFDckMsZUFBTyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLEtBQTFCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxJQUFQO0FBQ0Q7QUFDRixLQU5EOztBQVFBLGVBQVcsU0FBWCxDQUFxQixZQUFyQixHQUFvQyxVQUFTLElBQVQsRUFBZSxLQUFmLEVBQXNCO0FBQ3hELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsZ0JBQXJCLEdBQXdDLFVBQVMsSUFBVCxFQUFlO0FBQ3JELFVBQUksS0FBSyxPQUFMLENBQWEsY0FBYixDQUE0QixJQUE1QixDQUFKLEVBQXVDO0FBQ3JDLGVBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixDQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxJQUFQO0FBQ0Q7QUFDRixLQU5EOztBQVFBLGVBQVcsU0FBWCxDQUFxQixnQkFBckIsR0FBd0MsVUFBUyxPQUFULEVBQWtCO0FBQ3hELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsbUJBQXJCLEdBQTJDLFVBQVMsT0FBVCxFQUFrQjtBQUMzRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLG9CQUFyQixHQUE0QyxVQUFTLElBQVQsRUFBZTtBQUN6RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLGNBQXJCLEdBQXNDLFVBQVMsWUFBVCxFQUF1QixTQUF2QixFQUFrQztBQUN0RSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLGNBQXJCLEdBQXNDLFVBQVMsWUFBVCxFQUF1QixhQUF2QixFQUFzQyxLQUF0QyxFQUE2QztBQUNqRixZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLGlCQUFyQixHQUF5QyxVQUFTLFlBQVQsRUFBdUIsU0FBdkIsRUFBa0M7QUFDekUsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixrQkFBckIsR0FBMEMsVUFBUyxZQUFULEVBQXVCLFNBQXZCLEVBQWtDO0FBQzFFLFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsa0JBQXJCLEdBQTBDLFVBQVMsT0FBVCxFQUFrQjtBQUMxRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLHNCQUFyQixHQUE4QyxVQUFTLFlBQVQsRUFBdUIsU0FBdkIsRUFBa0M7QUFDOUUsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixZQUFyQixHQUFvQyxVQUFTLElBQVQsRUFBZTtBQUNqRCxhQUFPLEtBQUssT0FBTCxDQUFhLGNBQWIsQ0FBNEIsSUFBNUIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLGNBQXJCLEdBQXNDLFVBQVMsWUFBVCxFQUF1QixTQUF2QixFQUFrQztBQUN0RSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLGNBQXJCLEdBQXNDLFVBQVMsSUFBVCxFQUFlLElBQWYsRUFBcUI7QUFDekQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxjQUFiLENBQTRCLElBQTVCLENBQUosRUFBdUM7QUFDckMsZUFBTyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLElBQTFCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxJQUFQO0FBQ0Q7QUFDRixLQU5EOztBQVFBLGVBQVcsU0FBWCxDQUFxQixnQkFBckIsR0FBd0MsVUFBUyxZQUFULEVBQXVCLFNBQXZCLEVBQWtDLElBQWxDLEVBQXdDO0FBQzlFLFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsa0JBQXJCLEdBQTBDLFVBQVMsTUFBVCxFQUFpQixJQUFqQixFQUF1QjtBQUMvRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLG9CQUFyQixHQUE0QyxVQUFTLE9BQVQsRUFBa0I7QUFDNUQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLGVBQVcsU0FBWCxDQUFxQixzQkFBckIsR0FBOEMsVUFBUyxZQUFULEVBQXVCLFNBQXZCLEVBQWtDO0FBQzlFLFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxlQUFXLFNBQVgsQ0FBcUIsc0JBQXJCLEdBQThDLFVBQVMsVUFBVCxFQUFxQjtBQUNqRSxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsZUFBVyxTQUFYLENBQXFCLFdBQXJCLEdBQW1DLFVBQVMsSUFBVCxFQUFlO0FBQ2hELFVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxJQUFWO0FBQ0EsVUFBSSxDQUFDLFdBQVcsU0FBWCxDQUFxQixXQUFyQixDQUFpQyxLQUFqQyxDQUF1QyxJQUF2QyxFQUE2QyxTQUE3QyxFQUF3RCxXQUF4RCxDQUFvRSxJQUFwRSxDQUFMLEVBQWdGO0FBQzlFLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLFlBQUwsS0FBc0IsS0FBSyxZQUEvQixFQUE2QztBQUMzQyxlQUFPLEtBQVA7QUFDRDtBQUNELFVBQUksS0FBSyxNQUFMLEtBQWdCLEtBQUssTUFBekIsRUFBaUM7QUFDL0IsZUFBTyxLQUFQO0FBQ0Q7QUFDRCxVQUFJLEtBQUssU0FBTCxLQUFtQixLQUFLLFNBQTVCLEVBQXVDO0FBQ3JDLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLE9BQUwsQ0FBYSxNQUFiLEtBQXdCLEtBQUssT0FBTCxDQUFhLE1BQXpDLEVBQWlEO0FBQy9DLGVBQU8sS0FBUDtBQUNEO0FBQ0QsV0FBSyxJQUFJLElBQUksQ0FBUixFQUFXLE9BQU8sS0FBSyxPQUFMLENBQWEsTUFBYixHQUFzQixDQUE3QyxFQUFnRCxLQUFLLElBQUwsR0FBWSxLQUFLLElBQWpCLEdBQXdCLEtBQUssSUFBN0UsRUFBbUYsSUFBSSxLQUFLLElBQUwsR0FBWSxFQUFFLENBQWQsR0FBa0IsRUFBRSxDQUEzRyxFQUE4RztBQUM1RyxZQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsQ0FBYixFQUFnQixXQUFoQixDQUE0QixLQUFLLE9BQUwsQ0FBYSxDQUFiLENBQTVCLENBQUwsRUFBbUQ7QUFDakQsaUJBQU8sS0FBUDtBQUNEO0FBQ0Y7QUFDRCxhQUFPLElBQVA7QUFDRCxLQXZCRDs7QUF5QkEsV0FBTyxVQUFQO0FBRUQsR0F2UjZCLENBdVIzQixPQXZSMkIsQ0FBOUI7QUF5UkQsQ0F4U0QsRUF3U0csSUF4U0g7Ozs7Ozs7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLGVBQUo7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGtCQUFtQixZQUFXO0FBQzdDLGFBQVMsZUFBVCxDQUF5QixLQUF6QixFQUFnQztBQUM5QixXQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0Q7O0FBRUQsV0FBTyxjQUFQLENBQXNCLGdCQUFnQixTQUF0QyxFQUFpRCxRQUFqRCxFQUEyRDtBQUN6RCxXQUFLLGVBQVc7QUFDZCxlQUFPLG9CQUFZLEtBQUssS0FBakIsRUFBd0IsTUFBeEIsSUFBa0MsQ0FBekM7QUFDRDtBQUh3RCxLQUEzRDs7QUFNQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsS0FBMUIsR0FBa0MsWUFBVztBQUMzQyxhQUFPLEtBQUssS0FBTCxHQUFhLElBQXBCO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsWUFBMUIsR0FBeUMsVUFBUyxJQUFULEVBQWU7QUFDdEQsYUFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQVA7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixZQUExQixHQUF5QyxVQUFTLElBQVQsRUFBZTtBQUN0RCxVQUFJLE9BQUo7QUFDQSxnQkFBVSxLQUFLLEtBQUwsQ0FBVyxLQUFLLFFBQWhCLENBQVY7QUFDQSxXQUFLLEtBQUwsQ0FBVyxLQUFLLFFBQWhCLElBQTRCLElBQTVCO0FBQ0EsYUFBTyxXQUFXLElBQWxCO0FBQ0QsS0FMRDs7QUFPQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsZUFBMUIsR0FBNEMsVUFBUyxJQUFULEVBQWU7QUFDekQsVUFBSSxPQUFKO0FBQ0EsZ0JBQVUsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFWO0FBQ0EsYUFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQVA7QUFDQSxhQUFPLFdBQVcsSUFBbEI7QUFDRCxLQUxEOztBQU9BLG9CQUFnQixTQUFoQixDQUEwQixJQUExQixHQUFpQyxVQUFTLEtBQVQsRUFBZ0I7QUFDL0MsYUFBTyxLQUFLLEtBQUwsQ0FBVyxvQkFBWSxLQUFLLEtBQWpCLEVBQXdCLEtBQXhCLENBQVgsS0FBOEMsSUFBckQ7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixjQUExQixHQUEyQyxVQUFTLFlBQVQsRUFBdUIsU0FBdkIsRUFBa0M7QUFDM0UsWUFBTSxJQUFJLEtBQUosQ0FBVSxxQ0FBVixDQUFOO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsY0FBMUIsR0FBMkMsVUFBUyxJQUFULEVBQWU7QUFDeEQsWUFBTSxJQUFJLEtBQUosQ0FBVSxxQ0FBVixDQUFOO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsaUJBQTFCLEdBQThDLFVBQVMsWUFBVCxFQUF1QixTQUF2QixFQUFrQztBQUM5RSxZQUFNLElBQUksS0FBSixDQUFVLHFDQUFWLENBQU47QUFDRCxLQUZEOztBQUlBLFdBQU8sZUFBUDtBQUVELEdBbkRrQyxFQUFuQztBQXFERCxDQXhERCxFQXdERyxJQXhESDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksZ0JBQUo7QUFBQSxNQUFzQixRQUF0QjtBQUFBLE1BQWdDLFFBQWhDO0FBQUEsTUFBMEMsVUFBMUM7QUFBQSxNQUFzRCxjQUF0RDtBQUFBLE1BQXNFLFVBQXRFO0FBQUEsTUFBa0YsUUFBbEY7QUFBQSxNQUE0RixVQUE1RjtBQUFBLE1BQXdHLGVBQXhHO0FBQUEsTUFBeUgsT0FBekg7QUFBQSxNQUFrSSxXQUFsSTtBQUFBLE1BQStJLHdCQUEvSTtBQUFBLE1BQXlLLE1BQXpLO0FBQUEsTUFBaUwsT0FBakw7QUFBQSxNQUEwTCxRQUExTDtBQUFBLE1BQW9NLE9BQXBNO0FBQUEsTUFBNk0sVUFBN007QUFBQSxNQUF5TixRQUF6TjtBQUFBLE1BQW1PLElBQW5PO0FBQUEsTUFDRSxVQUFVLEdBQUcsY0FEZjs7QUFHQSxTQUFPLFFBQVEsV0FBUixDQUFQLEVBQTZCLFdBQVcsS0FBSyxRQUE3QyxFQUF1RCxhQUFhLEtBQUssVUFBekUsRUFBcUYsVUFBVSxLQUFLLE9BQXBHLEVBQTZHLFdBQVcsS0FBSyxRQUE3SDs7QUFFQSxlQUFhLElBQWI7O0FBRUEsYUFBVyxJQUFYOztBQUVBLGVBQWEsSUFBYjs7QUFFQSxtQkFBaUIsSUFBakI7O0FBRUEsZUFBYSxJQUFiOztBQUVBLFdBQVMsSUFBVDs7QUFFQSxZQUFVLElBQVY7O0FBRUEsNkJBQTJCLElBQTNCOztBQUVBLGFBQVcsSUFBWDs7QUFFQSxhQUFXLElBQVg7O0FBRUEsZ0JBQWMsSUFBZDs7QUFFQSxvQkFBa0IsSUFBbEI7O0FBRUEscUJBQW1CLElBQW5COztBQUVBLFNBQU8sT0FBUCxHQUFpQixVQUFXLFlBQVc7QUFDckMsYUFBUyxPQUFULENBQWlCLE9BQWpCLEVBQTBCO0FBQ3hCLFdBQUssTUFBTCxHQUFjLE9BQWQ7QUFDQSxVQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNmLGFBQUssT0FBTCxHQUFlLEtBQUssTUFBTCxDQUFZLE9BQTNCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEtBQUssTUFBTCxDQUFZLFNBQTdCO0FBQ0Q7QUFDRCxXQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsV0FBSyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsV0FBSyxPQUFMLEdBQWUsSUFBZjtBQUNBLFVBQUksQ0FBQyxVQUFMLEVBQWlCO0FBQ2YscUJBQWEsUUFBUSxjQUFSLENBQWI7QUFDQSxtQkFBVyxRQUFRLFlBQVIsQ0FBWDtBQUNBLHFCQUFhLFFBQVEsY0FBUixDQUFiO0FBQ0EseUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7QUFDQSxxQkFBYSxRQUFRLGNBQVIsQ0FBYjtBQUNBLGlCQUFTLFFBQVEsVUFBUixDQUFUO0FBQ0Esa0JBQVUsUUFBUSxXQUFSLENBQVY7QUFDQSxtQ0FBMkIsUUFBUSw0QkFBUixDQUEzQjtBQUNBLG1CQUFXLFFBQVEsWUFBUixDQUFYO0FBQ0EsbUJBQVcsUUFBUSxZQUFSLENBQVg7QUFDQSxzQkFBYyxRQUFRLGVBQVIsQ0FBZDtBQUNBLDBCQUFrQixRQUFRLG1CQUFSLENBQWxCO0FBQ0EsMkJBQW1CLFFBQVEsb0JBQVIsQ0FBbkI7QUFDRDtBQUNGOztBQUVELFdBQU8sY0FBUCxDQUFzQixRQUFRLFNBQTlCLEVBQXlDLFVBQXpDLEVBQXFEO0FBQ25ELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxJQUFaO0FBQ0Q7QUFIa0QsS0FBckQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsVUFBekMsRUFBcUQ7QUFDbkQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLElBQVo7QUFDRDtBQUhrRCxLQUFyRDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsUUFBUSxTQUE5QixFQUF5QyxXQUF6QyxFQUFzRDtBQUNwRCxXQUFLLGVBQVc7QUFDZCxlQUFPLEtBQUssS0FBWjtBQUNEO0FBSG1ELEtBQXREOztBQU1BLFdBQU8sY0FBUCxDQUFzQixRQUFRLFNBQTlCLEVBQXlDLFlBQXpDLEVBQXVEO0FBQ3JELFdBQUssZUFBVztBQUNkLGVBQU8sS0FBSyxNQUFaO0FBQ0Q7QUFIb0QsS0FBdkQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsWUFBekMsRUFBdUQ7QUFDckQsV0FBSyxlQUFXO0FBQ2QsWUFBSSxDQUFDLEtBQUssYUFBTixJQUF1QixDQUFDLEtBQUssYUFBTCxDQUFtQixLQUEvQyxFQUFzRDtBQUNwRCxlQUFLLGFBQUwsR0FBcUIsSUFBSSxXQUFKLENBQWdCLEtBQUssUUFBckIsQ0FBckI7QUFDRDtBQUNELGVBQU8sS0FBSyxhQUFaO0FBQ0Q7QUFOb0QsS0FBdkQ7O0FBU0EsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsWUFBekMsRUFBdUQ7QUFDckQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLFFBQUwsQ0FBYyxDQUFkLEtBQW9CLElBQTNCO0FBQ0Q7QUFIb0QsS0FBdkQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsV0FBekMsRUFBc0Q7QUFDcEQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLFFBQUwsQ0FBYyxLQUFLLFFBQUwsQ0FBYyxNQUFkLEdBQXVCLENBQXJDLEtBQTJDLElBQWxEO0FBQ0Q7QUFIbUQsS0FBdEQ7O0FBTUEsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsaUJBQXpDLEVBQTREO0FBQzFELFdBQUssZUFBVztBQUNkLFlBQUksQ0FBSjtBQUNBLFlBQUksS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQixDQUE2QixJQUE3QixDQUFKO0FBQ0EsZUFBTyxLQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLElBQUksQ0FBekIsS0FBK0IsSUFBdEM7QUFDRDtBQUx5RCxLQUE1RDs7QUFRQSxXQUFPLGNBQVAsQ0FBc0IsUUFBUSxTQUE5QixFQUF5QyxhQUF6QyxFQUF3RDtBQUN0RCxXQUFLLGVBQVc7QUFDZCxZQUFJLENBQUo7QUFDQSxZQUFJLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsT0FBckIsQ0FBNkIsSUFBN0IsQ0FBSjtBQUNBLGVBQU8sS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixJQUFJLENBQXpCLEtBQStCLElBQXRDO0FBQ0Q7QUFMcUQsS0FBeEQ7O0FBUUEsV0FBTyxjQUFQLENBQXNCLFFBQVEsU0FBOUIsRUFBeUMsZUFBekMsRUFBMEQ7QUFDeEQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLFFBQUwsTUFBbUIsSUFBMUI7QUFDRDtBQUh1RCxLQUExRDs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsUUFBUSxTQUE5QixFQUF5QyxhQUF6QyxFQUF3RDtBQUN0RCxXQUFLLGVBQVc7QUFDZCxZQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsR0FBZCxFQUFtQixJQUFuQixFQUF5QixHQUF6QjtBQUNBLFlBQUksS0FBSyxRQUFMLEtBQWtCLFNBQVMsT0FBM0IsSUFBc0MsS0FBSyxRQUFMLEtBQWtCLFNBQVMsZ0JBQXJFLEVBQXVGO0FBQ3JGLGdCQUFNLEVBQU47QUFDQSxpQkFBTyxLQUFLLFFBQVo7QUFDQSxlQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sS0FBSyxNQUF2QixFQUErQixJQUFJLEdBQW5DLEVBQXdDLEdBQXhDLEVBQTZDO0FBQzNDLG9CQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsZ0JBQUksTUFBTSxXQUFWLEVBQXVCO0FBQ3JCLHFCQUFPLE1BQU0sV0FBYjtBQUNEO0FBQ0Y7QUFDRCxpQkFBTyxHQUFQO0FBQ0QsU0FWRCxNQVVPO0FBQ0wsaUJBQU8sSUFBUDtBQUNEO0FBQ0YsT0FoQnFEO0FBaUJ0RCxXQUFLLGFBQVMsS0FBVCxFQUFnQjtBQUNuQixjQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNEO0FBbkJxRCxLQUF4RDs7QUFzQkEsWUFBUSxTQUFSLENBQWtCLFNBQWxCLEdBQThCLFVBQVMsTUFBVCxFQUFpQjtBQUM3QyxVQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsR0FBZCxFQUFtQixJQUFuQixFQUF5QixPQUF6QjtBQUNBLFdBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxVQUFJLE1BQUosRUFBWTtBQUNWLGFBQUssT0FBTCxHQUFlLE9BQU8sT0FBdEI7QUFDQSxhQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QjtBQUNEO0FBQ0QsYUFBTyxLQUFLLFFBQVo7QUFDQSxnQkFBVSxFQUFWO0FBQ0EsV0FBSyxJQUFJLENBQUosRUFBTyxNQUFNLEtBQUssTUFBdkIsRUFBK0IsSUFBSSxHQUFuQyxFQUF3QyxHQUF4QyxFQUE2QztBQUMzQyxnQkFBUSxLQUFLLENBQUwsQ0FBUjtBQUNBLGdCQUFRLElBQVIsQ0FBYSxNQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBYjtBQUNEO0FBQ0QsYUFBTyxPQUFQO0FBQ0QsS0FkRDs7QUFnQkEsWUFBUSxTQUFSLENBQWtCLE9BQWxCLEdBQTRCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDM0QsVUFBSSxTQUFKLEVBQWUsSUFBZixFQUFxQixDQUFyQixFQUF3QixDQUF4QixFQUEyQixHQUEzQixFQUFnQyxTQUFoQyxFQUEyQyxHQUEzQyxFQUFnRCxJQUFoRCxFQUFzRCxJQUF0RCxFQUE0RCxJQUE1RCxFQUFrRSxHQUFsRTtBQUNBLGtCQUFZLElBQVo7QUFDQSxVQUFJLGVBQWUsSUFBZixJQUF3QixRQUFRLElBQXBDLEVBQTJDO0FBQ3pDLGVBQU8sQ0FBQyxFQUFELEVBQUssSUFBTCxDQUFQLEVBQW1CLGFBQWEsS0FBSyxDQUFMLENBQWhDLEVBQXlDLE9BQU8sS0FBSyxDQUFMLENBQWhEO0FBQ0Q7QUFDRCxVQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDdEIscUJBQWEsRUFBYjtBQUNEO0FBQ0QsbUJBQWEsU0FBUyxVQUFULENBQWI7QUFDQSxVQUFJLENBQUMsU0FBUyxVQUFULENBQUwsRUFBMkI7QUFDekIsZUFBTyxDQUFDLFVBQUQsRUFBYSxJQUFiLENBQVAsRUFBMkIsT0FBTyxLQUFLLENBQUwsQ0FBbEMsRUFBMkMsYUFBYSxLQUFLLENBQUwsQ0FBeEQ7QUFDRDtBQUNELFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGVBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNELFVBQUksTUFBTSxPQUFOLENBQWMsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGFBQUssSUFBSSxDQUFKLEVBQU8sTUFBTSxLQUFLLE1BQXZCLEVBQStCLElBQUksR0FBbkMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDM0MsaUJBQU8sS0FBSyxDQUFMLENBQVA7QUFDQSxzQkFBWSxLQUFLLE9BQUwsQ0FBYSxJQUFiLENBQVo7QUFDRDtBQUNGLE9BTEQsTUFLTyxJQUFJLFdBQVcsSUFBWCxDQUFKLEVBQXNCO0FBQzNCLG9CQUFZLEtBQUssT0FBTCxDQUFhLEtBQUssS0FBTCxFQUFiLENBQVo7QUFDRCxPQUZNLE1BRUEsSUFBSSxTQUFTLElBQVQsQ0FBSixFQUFvQjtBQUN6QixhQUFLLEdBQUwsSUFBWSxJQUFaLEVBQWtCO0FBQ2hCLGNBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxJQUFiLEVBQW1CLEdBQW5CLENBQUwsRUFBOEI7QUFDOUIsZ0JBQU0sS0FBSyxHQUFMLENBQU47QUFDQSxjQUFJLFdBQVcsR0FBWCxDQUFKLEVBQXFCO0FBQ25CLGtCQUFNLElBQUksS0FBSixFQUFOO0FBQ0Q7QUFDRCxjQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsZ0JBQWQsSUFBa0MsS0FBSyxTQUFMLENBQWUsYUFBakQsSUFBa0UsSUFBSSxPQUFKLENBQVksS0FBSyxTQUFMLENBQWUsYUFBM0IsTUFBOEMsQ0FBcEgsRUFBdUg7QUFDckgsd0JBQVksS0FBSyxTQUFMLENBQWUsSUFBSSxNQUFKLENBQVcsS0FBSyxTQUFMLENBQWUsYUFBZixDQUE2QixNQUF4QyxDQUFmLEVBQWdFLEdBQWhFLENBQVo7QUFDRCxXQUZELE1BRU8sSUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGtCQUFkLElBQW9DLE1BQU0sT0FBTixDQUFjLEdBQWQsQ0FBcEMsSUFBMEQsUUFBUSxHQUFSLENBQTlELEVBQTRFO0FBQ2pGLHdCQUFZLEtBQUssS0FBTCxFQUFaO0FBQ0QsV0FGTSxNQUVBLElBQUksU0FBUyxHQUFULEtBQWlCLFFBQVEsR0FBUixDQUFyQixFQUFtQztBQUN4Qyx3QkFBWSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBQVo7QUFDRCxXQUZNLE1BRUEsSUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGFBQWQsSUFBZ0MsT0FBTyxJQUEzQyxFQUFrRDtBQUN2RCx3QkFBWSxLQUFLLEtBQUwsRUFBWjtBQUNELFdBRk0sTUFFQSxJQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsa0JBQWQsSUFBb0MsTUFBTSxPQUFOLENBQWMsR0FBZCxDQUF4QyxFQUE0RDtBQUNqRSxpQkFBSyxJQUFJLENBQUosRUFBTyxPQUFPLElBQUksTUFBdkIsRUFBK0IsSUFBSSxJQUFuQyxFQUF5QyxHQUF6QyxFQUE4QztBQUM1QyxxQkFBTyxJQUFJLENBQUosQ0FBUDtBQUNBLDBCQUFZLEVBQVo7QUFDQSx3QkFBVSxHQUFWLElBQWlCLElBQWpCO0FBQ0EsMEJBQVksS0FBSyxPQUFMLENBQWEsU0FBYixDQUFaO0FBQ0Q7QUFDRixXQVBNLE1BT0EsSUFBSSxTQUFTLEdBQVQsQ0FBSixFQUFtQjtBQUN4QixnQkFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGdCQUFkLElBQWtDLEtBQUssU0FBTCxDQUFlLGNBQWpELElBQW1FLElBQUksT0FBSixDQUFZLEtBQUssU0FBTCxDQUFlLGNBQTNCLE1BQStDLENBQXRILEVBQXlIO0FBQ3ZILDBCQUFZLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBWjtBQUNELGFBRkQsTUFFTztBQUNMLDBCQUFZLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBWjtBQUNBLHdCQUFVLE9BQVYsQ0FBa0IsR0FBbEI7QUFDRDtBQUNGLFdBUE0sTUFPQTtBQUNMLHdCQUFZLEtBQUssT0FBTCxDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBWjtBQUNEO0FBQ0Y7QUFDRixPQWpDTSxNQWlDQSxJQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsYUFBZCxJQUErQixTQUFTLElBQTVDLEVBQWtEO0FBQ3ZELG9CQUFZLEtBQUssS0FBTCxFQUFaO0FBQ0QsT0FGTSxNQUVBO0FBQ0wsWUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLGdCQUFkLElBQWtDLEtBQUssU0FBTCxDQUFlLGNBQWpELElBQW1FLEtBQUssT0FBTCxDQUFhLEtBQUssU0FBTCxDQUFlLGNBQTVCLE1BQWdELENBQXZILEVBQTBIO0FBQ3hILHNCQUFZLEtBQUssSUFBTCxDQUFVLElBQVYsQ0FBWjtBQUNELFNBRkQsTUFFTyxJQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsZ0JBQWQsSUFBa0MsS0FBSyxTQUFMLENBQWUsZUFBakQsSUFBb0UsS0FBSyxPQUFMLENBQWEsS0FBSyxTQUFMLENBQWUsZUFBNUIsTUFBaUQsQ0FBekgsRUFBNEg7QUFDakksc0JBQVksS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFaO0FBQ0QsU0FGTSxNQUVBLElBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSxnQkFBZCxJQUFrQyxLQUFLLFNBQUwsQ0FBZSxpQkFBakQsSUFBc0UsS0FBSyxPQUFMLENBQWEsS0FBSyxTQUFMLENBQWUsaUJBQTVCLE1BQW1ELENBQTdILEVBQWdJO0FBQ3JJLHNCQUFZLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBWjtBQUNELFNBRk0sTUFFQSxJQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsZ0JBQWQsSUFBa0MsS0FBSyxTQUFMLENBQWUsYUFBakQsSUFBa0UsS0FBSyxPQUFMLENBQWEsS0FBSyxTQUFMLENBQWUsYUFBNUIsTUFBK0MsQ0FBckgsRUFBd0g7QUFDN0gsc0JBQVksS0FBSyxHQUFMLENBQVMsSUFBVCxDQUFaO0FBQ0QsU0FGTSxNQUVBLElBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSxnQkFBZCxJQUFrQyxLQUFLLFNBQUwsQ0FBZSxZQUFqRCxJQUFpRSxLQUFLLE9BQUwsQ0FBYSxLQUFLLFNBQUwsQ0FBZSxZQUE1QixNQUE4QyxDQUFuSCxFQUFzSDtBQUMzSCxzQkFBWSxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxNQUFMLENBQVksS0FBSyxTQUFMLENBQWUsWUFBZixDQUE0QixNQUF4QyxDQUFqQixFQUFrRSxJQUFsRSxDQUFaO0FBQ0QsU0FGTSxNQUVBO0FBQ0wsc0JBQVksS0FBSyxJQUFMLENBQVUsSUFBVixFQUFnQixVQUFoQixFQUE0QixJQUE1QixDQUFaO0FBQ0Q7QUFDRjtBQUNELFVBQUksYUFBYSxJQUFqQixFQUF1QjtBQUNyQixjQUFNLElBQUksS0FBSixDQUFVLHlDQUF5QyxJQUF6QyxHQUFnRCxJQUFoRCxHQUF1RCxLQUFLLFNBQUwsRUFBakUsQ0FBTjtBQUNEO0FBQ0QsYUFBTyxTQUFQO0FBQ0QsS0E3RUQ7O0FBK0VBLFlBQVEsU0FBUixDQUFrQixZQUFsQixHQUFpQyxVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLElBQTNCLEVBQWlDO0FBQ2hFLFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxRQUFkLEVBQXdCLFFBQXhCLEVBQWtDLE9BQWxDO0FBQ0EsVUFBSSxRQUFRLElBQVIsR0FBZSxLQUFLLElBQXBCLEdBQTJCLEtBQUssQ0FBcEMsRUFBdUM7QUFDckMsbUJBQVcsSUFBWDtBQUNBLG1CQUFXLFVBQVg7QUFDQSxpQkFBUyxTQUFULENBQW1CLElBQW5CO0FBQ0EsWUFBSSxRQUFKLEVBQWM7QUFDWixjQUFJLFNBQVMsT0FBVCxDQUFpQixRQUFqQixDQUFKO0FBQ0Esb0JBQVUsU0FBUyxNQUFULENBQWdCLENBQWhCLENBQVY7QUFDQSxtQkFBUyxJQUFULENBQWMsUUFBZDtBQUNBLGdCQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsS0FBckIsQ0FBMkIsUUFBM0IsRUFBcUMsT0FBckM7QUFDRCxTQUxELE1BS087QUFDTCxtQkFBUyxJQUFULENBQWMsUUFBZDtBQUNEO0FBQ0QsZUFBTyxRQUFQO0FBQ0QsT0FiRCxNQWFPO0FBQ0wsWUFBSSxLQUFLLE1BQVQsRUFBaUI7QUFDZixnQkFBTSxJQUFJLEtBQUosQ0FBVSwyQ0FBMkMsS0FBSyxTQUFMLENBQWUsSUFBZixDQUFyRCxDQUFOO0FBQ0Q7QUFDRCxZQUFJLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsT0FBckIsQ0FBNkIsSUFBN0IsQ0FBSjtBQUNBLGtCQUFVLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsTUFBckIsQ0FBNEIsQ0FBNUIsQ0FBVjtBQUNBLGdCQUFRLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsRUFBMEIsVUFBMUIsRUFBc0MsSUFBdEMsQ0FBUjtBQUNBLGNBQU0sU0FBTixDQUFnQixJQUFoQixDQUFxQixLQUFyQixDQUEyQixLQUFLLE1BQUwsQ0FBWSxRQUF2QyxFQUFpRCxPQUFqRDtBQUNBLGVBQU8sS0FBUDtBQUNEO0FBQ0YsS0F6QkQ7O0FBMkJBLFlBQVEsU0FBUixDQUFrQixXQUFsQixHQUFnQyxVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLElBQTNCLEVBQWlDO0FBQy9ELFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0EsVUFBSSxLQUFLLE1BQVQsRUFBaUI7QUFDZixjQUFNLElBQUksS0FBSixDQUFVLDJDQUEyQyxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQXJELENBQU47QUFDRDtBQUNELFVBQUksS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQixDQUE2QixJQUE3QixDQUFKO0FBQ0EsZ0JBQVUsS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixNQUFyQixDQUE0QixJQUFJLENBQWhDLENBQVY7QUFDQSxjQUFRLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsRUFBMEIsVUFBMUIsRUFBc0MsSUFBdEMsQ0FBUjtBQUNBLFlBQU0sU0FBTixDQUFnQixJQUFoQixDQUFxQixLQUFyQixDQUEyQixLQUFLLE1BQUwsQ0FBWSxRQUF2QyxFQUFpRCxPQUFqRDtBQUNBLGFBQU8sS0FBUDtBQUNELEtBVkQ7O0FBWUEsWUFBUSxTQUFSLENBQWtCLE1BQWxCLEdBQTJCLFlBQVc7QUFDcEMsVUFBSSxDQUFKLEVBQU8sSUFBUDtBQUNBLFVBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2YsY0FBTSxJQUFJLEtBQUosQ0FBVSxxQ0FBcUMsS0FBSyxTQUFMLEVBQS9DLENBQU47QUFDRDtBQUNELFVBQUksS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQixDQUE2QixJQUE3QixDQUFKO0FBQ0EsU0FBRyxNQUFILENBQVUsS0FBVixDQUFnQixLQUFLLE1BQUwsQ0FBWSxRQUE1QixFQUFzQyxDQUFDLENBQUQsRUFBSSxJQUFJLENBQUosR0FBUSxDQUFaLEVBQWUsTUFBZixDQUFzQixPQUFPLEVBQTdCLENBQXRDLEdBQXlFLElBQXpFO0FBQ0EsYUFBTyxLQUFLLE1BQVo7QUFDRCxLQVJEOztBQVVBLFlBQVEsU0FBUixDQUFrQixJQUFsQixHQUF5QixVQUFTLElBQVQsRUFBZSxVQUFmLEVBQTJCLElBQTNCLEVBQWlDO0FBQ3hELFVBQUksS0FBSixFQUFXLElBQVg7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixlQUFPLFNBQVMsSUFBVCxDQUFQO0FBQ0Q7QUFDRCxxQkFBZSxhQUFhLEVBQTVCO0FBQ0EsbUJBQWEsU0FBUyxVQUFULENBQWI7QUFDQSxVQUFJLENBQUMsU0FBUyxVQUFULENBQUwsRUFBMkI7QUFDekIsZUFBTyxDQUFDLFVBQUQsRUFBYSxJQUFiLENBQVAsRUFBMkIsT0FBTyxLQUFLLENBQUwsQ0FBbEMsRUFBMkMsYUFBYSxLQUFLLENBQUwsQ0FBeEQ7QUFDRDtBQUNELGNBQVEsSUFBSSxVQUFKLENBQWUsSUFBZixFQUFxQixJQUFyQixFQUEyQixVQUEzQixDQUFSO0FBQ0EsVUFBSSxRQUFRLElBQVosRUFBa0I7QUFDaEIsY0FBTSxJQUFOLENBQVcsSUFBWDtBQUNEO0FBQ0QsV0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixLQUFuQjtBQUNBLGFBQU8sS0FBUDtBQUNELEtBaEJEOztBQWtCQSxZQUFRLFNBQVIsQ0FBa0IsSUFBbEIsR0FBeUIsVUFBUyxLQUFULEVBQWdCO0FBQ3ZDLFVBQUksS0FBSjtBQUNBLFVBQUksU0FBUyxLQUFULENBQUosRUFBcUI7QUFDbkIsYUFBSyxPQUFMLENBQWEsS0FBYjtBQUNEO0FBQ0QsY0FBUSxJQUFJLE9BQUosQ0FBWSxJQUFaLEVBQWtCLEtBQWxCLENBQVI7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLEtBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FSRDs7QUFVQSxZQUFRLFNBQVIsQ0FBa0IsS0FBbEIsR0FBMEIsVUFBUyxLQUFULEVBQWdCO0FBQ3hDLFVBQUksS0FBSjtBQUNBLGNBQVEsSUFBSSxRQUFKLENBQWEsSUFBYixFQUFtQixLQUFuQixDQUFSO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixLQUFuQjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBTEQ7O0FBT0EsWUFBUSxTQUFSLENBQWtCLE9BQWxCLEdBQTRCLFVBQVMsS0FBVCxFQUFnQjtBQUMxQyxVQUFJLEtBQUo7QUFDQSxjQUFRLElBQUksVUFBSixDQUFlLElBQWYsRUFBcUIsS0FBckIsQ0FBUjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsS0FBbkI7QUFDQSxhQUFPLElBQVA7QUFDRCxLQUxEOztBQU9BLFlBQVEsU0FBUixDQUFrQixhQUFsQixHQUFrQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQsVUFBSSxLQUFKLEVBQVcsQ0FBWCxFQUFjLE9BQWQ7QUFDQSxVQUFJLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsT0FBckIsQ0FBNkIsSUFBN0IsQ0FBSjtBQUNBLGdCQUFVLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsTUFBckIsQ0FBNEIsQ0FBNUIsQ0FBVjtBQUNBLGNBQVEsS0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixLQUFwQixDQUFSO0FBQ0EsWUFBTSxTQUFOLENBQWdCLElBQWhCLENBQXFCLEtBQXJCLENBQTJCLEtBQUssTUFBTCxDQUFZLFFBQXZDLEVBQWlELE9BQWpEO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FQRDs7QUFTQSxZQUFRLFNBQVIsQ0FBa0IsWUFBbEIsR0FBaUMsVUFBUyxLQUFULEVBQWdCO0FBQy9DLFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLE9BQXJCLENBQTZCLElBQTdCLENBQUo7QUFDQSxnQkFBVSxLQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLE1BQXJCLENBQTRCLElBQUksQ0FBaEMsQ0FBVjtBQUNBLGNBQVEsS0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixLQUFwQixDQUFSO0FBQ0EsWUFBTSxTQUFOLENBQWdCLElBQWhCLENBQXFCLEtBQXJCLENBQTJCLEtBQUssTUFBTCxDQUFZLFFBQXZDLEVBQWlELE9BQWpEO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FQRDs7QUFTQSxZQUFRLFNBQVIsQ0FBa0IsR0FBbEIsR0FBd0IsVUFBUyxLQUFULEVBQWdCO0FBQ3RDLFVBQUksS0FBSjtBQUNBLGNBQVEsSUFBSSxNQUFKLENBQVcsSUFBWCxFQUFpQixLQUFqQixDQUFSO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixLQUFuQjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBTEQ7O0FBT0EsWUFBUSxTQUFSLENBQWtCLEtBQWxCLEdBQTBCLFlBQVc7QUFDbkMsVUFBSSxLQUFKO0FBQ0EsY0FBUSxJQUFJLFFBQUosQ0FBYSxJQUFiLENBQVI7QUFDQSxhQUFPLEtBQVA7QUFDRCxLQUpEOztBQU1BLFlBQVEsU0FBUixDQUFrQixXQUFsQixHQUFnQyxVQUFTLE1BQVQsRUFBaUIsS0FBakIsRUFBd0I7QUFDdEQsVUFBSSxTQUFKLEVBQWUsUUFBZixFQUF5QixXQUF6QixFQUFzQyxDQUF0QyxFQUF5QyxHQUF6QztBQUNBLFVBQUksVUFBVSxJQUFkLEVBQW9CO0FBQ2xCLGlCQUFTLFNBQVMsTUFBVCxDQUFUO0FBQ0Q7QUFDRCxVQUFJLFNBQVMsSUFBYixFQUFtQjtBQUNqQixnQkFBUSxTQUFTLEtBQVQsQ0FBUjtBQUNEO0FBQ0QsVUFBSSxNQUFNLE9BQU4sQ0FBYyxNQUFkLENBQUosRUFBMkI7QUFDekIsYUFBSyxJQUFJLENBQUosRUFBTyxNQUFNLE9BQU8sTUFBekIsRUFBaUMsSUFBSSxHQUFyQyxFQUEwQyxHQUExQyxFQUErQztBQUM3QyxzQkFBWSxPQUFPLENBQVAsQ0FBWjtBQUNBLGVBQUssV0FBTCxDQUFpQixTQUFqQjtBQUNEO0FBQ0YsT0FMRCxNQUtPLElBQUksU0FBUyxNQUFULENBQUosRUFBc0I7QUFDM0IsYUFBSyxTQUFMLElBQWtCLE1BQWxCLEVBQTBCO0FBQ3hCLGNBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLFNBQXJCLENBQUwsRUFBc0M7QUFDdEMscUJBQVcsT0FBTyxTQUFQLENBQVg7QUFDQSxlQUFLLFdBQUwsQ0FBaUIsU0FBakIsRUFBNEIsUUFBNUI7QUFDRDtBQUNGLE9BTk0sTUFNQTtBQUNMLFlBQUksV0FBVyxLQUFYLENBQUosRUFBdUI7QUFDckIsa0JBQVEsTUFBTSxLQUFOLEVBQVI7QUFDRDtBQUNELHNCQUFjLElBQUksd0JBQUosQ0FBNkIsSUFBN0IsRUFBbUMsTUFBbkMsRUFBMkMsS0FBM0MsQ0FBZDtBQUNBLGFBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsV0FBbkI7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNELEtBM0JEOztBQTZCQSxZQUFRLFNBQVIsQ0FBa0IsaUJBQWxCLEdBQXNDLFVBQVMsTUFBVCxFQUFpQixLQUFqQixFQUF3QjtBQUM1RCxVQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsT0FBZDtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQixDQUE2QixJQUE3QixDQUFKO0FBQ0EsZ0JBQVUsS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixNQUFyQixDQUE0QixDQUE1QixDQUFWO0FBQ0EsY0FBUSxLQUFLLE1BQUwsQ0FBWSxXQUFaLENBQXdCLE1BQXhCLEVBQWdDLEtBQWhDLENBQVI7QUFDQSxZQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsS0FBckIsQ0FBMkIsS0FBSyxNQUFMLENBQVksUUFBdkMsRUFBaUQsT0FBakQ7QUFDQSxhQUFPLElBQVA7QUFDRCxLQVBEOztBQVNBLFlBQVEsU0FBUixDQUFrQixnQkFBbEIsR0FBcUMsVUFBUyxNQUFULEVBQWlCLEtBQWpCLEVBQXdCO0FBQzNELFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLE9BQXJCLENBQTZCLElBQTdCLENBQUo7QUFDQSxnQkFBVSxLQUFLLE1BQUwsQ0FBWSxRQUFaLENBQXFCLE1BQXJCLENBQTRCLElBQUksQ0FBaEMsQ0FBVjtBQUNBLGNBQVEsS0FBSyxNQUFMLENBQVksV0FBWixDQUF3QixNQUF4QixFQUFnQyxLQUFoQyxDQUFSO0FBQ0EsWUFBTSxTQUFOLENBQWdCLElBQWhCLENBQXFCLEtBQXJCLENBQTJCLEtBQUssTUFBTCxDQUFZLFFBQXZDLEVBQWlELE9BQWpEO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FQRDs7QUFTQSxZQUFRLFNBQVIsQ0FBa0IsV0FBbEIsR0FBZ0MsVUFBUyxPQUFULEVBQWtCLFFBQWxCLEVBQTRCLFVBQTVCLEVBQXdDO0FBQ3RFLFVBQUksR0FBSixFQUFTLE1BQVQ7QUFDQSxZQUFNLEtBQUssUUFBTCxFQUFOO0FBQ0EsZUFBUyxJQUFJLGNBQUosQ0FBbUIsR0FBbkIsRUFBd0IsT0FBeEIsRUFBaUMsUUFBakMsRUFBMkMsVUFBM0MsQ0FBVDtBQUNBLFVBQUksSUFBSSxRQUFKLENBQWEsTUFBYixLQUF3QixDQUE1QixFQUErQjtBQUM3QixZQUFJLFFBQUosQ0FBYSxPQUFiLENBQXFCLE1BQXJCO0FBQ0QsT0FGRCxNQUVPLElBQUksSUFBSSxRQUFKLENBQWEsQ0FBYixFQUFnQixJQUFoQixLQUF5QixTQUFTLFdBQXRDLEVBQW1EO0FBQ3hELFlBQUksUUFBSixDQUFhLENBQWIsSUFBa0IsTUFBbEI7QUFDRCxPQUZNLE1BRUE7QUFDTCxZQUFJLFFBQUosQ0FBYSxPQUFiLENBQXFCLE1BQXJCO0FBQ0Q7QUFDRCxhQUFPLElBQUksSUFBSixNQUFjLEdBQXJCO0FBQ0QsS0FaRDs7QUFjQSxZQUFRLFNBQVIsQ0FBa0IsR0FBbEIsR0FBd0IsVUFBUyxLQUFULEVBQWdCLEtBQWhCLEVBQXVCO0FBQzdDLFVBQUksS0FBSixFQUFXLEdBQVgsRUFBZ0IsT0FBaEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsRUFBK0IsQ0FBL0IsRUFBa0MsR0FBbEMsRUFBdUMsSUFBdkMsRUFBNkMsSUFBN0MsRUFBbUQsSUFBbkQ7QUFDQSxZQUFNLEtBQUssUUFBTCxFQUFOO0FBQ0EsZ0JBQVUsSUFBSSxVQUFKLENBQWUsR0FBZixFQUFvQixLQUFwQixFQUEyQixLQUEzQixDQUFWO0FBQ0EsYUFBTyxJQUFJLFFBQVg7QUFDQSxXQUFLLElBQUksSUFBSSxDQUFSLEVBQVcsTUFBTSxLQUFLLE1BQTNCLEVBQW1DLElBQUksR0FBdkMsRUFBNEMsSUFBSSxFQUFFLENBQWxELEVBQXFEO0FBQ25ELGdCQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsWUFBSSxNQUFNLElBQU4sS0FBZSxTQUFTLE9BQTVCLEVBQXFDO0FBQ25DLGNBQUksUUFBSixDQUFhLENBQWIsSUFBa0IsT0FBbEI7QUFDQSxpQkFBTyxPQUFQO0FBQ0Q7QUFDRjtBQUNELGFBQU8sSUFBSSxRQUFYO0FBQ0EsV0FBSyxJQUFJLElBQUksQ0FBUixFQUFXLE9BQU8sS0FBSyxNQUE1QixFQUFvQyxJQUFJLElBQXhDLEVBQThDLElBQUksRUFBRSxDQUFwRCxFQUF1RDtBQUNyRCxnQkFBUSxLQUFLLENBQUwsQ0FBUjtBQUNBLFlBQUksTUFBTSxNQUFWLEVBQWtCO0FBQ2hCLGNBQUksUUFBSixDQUFhLE1BQWIsQ0FBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsRUFBMEIsT0FBMUI7QUFDQSxpQkFBTyxPQUFQO0FBQ0Q7QUFDRjtBQUNELFVBQUksUUFBSixDQUFhLElBQWIsQ0FBa0IsT0FBbEI7QUFDQSxhQUFPLE9BQVA7QUFDRCxLQXRCRDs7QUF3QkEsWUFBUSxTQUFSLENBQWtCLEVBQWxCLEdBQXVCLFlBQVc7QUFDaEMsVUFBSSxLQUFLLE1BQVQsRUFBaUI7QUFDZixjQUFNLElBQUksS0FBSixDQUFVLGdGQUFWLENBQU47QUFDRDtBQUNELGFBQU8sS0FBSyxNQUFaO0FBQ0QsS0FMRDs7QUFPQSxZQUFRLFNBQVIsQ0FBa0IsSUFBbEIsR0FBeUIsWUFBVztBQUNsQyxVQUFJLElBQUo7QUFDQSxhQUFPLElBQVA7QUFDQSxhQUFPLElBQVAsRUFBYTtBQUNYLFlBQUksS0FBSyxJQUFMLEtBQWMsU0FBUyxRQUEzQixFQUFxQztBQUNuQyxpQkFBTyxLQUFLLFVBQVo7QUFDRCxTQUZELE1BRU8sSUFBSSxLQUFLLE1BQVQsRUFBaUI7QUFDdEIsaUJBQU8sSUFBUDtBQUNELFNBRk0sTUFFQTtBQUNMLGlCQUFPLEtBQUssTUFBWjtBQUNEO0FBQ0Y7QUFDRixLQVpEOztBQWNBLFlBQVEsU0FBUixDQUFrQixRQUFsQixHQUE2QixZQUFXO0FBQ3RDLFVBQUksSUFBSjtBQUNBLGFBQU8sSUFBUDtBQUNBLGFBQU8sSUFBUCxFQUFhO0FBQ1gsWUFBSSxLQUFLLElBQUwsS0FBYyxTQUFTLFFBQTNCLEVBQXFDO0FBQ25DLGlCQUFPLElBQVA7QUFDRCxTQUZELE1BRU87QUFDTCxpQkFBTyxLQUFLLE1BQVo7QUFDRDtBQUNGO0FBQ0YsS0FWRDs7QUFZQSxZQUFRLFNBQVIsQ0FBa0IsR0FBbEIsR0FBd0IsVUFBUyxPQUFULEVBQWtCO0FBQ3hDLGFBQU8sS0FBSyxRQUFMLEdBQWdCLEdBQWhCLENBQW9CLE9BQXBCLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixJQUFsQixHQUF5QixZQUFXO0FBQ2xDLFVBQUksQ0FBSjtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQixDQUE2QixJQUE3QixDQUFKO0FBQ0EsVUFBSSxJQUFJLENBQVIsRUFBVztBQUNULGNBQU0sSUFBSSxLQUFKLENBQVUsZ0NBQWdDLEtBQUssU0FBTCxFQUExQyxDQUFOO0FBQ0Q7QUFDRCxhQUFPLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsSUFBSSxDQUF6QixDQUFQO0FBQ0QsS0FQRDs7QUFTQSxZQUFRLFNBQVIsQ0FBa0IsSUFBbEIsR0FBeUIsWUFBVztBQUNsQyxVQUFJLENBQUo7QUFDQSxVQUFJLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsT0FBckIsQ0FBNkIsSUFBN0IsQ0FBSjtBQUNBLFVBQUksTUFBTSxDQUFDLENBQVAsSUFBWSxNQUFNLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsTUFBckIsR0FBOEIsQ0FBcEQsRUFBdUQ7QUFDckQsY0FBTSxJQUFJLEtBQUosQ0FBVSwrQkFBK0IsS0FBSyxTQUFMLEVBQXpDLENBQU47QUFDRDtBQUNELGFBQU8sS0FBSyxNQUFMLENBQVksUUFBWixDQUFxQixJQUFJLENBQXpCLENBQVA7QUFDRCxLQVBEOztBQVNBLFlBQVEsU0FBUixDQUFrQixjQUFsQixHQUFtQyxVQUFTLEdBQVQsRUFBYztBQUMvQyxVQUFJLFVBQUo7QUFDQSxtQkFBYSxJQUFJLElBQUosR0FBVyxLQUFYLEVBQWI7QUFDQSxpQkFBVyxNQUFYLEdBQW9CLElBQXBCO0FBQ0EsaUJBQVcsTUFBWCxHQUFvQixLQUFwQjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsVUFBbkI7QUFDQSxhQUFPLElBQVA7QUFDRCxLQVBEOztBQVNBLFlBQVEsU0FBUixDQUFrQixTQUFsQixHQUE4QixVQUFTLElBQVQsRUFBZTtBQUMzQyxVQUFJLElBQUosRUFBVSxJQUFWO0FBQ0EsYUFBTyxRQUFRLEtBQUssSUFBcEI7QUFDQSxVQUFLLFFBQVEsSUFBVCxJQUFrQixFQUFFLENBQUMsT0FBTyxLQUFLLE1BQWIsS0FBd0IsSUFBeEIsR0FBK0IsS0FBSyxJQUFwQyxHQUEyQyxLQUFLLENBQWxELENBQXRCLEVBQTRFO0FBQzFFLGVBQU8sRUFBUDtBQUNELE9BRkQsTUFFTyxJQUFJLFFBQVEsSUFBWixFQUFrQjtBQUN2QixlQUFPLGNBQWMsS0FBSyxNQUFMLENBQVksSUFBMUIsR0FBaUMsR0FBeEM7QUFDRCxPQUZNLE1BRUEsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLE1BQWIsS0FBd0IsSUFBeEIsR0FBK0IsS0FBSyxJQUFwQyxHQUEyQyxLQUFLLENBQWxELENBQUosRUFBMEQ7QUFDL0QsZUFBTyxZQUFZLElBQVosR0FBbUIsR0FBMUI7QUFDRCxPQUZNLE1BRUE7QUFDTCxlQUFPLFlBQVksSUFBWixHQUFtQixjQUFuQixHQUFvQyxLQUFLLE1BQUwsQ0FBWSxJQUFoRCxHQUF1RCxHQUE5RDtBQUNEO0FBQ0YsS0FaRDs7QUFjQSxZQUFRLFNBQVIsQ0FBa0IsR0FBbEIsR0FBd0IsVUFBUyxJQUFULEVBQWUsVUFBZixFQUEyQixJQUEzQixFQUFpQztBQUN2RCxhQUFPLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsVUFBbkIsRUFBK0IsSUFBL0IsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLEdBQWxCLEdBQXdCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDdkQsYUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQWdCLFVBQWhCLEVBQTRCLElBQTVCLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixHQUFsQixHQUF3QixVQUFTLEtBQVQsRUFBZ0I7QUFDdEMsYUFBTyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixHQUFsQixHQUF3QixVQUFTLEtBQVQsRUFBZ0I7QUFDdEMsYUFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixHQUFsQixHQUF3QixVQUFTLEtBQVQsRUFBZ0I7QUFDdEMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixHQUFsQixHQUF3QixVQUFTLE1BQVQsRUFBaUIsS0FBakIsRUFBd0I7QUFDOUMsYUFBTyxLQUFLLFdBQUwsQ0FBaUIsTUFBakIsRUFBeUIsS0FBekIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLEdBQWxCLEdBQXdCLFlBQVc7QUFDakMsYUFBTyxLQUFLLFFBQUwsRUFBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLEdBQWxCLEdBQXdCLFVBQVMsT0FBVCxFQUFrQixRQUFsQixFQUE0QixVQUE1QixFQUF3QztBQUM5RCxhQUFPLEtBQUssV0FBTCxDQUFpQixPQUFqQixFQUEwQixRQUExQixFQUFvQyxVQUFwQyxDQUFQO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsQ0FBbEIsR0FBc0IsVUFBUyxJQUFULEVBQWUsVUFBZixFQUEyQixJQUEzQixFQUFpQztBQUNyRCxhQUFPLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsVUFBbkIsRUFBK0IsSUFBL0IsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLENBQWxCLEdBQXNCLFVBQVMsSUFBVCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsRUFBaUM7QUFDckQsYUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFWLEVBQWdCLFVBQWhCLEVBQTRCLElBQTVCLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixDQUFsQixHQUFzQixVQUFTLEtBQVQsRUFBZ0I7QUFDcEMsYUFBTyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixDQUFsQixHQUFzQixVQUFTLEtBQVQsRUFBZ0I7QUFDcEMsYUFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFYLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixDQUFsQixHQUFzQixVQUFTLEtBQVQsRUFBZ0I7QUFDcEMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixDQUFsQixHQUFzQixVQUFTLEtBQVQsRUFBZ0I7QUFDcEMsYUFBTyxLQUFLLEdBQUwsQ0FBUyxLQUFULENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixDQUFsQixHQUFzQixVQUFTLE1BQVQsRUFBaUIsS0FBakIsRUFBd0I7QUFDNUMsYUFBTyxLQUFLLFdBQUwsQ0FBaUIsTUFBakIsRUFBeUIsS0FBekIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLENBQWxCLEdBQXNCLFlBQVc7QUFDL0IsYUFBTyxLQUFLLEVBQUwsRUFBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLGdCQUFsQixHQUFxQyxVQUFTLEdBQVQsRUFBYztBQUNqRCxhQUFPLEtBQUssY0FBTCxDQUFvQixHQUFwQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsWUFBbEIsR0FBaUMsVUFBUyxRQUFULEVBQW1CLFFBQW5CLEVBQTZCO0FBQzVELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsV0FBbEIsR0FBZ0MsVUFBUyxRQUFULEVBQW1CO0FBQ2pELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsV0FBbEIsR0FBZ0MsVUFBUyxRQUFULEVBQW1CO0FBQ2pELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsYUFBbEIsR0FBa0MsWUFBVztBQUMzQyxhQUFPLEtBQUssUUFBTCxDQUFjLE1BQWQsS0FBeUIsQ0FBaEM7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixTQUFsQixHQUE4QixVQUFTLElBQVQsRUFBZTtBQUMzQyxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLFNBQWxCLEdBQThCLFlBQVc7QUFDdkMsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixXQUFsQixHQUFnQyxVQUFTLE9BQVQsRUFBa0IsT0FBbEIsRUFBMkI7QUFDekQsYUFBTyxJQUFQO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsYUFBbEIsR0FBa0MsWUFBVztBQUMzQyxhQUFPLEtBQUssT0FBTCxDQUFhLE1BQWIsS0FBd0IsQ0FBL0I7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQix1QkFBbEIsR0FBNEMsVUFBUyxLQUFULEVBQWdCO0FBQzFELFVBQUksR0FBSixFQUFTLEdBQVQ7QUFDQSxZQUFNLElBQU47QUFDQSxVQUFJLFFBQVEsS0FBWixFQUFtQjtBQUNqQixlQUFPLENBQVA7QUFDRCxPQUZELE1BRU8sSUFBSSxLQUFLLFFBQUwsT0FBb0IsTUFBTSxRQUFOLEVBQXhCLEVBQTBDO0FBQy9DLGNBQU0saUJBQWlCLFlBQWpCLEdBQWdDLGlCQUFpQixzQkFBdkQ7QUFDQSxZQUFJLEtBQUssTUFBTCxLQUFnQixHQUFwQixFQUF5QjtBQUN2QixpQkFBTyxpQkFBaUIsU0FBeEI7QUFDRCxTQUZELE1BRU87QUFDTCxpQkFBTyxpQkFBaUIsU0FBeEI7QUFDRDtBQUNELGVBQU8sR0FBUDtBQUNELE9BUk0sTUFRQSxJQUFJLElBQUksVUFBSixDQUFlLEtBQWYsQ0FBSixFQUEyQjtBQUNoQyxlQUFPLGlCQUFpQixRQUFqQixHQUE0QixpQkFBaUIsU0FBcEQ7QUFDRCxPQUZNLE1BRUEsSUFBSSxJQUFJLFlBQUosQ0FBaUIsS0FBakIsQ0FBSixFQUE2QjtBQUNsQyxlQUFPLGlCQUFpQixRQUFqQixHQUE0QixpQkFBaUIsU0FBcEQ7QUFDRCxPQUZNLE1BRUEsSUFBSSxJQUFJLFdBQUosQ0FBZ0IsS0FBaEIsQ0FBSixFQUE0QjtBQUNqQyxlQUFPLGlCQUFpQixTQUF4QjtBQUNELE9BRk0sTUFFQTtBQUNMLGVBQU8saUJBQWlCLFNBQXhCO0FBQ0Q7QUFDRixLQXRCRDs7QUF3QkEsWUFBUSxTQUFSLENBQWtCLFVBQWxCLEdBQStCLFVBQVMsS0FBVCxFQUFnQjtBQUM3QyxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLFlBQWxCLEdBQWlDLFVBQVMsWUFBVCxFQUF1QjtBQUN0RCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLGtCQUFsQixHQUF1QyxVQUFTLFlBQVQsRUFBdUI7QUFDNUQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixrQkFBbEIsR0FBdUMsVUFBUyxNQUFULEVBQWlCO0FBQ3RELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsV0FBbEIsR0FBZ0MsVUFBUyxJQUFULEVBQWU7QUFDN0MsVUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLElBQVY7QUFDQSxVQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFFBQTNCLEVBQXFDO0FBQ25DLGVBQU8sS0FBUDtBQUNEO0FBQ0QsVUFBSSxLQUFLLFFBQUwsQ0FBYyxNQUFkLEtBQXlCLEtBQUssUUFBTCxDQUFjLE1BQTNDLEVBQW1EO0FBQ2pELGVBQU8sS0FBUDtBQUNEO0FBQ0QsV0FBSyxJQUFJLElBQUksQ0FBUixFQUFXLE9BQU8sS0FBSyxRQUFMLENBQWMsTUFBZCxHQUF1QixDQUE5QyxFQUFpRCxLQUFLLElBQUwsR0FBWSxLQUFLLElBQWpCLEdBQXdCLEtBQUssSUFBOUUsRUFBb0YsSUFBSSxLQUFLLElBQUwsR0FBWSxFQUFFLENBQWQsR0FBa0IsRUFBRSxDQUE1RyxFQUErRztBQUM3RyxZQUFJLENBQUMsS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQixXQUFqQixDQUE2QixLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQTdCLENBQUwsRUFBcUQ7QUFDbkQsaUJBQU8sS0FBUDtBQUNEO0FBQ0Y7QUFDRCxhQUFPLElBQVA7QUFDRCxLQWREOztBQWdCQSxZQUFRLFNBQVIsQ0FBa0IsVUFBbEIsR0FBK0IsVUFBUyxPQUFULEVBQWtCLE9BQWxCLEVBQTJCO0FBQ3hELFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsV0FBbEIsR0FBZ0MsVUFBUyxHQUFULEVBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QjtBQUMzRCxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLFdBQWxCLEdBQWdDLFVBQVMsR0FBVCxFQUFjO0FBQzVDLFlBQU0sSUFBSSxLQUFKLENBQVUsd0NBQXdDLEtBQUssU0FBTCxFQUFsRCxDQUFOO0FBQ0QsS0FGRDs7QUFJQSxZQUFRLFNBQVIsQ0FBa0IsUUFBbEIsR0FBNkIsVUFBUyxLQUFULEVBQWdCO0FBQzNDLFVBQUksQ0FBQyxLQUFMLEVBQVk7QUFDVixlQUFPLEtBQVA7QUFDRDtBQUNELGFBQU8sVUFBVSxJQUFWLElBQWtCLEtBQUssWUFBTCxDQUFrQixLQUFsQixDQUF6QjtBQUNELEtBTEQ7O0FBT0EsWUFBUSxTQUFSLENBQWtCLFlBQWxCLEdBQWlDLFVBQVMsSUFBVCxFQUFlO0FBQzlDLFVBQUksS0FBSixFQUFXLGlCQUFYLEVBQThCLENBQTlCLEVBQWlDLEdBQWpDLEVBQXNDLElBQXRDO0FBQ0EsYUFBTyxLQUFLLFFBQVo7QUFDQSxXQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sS0FBSyxNQUF2QixFQUErQixJQUFJLEdBQW5DLEVBQXdDLEdBQXhDLEVBQTZDO0FBQzNDLGdCQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsWUFBSSxTQUFTLEtBQWIsRUFBb0I7QUFDbEIsaUJBQU8sSUFBUDtBQUNEO0FBQ0QsNEJBQW9CLE1BQU0sWUFBTixDQUFtQixJQUFuQixDQUFwQjtBQUNBLFlBQUksaUJBQUosRUFBdUI7QUFDckIsaUJBQU8sSUFBUDtBQUNEO0FBQ0Y7QUFDRCxhQUFPLEtBQVA7QUFDRCxLQWREOztBQWdCQSxZQUFRLFNBQVIsQ0FBa0IsVUFBbEIsR0FBK0IsVUFBUyxJQUFULEVBQWU7QUFDNUMsYUFBTyxLQUFLLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLFdBQWxCLEdBQWdDLFVBQVMsSUFBVCxFQUFlO0FBQzdDLFVBQUksT0FBSixFQUFhLE9BQWI7QUFDQSxnQkFBVSxLQUFLLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBVjtBQUNBLGdCQUFVLEtBQUssWUFBTCxDQUFrQixJQUFsQixDQUFWO0FBQ0EsVUFBSSxZQUFZLENBQUMsQ0FBYixJQUFrQixZQUFZLENBQUMsQ0FBbkMsRUFBc0M7QUFDcEMsZUFBTyxLQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxVQUFVLE9BQWpCO0FBQ0Q7QUFDRixLQVREOztBQVdBLFlBQVEsU0FBUixDQUFrQixXQUFsQixHQUFnQyxVQUFTLElBQVQsRUFBZTtBQUM3QyxVQUFJLE9BQUosRUFBYSxPQUFiO0FBQ0EsZ0JBQVUsS0FBSyxZQUFMLENBQWtCLElBQWxCLENBQVY7QUFDQSxnQkFBVSxLQUFLLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBVjtBQUNBLFVBQUksWUFBWSxDQUFDLENBQWIsSUFBa0IsWUFBWSxDQUFDLENBQW5DLEVBQXNDO0FBQ3BDLGVBQU8sS0FBUDtBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8sVUFBVSxPQUFqQjtBQUNEO0FBQ0YsS0FURDs7QUFXQSxZQUFRLFNBQVIsQ0FBa0IsWUFBbEIsR0FBaUMsVUFBUyxJQUFULEVBQWU7QUFDOUMsVUFBSSxLQUFKLEVBQVcsR0FBWDtBQUNBLFlBQU0sQ0FBTjtBQUNBLGNBQVEsS0FBUjtBQUNBLFdBQUssZUFBTCxDQUFxQixLQUFLLFFBQUwsRUFBckIsRUFBc0MsVUFBUyxTQUFULEVBQW9CO0FBQ3hEO0FBQ0EsWUFBSSxDQUFDLEtBQUQsSUFBVSxjQUFjLElBQTVCLEVBQWtDO0FBQ2hDLGlCQUFPLFFBQVEsSUFBZjtBQUNEO0FBQ0YsT0FMRDtBQU1BLFVBQUksS0FBSixFQUFXO0FBQ1QsZUFBTyxHQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxDQUFDLENBQVI7QUFDRDtBQUNGLEtBZkQ7O0FBaUJBLFlBQVEsU0FBUixDQUFrQixlQUFsQixHQUFvQyxVQUFTLElBQVQsRUFBZSxJQUFmLEVBQXFCO0FBQ3ZELFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLElBQW5CLEVBQXlCLEdBQXpCO0FBQ0EsZUFBUyxPQUFPLEtBQUssUUFBTCxFQUFoQjtBQUNBLGFBQU8sS0FBSyxRQUFaO0FBQ0EsV0FBSyxJQUFJLENBQUosRUFBTyxNQUFNLEtBQUssTUFBdkIsRUFBK0IsSUFBSSxHQUFuQyxFQUF3QyxHQUF4QyxFQUE2QztBQUMzQyxnQkFBUSxLQUFLLENBQUwsQ0FBUjtBQUNBLFlBQUksTUFBTSxLQUFLLEtBQUwsQ0FBVixFQUF1QjtBQUNyQixpQkFBTyxHQUFQO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsZ0JBQU0sS0FBSyxlQUFMLENBQXFCLEtBQXJCLEVBQTRCLElBQTVCLENBQU47QUFDQSxjQUFJLEdBQUosRUFBUztBQUNQLG1CQUFPLEdBQVA7QUFDRDtBQUNGO0FBQ0Y7QUFDRixLQWZEOztBQWlCQSxXQUFPLE9BQVA7QUFFRCxHQTd1QjBCLEVBQTNCO0FBK3VCRCxDQS93QkQsRUErd0JHLElBL3dCSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksV0FBSjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsY0FBZSxZQUFXO0FBQ3pDLGFBQVMsV0FBVCxDQUFxQixLQUFyQixFQUE0QjtBQUMxQixXQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0Q7O0FBRUQsV0FBTyxjQUFQLENBQXNCLFlBQVksU0FBbEMsRUFBNkMsUUFBN0MsRUFBdUQ7QUFDckQsV0FBSyxlQUFXO0FBQ2QsZUFBTyxLQUFLLEtBQUwsQ0FBVyxNQUFYLElBQXFCLENBQTVCO0FBQ0Q7QUFIb0QsS0FBdkQ7O0FBTUEsZ0JBQVksU0FBWixDQUFzQixLQUF0QixHQUE4QixZQUFXO0FBQ3ZDLGFBQU8sS0FBSyxLQUFMLEdBQWEsSUFBcEI7QUFDRCxLQUZEOztBQUlBLGdCQUFZLFNBQVosQ0FBc0IsSUFBdEIsR0FBNkIsVUFBUyxLQUFULEVBQWdCO0FBQzNDLGFBQU8sS0FBSyxLQUFMLENBQVcsS0FBWCxLQUFxQixJQUE1QjtBQUNELEtBRkQ7O0FBSUEsV0FBTyxXQUFQO0FBRUQsR0FyQjhCLEVBQS9CO0FBdUJELENBMUJELEVBMEJHLElBMUJIOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxnQkFBZDtBQUFBLE1BQWdDLHdCQUFoQztBQUFBLE1BQ0UsU0FBUyxTQUFULE1BQVMsQ0FBUyxLQUFULEVBQWdCLE1BQWhCLEVBQXdCO0FBQUUsU0FBSyxJQUFJLEdBQVQsSUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxVQUFJLFFBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsR0FBckIsQ0FBSixFQUErQixNQUFNLEdBQU4sSUFBYSxPQUFPLEdBQVAsQ0FBYjtBQUEyQixLQUFDLFNBQVMsSUFBVCxHQUFnQjtBQUFFLFdBQUssV0FBTCxHQUFtQixLQUFuQjtBQUEyQixLQUFDLEtBQUssU0FBTCxHQUFpQixPQUFPLFNBQXhCLENBQW1DLE1BQU0sU0FBTixHQUFrQixJQUFJLElBQUosRUFBbEIsQ0FBOEIsTUFBTSxTQUFOLEdBQWtCLE9BQU8sU0FBekIsQ0FBb0MsT0FBTyxLQUFQO0FBQWUsR0FENVI7QUFBQSxNQUVFLFVBQVUsR0FBRyxjQUZmOztBQUlBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEscUJBQW1CLFFBQVEsb0JBQVIsQ0FBbkI7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLDJCQUE0QixVQUFTLFVBQVQsRUFBcUI7QUFDaEUsV0FBTyx3QkFBUCxFQUFpQyxVQUFqQzs7QUFFQSxhQUFTLHdCQUFULENBQWtDLE1BQWxDLEVBQTBDLE1BQTFDLEVBQWtELEtBQWxELEVBQXlEO0FBQ3ZELCtCQUF5QixTQUF6QixDQUFtQyxXQUFuQyxDQUErQyxJQUEvQyxDQUFvRCxJQUFwRCxFQUEwRCxNQUExRDtBQUNBLFVBQUksVUFBVSxJQUFkLEVBQW9CO0FBQ2xCLGNBQU0sSUFBSSxLQUFKLENBQVUsaUNBQWlDLEtBQUssU0FBTCxFQUEzQyxDQUFOO0FBQ0Q7QUFDRCxXQUFLLElBQUwsR0FBWSxTQUFTLHFCQUFyQjtBQUNBLFdBQUssTUFBTCxHQUFjLEtBQUssU0FBTCxDQUFlLFNBQWYsQ0FBeUIsTUFBekIsQ0FBZDtBQUNBLFdBQUssSUFBTCxHQUFZLEtBQUssTUFBakI7QUFDQSxVQUFJLEtBQUosRUFBVztBQUNULGFBQUssS0FBTCxHQUFhLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBd0IsS0FBeEIsQ0FBYjtBQUNEO0FBQ0Y7O0FBRUQsNkJBQXlCLFNBQXpCLENBQW1DLEtBQW5DLEdBQTJDLFlBQVc7QUFDcEQsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLDZCQUF5QixTQUF6QixDQUFtQyxRQUFuQyxHQUE4QyxVQUFTLE9BQVQsRUFBa0I7QUFDOUQsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLHFCQUFwQixDQUEwQyxJQUExQyxFQUFnRCxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLGFBQXBCLENBQWtDLE9BQWxDLENBQWhELENBQVA7QUFDRCxLQUZEOztBQUlBLDZCQUF5QixTQUF6QixDQUFtQyxXQUFuQyxHQUFpRCxVQUFTLElBQVQsRUFBZTtBQUM5RCxVQUFJLENBQUMseUJBQXlCLFNBQXpCLENBQW1DLFdBQW5DLENBQStDLEtBQS9DLENBQXFELElBQXJELEVBQTJELFNBQTNELEVBQXNFLFdBQXRFLENBQWtGLElBQWxGLENBQUwsRUFBOEY7QUFDNUYsZUFBTyxLQUFQO0FBQ0Q7QUFDRCxVQUFJLEtBQUssTUFBTCxLQUFnQixLQUFLLE1BQXpCLEVBQWlDO0FBQy9CLGVBQU8sS0FBUDtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0QsS0FSRDs7QUFVQSxXQUFPLHdCQUFQO0FBRUQsR0FwQzJDLENBb0N6QyxnQkFwQ3lDLENBQTVDO0FBc0NELENBL0NELEVBK0NHLElBL0NIOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxPQUFkO0FBQUEsTUFBdUIsTUFBdkI7QUFBQSxNQUNFLFNBQVMsU0FBVCxNQUFTLENBQVMsS0FBVCxFQUFnQixNQUFoQixFQUF3QjtBQUFFLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQUUsVUFBSSxRQUFRLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEdBQXJCLENBQUosRUFBK0IsTUFBTSxHQUFOLElBQWEsT0FBTyxHQUFQLENBQWI7QUFBMkIsS0FBQyxTQUFTLElBQVQsR0FBZ0I7QUFBRSxXQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFBMkIsS0FBQyxLQUFLLFNBQUwsR0FBaUIsT0FBTyxTQUF4QixDQUFtQyxNQUFNLFNBQU4sR0FBa0IsSUFBSSxJQUFKLEVBQWxCLENBQThCLE1BQU0sU0FBTixHQUFrQixPQUFPLFNBQXpCLENBQW9DLE9BQU8sS0FBUDtBQUFlLEdBRDVSO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxhQUFXLFFBQVEsWUFBUixDQUFYOztBQUVBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLFNBQVUsVUFBUyxVQUFULEVBQXFCO0FBQzlDLFdBQU8sTUFBUCxFQUFlLFVBQWY7O0FBRUEsYUFBUyxNQUFULENBQWdCLE1BQWhCLEVBQXdCLElBQXhCLEVBQThCO0FBQzVCLGFBQU8sU0FBUCxDQUFpQixXQUFqQixDQUE2QixJQUE3QixDQUFrQyxJQUFsQyxFQUF3QyxNQUF4QztBQUNBLFVBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2hCLGNBQU0sSUFBSSxLQUFKLENBQVUsdUJBQXVCLEtBQUssU0FBTCxFQUFqQyxDQUFOO0FBQ0Q7QUFDRCxXQUFLLElBQUwsR0FBWSxTQUFTLEdBQXJCO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxTQUFMLENBQWUsR0FBZixDQUFtQixJQUFuQixDQUFiO0FBQ0Q7O0FBRUQsV0FBTyxTQUFQLENBQWlCLEtBQWpCLEdBQXlCLFlBQVc7QUFDbEMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLFdBQU8sU0FBUCxDQUFpQixRQUFqQixHQUE0QixVQUFTLE9BQVQsRUFBa0I7QUFDNUMsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLEdBQXBCLENBQXdCLElBQXhCLEVBQThCLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBOUIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsV0FBTyxNQUFQO0FBRUQsR0F0QnlCLENBc0J2QixPQXRCdUIsQ0FBMUI7QUF3QkQsQ0FqQ0QsRUFpQ0csSUFqQ0g7Ozs7O0FDREE7QUFDQSxDQUFDLFlBQVc7QUFDVixNQUFJLFFBQUo7QUFBQSxNQUFjLFdBQWQ7QUFBQSxNQUEyQixlQUEzQjtBQUFBLE1BQTRDLGFBQTVDO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxrQkFBZ0IsUUFBUSxpQkFBUixDQUFoQjs7QUFFQSxnQkFBYyxRQUFRLGVBQVIsQ0FBZDs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsa0JBQW1CLFVBQVMsVUFBVCxFQUFxQjtBQUN2RCxXQUFPLGVBQVAsRUFBd0IsVUFBeEI7O0FBRUEsYUFBUyxlQUFULENBQXlCLE1BQXpCLEVBQWlDLE9BQWpDLEVBQTBDO0FBQ3hDLFdBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxzQkFBZ0IsU0FBaEIsQ0FBMEIsV0FBMUIsQ0FBc0MsSUFBdEMsQ0FBMkMsSUFBM0MsRUFBaUQsT0FBakQ7QUFDRDs7QUFFRCxvQkFBZ0IsU0FBaEIsQ0FBMEIsT0FBMUIsR0FBb0MsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUNqRSxVQUFJLEtBQUssY0FBTCxJQUF1QixRQUFRLEtBQVIsS0FBa0IsWUFBWSxRQUF6RCxFQUFtRTtBQUNqRSxlQUFPLEVBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLGdCQUFnQixTQUFoQixDQUEwQixPQUExQixDQUFrQyxJQUFsQyxDQUF1QyxJQUF2QyxFQUE2QyxJQUE3QyxFQUFtRCxPQUFuRCxFQUE0RCxLQUE1RCxDQUFQO0FBQ0Q7QUFDRixLQU5EOztBQVFBLG9CQUFnQixTQUFoQixDQUEwQixRQUExQixHQUFxQyxVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCO0FBQzFELFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxDQUFkLEVBQWlCLENBQWpCLEVBQW9CLEdBQXBCLEVBQXlCLElBQXpCLEVBQStCLEdBQS9CLEVBQW9DLElBQXBDLEVBQTBDLE9BQTFDO0FBQ0EsWUFBTSxJQUFJLFFBQVY7QUFDQSxXQUFLLElBQUksSUFBSSxDQUFSLEVBQVcsTUFBTSxJQUFJLE1BQTFCLEVBQWtDLElBQUksR0FBdEMsRUFBMkMsSUFBSSxFQUFFLENBQWpELEVBQW9EO0FBQ2xELGdCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsY0FBTSxjQUFOLEdBQXVCLE1BQU0sSUFBSSxRQUFKLENBQWEsTUFBYixHQUFzQixDQUFuRDtBQUNEO0FBQ0QsZ0JBQVUsS0FBSyxhQUFMLENBQW1CLE9BQW5CLENBQVY7QUFDQSxhQUFPLElBQUksUUFBWDtBQUNBLGdCQUFVLEVBQVY7QUFDQSxXQUFLLElBQUksQ0FBSixFQUFPLE9BQU8sS0FBSyxNQUF4QixFQUFnQyxJQUFJLElBQXBDLEVBQTBDLEdBQTFDLEVBQStDO0FBQzdDLGdCQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsZ0JBQVEsSUFBUixDQUFhLEtBQUssY0FBTCxDQUFvQixLQUFwQixFQUEyQixPQUEzQixFQUFvQyxDQUFwQyxDQUFiO0FBQ0Q7QUFDRCxhQUFPLE9BQVA7QUFDRCxLQWZEOztBQWlCQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsU0FBMUIsR0FBc0MsVUFBUyxHQUFULEVBQWMsT0FBZCxFQUF1QixLQUF2QixFQUE4QjtBQUNsRSxhQUFPLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZ0JBQWdCLFNBQWhCLENBQTBCLFNBQTFCLENBQW9DLElBQXBDLENBQXlDLElBQXpDLEVBQStDLEdBQS9DLEVBQW9ELE9BQXBELEVBQTZELEtBQTdELENBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixLQUExQixHQUFrQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQy9ELGFBQU8sS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixnQkFBZ0IsU0FBaEIsQ0FBMEIsS0FBMUIsQ0FBZ0MsSUFBaEMsQ0FBcUMsSUFBckMsRUFBMkMsSUFBM0MsRUFBaUQsT0FBakQsRUFBMEQsS0FBMUQsQ0FBbEIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsb0JBQWdCLFNBQWhCLENBQTBCLE9BQTFCLEdBQW9DLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDakUsYUFBTyxLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLGdCQUFnQixTQUFoQixDQUEwQixPQUExQixDQUFrQyxJQUFsQyxDQUF1QyxJQUF2QyxFQUE2QyxJQUE3QyxFQUFtRCxPQUFuRCxFQUE0RCxLQUE1RCxDQUFsQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsV0FBMUIsR0FBd0MsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUNyRSxhQUFPLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZ0JBQWdCLFNBQWhCLENBQTBCLFdBQTFCLENBQXNDLElBQXRDLENBQTJDLElBQTNDLEVBQWlELElBQWpELEVBQXVELE9BQXZELEVBQWdFLEtBQWhFLENBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixPQUExQixHQUFvQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQ2pFLFVBQUksS0FBSixFQUFXLENBQVgsRUFBYyxHQUFkLEVBQW1CLEdBQW5CO0FBQ0EsZ0JBQVUsUUFBUSxDQUFsQjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixDQUFsQjtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZUFBZSxLQUFLLElBQUwsR0FBWSxJQUE3QztBQUNBLFVBQUksS0FBSyxLQUFMLElBQWMsS0FBSyxLQUF2QixFQUE4QjtBQUM1QixhQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLGNBQWMsS0FBSyxLQUFuQixHQUEyQixLQUEzQixHQUFtQyxLQUFLLEtBQXhDLEdBQWdELEdBQWxFO0FBQ0QsT0FGRCxNQUVPLElBQUksS0FBSyxLQUFULEVBQWdCO0FBQ3JCLGFBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsY0FBYyxLQUFLLEtBQW5CLEdBQTJCLEdBQTdDO0FBQ0Q7QUFDRCxVQUFJLEtBQUssUUFBTCxDQUFjLE1BQWQsR0FBdUIsQ0FBM0IsRUFBOEI7QUFDNUIsYUFBSyxNQUFMLENBQVksS0FBWixDQUFrQixJQUFsQjtBQUNBLGFBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFsQjtBQUNBLGdCQUFRLEtBQVIsR0FBZ0IsWUFBWSxTQUE1QjtBQUNBLGNBQU0sS0FBSyxRQUFYO0FBQ0EsYUFBSyxJQUFJLENBQUosRUFBTyxNQUFNLElBQUksTUFBdEIsRUFBOEIsSUFBSSxHQUFsQyxFQUF1QyxHQUF2QyxFQUE0QztBQUMxQyxrQkFBUSxJQUFJLENBQUosQ0FBUjtBQUNBLGVBQUssY0FBTCxDQUFvQixLQUFwQixFQUEyQixPQUEzQixFQUFvQyxRQUFRLENBQTVDO0FBQ0Q7QUFDRCxnQkFBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxhQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLEdBQWxCO0FBQ0Q7QUFDRCxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxRQUE1QjtBQUNBLFdBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsUUFBUSxnQkFBUixHQUEyQixHQUE3QztBQUNBLFdBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFsQjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLElBQTVCO0FBQ0EsYUFBTyxLQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLE9BQXJCLEVBQThCLEtBQTlCLENBQVA7QUFDRCxLQTdCRDs7QUErQkEsb0JBQWdCLFNBQWhCLENBQTBCLE9BQTFCLEdBQW9DLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDakUsVUFBSSxHQUFKLEVBQVMsS0FBVCxFQUFnQixjQUFoQixFQUFnQyxjQUFoQyxFQUFnRCxDQUFoRCxFQUFtRCxHQUFuRCxFQUF3RCxJQUF4RCxFQUE4RCxnQkFBOUQsRUFBZ0YsR0FBaEYsRUFBcUYsSUFBckY7QUFDQSxnQkFBVSxRQUFRLENBQWxCO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLE9BQTVCO0FBQ0EsV0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLElBQW9DLEdBQXBDLEdBQTBDLEtBQUssSUFBakU7QUFDQSxZQUFNLEtBQUssT0FBWDtBQUNBLFdBQUssSUFBTCxJQUFhLEdBQWIsRUFBa0I7QUFDaEIsWUFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsSUFBbEIsQ0FBTCxFQUE4QjtBQUM5QixjQUFNLElBQUksSUFBSixDQUFOO0FBQ0EsYUFBSyxTQUFMLENBQWUsR0FBZixFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNEO0FBQ0QsdUJBQWlCLEtBQUssUUFBTCxDQUFjLE1BQS9CO0FBQ0EsdUJBQWlCLG1CQUFtQixDQUFuQixHQUF1QixJQUF2QixHQUE4QixLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQS9DO0FBQ0EsVUFBSSxtQkFBbUIsQ0FBbkIsSUFBd0IsS0FBSyxRQUFMLENBQWMsS0FBZCxDQUFvQixVQUFTLENBQVQsRUFBWTtBQUMxRCxlQUFPLENBQUMsRUFBRSxJQUFGLEtBQVcsU0FBUyxJQUFwQixJQUE0QixFQUFFLElBQUYsS0FBVyxTQUFTLEdBQWpELEtBQXlELEVBQUUsS0FBRixLQUFZLEVBQTVFO0FBQ0QsT0FGMkIsQ0FBNUIsRUFFSTtBQUNGLFlBQUksUUFBUSxVQUFaLEVBQXdCO0FBQ3RCLGVBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsR0FBbEI7QUFDQSxrQkFBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxlQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLE9BQU8sS0FBSyxJQUFaLEdBQW1CLEdBQXJDO0FBQ0QsU0FKRCxNQUlPO0FBQ0wsa0JBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsZUFBSyxNQUFMLENBQVksS0FBWixDQUFrQixRQUFRLGdCQUFSLEdBQTJCLElBQTdDO0FBQ0Q7QUFDRixPQVhELE1BV08sSUFBSSxRQUFRLE1BQVIsSUFBa0IsbUJBQW1CLENBQXJDLEtBQTJDLGVBQWUsSUFBZixLQUF3QixTQUFTLElBQWpDLElBQXlDLGVBQWUsSUFBZixLQUF3QixTQUFTLEdBQXJILEtBQThILGVBQWUsS0FBZixJQUF3QixJQUExSixFQUFpSztBQUN0SyxhQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLEdBQWxCO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsZ0JBQVEsbUJBQVI7QUFDQSwyQkFBbUIsSUFBbkI7QUFDQSxhQUFLLGNBQUwsQ0FBb0IsY0FBcEIsRUFBb0MsT0FBcEMsRUFBNkMsUUFBUSxDQUFyRDtBQUNBLGdCQUFRLG1CQUFSO0FBQ0EsMkJBQW1CLEtBQW5CO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsYUFBSyxNQUFMLENBQVksS0FBWixDQUFrQixPQUFPLEtBQUssSUFBWixHQUFtQixHQUFyQztBQUNELE9BVk0sTUFVQTtBQUNMLGFBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsTUFBTSxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQXhCO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsZUFBTyxLQUFLLFFBQVo7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sS0FBSyxNQUF2QixFQUErQixJQUFJLEdBQW5DLEVBQXdDLEdBQXhDLEVBQTZDO0FBQzNDLGtCQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsZUFBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLE9BQTNCLEVBQW9DLFFBQVEsQ0FBNUM7QUFDRDtBQUNELGdCQUFRLEtBQVIsR0FBZ0IsWUFBWSxRQUE1QjtBQUNBLGFBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixJQUFvQyxJQUFwQyxHQUEyQyxLQUFLLElBQWhELEdBQXVELEdBQXpFO0FBQ0Q7QUFDRCxXQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBbEI7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLGFBQU8sS0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixPQUFyQixFQUE4QixLQUE5QixDQUFQO0FBQ0QsS0FqREQ7O0FBbURBLG9CQUFnQixTQUFoQixDQUEwQixxQkFBMUIsR0FBa0QsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUMvRSxhQUFPLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZ0JBQWdCLFNBQWhCLENBQTBCLHFCQUExQixDQUFnRCxJQUFoRCxDQUFxRCxJQUFyRCxFQUEyRCxJQUEzRCxFQUFpRSxPQUFqRSxFQUEwRSxLQUExRSxDQUFsQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsR0FBMUIsR0FBZ0MsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUM3RCxhQUFPLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZ0JBQWdCLFNBQWhCLENBQTBCLEdBQTFCLENBQThCLElBQTlCLENBQW1DLElBQW5DLEVBQXlDLElBQXpDLEVBQStDLE9BQS9DLEVBQXdELEtBQXhELENBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixJQUExQixHQUFpQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQzlELGFBQU8sS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixnQkFBZ0IsU0FBaEIsQ0FBMEIsSUFBMUIsQ0FBK0IsSUFBL0IsQ0FBb0MsSUFBcEMsRUFBMEMsSUFBMUMsRUFBZ0QsT0FBaEQsRUFBeUQsS0FBekQsQ0FBbEIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsb0JBQWdCLFNBQWhCLENBQTBCLFVBQTFCLEdBQXVDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDcEUsYUFBTyxLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLGdCQUFnQixTQUFoQixDQUEwQixVQUExQixDQUFxQyxJQUFyQyxDQUEwQyxJQUExQyxFQUFnRCxJQUFoRCxFQUFzRCxPQUF0RCxFQUErRCxLQUEvRCxDQUFsQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxvQkFBZ0IsU0FBaEIsQ0FBMEIsVUFBMUIsR0FBdUMsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUNwRSxhQUFPLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsZ0JBQWdCLFNBQWhCLENBQTBCLFVBQTFCLENBQXFDLElBQXJDLENBQTBDLElBQTFDLEVBQWdELElBQWhELEVBQXNELE9BQXRELEVBQStELEtBQS9ELENBQWxCLENBQVA7QUFDRCxLQUZEOztBQUlBLG9CQUFnQixTQUFoQixDQUEwQixTQUExQixHQUFzQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQ25FLGFBQU8sS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixnQkFBZ0IsU0FBaEIsQ0FBMEIsU0FBMUIsQ0FBb0MsSUFBcEMsQ0FBeUMsSUFBekMsRUFBK0MsSUFBL0MsRUFBcUQsT0FBckQsRUFBOEQsS0FBOUQsQ0FBbEIsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsb0JBQWdCLFNBQWhCLENBQTBCLFdBQTFCLEdBQXdDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDckUsYUFBTyxLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLGdCQUFnQixTQUFoQixDQUEwQixXQUExQixDQUFzQyxJQUF0QyxDQUEyQyxJQUEzQyxFQUFpRCxJQUFqRCxFQUF1RCxPQUF2RCxFQUFnRSxLQUFoRSxDQUFsQixDQUFQO0FBQ0QsS0FGRDs7QUFJQSxXQUFPLGVBQVA7QUFFRCxHQWpLa0MsQ0FpS2hDLGFBaktnQyxDQUFuQztBQW1LRCxDQTlLRCxFQThLRyxJQTlLSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksZUFBSjtBQUFBLE1BQXFCLGFBQXJCO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsa0JBQWdCLFFBQVEsaUJBQVIsQ0FBaEI7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGtCQUFtQixVQUFTLFVBQVQsRUFBcUI7QUFDdkQsV0FBTyxlQUFQLEVBQXdCLFVBQXhCOztBQUVBLGFBQVMsZUFBVCxDQUF5QixPQUF6QixFQUFrQztBQUNoQyxzQkFBZ0IsU0FBaEIsQ0FBMEIsV0FBMUIsQ0FBc0MsSUFBdEMsQ0FBMkMsSUFBM0MsRUFBaUQsT0FBakQ7QUFDRDs7QUFFRCxvQkFBZ0IsU0FBaEIsQ0FBMEIsUUFBMUIsR0FBcUMsVUFBUyxHQUFULEVBQWMsT0FBZCxFQUF1QjtBQUMxRCxVQUFJLEtBQUosRUFBVyxDQUFYLEVBQWMsR0FBZCxFQUFtQixDQUFuQixFQUFzQixHQUF0QjtBQUNBLGdCQUFVLEtBQUssYUFBTCxDQUFtQixPQUFuQixDQUFWO0FBQ0EsVUFBSSxFQUFKO0FBQ0EsWUFBTSxJQUFJLFFBQVY7QUFDQSxXQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sSUFBSSxNQUF0QixFQUE4QixJQUFJLEdBQWxDLEVBQXVDLEdBQXZDLEVBQTRDO0FBQzFDLGdCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsYUFBSyxLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsT0FBM0IsRUFBb0MsQ0FBcEMsQ0FBTDtBQUNEO0FBQ0QsVUFBSSxRQUFRLE1BQVIsSUFBa0IsRUFBRSxLQUFGLENBQVEsQ0FBQyxRQUFRLE9BQVIsQ0FBZ0IsTUFBekIsTUFBcUMsUUFBUSxPQUFuRSxFQUE0RTtBQUMxRSxZQUFJLEVBQUUsS0FBRixDQUFRLENBQVIsRUFBVyxDQUFDLFFBQVEsT0FBUixDQUFnQixNQUE1QixDQUFKO0FBQ0Q7QUFDRCxhQUFPLENBQVA7QUFDRCxLQWJEOztBQWVBLFdBQU8sZUFBUDtBQUVELEdBeEJrQyxDQXdCaEMsYUF4QmdDLENBQW5DO0FBMEJELENBakNELEVBaUNHLElBakNIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxjQUFKO0FBQUEsTUFDRSxPQUFPLFNBQVAsSUFBTyxDQUFTLEVBQVQsRUFBYSxFQUFiLEVBQWdCO0FBQUUsV0FBTyxZQUFVO0FBQUUsYUFBTyxHQUFHLEtBQUgsQ0FBUyxFQUFULEVBQWEsU0FBYixDQUFQO0FBQWlDLEtBQXBEO0FBQXVELEdBRGxGO0FBQUEsTUFFRSxVQUFVLEdBQUcsY0FGZjs7QUFJQSxTQUFPLE9BQVAsR0FBaUIsaUJBQWtCLFlBQVc7QUFDNUMsYUFBUyxjQUFULENBQXdCLE9BQXhCLEVBQWlDO0FBQy9CLFdBQUssZUFBTCxHQUF1QixLQUFLLEtBQUssZUFBVixFQUEyQixJQUEzQixDQUF2QjtBQUNBLFdBQUssZUFBTCxHQUF1QixLQUFLLEtBQUssZUFBVixFQUEyQixJQUEzQixDQUF2QjtBQUNBLFVBQUksR0FBSixFQUFTLEdBQVQsRUFBYyxLQUFkO0FBQ0Esa0JBQVksVUFBVSxFQUF0QjtBQUNBLFdBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxVQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsT0FBbEIsRUFBMkI7QUFDekIsYUFBSyxPQUFMLENBQWEsT0FBYixHQUF1QixLQUF2QjtBQUNEO0FBQ0QsWUFBTSxRQUFRLFNBQVIsSUFBcUIsRUFBM0I7QUFDQSxXQUFLLEdBQUwsSUFBWSxHQUFaLEVBQWlCO0FBQ2YsWUFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBTCxFQUE2QjtBQUM3QixnQkFBUSxJQUFJLEdBQUosQ0FBUjtBQUNBLGFBQUssR0FBTCxJQUFZLEtBQVo7QUFDRDtBQUNGOztBQUVELG1CQUFlLFNBQWYsQ0FBeUIsSUFBekIsR0FBZ0MsVUFBUyxHQUFULEVBQWM7QUFDNUMsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsSUFBekIsR0FBZ0MsVUFBUyxHQUFULEVBQWM7QUFDNUMsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssVUFBTCxDQUFnQixLQUFLLEdBQUwsSUFBWSxFQUE1QixDQUFyQixDQUFQO0FBQ0QsS0FMRDs7QUFPQSxtQkFBZSxTQUFmLENBQXlCLEtBQXpCLEdBQWlDLFVBQVMsR0FBVCxFQUFjO0FBQzdDLFVBQUksS0FBSyxPQUFMLENBQWEsWUFBakIsRUFBK0I7QUFDN0IsZUFBTyxHQUFQO0FBQ0Q7QUFDRCxZQUFNLEtBQUssR0FBTCxJQUFZLEVBQWxCO0FBQ0EsWUFBTSxJQUFJLE9BQUosQ0FBWSxLQUFaLEVBQW1CLGlCQUFuQixDQUFOO0FBQ0EsYUFBTyxLQUFLLGVBQUwsQ0FBcUIsR0FBckIsQ0FBUDtBQUNELEtBUEQ7O0FBU0EsbUJBQWUsU0FBZixDQUF5QixPQUF6QixHQUFtQyxVQUFTLEdBQVQsRUFBYztBQUMvQyxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsWUFBTSxLQUFLLEdBQUwsSUFBWSxFQUFsQjtBQUNBLFVBQUksSUFBSSxLQUFKLENBQVUsSUFBVixDQUFKLEVBQXFCO0FBQ25CLGNBQU0sSUFBSSxLQUFKLENBQVUsK0NBQStDLEdBQXpELENBQU47QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEdBQXJCLENBQVA7QUFDRCxLQVREOztBQVdBLG1CQUFlLFNBQWYsQ0FBeUIsR0FBekIsR0FBK0IsVUFBUyxHQUFULEVBQWM7QUFDM0MsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxHQUFMLElBQVksRUFBbkI7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsUUFBekIsR0FBb0MsVUFBUyxHQUFULEVBQWM7QUFDaEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssU0FBTCxDQUFlLE1BQU0sS0FBSyxHQUFMLElBQVksRUFBakMsQ0FBckIsQ0FBUDtBQUNELEtBTEQ7O0FBT0EsbUJBQWUsU0FBZixDQUF5QixTQUF6QixHQUFxQyxVQUFTLEdBQVQsRUFBYztBQUNqRCxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsYUFBTyxLQUFLLGVBQUwsQ0FBcUIsS0FBSyxHQUFMLElBQVksRUFBakMsQ0FBUDtBQUNELEtBTEQ7O0FBT0EsbUJBQWUsU0FBZixDQUF5QixRQUF6QixHQUFvQyxVQUFTLEdBQVQsRUFBYztBQUNoRCxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsWUFBTSxLQUFLLEdBQUwsSUFBWSxFQUFsQjtBQUNBLFVBQUksSUFBSSxLQUFKLENBQVUsS0FBVixDQUFKLEVBQXNCO0FBQ3BCLGNBQU0sSUFBSSxLQUFKLENBQVUsMkNBQTJDLEdBQXJELENBQU47QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEdBQXJCLENBQVA7QUFDRCxLQVREOztBQVdBLG1CQUFlLFNBQWYsQ0FBeUIsVUFBekIsR0FBc0MsVUFBUyxHQUFULEVBQWM7QUFDbEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELFlBQU0sS0FBSyxHQUFMLElBQVksRUFBbEI7QUFDQSxVQUFJLENBQUMsSUFBSSxLQUFKLENBQVUsV0FBVixDQUFMLEVBQTZCO0FBQzNCLGNBQU0sSUFBSSxLQUFKLENBQVUsNkJBQTZCLEdBQXZDLENBQU47QUFDRDtBQUNELGFBQU8sR0FBUDtBQUNELEtBVEQ7O0FBV0EsbUJBQWUsU0FBZixDQUF5QixXQUF6QixHQUF1QyxVQUFTLEdBQVQsRUFBYztBQUNuRCxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsWUFBTSxLQUFLLEdBQUwsSUFBWSxFQUFsQjtBQUNBLFVBQUksQ0FBQyxJQUFJLEtBQUosQ0FBVSwrQkFBVixDQUFMLEVBQWlEO0FBQy9DLGNBQU0sSUFBSSxLQUFKLENBQVUsdUJBQXVCLEdBQWpDLENBQU47QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEdBQXJCLENBQVA7QUFDRCxLQVREOztBQVdBLG1CQUFlLFNBQWYsQ0FBeUIsYUFBekIsR0FBeUMsVUFBUyxHQUFULEVBQWM7QUFDckQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELFVBQUksR0FBSixFQUFTO0FBQ1AsZUFBTyxLQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxJQUFQO0FBQ0Q7QUFDRixLQVREOztBQVdBLG1CQUFlLFNBQWYsQ0FBeUIsUUFBekIsR0FBb0MsVUFBUyxHQUFULEVBQWM7QUFDaEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsUUFBekIsR0FBb0MsVUFBUyxHQUFULEVBQWM7QUFDaEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsZUFBekIsR0FBMkMsVUFBUyxHQUFULEVBQWM7QUFDdkQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsVUFBekIsR0FBc0MsVUFBUyxHQUFULEVBQWM7QUFDbEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsYUFBekIsR0FBeUMsVUFBUyxHQUFULEVBQWM7QUFDckQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsY0FBekIsR0FBMEMsVUFBUyxHQUFULEVBQWM7QUFDdEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsUUFBekIsR0FBb0MsVUFBUyxHQUFULEVBQWM7QUFDaEQsVUFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUM3QixlQUFPLEdBQVA7QUFDRDtBQUNELGFBQU8sS0FBSyxlQUFMLENBQXFCLEtBQUssR0FBTCxJQUFZLEVBQWpDLENBQVA7QUFDRCxLQUxEOztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsYUFBekIsR0FBeUMsR0FBekM7O0FBRUEsbUJBQWUsU0FBZixDQUF5QixZQUF6QixHQUF3QyxHQUF4Qzs7QUFFQSxtQkFBZSxTQUFmLENBQXlCLGNBQXpCLEdBQTBDLE9BQTFDOztBQUVBLG1CQUFlLFNBQWYsQ0FBeUIsZUFBekIsR0FBMkMsUUFBM0M7O0FBRUEsbUJBQWUsU0FBZixDQUF5QixpQkFBekIsR0FBNkMsVUFBN0M7O0FBRUEsbUJBQWUsU0FBZixDQUF5QixhQUF6QixHQUF5QyxNQUF6Qzs7QUFFQSxtQkFBZSxTQUFmLENBQXlCLGVBQXpCLEdBQTJDLFVBQVMsR0FBVCxFQUFjO0FBQ3ZELFVBQUksS0FBSixFQUFXLEdBQVg7QUFDQSxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsY0FBUSxFQUFSO0FBQ0EsVUFBSSxLQUFLLE9BQUwsQ0FBYSxPQUFiLEtBQXlCLEtBQTdCLEVBQW9DO0FBQ2xDLGdCQUFRLCtHQUFSO0FBQ0EsWUFBSSxNQUFNLElBQUksS0FBSixDQUFVLEtBQVYsQ0FBVixFQUE0QjtBQUMxQixnQkFBTSxJQUFJLEtBQUosQ0FBVSxrQ0FBa0MsR0FBbEMsR0FBd0MsWUFBeEMsR0FBdUQsSUFBSSxLQUFyRSxDQUFOO0FBQ0Q7QUFDRixPQUxELE1BS08sSUFBSSxLQUFLLE9BQUwsQ0FBYSxPQUFiLEtBQXlCLEtBQTdCLEVBQW9DO0FBQ3pDLGdCQUFRLDJGQUFSO0FBQ0EsWUFBSSxNQUFNLElBQUksS0FBSixDQUFVLEtBQVYsQ0FBVixFQUE0QjtBQUMxQixnQkFBTSxJQUFJLEtBQUosQ0FBVSxrQ0FBa0MsR0FBbEMsR0FBd0MsWUFBeEMsR0FBdUQsSUFBSSxLQUFyRSxDQUFOO0FBQ0Q7QUFDRjtBQUNELGFBQU8sR0FBUDtBQUNELEtBbEJEOztBQW9CQSxtQkFBZSxTQUFmLENBQXlCLGVBQXpCLEdBQTJDLFVBQVMsR0FBVCxFQUFjO0FBQ3ZELFVBQUksS0FBSjtBQUNBLFVBQUksS0FBSyxPQUFMLENBQWEsWUFBakIsRUFBK0I7QUFDN0IsZUFBTyxHQUFQO0FBQ0Q7QUFDRCxXQUFLLGVBQUwsQ0FBcUIsR0FBckI7QUFDQSxjQUFRLDhXQUFSO0FBQ0EsVUFBSSxDQUFDLElBQUksS0FBSixDQUFVLEtBQVYsQ0FBTCxFQUF1QjtBQUNyQixjQUFNLElBQUksS0FBSixDQUFVLDJCQUFWLENBQU47QUFDRDtBQUNELGFBQU8sR0FBUDtBQUNELEtBWEQ7O0FBYUEsbUJBQWUsU0FBZixDQUF5QixVQUF6QixHQUFzQyxVQUFTLEdBQVQsRUFBYztBQUNsRCxVQUFJLFFBQUo7QUFDQSxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsaUJBQVcsS0FBSyxPQUFMLENBQWEsZ0JBQWIsR0FBZ0MsYUFBaEMsR0FBZ0QsSUFBM0Q7QUFDQSxhQUFPLElBQUksT0FBSixDQUFZLFFBQVosRUFBc0IsT0FBdEIsRUFBK0IsT0FBL0IsQ0FBdUMsSUFBdkMsRUFBNkMsTUFBN0MsRUFBcUQsT0FBckQsQ0FBNkQsSUFBN0QsRUFBbUUsTUFBbkUsRUFBMkUsT0FBM0UsQ0FBbUYsS0FBbkYsRUFBMEYsT0FBMUYsQ0FBUDtBQUNELEtBUEQ7O0FBU0EsbUJBQWUsU0FBZixDQUF5QixTQUF6QixHQUFxQyxVQUFTLEdBQVQsRUFBYztBQUNqRCxVQUFJLFFBQUo7QUFDQSxVQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzdCLGVBQU8sR0FBUDtBQUNEO0FBQ0QsaUJBQVcsS0FBSyxPQUFMLENBQWEsZ0JBQWIsR0FBZ0MsYUFBaEMsR0FBZ0QsSUFBM0Q7QUFDQSxhQUFPLElBQUksT0FBSixDQUFZLFFBQVosRUFBc0IsT0FBdEIsRUFBK0IsT0FBL0IsQ0FBdUMsSUFBdkMsRUFBNkMsTUFBN0MsRUFBcUQsT0FBckQsQ0FBNkQsSUFBN0QsRUFBbUUsUUFBbkUsRUFBNkUsT0FBN0UsQ0FBcUYsS0FBckYsRUFBNEYsT0FBNUYsRUFBcUcsT0FBckcsQ0FBNkcsS0FBN0csRUFBb0gsT0FBcEgsRUFBNkgsT0FBN0gsQ0FBcUksS0FBckksRUFBNEksT0FBNUksQ0FBUDtBQUNELEtBUEQ7O0FBU0EsV0FBTyxjQUFQO0FBRUQsR0F2T2lDLEVBQWxDO0FBeU9ELENBOU9ELEVBOE9HLElBOU9IOzs7Ozs7Ozs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKO0FBQUEsTUFBYyxnQkFBZDtBQUFBLE1BQWdDLE9BQWhDO0FBQUEsTUFDRSxTQUFTLFNBQVQsTUFBUyxDQUFTLEtBQVQsRUFBZ0IsTUFBaEIsRUFBd0I7QUFBRSxTQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUFFLFVBQUksUUFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixDQUFKLEVBQStCLE1BQU0sR0FBTixJQUFhLE9BQU8sR0FBUCxDQUFiO0FBQTJCLEtBQUMsU0FBUyxJQUFULEdBQWdCO0FBQUUsV0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQTJCLEtBQUMsS0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FBbUMsTUFBTSxTQUFOLEdBQWtCLElBQUksSUFBSixFQUFsQixDQUE4QixNQUFNLFNBQU4sR0FBa0IsT0FBTyxTQUF6QixDQUFvQyxPQUFPLEtBQVA7QUFBZSxHQUQ1UjtBQUFBLE1BRUUsVUFBVSxHQUFHLGNBRmY7O0FBSUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxxQkFBbUIsUUFBUSxvQkFBUixDQUFuQjs7QUFFQSxTQUFPLE9BQVAsR0FBaUIsVUFBVyxVQUFTLFVBQVQsRUFBcUI7QUFDL0MsV0FBTyxPQUFQLEVBQWdCLFVBQWhCOztBQUVBLGFBQVMsT0FBVCxDQUFpQixNQUFqQixFQUF5QixJQUF6QixFQUErQjtBQUM3QixjQUFRLFNBQVIsQ0FBa0IsV0FBbEIsQ0FBOEIsSUFBOUIsQ0FBbUMsSUFBbkMsRUFBeUMsTUFBekM7QUFDQSxVQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixjQUFNLElBQUksS0FBSixDQUFVLDJCQUEyQixLQUFLLFNBQUwsRUFBckMsQ0FBTjtBQUNEO0FBQ0QsV0FBSyxJQUFMLEdBQVksT0FBWjtBQUNBLFdBQUssSUFBTCxHQUFZLFNBQVMsSUFBckI7QUFDQSxXQUFLLEtBQUwsR0FBYSxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLElBQXBCLENBQWI7QUFDRDs7QUFFRCxXQUFPLGNBQVAsQ0FBc0IsUUFBUSxTQUE5QixFQUF5Qyw0QkFBekMsRUFBdUU7QUFDckUsV0FBSyxlQUFXO0FBQ2QsY0FBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRDtBQUhvRSxLQUF2RTs7QUFNQSxXQUFPLGNBQVAsQ0FBc0IsUUFBUSxTQUE5QixFQUF5QyxXQUF6QyxFQUFzRDtBQUNwRCxXQUFLLGVBQVc7QUFDZCxZQUFJLElBQUosRUFBVSxJQUFWLEVBQWdCLEdBQWhCO0FBQ0EsY0FBTSxFQUFOO0FBQ0EsZUFBTyxLQUFLLGVBQVo7QUFDQSxlQUFPLElBQVAsRUFBYTtBQUNYLGdCQUFNLEtBQUssSUFBTCxHQUFZLEdBQWxCO0FBQ0EsaUJBQU8sS0FBSyxlQUFaO0FBQ0Q7QUFDRCxlQUFPLEtBQUssSUFBWjtBQUNBLGVBQU8sS0FBSyxXQUFaO0FBQ0EsZUFBTyxJQUFQLEVBQWE7QUFDWCxnQkFBTSxNQUFNLEtBQUssSUFBakI7QUFDQSxpQkFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELGVBQU8sR0FBUDtBQUNEO0FBaEJtRCxLQUF0RDs7QUFtQkEsWUFBUSxTQUFSLENBQWtCLEtBQWxCLEdBQTBCLFlBQVc7QUFDbkMsYUFBTyxzQkFBYyxJQUFkLENBQVA7QUFDRCxLQUZEOztBQUlBLFlBQVEsU0FBUixDQUFrQixRQUFsQixHQUE2QixVQUFTLE9BQVQsRUFBa0I7QUFDN0MsYUFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLElBQXBCLENBQXlCLElBQXpCLEVBQStCLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsYUFBcEIsQ0FBa0MsT0FBbEMsQ0FBL0IsQ0FBUDtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLFNBQWxCLEdBQThCLFVBQVMsTUFBVCxFQUFpQjtBQUM3QyxZQUFNLElBQUksS0FBSixDQUFVLHdDQUF3QyxLQUFLLFNBQUwsRUFBbEQsQ0FBTjtBQUNELEtBRkQ7O0FBSUEsWUFBUSxTQUFSLENBQWtCLGdCQUFsQixHQUFxQyxVQUFTLE9BQVQsRUFBa0I7QUFDckQsWUFBTSxJQUFJLEtBQUosQ0FBVSx3Q0FBd0MsS0FBSyxTQUFMLEVBQWxELENBQU47QUFDRCxLQUZEOztBQUlBLFdBQU8sT0FBUDtBQUVELEdBeEQwQixDQXdEeEIsZ0JBeER3QixDQUEzQjtBQTBERCxDQW5FRCxFQW1FRyxJQW5FSDs7Ozs7QUNEQTtBQUNBLENBQUMsWUFBVztBQUNWLE1BQUksUUFBSjtBQUFBLE1BQWMsV0FBZDtBQUFBLE1BQTJCLFFBQTNCO0FBQUEsTUFBcUMsVUFBckM7QUFBQSxNQUFpRCxhQUFqRDtBQUFBLE1BQWdFLGFBQWhFO0FBQUEsTUFBK0UsWUFBL0U7QUFBQSxNQUE2RixjQUE3RjtBQUFBLE1BQTZHLGNBQTdHO0FBQUEsTUFBNkgsVUFBN0g7QUFBQSxNQUF5SSxRQUF6STtBQUFBLE1BQW1KLFVBQW5KO0FBQUEsTUFBK0osd0JBQS9KO0FBQUEsTUFBeUwsTUFBekw7QUFBQSxNQUFpTSxPQUFqTTtBQUFBLE1BQTBNLGFBQTFNO0FBQUEsTUFBeU4sTUFBek47QUFBQSxNQUNFLFVBQVUsR0FBRyxjQURmOztBQUdBLFdBQVMsUUFBUSxXQUFSLEVBQXFCLE1BQTlCOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsbUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7O0FBRUEsZUFBYSxRQUFRLGNBQVIsQ0FBYjs7QUFFQSxhQUFXLFFBQVEsWUFBUixDQUFYOztBQUVBLGVBQWEsUUFBUSxjQUFSLENBQWI7O0FBRUEsZUFBYSxRQUFRLGNBQVIsQ0FBYjs7QUFFQSxXQUFTLFFBQVEsVUFBUixDQUFUOztBQUVBLFlBQVUsUUFBUSxXQUFSLENBQVY7O0FBRUEsNkJBQTJCLFFBQVEsNEJBQVIsQ0FBM0I7O0FBRUEsYUFBVyxRQUFRLFlBQVIsQ0FBWDs7QUFFQSxrQkFBZ0IsUUFBUSxpQkFBUixDQUFoQjs7QUFFQSxrQkFBZ0IsUUFBUSxpQkFBUixDQUFoQjs7QUFFQSxpQkFBZSxRQUFRLGdCQUFSLENBQWY7O0FBRUEsbUJBQWlCLFFBQVEsa0JBQVIsQ0FBakI7O0FBRUEsZ0JBQWMsUUFBUSxlQUFSLENBQWQ7O0FBRUEsU0FBTyxPQUFQLEdBQWlCLGdCQUFpQixZQUFXO0FBQzNDLGFBQVMsYUFBVCxDQUF1QixPQUF2QixFQUFnQztBQUM5QixVQUFJLEdBQUosRUFBUyxHQUFULEVBQWMsS0FBZDtBQUNBLGtCQUFZLFVBQVUsRUFBdEI7QUFDQSxXQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsWUFBTSxRQUFRLE1BQVIsSUFBa0IsRUFBeEI7QUFDQSxXQUFLLEdBQUwsSUFBWSxHQUFaLEVBQWlCO0FBQ2YsWUFBSSxDQUFDLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsR0FBbEIsQ0FBTCxFQUE2QjtBQUM3QixnQkFBUSxJQUFJLEdBQUosQ0FBUjtBQUNBLGFBQUssTUFBTSxHQUFYLElBQWtCLEtBQUssR0FBTCxDQUFsQjtBQUNBLGFBQUssR0FBTCxJQUFZLEtBQVo7QUFDRDtBQUNGOztBQUVELGtCQUFjLFNBQWQsQ0FBd0IsYUFBeEIsR0FBd0MsVUFBUyxPQUFULEVBQWtCO0FBQ3hELFVBQUksZUFBSixFQUFxQixHQUFyQixFQUEwQixJQUExQixFQUFnQyxJQUFoQyxFQUFzQyxJQUF0QyxFQUE0QyxJQUE1QyxFQUFrRCxJQUFsRCxFQUF3RCxJQUF4RDtBQUNBLGtCQUFZLFVBQVUsRUFBdEI7QUFDQSxnQkFBVSxPQUFPLEVBQVAsRUFBVyxLQUFLLE9BQWhCLEVBQXlCLE9BQXpCLENBQVY7QUFDQSx3QkFBa0I7QUFDaEIsZ0JBQVE7QUFEUSxPQUFsQjtBQUdBLHNCQUFnQixNQUFoQixHQUF5QixRQUFRLE1BQVIsSUFBa0IsS0FBM0M7QUFDQSxzQkFBZ0IsVUFBaEIsR0FBNkIsUUFBUSxVQUFSLElBQXNCLEtBQW5EO0FBQ0Esc0JBQWdCLE1BQWhCLEdBQXlCLENBQUMsTUFBTSxRQUFRLE1BQWYsS0FBMEIsSUFBMUIsR0FBaUMsR0FBakMsR0FBdUMsSUFBaEU7QUFDQSxzQkFBZ0IsT0FBaEIsR0FBMEIsQ0FBQyxPQUFPLFFBQVEsT0FBaEIsS0FBNEIsSUFBNUIsR0FBbUMsSUFBbkMsR0FBMEMsSUFBcEU7QUFDQSxzQkFBZ0IsTUFBaEIsR0FBeUIsQ0FBQyxPQUFPLFFBQVEsTUFBaEIsS0FBMkIsSUFBM0IsR0FBa0MsSUFBbEMsR0FBeUMsQ0FBbEU7QUFDQSxzQkFBZ0IsbUJBQWhCLEdBQXNDLENBQUMsT0FBTyxDQUFDLE9BQU8sUUFBUSxtQkFBaEIsS0FBd0MsSUFBeEMsR0FBK0MsSUFBL0MsR0FBc0QsUUFBUSxtQkFBdEUsS0FBOEYsSUFBOUYsR0FBcUcsSUFBckcsR0FBNEcsQ0FBbEo7QUFDQSxzQkFBZ0IsZ0JBQWhCLEdBQW1DLENBQUMsT0FBTyxDQUFDLE9BQU8sUUFBUSxnQkFBaEIsS0FBcUMsSUFBckMsR0FBNEMsSUFBNUMsR0FBbUQsUUFBUSxnQkFBbkUsS0FBd0YsSUFBeEYsR0FBK0YsSUFBL0YsR0FBc0csRUFBekk7QUFDQSxVQUFJLGdCQUFnQixnQkFBaEIsS0FBcUMsSUFBekMsRUFBK0M7QUFDN0Msd0JBQWdCLGdCQUFoQixHQUFtQyxHQUFuQztBQUNEO0FBQ0Qsc0JBQWdCLG1CQUFoQixHQUFzQyxDQUF0QztBQUNBLHNCQUFnQixJQUFoQixHQUF1QixFQUF2QjtBQUNBLHNCQUFnQixLQUFoQixHQUF3QixZQUFZLElBQXBDO0FBQ0EsYUFBTyxlQUFQO0FBQ0QsS0FyQkQ7O0FBdUJBLGtCQUFjLFNBQWQsQ0FBd0IsTUFBeEIsR0FBaUMsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUM5RCxVQUFJLFdBQUo7QUFDQSxVQUFJLENBQUMsUUFBUSxNQUFULElBQW1CLFFBQVEsbUJBQS9CLEVBQW9EO0FBQ2xELGVBQU8sRUFBUDtBQUNELE9BRkQsTUFFTyxJQUFJLFFBQVEsTUFBWixFQUFvQjtBQUN6QixzQkFBYyxDQUFDLFNBQVMsQ0FBVixJQUFlLFFBQVEsTUFBdkIsR0FBZ0MsQ0FBOUM7QUFDQSxZQUFJLGNBQWMsQ0FBbEIsRUFBcUI7QUFDbkIsaUJBQU8sSUFBSSxLQUFKLENBQVUsV0FBVixFQUF1QixJQUF2QixDQUE0QixRQUFRLE1BQXBDLENBQVA7QUFDRDtBQUNGO0FBQ0QsYUFBTyxFQUFQO0FBQ0QsS0FYRDs7QUFhQSxrQkFBYyxTQUFkLENBQXdCLE9BQXhCLEdBQWtDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDL0QsVUFBSSxDQUFDLFFBQVEsTUFBVCxJQUFtQixRQUFRLG1CQUEvQixFQUFvRDtBQUNsRCxlQUFPLEVBQVA7QUFDRCxPQUZELE1BRU87QUFDTCxlQUFPLFFBQVEsT0FBZjtBQUNEO0FBQ0YsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLFNBQXhCLEdBQW9DLFVBQVMsR0FBVCxFQUFjLE9BQWQsRUFBdUIsS0FBdkIsRUFBOEI7QUFDaEUsVUFBSSxDQUFKO0FBQ0EsV0FBSyxhQUFMLENBQW1CLEdBQW5CLEVBQXdCLE9BQXhCLEVBQWlDLEtBQWpDO0FBQ0EsVUFBSSxNQUFNLElBQUksSUFBVixHQUFpQixJQUFqQixHQUF3QixJQUFJLEtBQTVCLEdBQW9DLEdBQXhDO0FBQ0EsV0FBSyxjQUFMLENBQW9CLEdBQXBCLEVBQXlCLE9BQXpCLEVBQWtDLEtBQWxDO0FBQ0EsYUFBTyxDQUFQO0FBQ0QsS0FORDs7QUFRQSxrQkFBYyxTQUFkLENBQXdCLEtBQXhCLEdBQWdDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDN0QsVUFBSSxDQUFKO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLE9BQTVCO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLElBQW9DLFdBQXhDO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksU0FBNUI7QUFDQSxXQUFLLEtBQUssS0FBVjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxRQUFRLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBYjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLElBQTVCO0FBQ0EsV0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixPQUFyQixFQUE4QixLQUE5QjtBQUNBLGFBQU8sQ0FBUDtBQUNELEtBWkQ7O0FBY0Esa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQy9ELFVBQUksQ0FBSjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixJQUFvQyxPQUF4QztBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsV0FBSyxLQUFLLEtBQVY7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxRQUE1QjtBQUNBLFdBQUssU0FBUyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQWQ7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQVpEOztBQWNBLGtCQUFjLFNBQWQsQ0FBd0IsV0FBeEIsR0FBc0MsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUNuRSxVQUFJLENBQUo7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLEVBQTZCLEtBQTdCO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksT0FBNUI7QUFDQSxVQUFJLEtBQUssTUFBTCxDQUFZLElBQVosRUFBa0IsT0FBbEIsRUFBMkIsS0FBM0IsSUFBb0MsT0FBeEM7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxTQUE1QjtBQUNBLFdBQUssZUFBZSxLQUFLLE9BQXBCLEdBQThCLEdBQW5DO0FBQ0EsVUFBSSxLQUFLLFFBQUwsSUFBaUIsSUFBckIsRUFBMkI7QUFDekIsYUFBSyxnQkFBZ0IsS0FBSyxRQUFyQixHQUFnQyxHQUFyQztBQUNEO0FBQ0QsVUFBSSxLQUFLLFVBQUwsSUFBbUIsSUFBdkIsRUFBNkI7QUFDM0IsYUFBSyxrQkFBa0IsS0FBSyxVQUF2QixHQUFvQyxHQUF6QztBQUNEO0FBQ0QsY0FBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxXQUFLLFFBQVEsZ0JBQVIsR0FBMkIsSUFBaEM7QUFDQSxXQUFLLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBTDtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLElBQTVCO0FBQ0EsV0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixPQUFyQixFQUE4QixLQUE5QjtBQUNBLGFBQU8sQ0FBUDtBQUNELEtBbkJEOztBQXFCQSxrQkFBYyxTQUFkLENBQXdCLE9BQXhCLEdBQWtDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDL0QsVUFBSSxLQUFKLEVBQVcsQ0FBWCxFQUFjLEdBQWQsRUFBbUIsQ0FBbkIsRUFBc0IsR0FBdEI7QUFDQSxnQkFBVSxRQUFRLENBQWxCO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLE9BQTVCO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLENBQUo7QUFDQSxXQUFLLGVBQWUsS0FBSyxJQUFMLEdBQVksSUFBaEM7QUFDQSxVQUFJLEtBQUssS0FBTCxJQUFjLEtBQUssS0FBdkIsRUFBOEI7QUFDNUIsYUFBSyxjQUFjLEtBQUssS0FBbkIsR0FBMkIsS0FBM0IsR0FBbUMsS0FBSyxLQUF4QyxHQUFnRCxHQUFyRDtBQUNELE9BRkQsTUFFTyxJQUFJLEtBQUssS0FBVCxFQUFnQjtBQUNyQixhQUFLLGNBQWMsS0FBSyxLQUFuQixHQUEyQixHQUFoQztBQUNEO0FBQ0QsVUFBSSxLQUFLLFFBQUwsQ0FBYyxNQUFkLEdBQXVCLENBQTNCLEVBQThCO0FBQzVCLGFBQUssSUFBTDtBQUNBLGFBQUssS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFMO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsY0FBTSxLQUFLLFFBQVg7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE1BQU0sSUFBSSxNQUF0QixFQUE4QixJQUFJLEdBQWxDLEVBQXVDLEdBQXZDLEVBQTRDO0FBQzFDLGtCQUFRLElBQUksQ0FBSixDQUFSO0FBQ0EsZUFBSyxLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsT0FBM0IsRUFBb0MsUUFBUSxDQUE1QyxDQUFMO0FBQ0Q7QUFDRCxnQkFBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxhQUFLLEdBQUw7QUFDRDtBQUNELGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxRQUFRLGdCQUFSLEdBQTJCLEdBQWhDO0FBQ0EsV0FBSyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQUw7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQTlCRDs7QUFnQ0Esa0JBQWMsU0FBZCxDQUF3QixPQUF4QixHQUFrQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQy9ELFVBQUksR0FBSixFQUFTLEtBQVQsRUFBZ0IsY0FBaEIsRUFBZ0MsY0FBaEMsRUFBZ0QsQ0FBaEQsRUFBbUQsQ0FBbkQsRUFBc0QsR0FBdEQsRUFBMkQsSUFBM0QsRUFBaUUsSUFBakUsRUFBdUUsZ0JBQXZFLEVBQXlGLENBQXpGLEVBQTRGLEdBQTVGLEVBQWlHLElBQWpHLEVBQXVHLElBQXZHO0FBQ0EsZ0JBQVUsUUFBUSxDQUFsQjtBQUNBLHlCQUFtQixLQUFuQjtBQUNBLFVBQUksRUFBSjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFdBQUssS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixJQUFvQyxHQUFwQyxHQUEwQyxLQUFLLElBQXBEO0FBQ0EsWUFBTSxLQUFLLE9BQVg7QUFDQSxXQUFLLElBQUwsSUFBYSxHQUFiLEVBQWtCO0FBQ2hCLFlBQUksQ0FBQyxRQUFRLElBQVIsQ0FBYSxHQUFiLEVBQWtCLElBQWxCLENBQUwsRUFBOEI7QUFDOUIsY0FBTSxJQUFJLElBQUosQ0FBTjtBQUNBLGFBQUssS0FBSyxTQUFMLENBQWUsR0FBZixFQUFvQixPQUFwQixFQUE2QixLQUE3QixDQUFMO0FBQ0Q7QUFDRCx1QkFBaUIsS0FBSyxRQUFMLENBQWMsTUFBL0I7QUFDQSx1QkFBaUIsbUJBQW1CLENBQW5CLEdBQXVCLElBQXZCLEdBQThCLEtBQUssUUFBTCxDQUFjLENBQWQsQ0FBL0M7QUFDQSxVQUFJLG1CQUFtQixDQUFuQixJQUF3QixLQUFLLFFBQUwsQ0FBYyxLQUFkLENBQW9CLFVBQVMsQ0FBVCxFQUFZO0FBQzFELGVBQU8sQ0FBQyxFQUFFLElBQUYsS0FBVyxTQUFTLElBQXBCLElBQTRCLEVBQUUsSUFBRixLQUFXLFNBQVMsR0FBakQsS0FBeUQsRUFBRSxLQUFGLEtBQVksRUFBNUU7QUFDRCxPQUYyQixDQUE1QixFQUVJO0FBQ0YsWUFBSSxRQUFRLFVBQVosRUFBd0I7QUFDdEIsZUFBSyxHQUFMO0FBQ0Esa0JBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsZUFBSyxPQUFPLEtBQUssSUFBWixHQUFtQixHQUFuQixHQUF5QixLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQTlCO0FBQ0QsU0FKRCxNQUlPO0FBQ0wsa0JBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsZUFBSyxRQUFRLGdCQUFSLEdBQTJCLElBQTNCLEdBQWtDLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBdkM7QUFDRDtBQUNGLE9BWEQsTUFXTyxJQUFJLFFBQVEsTUFBUixJQUFrQixtQkFBbUIsQ0FBckMsS0FBMkMsZUFBZSxJQUFmLEtBQXdCLFNBQVMsSUFBakMsSUFBeUMsZUFBZSxJQUFmLEtBQXdCLFNBQVMsR0FBckgsS0FBOEgsZUFBZSxLQUFmLElBQXdCLElBQTFKLEVBQWlLO0FBQ3RLLGFBQUssR0FBTDtBQUNBLGdCQUFRLEtBQVIsR0FBZ0IsWUFBWSxTQUE1QjtBQUNBLGdCQUFRLG1CQUFSO0FBQ0EsMkJBQW1CLElBQW5CO0FBQ0EsYUFBSyxLQUFLLGNBQUwsQ0FBb0IsY0FBcEIsRUFBb0MsT0FBcEMsRUFBNkMsUUFBUSxDQUFyRCxDQUFMO0FBQ0EsZ0JBQVEsbUJBQVI7QUFDQSwyQkFBbUIsS0FBbkI7QUFDQSxnQkFBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxhQUFLLE9BQU8sS0FBSyxJQUFaLEdBQW1CLEdBQW5CLEdBQXlCLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBOUI7QUFDRCxPQVZNLE1BVUE7QUFDTCxZQUFJLFFBQVEsbUJBQVosRUFBaUM7QUFDL0IsaUJBQU8sS0FBSyxRQUFaO0FBQ0EsZUFBSyxJQUFJLENBQUosRUFBTyxNQUFNLEtBQUssTUFBdkIsRUFBK0IsSUFBSSxHQUFuQyxFQUF3QyxHQUF4QyxFQUE2QztBQUMzQyxvQkFBUSxLQUFLLENBQUwsQ0FBUjtBQUNBLGdCQUFJLENBQUMsTUFBTSxJQUFOLEtBQWUsU0FBUyxJQUF4QixJQUFnQyxNQUFNLElBQU4sS0FBZSxTQUFTLEdBQXpELEtBQWtFLE1BQU0sS0FBTixJQUFlLElBQXJGLEVBQTRGO0FBQzFGLHNCQUFRLG1CQUFSO0FBQ0EsaUNBQW1CLElBQW5CO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxhQUFLLE1BQU0sS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFYO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsZUFBTyxLQUFLLFFBQVo7QUFDQSxhQUFLLElBQUksQ0FBSixFQUFPLE9BQU8sS0FBSyxNQUF4QixFQUFnQyxJQUFJLElBQXBDLEVBQTBDLEdBQTFDLEVBQStDO0FBQzdDLGtCQUFRLEtBQUssQ0FBTCxDQUFSO0FBQ0EsZUFBSyxLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsT0FBM0IsRUFBb0MsUUFBUSxDQUE1QyxDQUFMO0FBQ0Q7QUFDRCxnQkFBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxhQUFLLEtBQUssTUFBTCxDQUFZLElBQVosRUFBa0IsT0FBbEIsRUFBMkIsS0FBM0IsSUFBb0MsSUFBcEMsR0FBMkMsS0FBSyxJQUFoRCxHQUF1RCxHQUE1RDtBQUNBLFlBQUksZ0JBQUosRUFBc0I7QUFDcEIsa0JBQVEsbUJBQVI7QUFDRDtBQUNELGFBQUssS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFMO0FBQ0EsZ0JBQVEsS0FBUixHQUFnQixZQUFZLElBQTVCO0FBQ0Q7QUFDRCxXQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLE9BQXJCLEVBQThCLEtBQTlCO0FBQ0EsYUFBTyxDQUFQO0FBQ0QsS0FsRUQ7O0FBb0VBLGtCQUFjLFNBQWQsQ0FBd0IsY0FBeEIsR0FBeUMsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUN0RSxjQUFRLEtBQUssSUFBYjtBQUNFLGFBQUssU0FBUyxLQUFkO0FBQ0UsaUJBQU8sS0FBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixPQUFqQixFQUEwQixLQUExQixDQUFQO0FBQ0YsYUFBSyxTQUFTLE9BQWQ7QUFDRSxpQkFBTyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQVA7QUFDRixhQUFLLFNBQVMsT0FBZDtBQUNFLGlCQUFPLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBUDtBQUNGLGFBQUssU0FBUyxHQUFkO0FBQ0UsaUJBQU8sS0FBSyxHQUFMLENBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsQ0FBUDtBQUNGLGFBQUssU0FBUyxJQUFkO0FBQ0UsaUJBQU8sS0FBSyxJQUFMLENBQVUsSUFBVixFQUFnQixPQUFoQixFQUF5QixLQUF6QixDQUFQO0FBQ0YsYUFBSyxTQUFTLHFCQUFkO0FBQ0UsaUJBQU8sS0FBSyxxQkFBTCxDQUEyQixJQUEzQixFQUFpQyxPQUFqQyxFQUEwQyxLQUExQyxDQUFQO0FBQ0YsYUFBSyxTQUFTLEtBQWQ7QUFDRSxpQkFBTyxFQUFQO0FBQ0YsYUFBSyxTQUFTLFdBQWQ7QUFDRSxpQkFBTyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsT0FBdkIsRUFBZ0MsS0FBaEMsQ0FBUDtBQUNGLGFBQUssU0FBUyxPQUFkO0FBQ0UsaUJBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFQO0FBQ0YsYUFBSyxTQUFTLG9CQUFkO0FBQ0UsaUJBQU8sS0FBSyxVQUFMLENBQWdCLElBQWhCLEVBQXNCLE9BQXRCLEVBQStCLEtBQS9CLENBQVA7QUFDRixhQUFLLFNBQVMsa0JBQWQ7QUFDRSxpQkFBTyxLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsRUFBK0IsS0FBL0IsQ0FBUDtBQUNGLGFBQUssU0FBUyxpQkFBZDtBQUNFLGlCQUFPLEtBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUIsQ0FBUDtBQUNGLGFBQUssU0FBUyxtQkFBZDtBQUNFLGlCQUFPLEtBQUssV0FBTCxDQUFpQixJQUFqQixFQUF1QixPQUF2QixFQUFnQyxLQUFoQyxDQUFQO0FBQ0Y7QUFDRSxnQkFBTSxJQUFJLEtBQUosQ0FBVSw0QkFBNEIsS0FBSyxXQUFMLENBQWlCLElBQXZELENBQU47QUE1Qko7QUE4QkQsS0EvQkQ7O0FBaUNBLGtCQUFjLFNBQWQsQ0FBd0IscUJBQXhCLEdBQWdELFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDN0UsVUFBSSxDQUFKO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLE9BQTVCO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLElBQW9DLElBQXhDO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksU0FBNUI7QUFDQSxXQUFLLEtBQUssTUFBVjtBQUNBLFVBQUksS0FBSyxLQUFULEVBQWdCO0FBQ2QsYUFBSyxNQUFNLEtBQUssS0FBaEI7QUFDRDtBQUNELGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxRQUFRLGdCQUFSLEdBQTJCLElBQWhDO0FBQ0EsV0FBSyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQUw7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQWhCRDs7QUFrQkEsa0JBQWMsU0FBZCxDQUF3QixHQUF4QixHQUE4QixVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQzNELFVBQUksQ0FBSjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixDQUFKO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksU0FBNUI7QUFDQSxXQUFLLEtBQUssS0FBVjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQUw7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQVpEOztBQWNBLGtCQUFjLFNBQWQsQ0FBd0IsSUFBeEIsR0FBK0IsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUM1RCxVQUFJLENBQUo7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLEVBQTZCLEtBQTdCO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksT0FBNUI7QUFDQSxVQUFJLEtBQUssTUFBTCxDQUFZLElBQVosRUFBa0IsT0FBbEIsRUFBMkIsS0FBM0IsQ0FBSjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsV0FBSyxLQUFLLEtBQVY7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxRQUE1QjtBQUNBLFdBQUssS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUFMO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksSUFBNUI7QUFDQSxXQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLE9BQXJCLEVBQThCLEtBQTlCO0FBQ0EsYUFBTyxDQUFQO0FBQ0QsS0FaRDs7QUFjQSxrQkFBYyxTQUFkLENBQXdCLFVBQXhCLEdBQXFDLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0IsS0FBeEIsRUFBK0I7QUFDbEUsVUFBSSxDQUFKO0FBQ0EsV0FBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixLQUE3QjtBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLE9BQTVCO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLEVBQTJCLEtBQTNCLElBQW9DLFdBQXhDO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksU0FBNUI7QUFDQSxXQUFLLE1BQU0sS0FBSyxXQUFYLEdBQXlCLEdBQXpCLEdBQStCLEtBQUssYUFBcEMsR0FBb0QsR0FBcEQsR0FBMEQsS0FBSyxhQUFwRTtBQUNBLFVBQUksS0FBSyxnQkFBTCxLQUEwQixVQUE5QixFQUEwQztBQUN4QyxhQUFLLE1BQU0sS0FBSyxnQkFBaEI7QUFDRDtBQUNELFVBQUksS0FBSyxZQUFULEVBQXVCO0FBQ3JCLGFBQUssT0FBTyxLQUFLLFlBQVosR0FBMkIsR0FBaEM7QUFDRDtBQUNELGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxRQUFRLGdCQUFSLEdBQTJCLEdBQTNCLEdBQWlDLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBdEM7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQWxCRDs7QUFvQkEsa0JBQWMsU0FBZCxDQUF3QixVQUF4QixHQUFxQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQ2xFLFVBQUksQ0FBSjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixJQUFvQyxXQUF4QztBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsV0FBSyxNQUFNLEtBQUssSUFBWCxHQUFrQixHQUFsQixHQUF3QixLQUFLLEtBQWxDO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksUUFBNUI7QUFDQSxXQUFLLFFBQVEsZ0JBQVIsR0FBMkIsR0FBM0IsR0FBaUMsS0FBSyxPQUFMLENBQWEsSUFBYixFQUFtQixPQUFuQixFQUE0QixLQUE1QixDQUF0QztBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLElBQTVCO0FBQ0EsV0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixPQUFyQixFQUE4QixLQUE5QjtBQUNBLGFBQU8sQ0FBUDtBQUNELEtBWkQ7O0FBY0Esa0JBQWMsU0FBZCxDQUF3QixTQUF4QixHQUFvQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCO0FBQ2pFLFVBQUksQ0FBSjtBQUNBLFdBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkIsS0FBN0I7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxPQUE1QjtBQUNBLFVBQUksS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFsQixFQUEyQixLQUEzQixJQUFvQyxVQUF4QztBQUNBLGNBQVEsS0FBUixHQUFnQixZQUFZLFNBQTVCO0FBQ0EsVUFBSSxLQUFLLEVBQVQsRUFBYTtBQUNYLGFBQUssSUFBTDtBQUNEO0FBQ0QsV0FBSyxNQUFNLEtBQUssSUFBaEI7QUFDQSxVQUFJLEtBQUssS0FBVCxFQUFnQjtBQUNkLGFBQUssT0FBTyxLQUFLLEtBQVosR0FBb0IsR0FBekI7QUFDRCxPQUZELE1BRU87QUFDTCxZQUFJLEtBQUssS0FBTCxJQUFjLEtBQUssS0FBdkIsRUFBOEI7QUFDNUIsZUFBSyxjQUFjLEtBQUssS0FBbkIsR0FBMkIsS0FBM0IsR0FBbUMsS0FBSyxLQUF4QyxHQUFnRCxHQUFyRDtBQUNELFNBRkQsTUFFTyxJQUFJLEtBQUssS0FBVCxFQUFnQjtBQUNyQixlQUFLLGNBQWMsS0FBSyxLQUFuQixHQUEyQixHQUFoQztBQUNEO0FBQ0QsWUFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDZCxlQUFLLFlBQVksS0FBSyxLQUF0QjtBQUNEO0FBQ0Y7QUFDRCxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxRQUE1QjtBQUNBLFdBQUssUUFBUSxnQkFBUixHQUEyQixHQUEzQixHQUFpQyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLE9BQW5CLEVBQTRCLEtBQTVCLENBQXRDO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksSUFBNUI7QUFDQSxXQUFLLFNBQUwsQ0FBZSxJQUFmLEVBQXFCLE9BQXJCLEVBQThCLEtBQTlCO0FBQ0EsYUFBTyxDQUFQO0FBQ0QsS0EzQkQ7O0FBNkJBLGtCQUFjLFNBQWQsQ0FBd0IsV0FBeEIsR0FBc0MsVUFBUyxJQUFULEVBQWUsT0FBZixFQUF3QixLQUF4QixFQUErQjtBQUNuRSxVQUFJLENBQUo7QUFDQSxXQUFLLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLEVBQTZCLEtBQTdCO0FBQ0EsY0FBUSxLQUFSLEdBQWdCLFlBQVksT0FBNUI7QUFDQSxVQUFJLEtBQUssTUFBTCxDQUFZLElBQVosRUFBa0IsT0FBbEIsRUFBMkIsS0FBM0IsSUFBb0MsWUFBeEM7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxTQUE1QjtBQUNBLFdBQUssTUFBTSxLQUFLLElBQWhCO0FBQ0EsVUFBSSxLQUFLLEtBQUwsSUFBYyxLQUFLLEtBQXZCLEVBQThCO0FBQzVCLGFBQUssY0FBYyxLQUFLLEtBQW5CLEdBQTJCLEtBQTNCLEdBQW1DLEtBQUssS0FBeEMsR0FBZ0QsR0FBckQ7QUFDRCxPQUZELE1BRU8sSUFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDckIsYUFBSyxjQUFjLEtBQUssS0FBbkIsR0FBMkIsR0FBaEM7QUFDRCxPQUZNLE1BRUEsSUFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDckIsYUFBSyxjQUFjLEtBQUssS0FBbkIsR0FBMkIsR0FBaEM7QUFDRDtBQUNELGNBQVEsS0FBUixHQUFnQixZQUFZLFFBQTVCO0FBQ0EsV0FBSyxRQUFRLGdCQUFSLEdBQTJCLEdBQTNCLEdBQWlDLEtBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsS0FBNUIsQ0FBdEM7QUFDQSxjQUFRLEtBQVIsR0FBZ0IsWUFBWSxJQUE1QjtBQUNBLFdBQUssU0FBTCxDQUFlLElBQWYsRUFBcUIsT0FBckIsRUFBOEIsS0FBOUI7QUFDQSxhQUFPLENBQVA7QUFDRCxLQW5CRDs7QUFxQkEsa0JBQWMsU0FBZCxDQUF3QixRQUF4QixHQUFtQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCLENBQUUsQ0FBcEU7O0FBRUEsa0JBQWMsU0FBZCxDQUF3QixTQUF4QixHQUFvQyxVQUFTLElBQVQsRUFBZSxPQUFmLEVBQXdCLEtBQXhCLEVBQStCLENBQUUsQ0FBckU7O0FBRUEsa0JBQWMsU0FBZCxDQUF3QixhQUF4QixHQUF3QyxVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCLEtBQXZCLEVBQThCLENBQUUsQ0FBeEU7O0FBRUEsa0JBQWMsU0FBZCxDQUF3QixjQUF4QixHQUF5QyxVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCLEtBQXZCLEVBQThCLENBQUUsQ0FBekU7O0FBRUEsV0FBTyxhQUFQO0FBRUQsR0FwWWdDLEVBQWpDO0FBc1lELENBMWFELEVBMGFHLElBMWFIOzs7OztBQ0RBO0FBQ0EsQ0FBQyxZQUFXO0FBQ1YsTUFBSSxRQUFKLEVBQWMsV0FBZCxFQUEyQixvQkFBM0IsRUFBaUQsV0FBakQsRUFBOEQsYUFBOUQsRUFBNkUsZUFBN0UsRUFBOEYsZUFBOUYsRUFBK0csTUFBL0csRUFBdUgsVUFBdkgsRUFBbUksR0FBbkk7O0FBRUEsUUFBTSxRQUFRLFdBQVIsQ0FBTixFQUE0QixTQUFTLElBQUksTUFBekMsRUFBaUQsYUFBYSxJQUFJLFVBQWxFOztBQUVBLHlCQUF1QixRQUFRLHdCQUFSLENBQXZCOztBQUVBLGdCQUFjLFFBQVEsZUFBUixDQUFkOztBQUVBLGtCQUFnQixRQUFRLGlCQUFSLENBQWhCOztBQUVBLG9CQUFrQixRQUFRLG1CQUFSLENBQWxCOztBQUVBLG9CQUFrQixRQUFRLG1CQUFSLENBQWxCOztBQUVBLGFBQVcsUUFBUSxZQUFSLENBQVg7O0FBRUEsZ0JBQWMsUUFBUSxlQUFSLENBQWQ7O0FBRUEsU0FBTyxPQUFQLENBQWUsTUFBZixHQUF3QixVQUFTLElBQVQsRUFBZSxNQUFmLEVBQXVCLE9BQXZCLEVBQWdDLE9BQWhDLEVBQXlDO0FBQy9ELFFBQUksR0FBSixFQUFTLElBQVQ7QUFDQSxRQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNoQixZQUFNLElBQUksS0FBSixDQUFVLDRCQUFWLENBQU47QUFDRDtBQUNELGNBQVUsT0FBTyxFQUFQLEVBQVcsTUFBWCxFQUFtQixPQUFuQixFQUE0QixPQUE1QixDQUFWO0FBQ0EsVUFBTSxJQUFJLFdBQUosQ0FBZ0IsT0FBaEIsQ0FBTjtBQUNBLFdBQU8sSUFBSSxPQUFKLENBQVksSUFBWixDQUFQO0FBQ0EsUUFBSSxDQUFDLFFBQVEsUUFBYixFQUF1QjtBQUNyQixVQUFJLFdBQUosQ0FBZ0IsT0FBaEI7QUFDQSxVQUFLLFFBQVEsS0FBUixJQUFpQixJQUFsQixJQUE0QixRQUFRLEtBQVIsSUFBaUIsSUFBakQsRUFBd0Q7QUFDdEQsWUFBSSxHQUFKLENBQVEsT0FBUjtBQUNEO0FBQ0Y7QUFDRCxXQUFPLElBQVA7QUFDRCxHQWZEOztBQWlCQSxTQUFPLE9BQVAsQ0FBZSxLQUFmLEdBQXVCLFVBQVMsT0FBVCxFQUFrQixNQUFsQixFQUEwQixLQUExQixFQUFpQztBQUN0RCxRQUFJLElBQUo7QUFDQSxRQUFJLFdBQVcsT0FBWCxDQUFKLEVBQXlCO0FBQ3ZCLGFBQU8sQ0FBQyxPQUFELEVBQVUsTUFBVixDQUFQLEVBQTBCLFNBQVMsS0FBSyxDQUFMLENBQW5DLEVBQTRDLFFBQVEsS0FBSyxDQUFMLENBQXBEO0FBQ0EsZ0JBQVUsRUFBVjtBQUNEO0FBQ0QsUUFBSSxNQUFKLEVBQVk7QUFDVixhQUFPLElBQUksYUFBSixDQUFrQixPQUFsQixFQUEyQixNQUEzQixFQUFtQyxLQUFuQyxDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBTyxJQUFJLFdBQUosQ0FBZ0IsT0FBaEIsQ0FBUDtBQUNEO0FBQ0YsR0FYRDs7QUFhQSxTQUFPLE9BQVAsQ0FBZSxZQUFmLEdBQThCLFVBQVMsT0FBVCxFQUFrQjtBQUM5QyxXQUFPLElBQUksZUFBSixDQUFvQixPQUFwQixDQUFQO0FBQ0QsR0FGRDs7QUFJQSxTQUFPLE9BQVAsQ0FBZSxZQUFmLEdBQThCLFVBQVMsTUFBVCxFQUFpQixPQUFqQixFQUEwQjtBQUN0RCxXQUFPLElBQUksZUFBSixDQUFvQixNQUFwQixFQUE0QixPQUE1QixDQUFQO0FBQ0QsR0FGRDs7QUFJQSxTQUFPLE9BQVAsQ0FBZSxjQUFmLEdBQWdDLElBQUksb0JBQUosRUFBaEM7O0FBRUEsU0FBTyxPQUFQLENBQWUsUUFBZixHQUEwQixRQUExQjs7QUFFQSxTQUFPLE9BQVAsQ0FBZSxXQUFmLEdBQTZCLFdBQTdCO0FBRUQsQ0EvREQsRUErREcsSUEvREg7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQkEsSUFBSSxTQUFTLFFBQVEsUUFBUixFQUFrQixNQUEvQjtBQUNBLElBQUksTUFBTSxRQUFRLE9BQVIsQ0FBVjtBQUNBLElBQUksU0FBUyxRQUFRLFVBQVIsQ0FBYjtBQUNBLElBQUksTUFBTSxRQUFRLE9BQVIsQ0FBVjs7QUFFQSxJQUFJLGFBQWE7QUFDZixRQUFNLEdBRFM7QUFFZixVQUFRLE1BRk87QUFHZixPQUFLO0FBSFUsQ0FBakI7O0FBTUEsSUFBSSxZQUFZLEVBQWhCO0FBQ0EsSUFBSSxhQUFhLE9BQU8sS0FBUCxDQUFhLFNBQWIsQ0FBakI7QUFDQSxXQUFXLElBQVgsQ0FBZ0IsQ0FBaEI7O0FBRUEsU0FBUyxJQUFULENBQWMsRUFBZCxFQUFrQixHQUFsQixFQUF1QixJQUF2QixFQUE2QjtBQUMzQixNQUFHLENBQUMsT0FBTyxRQUFQLENBQWdCLEdBQWhCLENBQUosRUFBMEIsTUFBTSxPQUFPLElBQVAsQ0FBWSxHQUFaLENBQU47QUFDMUIsTUFBRyxDQUFDLE9BQU8sUUFBUCxDQUFnQixJQUFoQixDQUFKLEVBQTJCLE9BQU8sT0FBTyxJQUFQLENBQVksSUFBWixDQUFQOztBQUUzQixNQUFHLElBQUksTUFBSixHQUFhLFNBQWhCLEVBQTJCO0FBQ3pCLFVBQU0sR0FBRyxHQUFILENBQU47QUFDRCxHQUZELE1BRU8sSUFBRyxJQUFJLE1BQUosR0FBYSxTQUFoQixFQUEyQjtBQUNoQyxVQUFNLE9BQU8sTUFBUCxDQUFjLENBQUMsR0FBRCxFQUFNLFVBQU4sQ0FBZCxFQUFpQyxTQUFqQyxDQUFOO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPLE9BQU8sS0FBUCxDQUFhLFNBQWIsQ0FBWDtBQUFBLE1BQW9DLE9BQU8sT0FBTyxLQUFQLENBQWEsU0FBYixDQUEzQztBQUNBLE9BQUksSUFBSSxJQUFJLENBQVosRUFBZSxJQUFJLFNBQW5CLEVBQThCLEdBQTlCLEVBQW1DO0FBQ2pDLFNBQUssQ0FBTCxJQUFVLElBQUksQ0FBSixJQUFTLElBQW5CO0FBQ0EsU0FBSyxDQUFMLElBQVUsSUFBSSxDQUFKLElBQVMsSUFBbkI7QUFDRDs7QUFFRCxNQUFJLE9BQU8sR0FBRyxPQUFPLE1BQVAsQ0FBYyxDQUFDLElBQUQsRUFBTyxJQUFQLENBQWQsQ0FBSCxDQUFYO0FBQ0EsU0FBTyxHQUFHLE9BQU8sTUFBUCxDQUFjLENBQUMsSUFBRCxFQUFPLElBQVAsQ0FBZCxDQUFILENBQVA7QUFDRDs7QUFFRCxTQUFTLElBQVQsQ0FBYyxHQUFkLEVBQW1CLEdBQW5CLEVBQXdCO0FBQ3RCLFFBQU0sT0FBTyxNQUFiO0FBQ0EsTUFBSSxLQUFLLFdBQVcsR0FBWCxDQUFUO0FBQ0EsTUFBSSxPQUFPLEVBQVg7QUFDQSxNQUFJLFNBQVMsQ0FBYjtBQUNBLE1BQUcsQ0FBQyxFQUFKLEVBQVEsTUFBTSxZQUFOLEVBQW9CLEdBQXBCLEVBQXlCLHNCQUF6QjtBQUNSLFNBQU87QUFDTCxZQUFRLGdCQUFVLElBQVYsRUFBZ0I7QUFDdEIsVUFBRyxDQUFDLE9BQU8sUUFBUCxDQUFnQixJQUFoQixDQUFKLEVBQTJCLE9BQU8sT0FBTyxJQUFQLENBQVksSUFBWixDQUFQOztBQUUzQixXQUFLLElBQUwsQ0FBVSxJQUFWO0FBQ0EsZ0JBQVUsS0FBSyxNQUFmO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FQSTtBQVFMLFlBQVEsZ0JBQVUsR0FBVixFQUFlO0FBQ3JCLFVBQUksTUFBTSxPQUFPLE1BQVAsQ0FBYyxJQUFkLENBQVY7QUFDQSxVQUFJLElBQUksTUFBTSxLQUFLLEVBQUwsRUFBUyxHQUFULEVBQWMsR0FBZCxDQUFOLEdBQTJCLEdBQUcsR0FBSCxDQUFuQztBQUNBLGFBQU8sSUFBUDtBQUNBLGFBQU8sTUFBTSxFQUFFLFFBQUYsQ0FBVyxHQUFYLENBQU4sR0FBd0IsQ0FBL0I7QUFDRDtBQWJJLEdBQVA7QUFlRDs7QUFFRCxTQUFTLEtBQVQsR0FBa0I7QUFDaEIsTUFBSSxJQUFJLEdBQUcsS0FBSCxDQUFTLElBQVQsQ0FBYyxTQUFkLEVBQXlCLElBQXpCLENBQThCLEdBQTlCLENBQVI7QUFDQSxRQUFNLElBQUksS0FBSixDQUFVLENBQ2QsQ0FEYyxFQUVkLHlCQUZjLEVBR2QsaURBSGMsRUFJZCxJQUpjLENBSVQsSUFKUyxDQUFWLENBQU47QUFLRDs7QUFFRCxRQUFRLFVBQVIsR0FBcUIsVUFBVSxHQUFWLEVBQWU7QUFBRSxTQUFPLEtBQUssR0FBTCxDQUFQO0FBQWtCLENBQXhEO0FBQ0EsUUFBUSxVQUFSLEdBQXFCLFVBQVUsR0FBVixFQUFlLEdBQWYsRUFBb0I7QUFBRSxTQUFPLEtBQUssR0FBTCxFQUFVLEdBQVYsQ0FBUDtBQUF1QixDQUFsRTs7QUFFQSxTQUFTLElBQVQsQ0FBYyxDQUFkLEVBQWlCLENBQWpCLEVBQW9CO0FBQ2xCLE9BQUksSUFBSSxDQUFSLElBQWEsQ0FBYjtBQUNFLE1BQUUsRUFBRSxDQUFGLENBQUYsRUFBUSxDQUFSO0FBREY7QUFFRDs7QUFFRDtBQUNBLEtBQUssQ0FBQyxtQkFBRCxFQUNELGNBREMsRUFFRCxnQkFGQyxFQUdELGdCQUhDLEVBSUQsa0JBSkMsRUFLRCxZQUxDLEVBTUQsY0FOQyxFQU9ELHFCQVBDLEVBUUQsUUFSQyxDQUFMLEVBUWUsVUFBVSxJQUFWLEVBQWdCO0FBQzdCLFVBQVEsSUFBUixJQUFnQixZQUFZO0FBQzFCLFVBQU0sUUFBTixFQUFnQixJQUFoQixFQUFzQix3QkFBdEI7QUFDRCxHQUZEO0FBR0QsQ0FaRDs7Ozs7QUM3RUEsSUFBSSxTQUFTLFFBQVEsUUFBUixFQUFrQixNQUEvQjtBQUNBLElBQUksVUFBVSxDQUFkO0FBQ0EsSUFBSSxhQUFhLE9BQU8sS0FBUCxDQUFhLE9BQWIsQ0FBakIsQ0FBd0MsV0FBVyxJQUFYLENBQWdCLENBQWhCO0FBQ3hDLElBQUksUUFBUSxDQUFaOztBQUVBLFNBQVMsT0FBVCxDQUFpQixHQUFqQixFQUFzQixTQUF0QixFQUFpQztBQUMvQixNQUFLLElBQUksTUFBSixHQUFhLE9BQWQsS0FBMkIsQ0FBL0IsRUFBa0M7QUFDaEMsUUFBSSxNQUFNLElBQUksTUFBSixJQUFjLFVBQVcsSUFBSSxNQUFKLEdBQWEsT0FBdEMsQ0FBVjtBQUNBLFVBQU0sT0FBTyxNQUFQLENBQWMsQ0FBQyxHQUFELEVBQU0sVUFBTixDQUFkLEVBQWlDLEdBQWpDLENBQU47QUFDRDs7QUFFRCxNQUFJLE1BQU0sRUFBVjtBQUNBLE1BQUksS0FBSyxZQUFZLElBQUksV0FBaEIsR0FBOEIsSUFBSSxXQUEzQztBQUNBLE9BQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxJQUFJLE1BQXhCLEVBQWdDLEtBQUssT0FBckMsRUFBOEM7QUFDNUMsUUFBSSxJQUFKLENBQVMsR0FBRyxJQUFILENBQVEsR0FBUixFQUFhLENBQWIsQ0FBVDtBQUNEO0FBQ0QsU0FBTyxHQUFQO0FBQ0Q7O0FBRUQsU0FBUyxRQUFULENBQWtCLEdBQWxCLEVBQXVCLElBQXZCLEVBQTZCLFNBQTdCLEVBQXdDO0FBQ3RDLE1BQUksTUFBTSxPQUFPLEtBQVAsQ0FBYSxJQUFiLENBQVY7QUFDQSxNQUFJLEtBQUssWUFBWSxJQUFJLFlBQWhCLEdBQStCLElBQUksWUFBNUM7QUFDQSxPQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksSUFBSSxNQUF4QixFQUFnQyxHQUFoQyxFQUFxQztBQUNuQyxPQUFHLElBQUgsQ0FBUSxHQUFSLEVBQWEsSUFBSSxDQUFKLENBQWIsRUFBcUIsSUFBSSxDQUF6QixFQUE0QixJQUE1QjtBQUNEO0FBQ0QsU0FBTyxHQUFQO0FBQ0Q7O0FBRUQsU0FBUyxJQUFULENBQWMsR0FBZCxFQUFtQixFQUFuQixFQUF1QixRQUF2QixFQUFpQyxTQUFqQyxFQUE0QztBQUMxQyxNQUFJLENBQUMsT0FBTyxRQUFQLENBQWdCLEdBQWhCLENBQUwsRUFBMkIsTUFBTSxPQUFPLElBQVAsQ0FBWSxHQUFaLENBQU47QUFDM0IsTUFBSSxNQUFNLEdBQUcsUUFBUSxHQUFSLEVBQWEsU0FBYixDQUFILEVBQTRCLElBQUksTUFBSixHQUFhLEtBQXpDLENBQVY7QUFDQSxTQUFPLFNBQVMsR0FBVCxFQUFjLFFBQWQsRUFBd0IsU0FBeEIsQ0FBUDtBQUNEOztBQUVELE9BQU8sT0FBUCxHQUFpQixFQUFFLE1BQU0sSUFBUixFQUFqQjs7Ozs7QUNsQ0E7Ozs7Ozs7OztBQVNBLElBQUksVUFBVSxRQUFRLFdBQVIsQ0FBZDs7QUFFQTs7O0FBR0EsU0FBUyxXQUFULEdBQ0E7QUFDRSxTQUFPLFFBQVEsS0FBUixLQUFrQixrQ0FBekI7QUFDRDs7QUFFRDs7O0FBR0EsU0FBUyxRQUFULENBQWtCLENBQWxCLEVBQXFCLEdBQXJCLEVBQ0E7QUFDRTtBQUNBLElBQUUsT0FBTyxDQUFULEtBQWUsUUFBVSxHQUFELEdBQVEsRUFBaEM7QUFDQSxJQUFFLENBQUcsTUFBTSxFQUFQLEtBQWUsQ0FBaEIsSUFBc0IsQ0FBdkIsSUFBNEIsRUFBOUIsSUFBb0MsR0FBcEM7O0FBRUEsTUFBSSxJQUFLLFVBQVQ7QUFDQSxNQUFJLElBQUksQ0FBQyxTQUFUO0FBQ0EsTUFBSSxJQUFJLENBQUMsVUFBVDtBQUNBLE1BQUksSUFBSyxTQUFUOztBQUVBLE9BQUksSUFBSSxJQUFJLENBQVosRUFBZSxJQUFJLEVBQUUsTUFBckIsRUFBNkIsS0FBSyxFQUFsQyxFQUNBO0FBQ0UsUUFBSSxPQUFPLENBQVg7QUFDQSxRQUFJLE9BQU8sQ0FBWDtBQUNBLFFBQUksT0FBTyxDQUFYO0FBQ0EsUUFBSSxPQUFPLENBQVg7O0FBRUEsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixDQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBaUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixDQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWlDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxRQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixDQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsS0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixDQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFFBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBaUMsVUFBakMsQ0FBSjs7QUFFQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLENBQTVCLEVBQWdDLENBQUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixFQUE1QixFQUFpQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLENBQTVCLEVBQWdDLENBQUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBaUMsUUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLENBQTVCLEVBQWlDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLENBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixDQUE1QixFQUFnQyxDQUFDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLENBQTVCLEVBQWdDLENBQUMsUUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBaUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKOztBQUVBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBZ0MsQ0FBQyxNQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWlDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsUUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBaUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWlDLFFBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLENBQTVCLEVBQWdDLENBQUMsU0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixFQUE1QixFQUFpQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7O0FBRUEsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixDQUE1QixFQUFnQyxDQUFDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWlDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxRQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixDQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRSxFQUFKLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsT0FBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsRUFBNUIsRUFBZ0MsQ0FBQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUcsQ0FBTCxDQUFuQixFQUE0QixDQUE1QixFQUFpQyxVQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFFBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFFLEVBQUosQ0FBbkIsRUFBNEIsRUFBNUIsRUFBaUMsVUFBakMsQ0FBSjtBQUNBLFFBQUksT0FBTyxDQUFQLEVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsRUFBRSxJQUFHLENBQUwsQ0FBbkIsRUFBNEIsQ0FBNUIsRUFBZ0MsQ0FBQyxTQUFqQyxDQUFKO0FBQ0EsUUFBSSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixFQUFFLElBQUUsRUFBSixDQUFuQixFQUE0QixFQUE1QixFQUFnQyxDQUFDLFVBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWlDLFNBQWpDLENBQUo7QUFDQSxRQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLEVBQUUsSUFBRyxDQUFMLENBQW5CLEVBQTRCLEVBQTVCLEVBQWdDLENBQUMsU0FBakMsQ0FBSjs7QUFFQSxRQUFJLFNBQVMsQ0FBVCxFQUFZLElBQVosQ0FBSjtBQUNBLFFBQUksU0FBUyxDQUFULEVBQVksSUFBWixDQUFKO0FBQ0EsUUFBSSxTQUFTLENBQVQsRUFBWSxJQUFaLENBQUo7QUFDQSxRQUFJLFNBQVMsQ0FBVCxFQUFZLElBQVosQ0FBSjtBQUNEO0FBQ0QsU0FBTyxNQUFNLENBQU4sRUFBUyxDQUFULEVBQVksQ0FBWixFQUFlLENBQWYsQ0FBUDtBQUVEOztBQUVEOzs7QUFHQSxTQUFTLE9BQVQsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEMsRUFDQTtBQUNFLFNBQU8sU0FBUyxRQUFRLFNBQVMsU0FBUyxDQUFULEVBQVksQ0FBWixDQUFULEVBQXlCLFNBQVMsQ0FBVCxFQUFZLENBQVosQ0FBekIsQ0FBUixFQUFrRCxDQUFsRCxDQUFULEVBQThELENBQTlELENBQVA7QUFDRDtBQUNELFNBQVMsTUFBVCxDQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxFQUNBO0FBQ0UsU0FBTyxRQUFTLElBQUksQ0FBTCxHQUFZLENBQUMsQ0FBRixHQUFPLENBQTFCLEVBQThCLENBQTlCLEVBQWlDLENBQWpDLEVBQW9DLENBQXBDLEVBQXVDLENBQXZDLEVBQTBDLENBQTFDLENBQVA7QUFDRDtBQUNELFNBQVMsTUFBVCxDQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxFQUNBO0FBQ0UsU0FBTyxRQUFTLElBQUksQ0FBTCxHQUFXLElBQUssQ0FBQyxDQUF6QixFQUE4QixDQUE5QixFQUFpQyxDQUFqQyxFQUFvQyxDQUFwQyxFQUF1QyxDQUF2QyxFQUEwQyxDQUExQyxDQUFQO0FBQ0Q7QUFDRCxTQUFTLE1BQVQsQ0FBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEMsRUFDQTtBQUNFLFNBQU8sUUFBUSxJQUFJLENBQUosR0FBUSxDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQixDQUEvQixDQUFQO0FBQ0Q7QUFDRCxTQUFTLE1BQVQsQ0FBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEMsRUFDQTtBQUNFLFNBQU8sUUFBUSxLQUFLLElBQUssQ0FBQyxDQUFYLENBQVIsRUFBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsRUFBOEIsQ0FBOUIsRUFBaUMsQ0FBakMsRUFBb0MsQ0FBcEMsQ0FBUDtBQUNEOztBQUVEOzs7O0FBSUEsU0FBUyxRQUFULENBQWtCLENBQWxCLEVBQXFCLENBQXJCLEVBQ0E7QUFDRSxNQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQUwsS0FBZ0IsSUFBSSxNQUFwQixDQUFWO0FBQ0EsTUFBSSxNQUFNLENBQUMsS0FBSyxFQUFOLEtBQWEsS0FBSyxFQUFsQixLQUF5QixPQUFPLEVBQWhDLENBQVY7QUFDQSxTQUFRLE9BQU8sRUFBUixHQUFlLE1BQU0sTUFBNUI7QUFDRDs7QUFFRDs7O0FBR0EsU0FBUyxPQUFULENBQWlCLEdBQWpCLEVBQXNCLEdBQXRCLEVBQ0E7QUFDRSxTQUFRLE9BQU8sR0FBUixHQUFnQixRQUFTLEtBQUssR0FBckM7QUFDRDs7QUFFRCxPQUFPLE9BQVAsR0FBaUIsU0FBUyxHQUFULENBQWEsR0FBYixFQUFrQjtBQUNqQyxTQUFPLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsUUFBbEIsRUFBNEIsRUFBNUIsQ0FBUDtBQUNELENBRkQ7Ozs7O0FDaEtBOzs7Ozs7Ozs7QUFTQSxJQUFJLFVBQVUsUUFBUSxXQUFSLENBQWQ7O0FBRUE7OztBQUdBLFNBQVMsU0FBVCxDQUFtQixDQUFuQixFQUFzQixHQUF0QixFQUNBO0FBQ0U7QUFDQSxJQUFFLE9BQU8sQ0FBVCxLQUFlLFFBQVMsS0FBSyxNQUFNLEVBQW5DO0FBQ0EsSUFBRSxDQUFFLE1BQU0sRUFBTixJQUFZLENBQWIsSUFBbUIsQ0FBcEIsSUFBeUIsRUFBM0IsSUFBaUMsR0FBakM7O0FBRUEsTUFBSSxJQUFJLE1BQU0sRUFBTixDQUFSO0FBQ0EsTUFBSSxJQUFLLFVBQVQ7QUFDQSxNQUFJLElBQUksQ0FBQyxTQUFUO0FBQ0EsTUFBSSxJQUFJLENBQUMsVUFBVDtBQUNBLE1BQUksSUFBSyxTQUFUO0FBQ0EsTUFBSSxJQUFJLENBQUMsVUFBVDs7QUFFQSxPQUFJLElBQUksSUFBSSxDQUFaLEVBQWUsSUFBSSxFQUFFLE1BQXJCLEVBQTZCLEtBQUssRUFBbEMsRUFDQTtBQUNFLFFBQUksT0FBTyxDQUFYO0FBQ0EsUUFBSSxPQUFPLENBQVg7QUFDQSxRQUFJLE9BQU8sQ0FBWDtBQUNBLFFBQUksT0FBTyxDQUFYO0FBQ0EsUUFBSSxPQUFPLENBQVg7O0FBRUEsU0FBSSxJQUFJLElBQUksQ0FBWixFQUFlLElBQUksRUFBbkIsRUFBdUIsR0FBdkIsRUFDQTtBQUNFLFVBQUcsSUFBSSxFQUFQLEVBQVcsRUFBRSxDQUFGLElBQU8sRUFBRSxJQUFJLENBQU4sQ0FBUCxDQUFYLEtBQ0ssRUFBRSxDQUFGLElBQU8sSUFBSSxFQUFFLElBQUUsQ0FBSixJQUFTLEVBQUUsSUFBRSxDQUFKLENBQVQsR0FBa0IsRUFBRSxJQUFFLEVBQUosQ0FBbEIsR0FBNEIsRUFBRSxJQUFFLEVBQUosQ0FBaEMsRUFBeUMsQ0FBekMsQ0FBUDtBQUNMLFVBQUksSUFBSSxTQUFTLFNBQVMsSUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFULEVBQW9CLFFBQVEsQ0FBUixFQUFXLENBQVgsRUFBYyxDQUFkLEVBQWlCLENBQWpCLENBQXBCLENBQVQsRUFDTixTQUFTLFNBQVMsQ0FBVCxFQUFZLEVBQUUsQ0FBRixDQUFaLENBQVQsRUFBNEIsUUFBUSxDQUFSLENBQTVCLENBRE0sQ0FBUjtBQUVBLFVBQUksQ0FBSjtBQUNBLFVBQUksQ0FBSjtBQUNBLFVBQUksSUFBSSxDQUFKLEVBQU8sRUFBUCxDQUFKO0FBQ0EsVUFBSSxDQUFKO0FBQ0EsVUFBSSxDQUFKO0FBQ0Q7O0FBRUQsUUFBSSxTQUFTLENBQVQsRUFBWSxJQUFaLENBQUo7QUFDQSxRQUFJLFNBQVMsQ0FBVCxFQUFZLElBQVosQ0FBSjtBQUNBLFFBQUksU0FBUyxDQUFULEVBQVksSUFBWixDQUFKO0FBQ0EsUUFBSSxTQUFTLENBQVQsRUFBWSxJQUFaLENBQUo7QUFDQSxRQUFJLFNBQVMsQ0FBVCxFQUFZLElBQVosQ0FBSjtBQUNEO0FBQ0QsU0FBTyxNQUFNLENBQU4sRUFBUyxDQUFULEVBQVksQ0FBWixFQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBUDtBQUVEOztBQUVEOzs7O0FBSUEsU0FBUyxPQUFULENBQWlCLENBQWpCLEVBQW9CLENBQXBCLEVBQXVCLENBQXZCLEVBQTBCLENBQTFCLEVBQ0E7QUFDRSxNQUFHLElBQUksRUFBUCxFQUFXLE9BQVEsSUFBSSxDQUFMLEdBQVksQ0FBQyxDQUFGLEdBQU8sQ0FBekI7QUFDWCxNQUFHLElBQUksRUFBUCxFQUFXLE9BQU8sSUFBSSxDQUFKLEdBQVEsQ0FBZjtBQUNYLE1BQUcsSUFBSSxFQUFQLEVBQVcsT0FBUSxJQUFJLENBQUwsR0FBVyxJQUFJLENBQWYsR0FBcUIsSUFBSSxDQUFoQztBQUNYLFNBQU8sSUFBSSxDQUFKLEdBQVEsQ0FBZjtBQUNEOztBQUVEOzs7QUFHQSxTQUFTLE9BQVQsQ0FBaUIsQ0FBakIsRUFDQTtBQUNFLFNBQVEsSUFBSSxFQUFMLEdBQVksVUFBWixHQUEwQixJQUFJLEVBQUwsR0FBWSxVQUFaLEdBQzdCLElBQUksRUFBTCxHQUFXLENBQUMsVUFBWixHQUF5QixDQUFDLFNBRDVCO0FBRUQ7O0FBRUQ7Ozs7QUFJQSxTQUFTLFFBQVQsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFDQTtBQUNFLE1BQUksTUFBTSxDQUFDLElBQUksTUFBTCxLQUFnQixJQUFJLE1BQXBCLENBQVY7QUFDQSxNQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQU4sS0FBYSxLQUFLLEVBQWxCLEtBQXlCLE9BQU8sRUFBaEMsQ0FBVjtBQUNBLFNBQVEsT0FBTyxFQUFSLEdBQWUsTUFBTSxNQUE1QjtBQUNEOztBQUVEOzs7QUFHQSxTQUFTLEdBQVQsQ0FBYSxHQUFiLEVBQWtCLEdBQWxCLEVBQ0E7QUFDRSxTQUFRLE9BQU8sR0FBUixHQUFnQixRQUFTLEtBQUssR0FBckM7QUFDRDs7QUFFRCxPQUFPLE9BQVAsR0FBaUIsU0FBUyxJQUFULENBQWMsR0FBZCxFQUFtQjtBQUNsQyxTQUFPLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsU0FBbEIsRUFBNkIsRUFBN0IsRUFBaUMsSUFBakMsQ0FBUDtBQUNELENBRkQ7Ozs7O0FDakdBOzs7Ozs7OztBQVFBLElBQUksVUFBVSxRQUFRLFdBQVIsQ0FBZDs7QUFFQSxJQUFJLFdBQVcsU0FBWCxRQUFXLENBQVMsQ0FBVCxFQUFZLENBQVosRUFBZTtBQUM1QixNQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQUwsS0FBZ0IsSUFBSSxNQUFwQixDQUFWO0FBQ0EsTUFBSSxNQUFNLENBQUMsS0FBSyxFQUFOLEtBQWEsS0FBSyxFQUFsQixLQUF5QixPQUFPLEVBQWhDLENBQVY7QUFDQSxTQUFRLE9BQU8sRUFBUixHQUFlLE1BQU0sTUFBNUI7QUFDRCxDQUpEOztBQU1BLElBQUksSUFBSSxTQUFKLENBQUksQ0FBUyxDQUFULEVBQVksQ0FBWixFQUFlO0FBQ3JCLFNBQVEsTUFBTSxDQUFQLEdBQWEsS0FBTSxLQUFLLENBQS9CO0FBQ0QsQ0FGRDs7QUFJQSxJQUFJLElBQUksU0FBSixDQUFJLENBQVMsQ0FBVCxFQUFZLENBQVosRUFBZTtBQUNyQixTQUFRLE1BQU0sQ0FBZDtBQUNELENBRkQ7O0FBSUEsSUFBSSxLQUFLLFNBQUwsRUFBSyxDQUFTLENBQVQsRUFBWSxDQUFaLEVBQWUsQ0FBZixFQUFrQjtBQUN6QixTQUFTLElBQUksQ0FBTCxHQUFZLENBQUMsQ0FBRixHQUFPLENBQTFCO0FBQ0QsQ0FGRDs7QUFJQSxJQUFJLE1BQU0sU0FBTixHQUFNLENBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCO0FBQzFCLFNBQVMsSUFBSSxDQUFMLEdBQVcsSUFBSSxDQUFmLEdBQXFCLElBQUksQ0FBakM7QUFDRCxDQUZEOztBQUlBLElBQUksWUFBWSxTQUFaLFNBQVksQ0FBUyxDQUFULEVBQVk7QUFDMUIsU0FBUSxFQUFFLENBQUYsRUFBSyxDQUFMLElBQVUsRUFBRSxDQUFGLEVBQUssRUFBTCxDQUFWLEdBQXFCLEVBQUUsQ0FBRixFQUFLLEVBQUwsQ0FBN0I7QUFDRCxDQUZEOztBQUlBLElBQUksWUFBWSxTQUFaLFNBQVksQ0FBUyxDQUFULEVBQVk7QUFDMUIsU0FBUSxFQUFFLENBQUYsRUFBSyxDQUFMLElBQVUsRUFBRSxDQUFGLEVBQUssRUFBTCxDQUFWLEdBQXFCLEVBQUUsQ0FBRixFQUFLLEVBQUwsQ0FBN0I7QUFDRCxDQUZEOztBQUlBLElBQUksWUFBWSxTQUFaLFNBQVksQ0FBUyxDQUFULEVBQVk7QUFDMUIsU0FBUSxFQUFFLENBQUYsRUFBSyxDQUFMLElBQVUsRUFBRSxDQUFGLEVBQUssRUFBTCxDQUFWLEdBQXFCLEVBQUUsQ0FBRixFQUFLLENBQUwsQ0FBN0I7QUFDRCxDQUZEOztBQUlBLElBQUksWUFBWSxTQUFaLFNBQVksQ0FBUyxDQUFULEVBQVk7QUFDMUIsU0FBUSxFQUFFLENBQUYsRUFBSyxFQUFMLElBQVcsRUFBRSxDQUFGLEVBQUssRUFBTCxDQUFYLEdBQXNCLEVBQUUsQ0FBRixFQUFLLEVBQUwsQ0FBOUI7QUFDRCxDQUZEOztBQUlBLElBQUksY0FBYyxTQUFkLFdBQWMsQ0FBUyxDQUFULEVBQVksQ0FBWixFQUFlO0FBQy9CLE1BQUksSUFBSSxJQUFJLEtBQUosQ0FBVSxVQUFWLEVBQXFCLFVBQXJCLEVBQWdDLFVBQWhDLEVBQTJDLFVBQTNDLEVBQXNELFVBQXRELEVBQWlFLFVBQWpFLEVBQTRFLFVBQTVFLEVBQXVGLFVBQXZGLEVBQWtHLFVBQWxHLEVBQTZHLFVBQTdHLEVBQXdILFVBQXhILEVBQW1JLFVBQW5JLEVBQThJLFVBQTlJLEVBQXlKLFVBQXpKLEVBQW9LLFVBQXBLLEVBQStLLFVBQS9LLEVBQTBMLFVBQTFMLEVBQXFNLFVBQXJNLEVBQWdOLFNBQWhOLEVBQTBOLFVBQTFOLEVBQXFPLFVBQXJPLEVBQWdQLFVBQWhQLEVBQTJQLFVBQTNQLEVBQXNRLFVBQXRRLEVBQWlSLFVBQWpSLEVBQTRSLFVBQTVSLEVBQXVTLFVBQXZTLEVBQWtULFVBQWxULEVBQTZULFVBQTdULEVBQXdVLFVBQXhVLEVBQW1WLFNBQW5WLEVBQTZWLFVBQTdWLEVBQXdXLFVBQXhXLEVBQW1YLFVBQW5YLEVBQThYLFVBQTlYLEVBQXlZLFVBQXpZLEVBQW9aLFVBQXBaLEVBQStaLFVBQS9aLEVBQTBhLFVBQTFhLEVBQXFiLFVBQXJiLEVBQWdjLFVBQWhjLEVBQTJjLFVBQTNjLEVBQXNkLFVBQXRkLEVBQWllLFVBQWplLEVBQTRlLFVBQTVlLEVBQXVmLFVBQXZmLEVBQWtnQixVQUFsZ0IsRUFBNmdCLFVBQTdnQixFQUF3aEIsVUFBeGhCLEVBQW1pQixVQUFuaUIsRUFBOGlCLFVBQTlpQixFQUF5akIsVUFBempCLEVBQW9rQixVQUFwa0IsRUFBK2tCLFVBQS9rQixFQUEwbEIsVUFBMWxCLEVBQXFtQixVQUFybUIsRUFBZ25CLFVBQWhuQixFQUEybkIsVUFBM25CLEVBQXNvQixVQUF0b0IsRUFBaXBCLFVBQWpwQixFQUE0cEIsVUFBNXBCLEVBQXVxQixVQUF2cUIsRUFBa3JCLFVBQWxyQixFQUE2ckIsVUFBN3JCLENBQVI7QUFDQSxNQUFJLE9BQU8sSUFBSSxLQUFKLENBQVUsVUFBVixFQUFzQixVQUF0QixFQUFrQyxVQUFsQyxFQUE4QyxVQUE5QyxFQUEwRCxVQUExRCxFQUFzRSxVQUF0RSxFQUFrRixVQUFsRixFQUE4RixVQUE5RixDQUFYO0FBQ0UsTUFBSSxJQUFJLElBQUksS0FBSixDQUFVLEVBQVYsQ0FBUjtBQUNBLE1BQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQixDQUEvQjtBQUNBLE1BQUksRUFBSixFQUFRLEVBQVI7QUFDRjtBQUNBLElBQUUsS0FBSyxDQUFQLEtBQWEsUUFBUyxLQUFLLElBQUksRUFBL0I7QUFDQSxJQUFFLENBQUUsSUFBSSxFQUFKLElBQVUsQ0FBWCxJQUFpQixDQUFsQixJQUF1QixFQUF6QixJQUErQixDQUEvQjtBQUNBLE9BQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxFQUFFLE1BQXRCLEVBQThCLEtBQUssRUFBbkMsRUFBdUM7QUFDckMsUUFBSSxLQUFLLENBQUwsQ0FBSixDQUFhLElBQUksS0FBSyxDQUFMLENBQUosQ0FBYSxJQUFJLEtBQUssQ0FBTCxDQUFKLENBQWEsSUFBSSxLQUFLLENBQUwsQ0FBSixDQUFhLElBQUksS0FBSyxDQUFMLENBQUosQ0FBYSxJQUFJLEtBQUssQ0FBTCxDQUFKLENBQWEsSUFBSSxLQUFLLENBQUwsQ0FBSixDQUFhLElBQUksS0FBSyxDQUFMLENBQUo7QUFDM0YsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEVBQXBCLEVBQXdCLEdBQXhCLEVBQTZCO0FBQzNCLFVBQUksSUFBSSxFQUFSLEVBQVk7QUFDVixVQUFFLENBQUYsSUFBTyxFQUFFLElBQUksQ0FBTixDQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsVUFBRSxDQUFGLElBQU8sU0FBUyxTQUFTLFNBQVMsVUFBVSxFQUFFLElBQUksQ0FBTixDQUFWLENBQVQsRUFBOEIsRUFBRSxJQUFJLENBQU4sQ0FBOUIsQ0FBVCxFQUFrRCxVQUFVLEVBQUUsSUFBSSxFQUFOLENBQVYsQ0FBbEQsQ0FBVCxFQUFrRixFQUFFLElBQUksRUFBTixDQUFsRixDQUFQO0FBQ0Q7QUFDRCxXQUFLLFNBQVMsU0FBUyxTQUFTLFNBQVMsQ0FBVCxFQUFZLFVBQVUsQ0FBVixDQUFaLENBQVQsRUFBb0MsR0FBRyxDQUFILEVBQU0sQ0FBTixFQUFTLENBQVQsQ0FBcEMsQ0FBVCxFQUEyRCxFQUFFLENBQUYsQ0FBM0QsQ0FBVCxFQUEyRSxFQUFFLENBQUYsQ0FBM0UsQ0FBTDtBQUNBLFdBQUssU0FBUyxVQUFVLENBQVYsQ0FBVCxFQUF1QixJQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUF2QixDQUFMO0FBQ0EsVUFBSSxDQUFKLENBQU8sSUFBSSxDQUFKLENBQU8sSUFBSSxDQUFKLENBQU8sSUFBSSxTQUFTLENBQVQsRUFBWSxFQUFaLENBQUosQ0FBcUIsSUFBSSxDQUFKLENBQU8sSUFBSSxDQUFKLENBQU8sSUFBSSxDQUFKLENBQU8sSUFBSSxTQUFTLEVBQVQsRUFBYSxFQUFiLENBQUo7QUFDaEU7QUFDRCxTQUFLLENBQUwsSUFBVSxTQUFTLENBQVQsRUFBWSxLQUFLLENBQUwsQ0FBWixDQUFWLENBQWdDLEtBQUssQ0FBTCxJQUFVLFNBQVMsQ0FBVCxFQUFZLEtBQUssQ0FBTCxDQUFaLENBQVYsQ0FBZ0MsS0FBSyxDQUFMLElBQVUsU0FBUyxDQUFULEVBQVksS0FBSyxDQUFMLENBQVosQ0FBVixDQUFnQyxLQUFLLENBQUwsSUFBVSxTQUFTLENBQVQsRUFBWSxLQUFLLENBQUwsQ0FBWixDQUFWO0FBQ2hHLFNBQUssQ0FBTCxJQUFVLFNBQVMsQ0FBVCxFQUFZLEtBQUssQ0FBTCxDQUFaLENBQVYsQ0FBZ0MsS0FBSyxDQUFMLElBQVUsU0FBUyxDQUFULEVBQVksS0FBSyxDQUFMLENBQVosQ0FBVixDQUFnQyxLQUFLLENBQUwsSUFBVSxTQUFTLENBQVQsRUFBWSxLQUFLLENBQUwsQ0FBWixDQUFWLENBQWdDLEtBQUssQ0FBTCxJQUFVLFNBQVMsQ0FBVCxFQUFZLEtBQUssQ0FBTCxDQUFaLENBQVY7QUFDakc7QUFDRCxTQUFPLElBQVA7QUFDRCxDQXpCRDs7QUEyQkEsT0FBTyxPQUFQLEdBQWlCLFNBQVMsTUFBVCxDQUFnQixHQUFoQixFQUFxQjtBQUNwQyxTQUFPLFFBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsV0FBbEIsRUFBK0IsRUFBL0IsRUFBbUMsSUFBbkMsQ0FBUDtBQUNELENBRkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVFQSxDQUFDLFVBQVMsQ0FBVCxFQUFXO0FBQUMsTUFBRyxRQUFPLE9BQVAsdURBQU8sT0FBUCxPQUFpQixRQUFqQixJQUEyQixPQUFPLE1BQVAsS0FBZ0IsV0FBOUMsRUFBMEQ7QUFBQyxXQUFPLE9BQVAsR0FBZSxHQUFmO0FBQW1CLEdBQTlFLE1BQW1GLElBQUcsT0FBTyxNQUFQLEtBQWdCLFVBQWhCLElBQTRCLE9BQU8sR0FBdEMsRUFBMEM7QUFBQyxXQUFPLEVBQVAsRUFBVSxDQUFWO0FBQWEsR0FBeEQsTUFBNEQ7QUFBQyxRQUFJLENBQUosQ0FBTSxJQUFHLE9BQU8sTUFBUCxLQUFnQixXQUFuQixFQUErQjtBQUFDLFVBQUUsTUFBRjtBQUFTLEtBQXpDLE1BQThDLElBQUcsT0FBTyxNQUFQLEtBQWdCLFdBQW5CLEVBQStCO0FBQUMsVUFBRSxNQUFGO0FBQVMsS0FBekMsTUFBOEMsSUFBRyxPQUFPLElBQVAsS0FBYyxXQUFqQixFQUE2QjtBQUFDLFVBQUUsSUFBRjtBQUFPLEtBQXJDLE1BQXlDO0FBQUMsVUFBRSxJQUFGO0FBQU8sT0FBRSxJQUFGLEdBQVMsR0FBVDtBQUFhO0FBQUMsQ0FBOVQsRUFBZ1UsWUFBVTtBQUFDLE1BQUksTUFBSixFQUFXLE1BQVgsRUFBa0IsT0FBbEIsQ0FBMEIsT0FBUSxTQUFTLENBQVQsQ0FBVyxDQUFYLEVBQWEsQ0FBYixFQUFlLENBQWYsRUFBaUI7QUFBQyxhQUFTLENBQVQsQ0FBVyxDQUFYLEVBQWEsQ0FBYixFQUFlO0FBQUMsVUFBRyxDQUFDLEVBQUUsQ0FBRixDQUFKLEVBQVM7QUFBQyxZQUFHLENBQUMsRUFBRSxDQUFGLENBQUosRUFBUztBQUFDLGNBQUksSUFBRSxPQUFPLE9BQVAsSUFBZ0IsVUFBaEIsSUFBNEIsT0FBbEMsQ0FBMEMsSUFBRyxDQUFDLENBQUQsSUFBSSxDQUFQLEVBQVMsT0FBTyxFQUFFLENBQUYsRUFBSSxDQUFDLENBQUwsQ0FBUCxDQUFlLElBQUcsQ0FBSCxFQUFLLE9BQU8sRUFBRSxDQUFGLEVBQUksQ0FBQyxDQUFMLENBQVAsQ0FBZSxJQUFJLElBQUUsSUFBSSxLQUFKLENBQVUseUJBQXVCLENBQXZCLEdBQXlCLEdBQW5DLENBQU4sQ0FBOEMsTUFBTSxFQUFFLElBQUYsR0FBTyxrQkFBUCxFQUEwQixDQUFoQztBQUFrQyxhQUFJLElBQUUsRUFBRSxDQUFGLElBQUssRUFBQyxTQUFRLEVBQVQsRUFBWCxDQUF3QixFQUFFLENBQUYsRUFBSyxDQUFMLEVBQVEsSUFBUixDQUFhLEVBQUUsT0FBZixFQUF1QixVQUFTLENBQVQsRUFBVztBQUFDLGNBQUksSUFBRSxFQUFFLENBQUYsRUFBSyxDQUFMLEVBQVEsQ0FBUixDQUFOLENBQWlCLE9BQU8sRUFBRSxJQUFFLENBQUYsR0FBSSxDQUFOLENBQVA7QUFBZ0IsU0FBcEUsRUFBcUUsQ0FBckUsRUFBdUUsRUFBRSxPQUF6RSxFQUFpRixDQUFqRixFQUFtRixDQUFuRixFQUFxRixDQUFyRixFQUF1RixDQUF2RjtBQUEwRixjQUFPLEVBQUUsQ0FBRixFQUFLLE9BQVo7QUFBb0IsU0FBSSxJQUFFLE9BQU8sT0FBUCxJQUFnQixVQUFoQixJQUE0QixPQUFsQyxDQUEwQyxLQUFJLElBQUksSUFBRSxDQUFWLEVBQVksSUFBRSxFQUFFLE1BQWhCLEVBQXVCLEdBQXZCO0FBQTJCLFFBQUUsRUFBRSxDQUFGLENBQUY7QUFBM0IsS0FBbUMsT0FBTyxDQUFQO0FBQVMsR0FBemIsQ0FBMmIsRUFBQyxHQUFFLENBQUMsVUFBUyxPQUFULEVBQWlCLE1BQWpCLEVBQXdCLE9BQXhCLEVBQWdDO0FBQ3owQjs7QUFFQTs7Ozs7QUFIeTBCLFVBT24wQixJQVBtMEI7QUFRdjBCLHdCQUFjO0FBQUE7O0FBQ1osZUFBSyxNQUFMLEdBQWMsc0JBQWMsSUFBZCxDQUFkO0FBQ0EsZUFBSyxXQUFMLEdBQW1CLHNCQUFjLElBQWQsQ0FBbkI7O0FBRUEsZUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFVBQVUsTUFBOUIsRUFBc0MsR0FBdEMsRUFBMkM7QUFDekMsaUJBQUssTUFBTCxDQUFZLFVBQVUsQ0FBVixDQUFaO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7Ozs7QUFqQnUwQjtBQUFBO0FBQUEsaUNBMEJoMEIsT0ExQmcwQixFQTBCdnpCLEtBMUJ1ekIsRUEwQmh6QjtBQUNyQixpQkFBSyxJQUFJLElBQVQsSUFBaUIsT0FBakIsRUFBMEI7QUFDeEIsa0JBQUksYUFBYSxRQUFRLElBQVIsQ0FBakI7QUFDQSxtQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFdBQVcsTUFBL0IsRUFBdUMsR0FBdkMsRUFBNEM7QUFDMUMsb0JBQUksTUFBTSxXQUFXLENBQVgsQ0FBVjtBQUNBLG9CQUFJLENBQUMsS0FBRCxJQUFXLE9BQU8sS0FBSyxNQUEzQixFQUFvQztBQUNsQyx3QkFBTSxJQUFJLEtBQUosc0NBQTRDLEdBQTVDLDRCQUFvRSxLQUFLLE1BQUwsQ0FBWSxHQUFaLENBQXBFLGdCQUE2RixJQUE3RixnRUFBNEosR0FBNUosNkNBQXFNLElBQXJNLFNBQU47QUFDRDs7QUFFRCxxQkFBSyxNQUFMLENBQVksR0FBWixJQUFtQixJQUFuQjtBQUNEOztBQUVEO0FBQ0Esa0JBQUksU0FBUyxDQUFDLEtBQUssV0FBTCxDQUFpQixJQUFqQixDQUFkLEVBQXNDO0FBQ3BDLHFCQUFLLFdBQUwsQ0FBaUIsSUFBakIsSUFBeUIsV0FBVyxDQUFYLENBQXpCO0FBQ0Q7QUFDRjtBQUNGOztBQUVEOzs7O0FBN0N1MEI7QUFBQTtBQUFBLGtDQWdEL3pCLElBaEQrekIsRUFnRHp6QjtBQUNaLG1CQUFPLE9BQU8sSUFBUCxDQUFQO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLE9BQUwsQ0FBYSxVQUFiLEVBQXlCLEVBQXpCLEVBQTZCLFdBQTdCLEVBQVg7QUFDQSxnQkFBSSxNQUFNLEtBQUssT0FBTCxDQUFhLE9BQWIsRUFBc0IsRUFBdEIsRUFBMEIsV0FBMUIsRUFBVjs7QUFFQSxnQkFBSSxVQUFVLEtBQUssTUFBTCxHQUFjLEtBQUssTUFBakM7QUFDQSxnQkFBSSxTQUFTLElBQUksTUFBSixHQUFhLEtBQUssTUFBTCxHQUFjLENBQXhDOztBQUVBLG1CQUFPLENBQUMsVUFBVSxDQUFDLE9BQVosS0FBd0IsS0FBSyxNQUFMLENBQVksR0FBWixDQUF4QixJQUE0QyxJQUFuRDtBQUNEOztBQUVEOzs7O0FBM0R1MEI7QUFBQTtBQUFBLHVDQThEMXpCLElBOUQwekIsRUE4RHB6QjtBQUNqQixtQkFBTyxnQkFBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsS0FBOEIsT0FBTyxFQUE1QztBQUNBLG1CQUFPLFFBQVEsS0FBSyxXQUFMLENBQWlCLEtBQUssV0FBTCxFQUFqQixDQUFSLElBQWdELElBQXZEO0FBQ0Q7QUFqRXMwQjtBQUFBO0FBQUE7O0FBb0V6MEIsYUFBTyxPQUFQLEdBQWlCLElBQWpCO0FBRUQsS0F0RXl5QixFQXNFeHlCLEVBdEV3eUIsQ0FBSCxFQXNFanlCLEdBQUUsQ0FBQyxVQUFTLENBQVQsRUFBVyxNQUFYLEVBQWtCLE9BQWxCLEVBQTBCO0FBQ2pDOztBQUVBLFVBQU0sT0FBTyxFQUFFLFFBQUYsQ0FBYjtBQUNBLGFBQU8sT0FBUCxHQUFpQixJQUFJLElBQUosQ0FBUyxFQUFFLGtCQUFGLENBQVQsRUFBZ0MsRUFBRSxlQUFGLENBQWhDLENBQWpCO0FBRUQsS0FOTyxFQU1OLEVBQUMsVUFBUyxDQUFWLEVBQVksaUJBQWdCLENBQTVCLEVBQThCLG9CQUFtQixDQUFqRCxFQU5NLENBdEUreEIsRUE0RWh2QixHQUFFLENBQUMsVUFBUyxPQUFULEVBQWlCLE1BQWpCLEVBQXdCLE9BQXhCLEVBQWdDO0FBQ3hGLGFBQU8sT0FBUCxHQUFlLEVBQUMsdUJBQXNCLENBQUMsS0FBRCxDQUF2QixFQUErQixxQ0FBb0MsQ0FBQyxLQUFELENBQW5FLEVBQTJFLHFDQUFvQyxDQUFDLEtBQUQsQ0FBL0csRUFBdUgsbUNBQWtDLENBQUMsS0FBRCxDQUF6SixFQUFpSyw4QkFBNkIsQ0FBQyxNQUFELENBQTlMLEVBQXVNLG9DQUFtQyxDQUFDLEtBQUQsQ0FBMU8sRUFBa1AscUNBQW9DLENBQUMsS0FBRCxDQUF0UixFQUE4UixxQ0FBb0MsQ0FBQyxLQUFELENBQWxVLEVBQTBVLDRCQUEyQixDQUFDLEtBQUQsQ0FBclcsRUFBNlcsMkJBQTBCLENBQUMsS0FBRCxFQUFPLE9BQVAsQ0FBdlksRUFBdVosK0RBQThELENBQUMsS0FBRCxDQUFyZCxFQUE2ZCwyQ0FBMEMsQ0FBQyxNQUFELENBQXZnQixFQUFnaEIsNkJBQTRCLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBNWlCLEVBQTJqQixpQ0FBZ0MsQ0FBQyxLQUFELENBQTNsQixFQUFtbUIsOEJBQTZCLENBQUMsTUFBRCxDQUFob0IsRUFBeW9CLCtCQUE4QixDQUFDLE9BQUQsQ0FBdnFCLEVBQWlyQix5Q0FBd0MsQ0FBQyxLQUFELENBQXp0QixFQUFpdUIseUNBQXdDLENBQUMsS0FBRCxDQUF6d0IsRUFBaXhCLGdDQUErQixDQUFDLEtBQUQsQ0FBaHpCLEVBQXd6Qix3Q0FBdUMsQ0FBQyxLQUFELENBQS8xQixFQUF1MkIsNkJBQTRCLENBQUMsS0FBRCxDQUFuNEIsRUFBMjRCLDJDQUEwQyxDQUFDLEtBQUQsQ0FBcjdCLEVBQTY3QiwwREFBeUQsQ0FBQyxLQUFELENBQXQvQixFQUE4L0IsdURBQXNELENBQUMsS0FBRCxDQUFwakMsRUFBNGpDLHdDQUF1QyxDQUFDLEtBQUQsQ0FBbm1DLEVBQTJtQyx1Q0FBc0MsQ0FBQyxNQUFELENBQWpwQyxFQUEwcEMsaUNBQWdDLENBQUMsTUFBRCxDQUExckMsRUFBbXNDLGdDQUErQixDQUFDLFFBQUQsQ0FBbHVDLEVBQTZ1QyxzQ0FBcUMsQ0FBQyxLQUFELENBQWx4QyxFQUEweEMseUNBQXdDLENBQUMsTUFBRCxDQUFsMEMsRUFBMjBDLDhCQUE2QixDQUFDLEtBQUQsQ0FBeDJDLEVBQWczQyxxQ0FBb0MsQ0FBQyxLQUFELENBQXA1QyxFQUE0NUMsdUJBQXNCLENBQUMsS0FBRCxDQUFsN0MsRUFBMDdDLG1DQUFrQyxDQUFDLEtBQUQsQ0FBNTlDLEVBQW8rQyxnQ0FBK0IsQ0FBQyxPQUFELENBQW5nRCxFQUE2Z0Qsd0NBQXVDLENBQUMsS0FBRCxDQUFwakQsRUFBNGpELDhCQUE2QixDQUFDLEtBQUQsQ0FBemxELEVBQWltRCw0QkFBMkIsQ0FBQyxLQUFELENBQTVuRCxFQUFvb0QsK0JBQThCLENBQUMsS0FBRCxDQUFscUQsRUFBMHFELGlDQUFnQyxDQUFDLEtBQUQsRUFBTyxLQUFQLEVBQWEsS0FBYixFQUFtQixLQUFuQixFQUF5QixLQUF6QixDQUExc0QsRUFBMHVELGdEQUErQyxDQUFDLFFBQUQsQ0FBenhELEVBQW95RCxvREFBbUQsQ0FBQyxRQUFELENBQXYxRCxFQUFrMkQsK0JBQThCLENBQUMsS0FBRCxDQUFoNEQsRUFBdzRELGdDQUErQixDQUFDLFNBQUQsQ0FBdjZELEVBQW03RCwrQkFBOEIsQ0FBQyxLQUFELENBQWo5RCxFQUF5OUQsaUNBQWdDLENBQUMsTUFBRCxDQUF6L0QsRUFBa2dFLDBDQUF5QyxDQUFDLE1BQUQsQ0FBM2lFLEVBQW9qRSx5Q0FBd0MsQ0FBQyxNQUFELENBQTVsRSxFQUFxbUUsMENBQXlDLENBQUMsTUFBRCxDQUE5b0UsRUFBdXBFLDBDQUF5QyxDQUFDLE1BQUQsQ0FBaHNFLEVBQXlzRSx5Q0FBd0MsQ0FBQyxLQUFELENBQWp2RSxFQUF5dkUsNkJBQTRCLENBQUMsS0FBRCxDQUFyeEUsRUFBNnhFLDRCQUEyQixDQUFDLEtBQUQsQ0FBeHpFLEVBQWcwRSw0QkFBMkIsQ0FBQyxLQUFELENBQTMxRSxFQUFtMkUsOEJBQTZCLENBQUMsT0FBRCxDQUFoNEUsRUFBMDRFLHdCQUF1QixDQUFDLE1BQUQsQ0FBajZFLEVBQTA2RSxtQ0FBa0MsQ0FBQyxLQUFELENBQTU4RSxFQUFvOUUsNkJBQTRCLENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxLQUFkLEVBQW9CLE1BQXBCLENBQWgvRSxFQUE0Z0YsaUNBQWdDLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBNWlGLEVBQTJqRixvQ0FBbUMsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUE5bEYsRUFBNm1GLDRCQUEyQixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXhvRixFQUF1cEYsMENBQXlDLENBQUMsV0FBRCxDQUFoc0YsRUFBOHNGLHVCQUFzQixDQUFDLEtBQUQsQ0FBcHVGLEVBQTR1Riw2QkFBNEIsQ0FBQyxLQUFELENBQXh3RixFQUFneEYsMkJBQTBCLENBQUMsS0FBRCxDQUExeUYsRUFBa3pGLGdDQUErQixDQUFDLE1BQUQsQ0FBajFGLEVBQTAxRiwrQkFBOEIsQ0FBQyxNQUFELENBQXgzRixFQUFpNEYsMkJBQTBCLENBQUMsS0FBRCxDQUEzNUYsRUFBbTZGLCtCQUE4QixDQUFDLEtBQUQsQ0FBajhGLEVBQXk4RiwyQkFBMEIsQ0FBQyxLQUFELENBQW4rRixFQUEyK0YsZ0NBQStCLENBQUMsS0FBRCxDQUExZ0csRUFBa2hHLDJCQUEwQixDQUFDLEtBQUQsQ0FBNWlHLEVBQW9qRyw2QkFBNEIsQ0FBQyxLQUFELENBQWhsRyxFQUF3bEcsNkJBQTRCLENBQUMsS0FBRCxDQUFwbkcsRUFBNG5HLG9DQUFtQyxDQUFDLEtBQUQsQ0FBL3BHLEVBQXVxRyw4QkFBNkIsQ0FBQyxLQUFELENBQXBzRyxFQUE0c0csNkJBQTRCLENBQUMsS0FBRCxDQUF4dUcsRUFBZ3ZHLGdDQUErQixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQS93RyxFQUE2eEcsK0JBQThCLENBQUMsS0FBRCxDQUEzekcsRUFBbTBHLGlDQUFnQyxDQUFDLEtBQUQsQ0FBbjJHLEVBQTIyRyx1QkFBc0IsQ0FBQyxLQUFELENBQWo0RyxFQUF5NEcsOEJBQTZCLENBQUMsT0FBRCxDQUF0NkcsRUFBZzdHLDZCQUE0QixDQUFDLE1BQUQsRUFBUSxVQUFSLENBQTU4RyxFQUFnK0csOEJBQTZCLENBQUMsS0FBRCxDQUE3L0csRUFBcWdILGlDQUFnQyxDQUFDLEtBQUQsQ0FBcmlILEVBQTZpSCw4QkFBNkIsQ0FBQyxJQUFELEVBQU0sT0FBTixFQUFjLE9BQWQsRUFBc0IsTUFBdEIsQ0FBMWtILEVBQXdtSCwrQkFBOEIsQ0FBQyxLQUFELENBQXRvSCxFQUE4b0gsK0JBQThCLENBQUMsS0FBRCxDQUE1cUgsRUFBb3JILGlDQUFnQyxDQUFDLEtBQUQsQ0FBcHRILEVBQTR0SCxpQ0FBZ0MsQ0FBQyxLQUFELENBQTV2SCxFQUFvd0gsa0NBQWlDLENBQUMsS0FBRCxDQUFyeUgsRUFBNnlILGtDQUFpQyxDQUFDLEtBQUQsQ0FBOTBILEVBQXMxSCxtQ0FBa0MsQ0FBQyxLQUFELENBQXgzSCxFQUFnNEgsb0NBQW1DLENBQUMsS0FBRCxDQUFuNkgsRUFBMjZILGlDQUFnQyxDQUFDLEtBQUQsQ0FBMzhILEVBQW05SCx1Q0FBc0MsQ0FBQyxLQUFELENBQXovSCxFQUFpZ0ksOENBQTZDLENBQUMsS0FBRCxDQUE5aUksRUFBc2pJLDhCQUE2QixDQUFDLEtBQUQsQ0FBbmxJLEVBQTJsSSxvQ0FBbUMsQ0FBQyxLQUFELENBQTluSSxFQUFzb0ksaUNBQWdDLENBQUMsS0FBRCxDQUF0cUksRUFBOHFJLGlDQUFnQyxDQUFDLEtBQUQsQ0FBOXNJLEVBQXN0SSxxQ0FBb0MsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUExdkksRUFBd3dJLDJCQUEwQixDQUFDLEtBQUQsQ0FBbHlJLEVBQTB5SSwyQkFBMEIsQ0FBQyxLQUFELENBQXAwSSxFQUE0MEksNEJBQTJCLENBQUMsS0FBRCxDQUF2MkksRUFBKzJJLHVCQUFzQixDQUFDLEtBQUQsQ0FBcjRJLEVBQTY0SSx3Q0FBdUMsQ0FBQyxNQUFELENBQXA3SSxFQUE2N0ksNENBQTJDLENBQUMsU0FBRCxDQUF4K0ksRUFBby9JLDJDQUEwQyxDQUFDLFFBQUQsQ0FBOWhKLEVBQXlpSix3Q0FBdUMsQ0FBQyxLQUFELENBQWhsSixFQUF3bEosb0NBQW1DLENBQUMsS0FBRCxDQUEzbkosRUFBbW9KLDBCQUF5QixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQTVwSixFQUEwcUosa0NBQWlDLENBQUMsS0FBRCxDQUEzc0osRUFBbXRKLCtCQUE4QixDQUFDLEtBQUQsQ0FBanZKLEVBQXl2SiwyQ0FBMEMsQ0FBQyxLQUFELENBQW55SixFQUEyeUosbUNBQWtDLENBQUMsS0FBRCxDQUE3MEosRUFBcTFKLHVDQUFzQyxDQUFDLEtBQUQsQ0FBMzNKLEVBQW00Six3Q0FBdUMsQ0FBQyxLQUFELENBQTE2SixFQUFrN0osZ0NBQStCLENBQUMsS0FBRCxDQUFqOUosRUFBeTlKLDJCQUEwQixDQUFDLEtBQUQsQ0FBbi9KLEVBQTIvSiw4Q0FBNkMsQ0FBQyxLQUFELENBQXhpSyxFQUFnakssd0JBQXVCLENBQUMsTUFBRCxDQUF2a0ssRUFBZ2xLLHFDQUFvQyxDQUFDLEtBQUQsQ0FBcG5LLEVBQTRuSywyQkFBMEIsQ0FBQyxNQUFELENBQXRwSyxFQUErcEssMkJBQTBCLENBQUMsTUFBRCxDQUF6ckssRUFBa3NLLDBCQUF5QixDQUFDLEtBQUQsQ0FBM3RLLEVBQW11SywyQkFBMEIsQ0FBQyxLQUFELENBQTd2SyxFQUFxd0ssMEJBQXlCLENBQUMsS0FBRCxDQUE5eEssRUFBc3lLLDRCQUEyQixDQUFDLE9BQUQsQ0FBajBLLEVBQTIwSyx3Q0FBdUMsQ0FBQyxXQUFELENBQWwzSyxFQUFnNEssK0JBQThCLENBQUMsS0FBRCxDQUE5NUssRUFBczZLLDhCQUE2QixDQUFDLEtBQUQsRUFBTyxTQUFQLEVBQWlCLFVBQWpCLENBQW44SyxFQUFnK0sseUNBQXdDLENBQUMsS0FBRCxDQUF4Z0wsRUFBZ2hMLHdDQUF1QyxDQUFDLElBQUQsQ0FBdmpMLEVBQThqTCw4QkFBNkIsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUEzbEwsRUFBeW1MLDRCQUEyQixDQUFDLEtBQUQsQ0FBcG9MLEVBQTRvTCxtQ0FBa0MsQ0FBQyxLQUFELENBQTlxTCxFQUFzckwsbUNBQWtDLENBQUMsS0FBRCxDQUF4dEwsRUFBZ3VMLDhCQUE2QixDQUFDLEtBQUQsQ0FBN3ZMLEVBQXF3TCxvQ0FBbUMsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUF4eUwsRUFBc3pMLDRCQUEyQixDQUFDLEtBQUQsQ0FBajFMLEVBQXkxTCw0QkFBMkIsQ0FBQyxLQUFELENBQXAzTCxFQUE0M0wsNEJBQTJCLENBQUMsS0FBRCxDQUF2NUwsRUFBKzVMLHlDQUF3QyxDQUFDLFdBQUQsQ0FBdjhMLEVBQXE5TCwyQ0FBMEMsQ0FBQyxLQUFELENBQS8vTCxFQUF1Z00sMEJBQXlCLENBQUMsS0FBRCxDQUFoaU0sRUFBd2lNLDRCQUEyQixDQUFDLEtBQUQsQ0FBbmtNLEVBQTJrTSx1QkFBc0IsQ0FBQyxLQUFELENBQWptTSxFQUF5bU0seUNBQXdDLENBQUMsS0FBRCxDQUFqcE0sRUFBeXBNLHdCQUF1QixDQUFDLE1BQUQsQ0FBaHJNLEVBQXlyTSxzQ0FBcUMsQ0FBQyxNQUFELENBQTl0TSxFQUF1dU0sMkJBQTBCLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBandNLEVBQSt3TSw4QkFBNkIsQ0FBQyxRQUFELENBQTV5TSxFQUF1ek0sOEJBQTZCLENBQUMsTUFBRCxDQUFwMU0sRUFBNjFNLGdDQUErQixDQUFDLEtBQUQsQ0FBNTNNLEVBQW80TSw2QkFBNEIsQ0FBQyxLQUFELENBQWg2TSxFQUF3Nk0sK0JBQThCLENBQUMsS0FBRCxDQUF0OE0sRUFBODhNLGtDQUFpQyxDQUFDLEtBQUQsRUFBTyxLQUFQLENBQS8rTSxFQUE2L00sK0JBQThCLENBQUMsS0FBRCxDQUEzaE4sRUFBbWlOLDZCQUE0QixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQS9qTixFQUE2a04sOEJBQTZCLENBQUMsTUFBRCxDQUExbU4sRUFBbW5OLGdDQUErQixDQUFDLEtBQUQsQ0FBbHBOLEVBQTBwTix5QkFBd0IsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUFsck4sRUFBZ3NOLHdCQUF1QixDQUFDLEtBQUQsRUFBTyxLQUFQLEVBQWEsS0FBYixFQUFtQixLQUFuQixDQUF2dE4sRUFBaXZOLG9DQUFtQyxDQUFDLEtBQUQsQ0FBcHhOLEVBQTR4TiwrQkFBOEIsQ0FBQyxRQUFELENBQTF6TixFQUFxME4sc0RBQXFELENBQUMsS0FBRCxDQUExM04sRUFBazROLDJEQUEwRCxDQUFDLEtBQUQsQ0FBNTdOLEVBQW84TiwrQkFBOEIsQ0FBQyxLQUFELENBQWwrTixFQUEwK04sa0NBQWlDLENBQUMsS0FBRCxDQUEzZ08sRUFBbWhPLG1DQUFrQyxDQUFDLEtBQUQsQ0FBcmpPLEVBQTZqTywrQkFBOEIsQ0FBQyxLQUFELENBQTNsTyxFQUFtbU8sbUNBQWtDLENBQUMsS0FBRCxDQUFyb08sRUFBNm9PLG1DQUFrQyxDQUFDLEtBQUQsQ0FBL3FPLEVBQXVyTyxpQ0FBZ0MsQ0FBQyxLQUFELENBQXZ0TyxFQUErdE8sb0NBQW1DLENBQUMsU0FBRCxDQUFsd08sRUFBOHdPLHVCQUFzQixDQUFDLEtBQUQsQ0FBcHlPLEVBQTR5TywrQkFBOEIsQ0FBQyxLQUFELENBQTEwTyxFQUFrMU8sc0NBQXFDLENBQUMsT0FBRCxDQUF2M08sRUFBaTRPLHdCQUF1QixDQUFDLEtBQUQsQ0FBeDVPLEVBQWc2Tyx3QkFBdUIsQ0FBQyxLQUFELENBQXY3TyxFQUErN08sa0NBQWlDLENBQUMsS0FBRCxDQUFoK08sRUFBdytPLGtDQUFpQyxDQUFDLEtBQUQsQ0FBemdQLEVBQWloUCx1QkFBc0IsQ0FBQyxLQUFELENBQXZpUCxFQUEraVAsOEJBQTZCLENBQUMsS0FBRCxDQUE1a1AsRUFBb2xQLDhCQUE2QixDQUFDLEtBQUQsQ0FBam5QLEVBQXluUCw4QkFBNkIsQ0FBQyxLQUFELENBQXRwUCxFQUE4cFAsOEJBQTZCLENBQUMsS0FBRCxDQUEzclAsRUFBbXNQLDhCQUE2QixDQUFDLEtBQUQsQ0FBaHVQLEVBQXd1UCw4QkFBNkIsQ0FBQyxLQUFELENBQXJ3UCxFQUE2d1AsOEJBQTZCLENBQUMsS0FBRCxDQUExeVAsRUFBa3pQLHNDQUFxQyxDQUFDLEtBQUQsQ0FBdjFQLEVBQSsxUCxzQ0FBcUMsQ0FBQyxLQUFELENBQXA0UCxFQUE0NFAsbUNBQWtDLENBQUMsS0FBRCxDQUE5NlAsRUFBczdQLCtCQUE4QixDQUFDLEtBQUQsQ0FBcDlQLEVBQTQ5UCxxQ0FBb0MsQ0FBQyxLQUFELENBQWhnUSxFQUF3Z1EsNEJBQTJCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLEVBQXlCLEtBQXpCLEVBQStCLEtBQS9CLENBQW5pUSxFQUF5a1Esa0RBQWlELENBQUMsTUFBRCxDQUExblEsRUFBbW9RLHlEQUF3RCxDQUFDLE1BQUQsQ0FBM3JRLEVBQW9zUSxrREFBaUQsQ0FBQyxNQUFELENBQXJ2USxFQUE4dlEscURBQW9ELENBQUMsTUFBRCxDQUFselEsRUFBMnpRLGlDQUFnQyxDQUFDLEtBQUQsQ0FBMzFRLEVBQW0yUSwrQkFBOEIsQ0FBQyxLQUFELENBQWo0USxFQUF5NFEsMEJBQXlCLENBQUMsS0FBRCxDQUFsNlEsRUFBMDZRLDBCQUF5QixDQUFDLEtBQUQsQ0FBbjhRLEVBQTI4USxrQ0FBaUMsQ0FBQyxNQUFELENBQTUrUSxFQUFxL1EsOEJBQTZCLENBQUMsS0FBRCxDQUFsaFIsRUFBMGhSLGlDQUFnQyxDQUFDLEtBQUQsQ0FBMWpSLEVBQWtrUiw4QkFBNkIsQ0FBQyxLQUFELENBQS9sUixFQUF1bVIsaUNBQWdDLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLENBQXZvUixFQUEycFIsdURBQXNELENBQUMsTUFBRCxDQUFqdFIsRUFBMHRSLDhEQUE2RCxDQUFDLE1BQUQsQ0FBdnhSLEVBQWd5Uix1REFBc0QsQ0FBQyxNQUFELENBQXQxUixFQUErMVIsMkRBQTBELENBQUMsTUFBRCxDQUF6NVIsRUFBazZSLDBEQUF5RCxDQUFDLE1BQUQsQ0FBMzlSLEVBQW8rUiw4QkFBNkIsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUFqZ1MsRUFBK2dTLG9EQUFtRCxDQUFDLE1BQUQsQ0FBbGtTLEVBQTJrUyxvREFBbUQsQ0FBQyxNQUFELENBQTluUyxFQUF1b1MsNEJBQTJCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLENBQWxxUyxFQUE0clMsMEJBQXlCLENBQUMsS0FBRCxDQUFydFMsRUFBNnRTLGtDQUFpQyxDQUFDLEtBQUQsQ0FBOXZTLEVBQXN3Uyx3QkFBdUIsQ0FBQyxNQUFELENBQTd4UyxFQUFzeVMsNEJBQTJCLENBQUMsS0FBRCxDQUFqMFMsRUFBeTBTLCtCQUE4QixDQUFDLE1BQUQsQ0FBdjJTLEVBQWczUyx5QkFBd0IsQ0FBQyxRQUFELENBQXg0UyxFQUFtNVMscUNBQW9DLENBQUMsS0FBRCxDQUF2N1MsRUFBKzdTLHdCQUF1QixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXQ5UyxFQUFxK1Msc0NBQXFDLENBQUMsS0FBRCxDQUExZ1QsRUFBa2hULG1DQUFrQyxDQUFDLEtBQUQsQ0FBcGpULEVBQTRqVCxnQ0FBK0IsQ0FBQyxLQUFELENBQTNsVCxFQUFtbVQscUNBQW9DLENBQUMsT0FBRCxDQUF2b1QsRUFBaXBULGdEQUErQyxDQUFDLFFBQUQsQ0FBaHNULEVBQTJzVCxzQ0FBcUMsQ0FBQyxNQUFELENBQWh2VCxFQUF5dlQsdUNBQXNDLENBQUMsTUFBRCxDQUEveFQsRUFBd3lULGdDQUErQixDQUFDLEtBQUQsQ0FBdjBULEVBQSswVCxnQ0FBK0IsQ0FBQyxLQUFELENBQTkyVCxFQUFzM1QsZ0NBQStCLENBQUMsS0FBRCxDQUFyNVQsRUFBNjVULDRDQUEyQyxDQUFDLEtBQUQsQ0FBeDhULEVBQWc5VCxxREFBb0QsQ0FBQyxLQUFELENBQXBnVSxFQUE0Z1UsK0NBQThDLENBQUMsS0FBRCxDQUExalUsRUFBa2tVLDhDQUE2QyxDQUFDLEtBQUQsQ0FBL21VLEVBQXVuVSx1REFBc0QsQ0FBQyxNQUFELENBQTdxVSxFQUFzclUsK0NBQThDLENBQUMsS0FBRCxDQUFwdVUsRUFBNHVVLHdEQUF1RCxDQUFDLEtBQUQsQ0FBbnlVLEVBQTJ5VSw0Q0FBMkMsQ0FBQyxLQUFELENBQXQxVSxFQUE4MVUscURBQW9ELENBQUMsS0FBRCxDQUFsNVUsRUFBMDVVLG1EQUFrRCxDQUFDLEtBQUQsQ0FBNThVLEVBQW85VSw0REFBMkQsQ0FBQyxLQUFELENBQS9nVixFQUF1aFYsa0RBQWlELENBQUMsS0FBRCxDQUF4a1YsRUFBZ2xWLDJEQUEwRCxDQUFDLEtBQUQsQ0FBMW9WLEVBQWtwViwyQ0FBMEMsQ0FBQyxLQUFELENBQTVyVixFQUFvc1Ysa0RBQWlELENBQUMsS0FBRCxDQUFydlYsRUFBNnZWLG9EQUFtRCxDQUFDLEtBQUQsQ0FBaHpWLEVBQXd6ViwrQ0FBOEMsQ0FBQyxLQUFELENBQXQyVixFQUE4MlYsOEJBQTZCLENBQUMsSUFBRCxDQUEzNFYsRUFBazVWLCtCQUE4QixDQUFDLEtBQUQsQ0FBaDdWLEVBQXc3ViwyQ0FBMEMsQ0FBQyxLQUFELENBQWwrVixFQUEwK1YsNkVBQTRFLENBQUMsTUFBRCxDQUF0alcsRUFBK2pXLHNFQUFxRSxDQUFDLE1BQUQsQ0FBcG9XLEVBQTZvVywwRUFBeUUsQ0FBQyxNQUFELENBQXR0VyxFQUErdFcseUVBQXdFLENBQUMsTUFBRCxDQUF2eVcsRUFBZ3pXLHFFQUFvRSxDQUFDLE1BQUQsQ0FBcDNXLEVBQTYzVyx3RUFBdUUsQ0FBQyxNQUFELENBQXA4VyxFQUE2OFcsMkVBQTBFLENBQUMsTUFBRCxDQUF2aFgsRUFBZ2lYLDJFQUEwRSxDQUFDLE1BQUQsQ0FBMW1YLEVBQW1uWCwwQ0FBeUMsQ0FBQyxLQUFELENBQTVwWCxFQUFvcVgsMkJBQTBCLENBQUMsSUFBRCxDQUE5clgsRUFBcXNYLGtDQUFpQyxDQUFDLEtBQUQsQ0FBdHVYLEVBQTh1WCx3QkFBdUIsQ0FBQyxLQUFELEVBQU8sS0FBUCxFQUFhLE1BQWIsQ0FBcndYLEVBQTB4WCw2QkFBNEIsQ0FBQyxLQUFELENBQXR6WCxFQUE4elgsNkJBQTRCLENBQUMsS0FBRCxDQUExMVgsRUFBazJYLDZCQUE0QixDQUFDLEtBQUQsQ0FBOTNYLEVBQXM0WCwwQkFBeUIsQ0FBQyxNQUFELENBQS81WCxFQUF3NlgsOEJBQTZCLENBQUMsSUFBRCxDQUFyOFgsRUFBNDhYLCtCQUE4QixDQUFDLEtBQUQsQ0FBMStYLEVBQWsvWCxpQ0FBZ0MsQ0FBQyxLQUFELENBQWxoWSxFQUEwaFksc0NBQXFDLENBQUMsS0FBRCxDQUEvalksRUFBdWtZLG9DQUFtQyxDQUFDLEtBQUQsQ0FBMW1ZLEVBQWtuWSx5Q0FBd0MsQ0FBQyxLQUFELENBQTFwWSxFQUFrcVksNkJBQTRCLENBQUMsTUFBRCxDQUE5clksRUFBdXNZLHFDQUFvQyxDQUFDLEtBQUQsRUFBTyxLQUFQLEVBQWEsS0FBYixFQUFtQixLQUFuQixFQUF5QixLQUF6QixFQUErQixLQUEvQixDQUEzdVksRUFBaXhZLCtCQUE4QixDQUFDLEtBQUQsQ0FBL3lZLEVBQXV6WSxzQ0FBcUMsQ0FBQyxLQUFELENBQTUxWSxFQUFvMlksMENBQXlDLENBQUMsVUFBRCxDQUE3NFksRUFBMDVZLGtDQUFpQyxDQUFDLFlBQUQsQ0FBMzdZLEVBQTA4WSwyQkFBMEIsQ0FBQyxLQUFELENBQXArWSxFQUE0K1ksZ0NBQStCLENBQUMsSUFBRCxDQUEzZ1osRUFBa2haLG9DQUFtQyxDQUFDLE1BQUQsQ0FBcmpaLEVBQThqWixzQ0FBcUMsQ0FBQyxRQUFELENBQW5tWixFQUE4bVosd0NBQXVDLENBQUMsSUFBRCxDQUFycFosRUFBNHBaLDJCQUEwQixDQUFDLEtBQUQsQ0FBdHJaLEVBQThyWix3QkFBdUIsQ0FBQyxNQUFELENBQXJ0WixFQUE4dFosd0JBQXVCLENBQUMsTUFBRCxDQUFydlosRUFBOHZaLHdCQUF1QixDQUFDLE1BQUQsQ0FBcnhaLEVBQTh4WiwyQ0FBMEMsQ0FBQyxLQUFELENBQXgwWixFQUFnMVosK0NBQThDLENBQUMsS0FBRCxDQUE5M1osRUFBczRaLDhDQUE2QyxDQUFDLEtBQUQsQ0FBbjdaLEVBQTI3WiwwQ0FBeUMsQ0FBQyxLQUFELENBQXArWixFQUE0K1osc0NBQXFDLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBamhhLEVBQWdpYSx3QkFBdUIsQ0FBQyxLQUFELENBQXZqYSxFQUEramEsaUNBQWdDLENBQUMsU0FBRCxDQUEvbGEsRUFBMm1hLG1DQUFrQyxDQUFDLE1BQUQsRUFBUSxNQUFSLENBQTdvYSxFQUE2cGEsZ0NBQStCLENBQUMsS0FBRCxDQUE1cmEsRUFBb3NhLGdDQUErQixDQUFDLEtBQUQsQ0FBbnVhLEVBQTJ1YSxxQ0FBb0MsQ0FBQyxLQUFELENBQS93YSxFQUF1eGEscUNBQW9DLENBQUMsS0FBRCxDQUEzemEsRUFBbTBhLHdDQUF1QyxDQUFDLEtBQUQsQ0FBMTJhLEVBQWszYSxxQ0FBb0MsQ0FBQyxLQUFELENBQXQ1YSxFQUE4NWEsdUNBQXNDLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBcDhhLEVBQWs5YSw4Q0FBNkMsQ0FBQyxLQUFELENBQS8vYSxFQUF1Z2IscUNBQW9DLENBQUMsT0FBRCxDQUEzaWIsRUFBcWpiLHVDQUFzQyxDQUFDLElBQUQsQ0FBM2xiLEVBQWttYixnQ0FBK0IsQ0FBQyxNQUFELENBQWpvYixFQUEwb2IsZ0NBQStCLENBQUMsS0FBRCxDQUF6cWIsRUFBaXJiLHlDQUF3QyxDQUFDLEtBQUQsQ0FBenRiLEVBQWl1YixnQ0FBK0IsQ0FBQyxLQUFELENBQWh3YixFQUF3d2IseUNBQXdDLENBQUMsS0FBRCxDQUFoemIsRUFBd3piLG1DQUFrQyxDQUFDLEtBQUQsQ0FBMTFiLEVBQWsyYiw0Q0FBMkMsQ0FBQyxLQUFELENBQTc0YixFQUFxNWIsZ0NBQStCLENBQUMsS0FBRCxDQUFwN2IsRUFBNDdiLGtDQUFpQyxDQUFDLEtBQUQsQ0FBNzliLEVBQXErYix5Q0FBd0MsQ0FBQyxLQUFELENBQTdnYyxFQUFxaGMsMkNBQTBDLENBQUMsS0FBRCxDQUEvamMsRUFBdWtjLGdDQUErQixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXRtYyxFQUFxbmMsdUJBQXNCLENBQUMsS0FBRCxDQUEzb2MsRUFBbXBjLG1DQUFrQyxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXJyYyxFQUFvc2MsOEJBQTZCLENBQUMsS0FBRCxDQUFqdWMsRUFBeXVjLG1DQUFrQyxDQUFDLEtBQUQsQ0FBM3djLEVBQW14YyxpQ0FBZ0MsQ0FBQyxLQUFELENBQW56YyxFQUEyemMsNkNBQTRDLENBQUMsS0FBRCxDQUF2MmMsRUFBKzJjLGdDQUErQixDQUFDLE1BQUQsRUFBUSxLQUFSLEVBQWMsS0FBZCxDQUE5NGMsRUFBbTZjLGtDQUFpQyxDQUFDLEtBQUQsQ0FBcDhjLEVBQTQ4Yyw0QkFBMkIsQ0FBQyxLQUFELENBQXYrYyxFQUErK2MsZ0NBQStCLENBQUMsS0FBRCxDQUE5Z2QsRUFBc2hkLDJCQUEwQixDQUFDLEtBQUQsQ0FBaGpkLEVBQXdqZCx3QkFBdUIsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUEva2QsRUFBOGxkLDZCQUE0QixDQUFDLEtBQUQsQ0FBMW5kLEVBQWtvZCwwQkFBeUIsQ0FBQyxLQUFELENBQTNwZCxFQUFtcWQseUJBQXdCLENBQUMsVUFBRCxDQUEzcmQsRUFBd3NkLDRCQUEyQixDQUFDLE1BQUQsQ0FBbnVkLEVBQTR1ZCx1QkFBc0IsQ0FBQyxLQUFELENBQWx3ZCxFQUEwd2QseUJBQXdCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLENBQWx5ZCxFQUE0emQsNkJBQTRCLENBQUMsS0FBRCxDQUF4MWQsRUFBZzJkLHVCQUFzQixDQUFDLEtBQUQsQ0FBdDNkLEVBQTgzZCw2QkFBNEIsQ0FBQyxPQUFELENBQTE1ZCxFQUFvNmQsNEJBQTJCLENBQUMsTUFBRCxDQUEvN2QsRUFBdzhkLGtDQUFpQyxDQUFDLE9BQUQsQ0FBeitkLEVBQW0vZCw0QkFBMkIsQ0FBQyxLQUFELENBQTlnZSxFQUFzaGUsa0NBQWlDLENBQUMsS0FBRCxDQUF2amUsRUFBK2plLCtCQUE4QixDQUFDLEtBQUQsQ0FBN2xlLEVBQXFtZSx1QkFBc0IsQ0FBQyxLQUFELENBQTNuZSxFQUFtb2UsMEJBQXlCLENBQUMsS0FBRCxDQUE1cGUsRUFBb3FlLHdCQUF1QixDQUFDLEtBQUQsQ0FBM3JlLEVBQW1zZSx3QkFBdUIsQ0FBQyxNQUFELENBQTF0ZSxFQUFtdWUsaUNBQWdDLENBQUMsS0FBRCxDQUFud2UsRUFBMndlLG9DQUFtQyxDQUFDLEtBQUQsQ0FBOXllLEVBQXN6ZSxtQ0FBa0MsQ0FBQyxLQUFELENBQXgxZSxFQUFnMmUsMENBQXlDLENBQUMsS0FBRCxDQUF6NGUsRUFBaTVlLHFEQUFvRCxDQUFDLFFBQUQsQ0FBcjhlLEVBQWc5ZSxxQ0FBb0MsQ0FBQyxLQUFELENBQXAvZSxFQUE0L2Usc0NBQXFDLENBQUMsS0FBRCxDQUFqaWYsRUFBeWlmLDJDQUEwQyxDQUFDLEtBQUQsQ0FBbmxmLEVBQTJsZix1QkFBc0IsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUFqbmYsRUFBZ29mLGtDQUFpQyxDQUFDLEtBQUQsQ0FBanFmLEVBQXlxZiwrQkFBOEIsQ0FBQyxJQUFELENBQXZzZixFQUE4c2YseUJBQXdCLENBQUMsS0FBRCxDQUF0dWYsRUFBOHVmLGdDQUErQixDQUFDLEtBQUQsQ0FBN3dmLEVBQXF4ZixpQ0FBZ0MsRUFBcnpmLEVBQXd6ZixxQkFBb0IsQ0FBQyxLQUFELENBQTUwZixFQUFvMWYsZ0NBQStCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLENBQW4zZixFQUE2NGYsZ0NBQStCLENBQUMsS0FBRCxDQUE1NmYsRUFBbzdmLGdDQUErQixDQUFDLEtBQUQsQ0FBbjlmLEVBQTI5Zix1QkFBc0IsQ0FBQyxPQUFELENBQWovZixFQUEyL2Ysc0JBQXFCLEVBQWhoZ0IsRUFBbWhnQiw0QkFBMkIsQ0FBQyxTQUFELENBQTlpZ0IsRUFBMGpnQix1QkFBc0IsQ0FBQyxLQUFELEVBQU8sT0FBUCxDQUFobGdCLEVBQWdtZ0Isc0JBQXFCLENBQUMsSUFBRCxDQUFybmdCLEVBQTRuZ0IsdUJBQXNCLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBbHBnQixFQUFncWdCLHFCQUFvQixDQUFDLEtBQUQsRUFBTyxLQUFQLEVBQWEsS0FBYixFQUFtQixLQUFuQixFQUF5QixLQUF6QixDQUFwcmdCLEVBQW90Z0Isd0JBQXVCLENBQUMsS0FBRCxDQUEzdWdCLEVBQW12Z0IsZ0NBQStCLENBQUMsS0FBRCxDQUFseGdCLEVBQTB4Z0Isc0JBQXFCLENBQUMsTUFBRCxDQUEveWdCLEVBQXd6Z0IsMkJBQTBCLENBQUMsS0FBRCxDQUFsMWdCLEVBQTAxZ0Isa0NBQWlDLENBQUMsS0FBRCxDQUEzM2dCLEVBQW00Z0IsdUJBQXNCLENBQUMsS0FBRCxDQUF6NWdCLEVBQWk2Z0IsNEJBQTJCLENBQUMsS0FBRCxDQUE1N2dCLEVBQW84Z0Isc0JBQXFCLENBQUMsTUFBRCxDQUF6OWdCLEVBQWsrZ0IscUJBQW9CLENBQUMsS0FBRCxDQUF0L2dCLEVBQTgvZ0IsZ0NBQStCLENBQUMsTUFBRCxDQUE3aGhCLEVBQXNpaEIsZ0NBQStCLENBQUMsS0FBRCxDQUFya2hCLEVBQTZraEIsMEJBQXlCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLEVBQXlCLEtBQXpCLEVBQStCLEtBQS9CLEVBQXFDLEtBQXJDLEVBQTJDLEtBQTNDLEVBQWlELEtBQWpELENBQXRtaEIsRUFBOHBoQixzQkFBcUIsQ0FBQyxLQUFELENBQW5yaEIsRUFBMnJoQiw0QkFBMkIsQ0FBQyxLQUFELENBQXR0aEIsRUFBOHRoQiw0QkFBMkIsQ0FBQyxLQUFELENBQXp2aEIsRUFBaXdoQixpQ0FBZ0MsQ0FBQyxLQUFELENBQWp5aEIsRUFBeXloQixxQkFBb0IsQ0FBQyxLQUFELENBQTd6aEIsRUFBcTBoQix1QkFBc0IsQ0FBQyxLQUFELENBQTMxaEIsRUFBbTJoQixxQkFBb0IsQ0FBQyxLQUFELENBQXYzaEIsRUFBKzNoQiwwQkFBeUIsQ0FBQyxLQUFELENBQXg1aEIsRUFBZzZoQixrQ0FBaUMsQ0FBQyxLQUFELENBQWo4aEIsRUFBeThoQixnQ0FBK0IsQ0FBQyxLQUFELENBQXgraEIsRUFBZy9oQiwwQkFBeUIsRUFBemdpQixFQUE0Z2lCLDBCQUF5QixDQUFDLEtBQUQsQ0FBcmlpQixFQUE2aWlCLDBCQUF5QixDQUFDLEtBQUQsQ0FBdGtpQixFQUE4a2lCLDBCQUF5QixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQXZtaUIsRUFBcW5pQiw0QkFBMkIsQ0FBQyxLQUFELEVBQU8sS0FBUCxFQUFhLEtBQWIsRUFBbUIsS0FBbkIsQ0FBaHBpQixFQUEwcWlCLHlCQUF3QixDQUFDLEtBQUQsQ0FBbHNpQixFQUEwc2lCLDhCQUE2QixDQUFDLEtBQUQsQ0FBdnVpQixFQUErdWlCLGdDQUErQixDQUFDLEtBQUQsQ0FBOXdpQixFQUFzeGlCLHVCQUFzQixDQUFDLEtBQUQsQ0FBNXlpQixFQUFvemlCLDBCQUF5QixDQUFDLFVBQUQsQ0FBNzBpQixFQUEwMWlCLDRCQUEyQixDQUFDLFFBQUQsQ0FBcjNpQixFQUFnNGlCLHNCQUFxQixDQUFDLE1BQUQsQ0FBcjVpQixFQUE4NWlCLHFCQUFvQixDQUFDLEtBQUQsQ0FBbDdpQixFQUEwN2lCLDJCQUEwQixDQUFDLEtBQUQsQ0FBcDlpQixFQUE0OWlCLHNDQUFxQyxDQUFDLFNBQUQsQ0FBamdqQixFQUE2Z2pCLCtCQUE4QixFQUEzaWpCLEVBQThpakIsbUNBQWtDLENBQUMsU0FBRCxDQUFobGpCLEVBQTRsakIsZ0NBQStCLENBQUMsTUFBRCxDQUEzbmpCLEVBQW9vakIsdUJBQXNCLENBQUMsT0FBRCxDQUExcGpCLEVBQW9xakIsOEJBQTZCLENBQUMsTUFBRCxDQUFqc2pCLEVBQTBzakIsZ0NBQStCLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBenVqQixFQUF1dmpCLDBCQUF5QixDQUFDLEtBQUQsQ0FBaHhqQixFQUF3eGpCLHFCQUFvQixDQUFDLEtBQUQsQ0FBNXlqQixFQUFvempCLGtDQUFpQyxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXIxakIsRUFBbzJqQixnQ0FBK0IsQ0FBQyxhQUFELENBQW40akIsRUFBbTVqQiw2QkFBNEIsQ0FBQyxLQUFELENBQS82akIsRUFBdTdqQix3QkFBdUIsQ0FBQyxLQUFELENBQTk4akIsRUFBczlqQix3QkFBdUIsQ0FBQyxLQUFELENBQTcrakIsRUFBcS9qQix5QkFBd0IsQ0FBQyxNQUFELENBQTdna0IsRUFBc2hrQiwwQkFBeUIsQ0FBQyxLQUFELENBQS9pa0IsRUFBdWprQiwwQkFBeUIsQ0FBQyxLQUFELENBQWhsa0IsRUFBd2xrQiw0QkFBMkIsQ0FBQyxLQUFELENBQW5ua0IsRUFBMm5rQix3QkFBdUIsQ0FBQyxLQUFELENBQWxwa0IsRUFBMHBrQiwrQkFBOEIsRUFBeHJrQixFQUEycmtCLDRCQUEyQixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQXR0a0IsRUFBb3VrQiw2QkFBNEIsQ0FBQyxLQUFELEVBQU8sS0FBUCxFQUFhLEtBQWIsQ0FBaHdrQixFQUFveGtCLDRCQUEyQixDQUFDLEtBQUQsRUFBTyxLQUFQLEVBQWEsS0FBYixDQUEveWtCLEVBQW0wa0IseUJBQXdCLENBQUMsS0FBRCxDQUEzMWtCLEVBQW0ya0IsNkJBQTRCLENBQUMsS0FBRCxDQUEvM2tCLEVBQXU0a0IsNEJBQTJCLENBQUMsS0FBRCxDQUFsNmtCLEVBQTA2a0IsNEJBQTJCLENBQUMsS0FBRCxDQUFyOGtCLEVBQTY4a0IseUJBQXdCLENBQUMsS0FBRCxDQUFyK2tCLEVBQTYra0Isd0JBQXVCLENBQUMsSUFBRCxFQUFNLEtBQU4sQ0FBcGdsQixFQUFpaGxCLHFDQUFvQyxDQUFDLEtBQUQsQ0FBcmpsQixFQUE2amxCLHFCQUFvQixDQUFDLEtBQUQsQ0FBamxsQixFQUF5bGxCLHNCQUFxQixDQUFDLElBQUQsRUFBTSxJQUFOLENBQTltbEIsRUFBMG5sQix1QkFBc0IsRUFBaHBsQixFQUFtcGxCLHdCQUF1QixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQTFxbEIsRUFBd3JsQixvQ0FBbUMsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUEzdGxCLEVBQXl1bEIsbUNBQWtDLENBQUMsS0FBRCxDQUEzd2xCLEVBQW14bEIsZ0NBQStCLENBQUMsS0FBRCxDQUFsemxCLEVBQTB6bEIsd0NBQXVDLENBQUMsS0FBRCxDQUFqMmxCLEVBQXkybEIsdUNBQXNDLENBQUMsS0FBRCxDQUEvNGxCLEVBQXU1bEIscUJBQW9CLENBQUMsS0FBRCxDQUEzNmxCLEVBQW03bEIsb0JBQW1CLENBQUMsSUFBRCxDQUF0OGxCLEVBQTY4bEIsc0JBQXFCLENBQUMsTUFBRCxDQUFsK2xCLEVBQTIrbEIsaUNBQWdDLENBQUMsS0FBRCxDQUEzZ21CLEVBQW1obUIsaUNBQWdDLENBQUMsS0FBRCxDQUFuam1CLEVBQTJqbUIscUJBQW9CLENBQUMsS0FBRCxDQUEva21CLEVBQXVsbUIseUJBQXdCLENBQUMsS0FBRCxDQUEvbW1CLEVBQXVubUIsMEJBQXlCLENBQUMsTUFBRCxDQUFocG1CLEVBQXlwbUIsd0JBQXVCLENBQUMsS0FBRCxDQUFocm1CLEVBQXdybUIseUJBQXdCLENBQUMsU0FBRCxDQUFodG1CLEVBQTR0bUIsd0JBQXVCLENBQUMsUUFBRCxDQUFudm1CLEVBQTh2bUIsNEJBQTJCLENBQUMsSUFBRCxDQUF6eG1CLEVBQWd5bUIsc0JBQXFCLENBQUMsS0FBRCxDQUFyem1CLEVBQTZ6bUIscUJBQW9CLENBQUMsS0FBRCxDQUFqMW1CLEVBQXkxbUIscUJBQW9CLENBQUMsS0FBRCxFQUFPLElBQVAsQ0FBNzJtQixFQUEwM21CLHFCQUFvQixDQUFDLEtBQUQsQ0FBOTRtQixFQUFzNW1CLHlCQUF3QixDQUFDLEtBQUQsQ0FBOTZtQixFQUFzN21CLHlCQUF3QixDQUFDLFNBQUQsRUFBVyxNQUFYLENBQTk4bUIsRUFBaSttQixzQkFBcUIsQ0FBQyxLQUFELENBQXQvbUIsRUFBOC9tQix1QkFBc0IsQ0FBQyxPQUFELENBQXBobkIsRUFBOGhuQixnQ0FBK0IsQ0FBQyxLQUFELENBQTdqbkIsRUFBcWtuQixnQ0FBK0IsQ0FBQyxLQUFELENBQXBtbkIsRUFBNG1uQixnQ0FBK0IsQ0FBQyxLQUFELENBQTNvbkIsRUFBbXBuQixpQ0FBZ0MsQ0FBQyxNQUFELENBQW5ybkIsRUFBNHJuQix5Q0FBd0MsQ0FBQyxjQUFELENBQXB1bkIsRUFBcXZuQixnQ0FBK0IsQ0FBQyxLQUFELENBQXB4bkIsRUFBNHhuQixnQ0FBK0IsQ0FBQyxLQUFELENBQTN6bkIsRUFBbTBuQixpQ0FBZ0MsQ0FBQyxNQUFELENBQW4ybkIsRUFBNDJuQiw2QkFBNEIsQ0FBQyxLQUFELENBQXg0bkIsRUFBZzVuQix1Q0FBc0MsQ0FBQyxRQUFELENBQXQ3bkIsRUFBaThuQiw4QkFBNkIsQ0FBQyxLQUFELEVBQU8sS0FBUCxFQUFhLEtBQWIsQ0FBOTluQixFQUFrL25CLHNCQUFxQixDQUFDLEtBQUQsQ0FBdmdvQixFQUErZ29CLDJCQUEwQixDQUFDLEtBQUQsQ0FBemlvQixFQUFpam9CLDJCQUEwQixDQUFDLEtBQUQsQ0FBM2tvQixFQUFtbG9CLG9CQUFtQixDQUFDLElBQUQsQ0FBdG1vQixFQUE2bW9CLDBCQUF5QixDQUFDLElBQUQsRUFBTSxJQUFOLEVBQVcsSUFBWCxFQUFnQixJQUFoQixFQUFxQixJQUFyQixFQUEwQixJQUExQixFQUErQixJQUEvQixFQUFvQyxJQUFwQyxDQUF0b29CLEVBQWdyb0Isd0JBQXVCLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBdnNvQixFQUFzdG9CLDJCQUEwQixDQUFDLEtBQUQsQ0FBaHZvQixFQUF3dm9CLGlCQUFnQixDQUFDLEtBQUQsQ0FBeHdvQixFQUFneG9CLGlCQUFnQixDQUFDLEtBQUQsQ0FBaHlvQixFQUF3eW9CLG9CQUFtQixDQUFDLE9BQUQsQ0FBM3pvQixFQUFxMG9CLDBCQUF5QixDQUFDLEtBQUQsQ0FBOTFvQixFQUFzMm9CLG9DQUFtQyxDQUFDLEtBQUQsQ0FBejRvQixFQUFpNW9CLDZCQUE0QixDQUFDLFdBQUQsQ0FBNzZvQixFQUEyN29CLDZCQUE0QixDQUFDLFdBQUQsQ0FBdjlvQixFQUFxK29CLDZCQUE0QixDQUFDLFdBQUQsQ0FBamdwQixFQUErZ3BCLGlCQUFnQixDQUFDLEtBQUQsQ0FBL2hwQixFQUF1aXBCLGVBQWMsQ0FBQyxLQUFELENBQXJqcEIsRUFBNmpwQixnQkFBZSxDQUFDLEtBQUQsRUFBTyxNQUFQLEVBQWMsTUFBZCxDQUE1a3BCLEVBQWttcEIsZUFBYyxDQUFDLEtBQUQsQ0FBaG5wQixFQUF3bnBCLGdCQUFlLENBQUMsTUFBRCxDQUF2b3BCLEVBQWdwcEIsZUFBYyxFQUE5cHBCLEVBQWlxcEIsb0JBQW1CLENBQUMsS0FBRCxDQUFwcnBCLEVBQTRycEIsbUJBQWtCLENBQUMsS0FBRCxDQUE5c3BCLEVBQXN0cEIsa0JBQWlCLENBQUMsS0FBRCxDQUF2dXBCLEVBQSt1cEIsa0JBQWlCLENBQUMsS0FBRCxDQUFod3BCLEVBQXd3cEIsd0JBQXVCLENBQUMsS0FBRCxFQUFPLElBQVAsQ0FBL3hwQixFQUE0eXBCLCtCQUE4QixDQUFDLEtBQUQsQ0FBMTBwQixFQUFrMXBCLHFCQUFvQixFQUF0MnBCLEVBQXkycEIsZUFBYyxFQUF2M3BCLEVBQTAzcEIsa0JBQWlCLENBQUMsS0FBRCxDQUEzNHBCLEVBQW01cEIsa0JBQWlCLENBQUMsS0FBRCxDQUFwNnBCLEVBQTQ2cEIsbUJBQWtCLENBQUMsTUFBRCxDQUE5N3BCLEVBQXU4cEIsa0JBQWlCLENBQUMsS0FBRCxDQUF4OXBCLEVBQWcrcEIsbUJBQWtCLENBQUMsTUFBRCxDQUFsL3BCLEVBQTIvcEIsa0JBQWlCLENBQUMsS0FBRCxDQUE1Z3FCLEVBQW9ocUIsa0JBQWlCLENBQUMsTUFBRCxDQUFyaXFCLEVBQThpcUIsNkJBQTRCLENBQUMsS0FBRCxDQUExa3FCLEVBQWtscUIsMEJBQXlCLENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxLQUFkLEVBQW9CLE1BQXBCLENBQTNtcUIsRUFBdW9xQixrQkFBaUIsQ0FBQyxNQUFELEVBQVEsS0FBUixDQUF4cHFCLEVBQXVxcUIsMEJBQXlCLEVBQWhzcUIsRUFBbXNxQixpQkFBZ0IsQ0FBQyxLQUFELENBQW50cUIsRUFBMnRxQixpQkFBZ0IsQ0FBQyxLQUFELENBQTN1cUIsRUFBbXZxQiwwQkFBeUIsQ0FBQyxLQUFELENBQTV3cUIsRUFBb3hxQixpQkFBZ0IsQ0FBQyxLQUFELENBQXB5cUIsRUFBNHlxQixpQkFBZ0IsQ0FBQyxLQUFELENBQTV6cUIsRUFBbzBxQixrQ0FBaUMsQ0FBQyxLQUFELENBQXIycUIsRUFBNjJxQixrQ0FBaUMsQ0FBQyxLQUFELENBQTk0cUIsRUFBczVxQixxQkFBb0IsQ0FBQyxLQUFELENBQTE2cUIsRUFBazdxQixzQkFBcUIsQ0FBQyxLQUFELENBQXY4cUIsRUFBKzhxQixxQkFBb0IsQ0FBQyxLQUFELENBQW4rcUIsRUFBMitxQixzQkFBcUIsQ0FBQyxNQUFELENBQWhnckIsRUFBeWdyQixrQkFBaUIsQ0FBQyxLQUFELENBQTFockIsRUFBa2lyQixlQUFjLENBQUMsS0FBRCxDQUFoanJCLEVBQXdqckIsc0JBQXFCLENBQUMsS0FBRCxDQUE3a3JCLEVBQXFsckIsZUFBYyxDQUFDLEtBQUQsQ0FBbm1yQixFQUEybXJCLG9CQUFtQixDQUFDLElBQUQsRUFBTSxLQUFOLEVBQVksS0FBWixFQUFrQixLQUFsQixFQUF3QixLQUF4QixDQUE5bnJCLEVBQTZwckIsZ0JBQWUsQ0FBQyxLQUFELENBQTVxckIsRUFBb3JyQixlQUFjLENBQUMsS0FBRCxDQUFsc3JCLEVBQTBzckIsdUJBQXNCLENBQUMsS0FBRCxDQUFodXJCLEVBQXd1ckIsa0JBQWlCLEVBQXp2ckIsRUFBNHZyQixlQUFjLENBQUMsS0FBRCxDQUExd3JCLEVBQWt4ckIsZ0JBQWUsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUFqeXJCLEVBQSt5ckIsMkJBQTBCLENBQUMsS0FBRCxDQUF6MHJCLEVBQWkxckIsMkJBQTBCLENBQUMsS0FBRCxDQUEzMnJCLEVBQW0zckIsNEJBQTJCLENBQUMsS0FBRCxDQUE5NHJCLEVBQXM1ckIsMkJBQTBCLENBQUMsS0FBRCxDQUFoN3JCLEVBQXc3ckIsZUFBYyxDQUFDLEtBQUQsQ0FBdDhyQixFQUE4OHJCLGVBQWMsQ0FBQyxLQUFELENBQTU5ckIsRUFBbytyQixtQkFBa0IsQ0FBQyxLQUFELENBQXQvckIsRUFBOC9yQixtQkFBa0IsQ0FBQyxLQUFELENBQWhoc0IsRUFBd2hzQix1QkFBc0IsQ0FBQyxLQUFELENBQTlpc0IsRUFBc2pzQix5QkFBd0IsQ0FBQyxLQUFELENBQTlrc0IsRUFBc2xzQixpQkFBZ0IsQ0FBQyxLQUFELENBQXRtc0IsRUFBOG1zQixpQkFBZ0IsQ0FBQyxLQUFELENBQTluc0IsRUFBc29zQixpQkFBZ0IsQ0FBQyxLQUFELENBQXRwc0IsRUFBOHBzQixpQkFBZ0IsQ0FBQyxLQUFELENBQTlxc0IsRUFBc3JzQixpQkFBZ0IsQ0FBQyxLQUFELENBQXRzc0IsRUFBOHNzQixzQkFBcUIsQ0FBQyxLQUFELENBQW51c0IsRUFBMnVzQixpQkFBZ0IsQ0FBQyxNQUFELENBQTN2c0IsRUFBb3dzQix1QkFBc0IsQ0FBQyxPQUFELENBQTF4c0IsRUFBb3lzQix1QkFBc0IsQ0FBQyxPQUFELENBQTF6c0IsRUFBbzBzQix1QkFBc0IsQ0FBQyxPQUFELENBQTExc0IsRUFBbzJzQix5QkFBd0IsQ0FBQyxLQUFELENBQTUzc0IsRUFBbzRzQixnQkFBZSxDQUFDLEtBQUQsQ0FBbjVzQixFQUEyNXNCLHlCQUF3QixDQUFDLEtBQUQsQ0FBbjdzQixFQUEyN3NCLHFCQUFvQixDQUFDLElBQUQsQ0FBLzhzQixFQUFzOXNCLHNCQUFxQixDQUFDLE1BQUQsQ0FBMytzQixFQUFvL3NCLHNCQUFxQixDQUFDLE1BQUQsQ0FBemd0QixFQUFraHRCLG9DQUFtQyxDQUFDLEtBQUQsQ0FBcmp0QixFQUE2anRCLG9CQUFtQixDQUFDLEtBQUQsQ0FBaGx0QixFQUF3bHRCLDBCQUF5QixDQUFDLE1BQUQsQ0FBam50QixFQUEwbnRCLGNBQWEsQ0FBQyxHQUFELEVBQUssS0FBTCxDQUF2b3RCLEVBQW1wdEIsWUFBVyxDQUFDLEdBQUQsRUFBSyxJQUFMLEVBQVUsS0FBVixFQUFnQixLQUFoQixFQUFzQixHQUF0QixFQUEwQixJQUExQixFQUErQixLQUEvQixDQUE5cHRCLEVBQW9zdEIsb0JBQW1CLENBQUMsS0FBRCxDQUF2dHRCLEVBQSt0dEIsa0JBQWlCLENBQUMsR0FBRCxFQUFLLEtBQUwsRUFBVyxLQUFYLEVBQWlCLEtBQWpCLENBQWh2dEIsRUFBd3d0Qiw4QkFBNkIsQ0FBQyxLQUFELENBQXJ5dEIsRUFBNnl0QixzQkFBcUIsQ0FBQyxNQUFELENBQWwwdEIsRUFBMjB0QixjQUFhLENBQUMsS0FBRCxDQUF4MXRCLEVBQWcydEIsbUJBQWtCLENBQUMsS0FBRCxDQUFsM3RCLEVBQTAzdEIsY0FBYSxDQUFDLEtBQUQsQ0FBdjR0QixFQUErNHRCLGVBQWMsQ0FBQyxNQUFELENBQTc1dEIsRUFBczZ0QixjQUFhLEVBQW43dEIsRUFBczd0QixpQkFBZ0IsQ0FBQyxHQUFELEVBQUssS0FBTCxDQUF0OHRCLEVBQWs5dEIscUJBQW9CLENBQUMsS0FBRCxDQUF0K3RCLEVBQTgrdEIsZUFBYyxDQUFDLE1BQUQsQ0FBNS90QixFQUFxZ3VCLGVBQWMsQ0FBQyxNQUFELENBQW5odUIsRUFBNGh1QixpQkFBZ0IsQ0FBQyxLQUFELENBQTVpdUIsRUFBb2p1QixjQUFhLENBQUMsS0FBRCxDQUFqa3VCLEVBQXlrdUIsbUJBQWtCLENBQUMsS0FBRCxDQUEzbHVCLEVBQW1tdUIsbUJBQWtCLENBQUMsSUFBRCxDQUFybnVCLEVBQTRudUIsb0JBQW1CLENBQUMsS0FBRCxDQUEvb3VCLEVBQXVwdUIsZ0JBQWUsQ0FBQyxLQUFELENBQXRxdUIsRUFBOHF1QixxQkFBb0IsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUFsc3VCLEVBQWl0dUIseUJBQXdCLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBenV1QixFQUF3dnVCLHFCQUFvQixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQTV3dUIsRUFBMnh1QixxQkFBb0IsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUEveXVCLEVBQTh6dUIsd0JBQXVCLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBcjF1QixFQUFvMnVCLHNCQUFxQixDQUFDLEtBQUQsQ0FBejN1QixFQUFpNHVCLGlCQUFnQixDQUFDLEtBQUQsQ0FBajV1QixFQUF5NXVCLHFCQUFvQixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQTc2dUIsRUFBMjd1QixvQ0FBbUMsQ0FBQyxLQUFELENBQTk5dUIsRUFBcyt1QixzQkFBcUIsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUEzL3VCLEVBQTBndkIsa0JBQWlCLENBQUMsS0FBRCxDQUEzaHZCLEVBQW1pdkIsZUFBYyxDQUFDLEtBQUQsQ0FBamp2QixFQUF5anZCLGVBQWMsQ0FBQyxLQUFELENBQXZrdkIsRUFBK2t2QixlQUFjLENBQUMsS0FBRCxDQUE3bHZCLEVBQXFtdkIsZUFBYyxDQUFDLEtBQUQsQ0FBbm52QixFQUEybnZCLG9CQUFtQixDQUFDLEtBQUQsRUFBTyxNQUFQLEVBQWMsS0FBZCxDQUE5b3ZCLEVBQW1xdkIsZUFBYyxDQUFDLEtBQUQsQ0FBanJ2QixFQUF5cnZCLGtCQUFpQixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQTFzdkIsRUFBd3R2QixrQkFBaUIsQ0FBQyxLQUFELENBQXp1dkIsRUFBaXZ2QixpQkFBZ0IsQ0FBQyxJQUFELENBQWp3dkIsRUFBd3d2QixrQkFBaUIsQ0FBQyxLQUFELENBQXp4dkIsRUFBaXl2QixrQkFBaUIsQ0FBQyxLQUFELENBQWx6dkIsRUFBMHp2QixrQkFBaUIsQ0FBQyxLQUFELENBQTMwdkIsRUFBbTF2QixtQkFBa0IsQ0FBQyxLQUFELENBQXIydkIsRUFBNjJ2QixxQkFBb0IsQ0FBQyxPQUFELENBQWo0dkIsRUFBMjR2QixlQUFjLENBQUMsS0FBRCxDQUF6NXZCLEVBQWk2dkIsMkJBQTBCLENBQUMsS0FBRCxDQUEzN3ZCLEVBQWY7QUFDRCxLQUZ3RCxFQUV2RCxFQUZ1RCxDQTVFOHVCLEVBOEVqeUIsR0FBRSxDQUFDLFVBQVMsT0FBVCxFQUFpQixNQUFqQixFQUF3QixPQUF4QixFQUFnQztBQUN2QyxhQUFPLE9BQVAsR0FBZSxFQUFDLDRCQUEyQixDQUFDLElBQUQsQ0FBNUIsRUFBbUMsMEJBQXlCLENBQUMsSUFBRCxDQUE1RCxFQUFtRSx3QkFBdUIsQ0FBQyxNQUFELENBQTFGLEVBQW1HLDJCQUEwQixDQUFDLFNBQUQsQ0FBN0gsRUFBeUksMkJBQTBCLENBQUMsU0FBRCxDQUFuSyxFQUErSyxvQkFBbUIsQ0FBQyxNQUFELENBQWxNLEVBQTJNLHlCQUF3QixDQUFDLE9BQUQsQ0FBbk8sRUFBNk8sK0JBQThCLENBQUMsT0FBRCxDQUEzUSxFQUFxUiw4QkFBNkIsQ0FBQyxPQUFELENBQWxULEVBQTRULDJCQUEwQixDQUFDLE9BQUQsQ0FBdFYsRUFBZ1csMkJBQTBCLENBQUMsT0FBRCxDQUExWCxFQUFvWSwwQkFBeUIsQ0FBQyxPQUFELENBQTdaLEVBQXVhLHdCQUF1QixDQUFDLElBQUQsQ0FBOWIsRUFBcWMsd0JBQXVCLENBQUMsS0FBRCxDQUE1ZCxFQUFvZSw0QkFBMkIsQ0FBQyxVQUFELENBQS9mLEVBQTRnQiwyQkFBMEIsQ0FBQyxLQUFELENBQXRpQixFQUE4aUIsd0JBQXVCLENBQUMsTUFBRCxDQUFya0IsRUFBOGtCLHdCQUF1QixDQUFDLE9BQUQsQ0FBcm1CLEVBQSttQiwwQkFBeUIsQ0FBQyxNQUFELENBQXhvQixFQUFpcEIsd0JBQXVCLENBQUMsTUFBRCxDQUF4cUIsRUFBaXJCLHdCQUF1QixDQUFDLE1BQUQsQ0FBeHNCLEVBQWl0QixtQkFBa0IsQ0FBQyxLQUFELENBQW51QixFQUEydUIsMEJBQXlCLENBQUMsS0FBRCxDQUFwd0IsRUFBNHdCLHlCQUF3QixDQUFDLE1BQUQsQ0FBcHlCLEVBQTZ5QiwwQkFBeUIsQ0FBQyxPQUFELENBQXQwQixFQUFnMUIsd0JBQXVCLENBQUMsU0FBRCxDQUF2MkIsRUFBbTNCLHVCQUFzQixDQUFDLEtBQUQsQ0FBejRCLEVBQWk1Qix1QkFBc0IsQ0FBQyxLQUFELENBQXY2QixFQUErNkIsbUJBQWtCLENBQUMsS0FBRCxDQUFqOEIsRUFBeThCLG9CQUFtQixDQUFDLElBQUQsQ0FBNTlCLEVBQW0rQiwyQkFBMEIsQ0FBQyxLQUFELENBQTcvQixFQUFxZ0MseUJBQXdCLENBQUMsS0FBRCxFQUFPLE9BQVAsQ0FBN2hDLEVBQTZpQyxxQkFBb0IsQ0FBQyxPQUFELENBQWprQyxFQUEya0MsNEJBQTJCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLENBQXRtQyxFQUEwbkMsc0NBQXFDLENBQUMsS0FBRCxDQUEvcEMsRUFBdXFDLHVCQUFzQixDQUFDLE9BQUQsQ0FBN3JDLEVBQXVzQywwQkFBeUIsQ0FBQyxJQUFELEVBQU0sS0FBTixDQUFodUMsRUFBNnVDLG9CQUFtQixDQUFDLE1BQUQsRUFBUSxLQUFSLENBQWh3QyxFQUErd0MscUJBQW9CLENBQUMsT0FBRCxDQUFueUMsRUFBNnlDLDJCQUEwQixDQUFDLFFBQUQsQ0FBdjBDLEVBQWsxQyx1QkFBc0IsQ0FBQyxRQUFELENBQXgyQyxFQUFtM0Msd0JBQXVCLENBQUMsU0FBRCxDQUExNEMsRUFBczVDLDRCQUEyQixDQUFDLEtBQUQsQ0FBajdDLEVBQXk3Qyw4QkFBNkIsQ0FBQyxLQUFELENBQXQ5QyxFQUE4OUMsd0JBQXVCLENBQUMsTUFBRCxDQUFyL0MsRUFBOC9DLDZCQUE0QixDQUFDLGFBQUQsQ0FBMWhELEVBQTBpRCxvQkFBbUIsQ0FBQyxLQUFELENBQTdqRCxFQUFxa0QsMkJBQTBCLENBQUMsTUFBRCxDQUEvbEQsRUFBd21ELDJCQUEwQixDQUFDLElBQUQsRUFBTSxJQUFOLEVBQVcsSUFBWCxDQUFsb0QsRUFBbXBELDBCQUF5QixDQUFDLFFBQUQsQ0FBNXFELEVBQXVyRCxvQkFBbUIsQ0FBQyxNQUFELENBQTFzRCxFQUFtdEQsc0NBQXFDLENBQUMsT0FBRCxDQUF4dkQsRUFBa3dELDRCQUEyQixDQUFDLFVBQUQsQ0FBN3hELEVBQTB5RCw2QkFBNEIsQ0FBQyxPQUFELENBQXQwRCxFQUFnMUQsd0JBQXVCLENBQUMsTUFBRCxDQUF2MkQsRUFBZzNELHdCQUF1QixDQUFDLE1BQUQsQ0FBdjRELEVBQWc1RCxvQkFBbUIsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUFuNkQsRUFBazdELG1CQUFrQixDQUFDLE1BQUQsRUFBUSxLQUFSLENBQXA4RCxFQUFtOUQsc0JBQXFCLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBeCtELEVBQXMvRCxtQkFBa0IsQ0FBQyxLQUFELENBQXhnRSxFQUFnaEUsNEJBQTJCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLEVBQXlCLElBQXpCLEVBQThCLE1BQTlCLEVBQXFDLE9BQXJDLEVBQTZDLEtBQTdDLEVBQW1ELEtBQW5ELEVBQXlELE1BQXpELEVBQWdFLEtBQWhFLEVBQXNFLFFBQXRFLEVBQStFLEtBQS9FLEVBQXFGLEtBQXJGLEVBQTJGLEtBQTNGLEVBQWlHLEtBQWpHLEVBQXVHLEtBQXZHLEVBQTZHLEtBQTdHLEVBQW1ILEtBQW5ILEVBQXlILEtBQXpILEVBQStILEtBQS9ILEVBQXFJLFFBQXJJLENBQTNpRSxFQUEwckUsbUJBQWtCLENBQUMsS0FBRCxDQUE1c0UsRUFBb3RFLGlDQUFnQyxDQUFDLEtBQUQsQ0FBcHZFLEVBQTR2RSxtQkFBa0IsQ0FBQyxLQUFELENBQTl3RSxFQUFzeEUseUJBQXdCLENBQUMsT0FBRCxDQUE5eUUsRUFBd3pFLHVCQUFzQixDQUFDLFFBQUQsRUFBVSxTQUFWLEVBQW9CLFFBQXBCLEVBQTZCLFFBQTdCLENBQTkwRSxFQUFxM0Usb0JBQW1CLENBQUMsTUFBRCxDQUF4NEUsRUFBaTVFLG1DQUFrQyxDQUFDLEtBQUQsQ0FBbjdFLEVBQTI3RSxtQkFBa0IsQ0FBQyxLQUFELENBQTc4RSxFQUFxOUUsNkJBQTRCLENBQUMsS0FBRCxDQUFqL0UsRUFBeS9FLDZCQUE0QixDQUFDLEtBQUQsRUFBTyxLQUFQLENBQXJoRixFQUFtaUYsMEJBQXlCLENBQUMsS0FBRCxDQUE1akYsRUFBb2tGLHNCQUFxQixDQUFDLEtBQUQsQ0FBemxGLEVBQWltRiwwQkFBeUIsQ0FBQyxLQUFELEVBQU8sS0FBUCxDQUExbkYsRUFBd29GLCtCQUE4QixDQUFDLEtBQUQsQ0FBdHFGLEVBQThxRixxQkFBb0IsQ0FBQyxJQUFELENBQWxzRixFQUF5c0YsOEJBQTZCLENBQUMsSUFBRCxDQUF0dUYsRUFBNnVGLHlCQUF3QixDQUFDLEtBQUQsQ0FBcndGLEVBQTZ3Rix3QkFBdUIsQ0FBQyxLQUFELENBQXB5RixFQUE0eUYsNEJBQTJCLENBQUMsU0FBRCxDQUF2MEYsRUFBbTFGLHVCQUFzQixDQUFDLEtBQUQsQ0FBejJGLEVBQWkzRix1QkFBc0IsQ0FBQyxLQUFELENBQXY0RixFQUErNEYsMEJBQXlCLENBQUMsSUFBRCxFQUFNLEtBQU4sRUFBWSxJQUFaLENBQXg2RixFQUEwN0Ysd0JBQXVCLENBQUMsU0FBRCxDQUFqOUYsRUFBNjlGLHVCQUFzQixDQUFDLEtBQUQsQ0FBbi9GLEVBQTIvRiwyQkFBMEIsQ0FBQyxLQUFELENBQXJoRyxFQUE2aEcsdUNBQXNDLENBQUMsS0FBRCxDQUFua0csRUFBMmtHLGtDQUFpQyxDQUFDLElBQUQsQ0FBNW1HLEVBQW1uRyx1Q0FBc0MsQ0FBQyxLQUFELENBQXpwRyxFQUFpcUcsZ0NBQStCLENBQUMsSUFBRCxDQUFoc0csRUFBdXNHLGlDQUFnQyxDQUFDLEtBQUQsQ0FBdnVHLEVBQSt1Ryw2QkFBNEIsQ0FBQyxLQUFELENBQTN3RyxFQUFteEcsd0JBQXVCLENBQUMsS0FBRCxDQUExeUcsRUFBa3pHLHVCQUFzQixDQUFDLEtBQUQsQ0FBeDBHLEVBQWcxRyx1QkFBc0IsQ0FBQyxLQUFELENBQXQyRyxFQUE4MkcsbUJBQWtCLENBQUMsS0FBRCxDQUFoNEcsRUFBdzRHLHdCQUF1QixDQUFDLE1BQUQsQ0FBLzVHLEVBQXc2RywrQkFBOEIsQ0FBQyxLQUFELENBQXQ4RyxFQUE4OEcsZ0NBQStCLENBQUMsS0FBRCxDQUE3K0csRUFBcS9HLCtCQUE4QixDQUFDLEtBQUQsQ0FBbmhILEVBQTJoSCxnQ0FBK0IsQ0FBQyxLQUFELENBQTFqSCxFQUFra0gsbUJBQWtCLENBQUMsS0FBRCxDQUFwbEgsRUFBNGxILHNDQUFxQyxDQUFDLFFBQUQsQ0FBam9ILEVBQTRvSCwyQ0FBMEMsQ0FBQyxRQUFELENBQXRySCxFQUFpc0gsdUJBQXNCLENBQUMsS0FBRCxDQUF2dEgsRUFBK3RILHdCQUF1QixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXR2SCxFQUFxd0gsNEJBQTJCLENBQUMsSUFBRCxDQUFoeUgsRUFBdXlILGtDQUFpQyxDQUFDLEtBQUQsQ0FBeDBILEVBQWcxSCxvQkFBbUIsQ0FBQyxNQUFELENBQW4ySCxFQUE0Mkgsd0JBQXVCLENBQUMsT0FBRCxDQUFuNEgsRUFBNjRILHVCQUFzQixDQUFDLEtBQUQsQ0FBbjZILEVBQTI2SCx3QkFBdUIsQ0FBQyxNQUFELENBQWw4SCxFQUEyOEgsd0JBQXVCLENBQUMsTUFBRCxDQUFsK0gsRUFBMitILHVCQUFzQixDQUFDLEtBQUQsRUFBTyxXQUFQLENBQWpnSSxFQUFxaEksMEJBQXlCLENBQUMsS0FBRCxDQUE5aUksRUFBc2pJLGdDQUErQixDQUFDLEtBQUQsQ0FBcmxJLEVBQTZsSSw0QkFBMkIsQ0FBQyxNQUFELENBQXhuSSxFQUFpb0ksc0JBQXFCLENBQUMsS0FBRCxDQUF0cEksRUFBOHBJLHNCQUFxQixDQUFDLEtBQUQsQ0FBbnJJLEVBQTJySSx3QkFBdUIsQ0FBQyxNQUFELENBQWx0SSxFQUEydEksNEJBQTJCLENBQUMsVUFBRCxDQUF0dkksRUFBbXdJLHdCQUF1QixDQUFDLE1BQUQsQ0FBMXhJLEVBQW15SSw2QkFBNEIsQ0FBQyxLQUFELENBQS96SSxFQUF1MEksd0JBQXVCLENBQUMsTUFBRCxDQUE5MUksRUFBdTJJLHlCQUF3QixDQUFDLE9BQUQsRUFBUyxLQUFULENBQS8zSSxFQUErNEksbUJBQWtCLENBQUMsS0FBRCxFQUFPLEtBQVAsRUFBYSxLQUFiLEVBQW1CLEtBQW5CLENBQWo2SSxFQUEyN0ksdUJBQXNCLENBQUMsS0FBRCxDQUFqOUksRUFBeTlJLHVCQUFzQixDQUFDLEtBQUQsQ0FBLytJLEVBQXUvSSx5QkFBd0IsQ0FBQyxLQUFELENBQS9nSixFQUF1aEosd0JBQXVCLENBQUMsTUFBRCxDQUE5aUosRUFBdWpKLHdCQUF1QixDQUFDLE1BQUQsQ0FBOWtKLEVBQXVsSixzQkFBcUIsQ0FBQyxNQUFELEVBQVEsT0FBUixFQUFnQixNQUFoQixFQUF1QixLQUF2QixDQUE1bUosRUFBMG9KLG9CQUFtQixDQUFDLE1BQUQsQ0FBN3BKLEVBQXNxSix1QkFBc0IsQ0FBQyxLQUFELENBQTVySixFQUFvc0osbUJBQWtCLENBQUMsS0FBRCxDQUF0dEosRUFBOHRKLGNBQWEsRUFBM3VKLEVBQTh1SixlQUFjLENBQUMsS0FBRCxDQUE1dkosRUFBb3dKLGVBQWMsQ0FBQyxJQUFELEVBQU0sS0FBTixDQUFseEosRUFBK3hKLGNBQWEsQ0FBQyxLQUFELEVBQU8sTUFBUCxFQUFjLEtBQWQsRUFBb0IsS0FBcEIsQ0FBNXlKLEVBQXUwSixhQUFZLEVBQW4xSixFQUFzMUosYUFBWSxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQWwySixFQUFpM0osY0FBYSxDQUFDLE1BQUQsRUFBUSxLQUFSLEVBQWMsTUFBZCxFQUFxQixLQUFyQixFQUEyQixLQUEzQixFQUFpQyxLQUFqQyxDQUE5M0osRUFBczZKLGFBQVksQ0FBQyxLQUFELEVBQU8sS0FBUCxFQUFhLEtBQWIsQ0FBbDdKLEVBQXM4SixhQUFZLENBQUMsS0FBRCxDQUFsOUosRUFBMDlKLGNBQWEsQ0FBQyxLQUFELENBQXYrSixFQUErK0osYUFBWSxDQUFDLEtBQUQsQ0FBMy9KLEVBQW1nSyxjQUFhLEVBQWhoSyxFQUFtaEssY0FBYSxDQUFDLE1BQUQsQ0FBaGlLLEVBQXlpSyxZQUFXLENBQUMsSUFBRCxDQUFwakssRUFBMmpLLFlBQVcsQ0FBQyxLQUFELENBQXRrSyxFQUE4a0ssY0FBYSxDQUFDLE1BQUQsQ0FBM2xLLEVBQW9tSyxhQUFZLENBQUMsS0FBRCxDQUFobkssRUFBd25LLGFBQVksQ0FBQyxLQUFELENBQXBvSyxFQUE0b0ssZUFBYyxDQUFDLElBQUQsQ0FBMXBLLEVBQWlxSyxhQUFZLENBQUMsS0FBRCxDQUE3cUssRUFBcXJLLGFBQVksQ0FBQyxLQUFELENBQWpzSyxFQUF5c0ssY0FBYSxDQUFDLE1BQUQsRUFBUSxLQUFSLEVBQWMsS0FBZCxDQUF0dEssRUFBMnVLLGFBQVksQ0FBQyxLQUFELENBQXZ2SyxFQUErdkssYUFBWSxDQUFDLEtBQUQsQ0FBM3dLLEVBQW14SyxhQUFZLENBQUMsS0FBRCxDQUEveEssRUFBdXlLLGlCQUFnQixDQUFDLEtBQUQsRUFBTyxNQUFQLENBQXZ6SyxFQUFzMEssY0FBYSxDQUFDLE1BQUQsRUFBUSxLQUFSLENBQW4xSyxFQUFrMkssY0FBYSxDQUFDLE1BQUQsQ0FBLzJLLEVBQXczSyxrQkFBaUIsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUF6NEssRUFBdzVLLG1CQUFrQixDQUFDLE1BQUQsQ0FBMTZLLEVBQW03SyxxQkFBb0IsQ0FBQyxLQUFELENBQXY4SyxFQUErOEssY0FBYSxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQTU5SyxFQUEyK0ssY0FBYSxDQUFDLEtBQUQsRUFBTyxNQUFQLEVBQWMsTUFBZCxDQUF4L0ssRUFBOGdMLGNBQWEsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUEzaEwsRUFBMGlMLG9CQUFtQixDQUFDLE1BQUQsRUFBUSxPQUFSLENBQTdqTCxFQUE4a0wsa0JBQWlCLENBQUMsTUFBRCxFQUFRLE9BQVIsQ0FBL2xMLEVBQWduTCxpQkFBZ0IsQ0FBQyxLQUFELEVBQU8sTUFBUCxDQUFob0wsRUFBK29MLHVCQUFzQixDQUFDLFVBQUQsRUFBWSxVQUFaLENBQXJxTCxFQUE2ckwsaUJBQWdCLENBQUMsS0FBRCxFQUFPLEtBQVAsQ0FBN3NMLEVBQTJ0TCxxQkFBb0IsQ0FBQyxRQUFELEVBQVUsV0FBVixDQUEvdUwsRUFBc3dMLFlBQVcsQ0FBQyxLQUFELENBQWp4TCxFQUF5eEwsWUFBVyxDQUFDLEtBQUQsQ0FBcHlMLEVBQTR5TCxjQUFhLENBQUMsT0FBRCxDQUF6ekwsRUFBbTBMLGFBQVksQ0FBQyxNQUFELEVBQVEsS0FBUixFQUFjLE9BQWQsQ0FBLzBMLEVBQXMyTCxhQUFZLENBQUMsTUFBRCxDQUFsM0wsRUFBMjNMLFlBQVcsQ0FBQyxLQUFELENBQXQ0TCxFQUE4NEwsYUFBWSxDQUFDLE1BQUQsQ0FBMTVMLEVBQW02TCxpQkFBZ0IsQ0FBQyxVQUFELEVBQVksSUFBWixDQUFuN0wsRUFBcThMLGVBQWMsQ0FBQyxLQUFELENBQW45TCxFQUEyOUwsV0FBVSxDQUFDLElBQUQsQ0FBcitMLEVBQTQrTCxjQUFhLENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxNQUFkLEVBQXFCLEtBQXJCLEVBQTJCLE1BQTNCLEVBQWtDLEtBQWxDLEVBQXdDLElBQXhDLEVBQTZDLEtBQTdDLENBQXovTCxFQUE2aU0saUJBQWdCLENBQUMsS0FBRCxDQUE3ak0sRUFBcWtNLFlBQVcsRUFBaGxNLEVBQW1sTSxhQUFZLENBQUMsTUFBRCxFQUFRLEtBQVIsQ0FBL2xNLEVBQThtTSxhQUFZLENBQUMsTUFBRCxFQUFRLEtBQVIsQ0FBMW5NLEVBQXlvTSxlQUFjLENBQUMsUUFBRCxFQUFVLE1BQVYsQ0FBdnBNLEVBQXlxTSw2QkFBNEIsQ0FBQyxLQUFELENBQXJzTSxFQUE2c00sY0FBYSxDQUFDLEdBQUQsRUFBSyxJQUFMLEVBQVUsTUFBVixFQUFpQixLQUFqQixFQUF1QixJQUF2QixFQUE0QixJQUE1QixDQUExdE0sRUFBNHZNLGVBQWMsQ0FBQyxLQUFELENBQTF3TSxFQUFreE0saUJBQWdCLENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxNQUFkLENBQWx5TSxFQUF3ek0sY0FBYSxDQUFDLE9BQUQsQ0FBcjBNLEVBQSswTSxZQUFXLENBQUMsS0FBRCxDQUExMU0sRUFBazJNLFlBQVcsRUFBNzJNLEVBQWczTSxhQUFZLENBQUMsTUFBRCxFQUFRLEtBQVIsQ0FBNTNNLEVBQTI0TSxjQUFhLENBQUMsS0FBRCxFQUFPLE1BQVAsQ0FBeDVNLEVBQXU2TSxlQUFjLENBQUMsS0FBRCxDQUFyN00sRUFBNjdNLGNBQWEsQ0FBQyxNQUFELENBQTE4TSxFQUFtOU0sY0FBYSxDQUFDLE1BQUQsQ0FBaCtNLEVBQXkrTSxjQUFhLENBQUMsTUFBRCxDQUF0L00sRUFBKy9NLGNBQWEsQ0FBQyxNQUFELENBQTVnTixFQUFxaE4sYUFBWSxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQWppTixFQUFnak4sYUFBWSxDQUFDLEtBQUQsRUFBTyxNQUFQLENBQTVqTixFQUEya04sY0FBYSxDQUFDLElBQUQsQ0FBeGxOLEVBQStsTixhQUFZLENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxNQUFkLENBQTNtTixFQUFpb04sY0FBYSxDQUFDLE1BQUQsRUFBUSxLQUFSLEVBQWMsS0FBZCxFQUFvQixLQUFwQixFQUEwQixLQUExQixDQUE5b04sRUFBK3FOLGFBQVksQ0FBQyxLQUFELENBQTNyTixFQUFtc04sbUJBQWtCLENBQUMsSUFBRCxFQUFNLEtBQU4sQ0FBcnROLEVBQWt1TixjQUFhLENBQUMsTUFBRCxDQUEvdU4sRUFBZjtBQUNELEtBRk8sRUFFTixFQUZNLENBOUUreEIsRUFBM2IsRUFnRnJXLEVBaEZxVyxFQWdGbFcsQ0FBQyxDQUFELENBaEZrVyxFQWdGN1YsQ0FoRjZWLENBQVA7QUFpRnBXLENBakZEOzs7Ozs7O0FDQUE7O0FBRUEsUUFBUSxrQkFBUixHQUE2QixVQUFVLElBQVYsRUFBZ0I7QUFDM0MsTUFBSTtBQUNGLFdBQU8sbUJBQW1CLElBQW5CLENBQVA7QUFDRCxHQUZELENBRUUsT0FBTyxDQUFQLEVBQVU7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNGLENBTkQ7O0FBUUEsUUFBUSxNQUFSLEdBQWlCLFFBQVEsYUFBUixDQUFqQjs7QUFFQSxRQUFRLFNBQVIsR0FBb0IsU0FBUyxTQUFULENBQW1CLENBQW5CLEVBQXNCO0FBQ3hDLE1BQUksQ0FBSixFQUFPO0FBQ0wsUUFBSSxJQUFJLENBQVI7QUFDQSxRQUFJLE9BQU8sQ0FBUCxLQUFhLFFBQWpCLEVBQTJCO0FBQ3pCLFVBQUksT0FBTyxDQUFQLENBQUo7QUFDRDtBQUNELFFBQUksT0FBTyxDQUFQLEVBQVUsTUFBVixLQUFxQixFQUF6QixFQUE2QjtBQUMzQixXQUFLLElBQUw7QUFDRDtBQUNELFdBQU8sSUFBSSxJQUFKLENBQVMsQ0FBVCxDQUFQO0FBQ0Q7QUFDRCxTQUFPLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBTCxLQUFhLElBQXhCLENBQVA7QUFDRCxDQVpEOzs7O0FDWkE7Ozs7Ozs7Ozs7OztBQUVBLElBQUksT0FBTyxRQUFRLE1BQVIsQ0FBWDtBQUNBLElBQUksVUFBVSxRQUFRLEtBQVIsQ0FBZDtBQUNBLElBQUksT0FBTyxRQUFRLE1BQVIsQ0FBWDtBQUNBLElBQUksUUFBUSxRQUFRLE9BQVIsQ0FBWjtBQUNBLElBQUksUUFBUSxRQUFRLE9BQVIsRUFBaUIsUUFBakIsQ0FBWjtBQUNBLElBQUksS0FBSyxRQUFRLGFBQVIsQ0FBVDs7QUFFQSxJQUFJLFFBQUo7O0FBRUEsSUFBSSxhQUFhLENBQWpCO0FBQ0EsSUFBSSxZQUFZLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxFQUFaLElBQWtCLEVBQWxDO0FBQ0EsSUFBSSxXQUFXLGVBQWY7O0FBRUEsU0FBUyxRQUFULENBQWtCLEtBQWxCLEVBQXlCLFlBQXpCLEVBQXVDO0FBQ3JDLFNBQU8sVUFBVSxTQUFWLEdBQXNCLFlBQXRCLEdBQXFDLEtBQTVDO0FBQ0Q7O0FBRUQsU0FBUyxZQUFULENBQXNCLE9BQXRCLEVBQStCLE1BQS9CLEVBQXVDO0FBQ3JDLFNBQU8sVUFBVSxHQUFWLEVBQWUsSUFBZixFQUFxQixHQUFyQixFQUEwQjtBQUMvQixRQUFJLEdBQUosRUFBUztBQUNQLGFBQU8sT0FBTyxHQUFQLENBQVA7QUFDRDtBQUNELFlBQVE7QUFDTixZQUFNLElBREE7QUFFTixjQUFRLElBQUksVUFGTjtBQUdOLGVBQVMsSUFBSSxPQUhQO0FBSU4sV0FBSztBQUpDLEtBQVI7QUFNRCxHQVZEO0FBV0Q7O0FBRUQ7QUFDQSxRQUFRLFFBQVIsR0FBbUIsQ0FBQyxHQUFHLE1BQUgsQ0FBRCxFQUFhLEdBQUcsTUFBSCxDQUFiLENBQW5COztBQUVBLElBQUksa0JBQWtCLENBQ3BCLE1BRG9CLEVBRXBCLE1BRm9CLENBQXRCOztBQUtBLFFBQVEsT0FBUixHQUFrQixTQUFTLE9BQVQsQ0FBaUIsR0FBakIsRUFBc0IsSUFBdEIsRUFBNEIsUUFBNUIsRUFBc0M7QUFDdEQ7QUFDQSxNQUFJLFVBQVUsTUFBVixLQUFxQixDQUFyQixJQUEwQixPQUFPLElBQVAsS0FBZ0IsVUFBOUMsRUFBMEQ7QUFDeEQsZUFBVyxJQUFYO0FBQ0EsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxNQUFJLE9BQU8sUUFBUCxLQUFvQixVQUF4QixFQUFvQztBQUNsQyxXQUFPLFFBQVEsbUJBQVIsQ0FBNEIsR0FBNUIsRUFBaUMsSUFBakMsRUFBdUMsUUFBdkMsQ0FBUDtBQUNEOztBQUVEO0FBQ0EsTUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLGVBQVcsUUFBUSxhQUFSLENBQVg7QUFDRDtBQUNELFNBQU8sSUFBSSxRQUFKLENBQWEsVUFBVSxPQUFWLEVBQW1CLE1BQW5CLEVBQTJCO0FBQzdDLFlBQVEsbUJBQVIsQ0FBNEIsR0FBNUIsRUFBaUMsSUFBakMsRUFBdUMsYUFBYSxPQUFiLEVBQXNCLE1BQXRCLENBQXZDO0FBQ0QsR0FGTSxDQUFQO0FBR0QsQ0FqQkQ7O0FBb0JBLFFBQVEsbUJBQVIsR0FBOEIsU0FBUyxtQkFBVCxDQUE2QixHQUE3QixFQUFrQyxJQUFsQyxFQUF3QyxRQUF4QyxFQUFrRDtBQUM5RTtBQUNBLE1BQUksQ0FBQyxHQUFELElBQVMsT0FBTyxHQUFQLEtBQWUsUUFBZixJQUEyQixRQUFPLEdBQVAsdURBQU8sR0FBUCxPQUFlLFFBQXZELEVBQWtFO0FBQ2hFLFFBQUksTUFBTSxLQUFLLE1BQUwsQ0FBWSx5RUFBWixFQUF1RixHQUF2RixDQUFWO0FBQ0EsVUFBTSxJQUFJLEtBQUosQ0FBVSxHQUFWLENBQU47QUFDRDs7QUFFRCxNQUFJLFVBQVUsTUFBVixLQUFxQixDQUFyQixJQUEwQixPQUFPLElBQVAsS0FBZ0IsVUFBOUMsRUFBMEQ7QUFDeEQsZUFBVyxJQUFYO0FBQ0EsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxRQUFRLEVBQWY7QUFDQSxNQUFJLGNBQWMsU0FBbEIsRUFBNkI7QUFDM0IsaUJBQWEsQ0FBYjtBQUNEO0FBQ0QsTUFBSSxRQUFRLEVBQUUsVUFBZDs7QUFFQSxPQUFLLFdBQUwsR0FBbUIsS0FBSyxXQUFMLElBQW9CLEVBQXZDOztBQUVBLE1BQUksVUFBVTtBQUNaLGVBQVcsS0FEQztBQUVaLFNBQUssR0FGTztBQUdaLFVBQU0sSUFITTtBQUlaLFNBQUssS0FBSztBQUpFLEdBQWQ7QUFNQSxNQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNoQixTQUFLLE9BQUwsQ0FBYSxJQUFiLENBQWtCLFNBQWxCLEVBQTZCLE9BQTdCO0FBQ0Q7O0FBRUQsT0FBSyxPQUFMLEdBQWUsS0FBSyxPQUFMLElBQWdCLFFBQVEsUUFBdkM7QUFDQSxPQUFLLFlBQUwsR0FBb0IsS0FBSyxZQUFMLElBQXFCLEVBQXpDO0FBQ0EsT0FBSyxTQUFMLEdBQWlCLEtBQUssU0FBTCxJQUFrQixLQUFLLGNBQXhDO0FBQ0EsTUFBSSxtQkFBbUIsS0FBSyxHQUFMLEVBQXZCO0FBQ0EsTUFBSSxTQUFKOztBQUVBLE1BQUksT0FBTyxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDM0IsUUFBSSxDQUFDLFNBQVMsSUFBVCxDQUFjLEdBQWQsQ0FBTCxFQUF5QjtBQUN2QjtBQUNBLFlBQU0sWUFBWSxHQUFsQjtBQUNEO0FBQ0QsZ0JBQVksUUFBUSxLQUFSLENBQWMsR0FBZCxDQUFaO0FBQ0QsR0FORCxNQU1PO0FBQ0wsZ0JBQVksR0FBWjtBQUNEOztBQUVELE1BQUksU0FBUyxDQUFDLEtBQUssSUFBTCxJQUFhLEtBQUssTUFBbEIsSUFBNEIsVUFBVSxNQUF0QyxJQUFnRCxLQUFqRCxFQUF3RCxXQUF4RCxFQUFiO0FBQ0EsTUFBSSxPQUFPLFVBQVUsSUFBVixJQUFrQixFQUE3QjtBQUNBLE1BQUksVUFBVSxJQUFkO0FBQ0EsTUFBSSxRQUFRLFNBQVMsS0FBSyxLQUFkLEVBQXFCLFFBQVEsS0FBN0IsQ0FBWjtBQUNBLE1BQUksa0JBQWtCLEtBQUssZUFBM0I7O0FBRUEsTUFBSSxVQUFVLFFBQVYsS0FBdUIsUUFBM0IsRUFBcUM7QUFDbkMsY0FBVSxLQUFWO0FBQ0EsWUFBUSxTQUFTLEtBQUssVUFBZCxFQUEwQixRQUFRLFVBQWxDLENBQVI7O0FBRUEsUUFBSSxDQUFDLFVBQVUsSUFBZixFQUFxQjtBQUNuQixhQUFPLEdBQVA7QUFDRDtBQUNGOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBSSxVQUFVO0FBQ1osVUFBTSxVQUFVLFFBQVYsSUFBc0IsVUFBVSxJQUFoQyxJQUF3QyxXQURsQztBQUVaLFVBQU0sVUFBVSxJQUFWLElBQWtCLEdBRlo7QUFHWixZQUFRLE1BSEk7QUFJWixVQUFNLElBSk07QUFLWixXQUFPLEtBTEs7QUFNWixhQUFTLEtBQUssT0FBTCxJQUFnQixFQU5iO0FBT1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFRLEtBQUs7QUFYRCxHQUFkOztBQWNBLE1BQUksTUFBTSxPQUFOLENBQWMsS0FBSyxPQUFuQixDQUFKLEVBQWlDO0FBQy9CLFlBQVEsY0FBUixHQUF5QixLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQUwsQ0FBYSxNQUFiLEdBQXNCLENBQW5DLENBQXpCO0FBQ0QsR0FGRCxNQUVPLElBQUksT0FBTyxLQUFLLE9BQVosS0FBd0IsV0FBNUIsRUFBeUM7QUFDOUMsWUFBUSxjQUFSLEdBQXlCLEtBQUssT0FBOUI7QUFDRDs7QUFFRCxNQUFJLFdBQVcsQ0FDYixLQURhLEVBRWIsS0FGYSxFQUdiLFlBSGEsRUFJYixNQUphLEVBS2IsSUFMYSxFQU1iLFNBTmEsRUFPYixvQkFQYSxFQVFiLGdCQVJhLEVBU2IsZUFUYSxDQUFmO0FBV0EsT0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDeEMsUUFBSSxPQUFPLFNBQVMsQ0FBVCxDQUFYO0FBQ0EsUUFBSSxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBSixFQUErQjtBQUM3QixjQUFRLElBQVIsSUFBZ0IsS0FBSyxJQUFMLENBQWhCO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLE1BQUksUUFBUSxrQkFBUixLQUErQixLQUEvQixJQUF3QyxDQUFDLFFBQVEsY0FBUixDQUF1QixlQUF2QixDQUE3QyxFQUFzRjtBQUNwRixZQUFRLGFBQVIsR0FBd0IsUUFBUSxXQUFSLEVBQXFCLGlCQUE3QztBQUNEOztBQUVELE1BQUksT0FBTyxLQUFLLElBQUwsSUFBYSxVQUFVLElBQWxDO0FBQ0EsTUFBSSxJQUFKLEVBQVU7QUFDUixZQUFRLElBQVIsR0FBZSxJQUFmO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPLEtBQUssT0FBTCxJQUFnQixLQUFLLElBQWhDO0FBQ0EsTUFBSSxvQkFBb0IsV0FBVyxLQUFYLElBQW9CLFdBQVcsTUFBL0IsSUFBeUMsS0FBSyxpQkFBdEU7QUFDQSxNQUFJLENBQUMsS0FBSyxPQUFWLEVBQW1CO0FBQ2pCLFFBQUksUUFBUSxFQUFFLE9BQU8sSUFBUCxLQUFnQixRQUFoQixJQUE0QixPQUFPLFFBQVAsQ0FBZ0IsSUFBaEIsQ0FBOUIsQ0FBWixFQUFrRTtBQUNoRSxVQUFJLGlCQUFKLEVBQXVCO0FBQ3JCO0FBQ0EsZUFBTyxLQUFLLGlCQUFMLEdBQXlCLEdBQUcsU0FBSCxDQUFhLElBQWIsQ0FBekIsR0FBOEMsWUFBWSxTQUFaLENBQXNCLElBQXRCLENBQXJEO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsWUFBSSxjQUFjLFFBQVEsT0FBUixDQUFnQixjQUFoQixLQUFtQyxRQUFRLE9BQVIsQ0FBZ0IsY0FBaEIsQ0FBckQ7QUFDQTtBQUNBLFlBQUksQ0FBQyxXQUFMLEVBQWtCO0FBQ2hCLGNBQUksS0FBSyxXQUFMLEtBQXFCLE1BQXpCLEVBQWlDO0FBQy9CLDBCQUFjLGtCQUFkO0FBQ0QsV0FGRCxNQUVPO0FBQ0wsMEJBQWMsbUNBQWQ7QUFDRDtBQUNELGtCQUFRLE9BQVIsQ0FBZ0IsY0FBaEIsSUFBa0MsV0FBbEM7QUFDRDs7QUFFRCxZQUFJLGlCQUFpQixXQUFqQixFQUE4QixJQUE5QixLQUF1QyxrQkFBM0MsRUFBK0Q7QUFDN0QsaUJBQU8seUJBQWUsSUFBZixDQUFQO0FBQ0QsU0FGRCxNQUVPO0FBQ0w7QUFDQSxpQkFBTyxLQUFLLGlCQUFMLEdBQXlCLEdBQUcsU0FBSCxDQUFhLElBQWIsQ0FBekIsR0FBOEMsWUFBWSxTQUFaLENBQXNCLElBQXRCLENBQXJEO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBRUQ7QUFDQSxNQUFJLHFCQUFxQixJQUF6QixFQUErQjtBQUM3QixZQUFRLElBQVIsSUFBZ0IsQ0FBQyxVQUFVLEtBQVYsR0FBa0IsR0FBbEIsR0FBd0IsR0FBekIsSUFBZ0MsSUFBaEQ7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJLGNBQWMsQ0FBbEI7QUFDQSxNQUFJLElBQUosRUFBVTtBQUNSLFFBQUksU0FBUyxLQUFLLE1BQWxCO0FBQ0EsUUFBSSxDQUFDLE9BQU8sUUFBUCxDQUFnQixJQUFoQixDQUFMLEVBQTRCO0FBQzFCLGVBQVMsT0FBTyxVQUFQLENBQWtCLElBQWxCLENBQVQ7QUFDRDtBQUNELGtCQUFjLFFBQVEsT0FBUixDQUFnQixnQkFBaEIsSUFBb0MsTUFBbEQ7QUFDRDs7QUFFRCxNQUFJLEtBQUssUUFBTCxLQUFrQixNQUF0QixFQUE4QjtBQUM1QixZQUFRLE9BQVIsQ0FBZ0IsTUFBaEIsR0FBeUIsa0JBQXpCO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPLEtBQUssYUFBWixLQUE4QixVQUFsQyxFQUE4QztBQUM1QztBQUNBLFNBQUssYUFBTCxDQUFtQixPQUFuQjtBQUNEO0FBQ0QsTUFBSSxlQUFlLElBQW5CO0FBQ0EsTUFBSSxnQkFBZ0IsSUFBcEI7QUFDQSxNQUFJLFFBQVEsSUFBWjtBQUNBLE1BQUksWUFBWSxLQUFoQixDQTFLOEUsQ0EwS3ZEO0FBQ3ZCLE1BQUksa0JBQWtCLEtBQXRCLENBM0s4RSxDQTJLakQ7QUFDN0IsTUFBSSxlQUFlLENBQW5CO0FBQ0EsTUFBSSxhQUFhLENBQUMsQ0FBbEI7QUFDQSxNQUFJLGtCQUFrQixLQUF0QjtBQUNBLE1BQUksZ0JBQWdCLEVBQXBCO0FBQ0EsTUFBSSxhQUFhLEVBQWpCO0FBQ0EsTUFBSSxTQUFTLElBQWI7QUFDQSxNQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNmLGFBQVM7QUFDUDtBQUNBLGVBQVMsQ0FGRjtBQUdQO0FBQ0EsaUJBQVcsQ0FKSjtBQUtQO0FBQ0EsaUJBQVcsQ0FOSjtBQU9QO0FBQ0EsbUJBQWEsQ0FSTjtBQVNQO0FBQ0EsZUFBUyxDQVZGO0FBV1AsdUJBQWlCO0FBWFYsS0FBVDtBQWFEOztBQUVELFdBQVMsa0JBQVQsR0FBOEI7QUFDNUIsUUFBSSxZQUFKLEVBQWtCO0FBQ2hCLG1CQUFhLFlBQWI7QUFDQSxxQkFBZSxJQUFmO0FBQ0Q7QUFDRjtBQUNELFdBQVMsbUJBQVQsR0FBK0I7QUFDN0IsUUFBSSxhQUFKLEVBQW1CO0FBQ2pCLG1CQUFhLGFBQWI7QUFDQSxzQkFBZ0IsSUFBaEI7QUFDRDtBQUNGOztBQUVELFdBQVMsSUFBVCxDQUFjLEdBQWQsRUFBbUIsSUFBbkIsRUFBeUIsR0FBekIsRUFBOEI7QUFDNUI7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2IsY0FBUSxJQUFSLENBQWEsNkRBQWIsRUFDRSxNQURGLEVBQ1UsS0FEVixFQUNpQixRQUFRLEdBRHpCLEVBQzhCLFFBQVEsTUFEdEMsRUFDOEMsR0FEOUM7QUFFQTtBQUNBLFVBQUksR0FBSixFQUFTO0FBQ1AsZ0JBQVEsSUFBUixDQUFhLHVEQUFiLEVBQ0UsTUFERixFQUNVLEtBRFYsRUFDaUIsUUFBUSxHQUR6QixFQUM4QixJQUFJLElBRGxDLEVBQ3dDLElBQUksT0FENUMsRUFDcUQsSUFBSSxLQUR6RDtBQUVEO0FBQ0Q7QUFDRDtBQUNELFFBQUksS0FBSyxRQUFUO0FBQ0EsZUFBVyxJQUFYO0FBQ0EsUUFBSSxVQUFVLEVBQWQ7QUFDQSxRQUFJLEdBQUosRUFBUztBQUNQLG1CQUFhLElBQUksVUFBakI7QUFDQSxnQkFBVSxJQUFJLE9BQWQ7QUFDRDs7QUFFRDtBQUNBLFFBQUksZUFBZSxHQUFmLElBQXNCLFFBQVEsa0JBQVIsQ0FBdEIsS0FDRSxDQUFDLEtBQUssT0FBTixJQUFpQixDQUFDLEtBQUssT0FBTCxDQUFhLGFBRGpDLEtBQ21ELEtBQUssVUFENUQsRUFDd0U7QUFDdEUsVUFBSSxlQUFlLFFBQVEsa0JBQVIsQ0FBbkI7QUFDQSxVQUFJLGFBQWEsT0FBYixDQUFxQixTQUFyQixLQUFtQyxDQUF2QyxFQUEwQztBQUN4QyxjQUFNLDREQUFOLEVBQW9FLEtBQXBFLEVBQTJFLEdBQTNFLEVBQWdGLFlBQWhGO0FBQ0EsYUFBSyxPQUFMLEdBQWUsS0FBSyxPQUFMLElBQWdCLEVBQS9CO0FBQ0EsYUFBSyxPQUFMLENBQWEsYUFBYixHQUE2QixpQkFBaUIsUUFBUSxNQUF6QixFQUFpQyxRQUFRLElBQXpDLEVBQStDLFlBQS9DLEVBQTZELEtBQUssVUFBbEUsQ0FBN0I7QUFDQSxjQUFNLDRDQUFOLEVBQW9ELEtBQXBELEVBQTJELEdBQTNELEVBQWdFLEtBQUssT0FBTCxDQUFhLGFBQTdFO0FBQ0EsWUFBSSxJQUFJLE9BQUosQ0FBWSxZQUFaLENBQUosRUFBK0I7QUFDN0IsZUFBSyxPQUFMLENBQWEsTUFBYixHQUFzQixJQUFJLE9BQUosQ0FBWSxZQUFaLEVBQTBCLElBQTFCLENBQStCLEdBQS9CLENBQXRCO0FBQ0Q7QUFDRCxlQUFPLFFBQVEsbUJBQVIsQ0FBNEIsR0FBNUIsRUFBaUMsSUFBakMsRUFBdUMsRUFBdkMsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsUUFBSSxpQkFBaUIsS0FBSyxHQUFMLEtBQWEsZ0JBQWxDO0FBQ0EsUUFBSSxNQUFKLEVBQVk7QUFDVixhQUFPLGVBQVAsR0FBeUIsY0FBekI7QUFDRDs7QUFFRCxVQUFNLHlFQUFOLEVBQ0UsY0FERixFQUNrQixZQURsQixFQUNnQyxVQURoQyxFQUM0QyxRQUFRLE1BRHBELEVBQzRELFFBQVEsSUFEcEUsRUFDMEUsUUFBUSxJQURsRixFQUVFLGVBRkYsRUFFbUIsTUFGbkI7O0FBSUEsUUFBSSxXQUFXO0FBQ2IsY0FBUSxVQURLO0FBRWIsa0JBQVksVUFGQztBQUdiLGVBQVMsT0FISTtBQUliLFlBQU0sWUFKTztBQUtiLGVBQVMsZUFMSTtBQU1iLFVBQUksY0FOUztBQU9iLHVCQUFpQixlQVBKO0FBUWIsWUFBTSxJQVJPO0FBU2IsbUJBQWEsS0FBSyxXQVRMO0FBVWIsY0FBUSxNQVZLO0FBV2IscUJBQWUsYUFYRjtBQVliLGtCQUFZO0FBWkMsS0FBZjs7QUFlQSxRQUFJLEdBQUosRUFBUztBQUNQLFVBQUksY0FBYyxFQUFsQjtBQUNBLFVBQUksU0FBUyxPQUFPLE1BQU0sZ0JBQWIsS0FBa0MsVUFBL0MsRUFBMkQ7QUFDekQ7QUFDQSxzQkFBYyxxQkFBcUIseUJBQWUsTUFBTSxnQkFBTixFQUFmLENBQW5DO0FBQ0Q7QUFDRCxVQUFJLE9BQUosSUFBZSxPQUFPLFFBQVEsTUFBZixHQUF3QixHQUF4QixHQUE4QixHQUE5QixHQUFvQyxHQUFwQyxHQUEwQyxVQUExQyxHQUNYLGVBRFcsR0FDTyxTQURQLEdBQ21CLHNCQURuQixHQUM0QyxlQUQ1QyxHQUM4RCxXQUQ5RCxHQUM0RSxHQUQ1RSxHQUVYLGFBRlcsR0FFSyx5QkFBZSxPQUFmLENBRnBCO0FBR0EsVUFBSSxJQUFKLEdBQVcsSUFBWDtBQUNBLFVBQUksSUFBSixHQUFXLFFBQVEsSUFBbkI7QUFDQSxVQUFJLE1BQUosR0FBYSxVQUFiO0FBQ0EsVUFBSSxPQUFKLEdBQWMsT0FBZDtBQUNBLFVBQUksR0FBSixHQUFVLFFBQVY7QUFDRDs7QUFFRCxPQUFHLEdBQUgsRUFBUSxJQUFSLEVBQWMsS0FBSyxTQUFMLEdBQWlCLEdBQWpCLEdBQXVCLFFBQXJDOztBQUVBLFFBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2hCO0FBQ0EsY0FBUSxHQUFSLEdBQWMsR0FBZDtBQUNBLGNBQVEsTUFBUixHQUFpQixPQUFPLElBQUksVUFBNUI7QUFDQSxjQUFRLE9BQVIsR0FBa0IsT0FBbEI7QUFDQSxjQUFRLElBQVIsR0FBZSxXQUFmOztBQUVBLFdBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsVUFBbEIsRUFBOEI7QUFDNUIsbUJBQVcsS0FEaUI7QUFFNUIsZUFBTyxHQUZxQjtBQUc1QixhQUFLLEtBQUssR0FIa0I7QUFJNUIsYUFBSyxPQUp1QjtBQUs1QixhQUFLO0FBTHVCLE9BQTlCO0FBT0Q7QUFDRjs7QUFFRCxXQUFTLGNBQVQsQ0FBd0IsR0FBeEIsRUFBNkI7QUFDM0IsUUFBSSxNQUFNLElBQVY7QUFDQSxRQUFJLEtBQUssY0FBTCxJQUF1QixTQUFTLFFBQVQsQ0FBa0IsSUFBSSxVQUF0QixDQUEzQixFQUE4RDtBQUFHO0FBQy9ELFdBQUssb0JBQUwsR0FBNEIsQ0FBQyxLQUFLLG9CQUFMLElBQTZCLENBQTlCLElBQW1DLENBQS9EO0FBQ0EsVUFBSSxXQUFXLElBQUksT0FBSixDQUFZLFFBQTNCO0FBQ0EsVUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLGNBQU0sSUFBSSxLQUFKLENBQVUsb0JBQW9CLElBQUksVUFBeEIsR0FBcUMsZ0RBQS9DLENBQU47QUFDQSxZQUFJLElBQUosR0FBVyxxQkFBWDtBQUNELE9BSEQsTUFHTyxJQUFJLEtBQUssb0JBQUwsR0FBNEIsS0FBSyxZQUFyQyxFQUFtRDtBQUN4RCxjQUFNLElBQUksS0FBSixDQUFVLDhEQUE4RCxHQUF4RSxDQUFOO0FBQ0EsWUFBSSxJQUFKLEdBQVcsa0JBQVg7QUFDRCxPQUhNLE1BR0E7QUFDTCxZQUFJLFNBQVMsS0FBSyxpQkFBTCxHQUF5QixLQUFLLGlCQUFMLENBQXVCLEdBQXZCLEVBQTRCLFFBQTVCLENBQXpCLEdBQWlFLFFBQVEsT0FBUixDQUFnQixHQUFoQixFQUFxQixRQUFyQixDQUE5RTtBQUNBLGNBQU0sMkNBQU4sRUFBbUQsS0FBbkQsRUFBMEQsUUFBUSxJQUFsRSxFQUF3RSxHQUF4RSxFQUE2RSxNQUE3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQUksS0FBSyxPQUFMLElBQWdCLEtBQUssT0FBTCxDQUFhLElBQTdCLElBQXFDLFNBQVMsSUFBVCxDQUFjLFFBQWQsQ0FBekMsRUFBa0U7QUFDaEUsZUFBSyxPQUFMLENBQWEsSUFBYixHQUFvQixJQUFwQjtBQUNEO0FBQ0Q7QUFDQSxZQUFJLEtBQUssUUFBVDtBQUNBLG1CQUFXLElBQVg7QUFDQSxnQkFBUSxtQkFBUixDQUE0QixNQUE1QixFQUFvQyxJQUFwQyxFQUEwQyxFQUExQztBQUNBLGVBQU87QUFDTCxvQkFBVSxJQURMO0FBRUwsaUJBQU87QUFGRixTQUFQO0FBSUQ7QUFDRjtBQUNELFdBQU87QUFDTCxnQkFBVSxLQURMO0FBRUwsYUFBTztBQUZGLEtBQVA7QUFJRDs7QUFFRDtBQUNBLE1BQUksQ0FBQyxRQUFRLE9BQVIsQ0FBZ0IsWUFBaEIsQ0FBRCxJQUFrQyxDQUFDLFFBQVEsT0FBUixDQUFnQixZQUFoQixDQUF2QyxFQUFzRTtBQUNwRSxZQUFRLE9BQVIsQ0FBZ0IsWUFBaEIsSUFBZ0MsVUFBVSxTQUExQztBQUNEOztBQUVELE1BQUksS0FBSyxJQUFULEVBQWU7QUFDYixRQUFJLENBQUMsUUFBUSxPQUFSLENBQWdCLGlCQUFoQixDQUFELElBQXVDLENBQUMsUUFBUSxPQUFSLENBQWdCLGlCQUFoQixDQUE1QyxFQUFnRjtBQUM5RSxjQUFRLE9BQVIsQ0FBZ0IsaUJBQWhCLElBQXFDLE1BQXJDO0FBQ0Q7QUFDRjs7QUFFRCxXQUFTLGFBQVQsQ0FBdUIsR0FBdkIsRUFBNEIsSUFBNUIsRUFBa0MsRUFBbEMsRUFBc0M7QUFDcEMsUUFBSSxXQUFXLElBQUksT0FBSixDQUFZLGtCQUFaLENBQWY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRSxXQUFPLEdBQUcsSUFBSCxFQUFTLElBQVQsRUFBZSxRQUFmLENBQVA7QUFDRjs7QUFFQTtBQUNBO0FBQ0Q7O0FBRUQsTUFBSSxjQUFjLEtBQUssV0FBdkI7O0FBRUEsUUFBTSxvREFBTixFQUNFLEtBREYsRUFDUyxNQURULEVBQ2lCLEdBRGpCLEVBQ3NCLFFBQVEsT0FEOUIsRUFDdUMsUUFBUSxJQUQvQzs7QUFHQSxPQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsR0FBdEI7O0FBRUEsV0FBUyxVQUFULENBQW9CLEdBQXBCLEVBQXlCO0FBQ3ZCLFFBQUksTUFBSixFQUFZO0FBQ1YsYUFBTyxPQUFQLEdBQWlCLEtBQUssR0FBTCxLQUFhLGdCQUE5QjtBQUNEO0FBQ0QsVUFBTSxpRUFBTixFQUNFLEtBREYsRUFDUyxHQURULEVBQ2MsSUFBSSxVQURsQixFQUM4QixJQUFJLE9BRGxDOztBQUdBLFFBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2xCLFVBQUksU0FBUyxlQUFlLEdBQWYsQ0FBYjtBQUNBLFVBQUksT0FBTyxRQUFYLEVBQXFCO0FBQ25CLFlBQUksTUFBSjtBQUNBO0FBQ0Q7QUFDRCxVQUFJLE9BQU8sS0FBWCxFQUFrQjtBQUNoQixZQUFJLE1BQUo7QUFDQSxlQUFPLEtBQUssT0FBTyxLQUFaLEVBQW1CLElBQW5CLEVBQXlCLEdBQXpCLENBQVA7QUFDRDs7QUFFRCxhQUFPLEtBQUssSUFBTCxFQUFXLElBQVgsRUFBaUIsR0FBakIsQ0FBUDtBQUNEOztBQUVELFFBQUksRUFBSixDQUFPLE9BQVAsRUFBZ0IsWUFBWTtBQUMxQixZQUFNLHNEQUFOLEVBQ0UsS0FERixFQUNTLEdBRFQsRUFDYyxZQURkO0FBRUQsS0FIRDs7QUFLQSxRQUFJLEVBQUosQ0FBTyxPQUFQLEVBQWdCLFlBQVk7QUFDMUIsWUFBTSxzREFBTixFQUNFLEtBREYsRUFDUyxHQURULEVBQ2MsWUFEZDtBQUVELEtBSEQ7O0FBS0EsUUFBSSxFQUFKLENBQU8sU0FBUCxFQUFrQixZQUFZO0FBQzVCLHdCQUFrQixJQUFsQjtBQUNBLFlBQU0sd0RBQU4sRUFDRSxLQURGLEVBQ1MsR0FEVCxFQUNjLFlBRGQ7QUFFRCxLQUpEOztBQU1BLFFBQUksV0FBSixFQUFpQjtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBSSxTQUFTLGVBQWUsR0FBZixDQUFiO0FBQ0EsVUFBSSxPQUFPLFFBQVgsRUFBcUI7QUFDbkIsWUFBSSxNQUFKO0FBQ0E7QUFDRDtBQUNELFVBQUksT0FBTyxLQUFYLEVBQWtCO0FBQ2hCLFlBQUksTUFBSjtBQUNBO0FBQ0Esb0JBQVksR0FBWjtBQUNBLGVBQU8sS0FBSyxPQUFPLEtBQVosRUFBbUIsSUFBbkIsRUFBeUIsR0FBekIsQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxVQUFJLEtBQUssa0JBQUwsS0FBNEIsS0FBaEMsRUFBdUM7QUFDckMsWUFBSSxFQUFKLENBQU8sS0FBUCxFQUFjLEtBQUssSUFBTCxDQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBc0IsSUFBdEIsRUFBNEIsR0FBNUIsQ0FBZDtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0EsWUFBSSxhQUFhLFNBQWpCLEVBQTRCO0FBQzFCLGdCQUFNLENBQ0osQ0FBRSxXQUFGLEVBQWUsT0FBZixDQURJLEVBRUosQ0FBRSxHQUFGLEVBQU8sU0FBUCxDQUZJLENBQU4sRUFHRyxVQUFTLENBQVQsRUFBWSxNQUFaLEVBQW9CLEtBQXBCLEVBQTJCO0FBQzVCLGtCQUFNLG9EQUFOLEVBQTRELEtBQTVELEVBQW1FLEdBQW5FLEVBQXdFLEtBQXhFO0FBQ0EsaUJBQUssU0FBUyxJQUFkLEVBQW9CLElBQXBCLEVBQTBCLEdBQTFCO0FBQ0QsV0FORDtBQU9ELFNBUkQsTUFRTztBQUNMLHNCQUFZLEVBQVosQ0FBZSxPQUFmLEVBQXdCLFlBQVc7QUFDakMsa0JBQU0sZ0RBQU4sRUFBd0QsS0FBeEQsRUFBK0QsR0FBL0Q7QUFDQSxpQkFBSyxTQUFTLElBQWQsRUFBb0IsSUFBcEIsRUFBMEIsR0FBMUI7QUFDRCxXQUhEO0FBSUQ7QUFDRjtBQUNELGFBQU8sSUFBSSxJQUFKLENBQVMsV0FBVCxDQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQUksU0FBUyxFQUFiOztBQUVBLFFBQUksRUFBSixDQUFPLE1BQVAsRUFBZSxVQUFVLEtBQVYsRUFBaUI7QUFDOUIsWUFBTSwrQ0FBTixFQUF1RCxLQUF2RCxFQUE4RCxHQUE5RCxFQUFtRSxNQUFNLE1BQXpFO0FBQ0Esc0JBQWdCLE1BQU0sTUFBdEI7QUFDQSxhQUFPLElBQVAsQ0FBWSxLQUFaO0FBQ0QsS0FKRDs7QUFNQSxRQUFJLEVBQUosQ0FBTyxLQUFQLEVBQWMsWUFBWTtBQUN4QixVQUFJLE9BQU8sT0FBTyxNQUFQLENBQWMsTUFBZCxFQUFzQixZQUF0QixDQUFYO0FBQ0EsWUFBTSxpRUFBTixFQUNFLEtBREYsRUFDUyxHQURULEVBQ2MsWUFEZCxFQUM0QixJQUFJLE9BRGhDOztBQUdBLFVBQUksS0FBSixFQUFXO0FBQ1Q7QUFDQSxlQUFPLEtBQUssS0FBTCxFQUFZLElBQVosRUFBa0IsR0FBbEIsQ0FBUDtBQUNEOztBQUVELFVBQUksU0FBUyxlQUFlLEdBQWYsQ0FBYjtBQUNBLFVBQUksT0FBTyxLQUFYLEVBQWtCO0FBQ2hCLGVBQU8sS0FBSyxPQUFPLEtBQVosRUFBbUIsSUFBbkIsRUFBeUIsR0FBekIsQ0FBUDtBQUNEO0FBQ0QsVUFBSSxPQUFPLFFBQVgsRUFBcUI7QUFDbkI7QUFDRDs7QUFFRCxvQkFBYyxHQUFkLEVBQW1CLElBQW5CLEVBQXlCLFVBQVUsR0FBVixFQUFlLElBQWYsRUFBcUIsUUFBckIsRUFBK0I7QUFDdEQsWUFBSSxHQUFKLEVBQVM7QUFDUCxpQkFBTyxLQUFLLEdBQUwsRUFBVSxJQUFWLEVBQWdCLEdBQWhCLENBQVA7QUFDRDtBQUNEO0FBQ0EsWUFBSSxDQUFDLFFBQUQsSUFBYSxnQkFBZ0IsT0FBaEIsQ0FBd0IsS0FBSyxRQUE3QixLQUEwQyxDQUEzRCxFQUE4RDtBQUM1RDtBQUNBLGNBQUk7QUFDRixtQkFBTyxvQkFBb0IsSUFBcEIsRUFBMEIsR0FBMUIsQ0FBUDtBQUNELFdBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVTtBQUNWLGtCQUFNLCtCQUFOLEVBQXVDLENBQXZDO0FBQ0E7QUFDQSxtQkFBTyxLQUFLLElBQUwsRUFBVyxJQUFYLEVBQWlCLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxjQUFJLEtBQUssUUFBTCxLQUFrQixNQUF0QixFQUE4QjtBQUM1QixnQkFBSSxpQkFBaUIsQ0FBckIsRUFBd0I7QUFDdEIscUJBQU8sSUFBUDtBQUNELGFBRkQsTUFFTztBQUNMLGtCQUFJLElBQUksVUFBVSxJQUFWLEVBQWdCLGVBQWhCLENBQVI7QUFDQSxrQkFBSSxFQUFFLEtBQU4sRUFBYTtBQUNYLHNCQUFNLEVBQUUsS0FBUjtBQUNELGVBRkQsTUFFTztBQUNMLHVCQUFPLEVBQUUsSUFBVDtBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQUVELFlBQUksZUFBSixFQUFxQjtBQUNuQjtBQUNBO0FBQ0EsZ0JBQU0sZ0ZBQU4sRUFBd0YsS0FBeEYsRUFBK0YsR0FBL0Y7QUFDRDs7QUFFRCxhQUFLLEdBQUwsRUFBVSxJQUFWLEVBQWdCLEdBQWhCO0FBQ0QsT0FwQ0Q7QUFxQ0QsS0F2REQ7QUF3REQ7O0FBRUQsTUFBSSxjQUFKLEVBQW9CLGVBQXBCO0FBQ0EsTUFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFLLE9BQW5CLENBQUosRUFBaUM7QUFDL0IscUJBQWlCLEdBQUcsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFILENBQWpCO0FBQ0Esc0JBQWtCLEdBQUcsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFILENBQWxCO0FBQ0QsR0FIRCxNQUdPO0FBQUc7QUFDUixxQkFBaUIsa0JBQWtCLEdBQUcsS0FBSyxPQUFSLENBQW5DO0FBQ0Q7QUFDRCxRQUFNLHlDQUFOLEVBQWlELGNBQWpELEVBQWlFLGVBQWpFOztBQUVBLFdBQVMsaUJBQVQsR0FBNkI7QUFDM0IsVUFBTSxvQ0FBTixFQUE0QyxjQUE1QztBQUNBLG1CQUFlLFdBQVcsWUFBWTtBQUNwQyxxQkFBZSxJQUFmO0FBQ0EsVUFBSSxlQUFlLENBQUMsQ0FBcEIsRUFBdUI7QUFDckIscUJBQWEsQ0FBQyxDQUFkO0FBQ0Q7QUFDRCxVQUFJLE1BQU0seUJBQXlCLGNBQXpCLEdBQTBDLElBQXBEO0FBQ0EsVUFBSSxZQUFZLHdCQUFoQjtBQUNBLFVBQUksQ0FBQyxJQUFJLE1BQVQsRUFBaUI7QUFDZixvQkFBWSwwQkFBWjtBQUNBLGVBQU8sMkJBQVA7QUFDRDtBQUNELGNBQVEsSUFBSSxLQUFKLENBQVUsR0FBVixDQUFSO0FBQ0EsWUFBTSxJQUFOLEdBQWEsU0FBYjtBQUNBLFlBQU0sU0FBTixHQUFrQixLQUFsQjtBQUNBLFlBQU0scURBQU4sRUFBNkQsS0FBN0QsRUFBb0UsR0FBcEUsRUFBeUUsTUFBTSxJQUEvRSxFQUFxRixHQUFyRixFQUEwRixTQUExRjtBQUNBO0FBQ0QsS0FoQmMsRUFnQlosY0FoQlksQ0FBZjtBQWlCRDs7QUFFRCxXQUFTLGtCQUFULEdBQThCO0FBQzVCLFVBQU0scUNBQU4sRUFBNkMsZUFBN0M7QUFDQSxvQkFBZ0IsV0FBVyxZQUFZO0FBQ3JDLHNCQUFnQixJQUFoQjtBQUNBLFVBQUksTUFBTSwwQkFBMEIsZUFBMUIsR0FBNEMsSUFBdEQ7QUFDQSxVQUFJLFlBQVksc0JBQWhCO0FBQ0EsY0FBUSxJQUFJLEtBQUosQ0FBVSxHQUFWLENBQVI7QUFDQSxZQUFNLElBQU4sR0FBYSxTQUFiO0FBQ0EsWUFBTSxTQUFOLEdBQWtCLEtBQWxCO0FBQ0EsWUFBTSxzREFBTixFQUE4RCxLQUE5RCxFQUFxRSxHQUFyRSxFQUEwRSxNQUFNLElBQWhGLEVBQXNGLEdBQXRGLEVBQTJGLFNBQTNGO0FBQ0E7QUFDRCxLQVRlLEVBU2IsZUFUYSxDQUFoQjtBQVVEOztBQUVELE1BQUksR0FBSjtBQUNBO0FBQ0EsVUFBUSxJQUFSLEdBQWUsS0FBSyxJQUFMLEdBQVksS0FBSyxJQUFqQixHQUF3QixFQUF2QztBQUNBLE1BQUk7QUFDRixVQUFNLFFBQVEsT0FBUixDQUFnQixPQUFoQixFQUF5QixVQUF6QixDQUFOO0FBQ0QsR0FGRCxDQUVFLE9BQU8sR0FBUCxFQUFZO0FBQ1osV0FBTyxLQUFLLEdBQUwsQ0FBUDtBQUNEOztBQUVEO0FBQ0EsTUFBSSxPQUFPLE1BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEM7QUFDQTtBQUNELEdBSEQsTUFHTztBQUNMLFFBQUksRUFBSixDQUFPLGdCQUFQLEVBQXlCLFlBQVk7QUFDbkMsVUFBSSxlQUFlLENBQUMsQ0FBcEIsRUFBdUI7QUFDckIscUJBQWEsQ0FBQyxDQUFkO0FBQ0Q7QUFDRCxVQUFJLE1BQU0seUJBQXlCLGNBQXpCLEdBQTBDLElBQXBEO0FBQ0EsVUFBSSxZQUFZLHdCQUFoQjtBQUNBLGNBQVEsSUFBSSxLQUFKLENBQVUsR0FBVixDQUFSO0FBQ0EsWUFBTSxJQUFOLEdBQWEsU0FBYjtBQUNBLFlBQU0sU0FBTixHQUFrQixLQUFsQjtBQUNBO0FBQ0QsS0FWRDtBQVdEOztBQUVELFdBQVMsWUFBVCxHQUF3QjtBQUN0QixVQUFNLG9DQUFOLEVBQTRDLEtBQTVDLEVBQW1ELEdBQW5ELEVBQXdELFNBQXhEO0FBQ0E7QUFDQSxRQUFJLENBQUMsSUFBSSxNQUFULEVBQWlCO0FBQ2YsWUFBTSxRQUFOLEdBQWlCLElBQWpCO0FBQ0EsV0FBSyxLQUFMO0FBQ0Q7QUFDRCxRQUFJLEtBQUo7QUFDRDs7QUFFRCxNQUFJLE1BQUosRUFBWTtBQUNWO0FBQ0EsUUFBSSxFQUFKLENBQU8sUUFBUCxFQUFpQixZQUFXO0FBQzFCLGFBQU8sV0FBUCxHQUFxQixLQUFLLEdBQUwsS0FBYSxnQkFBbEM7QUFDRCxLQUZEO0FBR0Q7O0FBRUQsTUFBSSxJQUFKLENBQVMsUUFBVCxFQUFtQixVQUFVLE1BQVYsRUFBa0I7QUFDbkMsUUFBSSxNQUFKLEVBQVk7QUFDVjtBQUNBLGFBQU8sT0FBUCxHQUFpQixLQUFLLEdBQUwsS0FBYSxnQkFBOUI7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxRQUFJLGFBQWEsT0FBTyxNQUF4QixFQUFnQztBQUM5QixlQUFTLE9BQU8sTUFBaEI7QUFDRDs7QUFFRCxRQUFJLGFBQWEsT0FBTyxVQUF4QjtBQUNBLFFBQUksZUFBZSxTQUFuQixFQUE4QjtBQUM1QixhQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLFVBQVMsR0FBVCxFQUFjLEVBQWQsRUFBa0IsV0FBbEIsRUFBK0I7QUFDbkQsY0FBTSxrQ0FBTixFQUEwQyxLQUExQyxFQUFpRCxHQUFqRCxFQUFzRCxHQUF0RCxFQUEyRCxFQUEzRCxFQUErRCxXQUEvRDtBQUNBLFlBQUksTUFBSixFQUFZO0FBQ1YsaUJBQU8sU0FBUCxHQUFtQixLQUFLLEdBQUwsS0FBYSxnQkFBaEM7QUFDRDtBQUNELFlBQUksRUFBSixFQUFRO0FBQ04sMEJBQWdCLEVBQWhCO0FBQ0Q7QUFDRixPQVJEO0FBU0EsYUFBTyxJQUFQLENBQVksU0FBWixFQUF1QixZQUFXO0FBQ2hDLFlBQUksTUFBSixFQUFZO0FBQ1Y7QUFDQSxpQkFBTyxTQUFQLEdBQW1CLEtBQUssR0FBTCxLQUFhLGdCQUFoQztBQUNEOztBQUVEO0FBQ0E7QUFDQTs7QUFFQSxjQUFNLG9DQUFOLEVBQTRDLEtBQTVDLEVBQW1ELEdBQW5EO0FBQ0Esb0JBQVksSUFBWjtBQUNBLFlBQUksQ0FBQyxhQUFMLEVBQW9CO0FBQ2xCLDBCQUFnQixPQUFPLGFBQXZCO0FBQ0Q7QUFDRCxxQkFBYSxPQUFPLFVBQXBCO0FBQ0QsT0FoQkQ7QUFpQkE7QUFDRDs7QUFFRCxVQUFNLHNEQUFOLEVBQThELEtBQTlELEVBQXFFLEdBQXJFLEVBQTBFLFVBQTFFO0FBQ0EsZ0JBQVksSUFBWjtBQUNBLHNCQUFrQixJQUFsQjtBQUNBLFFBQUksQ0FBQyxhQUFMLEVBQW9CO0FBQ2xCLHNCQUFnQixPQUFPLGFBQXZCO0FBQ0Q7QUFDRCxpQkFBYSxPQUFPLFVBQXBCOztBQUVBO0FBQ0E7QUFDQTtBQUNELEdBdkREOztBQXlEQSxNQUFJLEVBQUosQ0FBTyxPQUFQLEVBQWdCLFVBQVUsR0FBVixFQUFlO0FBQzdCO0FBQ0EsUUFBSSxJQUFJLElBQUosS0FBYSxPQUFiLElBQXdCLElBQUksSUFBSixLQUFhLFdBQXpDLEVBQXNEO0FBQ3BELFVBQUksSUFBSixHQUFXLFlBQVksZUFBWixHQUE4QixjQUF6QztBQUNEO0FBQ0QsUUFBSSxPQUFKLElBQWUsZ0JBQWY7QUFDQSxVQUFNLDhDQUFOLEVBQXNELEtBQXRELEVBQTZELEdBQTdELEVBQWtFLElBQUksSUFBdEUsRUFBNEUsSUFBSSxPQUFoRjtBQUNBLFNBQUssU0FBUyxHQUFkO0FBQ0QsR0FSRDs7QUFVQSxNQUFJLFdBQUosRUFBaUI7QUFDZixnQkFBWSxJQUFaLENBQWlCLE9BQWpCLEVBQTBCLFVBQVUsR0FBVixFQUFlO0FBQ3ZDLFVBQUksT0FBSixJQUFlLHdCQUFmO0FBQ0EsY0FBUSxHQUFSO0FBQ0EsWUFBTSxzREFBTixFQUE4RCxLQUE5RCxFQUFxRSxHQUFyRSxFQUEwRSxJQUFJLElBQTlFLEVBQW9GLElBQUksT0FBeEY7QUFDQTtBQUNELEtBTEQ7QUFNRDs7QUFFRCxNQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNmLFNBQUssTUFBTCxDQUFZLElBQVosQ0FBaUIsR0FBakI7QUFDQSxTQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLE9BQWpCLEVBQTBCLFVBQVUsR0FBVixFQUFlO0FBQ3ZDLFVBQUksT0FBSixJQUFlLG1CQUFmO0FBQ0EsY0FBUSxHQUFSO0FBQ0EsWUFBTSxxREFBTixFQUE2RCxLQUE3RCxFQUFvRSxHQUFwRSxFQUF5RSxJQUFJLElBQTdFLEVBQW1GLElBQUksT0FBdkY7QUFDQTtBQUNELEtBTEQ7QUFNRCxHQVJELE1BUU87QUFDTCxRQUFJLEdBQUosQ0FBUSxJQUFSO0FBQ0Q7O0FBRUQsTUFBSSxTQUFKLEdBQWdCLEtBQWhCO0FBQ0EsU0FBTyxHQUFQO0FBQ0QsQ0Ezc0JEIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiY29uc3QgT1NTID0gcmVxdWlyZSgnLi9icm93c2VyL2NsaWVudCcpO1xuT1NTLkJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbk9TUy51cmxsaWIgPSByZXF1aXJlKCcuLi9zaGltcy94aHInKTtcbk9TUy52ZXJzaW9uID0gcmVxdWlyZSgnLi9icm93c2VyL3ZlcnNpb24nKS52ZXJzaW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9TUztcbiIsImNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYWxpLW9zcycpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgY29weSA9IHJlcXVpcmUoJ2NvcHktdG8nKTtcbmNvbnN0IG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG5jb25zdCB4bWwgPSByZXF1aXJlKCd4bWwyanMnKTtcbmNvbnN0IEFnZW50S2VlcGFsaXZlID0gcmVxdWlyZSgnYWdlbnRrZWVwYWxpdmUnKTtcbmNvbnN0IG1lcmdlID0gcmVxdWlyZSgnbWVyZ2UtZGVzY3JpcHRvcnMnKTtcbmNvbnN0IHVybHV0aWwgPSByZXF1aXJlKCd1cmwnKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnaXMtdHlwZS1vZicpO1xuY29uc3QgcGxhdGZvcm0gPSByZXF1aXJlKCdwbGF0Zm9ybScpO1xuY29uc3QgdXRpbGl0eSA9IHJlcXVpcmUoJ3V0aWxpdHknKTtcbmNvbnN0IHVybGxpYiA9IHJlcXVpcmUoJ3VybGxpYicpO1xuY29uc3QgcGtnID0gcmVxdWlyZSgnLi92ZXJzaW9uJyk7XG5jb25zdCBkYXRlRm9ybWF0ID0gcmVxdWlyZSgnZGF0ZWZvcm1hdCcpO1xuY29uc3QgYm93c2VyID0gcmVxdWlyZSgnYm93c2VyJyk7XG5jb25zdCBzaWduVXRpbHMgPSByZXF1aXJlKCcuLi9jb21tb24vc2lnblV0aWxzJyk7XG5jb25zdCBfaXNJUCA9IHJlcXVpcmUoJy4uL2NvbW1vbi91dGlscy9pc0lQJyk7XG5jb25zdCBfY2hlY2tCdWNrZXROYW1lID0gcmVxdWlyZSgnLi4vY29tbW9uL3V0aWxzL2NoZWNrQnVja2V0TmFtZScpO1xuY29uc3QgX2luaXRPcHRpb25zID0gcmVxdWlyZSgnLi4vY29tbW9uL2NsaWVudC9pbml0T3B0aW9ucycpO1xuXG5jb25zdCBnbG9iYWxIdHRwQWdlbnQgPSBuZXcgQWdlbnRLZWVwYWxpdmUoKTtcblxuZnVuY3Rpb24gZ2V0SGVhZGVyKGhlYWRlcnMsIG5hbWUpIHtcbiAgcmV0dXJuIGhlYWRlcnNbbmFtZV0gfHwgaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBfdW5TdXBwb3J0QnJvd3NlclRpcCgpIHtcbiAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBwbGF0Zm9ybTtcbiAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2llJyAmJiB2ZXJzaW9uLnNwbGl0KCcuJylbMF0gPCAxMCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKCdhbGktb3NzIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlcicpO1xuICB9XG59XG4vLyBjaGVjayBsb2NhbCB3ZWIgcHJvdG9jb2wsaWYgaHR0cHMgc2VjdXJlIGRlZmF1bHQgc2V0IHRydWUgLCBpZiBodHRwIHNlY3VyZSBkZWZhdWx0IHNldCBmYWxzZVxuZnVuY3Rpb24gaXNIdHRwc1dlYlByb3RvY29sKCkge1xuICAvLyBmb3Igd2ViIHdvcmtlciBub3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICByZXR1cm4gbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonO1xufVxuXG5mdW5jdGlvbiBDbGllbnQob3B0aW9ucywgY3R4KSB7XG4gIF91blN1cHBvcnRCcm93c2VyVGlwKCk7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDbGllbnQpKSB7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQob3B0aW9ucywgY3R4KTtcbiAgfVxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluaXRlZCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zID0gQ2xpZW50LmluaXRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5vcHRpb25zLmNhbmNlbEZsYWcgPSBmYWxzZTsvLyBjYW5jZWwgZmxhZzogaWYgdHJ1ZSBuZWVkIHRvIGJlIGNhbmNlbGxlZCwgZGVmYXVsdCBmYWxzZVxuXG4gIC8vIHN1cHBvcnQgY3VzdG9tIGFnZW50IGFuZCB1cmxsaWIgY2xpZW50XG4gIGlmICh0aGlzLm9wdGlvbnMudXJsbGliKSB7XG4gICAgdGhpcy51cmxsaWIgPSB0aGlzLm9wdGlvbnMudXJsbGliO1xuICB9IGVsc2Uge1xuICAgIHRoaXMudXJsbGliID0gdXJsbGliO1xuICAgIHRoaXMuYWdlbnQgPSB0aGlzLm9wdGlvbnMuYWdlbnQgfHwgZ2xvYmFsSHR0cEFnZW50O1xuICB9XG4gIHRoaXMuY3R4ID0gY3R4O1xuICB0aGlzLnVzZXJBZ2VudCA9IHRoaXMuX2dldFVzZXJBZ2VudCgpO1xuXG4gIC8vIHJlY29yZCB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXJcbiAgdGhpcy5vcHRpb25zLmFtZW5kVGltZVNrZXdlZCA9IDA7XG59XG5cbi8qKlxuICogRXhwb3NlIGBDbGllbnRgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBDbGllbnQ7XG5cbkNsaWVudC5pbml0T3B0aW9ucyA9IGZ1bmN0aW9uIGluaXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLnN0c1Rva2VuKSB7XG4gICAgY29uc29sZS53YXJuKCdQbGVhc2UgdXNlIFNUUyBUb2tlbiBmb3Igc2FmZXR5LCBzZWUgbW9yZSBkZXRhaWxzIGF0IGh0dHBzOi8vaGVscC5hbGl5dW4uY29tL2RvY3VtZW50X2RldGFpbC8zMjA3Ny5odG1sJyk7XG4gIH1cbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHNlY3VyZTogaXNIdHRwc1dlYlByb3RvY29sKCksXG4gICAgLy8gZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eSBkaXNhYmxlIGZldGNoLlxuICAgIHVzZUZldGNoOiBmYWxzZVxuICB9LCBvcHRpb25zKTtcblxuICByZXR1cm4gX2luaXRPcHRpb25zKG9wdHMpO1xufTtcblxuXG4vKipcbiAqIHByb3RvdHlwZVxuICovXG5cbmNvbnN0IHByb3RvID0gQ2xpZW50LnByb3RvdHlwZTtcblxuLy8gbW91bnQgZGVidWcgb24gcHJvdG9cbnByb3RvLmRlYnVnID0gZGVidWc7XG5cbi8qKlxuICogT2JqZWN0IG9wZXJhdGlvbnNcbiAqL1xubWVyZ2UocHJvdG8sIHJlcXVpcmUoJy4vb2JqZWN0JykpO1xuLy8gLyoqXG4vLyAgKiBCdWNrZXQgb3BlcmF0aW9uc1xuLy8gICovXG4vKipcbiAqIGNoZWNrIEJ1Y2tldCBOYW1lXG4gKi9cblxucHJvdG8uX2NoZWNrQnVja2V0TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghX2NoZWNrQnVja2V0TmFtZShuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGJ1Y2tldCBtdXN0IGJlIGNvbmZvcm0gdG8gdGhlIHNwZWNpZmljYXRpb25zJyk7XG4gIH1cbn07XG4vLyBtZXJnZShwcm90bywgcmVxdWlyZSgnLi9idWNrZXQnKSk7XG5cblxuLy8gbXVsdGlwYXJ0IHVwbG9hZFxubWVyZ2UocHJvdG8sIHJlcXVpcmUoJy4vbWFuYWdlZC11cGxvYWQnKSk7XG4vKipcbiAqIE11bHRpcGFydCBvcGVyYXRpb25zXG4gKi9cbm1lcmdlKHByb3RvLCByZXF1aXJlKCcuLi9jb21tb24vbXVsdGlwYXJ0JykpO1xuXG4vKipcbiAqIENvbW1vbiBtb2R1bGUgcGFyYWxsZWxcbiAqL1xubWVyZ2UocHJvdG8sIHJlcXVpcmUoJy4uL2NvbW1vbi9wYXJhbGxlbCcpKTtcblxuLyoqXG4gKiBnZXQgT1NTIHNpZ25hdHVyZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1RvU2lnblxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgc2lnbmF0dXJlXG4gKi9cbnByb3RvLnNpZ25hdHVyZSA9IGZ1bmN0aW9uIHNpZ25hdHVyZShzdHJpbmdUb1NpZ24pIHtcbiAgdGhpcy5kZWJ1ZygnYXV0aG9yaXphdGlvbiBzdHJpbmdUb1NpZ246ICVzJywgc3RyaW5nVG9TaWduLCAnaW5mbycpO1xuXG4gIHJldHVybiBzaWduVXRpbHMuY29tcHV0ZVNpZ25hdHVyZSh0aGlzLm9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0LCBzdHJpbmdUb1NpZ24pO1xufTtcblxuLyoqXG4gKiBnZXQgYXV0aG9yIGhlYWRlclxuICpcbiAqIFwiQXV0aG9yaXphdGlvbjogT1NTIFwiICsgQWNjZXNzIEtleSBJZCArIFwiOlwiICsgU2lnbmF0dXJlXG4gKlxuICogU2lnbmF0dXJlID0gYmFzZTY0KGhtYWMtc2hhMShBY2Nlc3MgS2V5IFNlY3JldCArIFwiXFxuXCJcbiAqICArIFZFUkIgKyBcIlxcblwiXG4gKiAgKyBDT05URU5ULU1ENSArIFwiXFxuXCJcbiAqICArIENPTlRFTlQtVFlQRSArIFwiXFxuXCJcbiAqICArIERBVEUgKyBcIlxcblwiXG4gKiAgKyBDYW5vbmljYWxpemVkT1NTSGVhZGVyc1xuICogICsgQ2Fub25pY2FsaXplZFJlc291cmNlKSlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wcm90by5hdXRob3JpemF0aW9uID0gZnVuY3Rpb24gYXV0aG9yaXphdGlvbihtZXRob2QsIHJlc291cmNlLCBzdWJyZXMsIGhlYWRlcnMpIHtcbiAgY29uc3Qgc3RyaW5nVG9TaWduID0gc2lnblV0aWxzLmJ1aWxkQ2Fub25pY2FsU3RyaW5nKG1ldGhvZC50b1VwcGVyQ2FzZSgpLCByZXNvdXJjZSwge1xuICAgIGhlYWRlcnMsXG4gICAgcGFyYW1ldGVyczogc3VicmVzXG4gIH0pO1xuXG4gIHJldHVybiBzaWduVXRpbHMuYXV0aG9yaXphdGlvbih0aGlzLm9wdGlvbnMuYWNjZXNzS2V5SWQsIHRoaXMub3B0aW9ucy5hY2Nlc3NLZXlTZWNyZXQsIHN0cmluZ1RvU2lnbik7XG59O1xuXG4vKipcbiAqIGNyZWF0ZSByZXF1ZXN0IHBhcmFtc1xuICogU2VlIGByZXF1ZXN0YFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxucHJvdG8uY3JlYXRlUmVxdWVzdCA9IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QocGFyYW1zKSB7XG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgJ3gtb3NzLWRhdGUnOiBkYXRlRm9ybWF0KCtuZXcgRGF0ZSgpICsgdGhpcy5vcHRpb25zLmFtZW5kVGltZVNrZXdlZCwgJ1VUQzpkZGQsIGRkIG1tbSB5eXl5IEhIOk1NOnNzIFxcJ0dNVFxcJycpLFxuICAgICd4LW9zcy11c2VyLWFnZW50JzogdGhpcy51c2VyQWdlbnRcbiAgfTtcblxuICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWVzdFBheSkge1xuICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgeyAneC1vc3MtcmVxdWVzdC1wYXllcic6ICdyZXF1ZXN0ZXInIH0pO1xuICB9XG5cbiAgaWYgKHRoaXMub3B0aW9ucy5zdHNUb2tlbikge1xuICAgIGhlYWRlcnNbJ3gtb3NzLXNlY3VyaXR5LXRva2VuJ10gPSB0aGlzLm9wdGlvbnMuc3RzVG9rZW47XG4gIH1cblxuICBjb3B5KHBhcmFtcy5oZWFkZXJzKS50byhoZWFkZXJzKTtcblxuICBpZiAoIWdldEhlYWRlcihoZWFkZXJzLCAnQ29udGVudC1UeXBlJykpIHtcbiAgICBpZiAocGFyYW1zLm1pbWUgPT09IG1pbWUuZGVmYXVsdF90eXBlKSB7XG4gICAgICBwYXJhbXMubWltZSA9ICcnO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubWltZSAmJiBwYXJhbXMubWltZS5pbmRleE9mKCcvJykgPiAwKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHBhcmFtcy5taW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IG1pbWUuZ2V0VHlwZShwYXJhbXMubWltZSB8fCBwYXRoLmV4dG5hbWUocGFyYW1zLm9iamVjdCB8fCAnJykpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMuY29udGVudCkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTWQ1J10gPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdtZDUnKVxuICAgICAgLnVwZGF0ZShCdWZmZXIuZnJvbShwYXJhbXMuY29udGVudCwgJ3V0ZjgnKSlcbiAgICAgIC5kaWdlc3QoJ2Jhc2U2NCcpO1xuICAgIGlmICghaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IHBhcmFtcy5jb250ZW50Lmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhdXRoUmVzb3VyY2UgPSB0aGlzLl9nZXRSZXNvdXJjZShwYXJhbXMpO1xuICBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSB0aGlzLmF1dGhvcml6YXRpb24ocGFyYW1zLm1ldGhvZCwgYXV0aFJlc291cmNlLCBwYXJhbXMuc3VicmVzLCBoZWFkZXJzKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLl9nZXRSZXFVcmwocGFyYW1zKTtcbiAgdGhpcy5kZWJ1ZygncmVxdWVzdCAlcyAlcywgd2l0aCBoZWFkZXJzICVqLCAhIXN0cmVhbTogJXMnLCBwYXJhbXMubWV0aG9kLCB1cmwsIGhlYWRlcnMsICEhcGFyYW1zLnN0cmVhbSwgJ2luZm8nKTtcbiAgY29uc3QgdGltZW91dCA9IHBhcmFtcy50aW1lb3V0IHx8IHRoaXMub3B0aW9ucy50aW1lb3V0O1xuICBjb25zdCByZXFQYXJhbXMgPSB7XG4gICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIGNvbnRlbnQ6IHBhcmFtcy5jb250ZW50LFxuICAgIHN0cmVhbTogcGFyYW1zLnN0cmVhbSxcbiAgICBoZWFkZXJzLFxuICAgIHRpbWVvdXQsXG4gICAgd3JpdGVTdHJlYW06IHBhcmFtcy53cml0ZVN0cmVhbSxcbiAgICBjdXN0b21SZXNwb25zZTogcGFyYW1zLmN1c3RvbVJlc3BvbnNlLFxuICAgIGN0eDogcGFyYW1zLmN0eCB8fCB0aGlzLmN0eFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIHBhcmFtczogcmVxUGFyYW1zXG4gIH07XG59O1xuXG4vKipcbiAqIHJlcXVlc3Qgb3NzIHNlcnZlclxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogICAtIHtTdHJpbmd9IG9iamVjdFxuICogICAtIHtTdHJpbmd9IGJ1Y2tldFxuICogICAtIHtPYmplY3R9IFtoZWFkZXJzXVxuICogICAtIHtPYmplY3R9IFtxdWVyeV1cbiAqICAgLSB7QnVmZmVyfSBbY29udGVudF1cbiAqICAgLSB7U3RyZWFtfSBbc3RyZWFtXVxuICogICAtIHtTdHJlYW19IFt3cml0ZVN0cmVhbV1cbiAqICAgLSB7U3RyaW5nfSBbbWltZV1cbiAqICAgLSB7Qm9vbGVhbn0gW3htbFJlc3BvbnNlXVxuICogICAtIHtCb29sZWFufSBbY3VzdG9tUmVzcG9uc2VdXG4gKiAgIC0ge051bWJlcn0gW3RpbWVvdXRdXG4gKiAgIC0ge09iamVjdH0gW2N0eF0gcmVxdWVzdCBjb250ZXh0LCBkZWZhdWx0IGlzIGB0aGlzLmN0eGBcbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wcm90by5yZXF1ZXN0ID0gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChwYXJhbXMpIHtcbiAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jcmVhdGVSZXF1ZXN0KHBhcmFtcyk7XG5cbiAgaWYgKCF0aGlzLm9wdGlvbnMudXNlRmV0Y2gpIHtcbiAgICByZXFQYXJhbXMucGFyYW1zLm1vZGUgPSAnZGlzYWJsZS1mZXRjaCc7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgbGV0IHJlcUVycjtcbiAgY29uc3QgdXNlU3RyZWFtID0gISFwYXJhbXMuc3RyZWFtO1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMudXJsbGliLnJlcXVlc3QocmVxUGFyYW1zLnVybCwgcmVxUGFyYW1zLnBhcmFtcyk7XG4gICAgdGhpcy5kZWJ1ZygncmVzcG9uc2UgJXMgJXMsIGdvdCAlcywgaGVhZGVyczogJWonLCBwYXJhbXMubWV0aG9kLCByZXFQYXJhbXMudXJsLCByZXN1bHQuc3RhdHVzLCByZXN1bHQuaGVhZGVycywgJ2luZm8nKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmVxRXJyID0gZXJyO1xuICB9XG4gIGxldCBlcnI7XG4gIGlmIChyZXN1bHQgJiYgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyAmJiBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzLmluZGV4T2YocmVzdWx0LnN0YXR1cykgPT09IC0xKSB7XG4gICAgZXJyID0gYXdhaXQgdGhpcy5yZXF1ZXN0RXJyb3IocmVzdWx0KTtcbiAgICAvLyBub3QgdXNlIHN0cmVhbVxuICAgIGlmIChlcnIuY29kZSA9PT0gJ1JlcXVlc3RUaW1lVG9vU2tld2VkJyAmJiAhdXNlU3RyZWFtKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuYW1lbmRUaW1lU2tld2VkID0gK25ldyBEYXRlKGVyci5zZXJ2ZXJUaW1lKSAtIG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG4gICAgfVxuICAgIGVyci5wYXJhbXMgPSBwYXJhbXM7XG4gIH0gZWxzZSBpZiAocmVxRXJyKSB7XG4gICAgZXJyID0gYXdhaXQgdGhpcy5yZXF1ZXN0RXJyb3IocmVxRXJyKTtcbiAgfVxuXG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAocGFyYW1zLnhtbFJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFyc2VEYXRhID0gYXdhaXQgdGhpcy5wYXJzZVhNTChyZXN1bHQuZGF0YSk7XG4gICAgcmVzdWx0LmRhdGEgPSBwYXJzZURhdGE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnByb3RvLl9nZXRSZXNvdXJjZSA9IGZ1bmN0aW9uIF9nZXRSZXNvdXJjZShwYXJhbXMpIHtcbiAgbGV0IHJlc291cmNlID0gJy8nO1xuICBpZiAocGFyYW1zLmJ1Y2tldCkgcmVzb3VyY2UgKz0gYCR7cGFyYW1zLmJ1Y2tldH0vYDtcbiAgaWYgKHBhcmFtcy5vYmplY3QpIHJlc291cmNlICs9IHBhcmFtcy5vYmplY3Q7XG5cbiAgcmV0dXJuIHJlc291cmNlO1xufTtcblxucHJvdG8uX2lzSVAgPSBfaXNJUDtcblxucHJvdG8uX2VzY2FwZSA9IGZ1bmN0aW9uIF9lc2NhcGUobmFtZSkge1xuICByZXR1cm4gdXRpbGl0eS5lbmNvZGVVUklDb21wb25lbnQobmFtZSkucmVwbGFjZSgvJTJGL2csICcvJyk7XG59O1xuXG5wcm90by5fZ2V0UmVxVXJsID0gZnVuY3Rpb24gX2dldFJlcVVybChwYXJhbXMpIHtcbiAgY29uc3QgZXAgPSB7fTtcbiAgY29weSh0aGlzLm9wdGlvbnMuZW5kcG9pbnQpLnRvKGVwKTtcbiAgY29uc3QgaXNJUCA9IHRoaXMuX2lzSVAoZXAuaG9zdG5hbWUpO1xuICBjb25zdCBpc0NuYW1lID0gdGhpcy5vcHRpb25zLmNuYW1lO1xuICBpZiAocGFyYW1zLmJ1Y2tldCAmJiAhaXNDbmFtZSAmJiAhaXNJUCkge1xuICAgIGVwLmhvc3QgPSBgJHtwYXJhbXMuYnVja2V0fS4ke2VwLmhvc3R9YDtcbiAgfVxuXG4gIGxldCByZW91cmNlUGF0aCA9ICcvJztcbiAgaWYgKHBhcmFtcy5idWNrZXQgJiYgaXNJUCkge1xuICAgIHJlb3VyY2VQYXRoICs9IGAke3BhcmFtcy5idWNrZXR9L2A7XG4gIH1cblxuICBpZiAocGFyYW1zLm9iamVjdCkge1xuICAgIC8vIFByZXNlcnZlICcvJyBpbiByZXN1bHQgdXJsXG4gICAgcmVvdXJjZVBhdGggKz0gdGhpcy5fZXNjYXBlKHBhcmFtcy5vYmplY3QpLnJlcGxhY2UoL1xcKy9nLCAnJTJCJyk7XG4gIH1cbiAgZXAucGF0aG5hbWUgPSByZW91cmNlUGF0aDtcblxuICBjb25zdCBxdWVyeSA9IHt9O1xuICBpZiAocGFyYW1zLnF1ZXJ5KSB7XG4gICAgbWVyZ2UocXVlcnksIHBhcmFtcy5xdWVyeSk7XG4gIH1cblxuICBpZiAocGFyYW1zLnN1YnJlcykge1xuICAgIGxldCBzdWJyZXNBc1F1ZXJ5ID0ge307XG4gICAgaWYgKGlzLnN0cmluZyhwYXJhbXMuc3VicmVzKSkge1xuICAgICAgc3VicmVzQXNRdWVyeVtwYXJhbXMuc3VicmVzXSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoaXMuYXJyYXkocGFyYW1zLnN1YnJlcykpIHtcbiAgICAgIHBhcmFtcy5zdWJyZXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICBzdWJyZXNBc1F1ZXJ5W2tdID0gJyc7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VicmVzQXNRdWVyeSA9IHBhcmFtcy5zdWJyZXM7XG4gICAgfVxuICAgIG1lcmdlKHF1ZXJ5LCBzdWJyZXNBc1F1ZXJ5KTtcbiAgfVxuXG4gIGVwLnF1ZXJ5ID0gcXVlcnk7XG5cbiAgcmV0dXJuIHVybHV0aWwuZm9ybWF0KGVwKTtcbn07XG5cbi8qXG4gKiBHZXQgVXNlci1BZ2VudCBmb3IgYnJvd3NlciAmIG5vZGUuanNcbiAqIEBleGFtcGxlXG4gKiAgIGFsaXl1bi1zZGstbm9kZWpzLzQuMS4yIE5vZGUuanMgNS4zLjAgb24gRGFyd2luIDY0LWJpdFxuICogICBhbGl5dW4tc2RrLWpzLzQuMS4yIFNhZmFyaSA5LjAgb24gQXBwbGUgaVBob25lKGlPUyA5LjIuMSlcbiAqICAgYWxpeXVuLXNkay1qcy80LjEuMiBDaHJvbWUgNDMuMC4yMzU3LjEzNCAzMi1iaXQgb24gV2luZG93cyBTZXJ2ZXIgMjAwOCBSMiAvIDcgNjQtYml0XG4gKi9cblxucHJvdG8uX2dldFVzZXJBZ2VudCA9IGZ1bmN0aW9uIF9nZXRVc2VyQWdlbnQoKSB7XG4gIGNvbnN0IGFnZW50ID0gKHByb2Nlc3MgJiYgcHJvY2Vzcy5icm93c2VyKSA/ICdqcycgOiAnbm9kZWpzJztcbiAgY29uc3Qgc2RrID0gYGFsaXl1bi1zZGstJHthZ2VudH0vJHtwa2cudmVyc2lvbn1gO1xuICBsZXQgcGxhdCA9IHBsYXRmb3JtLmRlc2NyaXB0aW9uO1xuICBpZiAoIXBsYXQgJiYgcHJvY2Vzcykge1xuICAgIHBsYXQgPSBgTm9kZS5qcyAke3Byb2Nlc3MudmVyc2lvbi5zbGljZSgxKX0gb24gJHtwcm9jZXNzLnBsYXRmb3JtfSAke3Byb2Nlc3MuYXJjaH1gO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NoZWNrVXNlckFnZW50KGAke3Nka30gJHtwbGF0fWApO1xufTtcblxucHJvdG8uX2NoZWNrVXNlckFnZW50ID0gZnVuY3Rpb24gX2NoZWNrVXNlckFnZW50KHVhKSB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHVhLnJlcGxhY2UoL1xcdTAzYjEvLCAnYWxwaGEnKS5yZXBsYWNlKC9cXHUwM2IyLywgJ2JldGEnKTtcbiAgcmV0dXJuIHVzZXJBZ2VudDtcbn07XG5cbi8qXG4gKiBDaGVjayBCcm93c2VyIEFuZCBWZXJzaW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIGJyb3dzZXIgbmFtZTogbGlrZSBJRSwgQ2hyb21lLCBGaXJlZm94XG4gKiBAcGFyYW0ge1N0cmluZ30gW3ZlcnNpb25dIGJyb3dzZXIgbWFqb3IgdmVyc2lvbjogbGlrZSAxMChJRSAxMC54KSwgNTUoQ2hyb21lIDU1LngpLCA1MChGaXJlZm94IDUwLngpXG4gKiBAcmV0dXJuIHtCb29sfSB0cnVlIG9yIGZhbHNlXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5wcm90by5jaGVja0Jyb3dzZXJBbmRWZXJzaW9uID0gZnVuY3Rpb24gY2hlY2tCcm93c2VyQW5kVmVyc2lvbihuYW1lLCB2ZXJzaW9uKSB7XG4gIHJldHVybiAoKGJvd3Nlci5uYW1lID09PSBuYW1lKSAmJiAoYm93c2VyLnZlcnNpb24uc3BsaXQoJy4nKVswXSA9PT0gdmVyc2lvbikpO1xufTtcblxuLyoqXG4gKiB0aHVua2lmeSB4bWwucGFyc2VTdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfEJ1ZmZlcn0gc3RyXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxucHJvdG8ucGFyc2VYTUwgPSBmdW5jdGlvbiBwYXJzZVhNTFRodW5rKHN0cikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyKSkge1xuICAgICAgc3RyID0gc3RyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHhtbC5wYXJzZVN0cmluZyhzdHIsIHtcbiAgICAgIGV4cGxpY2l0Um9vdDogZmFsc2UsXG4gICAgICBleHBsaWNpdEFycmF5OiBmYWxzZVxuICAgIH0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGdlbmVyYXRlciBhIHJlcXVlc3QgZXJyb3Igd2l0aCByZXF1ZXN0IHJlc3BvbnNlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxucHJvdG8ucmVxdWVzdEVycm9yID0gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEVycm9yKHJlc3VsdCkge1xuICBsZXQgZXJyID0gbnVsbDtcbiAgaWYgKCFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IC0xIHx8IHJlc3VsdC5zdGF0dXMgPT09IC0yKSB7IC8vIC0xIGlzIG5ldCBlcnJvciAsIC0yIGlzIHRpbWVvdXRcbiAgICAgIGVyciA9IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICBlcnIubmFtZSA9IHJlc3VsdC5uYW1lO1xuICAgICAgZXJyLnN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgICBlcnIuY29kZSA9IHJlc3VsdC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIRUFEIG5vdCBleGlzdHMgcmVzb3VyY2VcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgZXJyID0gbmV3IEVycm9yKCdPYmplY3Qgbm90IGV4aXN0cycpO1xuICAgICAgICBlcnIubmFtZSA9ICdOb1N1Y2hLZXlFcnJvcic7XG4gICAgICAgIGVyci5zdGF0dXMgPSA0MDQ7XG4gICAgICAgIGVyci5jb2RlID0gJ05vU3VjaEtleSc7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDQxMikge1xuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ1ByZSBjb25kaXRpb24gZmFpbGVkJyk7XG4gICAgICAgIGVyci5uYW1lID0gJ1ByZWNvbmRpdGlvbkZhaWxlZEVycm9yJztcbiAgICAgICAgZXJyLnN0YXR1cyA9IDQxMjtcbiAgICAgICAgZXJyLmNvZGUgPSAnUHJlY29uZGl0aW9uRmFpbGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyciA9IG5ldyBFcnJvcihgVW5rbm93IGVycm9yLCBzdGF0dXM6ICR7cmVzdWx0LnN0YXR1c31gKTtcbiAgICAgICAgZXJyLm5hbWUgPSAnVW5rbm93RXJyb3InO1xuICAgICAgICBlcnIuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICAgIH1cbiAgICAgIGVyci5yZXF1ZXN0SWQgPSByZXN1bHQuaGVhZGVyc1sneC1vc3MtcmVxdWVzdC1pZCddO1xuICAgICAgZXJyLmhvc3QgPSAnJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IFN0cmluZyhyZXN1bHQuZGF0YSk7XG4gICAgdGhpcy5kZWJ1ZygncmVxdWVzdCByZXNwb25zZSBlcnJvciBkYXRhOiAlcycsIG1lc3NhZ2UsICdlcnJvcicpO1xuXG4gICAgbGV0IGluZm87XG4gICAgdHJ5IHtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLnBhcnNlWE1MKG1lc3NhZ2UpIHx8IHt9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmRlYnVnKG1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxucmF3IHhtbDogJHttZXNzYWdlfWA7XG4gICAgICBlcnJvci5zdGF0dXMgPSByZXN1bHQuc3RhdHVzO1xuICAgICAgZXJyb3IucmVxdWVzdElkID0gcmVzdWx0LmhlYWRlcnNbJ3gtb3NzLXJlcXVlc3QtaWQnXTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG5cbiAgICBsZXQgbXNnID0gaW5mby5NZXNzYWdlIHx8IChgdW5rbm93IHJlcXVlc3QgZXJyb3IsIHN0YXR1czogJHtyZXN1bHQuc3RhdHVzfWApO1xuICAgIGlmIChpbmZvLkNvbmRpdGlvbikge1xuICAgICAgbXNnICs9IGAgKGNvbmRpdGlvbjogJHtpbmZvLkNvbmRpdGlvbn0pYDtcbiAgICB9XG4gICAgZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gICAgZXJyLm5hbWUgPSBpbmZvLkNvZGUgPyBgJHtpbmZvLkNvZGV9RXJyb3JgIDogJ1Vua25vd0Vycm9yJztcbiAgICBlcnIuc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcbiAgICBlcnIuY29kZSA9IGluZm8uQ29kZTtcbiAgICBlcnIucmVxdWVzdElkID0gaW5mby5SZXF1ZXN0SWQ7XG4gICAgZXJyLmhvc3RJZCA9IGluZm8uSG9zdElkO1xuICAgIGVyci5zZXJ2ZXJUaW1lID0gaW5mby5TZXJ2ZXJUaW1lO1xuICB9XG5cbiAgdGhpcy5kZWJ1ZygnZ2VuZXJhdGUgZXJyb3IgJWonLCBlcnIsICdlcnJvcicpO1xuICByZXR1cm4gZXJyO1xufTtcblxuIiwiXG5cbi8vIHZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2FsaS1vc3M6bXVsdGlwYXJ0Jyk7XG5jb25zdCBpcyA9IHJlcXVpcmUoJ2lzLXR5cGUtb2YnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgbWltZSA9IHJlcXVpcmUoJ21pbWUnKTtcbmNvbnN0IGNvcHkgPSByZXF1aXJlKCdjb3B5LXRvJyk7XG5cbmNvbnN0IHByb3RvID0gZXhwb3J0cztcblxuLyoqXG4gKiBNdWx0aXBhcnQgb3BlcmF0aW9uc1xuICovXG5cbi8qKlxuICogVXBsb2FkIGEgZmlsZSB0byBPU1MgdXNpbmcgbXVsdGlwYXJ0IHVwbG9hZHNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xGaWxlfSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIHtPYmplY3R9IG9wdGlvbnMuY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHBhcmFtZXRlciBpcyBjb21wb3NlZCBvZiBhIEpTT04gc3RyaW5nIGVuY29kZWQgaW4gQmFzZTY0XG4gKiAgICAgICAge1N0cmluZ30gb3B0aW9ucy5jYWxsYmFjay51cmwgdGhlIE9TUyBzZW5kcyBhIGNhbGxiYWNrIHJlcXVlc3QgdG8gdGhpcyBVUkxcbiAqICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLmhvc3QgVGhlIGhvc3QgaGVhZGVyIHZhbHVlIGZvciBpbml0aWF0aW5nIGNhbGxiYWNrIHJlcXVlc3RzXG4gKiAgICAgICAge1N0cmluZ30gb3B0aW9ucy5jYWxsYmFjay5ib2R5IFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBib2R5IHdoZW4gYSBjYWxsYmFjayBpcyBpbml0aWF0ZWRcbiAqICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLmNvbnRlbnRUeXBlIFRoZSBDb250ZW50LVR5cGUgb2YgdGhlIGNhbGxiYWNrIHJlcXVlc3RzIGluaXRpYXRpYXRlZFxuICogICAgICAgIHtPYmplY3R9IG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWUgQ3VzdG9tIHBhcmFtZXRlcnMgYXJlIGEgbWFwIG9mIGtleS12YWx1ZXMsIGUuZzpcbiAqICAgICAgICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSB7XG4gKiAgICAgICAgICAgICAgICAgICAga2V5MTogJ3ZhbHVlMScsXG4gKiAgICAgICAgICAgICAgICAgICAga2V5MjogJ3ZhbHVlMidcbiAqICAgICAgICAgICAgICAgICAgfVxuICovXG5wcm90by5tdWx0aXBhcnRVcGxvYWQgPSBhc3luYyBmdW5jdGlvbiBtdWx0aXBhcnRVcGxvYWQobmFtZSwgZmlsZSwgb3B0aW9ucykge1xuICB0aGlzLnJlc2V0Q2FuY2VsRmxhZygpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKG9wdGlvbnMuY2hlY2twb2ludCAmJiBvcHRpb25zLmNoZWNrcG9pbnQudXBsb2FkSWQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzdW1lTXVsdGlwYXJ0KG9wdGlvbnMuY2hlY2twb2ludCwgb3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBtaW5QYXJ0U2l6ZSA9IDEwMCAqIDEwMjQ7XG5cbiAgaWYgKCFvcHRpb25zLm1pbWUpIHtcbiAgICBpZiAoaXMuZmlsZShmaWxlKSkge1xuICAgICAgb3B0aW9ucy5taW1lID0gbWltZS5nZXRUeXBlKHBhdGguZXh0bmFtZShmaWxlLm5hbWUpKTtcbiAgICB9IGVsc2UgaWYgKGlzLmJsb2IoZmlsZSkpIHtcbiAgICAgIG9wdGlvbnMubWltZSA9IGZpbGUudHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5taW1lID0gbWltZS5nZXRUeXBlKHBhdGguZXh0bmFtZShmaWxlKSk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9O1xuICB0aGlzLl9jb252ZXJ0TWV0YVRvSGVhZGVycyhvcHRpb25zLm1ldGEsIG9wdGlvbnMuaGVhZGVycyk7XG5cbiAgY29uc3QgZmlsZVNpemUgPSBhd2FpdCB0aGlzLl9nZXRGaWxlU2l6ZShmaWxlKTtcbiAgaWYgKGZpbGVTaXplIDwgbWluUGFydFNpemUpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jcmVhdGVTdHJlYW0oZmlsZSwgMCwgZmlsZVNpemUpO1xuICAgIG9wdGlvbnMuY29udGVudExlbmd0aCA9IGZpbGVTaXplO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wdXRTdHJlYW0obmFtZSwgc3RyZWFtLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByb2dyZXNzKSB7XG4gICAgICBhd2FpdCBvcHRpb25zLnByb2dyZXNzKDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IHtcbiAgICAgIHJlczogcmVzdWx0LnJlcyxcbiAgICAgIGJ1Y2tldDogdGhpcy5vcHRpb25zLmJ1Y2tldCxcbiAgICAgIG5hbWUsXG4gICAgICBldGFnOiByZXN1bHQucmVzLmhlYWRlcnMuZXRhZ1xuICAgIH07XG5cbiAgICBpZiAoKG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ3gtb3NzLWNhbGxiYWNrJ10pIHx8IG9wdGlvbnMuY2FsbGJhY2spIHtcbiAgICAgIHJldC5kYXRhID0gcmVzdWx0LmRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBpZiAob3B0aW9ucy5wYXJ0U2l6ZSAmJiAhKHBhcnNlSW50KG9wdGlvbnMucGFydFNpemUsIDEwKSA9PT0gb3B0aW9ucy5wYXJ0U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRTaXplIG11c3QgYmUgaW50IG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucGFydFNpemUgJiYgb3B0aW9ucy5wYXJ0U2l6ZSA8IG1pblBhcnRTaXplKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYXJ0U2l6ZSBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gJHttaW5QYXJ0U2l6ZX1gKTtcbiAgfVxuXG4gIGNvbnN0IGluaXRSZXN1bHQgPSBhd2FpdCB0aGlzLmluaXRNdWx0aXBhcnRVcGxvYWQobmFtZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHsgdXBsb2FkSWQgfSA9IGluaXRSZXN1bHQ7XG4gIGNvbnN0IHBhcnRTaXplID0gdGhpcy5fZ2V0UGFydFNpemUoZmlsZVNpemUsIG9wdGlvbnMucGFydFNpemUpO1xuXG4gIGNvbnN0IGNoZWNrcG9pbnQgPSB7XG4gICAgZmlsZSxcbiAgICBuYW1lLFxuICAgIGZpbGVTaXplLFxuICAgIHBhcnRTaXplLFxuICAgIHVwbG9hZElkLFxuICAgIGRvbmVQYXJ0czogW11cbiAgfTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByb2dyZXNzKSB7XG4gICAgYXdhaXQgb3B0aW9ucy5wcm9ncmVzcygwLCBjaGVja3BvaW50LCBpbml0UmVzdWx0LnJlcyk7XG4gIH1cblxuXG4gIHJldHVybiBhd2FpdCB0aGlzLl9yZXN1bWVNdWx0aXBhcnQoY2hlY2twb2ludCwgb3B0aW9ucyk7XG59O1xuXG4vKlxuICogUmVzdW1lIG11bHRpcGFydCB1cGxvYWQgZnJvbSBjaGVja3BvaW50LiBUaGUgY2hlY2twb2ludCB3aWxsIGJlXG4gKiB1cGRhdGVkIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCBwYXJ0IHVwbG9hZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGVja3BvaW50IHRoZSBjaGVja3BvaW50XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5wcm90by5fcmVzdW1lTXVsdGlwYXJ0ID0gYXN5bmMgZnVuY3Rpb24gX3Jlc3VtZU11bHRpcGFydChjaGVja3BvaW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IHRoYXQgPSB0aGlzO1xuICBpZiAodGhpcy5pc0NhbmNlbCgpKSB7XG4gICAgdGhyb3cgdGhpcy5fbWFrZUNhbmNlbEV2ZW50KCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGZpbGUsIGZpbGVTaXplLCBwYXJ0U2l6ZSwgdXBsb2FkSWQsIGRvbmVQYXJ0cywgbmFtZVxuICB9ID0gY2hlY2twb2ludDtcblxuICBjb25zdCBpbnRlcm5hbERvbmVQYXJ0cyA9IFtdO1xuXG4gIGlmIChkb25lUGFydHMubGVuZ3RoID4gMCkge1xuICAgIGNvcHkoZG9uZVBhcnRzKS50byhpbnRlcm5hbERvbmVQYXJ0cyk7XG4gIH1cblxuICBjb25zdCBwYXJ0T2ZmcyA9IHRoaXMuX2RpdmlkZVBhcnRzKGZpbGVTaXplLCBwYXJ0U2l6ZSk7XG4gIGNvbnN0IG51bVBhcnRzID0gcGFydE9mZnMubGVuZ3RoO1xuICBsZXQgbXVsdGlwYXJ0RmluaXNoID0gZmFsc2U7XG5cbiAgbGV0IHVwbG9hZFBhcnRKb2IgPSBmdW5jdGlvbiB1cGxvYWRQYXJ0Sm9iKHNlbGYsIHBhcnRObykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXNlbGYuaXNDYW5jZWwoKSkge1xuICAgICAgICAgIGNvbnN0IHBpID0gcGFydE9mZnNbcGFydE5vIC0gMV07XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHN0cmVhbTogc2VsZi5fY3JlYXRlU3RyZWFtKGZpbGUsIHBpLnN0YXJ0LCBwaS5lbmQpLFxuICAgICAgICAgICAgc2l6ZTogcGkuZW5kIC0gcGkuc3RhcnRcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VsZi5fdXBsb2FkUGFydChuYW1lLCB1cGxvYWRJZCwgcGFydE5vLCBkYXRhKTtcbiAgICAgICAgICBpZiAoIXNlbGYuaXNDYW5jZWwoKSAmJiAhbXVsdGlwYXJ0RmluaXNoKSB7XG4gICAgICAgICAgICBjaGVja3BvaW50LmRvbmVQYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgbnVtYmVyOiBwYXJ0Tm8sXG4gICAgICAgICAgICAgIGV0YWc6IHJlc3VsdC5yZXMuaGVhZGVycy5ldGFnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5wcm9ncmVzcyhkb25lUGFydHMubGVuZ3RoIC8gbnVtUGFydHMsIGNoZWNrcG9pbnQsIHJlc3VsdC5yZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgbnVtYmVyOiBwYXJ0Tm8sXG4gICAgICAgICAgICAgIGV0YWc6IHJlc3VsdC5yZXMuaGVhZGVycy5ldGFnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCB0ZW1wRXJyID0gbmV3IEVycm9yKCk7XG4gICAgICAgIHRlbXBFcnIubmFtZSA9IGVyci5uYW1lO1xuICAgICAgICB0ZW1wRXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgdGVtcEVyci5zdGFjayA9IGVyci5zdGFjaztcbiAgICAgICAgdGVtcEVyci5wYXJ0TnVtID0gcGFydE5vO1xuICAgICAgICBjb3B5KGVycikudG8odGVtcEVycik7XG4gICAgICAgIHJlamVjdCh0ZW1wRXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKG5ldyBBcnJheShudW1QYXJ0cyksICh4LCBpKSA9PiBpICsgMSk7XG4gIGNvbnN0IGRvbmUgPSBpbnRlcm5hbERvbmVQYXJ0cy5tYXAocCA9PiBwLm51bWJlcik7XG4gIGNvbnN0IHRvZG8gPSBhbGwuZmlsdGVyKHAgPT4gZG9uZS5pbmRleE9mKHApIDwgMCk7XG4gIGNvbnN0IGRlZmF1bHRQYXJhbGxlbCA9IDU7XG4gIGNvbnN0IHBhcmFsbGVsID0gb3B0aW9ucy5wYXJhbGxlbCB8fCBkZWZhdWx0UGFyYWxsZWw7XG5cbiAgLy8gdXBsb2FkIGluIHBhcmFsbGVsXG4gIGNvbnN0IGpvYkVyciA9IGF3YWl0IHRoaXMuX3BhcmFsbGVsKHRvZG8sIHBhcmFsbGVsLCB2YWx1ZSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdXBsb2FkUGFydEpvYih0aGF0LCB2YWx1ZSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGludGVybmFsRG9uZVBhcnRzLnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSkpO1xuICBtdWx0aXBhcnRGaW5pc2ggPSB0cnVlO1xuXG4gIGlmICh0aGlzLmlzQ2FuY2VsKCkpIHtcbiAgICB1cGxvYWRQYXJ0Sm9iID0gbnVsbDtcbiAgICB0aHJvdyB0aGlzLl9tYWtlQ2FuY2VsRXZlbnQoKTtcbiAgfVxuXG4gIGlmIChqb2JFcnIgJiYgam9iRXJyLmxlbmd0aCA+IDApIHtcbiAgICBqb2JFcnJbMF0ubWVzc2FnZSA9IGBGYWlsZWQgdG8gdXBsb2FkIHNvbWUgcGFydHMgd2l0aCBlcnJvcjogJHtqb2JFcnJbMF0udG9TdHJpbmcoKX0gcGFydF9udW06ICR7am9iRXJyWzBdLnBhcnROdW19YDtcbiAgICB0aHJvdyBqb2JFcnJbMF07XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQobmFtZSwgdXBsb2FkSWQsIGludGVybmFsRG9uZVBhcnRzLCBvcHRpb25zKTtcbn07XG5cblxuaXMuZmlsZSA9IGZ1bmN0aW9uIGZpbGUob2JqKSB7XG4gIHJldHVybiB0eXBlb2YgKEZpbGUpICE9PSAndW5kZWZpbmVkJyAmJiBvYmogaW5zdGFuY2VvZiBGaWxlO1xufTtcblxuaXMuYmxvYiA9IGZ1bmN0aW9uIChibG9iKSB7XG4gIHJldHVybiB0eXBlb2YgKEJsb2IpICE9PSAndW5kZWZpbmVkJyAmJiBibG9iIGluc3RhbmNlb2YgQmxvYjtcbn07XG5cbi8qKlxuICogR2V0IGZpbGUgc2l6ZVxuICovXG5wcm90by5fZ2V0RmlsZVNpemUgPSBhc3luYyBmdW5jdGlvbiBfZ2V0RmlsZVNpemUoZmlsZSkge1xuICBpZiAoaXMuYnVmZmVyKGZpbGUpKSB7XG4gICAgcmV0dXJuIGZpbGUubGVuZ3RoO1xuICB9IGVsc2UgaWYgKGlzLmJsb2IoZmlsZSkgfHwgaXMuZmlsZShmaWxlKSkge1xuICAgIHJldHVybiBmaWxlLnNpemU7XG4gIH0gaWYgKGlzLnN0cmluZyhmaWxlKSkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLl9zdGF0RmlsZShmaWxlKTtcbiAgICByZXR1cm4gc3RhdC5zaXplO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdfZ2V0RmlsZVNpemUgcmVxdWlyZXMgQnVmZmVyL0ZpbGUvU3RyaW5nLicpO1xufTtcblxuLypcbiAqIFJlYWRhYmxlIHN0cmVhbSBmb3IgV2ViIEZpbGVcbiAqL1xuY29uc3QgeyBSZWFkYWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmZ1bmN0aW9uIFdlYkZpbGVSZWFkU3RyZWFtKGZpbGUsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdlYkZpbGVSZWFkU3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgV2ViRmlsZVJlYWRTdHJlYW0oZmlsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuZmlsZSA9IGZpbGU7XG4gIHRoaXMucmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuZmluaXNoID0gZmFsc2U7XG4gIHRoaXMuZmlsZUJ1ZmZlciA9IG51bGw7XG59XG51dGlsLmluaGVyaXRzKFdlYkZpbGVSZWFkU3RyZWFtLCBSZWFkYWJsZSk7XG5cbldlYkZpbGVSZWFkU3RyZWFtLnByb3RvdHlwZS5yZWFkRmlsZUFuZFB1c2ggPSBmdW5jdGlvbiByZWFkRmlsZUFuZFB1c2goc2l6ZSkge1xuICBpZiAodGhpcy5maWxlQnVmZmVyKSB7XG4gICAgbGV0IHB1c2hSZXQgPSB0cnVlO1xuICAgIHdoaWxlIChwdXNoUmV0ICYmIHRoaXMuZmlsZUJ1ZmZlciAmJiB0aGlzLnN0YXJ0IDwgdGhpcy5maWxlQnVmZmVyLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBzdGFydCB9ID0gdGhpcztcbiAgICAgIGxldCBlbmQgPSBzdGFydCArIHNpemU7XG4gICAgICBlbmQgPSBlbmQgPiB0aGlzLmZpbGVCdWZmZXIubGVuZ3RoID8gdGhpcy5maWxlQnVmZmVyLmxlbmd0aCA6IGVuZDtcbiAgICAgIHRoaXMuc3RhcnQgPSBlbmQ7XG4gICAgICBwdXNoUmV0ID0gdGhpcy5wdXNoKHRoaXMuZmlsZUJ1ZmZlci5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgfVxuICB9XG59O1xuXG5XZWJGaWxlUmVhZFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiBfcmVhZChzaXplKSB7XG4gIGlmICgodGhpcy5maWxlICYmIHRoaXMuc3RhcnQgPj0gdGhpcy5maWxlLnNpemUpIHx8XG4gICAgICAodGhpcy5maWxlQnVmZmVyICYmIHRoaXMuc3RhcnQgPj0gdGhpcy5maWxlQnVmZmVyLmxlbmd0aCkgfHxcbiAgICAgICh0aGlzLmZpbmlzaCkgfHwgKHRoaXMuc3RhcnQgPT09IDAgJiYgIXRoaXMuZmlsZSkpIHtcbiAgICBpZiAoIXRoaXMuZmluaXNoKSB7XG4gICAgICB0aGlzLmZpbGVCdWZmZXIgPSBudWxsO1xuICAgICAgdGhpcy5maW5pc2ggPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdFJlYWRTaXplID0gMTYgKiAxMDI0O1xuICBzaXplID0gc2l6ZSB8fCBkZWZhdWx0UmVhZFNpemU7XG5cbiAgY29uc3QgdGhhdCA9IHRoaXM7XG4gIHRoaXMucmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIG9ubG9hZChlKSB7XG4gICAgdGhhdC5maWxlQnVmZmVyID0gQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoZS50YXJnZXQucmVzdWx0KSk7XG4gICAgdGhhdC5maWxlID0gbnVsbDtcbiAgICB0aGF0LnJlYWRGaWxlQW5kUHVzaChzaXplKTtcbiAgfTtcblxuICBpZiAodGhpcy5zdGFydCA9PT0gMCkge1xuICAgIHRoaXMucmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHRoaXMuZmlsZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZWFkRmlsZUFuZFB1c2goc2l6ZSk7XG4gIH1cbn07XG5cbnByb3RvLl9jcmVhdGVTdHJlYW0gPSBmdW5jdGlvbiBfY3JlYXRlU3RyZWFtKGZpbGUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKGlzLmJsb2IoZmlsZSkgfHwgaXMuZmlsZShmaWxlKSkge1xuICAgIHJldHVybiBuZXcgV2ViRmlsZVJlYWRTdHJlYW0oZmlsZS5zbGljZShzdGFydCwgZW5kKSk7XG4gIH1cbiAgLy8gZWxzZSBpZiAoaXMuc3RyaW5nKGZpbGUpKSB7XG4gIC8vICAgcmV0dXJuIGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSwge1xuICAvLyAgICAgc3RhcnQ6IHN0YXJ0LFxuICAvLyAgICAgZW5kOiBlbmQgLSAxXG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ19jcmVhdGVTdHJlYW0gcmVxdWlyZXMgRmlsZS9TdHJpbmcuJyk7XG59O1xuXG5wcm90by5fZ2V0UGFydFNpemUgPSBmdW5jdGlvbiBfZ2V0UGFydFNpemUoZmlsZVNpemUsIHBhcnRTaXplKSB7XG4gIGNvbnN0IG1heE51bVBhcnRzID0gMTAgKiAxMDAwO1xuICBjb25zdCBkZWZhdWx0UGFydFNpemUgPSAxMDI0ICogMTAyNDtcblxuICBpZiAoIXBhcnRTaXplKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXJ0U2l6ZTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1heChcbiAgICBNYXRoLmNlaWwoZmlsZVNpemUgLyBtYXhOdW1QYXJ0cyksXG4gICAgcGFydFNpemUsXG4gICk7XG59O1xuXG5wcm90by5fZGl2aWRlUGFydHMgPSBmdW5jdGlvbiBfZGl2aWRlUGFydHMoZmlsZVNpemUsIHBhcnRTaXplKSB7XG4gIGNvbnN0IG51bVBhcnRzID0gTWF0aC5jZWlsKGZpbGVTaXplIC8gcGFydFNpemUpO1xuXG4gIGNvbnN0IHBhcnRPZmZzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFydHM7IGkrKykge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGFydFNpemUgKiBpO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgcGFydFNpemUsIGZpbGVTaXplKTtcblxuICAgIHBhcnRPZmZzLnB1c2goe1xuICAgICAgc3RhcnQsXG4gICAgICBlbmRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0T2Zmcztcbn07XG4iLCJcbi8vIGNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYWxpLW9zczpvYmplY3QnKTtcbmNvbnN0IHV0aWxpdHkgPSByZXF1aXJlKCd1dGlsaXR5Jyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBpcyA9IHJlcXVpcmUoJ2lzLXR5cGUtb2YnKTtcbmNvbnN0IHVybHV0aWwgPSByZXF1aXJlKCd1cmwnKTtcbmNvbnN0IGNvcHkgPSByZXF1aXJlKCdjb3B5LXRvJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgbWltZSA9IHJlcXVpcmUoJ21pbWUnKTtcbmNvbnN0IGNhbGxiYWNrID0gcmVxdWlyZSgnLi4vY29tbW9uL2NhbGxiYWNrJyk7XG5jb25zdCBzaWduSGVscGVyID0gcmVxdWlyZSgnLi4vY29tbW9uL3NpZ25VdGlscycpO1xuY29uc3QgbWVyZ2UgPSByZXF1aXJlKCdtZXJnZS1kZXNjcmlwdG9ycycpO1xuXG4vLyB2YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5cblxuY29uc3QgcHJvdG8gPSBleHBvcnRzO1xuXG4vKipcbiAqIE9iamVjdCBvcGVyYXRpb25zXG4gKi9cblxuLyoqXG4gICogYXBwZW5kIGFuIG9iamVjdCBmcm9tIFN0cmluZyhmaWxlIHBhdGgpL0J1ZmZlci9SZWFkYWJsZVN0cmVhbVxuICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBvYmplY3Qga2V5XG4gICogQHBhcmFtIHtNaXhlZH0gZmlsZSBTdHJpbmcoZmlsZSBwYXRoKS9CdWZmZXIvUmVhZGFibGVTdHJlYW1cbiAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAqIEByZXR1cm4ge09iamVjdH1cbiAgKi9cbnByb3RvLmFwcGVuZCA9IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZChuYW1lLCBmaWxlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLnBvc2l0aW9uID0gJzAnO1xuICBvcHRpb25zLnN1YnJlcyA9IHtcbiAgICBhcHBlbmQ6ICcnLFxuICAgIHBvc2l0aW9uOiBvcHRpb25zLnBvc2l0aW9uXG4gIH07XG4gIG9wdGlvbnMubWV0aG9kID0gJ1BPU1QnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHV0KG5hbWUsIGZpbGUsIG9wdGlvbnMpO1xuICByZXN1bHQubmV4dEFwcGVuZFBvc2l0aW9uID0gcmVzdWx0LnJlcy5oZWFkZXJzWyd4LW9zcy1uZXh0LWFwcGVuZC1wb3NpdGlvbiddO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBwdXQgYW4gb2JqZWN0IGZyb20gU3RyaW5nKGZpbGUgcGF0aCkvQnVmZmVyL1JlYWRhYmxlU3RyZWFtXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgb2JqZWN0IGtleVxuICogQHBhcmFtIHtNaXhlZH0gZmlsZSBTdHJpbmcoZmlsZSBwYXRoKS9CdWZmZXIvUmVhZGFibGVTdHJlYW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgICAgICAge09iamVjdH0gb3B0aW9ucy5jYWxsYmFjayBUaGUgY2FsbGJhY2sgcGFyYW1ldGVyIGlzIGNvbXBvc2VkIG9mIGEgSlNPTiBzdHJpbmcgZW5jb2RlZCBpbiBCYXNlNjRcbiAqICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLnVybCAgdGhlIE9TUyBzZW5kcyBhIGNhbGxiYWNrIHJlcXVlc3QgdG8gdGhpcyBVUkxcbiAqICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLmhvc3QgIFRoZSBob3N0IGhlYWRlciB2YWx1ZSBmb3IgaW5pdGlhdGluZyBjYWxsYmFjayByZXF1ZXN0c1xuICogICAgICAgIHtTdHJpbmd9IG9wdGlvbnMuY2FsbGJhY2suYm9keSAgVGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0IGJvZHkgd2hlbiBhIGNhbGxiYWNrIGlzIGluaXRpYXRlZFxuICogICAgICAgIHtTdHJpbmd9IG9wdGlvbnMuY2FsbGJhY2suY29udGVudFR5cGUgIFRoZSBDb250ZW50LVR5cGUgb2YgdGhlIGNhbGxiYWNrIHJlcXVlc3RzIGluaXRpYXRpYXRlZFxuICogICAgICAgIHtPYmplY3R9IG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWUgIEN1c3RvbSBwYXJhbWV0ZXJzIGFyZSBhIG1hcCBvZiBrZXktdmFsdWVzLCBlLmc6XG4gKiAgICAgICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0ge1xuICogICAgICAgICAgICAgICAgICAgIGtleTE6ICd2YWx1ZTEnLFxuICogICAgICAgICAgICAgICAgICAgIGtleTI6ICd2YWx1ZTInXG4gKiAgICAgICAgICAgICAgICAgIH1cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xucHJvdG8ucHV0ID0gYXN5bmMgZnVuY3Rpb24gcHV0KG5hbWUsIGZpbGUsIG9wdGlvbnMpIHtcbiAgbGV0IGNvbnRlbnQ7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBuYW1lID0gdGhpcy5fb2JqZWN0TmFtZShuYW1lKTtcbiAgaWYgKGlzLmJ1ZmZlcihmaWxlKSkge1xuICAgIGNvbnRlbnQgPSBmaWxlO1xuICB9IGVsc2UgaWYgKGlzLmJsb2IoZmlsZSkgfHwgaXMuZmlsZShmaWxlKSkge1xuICAgIGlmICghb3B0aW9ucy5taW1lKSB7XG4gICAgICBpZiAoaXMuZmlsZShmaWxlKSkge1xuICAgICAgICBvcHRpb25zLm1pbWUgPSBtaW1lLmdldFR5cGUocGF0aC5leHRuYW1lKGZpbGUubmFtZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5taW1lID0gZmlsZS50eXBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX2NyZWF0ZVN0cmVhbShmaWxlLCAwLCBmaWxlLnNpemUpO1xuICAgIG9wdGlvbnMuY29udGVudExlbmd0aCA9IGF3YWl0IHRoaXMuX2dldEZpbGVTaXplKGZpbGUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnB1dFN0cmVhbShuYW1lLCBzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ1JlcXVlc3RUaW1lVG9vU2tld2VkJykge1xuICAgICAgICB0aGlzLm9wdGlvbnMuYW1lbmRUaW1lU2tld2VkID0gK25ldyBEYXRlKGVyci5zZXJ2ZXJUaW1lKSAtIG5ldyBEYXRlKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnB1dChuYW1lLCBmaWxlLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCBwcm92aWRlIEJ1ZmZlci9CbG9iIGZvciBwdXQuJyk7XG4gIH1cblxuICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307XG4gIHRoaXMuX2NvbnZlcnRNZXRhVG9IZWFkZXJzKG9wdGlvbnMubWV0YSwgb3B0aW9ucy5oZWFkZXJzKTtcblxuICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnUFVUJztcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcyhtZXRob2QsIG5hbWUsIG9wdGlvbnMpO1xuICBjYWxsYmFjay5lbmNvZGVDYWxsYmFjayhwYXJhbXMsIG9wdGlvbnMpO1xuICBwYXJhbXMubWltZSA9IG9wdGlvbnMubWltZTtcbiAgcGFyYW1zLmNvbnRlbnQgPSBjb250ZW50O1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgY29uc3QgcmV0ID0ge1xuICAgIG5hbWUsXG4gICAgdXJsOiB0aGlzLl9vYmplY3RVcmwobmFtZSksXG4gICAgcmVzOiByZXN1bHQucmVzXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5oZWFkZXJzICYmIHBhcmFtcy5oZWFkZXJzWyd4LW9zcy1jYWxsYmFjayddKSB7XG4gICAgcmV0LmRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogcHV0IGFuIG9iamVjdCBmcm9tIFJlYWRhYmxlU3RyZWFtLiBJZiBgb3B0aW9ucy5jb250ZW50TGVuZ3RoYCBpc1xuICogbm90IHByb3ZpZGVkLCBjaHVua2VkIGVuY29kaW5nIGlzIHVzZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgb2JqZWN0IGtleVxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIHRoZSBSZWFkYWJsZVN0cmVhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xucHJvdG8ucHV0U3RyZWFtID0gYXN5bmMgZnVuY3Rpb24gcHV0U3RyZWFtKG5hbWUsIHN0cmVhbSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9O1xuICBuYW1lID0gdGhpcy5fb2JqZWN0TmFtZShuYW1lKTtcbiAgaWYgKG9wdGlvbnMuY29udGVudExlbmd0aCkge1xuICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IG9wdGlvbnMuY29udGVudExlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10gPSAnY2h1bmtlZCc7XG4gIH1cbiAgdGhpcy5fY29udmVydE1ldGFUb0hlYWRlcnMob3B0aW9ucy5tZXRhLCBvcHRpb25zLmhlYWRlcnMpO1xuXG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8ICdQVVQnO1xuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKG1ldGhvZCwgbmFtZSwgb3B0aW9ucyk7XG4gIGNhbGxiYWNrLmVuY29kZUNhbGxiYWNrKHBhcmFtcywgb3B0aW9ucyk7XG4gIHBhcmFtcy5taW1lID0gb3B0aW9ucy5taW1lO1xuICBwYXJhbXMuc3RyZWFtID0gc3RyZWFtO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgY29uc3QgcmV0ID0ge1xuICAgIG5hbWUsXG4gICAgdXJsOiB0aGlzLl9vYmplY3RVcmwobmFtZSksXG4gICAgcmVzOiByZXN1bHQucmVzXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5oZWFkZXJzICYmIHBhcmFtcy5oZWFkZXJzWyd4LW9zcy1jYWxsYmFjayddKSB7XG4gICAgcmV0LmRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbnByb3RvLmhlYWQgPSBhc3luYyBmdW5jdGlvbiBoZWFkKG5hbWUsIG9wdGlvbnMpIHtcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnSEVBRCcsIG5hbWUsIG9wdGlvbnMpO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMCwgMzA0XTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QocGFyYW1zKTtcblxuICBjb25zdCBkYXRhID0ge1xuICAgIG1ldGE6IG51bGwsXG4gICAgcmVzOiByZXN1bHQucmVzLFxuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1c1xuICB9O1xuXG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSAyMDApIHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgaWYgKGsuaW5kZXhPZigneC1vc3MtbWV0YS0nKSA9PT0gMCkge1xuICAgICAgICBpZiAoIWRhdGEubWV0YSkge1xuICAgICAgICAgIGRhdGEubWV0YSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGRhdGEubWV0YVtrLnN1YnN0cmluZygxMSldID0gcmVzdWx0LmhlYWRlcnNba107XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5wcm90by5nZXQgPSBhc3luYyBmdW5jdGlvbiBnZXQobmFtZSwgZmlsZSwgb3B0aW9ucykge1xuICBsZXQgd3JpdGVTdHJlYW0gPSBudWxsO1xuICBsZXQgbmVlZERlc3Ryb3kgPSBmYWxzZTtcblxuICBpZiAoaXMud3JpdGFibGVTdHJlYW0oZmlsZSkpIHtcbiAgICB3cml0ZVN0cmVhbSA9IGZpbGU7XG4gIH0gZWxzZSBpZiAoaXMuc3RyaW5nKGZpbGUpKSB7XG4gICAgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlKTtcbiAgICBuZWVkRGVzdHJveSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZ2V0KG5hbWUsIG9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IGZpbGU7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKG9wdGlvbnMucHJvY2Vzcykge1xuICAgIG9wdGlvbnMuc3VicmVzID0gb3B0aW9ucy5zdWJyZXMgfHwge307XG4gICAgb3B0aW9ucy5zdWJyZXNbJ3gtb3NzLXByb2Nlc3MnXSA9IG9wdGlvbnMucHJvY2VzcztcbiAgfVxuXG4gIGxldCByZXN1bHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnR0VUJywgbmFtZSwgb3B0aW9ucyk7XG4gICAgcGFyYW1zLndyaXRlU3RyZWFtID0gd3JpdGVTdHJlYW07XG4gICAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDAsIDIwNiwgMzA0XTtcblxuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuXG4gICAgaWYgKG5lZWREZXN0cm95KSB7XG4gICAgICB3cml0ZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAobmVlZERlc3Ryb3kpIHtcbiAgICAgIHdyaXRlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIC8vIHNob3VsZCBkZWxldGUgdGhlIGV4aXN0cyBmaWxlIGJlZm9yZSB0aHJvdyBlcnJvclxuICAgICAgdGhpcy5kZWJ1ZygnZ2V0IGVycm9yOiAlcywgZGVsZXRlIHRoZSBleGlzdHMgZmlsZSAlcycsIGVyciwgZmlsZSwgJ2Vycm9yJyk7XG4gICAgICBhd2FpdCB0aGlzLl9kZWxldGVGaWxlU2FmZShmaWxlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXM6IHJlc3VsdC5yZXMsXG4gICAgY29udGVudDogcmVzdWx0LmRhdGFcbiAgfTtcbn07XG5cbnByb3RvLmRlbGV0ZSA9IGFzeW5jIGZ1bmN0aW9uIF9kZWxldGUobmFtZSwgb3B0aW9ucykge1xuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKCdERUxFVEUnLCBuYW1lLCBvcHRpb25zKTtcbiAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDRdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuXG4gIHJldHVybiB7XG4gICAgcmVzOiByZXN1bHQucmVzXG4gIH07XG59O1xuXG5wcm90by5kZWxldGVNdWx0aSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU11bHRpKG5hbWVzLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgeG1sID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxcbjxEZWxldGU+XFxuJztcbiAgaWYgKG9wdGlvbnMucXVpZXQpIHtcbiAgICB4bWwgKz0gJyAgPFF1aWV0PnRydWU8L1F1aWV0Plxcbic7XG4gIH0gZWxzZSB7XG4gICAgeG1sICs9ICcgIDxRdWlldD5mYWxzZTwvUXVpZXQ+XFxuJztcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgeG1sICs9IGAgIDxPYmplY3Q+PEtleT4ke1xuICAgICAgdXRpbGl0eS5lc2NhcGUodGhpcy5fb2JqZWN0TmFtZShuYW1lc1tpXSkpfTwvS2V5PjwvT2JqZWN0PlxcbmA7XG4gIH1cbiAgeG1sICs9ICc8L0RlbGV0ZT4nO1xuICB0aGlzLmRlYnVnKCdkZWxldGUgbXVsdGkgb2JqZWN0czogJXMnLCB4bWwsICdpbmZvJyk7XG5cbiAgb3B0aW9ucy5zdWJyZXMgPSAnZGVsZXRlJztcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnUE9TVCcsICcnLCBvcHRpb25zKTtcbiAgcGFyYW1zLm1pbWUgPSAneG1sJztcbiAgcGFyYW1zLmNvbnRlbnQgPSB4bWw7XG4gIHBhcmFtcy54bWxSZXNwb25zZSA9IHRydWU7XG4gIHBhcmFtcy5zdWNjZXNzU3RhdHVzZXMgPSBbMjAwXTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgY29uc3QgciA9IHJlc3VsdC5kYXRhO1xuICBsZXQgZGVsZXRlZCA9IChyICYmIHIuRGVsZXRlZCkgfHwgbnVsbDtcbiAgaWYgKGRlbGV0ZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVsZXRlZCkpIHtcbiAgICAgIGRlbGV0ZWQgPSBbZGVsZXRlZF07XG4gICAgfVxuICAgIGRlbGV0ZWQgPSBkZWxldGVkLm1hcChpdGVtID0+IGl0ZW0uS2V5KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlczogcmVzdWx0LnJlcyxcbiAgICBkZWxldGVkXG4gIH07XG59O1xuXG5tZXJnZShwcm90bywgcmVxdWlyZSgnLi4vY29tbW9uL29iamVjdC9jb3B5T2JqZWN0JykpO1xubWVyZ2UocHJvdG8sIHJlcXVpcmUoJy4uL2NvbW1vbi9vYmplY3QvZ2V0T2JqZWN0VGFnZ2luZycpKTtcbm1lcmdlKHByb3RvLCByZXF1aXJlKCcuLi9jb21tb24vb2JqZWN0L3B1dE9iamVjdFRhZ2dpbmcnKSk7XG5tZXJnZShwcm90bywgcmVxdWlyZSgnLi4vY29tbW9uL29iamVjdC9kZWxldGVPYmplY3RUYWdnaW5nJykpO1xuXG5wcm90by5wdXRNZXRhID0gYXN5bmMgZnVuY3Rpb24gcHV0TWV0YShuYW1lLCBtZXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvcHlSZXN1bHQgPSBhd2FpdCB0aGlzLmNvcHkobmFtZSwgbmFtZSwge1xuICAgIG1ldGE6IG1ldGEgfHwge30sXG4gICAgdGltZW91dDogb3B0aW9ucyAmJiBvcHRpb25zLnRpbWVvdXQsXG4gICAgY3R4OiBvcHRpb25zICYmIG9wdGlvbnMuY3R4XG4gIH0pO1xuICByZXR1cm4gY29weVJlc3VsdDtcbn07XG5cbnByb3RvLmxpc3QgPSBhc3luYyBmdW5jdGlvbiBsaXN0KHF1ZXJ5LCBvcHRpb25zKSB7XG4gIC8vIHByZWZpeCwgbWFya2VyLCBtYXgta2V5cywgZGVsaW1pdGVyXG5cbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnR0VUJywgJycsIG9wdGlvbnMpO1xuICBwYXJhbXMucXVlcnkgPSBxdWVyeTtcbiAgcGFyYW1zLnhtbFJlc3BvbnNlID0gdHJ1ZTtcbiAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDBdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuICBsZXQgb2JqZWN0cyA9IHJlc3VsdC5kYXRhLkNvbnRlbnRzO1xuICBjb25zdCB0aGF0ID0gdGhpcztcbiAgaWYgKG9iamVjdHMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0cykpIHtcbiAgICAgIG9iamVjdHMgPSBbb2JqZWN0c107XG4gICAgfVxuICAgIG9iamVjdHMgPSBvYmplY3RzLm1hcChvYmogPT4gKHtcbiAgICAgIG5hbWU6IG9iai5LZXksXG4gICAgICB1cmw6IHRoYXQuX29iamVjdFVybChvYmouS2V5KSxcbiAgICAgIGxhc3RNb2RpZmllZDogb2JqLkxhc3RNb2RpZmllZCxcbiAgICAgIGV0YWc6IG9iai5FVGFnLFxuICAgICAgdHlwZTogb2JqLlR5cGUsXG4gICAgICBzaXplOiBOdW1iZXIob2JqLlNpemUpLFxuICAgICAgc3RvcmFnZUNsYXNzOiBvYmouU3RvcmFnZUNsYXNzLFxuICAgICAgb3duZXI6IHtcbiAgICAgICAgaWQ6IG9iai5Pd25lci5JRCxcbiAgICAgICAgZGlzcGxheU5hbWU6IG9iai5Pd25lci5EaXNwbGF5TmFtZVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuICBsZXQgcHJlZml4ZXMgPSByZXN1bHQuZGF0YS5Db21tb25QcmVmaXhlcyB8fCBudWxsO1xuICBpZiAocHJlZml4ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJlZml4ZXMpKSB7XG4gICAgICBwcmVmaXhlcyA9IFtwcmVmaXhlc107XG4gICAgfVxuICAgIHByZWZpeGVzID0gcHJlZml4ZXMubWFwKGl0ZW0gPT4gaXRlbS5QcmVmaXgpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVzOiByZXN1bHQucmVzLFxuICAgIG9iamVjdHMsXG4gICAgcHJlZml4ZXMsXG4gICAgbmV4dE1hcmtlcjogcmVzdWx0LmRhdGEuTmV4dE1hcmtlciB8fCBudWxsLFxuICAgIGlzVHJ1bmNhdGVkOiByZXN1bHQuZGF0YS5Jc1RydW5jYXRlZCA9PT0gJ3RydWUnXG4gIH07XG59O1xuXG4vKlxuICogU2V0IG9iamVjdCdzIEFDTFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBrZXlcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2wgdGhlIG9iamVjdCBBQ0xcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKi9cbnByb3RvLnB1dEFDTCA9IGFzeW5jIGZ1bmN0aW9uIHB1dEFDTChuYW1lLCBhY2wsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuc3VicmVzID0gJ2FjbCc7XG4gIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgb3B0aW9ucy5oZWFkZXJzWyd4LW9zcy1vYmplY3QtYWNsJ10gPSBhY2w7XG4gIG5hbWUgPSB0aGlzLl9vYmplY3ROYW1lKG5hbWUpO1xuXG4gIGNvbnN0IHBhcmFtcyA9IHRoaXMuX29iamVjdFJlcXVlc3RQYXJhbXMoJ1BVVCcsIG5hbWUsIG9wdGlvbnMpO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZXM6IHJlc3VsdC5yZXNcbiAgfTtcbn07XG5cbi8qXG4gKiBHZXQgb2JqZWN0J3MgQUNMXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgb2JqZWN0IGtleVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xucHJvdG8uZ2V0QUNMID0gYXN5bmMgZnVuY3Rpb24gZ2V0QUNMKG5hbWUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuc3VicmVzID0gJ2FjbCc7XG4gIG5hbWUgPSB0aGlzLl9vYmplY3ROYW1lKG5hbWUpO1xuXG4gIGNvbnN0IHBhcmFtcyA9IHRoaXMuX29iamVjdFJlcXVlc3RQYXJhbXMoJ0dFVCcsIG5hbWUsIG9wdGlvbnMpO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG4gIHBhcmFtcy54bWxSZXNwb25zZSA9IHRydWU7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBhY2w6IHJlc3VsdC5kYXRhLkFjY2Vzc0NvbnRyb2xMaXN0LkdyYW50LFxuICAgIG93bmVyOiB7XG4gICAgICBpZDogcmVzdWx0LmRhdGEuT3duZXIuSUQsXG4gICAgICBkaXNwbGF5TmFtZTogcmVzdWx0LmRhdGEuT3duZXIuRGlzcGxheU5hbWVcbiAgICB9LFxuICAgIHJlczogcmVzdWx0LnJlc1xuICB9O1xufTtcblxuLyoqXG4gKiBSZXN0b3JlIE9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBrZXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7e3Jlc319XG4gKi9cbnByb3RvLnJlc3RvcmUgPSBhc3luYyBmdW5jdGlvbiByZXN0b3JlKG5hbWUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuc3VicmVzID0gJ3Jlc3RvcmUnO1xuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKCdQT1NUJywgbmFtZSwgb3B0aW9ucyk7XG4gIHBhcmFtcy5zdWNjZXNzU3RhdHVzZXMgPSBbMjAyXTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QocGFyYW1zKTtcblxuICByZXR1cm4ge1xuICAgIHJlczogcmVzdWx0LnJlc1xuICB9O1xufTtcblxucHJvdG8uc2lnbmF0dXJlVXJsID0gZnVuY3Rpb24gc2lnbmF0dXJlVXJsKG5hbWUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG5hbWUgPSB0aGlzLl9vYmplY3ROYW1lKG5hbWUpO1xuICBvcHRpb25zLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8ICdHRVQnO1xuICBjb25zdCBleHBpcmVzID0gdXRpbGl0eS50aW1lc3RhbXAoKSArIChvcHRpb25zLmV4cGlyZXMgfHwgMTgwMCk7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBidWNrZXQ6IHRoaXMub3B0aW9ucy5idWNrZXQsXG4gICAgb2JqZWN0OiBuYW1lXG4gIH07XG5cbiAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLl9nZXRSZXNvdXJjZShwYXJhbXMpO1xuXG4gIGlmICh0aGlzLm9wdGlvbnMuc3RzVG9rZW4pIHtcbiAgICBvcHRpb25zWydzZWN1cml0eS10b2tlbiddID0gdGhpcy5vcHRpb25zLnN0c1Rva2VuO1xuICB9XG5cbiAgY29uc3Qgc2lnblJlcyA9IHNpZ25IZWxwZXIuX3NpZ25hdHVyZUZvclVSTCh0aGlzLm9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0LCBvcHRpb25zLCByZXNvdXJjZSwgZXhwaXJlcyk7XG5cbiAgY29uc3QgdXJsID0gdXJsdXRpbC5wYXJzZSh0aGlzLl9nZXRSZXFVcmwocGFyYW1zKSk7XG4gIHVybC5xdWVyeSA9IHtcbiAgICBPU1NBY2Nlc3NLZXlJZDogdGhpcy5vcHRpb25zLmFjY2Vzc0tleUlkLFxuICAgIEV4cGlyZXM6IGV4cGlyZXMsXG4gICAgU2lnbmF0dXJlOiBzaWduUmVzLlNpZ25hdHVyZVxuICB9O1xuXG4gIGNvcHkoc2lnblJlcy5zdWJSZXNvdXJjZSkudG8odXJsLnF1ZXJ5KTtcblxuICByZXR1cm4gdXJsLmZvcm1hdCgpO1xufTtcblxuLyoqXG4gKiBHZXQgT2JqZWN0IHVybCBieSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VVcmxdIC0gSWYgcHJvdmlkZSBgYmFzZVVybGAsXG4gKiAgICAgICAgd2lsbCB1c2UgYGJhc2VVcmxgIGluc3RlYWQgdGhlIGRlZmF1bHQgYGVuZHBvaW50YC5cbiAqIEByZXR1cm4ge1N0cmluZ30gb2JqZWN0IHVybFxuICovXG5wcm90by5nZXRPYmplY3RVcmwgPSBmdW5jdGlvbiBnZXRPYmplY3RVcmwobmFtZSwgYmFzZVVybCkge1xuICBpZiAoIWJhc2VVcmwpIHtcbiAgICBiYXNlVXJsID0gdGhpcy5vcHRpb25zLmVuZHBvaW50LmZvcm1hdCgpO1xuICB9IGVsc2UgaWYgKGJhc2VVcmxbYmFzZVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgYmFzZVVybCArPSAnLyc7XG4gIH1cbiAgcmV0dXJuIGJhc2VVcmwgKyB0aGlzLl9lc2NhcGUodGhpcy5fb2JqZWN0TmFtZShuYW1lKSk7XG59O1xuXG5wcm90by5fb2JqZWN0VXJsID0gZnVuY3Rpb24gX29iamVjdFVybChuYW1lKSB7XG4gIHJldHVybiB0aGlzLl9nZXRSZXFVcmwoeyBidWNrZXQ6IHRoaXMub3B0aW9ucy5idWNrZXQsIG9iamVjdDogbmFtZSB9KTtcbn07XG5cbi8qKlxuICogR2V0IE9iamVjdCB1cmwgYnkgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBvYmplY3QgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IFtiYXNlVXJsXSAtIElmIHByb3ZpZGUgYGJhc2VVcmxgLCB3aWxsIHVzZSBgYmFzZVVybGAgaW5zdGVhZCB0aGUgZGVmYXVsdCBgZW5kcG9pbnQgYW5kIGJ1Y2tldGAuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB1cmwgaW5jbHVkZSBidWNrZXRcbiAqL1xucHJvdG8uZ2VuZXJhdGVPYmplY3RVcmwgPSBmdW5jdGlvbiAobmFtZSwgYmFzZVVybCkge1xuICBpZiAoIWJhc2VVcmwpIHtcbiAgICBiYXNlVXJsID0gdGhpcy5vcHRpb25zLmVuZHBvaW50LmZvcm1hdCgpO1xuICAgIGNvbnN0IGNvcHlVcmwgPSB1cmx1dGlsLnBhcnNlKGJhc2VVcmwpO1xuICAgIGNvbnN0IHsgYnVja2V0IH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb3B5VXJsLmhvc3RuYW1lID0gYCR7YnVja2V0fS4ke2NvcHlVcmwuaG9zdG5hbWV9YDtcbiAgICBjb3B5VXJsLmhvc3QgPSBgJHtidWNrZXR9LiR7Y29weVVybC5ob3N0fWA7XG4gICAgYmFzZVVybCA9IGNvcHlVcmwuZm9ybWF0KCk7XG4gIH0gZWxzZSBpZiAoYmFzZVVybFtiYXNlVXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICBiYXNlVXJsICs9ICcvJztcbiAgfVxuICByZXR1cm4gYmFzZVVybCArIHRoaXMuX2VzY2FwZSh0aGlzLl9vYmplY3ROYW1lKG5hbWUpKTtcbn07XG5cblxuLyoqXG4gKiBnZW5lcmF0b3IgcmVxdWVzdCBwYXJhbXNcbiAqIEByZXR1cm4ge09iamVjdH0gcGFyYW1zXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxucHJvdG8uX29iamVjdFJlcXVlc3RQYXJhbXMgPSBmdW5jdGlvbiBfb2JqZWN0UmVxdWVzdFBhcmFtcyhtZXRob2QsIG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCF0aGlzLm9wdGlvbnMuYnVja2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgY3JlYXRlIGEgYnVja2V0IGZpcnN0Jyk7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbmFtZSA9IHRoaXMuX29iamVjdE5hbWUobmFtZSk7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBvYmplY3Q6IG5hbWUsXG4gICAgYnVja2V0OiB0aGlzLm9wdGlvbnMuYnVja2V0LFxuICAgIG1ldGhvZCxcbiAgICBzdWJyZXM6IG9wdGlvbnMgJiYgb3B0aW9ucy5zdWJyZXMsXG4gICAgdGltZW91dDogb3B0aW9ucyAmJiBvcHRpb25zLnRpbWVvdXQsXG4gICAgY3R4OiBvcHRpb25zICYmIG9wdGlvbnMuY3R4XG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgIHBhcmFtcy5oZWFkZXJzID0ge307XG4gICAgY29weShvcHRpb25zLmhlYWRlcnMpLnRvKHBhcmFtcy5oZWFkZXJzKTtcbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufTtcblxucHJvdG8uX29iamVjdE5hbWUgPSBmdW5jdGlvbiBfb2JqZWN0TmFtZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoL15cXC8rLywgJycpO1xufTtcblxucHJvdG8uX3N0YXRGaWxlID0gZnVuY3Rpb24gX3N0YXRGaWxlKGZpbGVwYXRoKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMuc3RhdChmaWxlcGF0aCwgKGVyciwgc3RhdHMpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHN0YXRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5wcm90by5fY29udmVydE1ldGFUb0hlYWRlcnMgPSBmdW5jdGlvbiBfY29udmVydE1ldGFUb0hlYWRlcnMobWV0YSwgaGVhZGVycykge1xuICBpZiAoIW1ldGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBPYmplY3Qua2V5cyhtZXRhKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgaGVhZGVyc1tgeC1vc3MtbWV0YS0ke2t9YF0gPSBtZXRhW2tdO1xuICB9KTtcbn07XG5cbnByb3RvLl9kZWxldGVGaWxlU2FmZSA9IGZ1bmN0aW9uIF9kZWxldGVGaWxlU2FmZShmaWxlcGF0aCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBmcy5leGlzdHMoZmlsZXBhdGgsIChleGlzdHMpID0+IHtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZzLnVubGluayhmaWxlcGF0aCwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ3VubGluayAlaiBlcnJvcjogJXMnLCBmaWxlcGF0aCwgZXJyLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuIiwiZXhwb3J0cy52ZXJzaW9uPVwiNi41LjBcIiIsIlxuXG5leHBvcnRzLmVuY29kZUNhbGxiYWNrID0gZnVuY3Rpb24gZW5jb2RlQ2FsbGJhY2socmVxUGFyYW1zLCBvcHRpb25zKSB7XG4gIHJlcVBhcmFtcy5oZWFkZXJzID0gcmVxUGFyYW1zLmhlYWRlcnMgfHwge307XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcVBhcmFtcy5oZWFkZXJzLCAneC1vc3MtY2FsbGJhY2snKSkge1xuICAgIGlmIChvcHRpb25zLmNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICBjYWxsYmFja1VybDogZW5jb2RlVVJJKG9wdGlvbnMuY2FsbGJhY2sudXJsKSxcbiAgICAgICAgY2FsbGJhY2tCb2R5OiBvcHRpb25zLmNhbGxiYWNrLmJvZHlcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucy5jYWxsYmFjay5ob3N0KSB7XG4gICAgICAgIGpzb24uY2FsbGJhY2tIb3N0ID0gb3B0aW9ucy5jYWxsYmFjay5ob3N0O1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuY2FsbGJhY2suY29udGVudFR5cGUpIHtcbiAgICAgICAganNvbi5jYWxsYmFja0JvZHlUeXBlID0gb3B0aW9ucy5jYWxsYmFjay5jb250ZW50VHlwZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbikpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHJlcVBhcmFtcy5oZWFkZXJzWyd4LW9zcy1jYWxsYmFjayddID0gY2FsbGJhY2s7XG5cbiAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrLmN1c3RvbVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrVmFyID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrVmFyW2B4OiR7a2V5fWBdID0gb3B0aW9ucy5jYWxsYmFjay5jdXN0b21WYWx1ZVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxUGFyYW1zLmhlYWRlcnNbJ3gtb3NzLWNhbGxiYWNrLXZhciddID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY2FsbGJhY2tWYXIpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiY29uc3QgbXMgPSByZXF1aXJlKCdodW1hbml6ZS1tcycpO1xuY29uc3QgdXJsdXRpbCA9IHJlcXVpcmUoJ3VybCcpO1xuY29uc3QgX2NoZWNrQnVja2V0TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2NoZWNrQnVja2V0TmFtZScpO1xuXG5mdW5jdGlvbiBzZXRFbmRwb2ludChlbmRwb2ludCwgc2VjdXJlKSB7XG4gIGxldCB1cmwgPSB1cmx1dGlsLnBhcnNlKGVuZHBvaW50KTtcblxuICBpZiAoIXVybC5wcm90b2NvbCkge1xuICAgIHVybCA9IHVybHV0aWwucGFyc2UoYGh0dHAke3NlY3VyZSA/ICdzJyA6ICcnfTovLyR7ZW5kcG9pbnR9YCk7XG4gIH1cblxuICBpZiAodXJsLnByb3RvY29sICE9PSAnaHR0cDonICYmIHVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZHBvaW50IHByb3RvY29sIG11c3QgYmUgaHR0cCBvciBodHRwcy4nKTtcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbmZ1bmN0aW9uIHNldFJlZ2lvbihyZWdpb24sIGludGVybmFsLCBzZWN1cmUpIHtcbiAgY29uc3QgcHJvdG9jb2wgPSBzZWN1cmUgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nO1xuICBsZXQgc3VmZml4ID0gaW50ZXJuYWwgPyAnLWludGVybmFsLmFsaXl1bmNzLmNvbScgOiAnLmFsaXl1bmNzLmNvbSc7XG4gIGNvbnN0IHByZWZpeCA9ICd2cGMxMDAtb3NzLWNuLSc7XG4gIC8vIGFsaXl1biBWUEMgcmVnaW9uOiBodHRwczovL2hlbHAuYWxpeXVuLmNvbS9rbm93bGVkZ2VfZGV0YWlsLzM4NzQwLmh0bWxcbiAgaWYgKHJlZ2lvbi5zdWJzdHIoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeCkge1xuICAgIHN1ZmZpeCA9ICcuYWxpeXVuY3MuY29tJztcbiAgfVxuXG4gIHJldHVybiB1cmx1dGlsLnBhcnNlKHByb3RvY29sICsgcmVnaW9uICsgc3VmZml4KTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICghb3B0aW9uc1xuICAgIHx8ICFvcHRpb25zLmFjY2Vzc0tleUlkXG4gICAgfHwgIW9wdGlvbnMuYWNjZXNzS2V5U2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlIGFjY2Vzc0tleUlkLCBhY2Nlc3NLZXlTZWNyZXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5idWNrZXQgJiYgIV9jaGVja0J1Y2tldE5hbWUob3B0aW9ucy5idWNrZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYnVja2V0IG11c3QgYmUgY29uZm9ybSB0byB0aGUgc3BlY2lmaWNhdGlvbnMnKTtcbiAgfVxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcmVnaW9uOiAnb3NzLWNuLWhhbmd6aG91JyxcbiAgICBpbnRlcm5hbDogZmFsc2UsXG4gICAgc2VjdXJlOiBmYWxzZSxcbiAgICB0aW1lb3V0OiA2MDAwMCxcbiAgICBidWNrZXQ6IG51bGwsXG4gICAgZW5kcG9pbnQ6IG51bGwsXG4gICAgY25hbWU6IGZhbHNlLFxuICAgIGlzUmVxdWVzdFBheTogZmFsc2UsXG4gICAgc2xkRW5hYmxlOiBmYWxzZVxuICB9LCBvcHRpb25zKTtcblxuICBvcHRzLmFjY2Vzc0tleUlkID0gb3B0cy5hY2Nlc3NLZXlJZC50cmltKCk7XG4gIG9wdHMuYWNjZXNzS2V5U2VjcmV0ID0gb3B0cy5hY2Nlc3NLZXlTZWNyZXQudHJpbSgpO1xuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICBvcHRzLnRpbWVvdXQgPSBtcyhvcHRzLnRpbWVvdXQpO1xuICB9XG5cbiAgaWYgKG9wdHMuZW5kcG9pbnQpIHtcbiAgICBvcHRzLmVuZHBvaW50ID0gc2V0RW5kcG9pbnQob3B0cy5lbmRwb2ludCwgb3B0cy5zZWN1cmUpO1xuICB9IGVsc2UgaWYgKG9wdHMucmVnaW9uKSB7XG4gICAgb3B0cy5lbmRwb2ludCA9IHNldFJlZ2lvbihvcHRzLnJlZ2lvbiwgb3B0cy5pbnRlcm5hbCwgb3B0cy5zZWN1cmUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZSBvcHRpb25zLmVuZHBvaW50IG9yIG9wdGlvbnMucmVnaW9uJyk7XG4gIH1cblxuICBvcHRzLmluaXRlZCA9IHRydWU7XG4gIHJldHVybiBvcHRzO1xufTtcbiIsIlxuY29uc3QgY29weSA9IHJlcXVpcmUoJ2NvcHktdG8nKTtcbmNvbnN0IGNhbGxiYWNrID0gcmVxdWlyZSgnLi9jYWxsYmFjaycpO1xuY29uc3QgZGVlcENvcHkgPSByZXF1aXJlKCcuL3V0aWxzL2RlZXBDb3B5Jyk7XG5cbmNvbnN0IHByb3RvID0gZXhwb3J0cztcblxuXG4vKipcbiAqIExpc3QgdGhlIG9uLWdvaW5nIG11bHRpcGFydCB1cGxvYWRzXG4gKiBodHRwczovL2hlbHAuYWxpeXVuLmNvbS9kb2N1bWVudF9kZXRhaWwvMzE5OTcuaHRtbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge0FycmF5fSB0aGUgbXVsdGlwYXJ0IHVwbG9hZHNcbiAqL1xucHJvdG8ubGlzdFVwbG9hZHMgPSBhc3luYyBmdW5jdGlvbiBsaXN0VXBsb2FkcyhxdWVyeSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgb3B0ID0ge307XG4gIGNvcHkob3B0aW9ucykudG8ob3B0KTtcbiAgb3B0LnN1YnJlcyA9ICd1cGxvYWRzJztcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnR0VUJywgJycsIG9wdCk7XG4gIHBhcmFtcy5xdWVyeSA9IHF1ZXJ5O1xuICBwYXJhbXMueG1sUmVzcG9uc2UgPSB0cnVlO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG4gIGxldCB1cGxvYWRzID0gcmVzdWx0LmRhdGEuVXBsb2FkIHx8IFtdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodXBsb2FkcykpIHtcbiAgICB1cGxvYWRzID0gW3VwbG9hZHNdO1xuICB9XG4gIHVwbG9hZHMgPSB1cGxvYWRzLm1hcCh1cCA9PiAoe1xuICAgIG5hbWU6IHVwLktleSxcbiAgICB1cGxvYWRJZDogdXAuVXBsb2FkSWQsXG4gICAgaW5pdGlhdGVkOiB1cC5Jbml0aWF0ZWRcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgcmVzOiByZXN1bHQucmVzLFxuICAgIHVwbG9hZHMsXG4gICAgYnVja2V0OiByZXN1bHQuZGF0YS5CdWNrZXQsXG4gICAgbmV4dEtleU1hcmtlcjogcmVzdWx0LmRhdGEuTmV4dEtleU1hcmtlcixcbiAgICBuZXh0VXBsb2FkSWRNYXJrZXI6IHJlc3VsdC5kYXRhLk5leHRVcGxvYWRJZE1hcmtlcixcbiAgICBpc1RydW5jYXRlZDogcmVzdWx0LmRhdGEuSXNUcnVuY2F0ZWQgPT09ICd0cnVlJ1xuICB9O1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSBkb25lIHVwbG9hZFBhcnQgcGFydHNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkSWQgbXVsdGlwYXJ0IHVwbG9hZCBpZFxuICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5XG4gKiB7TnVtYmVyfSBxdWVyeS5tYXgtcGFydHMgVGhlIG1heGltdW0gcGFydCBudW1iZXIgaW4gdGhlIHJlc3BvbnNlIG9mIHRoZSBPU1MuIERlZmF1bHQgdmFsdWU6IDEwMDBcbiAqIHtOdW1iZXJ9IHF1ZXJ5LnBhcnQtbnVtYmVyLW1hcmtlciBTdGFydGluZyBwb3NpdGlvbiBvZiBhIHNwZWNpZmljIGxpc3QuXG4gKiB7U3RyaW5nfSBxdWVyeS5lbmNvZGluZy10eXBlIFNwZWNpZnkgdGhlIGVuY29kaW5nIG9mIHRoZSByZXR1cm5lZCBjb250ZW50IGFuZCB0aGUgZW5jb2RpbmcgdHlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IHJlc3VsdFxuICovXG5wcm90by5saXN0UGFydHMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UGFydHMobmFtZSwgdXBsb2FkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBvcHQgPSB7fTtcbiAgY29weShvcHRpb25zKS50byhvcHQpO1xuICBvcHQuc3VicmVzID0ge1xuICAgIHVwbG9hZElkXG4gIH07XG4gIGNvbnN0IHBhcmFtcyA9IHRoaXMuX29iamVjdFJlcXVlc3RQYXJhbXMoJ0dFVCcsIG5hbWUsIG9wdCk7XG4gIHBhcmFtcy5xdWVyeSA9IHF1ZXJ5O1xuICBwYXJhbXMueG1sUmVzcG9uc2UgPSB0cnVlO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZXM6IHJlc3VsdC5yZXMsXG4gICAgdXBsb2FkSWQ6IHJlc3VsdC5kYXRhLlVwbG9hZElkLFxuICAgIGJ1Y2tldDogcmVzdWx0LmRhdGEuQnVja2V0LFxuICAgIG5hbWU6IHJlc3VsdC5kYXRhLktleSxcbiAgICBwYXJ0TnVtYmVyTWFya2VyOiByZXN1bHQuZGF0YS5QYXJ0TnVtYmVyTWFya2VyLFxuICAgIG5leHRQYXJ0TnVtYmVyTWFya2VyOiByZXN1bHQuZGF0YS5OZXh0UGFydE51bWJlck1hcmtlcixcbiAgICBtYXhQYXJ0czogcmVzdWx0LmRhdGEuTWF4UGFydHMsXG4gICAgaXNUcnVuY2F0ZWQ6IHJlc3VsdC5kYXRhLklzVHJ1bmNhdGVkLFxuICAgIHBhcnRzOiByZXN1bHQuZGF0YS5QYXJ0IHx8IFtdXG4gIH07XG59O1xuXG4vKipcbiAqIEFib3J0IGEgbXVsdGlwYXJ0IHVwbG9hZCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkSWQgdGhlIHVwbG9hZCBpZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xucHJvdG8uYWJvcnRNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyBmdW5jdGlvbiBhYm9ydE11bHRpcGFydFVwbG9hZChuYW1lLCB1cGxvYWRJZCwgb3B0aW9ucykge1xuICB0aGlzLl9zdG9wKCk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBvcHQgPSB7fTtcbiAgY29weShvcHRpb25zKS50byhvcHQpO1xuICBvcHQuc3VicmVzID0geyB1cGxvYWRJZCB9O1xuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKCdERUxFVEUnLCBuYW1lLCBvcHQpO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwNF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG4gIHJldHVybiB7XG4gICAgcmVzOiByZXN1bHQucmVzXG4gIH07XG59O1xuXG4vKipcbiAqIEluaXRpYXRlIGEgbXVsdGlwYXJ0IHVwbG9hZCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfSB1cGxvYWQgaWRcbiAqL1xucHJvdG8uaW5pdE11bHRpcGFydFVwbG9hZCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRNdWx0aXBhcnRVcGxvYWQobmFtZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3Qgb3B0ID0ge307XG4gIGNvcHkob3B0aW9ucykudG8ob3B0KTtcbiAgb3B0LmhlYWRlcnMgPSBvcHQuaGVhZGVycyB8fCB7fTtcbiAgdGhpcy5fY29udmVydE1ldGFUb0hlYWRlcnMob3B0aW9ucy5tZXRhLCBvcHQuaGVhZGVycyk7XG5cbiAgb3B0LnN1YnJlcyA9ICd1cGxvYWRzJztcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnUE9TVCcsIG5hbWUsIG9wdCk7XG4gIHBhcmFtcy5taW1lID0gb3B0aW9ucy5taW1lO1xuICBwYXJhbXMueG1sUmVzcG9uc2UgPSB0cnVlO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgcmV0dXJuIHtcbiAgICByZXM6IHJlc3VsdC5yZXMsXG4gICAgYnVja2V0OiByZXN1bHQuZGF0YS5CdWNrZXQsXG4gICAgbmFtZTogcmVzdWx0LmRhdGEuS2V5LFxuICAgIHVwbG9hZElkOiByZXN1bHQuZGF0YS5VcGxvYWRJZFxuICB9O1xufTtcblxuLyoqXG4gKiBVcGxvYWQgYSBwYXJ0IGluIGEgbXVsdGlwYXJ0IHVwbG9hZCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkSWQgdGhlIHVwbG9hZCBpZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBwYXJ0Tm8gdGhlIHBhcnQgbnVtYmVyXG4gKiBAcGFyYW0ge0ZpbGV9IGZpbGUgdXBsb2FkIEZpbGUsIHdob2xlIEZpbGVcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3RhcnQgIHBhcnQgc3RhcnQgYnl0ZXMgIGUuZzogMTAyNDAwXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGVuZCAgcGFydCBlbmQgYnl0ZXMgIGUuZzogMjA0ODAwXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5wcm90by51cGxvYWRQYXJ0ID0gYXN5bmMgZnVuY3Rpb24gdXBsb2FkUGFydChuYW1lLCB1cGxvYWRJZCwgcGFydE5vLCBmaWxlLCBzdGFydCwgZW5kLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRhdGEgPSB7XG4gICAgc3RyZWFtOiB0aGlzLl9jcmVhdGVTdHJlYW0oZmlsZSwgc3RhcnQsIGVuZCksXG4gICAgc2l6ZTogZW5kIC0gc3RhcnRcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuX3VwbG9hZFBhcnQobmFtZSwgdXBsb2FkSWQsIHBhcnRObywgZGF0YSwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBsZXRlIGEgbXVsdGlwYXJ0IHVwbG9hZCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkSWQgdGhlIHVwbG9hZCBpZFxuICogQHBhcmFtIHtBcnJheX0gcGFydHMgdGhlIHVwbG9hZGVkIHBhcnRzLCBlYWNoIGluIHRoZSBzdHJ1Y3R1cmU6XG4gKiAgICAgICAge0ludGVnZXJ9IG51bWJlciBwYXJ0Tm9cbiAqICAgICAgICB7U3RyaW5nfSBldGFnICBwYXJ0IGV0YWcgIHVwbG9hZFBhcnRDb3B5IHJlc3VsdC5yZXMuaGVhZGVyLmV0YWdcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgICAgICAgIHtPYmplY3R9IG9wdGlvbnMuY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHBhcmFtZXRlciBpcyBjb21wb3NlZCBvZiBhIEpTT04gc3RyaW5nIGVuY29kZWQgaW4gQmFzZTY0XG4gKiAgICAgICAgIHtTdHJpbmd9IG9wdGlvbnMuY2FsbGJhY2sudXJsICB0aGUgT1NTIHNlbmRzIGEgY2FsbGJhY2sgcmVxdWVzdCB0byB0aGlzIFVSTFxuICogICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLmhvc3QgIFRoZSBob3N0IGhlYWRlciB2YWx1ZSBmb3IgaW5pdGlhdGluZyBjYWxsYmFjayByZXF1ZXN0c1xuICogICAgICAgICB7U3RyaW5nfSBvcHRpb25zLmNhbGxiYWNrLmJvZHkgIFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBib2R5IHdoZW4gYSBjYWxsYmFjayBpcyBpbml0aWF0ZWRcbiAqICAgICAgICAge1N0cmluZ30gb3B0aW9ucy5jYWxsYmFjay5jb250ZW50VHlwZSAgVGhlIENvbnRlbnQtVHlwZSBvZiB0aGUgY2FsbGJhY2sgcmVxdWVzdHMgaW5pdGlhdGlhdGVkXG4gKiAgICAgICAgIHtPYmplY3R9IG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWUgIEN1c3RvbSBwYXJhbWV0ZXJzIGFyZSBhIG1hcCBvZiBrZXktdmFsdWVzLCBlLmc6XG4gKiAgICAgICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHtcbiAqICAgICAgICAgICAgICAgICAgICAga2V5MTogJ3ZhbHVlMScsXG4gKiAgICAgICAgICAgICAgICAgICAgIGtleTI6ICd2YWx1ZTInXG4gKiAgICAgICAgICAgICAgICAgICB9XG4gKi9cbnByb3RvLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgZnVuY3Rpb24gY29tcGxldGVNdWx0aXBhcnRVcGxvYWQobmFtZSwgdXBsb2FkSWQsIHBhcnRzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbXBsZXRlUGFydHMgPSBwYXJ0cy5jb25jYXQoKS5zb3J0KChhLCBiKSA9PiBhLm51bWJlciAtIGIubnVtYmVyKVxuICAgIC5maWx0ZXIoKGl0ZW0sIGluZGV4LCBhcnIpID0+ICFpbmRleCB8fCBpdGVtLm51bWJlciAhPT0gYXJyW2luZGV4IC0gMV0ubnVtYmVyKTtcbiAgbGV0IHhtbCA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cXG48Q29tcGxldGVNdWx0aXBhcnRVcGxvYWQ+XFxuJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wbGV0ZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IGNvbXBsZXRlUGFydHNbaV07XG4gICAgeG1sICs9ICc8UGFydD5cXG4nO1xuICAgIHhtbCArPSBgPFBhcnROdW1iZXI+JHtwLm51bWJlcn08L1BhcnROdW1iZXI+XFxuYDtcbiAgICB4bWwgKz0gYDxFVGFnPiR7cC5ldGFnfTwvRVRhZz5cXG5gO1xuICAgIHhtbCArPSAnPC9QYXJ0Plxcbic7XG4gIH1cbiAgeG1sICs9ICc8L0NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkPic7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxldCBvcHQgPSB7fTtcbiAgb3B0ID0gZGVlcENvcHkob3B0aW9ucyk7XG4gIGlmIChvcHQuaGVhZGVycykgZGVsZXRlIG9wdC5oZWFkZXJzWyd4LW9zcy1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uJ107XG4gIG9wdC5zdWJyZXMgPSB7IHVwbG9hZElkIH07XG5cbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnUE9TVCcsIG5hbWUsIG9wdCk7XG4gIGNhbGxiYWNrLmVuY29kZUNhbGxiYWNrKHBhcmFtcywgb3B0KTtcbiAgcGFyYW1zLm1pbWUgPSAneG1sJztcbiAgcGFyYW1zLmNvbnRlbnQgPSB4bWw7XG5cbiAgaWYgKCEocGFyYW1zLmhlYWRlcnMgJiYgcGFyYW1zLmhlYWRlcnNbJ3gtb3NzLWNhbGxiYWNrJ10pKSB7XG4gICAgcGFyYW1zLnhtbFJlc3BvbnNlID0gdHJ1ZTtcbiAgfVxuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwMF07XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuXG4gIGNvbnN0IHJldCA9IHtcbiAgICByZXM6IHJlc3VsdC5yZXMsXG4gICAgYnVja2V0OiBwYXJhbXMuYnVja2V0LFxuICAgIG5hbWUsXG4gICAgZXRhZzogcmVzdWx0LnJlcy5oZWFkZXJzLmV0YWdcbiAgfTtcblxuICBpZiAocGFyYW1zLmhlYWRlcnMgJiYgcGFyYW1zLmhlYWRlcnNbJ3gtb3NzLWNhbGxiYWNrJ10pIHtcbiAgICByZXQuZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0LmRhdGEudG9TdHJpbmcoKSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBVcGxvYWQgYSBwYXJ0IGluIGEgbXVsdGlwYXJ0IHVwbG9hZCB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdXBsb2FkSWQgdGhlIHVwbG9hZCBpZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBwYXJ0Tm8gdGhlIHBhcnQgbnVtYmVyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0aGUgYm9keSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5wcm90by5fdXBsb2FkUGFydCA9IGFzeW5jIGZ1bmN0aW9uIF91cGxvYWRQYXJ0KG5hbWUsIHVwbG9hZElkLCBwYXJ0Tm8sIGRhdGEsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IG9wdCA9IHt9O1xuICBjb3B5KG9wdGlvbnMpLnRvKG9wdCk7XG4gIG9wdC5oZWFkZXJzID0ge1xuICAgICdDb250ZW50LUxlbmd0aCc6IGRhdGEuc2l6ZVxuICB9O1xuXG4gIG9wdC5zdWJyZXMgPSB7XG4gICAgcGFydE51bWJlcjogcGFydE5vLFxuICAgIHVwbG9hZElkXG4gIH07XG4gIGNvbnN0IHBhcmFtcyA9IHRoaXMuX29iamVjdFJlcXVlc3RQYXJhbXMoJ1BVVCcsIG5hbWUsIG9wdCk7XG4gIHBhcmFtcy5taW1lID0gb3B0Lm1pbWU7XG4gIHBhcmFtcy5zdHJlYW0gPSBkYXRhLnN0cmVhbTtcbiAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDBdO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuXG4gIGlmICghcmVzdWx0LnJlcy5oZWFkZXJzLmV0YWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBzZXQgdGhlIGV0YWcgb2YgZXhwb3NlLWhlYWRlcnMgaW4gT1NTIFxcbiBodHRwczovL2hlbHAuYWxpeXVuLmNvbS9kb2N1bWVudF9kZXRhaWwvMzIwNjkuaHRtbCcpO1xuICB9XG5cbiAgZGF0YS5zdHJlYW0gPSBudWxsO1xuICBwYXJhbXMuc3RyZWFtID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIGV0YWc6IHJlc3VsdC5yZXMuaGVhZGVycy5ldGFnLFxuICAgIHJlczogcmVzdWx0LnJlc1xuICB9O1xufTtcbiIsImNvbnN0IHByb3RvID0gZXhwb3J0cztcblxucHJvdG8uY29weSA9IGFzeW5jIGZ1bmN0aW9uIGNvcHkobmFtZSwgc291cmNlTmFtZSwgYnVja2V0TmFtZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGJ1Y2tldE5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGJ1Y2tldE5hbWU7IC8vIOWFvOWuueaXp+eJiOacrO+8jOaXp+eJiOacrOesrOS4ieS4quWPguaVsOS4um9wdGlvbnNcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMuaGVhZGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgb3B0aW9ucy5oZWFkZXJzW2B4LW9zcy1jb3B5LXNvdXJjZS0ke2tleS50b0xvd2VyQ2FzZSgpfWBdID0gb3B0aW9ucy5oZWFkZXJzW2tleV07XG4gIH0pO1xuICBpZiAob3B0aW9ucy5tZXRhKSB7XG4gICAgb3B0aW9ucy5oZWFkZXJzWyd4LW9zcy1tZXRhZGF0YS1kaXJlY3RpdmUnXSA9ICdSRVBMQUNFJztcbiAgfVxuICB0aGlzLl9jb252ZXJ0TWV0YVRvSGVhZGVycyhvcHRpb25zLm1ldGEsIG9wdGlvbnMuaGVhZGVycyk7XG5cbiAgc291cmNlTmFtZSA9IHRoaXMuX2dldFNvdXJjZU5hbWUoc291cmNlTmFtZSwgYnVja2V0TmFtZSk7XG5cbiAgb3B0aW9ucy5oZWFkZXJzWyd4LW9zcy1jb3B5LXNvdXJjZSddID0gc291cmNlTmFtZTtcblxuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKCdQVVQnLCBuYW1lLCBvcHRpb25zKTtcbiAgcGFyYW1zLnhtbFJlc3BvbnNlID0gdHJ1ZTtcbiAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDAsIDMwNF07XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHBhcmFtcyk7XG5cbiAgbGV0IHsgZGF0YSB9ID0gcmVzdWx0O1xuICBpZiAoZGF0YSkge1xuICAgIGRhdGEgPSB7XG4gICAgICBldGFnOiBkYXRhLkVUYWcsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGRhdGEuTGFzdE1vZGlmaWVkXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGF0YSxcbiAgICByZXM6IHJlc3VsdC5yZXNcbiAgfTtcbn07XG5cbi8vIHRvZG8gZGVsZXRlXG5wcm90by5fZ2V0U291cmNlTmFtZSA9IGZ1bmN0aW9uIF9nZXRTb3VyY2VOYW1lKHNvdXJjZU5hbWUsIGJ1Y2tldE5hbWUpIHtcbiAgaWYgKHR5cGVvZiBidWNrZXROYW1lID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU5hbWUgPSB0aGlzLl9vYmplY3ROYW1lKHNvdXJjZU5hbWUpO1xuICB9IGVsc2UgaWYgKHNvdXJjZU5hbWVbMF0gIT09ICcvJykge1xuICAgIGJ1Y2tldE5hbWUgPSB0aGlzLm9wdGlvbnMuYnVja2V0O1xuICB9IGVsc2Uge1xuICAgIGJ1Y2tldE5hbWUgPSBzb3VyY2VOYW1lLnJlcGxhY2UoL1xcLyguKz8pKFxcLy4qKS8sICckMScpO1xuICAgIHNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lLnJlcGxhY2UoLyhcXC8uKz9cXC8pKC4qKS8sICckMicpO1xuICB9XG5cbiAgdGhpcy5fY2hlY2tCdWNrZXROYW1lKGJ1Y2tldE5hbWUpO1xuXG4gIHNvdXJjZU5hbWUgPSBgLyR7YnVja2V0TmFtZX0vJHtlbmNvZGVVUklDb21wb25lbnQoc291cmNlTmFtZSl9YDtcbiAgcmV0dXJuIHNvdXJjZU5hbWU7XG59O1xuIiwiY29uc3QgcHJvdG8gPSBleHBvcnRzO1xuLyoqXG4gKiBkZWxldGVPYmplY3RUYWdnaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5cbnByb3RvLmRlbGV0ZU9iamVjdFRhZ2dpbmcgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVPYmplY3RUYWdnaW5nKFxuICBuYW1lLFxuICBvcHRpb25zID0ge31cbikge1xuICBvcHRpb25zLnN1YnJlcyA9ICd0YWdnaW5nJztcbiAgbmFtZSA9IHRoaXMuX29iamVjdE5hbWUobmFtZSk7XG4gIGNvbnN0IHBhcmFtcyA9IHRoaXMuX29iamVjdFJlcXVlc3RQYXJhbXMoJ0RFTEVURScsIG5hbWUsIG9wdGlvbnMpO1xuICBwYXJhbXMuc3VjY2Vzc1N0YXR1c2VzID0gWzIwNF07XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdChwYXJhbXMpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgIHJlczogcmVzdWx0LnJlc1xuICB9O1xufTtcbiIsImNvbnN0IHByb3RvID0gZXhwb3J0cztcbmNvbnN0IGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvaXNPYmplY3QnKTtcbi8qKlxuICogZ2V0T2JqZWN0VGFnZ2luZ1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBvYmplY3QgbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5wcm90by5nZXRPYmplY3RUYWdnaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0T2JqZWN0VGFnZ2luZyhuYW1lLCBvcHRpb25zID0ge30pIHtcbiAgb3B0aW9ucy5zdWJyZXMgPSAndGFnZ2luZyc7XG4gIG5hbWUgPSB0aGlzLl9vYmplY3ROYW1lKG5hbWUpO1xuICBjb25zdCBwYXJhbXMgPSB0aGlzLl9vYmplY3RSZXF1ZXN0UGFyYW1zKCdHRVQnLCBuYW1lLCBvcHRpb25zKTtcbiAgcGFyYW1zLnN1Y2Nlc3NTdGF0dXNlcyA9IFsyMDBdO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QocGFyYW1zKTtcbiAgY29uc3QgVGFnZ2luZyA9IGF3YWl0IHRoaXMucGFyc2VYTUwocmVzdWx0LmRhdGEpO1xuICBsZXQgeyBUYWcgfSA9IFRhZ2dpbmcuVGFnU2V0O1xuICBUYWcgPSBUYWcgJiYgaXNPYmplY3QoVGFnKSA/IFtUYWddIDogVGFnIHx8IFtdO1xuXG4gIGNvbnN0IHRhZyA9IHt9O1xuXG4gIFRhZy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgdGFnW2l0ZW0uS2V5XSA9IGl0ZW0uVmFsdWU7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgIHJlczogcmVzdWx0LnJlcyxcbiAgICB0YWdcbiAgfTtcbn07XG4iLCJjb25zdCBvYmoyeG1sID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqMnhtbCcpO1xuY29uc3QgY2hlY2tUYWcgPSByZXF1aXJlKCcuLi91dGlscy9jaGVja09iamVjdFRhZycpO1xuXG5jb25zdCBwcm90byA9IGV4cG9ydHM7XG4vKipcbiAqIHB1dE9iamVjdFRhZ2dpbmdcbiAqIEBwYXJhbSB7U3Rpbmd9IG5hbWUgLSBvYmplY3QgbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IHRhZyAtICBvYmplY3QgdGFnLCBlZzogYHthOiBcIjFcIiwgYjogXCIyXCJ9YFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuXG5wcm90by5wdXRPYmplY3RUYWdnaW5nID0gYXN5bmMgZnVuY3Rpb24gcHV0T2JqZWN0VGFnZ2luZyhuYW1lLCB0YWcsIG9wdGlvbnMgPSB7fSkge1xuICBjaGVja1RhZyh0YWcpO1xuXG4gIG9wdGlvbnMuc3VicmVzID0gJ3RhZ2dpbmcnO1xuICBuYW1lID0gdGhpcy5fb2JqZWN0TmFtZShuYW1lKTtcbiAgY29uc3QgcGFyYW1zID0gdGhpcy5fb2JqZWN0UmVxdWVzdFBhcmFtcygnUFVUJywgbmFtZSwgb3B0aW9ucyk7XG4gIHBhcmFtcy5zdWNjZXNzU3RhdHVzZXMgPSBbMjAwXTtcbiAgdGFnID0gT2JqZWN0LmtleXModGFnKS5tYXAoa2V5ID0+ICh7XG4gICAgS2V5OiBrZXksXG4gICAgVmFsdWU6IHRhZ1trZXldXG4gIH0pKTtcblxuICBjb25zdCBwYXJhbVhNTE9iaiA9IHtcbiAgICBUYWdnaW5nOiB7XG4gICAgICBUYWdTZXQ6IHtcbiAgICAgICAgVGFnOiB0YWdcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcGFyYW1zLm1pbWUgPSAneG1sJztcbiAgcGFyYW1zLmNvbnRlbnQgPSBvYmoyeG1sKHBhcmFtWE1MT2JqKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QocGFyYW1zKTtcbiAgcmV0dXJuIHtcbiAgICByZXM6IHJlc3VsdC5yZXMsXG4gICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzXG4gIH07XG59O1xuIiwiXG5jb25zdCBwcm90byA9IGV4cG9ydHM7XG5cbnByb3RvLl9wYXJhbGxlbE5vZGUgPSBhc3luYyBmdW5jdGlvbiBfcGFyYWxsZWxOb2RlKHRvZG8sIHBhcmFsbGVsLCBmbiwgc291cmNlRGF0YSkge1xuICBjb25zdCB0aGF0ID0gdGhpcztcbiAgLy8gdXBsb2FkIGluIHBhcmFsbGVsXG4gIGNvbnN0IGpvYkVyciA9IFtdO1xuICBsZXQgam9icyA9IFtdO1xuICBjb25zdCB0ZW1wQmF0Y2ggPSB0b2RvLmxlbmd0aCAvIHBhcmFsbGVsO1xuICBjb25zdCByZW1haW5kZXIgPSB0b2RvLmxlbmd0aCAlIHBhcmFsbGVsO1xuICBjb25zdCBiYXRjaCA9IHJlbWFpbmRlciA9PT0gMCA/IHRlbXBCYXRjaCA6ICgodG9kby5sZW5ndGggLSByZW1haW5kZXIpIC8gcGFyYWxsZWwpICsgMTtcbiAgbGV0IHRhc2tJbmRleCA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9kby5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aGF0LmlzQ2FuY2VsKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VEYXRhKSB7XG4gICAgICBqb2JzLnB1c2goZm4odGhhdCwgdG9kb1tpXSwgc291cmNlRGF0YSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBqb2JzLnB1c2goZm4odGhhdCwgdG9kb1tpXSkpO1xuICAgIH1cblxuICAgIGlmIChqb2JzLmxlbmd0aCA9PT0gcGFyYWxsZWwgfHwgKHRhc2tJbmRleCA9PT0gYmF0Y2ggJiYgaSA9PT0gKHRvZG8ubGVuZ3RoIC0gMSkpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0YXNrSW5kZXggKz0gMTtcbiAgICAgICAgLyogZXNsaW50IG5vLWF3YWl0LWluLWxvb3A6IFswXSAqL1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChqb2JzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBqb2JFcnIucHVzaChlcnIpO1xuICAgICAgfVxuICAgICAgam9icyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBqb2JFcnI7XG59O1xuXG5wcm90by5fcGFyYWxsZWwgPSBmdW5jdGlvbiBfcGFyYWxsZWwodG9kbywgcGFyYWxsZWwsIGpvYlByb21pc2UpIHtcbiAgY29uc3QgdGhhdCA9IHRoaXM7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IF9qb2JFcnIgPSBbXTtcbiAgICBpZiAocGFyYWxsZWwgPD0gMCB8fCAhdG9kbykge1xuICAgICAgcmVzb2x2ZShfam9iRXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmx5T25jZShmbikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChmbiA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsYmFjayB3YXMgYWxyZWFkeSBjYWxsZWQuJyk7XG4gICAgICAgIGNvbnN0IGNhbGxGbiA9IGZuO1xuICAgICAgICBmbiA9IG51bGw7XG4gICAgICAgIGNhbGxGbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlQXJyYXlJdGVyYXRvcihjb2xsKSB7XG4gICAgICBsZXQgaSA9IC0xO1xuICAgICAgY29uc3QgbGVuID0gY29sbC5sZW5ndGg7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuICgrK2kgPCBsZW4gJiYgIXRoYXQuaXNDYW5jZWwoKSkgPyB7IHZhbHVlOiBjb2xsW2ldLCBrZXk6IGkgfSA6IG51bGw7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbGVtID0gY3JlYXRlQXJyYXlJdGVyYXRvcih0b2RvKTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCBydW5uaW5nID0gMDtcbiAgICBsZXQgbG9vcGluZyA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWVDYWxsYmFjayhlcnIsIHZhbHVlKSB7XG4gICAgICBydW5uaW5nIC09IDE7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICBfam9iRXJyLnB1c2goZXJyKTtcbiAgICAgICAgcmVzb2x2ZShfam9iRXJyKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHt9IHx8IChkb25lICYmIHJ1bm5pbmcgPD0gMCkpIHtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgIHJlc29sdmUoX2pvYkVycik7XG4gICAgICB9IGVsc2UgaWYgKCFsb29waW5nKSB7XG4gICAgICAgIC8qIGVzbGludCBuby11c2UtYmVmb3JlLWRlZmluZTogWzBdICovXG4gICAgICAgIGlmICh0aGF0LmlzQ2FuY2VsKCkpIHtcbiAgICAgICAgICByZXNvbHZlKF9qb2JFcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxlbmlzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUodmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgICBqb2JQcm9taXNlKHZhbHVlKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGxlbmlzaCgpIHtcbiAgICAgIGxvb3BpbmcgPSB0cnVlO1xuICAgICAgd2hpbGUgKHJ1bm5pbmcgPCBwYXJhbGxlbCAmJiAhZG9uZSAmJiAhdGhhdC5pc0NhbmNlbCgpKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBuZXh0RWxlbSgpO1xuICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCB8fCBfam9iRXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocnVubmluZyA8PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKF9qb2JFcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcnVubmluZyArPSAxO1xuICAgICAgICBpdGVyYXRlZShlbGVtLnZhbHVlLCBvbmx5T25jZShpdGVyYXRlZUNhbGxiYWNrKSk7XG4gICAgICB9XG4gICAgICBsb29waW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVwbGVuaXNoKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBjYW5jZWwgb3BlcmF0aW9uLCBub3cgY2FuIHVzZSB3aXRoIG11bHRpcGFydFVwbG9hZFxuICogQHBhcmFtIHtPYmplY3R9IGFib3J0XG4gKiAgICAgICAge1N0cmluZ30gYW5vcnQubmFtZSBvYmplY3Qga2V5XG4gKiAgICAgICAge1N0cmluZ30gYW5vcnQudXBsb2FkSWQgdXBsb2FkIGlkXG4gKiAgICAgICAge1N0cmluZ30gYW5vcnQub3B0aW9ucyB0aW1lb3V0XG4gKi9cbnByb3RvLmNhbmNlbCA9IGZ1bmN0aW9uIGNhbmNlbChhYm9ydCkge1xuICB0aGlzLm9wdGlvbnMuY2FuY2VsRmxhZyA9IHRydWU7XG4gIGlmIChhYm9ydCkge1xuICAgIHRoaXMuYWJvcnRNdWx0aXBhcnRVcGxvYWQoYWJvcnQubmFtZSwgYWJvcnQudXBsb2FkSWQsIGFib3J0Lm9wdGlvbnMpO1xuICB9XG59O1xuXG5wcm90by5pc0NhbmNlbCA9IGZ1bmN0aW9uIGlzQ2FuY2VsKCkge1xuICByZXR1cm4gdGhpcy5vcHRpb25zLmNhbmNlbEZsYWc7XG59O1xuXG5wcm90by5yZXNldENhbmNlbEZsYWcgPSBmdW5jdGlvbiByZXNldENhbmNlbEZsYWcoKSB7XG4gIHRoaXMub3B0aW9ucy5jYW5jZWxGbGFnID0gZmFsc2U7XG59O1xuXG5wcm90by5fc3RvcCA9IGZ1bmN0aW9uIF9zdG9wKCkge1xuICB0aGlzLm9wdGlvbnMuY2FuY2VsRmxhZyA9IHRydWU7XG59O1xuXG4vLyBjYW5jZWwgaXMgbm90IGVycm9yICwgc28gY3JlYXRlIGFuIG9iamVjdFxucHJvdG8uX21ha2VDYW5jZWxFdmVudCA9IGZ1bmN0aW9uIF9tYWtlQ2FuY2VsRXZlbnQoKSB7XG4gIGNvbnN0IGNhbmNlbEV2ZW50ID0ge1xuICAgIHN0YXR1czogMCxcbiAgICBuYW1lOiAnY2FuY2VsJ1xuICB9O1xuICByZXR1cm4gY2FuY2VsRXZlbnQ7XG59O1xuIiwiXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnaXMtdHlwZS1vZicpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVzb3VyY2VQYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1ldGVyc1xuICogQHJldHVyblxuICovXG5leHBvcnRzLmJ1aWxkQ2Fub25pY2FsaXplZFJlc291cmNlID0gZnVuY3Rpb24gYnVpbGRDYW5vbmljYWxpemVkUmVzb3VyY2UocmVzb3VyY2VQYXRoLCBwYXJhbWV0ZXJzKSB7XG4gIGxldCBjYW5vbmljYWxpemVkUmVzb3VyY2UgPSBgJHtyZXNvdXJjZVBhdGh9YDtcbiAgbGV0IHNlcGFyYXRvclN0cmluZyA9ICc/JztcblxuICBpZiAoaXMuc3RyaW5nKHBhcmFtZXRlcnMpICYmIHBhcmFtZXRlcnMudHJpbSgpICE9PSAnJykge1xuICAgIGNhbm9uaWNhbGl6ZWRSZXNvdXJjZSArPSBzZXBhcmF0b3JTdHJpbmcgKyBwYXJhbWV0ZXJzO1xuICB9IGVsc2UgaWYgKGlzLmFycmF5KHBhcmFtZXRlcnMpKSB7XG4gICAgcGFyYW1ldGVycy5zb3J0KCk7XG4gICAgY2Fub25pY2FsaXplZFJlc291cmNlICs9IHNlcGFyYXRvclN0cmluZyArIHBhcmFtZXRlcnMuam9pbignJicpO1xuICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBjb21wYXJlRnVuYyA9IChlbnRyeTEsIGVudHJ5MikgPT4ge1xuICAgICAgaWYgKGVudHJ5MVswXSA+IGVudHJ5MlswXSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkxWzBdIDwgZW50cnkyWzBdKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgY29uc3QgcHJvY2Vzc0Z1bmMgPSAoa2V5KSA9PiB7XG4gICAgICBjYW5vbmljYWxpemVkUmVzb3VyY2UgKz0gc2VwYXJhdG9yU3RyaW5nICsga2V5O1xuICAgICAgaWYgKHBhcmFtZXRlcnNba2V5XSkge1xuICAgICAgICBjYW5vbmljYWxpemVkUmVzb3VyY2UgKz0gYD0ke3BhcmFtZXRlcnNba2V5XX1gO1xuICAgICAgfVxuICAgICAgc2VwYXJhdG9yU3RyaW5nID0gJyYnO1xuICAgIH07XG4gICAgT2JqZWN0LmtleXMocGFyYW1ldGVycykuc29ydChjb21wYXJlRnVuYykuZm9yRWFjaChwcm9jZXNzRnVuYyk7XG4gIH1cblxuICByZXR1cm4gY2Fub25pY2FsaXplZFJlc291cmNlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVzb3VyY2VQYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHBhcmFtIHtTdHJpbmd9IGV4cGlyZXNcbiAqIEByZXR1cm4ge1N0cmluZ30gY2Fub25pY2FsU3RyaW5nXG4gKi9cbmV4cG9ydHMuYnVpbGRDYW5vbmljYWxTdHJpbmcgPSBmdW5jdGlvbiBjYW5vbmljYWxTdHJpbmcobWV0aG9kLCByZXNvdXJjZVBhdGgsIHJlcXVlc3QsIGV4cGlyZXMpIHtcbiAgcmVxdWVzdCA9IHJlcXVlc3QgfHwge307XG4gIGNvbnN0IGhlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnMgfHwge307XG4gIGNvbnN0IE9TU19QUkVGSVggPSAneC1vc3MtJztcbiAgY29uc3Qgb3NzSGVhZGVycyA9IFtdO1xuICBjb25zdCBoZWFkZXJzVG9TaWduID0ge307XG5cbiAgbGV0IHNpZ25Db250ZW50ID0gW1xuICAgIG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtTWQ1J10gfHwgJycsXG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgaGVhZGVyc1snQ29udGVudC1UeXBlJy50b0xvd2VyQ2FzZSgpXSxcbiAgICBleHBpcmVzIHx8IGhlYWRlcnNbJ3gtb3NzLWRhdGUnXVxuICBdO1xuXG4gIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGxvd2VyS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyS2V5LmluZGV4T2YoT1NTX1BSRUZJWCkgPT09IDApIHtcbiAgICAgIGhlYWRlcnNUb1NpZ25bbG93ZXJLZXldID0gU3RyaW5nKGhlYWRlcnNba2V5XSkudHJpbSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMoaGVhZGVyc1RvU2lnbikuc29ydCgpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIG9zc0hlYWRlcnMucHVzaChgJHtrZXl9OiR7aGVhZGVyc1RvU2lnbltrZXldfWApO1xuICB9KTtcblxuICBzaWduQ29udGVudCA9IHNpZ25Db250ZW50LmNvbmNhdChvc3NIZWFkZXJzKTtcblxuICBzaWduQ29udGVudC5wdXNoKHRoaXMuYnVpbGRDYW5vbmljYWxpemVkUmVzb3VyY2UocmVzb3VyY2VQYXRoLCByZXF1ZXN0LnBhcmFtZXRlcnMpKTtcblxuICByZXR1cm4gc2lnbkNvbnRlbnQuam9pbignXFxuJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NLZXlTZWNyZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBjYW5vbmljYWxTdHJpbmdcbiAqL1xuZXhwb3J0cy5jb21wdXRlU2lnbmF0dXJlID0gZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZShhY2Nlc3NLZXlTZWNyZXQsIGNhbm9uaWNhbFN0cmluZykge1xuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIGFjY2Vzc0tleVNlY3JldCk7XG4gIHJldHVybiBzaWduYXR1cmUudXBkYXRlKEJ1ZmZlci5mcm9tKGNhbm9uaWNhbFN0cmluZywgJ3V0ZjgnKSkuZGlnZXN0KCdiYXNlNjQnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc0tleUlkXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzS2V5U2VjcmV0XG4gKiBAcGFyYW0ge1N0cmluZ30gY2Fub25pY2FsU3RyaW5nXG4gKi9cbmV4cG9ydHMuYXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uIGF1dGhvcml6YXRpb24oYWNjZXNzS2V5SWQsIGFjY2Vzc0tleVNlY3JldCwgY2Fub25pY2FsU3RyaW5nKSB7XG4gIHJldHVybiBgT1NTICR7YWNjZXNzS2V5SWR9OiR7dGhpcy5jb21wdXRlU2lnbmF0dXJlKGFjY2Vzc0tleVNlY3JldCwgY2Fub25pY2FsU3RyaW5nKX1gO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc0tleVNlY3JldFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXNvdXJjZVxuICogQHBhcmFtIHtOdW1iZXJ9IGV4cGlyZXNcbiAqL1xuZXhwb3J0cy5fc2lnbmF0dXJlRm9yVVJMID0gZnVuY3Rpb24gX3NpZ25hdHVyZUZvclVSTChhY2Nlc3NLZXlTZWNyZXQsIG9wdGlvbnMsIHJlc291cmNlLCBleHBpcmVzKSB7XG4gIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgY29uc3Qgc3ViUmVzb3VyY2UgPSB7fTtcblxuICBpZiAob3B0aW9ucy5wcm9jZXNzKSB7XG4gICAgY29uc3QgcHJvY2Vzc0tleXdvcmQgPSAneC1vc3MtcHJvY2Vzcyc7XG4gICAgc3ViUmVzb3VyY2VbcHJvY2Vzc0tleXdvcmRdID0gb3B0aW9ucy5wcm9jZXNzO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVzcG9uc2UpIHtcbiAgICBPYmplY3Qua2V5cyhvcHRpb25zLnJlc3BvbnNlKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgcmVzcG9uc2UtJHtrLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgIHN1YlJlc291cmNlW2tleV0gPSBvcHRpb25zLnJlc3BvbnNlW2tdO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcbiAgICBpZiAobG93ZXJLZXkuaW5kZXhPZigneC1vc3MtJykgPT09IDApIHtcbiAgICAgIGhlYWRlcnNbbG93ZXJLZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChsb3dlcktleS5pbmRleE9mKCdjb250ZW50LW1kNScpID09PSAwKSB7XG4gICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxvd2VyS2V5LmluZGV4T2YoJ2NvbnRlbnQtdHlwZScpID09PSAwKSB7XG4gICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxvd2VyS2V5ICE9PSAnZXhwaXJlcycgJiYgbG93ZXJLZXkgIT09ICdyZXNwb25zZScgJiYgbG93ZXJLZXkgIT09ICdwcm9jZXNzJyAmJiBsb3dlcktleSAhPT0gJ21ldGhvZCcpIHtcbiAgICAgIHN1YlJlc291cmNlW2xvd2VyS2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc2VjdXJpdHktdG9rZW4nKSkge1xuICAgIHN1YlJlc291cmNlWydzZWN1cml0eS10b2tlbiddID0gb3B0aW9uc1snc2VjdXJpdHktdG9rZW4nXTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ2NhbGxiYWNrJykpIHtcbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgY2FsbGJhY2tVcmw6IGVuY29kZVVSSShvcHRpb25zLmNhbGxiYWNrLnVybCksXG4gICAgICBjYWxsYmFja0JvZHk6IG9wdGlvbnMuY2FsbGJhY2suYm9keVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuY2FsbGJhY2suaG9zdCkge1xuICAgICAganNvbi5jYWxsYmFja0hvc3QgPSBvcHRpb25zLmNhbGxiYWNrLmhvc3Q7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNhbGxiYWNrLmNvbnRlbnRUeXBlKSB7XG4gICAgICBqc29uLmNhbGxiYWNrQm9keVR5cGUgPSBvcHRpb25zLmNhbGxiYWNrLmNvbnRlbnRUeXBlO1xuICAgIH1cbiAgICBzdWJSZXNvdXJjZS5jYWxsYmFjayA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGpzb24pKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICBpZiAob3B0aW9ucy5jYWxsYmFjay5jdXN0b21WYWx1ZSkge1xuICAgICAgY29uc3QgY2FsbGJhY2tWYXIgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjYWxsYmFja1ZhcltgeDoke2tleX1gXSA9IG9wdGlvbnMuY2FsbGJhY2suY3VzdG9tVmFsdWVba2V5XTtcbiAgICAgIH0pO1xuICAgICAgc3ViUmVzb3VyY2VbJ2NhbGxiYWNrLXZhciddID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY2FsbGJhY2tWYXIpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2Fub25pY2FsU3RyaW5nID0gdGhpcy5idWlsZENhbm9uaWNhbFN0cmluZyhvcHRpb25zLm1ldGhvZCwgcmVzb3VyY2UsIHtcbiAgICBoZWFkZXJzLFxuICAgIHBhcmFtZXRlcnM6IHN1YlJlc291cmNlXG4gIH0sIGV4cGlyZXMudG9TdHJpbmcoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBTaWduYXR1cmU6IHRoaXMuY29tcHV0ZVNpZ25hdHVyZShhY2Nlc3NLZXlTZWNyZXQsIGNhbm9uaWNhbFN0cmluZyksXG4gICAgc3ViUmVzb3VyY2VcbiAgfTtcbn07XG4iLCIvKipcbiAqIGNoZWNrIEJ1Y2tldCBOYW1lXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBjb25zdCBidWNrZXRSZWdleCA9IC9eW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQvO1xuICBjb25zdCBjaGVja0J1Y2tldCA9IGJ1Y2tldFJlZ2V4LnRlc3QobmFtZSk7XG4gIHJldHVybiBjaGVja0J1Y2tldDtcbn07XG4iLCJjb25zdCBjaGVja1ZhbGlkID0gcmVxdWlyZSgnLi9jaGVja1ZhbGlkJyk7XG5jb25zdCBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuY29uc3QgY29tbW9uUnVsZXMgPSBbXG4gIHtcbiAgICB2YWxpZGF0b3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUga2V5IGFuZCB2YWx1ZSBvZiB0aGUgdGFnIG11c3QgYmUgU3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgcGF0dGVybjogL15bYS16QS1aMC05ICstPS5fOi9dKyQvLFxuICAgIG1zZzogJ3RhZyBjYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGFuZCB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IHBsdXMgc2lnbiAoKyksIGh5cGhlbiAoLSksIGVxdWFsIHNpZ24gKD0pLCBwZXJpb2QgKC4pLCB1bmRlcnNjb3JlIChfKSwgY29sb24gKDopLCBhbmQgZm9yd2FyZCBzbGFzaCAoLyknXG4gIH1cbl07XG5cbmNvbnN0IHJ1bGVzID0ge1xuICBrZXk6IFtcbiAgICAuLi5jb21tb25SdWxlcyxcbiAgICB7XG4gICAgICBwYXR0ZXJuOiAvXi57MSwxMjh9JC8sXG4gICAgICBtc2c6ICd0YWcga2V5IGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IGJ5dGVzIGluIGxlbmd0aCdcbiAgICB9XG4gIF0sXG4gIHZhbHVlOiBbXG4gICAgLi4uY29tbW9uUnVsZXMsXG4gICAge1xuICAgICAgcGF0dGVybjogL14uezAsMjU2fSQvLFxuICAgICAgbXNnOiAndGFnIHZhbHVlIGNhbiBiZSBhIG1heGltdW0gb2YgMjU2IGJ5dGVzIGluIGxlbmd0aCdcbiAgICB9XG4gIF1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2hlY2tUYWcodGFnKSB7XG4gIGlmICghaXNPYmplY3QodGFnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFnIG11c3QgYmUgT2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFnKTtcblxuICBpZiAoZW50cmllcy5sZW5ndGggPiAxMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWF4aW11bSBvZiAxMCB0YWdzIGZvciBhIG9iamVjdCcpO1xuICB9XG5cbiAgY29uc3QgcnVsZXNJbmRleEtleSA9IFsna2V5JywgJ3ZhbHVlJ107XG5cbiAgZW50cmllcy5mb3JFYWNoKChrZXlWYWx1ZSkgPT4ge1xuICAgIGtleVZhbHVlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjaGVja1ZhbGlkKGl0ZW0sIHJ1bGVzW3J1bGVzSW5kZXhLZXlbaW5kZXhdXSk7XG4gICAgfSk7XG4gIH0pO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2hlY2tWYWxpZChfdmFsdWUsIF9ydWxlcykge1xuICBfcnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgIGlmIChydWxlLnZhbGlkYXRvcikge1xuICAgICAgcnVsZS52YWxpZGF0b3IoX3ZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHJ1bGUucGF0dGVybiAmJiAhcnVsZS5wYXR0ZXJuLnRlc3QoX3ZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJ1bGUubXNnKTtcbiAgICB9XG4gIH0pO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVlcENvcHkob2JqLCBjYWNoZSA9IFtdKSB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IGhpdCA9IGNhY2hlLmZpbHRlcihjID0+IGMub3JpZ2luYWwgPT09IG9iailbMF07XG4gIGlmIChoaXQpIHtcbiAgICByZXR1cm4gaGl0LmNvcHk7XG4gIH1cbiAgY29uc3QgY29weSA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG4gIGNhY2hlLnB1c2goe1xuICAgIG9yaWdpbmFsOiBvYmosXG4gICAgY29weVxuICB9KTtcblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvcHlba2V5XSA9IGRlZXBDb3B5KG9ialtrZXldLCBjYWNoZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb3B5O1xufTtcbiIsIi8vIGl0IHByb3ZpZGUgY29tbW9udCBtZXRob2RzIGZvciBub2RlIGFuZCBicm93c2VyICwgd2Ugd2lsbCBhZGQgbW9yZSBzb2x1dGlvbnMgbGF0ZXIgaW4gdGhpcyBmaWxlXG4vKipcbiAqIEp1ZGdlIGlzSVAgaW5jbHVkZSBpcHY0IG9yIGlwdjZcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zXG4gKiBAcmV0dXJuIHtBcnJheX0gdGhlIG11bHRpcGFydCB1cGxvYWRzXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhvc3QpIHtcbiAgY29uc3QgaXB2NFJlZ2V4ID0gL14oMjVbMC01XXwyWzAtNF1cXGR8WzAtMV0/XFxkP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfFswLTFdP1xcZD9cXGQpKXszfSQvO1xuICBjb25zdCBpcHY2UmVnZXggPSAvXlxccyooKChbMC05QS1GYS1mXXsxLDR9Oil7N30oWzAtOUEtRmEtZl17MSw0fXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Nn0oOlswLTlBLUZhLWZdezEsNH18KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs1fSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDJ9KXw6KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs0fSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDN9KXwoKDpbMC05QS1GYS1mXXsxLDR9KT86KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7M30oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw0fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwyfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsyfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDV9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDN9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezF9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNn0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNH06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KDooKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw3fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw1fTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoJS4rKT9cXHMqJC87XG4gIGNvbnN0IGlzSVAgPSBpcHY0UmVnZXgudGVzdChob3N0KSB8fCBpcHY2UmVnZXgudGVzdChob3N0KTtcbiAgcmV0dXJuIGlzSVA7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJztcbn07XG4iLCJmdW5jdGlvbiB0eXBlKHBhcmFtcykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgIC5jYWxsKHBhcmFtcylcbiAgICAucmVwbGFjZSgvKC4qPyB8XSkvZywgJycpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9iajJ4bWwob2JqLCBvcHRpb25zKSB7XG4gIGxldCBzID0gJyc7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycykge1xuICAgIHMgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxuJztcbiAgfVxuICBpZiAodHlwZShvYmopID09PSAnb2JqZWN0Jykge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAodHlwZShvYmpba2V5XSkgPT09ICdzdHJpbmcnIHx8IHR5cGUob2JqW2tleV0pID09PSAnbnVtYmVyJykge1xuICAgICAgICBzICs9IGA8JHtrZXl9PiR7b2JqW2tleV19PC8ke2tleX0+YDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZShvYmpba2V5XSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHMgKz0gYDwke2tleX0+JHtvYmoyeG1sKG9ialtrZXldKX08LyR7a2V5fT5gO1xuICAgICAgfSBlbHNlIGlmICh0eXBlKG9ialtrZXldKSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBzICs9IG9ialtrZXldXG4gICAgICAgICAgLm1hcChrZXlDaGlsZCA9PiBgPCR7a2V5fT4ke29iajJ4bWwoa2V5Q2hpbGQpfTwvJHtrZXl9PmApXG4gICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcyArPSBgPCR7a2V5fT4ke29ialtrZXldLnRvU3RyaW5nKCl9PC8ke2tleX0+YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzICs9IG9iai50b1N0cmluZygpO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iajJ4bWw7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG5tb2R1bGUuZXhwb3J0cy5IdHRwc0FnZW50ID0gbm9vcDtcblxuLy8gTm9vcCBmdW5jdGlvbiBmb3IgYnJvd3NlciBzaW5jZSBuYXRpdmUgYXBpJ3MgZG9uJ3QgdXNlIGFnZW50cy5cbmZ1bmN0aW9uIG5vb3AgKCkge31cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWdpc3RlcicpKCkuUHJvbWlzZVxuIiwiXCJ1c2Ugc3RyaWN0XCJcbiAgICAvLyBnbG9iYWwga2V5IGZvciB1c2VyIHByZWZlcnJlZCByZWdpc3RyYXRpb25cbnZhciBSRUdJU1RSQVRJT05fS0VZID0gJ0BAYW55LXByb21pc2UvUkVHSVNUUkFUSU9OJyxcbiAgICAvLyBQcmlvciByZWdpc3RyYXRpb24gKHByZWZlcnJlZCBvciBkZXRlY3RlZClcbiAgICByZWdpc3RlcmVkID0gbnVsbFxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24uICBBbiBpbXBsZW1lbnRhdGlvbiBtdXN0XG4gKiBiZSByZWdpc3RlcmVkIHByaW9yIHRvIGFueSBjYWxsIHRvIGByZXF1aXJlKFwiYW55LXByb21pc2VcIilgLFxuICogdHlwaWNhbGx5IG9uIGFwcGxpY2F0aW9uIGxvYWQuXG4gKlxuICogSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB3aWxsIHJldHVybiByZWdpc3RyYXRpb24gaW5cbiAqIGZvbGxvd2luZyBwcmlvcml0eTpcbiAqXG4gKiBGb3IgTm9kZS5qczpcbiAqXG4gKiAxLiBQcmV2aW91cyByZWdpc3RyYXRpb25cbiAqIDIuIGdsb2JhbC5Qcm9taXNlIGlmIG5vZGUuanMgdmVyc2lvbiA+PSAwLjEyXG4gKiAzLiBBdXRvIGRldGVjdGVkIHByb21pc2UgYmFzZWQgb24gZmlyc3Qgc3VjZXNzZnVsIHJlcXVpcmUgb2ZcbiAqICAgIGtub3duIHByb21pc2UgbGlicmFyaWVzLiBOb3RlIHRoaXMgaXMgYSBsYXN0IHJlc29ydCwgYXMgdGhlXG4gKiAgICBsb2FkZWQgbGlicmFyeSBpcyBub24tZGV0ZXJtaW5pc3RpYy4gbm9kZS5qcyA+PSAwLjEyIHdpbGxcbiAqICAgIGFsd2F5cyB1c2UgZ2xvYmFsLlByb21pc2Ugb3ZlciB0aGlzIHByaW9yaXR5IGxpc3QuXG4gKiA0LiBUaHJvd3MgZXJyb3IuXG4gKlxuICogRm9yIEJyb3dzZXI6XG4gKlxuICogMS4gUHJldmlvdXMgcmVnaXN0cmF0aW9uXG4gKiAyLiB3aW5kb3cuUHJvbWlzZVxuICogMy4gVGhyb3dzIGVycm9yLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogUHJvbWlzZTogRGVzaXJlZCBQcm9taXNlIGNvbnN0cnVjdG9yXG4gKiBnbG9iYWw6IEJvb2xlYW4gLSBTaG91bGQgdGhlIHJlZ2lzdHJhdGlvbiBiZSBjYWNoZWQgaW4gYSBnbG9iYWwgdmFyaWFibGUgdG9cbiAqIGFsbG93IGNyb3NzIGRlcGVuZGVuY3kvYnVuZGxlIHJlZ2lzdHJhdGlvbj8gIChkZWZhdWx0IHRydWUpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocm9vdCwgbG9hZEltcGxlbWVudGF0aW9uKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlZ2lzdGVyKGltcGxlbWVudGF0aW9uLCBvcHRzKXtcbiAgICBpbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uIHx8IG51bGxcbiAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgIC8vIGdsb2JhbCByZWdpc3RyYXRpb24gdW5sZXNzIGV4cGxpY2l0bHkgIHtnbG9iYWw6IGZhbHNlfSBpbiBvcHRpb25zIChkZWZhdWx0IHRydWUpXG4gICAgdmFyIHJlZ2lzdGVyR2xvYmFsID0gb3B0cy5nbG9iYWwgIT09IGZhbHNlO1xuXG4gICAgLy8gbG9hZCBhbnkgcHJldmlvdXMgZ2xvYmFsIHJlZ2lzdHJhdGlvblxuICAgIGlmKHJlZ2lzdGVyZWQgPT09IG51bGwgJiYgcmVnaXN0ZXJHbG9iYWwpe1xuICAgICAgcmVnaXN0ZXJlZCA9IHJvb3RbUkVHSVNUUkFUSU9OX0tFWV0gfHwgbnVsbFxuICAgIH1cblxuICAgIGlmKHJlZ2lzdGVyZWQgIT09IG51bGxcbiAgICAgICAgJiYgaW1wbGVtZW50YXRpb24gIT09IG51bGxcbiAgICAgICAgJiYgcmVnaXN0ZXJlZC5pbXBsZW1lbnRhdGlvbiAhPT0gaW1wbGVtZW50YXRpb24pe1xuICAgICAgLy8gVGhyb3cgZXJyb3IgaWYgYXR0ZW1wdGluZyB0byByZWRlZmluZSBpbXBsZW1lbnRhdGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbnktcHJvbWlzZSBhbHJlYWR5IGRlZmluZWQgYXMgXCInK3JlZ2lzdGVyZWQuaW1wbGVtZW50YXRpb24rXG4gICAgICAgICdcIi4gIFlvdSBjYW4gb25seSByZWdpc3RlciBhbiBpbXBsZW1lbnRhdGlvbiBiZWZvcmUgdGhlIGZpcnN0ICcrXG4gICAgICAgICcgY2FsbCB0byByZXF1aXJlKFwiYW55LXByb21pc2VcIikgYW5kIGFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBjaGFuZ2VkJylcbiAgICB9XG5cbiAgICBpZihyZWdpc3RlcmVkID09PSBudWxsKXtcbiAgICAgIC8vIHVzZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvblxuICAgICAgaWYoaW1wbGVtZW50YXRpb24gIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICByZWdpc3RlcmVkID0ge1xuICAgICAgICAgIFByb21pc2U6IG9wdHMuUHJvbWlzZSxcbiAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVxdWlyZSBpbXBsZW1lbnRhdGlvbiBpZiBpbXBsZW1lbnRhdGlvbiBpcyBzcGVjaWZpZWQgYnV0IG5vdCBwcm92aWRlZFxuICAgICAgICByZWdpc3RlcmVkID0gbG9hZEltcGxlbWVudGF0aW9uKGltcGxlbWVudGF0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZihyZWdpc3Rlckdsb2JhbCl7XG4gICAgICAgIC8vIHJlZ2lzdGVyIHByZWZlcmVuY2UgZ2xvYmFsbHkgaW4gY2FzZSBtdWx0aXBsZSBpbnN0YWxsYXRpb25zXG4gICAgICAgIHJvb3RbUkVHSVNUUkFUSU9OX0tFWV0gPSByZWdpc3RlcmVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbG9hZGVyJykod2luZG93LCBsb2FkSW1wbGVtZW50YXRpb24pXG5cbi8qKlxuICogQnJvd3NlciBzcGVjaWZpYyBsb2FkSW1wbGVtZW50YXRpb24uICBBbHdheXMgdXNlcyBgd2luZG93LlByb21pc2VgXG4gKlxuICogVG8gcmVnaXN0ZXIgYSBjdXN0b20gaW1wbGVtZW50YXRpb24sIG11c3QgcmVnaXN0ZXIgd2l0aCBgUHJvbWlzZWAgb3B0aW9uLlxuICovXG5mdW5jdGlvbiBsb2FkSW1wbGVtZW50YXRpb24oKXtcbiAgaWYodHlwZW9mIHdpbmRvdy5Qcm9taXNlID09PSAndW5kZWZpbmVkJyl7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYW55LXByb21pc2UgYnJvd3NlciByZXF1aXJlcyBhIHBvbHlmaWxsIG9yIGV4cGxpY2l0IHJlZ2lzdHJhdGlvblwiK1xuICAgICAgXCIgZS5nOiByZXF1aXJlKCdhbnktcHJvbWlzZS9yZWdpc3Rlci9ibHVlYmlyZCcpXCIpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBQcm9taXNlOiB3aW5kb3cuUHJvbWlzZSxcbiAgICBpbXBsZW1lbnRhdGlvbjogJ3dpbmRvdy5Qcm9taXNlJ1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9jcmVhdGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1uYW1lc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5c1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3NldC1pbW1lZGlhdGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3RyaW5nL2Zyb20tY29kZS1wb2ludFwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2xcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2hhcy1pbnN0YW5jZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaXRlcmF0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2wvaXRlcmF0b3JcIik7XG5cbnZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXG52YXIgX3N5bWJvbCA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbFwiKTtcblxudmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBCb3dzZXIgLSBhIGJyb3dzZXIgZGV0ZWN0b3JcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWQvYm93c2VyXG4gKiBNSVQgTGljZW5zZSB8IChjKSBEdXN0aW4gRGlheiAyMDE1XG4gKi9cblxuIWZ1bmN0aW9uIChyb290LCBuYW1lLCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgZGVmaW5lKG5hbWUsIGRlZmluaXRpb24pXG4gIGVsc2Ugcm9vdFtuYW1lXSA9IGRlZmluaXRpb24oKVxufSh0aGlzLCAnYm93c2VyJywgZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICAqIFNlZSB1c2VyYWdlbnRzLmpzIGZvciBleGFtcGxlcyBvZiBuYXZpZ2F0b3IudXNlckFnZW50XG4gICAgKi9cblxuICB2YXIgdCA9IHRydWVcblxuICBmdW5jdGlvbiBkZXRlY3QodWEpIHtcblxuICAgIGZ1bmN0aW9uIGdldEZpcnN0TWF0Y2gocmVnZXgpIHtcbiAgICAgIHZhciBtYXRjaCA9IHVhLm1hdGNoKHJlZ2V4KTtcbiAgICAgIHJldHVybiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaFsxXSkgfHwgJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2Vjb25kTWF0Y2gocmVnZXgpIHtcbiAgICAgIHZhciBtYXRjaCA9IHVhLm1hdGNoKHJlZ2V4KTtcbiAgICAgIHJldHVybiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaFsyXSkgfHwgJyc7XG4gICAgfVxuXG4gICAgdmFyIGlvc2RldmljZSA9IGdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZXxpcGFkKS9pKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIGxpa2VBbmRyb2lkID0gL2xpa2UgYW5kcm9pZC9pLnRlc3QodWEpXG4gICAgICAsIGFuZHJvaWQgPSAhbGlrZUFuZHJvaWQgJiYgL2FuZHJvaWQvaS50ZXN0KHVhKVxuICAgICAgLCBuZXh1c01vYmlsZSA9IC9uZXh1c1xccypbMC02XVxccyovaS50ZXN0KHVhKVxuICAgICAgLCBuZXh1c1RhYmxldCA9ICFuZXh1c01vYmlsZSAmJiAvbmV4dXNcXHMqWzAtOV0rL2kudGVzdCh1YSlcbiAgICAgICwgY2hyb21lb3MgPSAvQ3JPUy8udGVzdCh1YSlcbiAgICAgICwgc2lsayA9IC9zaWxrL2kudGVzdCh1YSlcbiAgICAgICwgc2FpbGZpc2ggPSAvc2FpbGZpc2gvaS50ZXN0KHVhKVxuICAgICAgLCB0aXplbiA9IC90aXplbi9pLnRlc3QodWEpXG4gICAgICAsIHdlYm9zID0gLyh3ZWJ8aHB3KShvfDApcy9pLnRlc3QodWEpXG4gICAgICAsIHdpbmRvd3NwaG9uZSA9IC93aW5kb3dzIHBob25lL2kudGVzdCh1YSlcbiAgICAgICwgc2Ftc3VuZ0Jyb3dzZXIgPSAvU2Ftc3VuZ0Jyb3dzZXIvaS50ZXN0KHVhKVxuICAgICAgLCB3aW5kb3dzID0gIXdpbmRvd3NwaG9uZSAmJiAvd2luZG93cy9pLnRlc3QodWEpXG4gICAgICAsIG1hYyA9ICFpb3NkZXZpY2UgJiYgIXNpbGsgJiYgL21hY2ludG9zaC9pLnRlc3QodWEpXG4gICAgICAsIGxpbnV4ID0gIWFuZHJvaWQgJiYgIXNhaWxmaXNoICYmICF0aXplbiAmJiAhd2Vib3MgJiYgL2xpbnV4L2kudGVzdCh1YSlcbiAgICAgICwgZWRnZVZlcnNpb24gPSBnZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVxcLyhcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgICwgdmVyc2lvbklkZW50aWZpZXIgPSBnZXRGaXJzdE1hdGNoKC92ZXJzaW9uXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgLCB0YWJsZXQgPSAvdGFibGV0L2kudGVzdCh1YSkgJiYgIS90YWJsZXQgcGMvaS50ZXN0KHVhKVxuICAgICAgLCBtb2JpbGUgPSAhdGFibGV0ICYmIC9bXi1dbW9iaS9pLnRlc3QodWEpXG4gICAgICAsIHhib3ggPSAveGJveC9pLnRlc3QodWEpXG4gICAgICAsIHJlc3VsdFxuXG4gICAgaWYgKC9vcGVyYS9pLnRlc3QodWEpKSB7XG4gICAgICAvLyAgYW4gb2xkIE9wZXJhXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdPcGVyYSdcbiAgICAgICwgb3BlcmE6IHRcbiAgICAgICwgdmVyc2lvbjogdmVyc2lvbklkZW50aWZpZXIgfHwgZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmF8b3ByfG9waW9zKVtcXHNcXC9dKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL29wclxcL3xvcGlvcy9pLnRlc3QodWEpKSB7XG4gICAgICAvLyBhIG5ldyBPcGVyYVxuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnT3BlcmEnXG4gICAgICAgICwgb3BlcmE6IHRcbiAgICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC8oPzpvcHJ8b3Bpb3MpW1xcc1xcL10oXFxkKyhcXC5cXGQrKT8pL2kpIHx8IHZlcnNpb25JZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9TYW1zdW5nQnJvd3Nlci9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkJ1xuICAgICAgICAsIHNhbXN1bmdCcm93c2VyOiB0XG4gICAgICAgICwgdmVyc2lvbjogdmVyc2lvbklkZW50aWZpZXIgfHwgZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xcc1xcL10oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9XaGFsZS9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdOQVZFUiBXaGFsZSBicm93c2VyJ1xuICAgICAgICAsIHdoYWxlOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xcc1xcL10oXFxkKyg/OlxcLlxcZCspKykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL01aQnJvd3Nlci9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdNWiBCcm93c2VyJ1xuICAgICAgICAsIG16YnJvd3NlcjogdFxuICAgICAgICAsIHZlcnNpb246IGdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXFxzXFwvXShcXGQrKD86XFwuXFxkKykrKS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvY29hc3QvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnT3BlcmEgQ29hc3QnXG4gICAgICAgICwgY29hc3Q6IHRcbiAgICAgICAgLCB2ZXJzaW9uOiB2ZXJzaW9uSWRlbnRpZmllciB8fCBnZXRGaXJzdE1hdGNoKC8oPzpjb2FzdClbXFxzXFwvXShcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL2ZvY3VzL2kudGVzdCh1YSkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ0ZvY3VzJ1xuICAgICAgICAsIGZvY3VzOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xcc1xcL10oXFxkKyg/OlxcLlxcZCspKykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL3lhYnJvd3Nlci9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdZYW5kZXggQnJvd3NlcidcbiAgICAgICwgeWFuZGV4YnJvd3NlcjogdFxuICAgICAgLCB2ZXJzaW9uOiB2ZXJzaW9uSWRlbnRpZmllciB8fCBnZXRGaXJzdE1hdGNoKC8oPzp5YWJyb3dzZXIpW1xcc1xcL10oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC91Y2Jyb3dzZXIvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIG5hbWU6ICdVQyBCcm93c2VyJ1xuICAgICAgICAsIHVjYnJvd3NlcjogdFxuICAgICAgICAsIHZlcnNpb246IGdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXFxzXFwvXShcXGQrKD86XFwuXFxkKykrKS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvbXhpb3MvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnTWF4dGhvbidcbiAgICAgICAgLCBtYXh0aG9uOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86bXhpb3MpW1xcc1xcL10oXFxkKyg/OlxcLlxcZCspKykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL2VwaXBoYW55L2kudGVzdCh1YSkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ0VwaXBoYW55J1xuICAgICAgICAsIGVwaXBoYW55OiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xcc1xcL10oXFxkKyg/OlxcLlxcZCspKykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL3B1ZmZpbi9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdQdWZmaW4nXG4gICAgICAgICwgcHVmZmluOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86cHVmZmluKVtcXHNcXC9dKFxcZCsoPzpcXC5cXGQrKT8pL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9zbGVpcG5pci9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdTbGVpcG5pcidcbiAgICAgICAgLCBzbGVpcG5pcjogdFxuICAgICAgICAsIHZlcnNpb246IGdldEZpcnN0TWF0Y2goLyg/OnNsZWlwbmlyKVtcXHNcXC9dKFxcZCsoPzpcXC5cXGQrKSspL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9rLW1lbGVvbi9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdLLU1lbGVvbidcbiAgICAgICAgLCBrTWVsZW9uOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xcc1xcL10oXFxkKyg/OlxcLlxcZCspKykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAod2luZG93c3Bob25lKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdXaW5kb3dzIFBob25lJ1xuICAgICAgLCBvc25hbWU6ICdXaW5kb3dzIFBob25lJ1xuICAgICAgLCB3aW5kb3dzcGhvbmU6IHRcbiAgICAgIH1cbiAgICAgIGlmIChlZGdlVmVyc2lvbikge1xuICAgICAgICByZXN1bHQubXNlZGdlID0gdFxuICAgICAgICByZXN1bHQudmVyc2lvbiA9IGVkZ2VWZXJzaW9uXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0Lm1zaWUgPSB0XG4gICAgICAgIHJlc3VsdC52ZXJzaW9uID0gZ2V0Rmlyc3RNYXRjaCgvaWVtb2JpbGVcXC8oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9tc2llfHRyaWRlbnQvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnSW50ZXJuZXQgRXhwbG9yZXInXG4gICAgICAsIG1zaWU6IHRcbiAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86bXNpZSB8cnY6KShcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNocm9tZW9zKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdDaHJvbWUnXG4gICAgICAsIG9zbmFtZTogJ0Nocm9tZSBPUydcbiAgICAgICwgY2hyb21lb3M6IHRcbiAgICAgICwgY2hyb21lQm9vazogdFxuICAgICAgLCBjaHJvbWU6IHRcbiAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL2VkZyhbZWFdfGlvcykvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IEVkZ2UnXG4gICAgICAsIG1zZWRnZTogdFxuICAgICAgLCB2ZXJzaW9uOiBlZGdlVmVyc2lvblxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvdml2YWxkaS9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdWaXZhbGRpJ1xuICAgICAgICAsIHZpdmFsZGk6IHRcbiAgICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC92aXZhbGRpXFwvKFxcZCsoXFwuXFxkKyk/KS9pKSB8fCB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzYWlsZmlzaCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnU2FpbGZpc2gnXG4gICAgICAsIG9zbmFtZTogJ1NhaWxmaXNoIE9TJ1xuICAgICAgLCBzYWlsZmlzaDogdFxuICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxccz9icm93c2VyXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvc2VhbW9ua2V5XFwvL2kudGVzdCh1YSkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ1NlYU1vbmtleSdcbiAgICAgICwgc2VhbW9ua2V5OiB0XG4gICAgICAsIHZlcnNpb246IGdldEZpcnN0TWF0Y2goL3NlYW1vbmtleVxcLyhcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2kudGVzdCh1YSkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ0ZpcmVmb3gnXG4gICAgICAsIGZpcmVmb3g6IHRcbiAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpWyBcXC9dKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgICAgaWYgKC9cXCgobW9iaWxlfHRhYmxldCk7W15cXCldKnJ2OltcXGRcXC5dK1xcKS9pLnRlc3QodWEpKSB7XG4gICAgICAgIHJlc3VsdC5maXJlZm94b3MgPSB0XG4gICAgICAgIHJlc3VsdC5vc25hbWUgPSAnRmlyZWZveCBPUydcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc2lsaykge1xuICAgICAgcmVzdWx0ID0gIHtcbiAgICAgICAgbmFtZTogJ0FtYXpvbiBTaWxrJ1xuICAgICAgLCBzaWxrOiB0XG4gICAgICAsIHZlcnNpb24gOiBnZXRGaXJzdE1hdGNoKC9zaWxrXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvcGhhbnRvbS9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdQaGFudG9tSlMnXG4gICAgICAsIHBoYW50b206IHRcbiAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvc2xpbWVyanMvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnU2xpbWVySlMnXG4gICAgICAgICwgc2xpbWVyOiB0XG4gICAgICAgICwgdmVyc2lvbjogZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcXC8oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKC9ibGFja2JlcnJ5fFxcYmJiXFxkKy9pLnRlc3QodWEpIHx8IC9yaW1cXHN0YWJsZXQvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnQmxhY2tCZXJyeSdcbiAgICAgICwgb3NuYW1lOiAnQmxhY2tCZXJyeSBPUydcbiAgICAgICwgYmxhY2tiZXJyeTogdFxuICAgICAgLCB2ZXJzaW9uOiB2ZXJzaW9uSWRlbnRpZmllciB8fCBnZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xcZF0rXFwvKFxcZCsoXFwuXFxkKyk/KS9pKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh3ZWJvcykge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnV2ViT1MnXG4gICAgICAsIG9zbmFtZTogJ1dlYk9TJ1xuICAgICAgLCB3ZWJvczogdFxuICAgICAgLCB2ZXJzaW9uOiB2ZXJzaW9uSWRlbnRpZmllciB8fCBnZXRGaXJzdE1hdGNoKC93KD86ZWIpP29zYnJvd3NlclxcLyhcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgIH07XG4gICAgICAvdG91Y2hwYWRcXC8vaS50ZXN0KHVhKSAmJiAocmVzdWx0LnRvdWNocGFkID0gdClcbiAgICB9XG4gICAgZWxzZSBpZiAoL2JhZGEvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnQmFkYSdcbiAgICAgICwgb3NuYW1lOiAnQmFkYSdcbiAgICAgICwgYmFkYTogdFxuICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC9kb2xmaW5cXC8oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh0aXplbikge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnVGl6ZW4nXG4gICAgICAsIG9zbmFtZTogJ1RpemVuJ1xuICAgICAgLCB0aXplbjogdFxuICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC8oPzp0aXplblxccz8pP2Jyb3dzZXJcXC8oXFxkKyhcXC5cXGQrKT8pL2kpIHx8IHZlcnNpb25JZGVudGlmaWVyXG4gICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgvcXVwemlsbGEvaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnUXVwWmlsbGEnXG4gICAgICAgICwgcXVwemlsbGE6IHRcbiAgICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC8oPzpxdXB6aWxsYSlbXFxzXFwvXShcXGQrKD86XFwuXFxkKykrKS9pKSB8fCB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvY2hyb21pdW0vaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnQ2hyb21pdW0nXG4gICAgICAgICwgY2hyb21pdW06IHRcbiAgICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXFxzXFwvXShcXGQrKD86XFwuXFxkKyk/KS9pKSB8fCB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvY2hyb21lfGNyaW9zfGNybW8vaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnQ2hyb21lJ1xuICAgICAgICAsIGNocm9tZTogdFxuICAgICAgICAsIHZlcnNpb246IGdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVxcLyhcXGQrKFxcLlxcZCspPykvaSlcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYW5kcm9pZCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBuYW1lOiAnQW5kcm9pZCdcbiAgICAgICAgLCB2ZXJzaW9uOiB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgvc2FmYXJpfGFwcGxld2Via2l0L2kudGVzdCh1YSkpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZTogJ1NhZmFyaSdcbiAgICAgICwgc2FmYXJpOiB0XG4gICAgICB9XG4gICAgICBpZiAodmVyc2lvbklkZW50aWZpZXIpIHtcbiAgICAgICAgcmVzdWx0LnZlcnNpb24gPSB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpb3NkZXZpY2UpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgbmFtZSA6IGlvc2RldmljZSA9PSAnaXBob25lJyA/ICdpUGhvbmUnIDogaW9zZGV2aWNlID09ICdpcGFkJyA/ICdpUGFkJyA6ICdpUG9kJ1xuICAgICAgfVxuICAgICAgLy8gV1RGOiB2ZXJzaW9uIGlzIG5vdCBwYXJ0IG9mIHVzZXIgYWdlbnQgaW4gd2ViIGFwcHNcbiAgICAgIGlmICh2ZXJzaW9uSWRlbnRpZmllcikge1xuICAgICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25JZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYoL2dvb2dsZWJvdC9pLnRlc3QodWEpKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6ICdHb29nbGVib3QnXG4gICAgICAsIGdvb2dsZWJvdDogdFxuICAgICAgLCB2ZXJzaW9uOiBnZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcXC8oXFxkKyhcXC5cXGQrKSkvaSkgfHwgdmVyc2lvbklkZW50aWZpZXJcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIG5hbWU6IGdldEZpcnN0TWF0Y2goL14oLiopXFwvKC4qKSAvKSxcbiAgICAgICAgdmVyc2lvbjogZ2V0U2Vjb25kTWF0Y2goL14oLiopXFwvKC4qKSAvKVxuICAgICB9O1xuICAgfVxuXG4gICAgLy8gc2V0IHdlYmtpdCBvciBnZWNrbyBmbGFnIGZvciBicm93c2VycyBiYXNlZCBvbiB0aGVzZSBlbmdpbmVzXG4gICAgaWYgKCFyZXN1bHQubXNlZGdlICYmIC8oYXBwbGUpP3dlYmtpdC9pLnRlc3QodWEpKSB7XG4gICAgICBpZiAoLyhhcHBsZSk/d2Via2l0XFwvNTM3XFwuMzYvaS50ZXN0KHVhKSkge1xuICAgICAgICByZXN1bHQubmFtZSA9IHJlc3VsdC5uYW1lIHx8IFwiQmxpbmtcIlxuICAgICAgICByZXN1bHQuYmxpbmsgPSB0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQubmFtZSA9IHJlc3VsdC5uYW1lIHx8IFwiV2Via2l0XCJcbiAgICAgICAgcmVzdWx0LndlYmtpdCA9IHRcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0LnZlcnNpb24gJiYgdmVyc2lvbklkZW50aWZpZXIpIHtcbiAgICAgICAgcmVzdWx0LnZlcnNpb24gPSB2ZXJzaW9uSWRlbnRpZmllclxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXJlc3VsdC5vcGVyYSAmJiAvZ2Vja29cXC8vaS50ZXN0KHVhKSkge1xuICAgICAgcmVzdWx0Lm5hbWUgPSByZXN1bHQubmFtZSB8fCBcIkdlY2tvXCJcbiAgICAgIHJlc3VsdC5nZWNrbyA9IHRcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gcmVzdWx0LnZlcnNpb24gfHwgZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cXC8oXFxkKyhcXC5cXGQrKT8pL2kpXG4gICAgfVxuXG4gICAgLy8gc2V0IE9TIGZsYWdzIGZvciBwbGF0Zm9ybXMgdGhhdCBoYXZlIG11bHRpcGxlIGJyb3dzZXJzXG4gICAgaWYgKCFyZXN1bHQud2luZG93c3Bob25lICYmIChhbmRyb2lkIHx8IHJlc3VsdC5zaWxrKSkge1xuICAgICAgcmVzdWx0LmFuZHJvaWQgPSB0XG4gICAgICByZXN1bHQub3NuYW1lID0gJ0FuZHJvaWQnXG4gICAgfSBlbHNlIGlmICghcmVzdWx0LndpbmRvd3NwaG9uZSAmJiBpb3NkZXZpY2UpIHtcbiAgICAgIHJlc3VsdFtpb3NkZXZpY2VdID0gdFxuICAgICAgcmVzdWx0LmlvcyA9IHRcbiAgICAgIHJlc3VsdC5vc25hbWUgPSAnaU9TJ1xuICAgIH0gZWxzZSBpZiAobWFjKSB7XG4gICAgICByZXN1bHQubWFjID0gdFxuICAgICAgcmVzdWx0Lm9zbmFtZSA9ICdtYWNPUydcbiAgICB9IGVsc2UgaWYgKHhib3gpIHtcbiAgICAgIHJlc3VsdC54Ym94ID0gdFxuICAgICAgcmVzdWx0Lm9zbmFtZSA9ICdYYm94J1xuICAgIH0gZWxzZSBpZiAod2luZG93cykge1xuICAgICAgcmVzdWx0LndpbmRvd3MgPSB0XG4gICAgICByZXN1bHQub3NuYW1lID0gJ1dpbmRvd3MnXG4gICAgfSBlbHNlIGlmIChsaW51eCkge1xuICAgICAgcmVzdWx0LmxpbnV4ID0gdFxuICAgICAgcmVzdWx0Lm9zbmFtZSA9ICdMaW51eCdcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXaW5kb3dzVmVyc2lvbiAocykge1xuICAgICAgc3dpdGNoIChzKSB7XG4gICAgICAgIGNhc2UgJ05UJzogcmV0dXJuICdOVCdcbiAgICAgICAgY2FzZSAnWFAnOiByZXR1cm4gJ1hQJ1xuICAgICAgICBjYXNlICdOVCA1LjAnOiByZXR1cm4gJzIwMDAnXG4gICAgICAgIGNhc2UgJ05UIDUuMSc6IHJldHVybiAnWFAnXG4gICAgICAgIGNhc2UgJ05UIDUuMic6IHJldHVybiAnMjAwMydcbiAgICAgICAgY2FzZSAnTlQgNi4wJzogcmV0dXJuICdWaXN0YSdcbiAgICAgICAgY2FzZSAnTlQgNi4xJzogcmV0dXJuICc3J1xuICAgICAgICBjYXNlICdOVCA2LjInOiByZXR1cm4gJzgnXG4gICAgICAgIGNhc2UgJ05UIDYuMyc6IHJldHVybiAnOC4xJ1xuICAgICAgICBjYXNlICdOVCAxMC4wJzogcmV0dXJuICcxMCdcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9TIHZlcnNpb24gZXh0cmFjdGlvblxuICAgIHZhciBvc1ZlcnNpb24gPSAnJztcbiAgICBpZiAocmVzdWx0LndpbmRvd3MpIHtcbiAgICAgIG9zVmVyc2lvbiA9IGdldFdpbmRvd3NWZXJzaW9uKGdldEZpcnN0TWF0Y2goL1dpbmRvd3MgKChOVHxYUCkoIFxcZFxcZD8uXFxkKT8pL2kpKVxuICAgIH0gZWxzZSBpZiAocmVzdWx0LndpbmRvd3NwaG9uZSkge1xuICAgICAgb3NWZXJzaW9uID0gZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XFxzPyhcXGQrKFxcLlxcZCspKikvaSk7XG4gICAgfSBlbHNlIGlmIChyZXN1bHQubWFjKSB7XG4gICAgICBvc1ZlcnNpb24gPSBnZXRGaXJzdE1hdGNoKC9NYWMgT1MgWCAoXFxkKyhbX1xcLlxcc11cXGQrKSopL2kpO1xuICAgICAgb3NWZXJzaW9uID0gb3NWZXJzaW9uLnJlcGxhY2UoL1tfXFxzXS9nLCAnLicpO1xuICAgIH0gZWxzZSBpZiAoaW9zZGV2aWNlKSB7XG4gICAgICBvc1ZlcnNpb24gPSBnZXRGaXJzdE1hdGNoKC9vcyAoXFxkKyhbX1xcc11cXGQrKSopIGxpa2UgbWFjIG9zIHgvaSk7XG4gICAgICBvc1ZlcnNpb24gPSBvc1ZlcnNpb24ucmVwbGFjZSgvW19cXHNdL2csICcuJyk7XG4gICAgfSBlbHNlIGlmIChhbmRyb2lkKSB7XG4gICAgICBvc1ZlcnNpb24gPSBnZXRGaXJzdE1hdGNoKC9hbmRyb2lkWyBcXC8tXShcXGQrKFxcLlxcZCspKikvaSk7XG4gICAgfSBlbHNlIGlmIChyZXN1bHQud2Vib3MpIHtcbiAgICAgIG9zVmVyc2lvbiA9IGdldEZpcnN0TWF0Y2goLyg/OndlYnxocHcpb3NcXC8oXFxkKyhcXC5cXGQrKSopL2kpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0LmJsYWNrYmVycnkpIHtcbiAgICAgIG9zVmVyc2lvbiA9IGdldEZpcnN0TWF0Y2goL3JpbVxcc3RhYmxldFxcc29zXFxzKFxcZCsoXFwuXFxkKykqKS9pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5iYWRhKSB7XG4gICAgICBvc1ZlcnNpb24gPSBnZXRGaXJzdE1hdGNoKC9iYWRhXFwvKFxcZCsoXFwuXFxkKykqKS9pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC50aXplbikge1xuICAgICAgb3NWZXJzaW9uID0gZ2V0Rmlyc3RNYXRjaCgvdGl6ZW5bXFwvXFxzXShcXGQrKFxcLlxcZCspKikvaSk7XG4gICAgfVxuICAgIGlmIChvc1ZlcnNpb24pIHtcbiAgICAgIHJlc3VsdC5vc3ZlcnNpb24gPSBvc1ZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gZGV2aWNlIHR5cGUgZXh0cmFjdGlvblxuICAgIHZhciBvc01ham9yVmVyc2lvbiA9ICFyZXN1bHQud2luZG93cyAmJiBvc1ZlcnNpb24uc3BsaXQoJy4nKVswXTtcbiAgICBpZiAoXG4gICAgICAgICB0YWJsZXRcbiAgICAgIHx8IG5leHVzVGFibGV0XG4gICAgICB8fCBpb3NkZXZpY2UgPT0gJ2lwYWQnXG4gICAgICB8fCAoYW5kcm9pZCAmJiAob3NNYWpvclZlcnNpb24gPT0gMyB8fCAob3NNYWpvclZlcnNpb24gPj0gNCAmJiAhbW9iaWxlKSkpXG4gICAgICB8fCByZXN1bHQuc2lsa1xuICAgICkge1xuICAgICAgcmVzdWx0LnRhYmxldCA9IHRcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgbW9iaWxlXG4gICAgICB8fCBpb3NkZXZpY2UgPT0gJ2lwaG9uZSdcbiAgICAgIHx8IGlvc2RldmljZSA9PSAnaXBvZCdcbiAgICAgIHx8IGFuZHJvaWRcbiAgICAgIHx8IG5leHVzTW9iaWxlXG4gICAgICB8fCByZXN1bHQuYmxhY2tiZXJyeVxuICAgICAgfHwgcmVzdWx0LndlYm9zXG4gICAgICB8fCByZXN1bHQuYmFkYVxuICAgICkge1xuICAgICAgcmVzdWx0Lm1vYmlsZSA9IHRcbiAgICB9XG5cbiAgICAvLyBHcmFkZWQgQnJvd3NlciBTdXBwb3J0XG4gICAgLy8gaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpL2FydGljbGVzL2dic1xuICAgIGlmIChyZXN1bHQubXNlZGdlIHx8XG4gICAgICAgIChyZXN1bHQubXNpZSAmJiByZXN1bHQudmVyc2lvbiA+PSAxMCkgfHxcbiAgICAgICAgKHJlc3VsdC55YW5kZXhicm93c2VyICYmIHJlc3VsdC52ZXJzaW9uID49IDE1KSB8fFxuXHRcdCAgICAocmVzdWx0LnZpdmFsZGkgJiYgcmVzdWx0LnZlcnNpb24gPj0gMS4wKSB8fFxuICAgICAgICAocmVzdWx0LmNocm9tZSAmJiByZXN1bHQudmVyc2lvbiA+PSAyMCkgfHxcbiAgICAgICAgKHJlc3VsdC5zYW1zdW5nQnJvd3NlciAmJiByZXN1bHQudmVyc2lvbiA+PSA0KSB8fFxuICAgICAgICAocmVzdWx0LndoYWxlICYmIGNvbXBhcmVWZXJzaW9ucyhbcmVzdWx0LnZlcnNpb24sICcxLjAnXSkgPT09IDEpIHx8XG4gICAgICAgIChyZXN1bHQubXpicm93c2VyICYmIGNvbXBhcmVWZXJzaW9ucyhbcmVzdWx0LnZlcnNpb24sICc2LjAnXSkgPT09IDEpIHx8XG4gICAgICAgIChyZXN1bHQuZm9jdXMgJiYgY29tcGFyZVZlcnNpb25zKFtyZXN1bHQudmVyc2lvbiwgJzEuMCddKSA9PT0gMSkgfHxcbiAgICAgICAgKHJlc3VsdC5maXJlZm94ICYmIHJlc3VsdC52ZXJzaW9uID49IDIwLjApIHx8XG4gICAgICAgIChyZXN1bHQuc2FmYXJpICYmIHJlc3VsdC52ZXJzaW9uID49IDYpIHx8XG4gICAgICAgIChyZXN1bHQub3BlcmEgJiYgcmVzdWx0LnZlcnNpb24gPj0gMTAuMCkgfHxcbiAgICAgICAgKHJlc3VsdC5pb3MgJiYgcmVzdWx0Lm9zdmVyc2lvbiAmJiByZXN1bHQub3N2ZXJzaW9uLnNwbGl0KFwiLlwiKVswXSA+PSA2KSB8fFxuICAgICAgICAocmVzdWx0LmJsYWNrYmVycnkgJiYgcmVzdWx0LnZlcnNpb24gPj0gMTAuMSlcbiAgICAgICAgfHwgKHJlc3VsdC5jaHJvbWl1bSAmJiByZXN1bHQudmVyc2lvbiA+PSAyMClcbiAgICAgICAgKSB7XG4gICAgICByZXN1bHQuYSA9IHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKChyZXN1bHQubXNpZSAmJiByZXN1bHQudmVyc2lvbiA8IDEwKSB8fFxuICAgICAgICAocmVzdWx0LmNocm9tZSAmJiByZXN1bHQudmVyc2lvbiA8IDIwKSB8fFxuICAgICAgICAocmVzdWx0LmZpcmVmb3ggJiYgcmVzdWx0LnZlcnNpb24gPCAyMC4wKSB8fFxuICAgICAgICAocmVzdWx0LnNhZmFyaSAmJiByZXN1bHQudmVyc2lvbiA8IDYpIHx8XG4gICAgICAgIChyZXN1bHQub3BlcmEgJiYgcmVzdWx0LnZlcnNpb24gPCAxMC4wKSB8fFxuICAgICAgICAocmVzdWx0LmlvcyAmJiByZXN1bHQub3N2ZXJzaW9uICYmIHJlc3VsdC5vc3ZlcnNpb24uc3BsaXQoXCIuXCIpWzBdIDwgNilcbiAgICAgICAgfHwgKHJlc3VsdC5jaHJvbWl1bSAmJiByZXN1bHQudmVyc2lvbiA8IDIwKVxuICAgICAgICApIHtcbiAgICAgIHJlc3VsdC5jID0gdFxuICAgIH0gZWxzZSByZXN1bHQueCA9IHRcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHZhciBib3dzZXIgPSBkZXRlY3QodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnIDogJycpXG5cbiAgYm93c2VyLnRlc3QgPSBmdW5jdGlvbiAoYnJvd3Nlckxpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJyb3dzZXJMaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYnJvd3Nlckl0ZW0gPSBicm93c2VyTGlzdFtpXTtcbiAgICAgIGlmICh0eXBlb2YgYnJvd3Nlckl0ZW09PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGJyb3dzZXJJdGVtIGluIGJvd3Nlcikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmVyc2lvbiBwcmVjaXNpb25zIGNvdW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgZ2V0VmVyc2lvblByZWNpc2lvbihcIjEuMTAuM1wiKSAvLyAzXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdmVyc2lvblxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRWZXJzaW9uUHJlY2lzaW9uKHZlcnNpb24pIHtcbiAgICByZXR1cm4gdmVyc2lvbi5zcGxpdChcIi5cIikubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFycmF5OjptYXAgcG9seWZpbGxcbiAgICpcbiAgICogQHBhcmFtICB7QXJyYXl9IGFyclxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaXRlcmF0b3JcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXAoYXJyLCBpdGVyYXRvcikge1xuICAgIHZhciByZXN1bHQgPSBbXSwgaTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLm1hcCkge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChhcnIsIGl0ZXJhdG9yKTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaXRlcmF0b3IoYXJyW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGJyb3dzZXIgdmVyc2lvbiB3ZWlnaHRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICBjb21wYXJlVmVyc2lvbnMoWycxLjEwLjIuMScsICAnMS44LjIuMS45MCddKSAgICAvLyAxXG4gICAqICAgY29tcGFyZVZlcnNpb25zKFsnMS4wMTAuMi4xJywgJzEuMDkuMi4xLjkwJ10pOyAgLy8gMVxuICAgKiAgIGNvbXBhcmVWZXJzaW9ucyhbJzEuMTAuMi4xJywgICcxLjEwLjIuMSddKTsgICAgIC8vIDBcbiAgICogICBjb21wYXJlVmVyc2lvbnMoWycxLjEwLjIuMScsICAnMS4wODAwLjInXSk7ICAgICAvLyAtMVxuICAgKlxuICAgKiBAcGFyYW0gIHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyB2ZXJzaW9ucyB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge051bWJlcn0gY29tcGFyaXNvbiByZXN1bHRcbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2ZXJzaW9ucykge1xuICAgIC8vIDEpIGdldCBjb21tb24gcHJlY2lzaW9uIGZvciBib3RoIHZlcnNpb25zLCBmb3IgZXhhbXBsZSBmb3IgXCIxMC4wXCIgYW5kIFwiOVwiIGl0IHNob3VsZCBiZSAyXG4gICAgdmFyIHByZWNpc2lvbiA9IE1hdGgubWF4KGdldFZlcnNpb25QcmVjaXNpb24odmVyc2lvbnNbMF0pLCBnZXRWZXJzaW9uUHJlY2lzaW9uKHZlcnNpb25zWzFdKSk7XG4gICAgdmFyIGNodW5rcyA9IG1hcCh2ZXJzaW9ucywgZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgIHZhciBkZWx0YSA9IHByZWNpc2lvbiAtIGdldFZlcnNpb25QcmVjaXNpb24odmVyc2lvbik7XG5cbiAgICAgIC8vIDIpIFwiOVwiIC0+IFwiOS4wXCIgKGZvciBwcmVjaXNpb24gPSAyKVxuICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBuZXcgQXJyYXkoZGVsdGEgKyAxKS5qb2luKFwiLjBcIik7XG5cbiAgICAgIC8vIDMpIFwiOS4wXCIgLT4gW1wiMDAwMDAwMDAwXCJcIiwgXCIwMDAwMDAwMDlcIl1cbiAgICAgIHJldHVybiBtYXAodmVyc2lvbi5zcGxpdChcIi5cIiksIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KDIwIC0gY2h1bmsubGVuZ3RoKS5qb2luKFwiMFwiKSArIGNodW5rO1xuICAgICAgfSkucmV2ZXJzZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gaXRlcmF0ZSBpbiByZXZlcnNlIG9yZGVyIGJ5IHJldmVyc2VkIGNodW5rcyBhcnJheVxuICAgIHdoaWxlICgtLXByZWNpc2lvbiA+PSAwKSB7XG4gICAgICAvLyA0KSBjb21wYXJlOiBcIjAwMDAwMDAwOVwiID4gXCIwMDAwMDAwMTBcIiA9IGZhbHNlIChidXQgXCI5XCIgPiBcIjEwXCIgPSB0cnVlKVxuICAgICAgaWYgKGNodW5rc1swXVtwcmVjaXNpb25dID4gY2h1bmtzWzFdW3ByZWNpc2lvbl0pIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjaHVua3NbMF1bcHJlY2lzaW9uXSA9PT0gY2h1bmtzWzFdW3ByZWNpc2lvbl0pIHtcbiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gMCkge1xuICAgICAgICAgIC8vIGFsbCB2ZXJzaW9uIGNodW5rcyBhcmUgc2FtZVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBicm93c2VyIGlzIHVuc3VwcG9ydGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgYm93c2VyLmlzVW5zdXBwb3J0ZWRCcm93c2VyKHtcbiAgICogICAgIG1zaWU6IFwiMTBcIixcbiAgICogICAgIGZpcmVmb3g6IFwiMjNcIixcbiAgICogICAgIGNocm9tZTogXCIyOVwiLFxuICAgKiAgICAgc2FmYXJpOiBcIjUuMVwiLFxuICAgKiAgICAgb3BlcmE6IFwiMTZcIixcbiAgICogICAgIHBoYW50b206IFwiNTM0XCJcbiAgICogICB9KTtcbiAgICpcbiAgICogQHBhcmFtICB7T2JqZWN0fSAgbWluVmVyc2lvbnMgbWFwIG9mIG1pbmltYWwgdmVyc2lvbiB0byBicm93c2VyXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IFtzdHJpY3RNb2RlID0gZmFsc2VdIGZsYWcgdG8gcmV0dXJuIGZhbHNlIGlmIGJyb3dzZXIgd2Fzbid0IGZvdW5kIGluIG1hcFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbdWFdIHVzZXIgYWdlbnQgc3RyaW5nXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Vuc3VwcG9ydGVkQnJvd3NlcihtaW5WZXJzaW9ucywgc3RyaWN0TW9kZSwgdWEpIHtcbiAgICB2YXIgX2Jvd3NlciA9IGJvd3NlcjtcblxuICAgIC8vIG1ha2Ugc3RyaWN0TW9kZSBwYXJhbSBvcHRpb25hbCB3aXRoIHVhIHBhcmFtIHVzYWdlXG4gICAgaWYgKHR5cGVvZiBzdHJpY3RNb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgdWEgPSBzdHJpY3RNb2RlO1xuICAgICAgc3RyaWN0TW9kZSA9IHZvaWQoMCk7XG4gICAgfVxuXG4gICAgaWYgKHN0cmljdE1vZGUgPT09IHZvaWQoMCkpIHtcbiAgICAgIHN0cmljdE1vZGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHVhKSB7XG4gICAgICBfYm93c2VyID0gZGV0ZWN0KHVhKTtcbiAgICB9XG5cbiAgICB2YXIgdmVyc2lvbiA9IFwiXCIgKyBfYm93c2VyLnZlcnNpb247XG4gICAgZm9yICh2YXIgYnJvd3NlciBpbiBtaW5WZXJzaW9ucykge1xuICAgICAgaWYgKG1pblZlcnNpb25zLmhhc093blByb3BlcnR5KGJyb3dzZXIpKSB7XG4gICAgICAgIGlmIChfYm93c2VyW2Jyb3dzZXJdKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtaW5WZXJzaW9uc1ticm93c2VyXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnJvd3NlciB2ZXJzaW9uIGluIHRoZSBtaW5WZXJzaW9uIG1hcCBzaG91bGQgYmUgYSBzdHJpbmc6ICcgKyBicm93c2VyICsgJzogJyArIFN0cmluZyhtaW5WZXJzaW9ucykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGJyb3dzZXIgdmVyc2lvbiBhbmQgbWluIHN1cHBvcnRlZCB2ZXJzaW9uLlxuICAgICAgICAgIHJldHVybiBjb21wYXJlVmVyc2lvbnMoW3ZlcnNpb24sIG1pblZlcnNpb25zW2Jyb3dzZXJdXSkgPCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmljdE1vZGU7IC8vIG5vdCBmb3VuZFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGJyb3dzZXIgaXMgc3VwcG9ydGVkXG4gICAqXG4gICAqIEBwYXJhbSAge09iamVjdH0gbWluVmVyc2lvbnMgbWFwIG9mIG1pbmltYWwgdmVyc2lvbiB0byBicm93c2VyXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IFtzdHJpY3RNb2RlID0gZmFsc2VdIGZsYWcgdG8gcmV0dXJuIGZhbHNlIGlmIGJyb3dzZXIgd2Fzbid0IGZvdW5kIGluIG1hcFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbdWFdIHVzZXIgYWdlbnQgc3RyaW5nXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayhtaW5WZXJzaW9ucywgc3RyaWN0TW9kZSwgdWEpIHtcbiAgICByZXR1cm4gIWlzVW5zdXBwb3J0ZWRCcm93c2VyKG1pblZlcnNpb25zLCBzdHJpY3RNb2RlLCB1YSk7XG4gIH1cblxuICBib3dzZXIuaXNVbnN1cHBvcnRlZEJyb3dzZXIgPSBpc1Vuc3VwcG9ydGVkQnJvd3NlcjtcbiAgYm93c2VyLmNvbXBhcmVWZXJzaW9ucyA9IGNvbXBhcmVWZXJzaW9ucztcbiAgYm93c2VyLmNoZWNrID0gY2hlY2s7XG5cbiAgLypcbiAgICogU2V0IG91ciBkZXRlY3QgbWV0aG9kIHRvIHRoZSBtYWluIGJvd3NlciBvYmplY3Qgc28gd2UgY2FuXG4gICAqIHJldXNlIGl0IHRvIHRlc3Qgb3RoZXIgdXNlciBhZ2VudHMuXG4gICAqIFRoaXMgaXMgbmVlZGVkIHRvIGltcGxlbWVudCBmdXR1cmUgdGVzdHMuXG4gICAqL1xuICBib3dzZXIuX2RldGVjdCA9IGRldGVjdDtcblxuICAvKlxuICAgKiBTZXQgb3VyIGRldGVjdCBwdWJsaWMgbWV0aG9kIHRvIHRoZSBtYWluIGJvd3NlciBvYmplY3RcbiAgICogVGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50IGJvd3NlciBpbiBzZXJ2ZXIgc2lkZVxuICAgKi9cbiAgYm93c2VyLmRldGVjdCA9IGRldGVjdDtcbiAgcmV0dXJuIGJvd3NlclxufSk7XG4iLCIiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzQnVmZmVyRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZ1xuICB8fCBmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgY2FzZSAnaGV4JzogY2FzZSAndXRmOCc6IGNhc2UgJ3V0Zi04JzogY2FzZSAnYXNjaWknOiBjYXNlICdiaW5hcnknOiBjYXNlICdiYXNlNjQnOiBjYXNlICd1Y3MyJzogY2FzZSAndWNzLTInOiBjYXNlICd1dGYxNmxlJzogY2FzZSAndXRmLTE2bGUnOiBjYXNlICdyYXcnOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICB9XG4gICAgIH1cblxuXG5mdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4vL1xuLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4vLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbi8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbi8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cbnZhciBTdHJpbmdEZWNvZGVyID0gZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59O1xuXG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBcIjEwMFwiOiBcIkNvbnRpbnVlXCIsXG4gIFwiMTAxXCI6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICBcIjEwMlwiOiBcIlByb2Nlc3NpbmdcIixcbiAgXCIyMDBcIjogXCJPS1wiLFxuICBcIjIwMVwiOiBcIkNyZWF0ZWRcIixcbiAgXCIyMDJcIjogXCJBY2NlcHRlZFwiLFxuICBcIjIwM1wiOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsXG4gIFwiMjA0XCI6IFwiTm8gQ29udGVudFwiLFxuICBcIjIwNVwiOiBcIlJlc2V0IENvbnRlbnRcIixcbiAgXCIyMDZcIjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgXCIyMDdcIjogXCJNdWx0aS1TdGF0dXNcIixcbiAgXCIyMDhcIjogXCJBbHJlYWR5IFJlcG9ydGVkXCIsXG4gIFwiMjI2XCI6IFwiSU0gVXNlZFwiLFxuICBcIjMwMFwiOiBcIk11bHRpcGxlIENob2ljZXNcIixcbiAgXCIzMDFcIjogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICBcIjMwMlwiOiBcIkZvdW5kXCIsXG4gIFwiMzAzXCI6IFwiU2VlIE90aGVyXCIsXG4gIFwiMzA0XCI6IFwiTm90IE1vZGlmaWVkXCIsXG4gIFwiMzA1XCI6IFwiVXNlIFByb3h5XCIsXG4gIFwiMzA3XCI6IFwiVGVtcG9yYXJ5IFJlZGlyZWN0XCIsXG4gIFwiMzA4XCI6IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gIFwiNDAwXCI6IFwiQmFkIFJlcXVlc3RcIixcbiAgXCI0MDFcIjogXCJVbmF1dGhvcml6ZWRcIixcbiAgXCI0MDJcIjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gIFwiNDAzXCI6IFwiRm9yYmlkZGVuXCIsXG4gIFwiNDA0XCI6IFwiTm90IEZvdW5kXCIsXG4gIFwiNDA1XCI6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gIFwiNDA2XCI6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgXCI0MDdcIjogXCJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiLFxuICBcIjQwOFwiOiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICBcIjQwOVwiOiBcIkNvbmZsaWN0XCIsXG4gIFwiNDEwXCI6IFwiR29uZVwiLFxuICBcIjQxMVwiOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICBcIjQxMlwiOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgXCI0MTNcIjogXCJQYXlsb2FkIFRvbyBMYXJnZVwiLFxuICBcIjQxNFwiOiBcIlVSSSBUb28gTG9uZ1wiLFxuICBcIjQxNVwiOiBcIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGVcIixcbiAgXCI0MTZcIjogXCJSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcbiAgXCI0MTdcIjogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgXCI0MThcIjogXCJJJ20gYSB0ZWFwb3RcIixcbiAgXCI0MjFcIjogXCJNaXNkaXJlY3RlZCBSZXF1ZXN0XCIsXG4gIFwiNDIyXCI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgXCI0MjNcIjogXCJMb2NrZWRcIixcbiAgXCI0MjRcIjogXCJGYWlsZWQgRGVwZW5kZW5jeVwiLFxuICBcIjQyNVwiOiBcIlVub3JkZXJlZCBDb2xsZWN0aW9uXCIsXG4gIFwiNDI2XCI6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICBcIjQyOFwiOiBcIlByZWNvbmRpdGlvbiBSZXF1aXJlZFwiLFxuICBcIjQyOVwiOiBcIlRvbyBNYW55IFJlcXVlc3RzXCIsXG4gIFwiNDMxXCI6IFwiUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZVwiLFxuICBcIjQ1MVwiOiBcIlVuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zXCIsXG4gIFwiNTAwXCI6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gIFwiNTAxXCI6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIFwiNTAyXCI6IFwiQmFkIEdhdGV3YXlcIixcbiAgXCI1MDNcIjogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gIFwiNTA0XCI6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcbiAgXCI1MDZcIjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICBcIjUwN1wiOiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIFwiNTA4XCI6IFwiTG9vcCBEZXRlY3RlZFwiLFxuICBcIjUwOVwiOiBcIkJhbmR3aWR0aCBMaW1pdCBFeGNlZWRlZFwiLFxuICBcIjUxMFwiOiBcIk5vdCBFeHRlbmRlZFwiLFxuICBcIjUxMVwiOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIk9fUkRPTkxZXCI6IDAsXG4gIFwiT19XUk9OTFlcIjogMSxcbiAgXCJPX1JEV1JcIjogMixcbiAgXCJTX0lGTVRcIjogNjE0NDAsXG4gIFwiU19JRlJFR1wiOiAzMjc2OCxcbiAgXCJTX0lGRElSXCI6IDE2Mzg0LFxuICBcIlNfSUZDSFJcIjogODE5MixcbiAgXCJTX0lGQkxLXCI6IDI0NTc2LFxuICBcIlNfSUZJRk9cIjogNDA5NixcbiAgXCJTX0lGTE5LXCI6IDQwOTYwLFxuICBcIlNfSUZTT0NLXCI6IDQ5MTUyLFxuICBcIk9fQ1JFQVRcIjogNTEyLFxuICBcIk9fRVhDTFwiOiAyMDQ4LFxuICBcIk9fTk9DVFRZXCI6IDEzMTA3MixcbiAgXCJPX1RSVU5DXCI6IDEwMjQsXG4gIFwiT19BUFBFTkRcIjogOCxcbiAgXCJPX0RJUkVDVE9SWVwiOiAxMDQ4NTc2LFxuICBcIk9fTk9GT0xMT1dcIjogMjU2LFxuICBcIk9fU1lOQ1wiOiAxMjgsXG4gIFwiT19TWU1MSU5LXCI6IDIwOTcxNTIsXG4gIFwiT19OT05CTE9DS1wiOiA0LFxuICBcIlNfSVJXWFVcIjogNDQ4LFxuICBcIlNfSVJVU1JcIjogMjU2LFxuICBcIlNfSVdVU1JcIjogMTI4LFxuICBcIlNfSVhVU1JcIjogNjQsXG4gIFwiU19JUldYR1wiOiA1NixcbiAgXCJTX0lSR1JQXCI6IDMyLFxuICBcIlNfSVdHUlBcIjogMTYsXG4gIFwiU19JWEdSUFwiOiA4LFxuICBcIlNfSVJXWE9cIjogNyxcbiAgXCJTX0lST1RIXCI6IDQsXG4gIFwiU19JV09USFwiOiAyLFxuICBcIlNfSVhPVEhcIjogMSxcbiAgXCJFMkJJR1wiOiA3LFxuICBcIkVBQ0NFU1wiOiAxMyxcbiAgXCJFQUREUklOVVNFXCI6IDQ4LFxuICBcIkVBRERSTk9UQVZBSUxcIjogNDksXG4gIFwiRUFGTk9TVVBQT1JUXCI6IDQ3LFxuICBcIkVBR0FJTlwiOiAzNSxcbiAgXCJFQUxSRUFEWVwiOiAzNyxcbiAgXCJFQkFERlwiOiA5LFxuICBcIkVCQURNU0dcIjogOTQsXG4gIFwiRUJVU1lcIjogMTYsXG4gIFwiRUNBTkNFTEVEXCI6IDg5LFxuICBcIkVDSElMRFwiOiAxMCxcbiAgXCJFQ09OTkFCT1JURURcIjogNTMsXG4gIFwiRUNPTk5SRUZVU0VEXCI6IDYxLFxuICBcIkVDT05OUkVTRVRcIjogNTQsXG4gIFwiRURFQURMS1wiOiAxMSxcbiAgXCJFREVTVEFERFJSRVFcIjogMzksXG4gIFwiRURPTVwiOiAzMyxcbiAgXCJFRFFVT1RcIjogNjksXG4gIFwiRUVYSVNUXCI6IDE3LFxuICBcIkVGQVVMVFwiOiAxNCxcbiAgXCJFRkJJR1wiOiAyNyxcbiAgXCJFSE9TVFVOUkVBQ0hcIjogNjUsXG4gIFwiRUlEUk1cIjogOTAsXG4gIFwiRUlMU0VRXCI6IDkyLFxuICBcIkVJTlBST0dSRVNTXCI6IDM2LFxuICBcIkVJTlRSXCI6IDQsXG4gIFwiRUlOVkFMXCI6IDIyLFxuICBcIkVJT1wiOiA1LFxuICBcIkVJU0NPTk5cIjogNTYsXG4gIFwiRUlTRElSXCI6IDIxLFxuICBcIkVMT09QXCI6IDYyLFxuICBcIkVNRklMRVwiOiAyNCxcbiAgXCJFTUxJTktcIjogMzEsXG4gIFwiRU1TR1NJWkVcIjogNDAsXG4gIFwiRU1VTFRJSE9QXCI6IDk1LFxuICBcIkVOQU1FVE9PTE9OR1wiOiA2MyxcbiAgXCJFTkVURE9XTlwiOiA1MCxcbiAgXCJFTkVUUkVTRVRcIjogNTIsXG4gIFwiRU5FVFVOUkVBQ0hcIjogNTEsXG4gIFwiRU5GSUxFXCI6IDIzLFxuICBcIkVOT0JVRlNcIjogNTUsXG4gIFwiRU5PREFUQVwiOiA5NixcbiAgXCJFTk9ERVZcIjogMTksXG4gIFwiRU5PRU5UXCI6IDIsXG4gIFwiRU5PRVhFQ1wiOiA4LFxuICBcIkVOT0xDS1wiOiA3NyxcbiAgXCJFTk9MSU5LXCI6IDk3LFxuICBcIkVOT01FTVwiOiAxMixcbiAgXCJFTk9NU0dcIjogOTEsXG4gIFwiRU5PUFJPVE9PUFRcIjogNDIsXG4gIFwiRU5PU1BDXCI6IDI4LFxuICBcIkVOT1NSXCI6IDk4LFxuICBcIkVOT1NUUlwiOiA5OSxcbiAgXCJFTk9TWVNcIjogNzgsXG4gIFwiRU5PVENPTk5cIjogNTcsXG4gIFwiRU5PVERJUlwiOiAyMCxcbiAgXCJFTk9URU1QVFlcIjogNjYsXG4gIFwiRU5PVFNPQ0tcIjogMzgsXG4gIFwiRU5PVFNVUFwiOiA0NSxcbiAgXCJFTk9UVFlcIjogMjUsXG4gIFwiRU5YSU9cIjogNixcbiAgXCJFT1BOT1RTVVBQXCI6IDEwMixcbiAgXCJFT1ZFUkZMT1dcIjogODQsXG4gIFwiRVBFUk1cIjogMSxcbiAgXCJFUElQRVwiOiAzMixcbiAgXCJFUFJPVE9cIjogMTAwLFxuICBcIkVQUk9UT05PU1VQUE9SVFwiOiA0MyxcbiAgXCJFUFJPVE9UWVBFXCI6IDQxLFxuICBcIkVSQU5HRVwiOiAzNCxcbiAgXCJFUk9GU1wiOiAzMCxcbiAgXCJFU1BJUEVcIjogMjksXG4gIFwiRVNSQ0hcIjogMyxcbiAgXCJFU1RBTEVcIjogNzAsXG4gIFwiRVRJTUVcIjogMTAxLFxuICBcIkVUSU1FRE9VVFwiOiA2MCxcbiAgXCJFVFhUQlNZXCI6IDI2LFxuICBcIkVXT1VMREJMT0NLXCI6IDM1LFxuICBcIkVYREVWXCI6IDE4LFxuICBcIlNJR0hVUFwiOiAxLFxuICBcIlNJR0lOVFwiOiAyLFxuICBcIlNJR1FVSVRcIjogMyxcbiAgXCJTSUdJTExcIjogNCxcbiAgXCJTSUdUUkFQXCI6IDUsXG4gIFwiU0lHQUJSVFwiOiA2LFxuICBcIlNJR0lPVFwiOiA2LFxuICBcIlNJR0JVU1wiOiAxMCxcbiAgXCJTSUdGUEVcIjogOCxcbiAgXCJTSUdLSUxMXCI6IDksXG4gIFwiU0lHVVNSMVwiOiAzMCxcbiAgXCJTSUdTRUdWXCI6IDExLFxuICBcIlNJR1VTUjJcIjogMzEsXG4gIFwiU0lHUElQRVwiOiAxMyxcbiAgXCJTSUdBTFJNXCI6IDE0LFxuICBcIlNJR1RFUk1cIjogMTUsXG4gIFwiU0lHQ0hMRFwiOiAyMCxcbiAgXCJTSUdDT05UXCI6IDE5LFxuICBcIlNJR1NUT1BcIjogMTcsXG4gIFwiU0lHVFNUUFwiOiAxOCxcbiAgXCJTSUdUVElOXCI6IDIxLFxuICBcIlNJR1RUT1VcIjogMjIsXG4gIFwiU0lHVVJHXCI6IDE2LFxuICBcIlNJR1hDUFVcIjogMjQsXG4gIFwiU0lHWEZTWlwiOiAyNSxcbiAgXCJTSUdWVEFMUk1cIjogMjYsXG4gIFwiU0lHUFJPRlwiOiAyNyxcbiAgXCJTSUdXSU5DSFwiOiAyOCxcbiAgXCJTSUdJT1wiOiAyMyxcbiAgXCJTSUdTWVNcIjogMTIsXG4gIFwiU1NMX09QX0FMTFwiOiAyMTQ3NDg2NzE5LFxuICBcIlNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05cIjogMjYyMTQ0LFxuICBcIlNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0VcIjogNDE5NDMwNCxcbiAgXCJTU0xfT1BfQ0lTQ09fQU5ZQ09OTkVDVFwiOiAzMjc2OCxcbiAgXCJTU0xfT1BfQ09PS0lFX0VYQ0hBTkdFXCI6IDgxOTIsXG4gIFwiU1NMX09QX0NSWVBUT1BST19UTFNFWFRfQlVHXCI6IDIxNDc0ODM2NDgsXG4gIFwiU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UU1wiOiAyMDQ4LFxuICBcIlNTTF9PUF9FUEhFTUVSQUxfUlNBXCI6IDAsXG4gIFwiU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVFwiOiA0LFxuICBcIlNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUlwiOiAzMixcbiAgXCJTU0xfT1BfTUlDUk9TT0ZUX1NFU1NfSURfQlVHXCI6IDEsXG4gIFwiU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkdcIjogMCxcbiAgXCJTU0xfT1BfTkVUU0NBUEVfQ0FfRE5fQlVHXCI6IDUzNjg3MDkxMixcbiAgXCJTU0xfT1BfTkVUU0NBUEVfQ0hBTExFTkdFX0JVR1wiOiAyLFxuICBcIlNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHXCI6IDEwNzM3NDE4MjQsXG4gIFwiU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHXCI6IDgsXG4gIFwiU1NMX09QX05PX0NPTVBSRVNTSU9OXCI6IDEzMTA3MixcbiAgXCJTU0xfT1BfTk9fUVVFUllfTVRVXCI6IDQwOTYsXG4gIFwiU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OXCI6IDY1NTM2LFxuICBcIlNTTF9PUF9OT19TU0x2MlwiOiAxNjc3NzIxNixcbiAgXCJTU0xfT1BfTk9fU1NMdjNcIjogMzM1NTQ0MzIsXG4gIFwiU1NMX09QX05PX1RJQ0tFVFwiOiAxNjM4NCxcbiAgXCJTU0xfT1BfTk9fVExTdjFcIjogNjcxMDg4NjQsXG4gIFwiU1NMX09QX05PX1RMU3YxXzFcIjogMjY4NDM1NDU2LFxuICBcIlNTTF9PUF9OT19UTFN2MV8yXCI6IDEzNDIxNzcyOCxcbiAgXCJTU0xfT1BfUEtDUzFfQ0hFQ0tfMVwiOiAwLFxuICBcIlNTTF9PUF9QS0NTMV9DSEVDS18yXCI6IDAsXG4gIFwiU1NMX09QX1NJTkdMRV9ESF9VU0VcIjogMTA0ODU3NixcbiAgXCJTU0xfT1BfU0lOR0xFX0VDREhfVVNFXCI6IDUyNDI4OCxcbiAgXCJTU0xfT1BfU1NMRUFZXzA4MF9DTElFTlRfREhfQlVHXCI6IDEyOCxcbiAgXCJTU0xfT1BfU1NMUkVGMl9SRVVTRV9DRVJUX1RZUEVfQlVHXCI6IDAsXG4gIFwiU1NMX09QX1RMU19CTE9DS19QQURESU5HX0JVR1wiOiA1MTIsXG4gIFwiU1NMX09QX1RMU19ENV9CVUdcIjogMjU2LFxuICBcIlNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHXCI6IDgzODg2MDgsXG4gIFwiRU5HSU5FX01FVEhPRF9EU0FcIjogMixcbiAgXCJFTkdJTkVfTUVUSE9EX0RIXCI6IDQsXG4gIFwiRU5HSU5FX01FVEhPRF9SQU5EXCI6IDgsXG4gIFwiRU5HSU5FX01FVEhPRF9FQ0RIXCI6IDE2LFxuICBcIkVOR0lORV9NRVRIT0RfRUNEU0FcIjogMzIsXG4gIFwiRU5HSU5FX01FVEhPRF9DSVBIRVJTXCI6IDY0LFxuICBcIkVOR0lORV9NRVRIT0RfRElHRVNUU1wiOiAxMjgsXG4gIFwiRU5HSU5FX01FVEhPRF9TVE9SRVwiOiAyNTYsXG4gIFwiRU5HSU5FX01FVEhPRF9QS0VZX01FVEhTXCI6IDUxMixcbiAgXCJFTkdJTkVfTUVUSE9EX1BLRVlfQVNOMV9NRVRIU1wiOiAxMDI0LFxuICBcIkVOR0lORV9NRVRIT0RfQUxMXCI6IDY1NTM1LFxuICBcIkVOR0lORV9NRVRIT0RfTk9ORVwiOiAwLFxuICBcIkRIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUVcIjogMixcbiAgXCJESF9DSEVDS19QX05PVF9QUklNRVwiOiAxLFxuICBcIkRIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1JcIjogNCxcbiAgXCJESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SXCI6IDgsXG4gIFwiTlBOX0VOQUJMRURcIjogMSxcbiAgXCJSU0FfUEtDUzFfUEFERElOR1wiOiAxLFxuICBcIlJTQV9TU0xWMjNfUEFERElOR1wiOiAyLFxuICBcIlJTQV9OT19QQURESU5HXCI6IDMsXG4gIFwiUlNBX1BLQ1MxX09BRVBfUEFERElOR1wiOiA0LFxuICBcIlJTQV9YOTMxX1BBRERJTkdcIjogNSxcbiAgXCJSU0FfUEtDUzFfUFNTX1BBRERJTkdcIjogNixcbiAgXCJQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRURcIjogMixcbiAgXCJQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRFwiOiA0LFxuICBcIlBPSU5UX0NPTlZFUlNJT05fSFlCUklEXCI6IDYsXG4gIFwiRl9PS1wiOiAwLFxuICBcIlJfT0tcIjogNCxcbiAgXCJXX09LXCI6IDIsXG4gIFwiWF9PS1wiOiAxLFxuICBcIlVWX1VEUF9SRVVTRUFERFJcIjogNFxufVxuIiwiLyohXG4gKiBjb3B5LXRvIC0gaW5kZXguanNcbiAqIENvcHlyaWdodChjKSAyMDE0IGRlYWRfaG9yc2UgPGRlYWRfaG9yc2VAcXEuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIHNsaWNlKCkgcmVmZXJlbmNlLlxuICovXG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuLyoqXG4gKiBFeHBvc2UgY29weVxuICpcbiAqIGBgYFxuICogY29weSh7Zm9vOiAnbmFyJywgaGVsbG86ICdjb3B5J30pLnRvKHtoZWxsbzogJ3dvcmxkJ30pO1xuICogY29weSh7Zm9vOiAnbmFyJywgaGVsbG86ICdjb3B5J30pLnRvQ292ZXIoe2hlbGxvOiAnd29ybGQnfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKiBAcmV0dXJuIHtDb3B5fVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQ29weTtcblxuXG4vKipcbiAqIENvcHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gd2l0aEFjY2Vzc1xuICovXG5cbmZ1bmN0aW9uIENvcHkoc3JjLCB3aXRoQWNjZXNzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb3B5KSkgcmV0dXJuIG5ldyBDb3B5KHNyYywgd2l0aEFjY2Vzcyk7XG4gIHRoaXMuc3JjID0gc3JjO1xuICB0aGlzLl93aXRoQWNjZXNzID0gd2l0aEFjY2Vzcztcbn1cblxuLyoqXG4gKiBjb3B5IHByb3BlcnRpZXMgaW5jbHVkZSBnZXR0ZXIgYW5kIHNldHRlclxuICogQHBhcmFtIHtbdHlwZV19IHZhbCBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtbdHlwZV19IFtkZXNjcmlwdGlvbl1cbiAqL1xuXG5Db3B5LnByb3RvdHlwZS53aXRoQWNjZXNzID0gZnVuY3Rpb24gKHcpIHtcbiAgdGhpcy5fd2l0aEFjY2VzcyA9IHcgIT09IGZhbHNlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogcGljayBrZXlzIGluIHNyY1xuICpcbiAqIEBhcGk6IHB1YmxpY1xuICovXG5cbkNvcHkucHJvdG90eXBlLnBpY2sgPSBmdW5jdGlvbihrZXlzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gIH1cbiAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogY29weSBzcmMgdG8gdGFyZ2V0LFxuICogZG8gbm90IGNvdmVyIGFueSBwcm9wZXJ0eSB0YXJnZXQgaGFzXG4gKiBAcGFyYW0ge09iamVjdH0gdG9cbiAqXG4gKiBAYXBpOiBwdWJsaWNcbiAqL1xuXG5Db3B5LnByb3RvdHlwZS50byA9IGZ1bmN0aW9uKHRvKSB7XG4gIHRvID0gdG8gfHwge307XG5cbiAgaWYgKCF0aGlzLnNyYykgcmV0dXJuIHRvO1xuICB2YXIga2V5cyA9IHRoaXMua2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnNyYyk7XG5cbiAgaWYgKCF0aGlzLl93aXRoQWNjZXNzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKHRvW2tleV0gIT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICB0b1trZXldID0gdGhpcy5zcmNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFub3REZWZpbmVkKHRvLCBrZXkpKSBjb250aW51ZTtcbiAgICB2YXIgZ2V0dGVyID0gdGhpcy5zcmMuX19sb29rdXBHZXR0ZXJfXyhrZXkpO1xuICAgIHZhciBzZXR0ZXIgPSB0aGlzLnNyYy5fX2xvb2t1cFNldHRlcl9fKGtleSk7XG4gICAgaWYgKGdldHRlcikgdG8uX19kZWZpbmVHZXR0ZXJfXyhrZXksIGdldHRlcik7XG4gICAgaWYgKHNldHRlcikgdG8uX19kZWZpbmVTZXR0ZXJfXyhrZXksIHNldHRlcik7XG5cbiAgICBpZiAoIWdldHRlciAmJiAhc2V0dGVyKSB7XG4gICAgICB0b1trZXldID0gdGhpcy5zcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufTtcblxuLyoqXG4gKiBjb3B5IHNyYyB0byB0YXJnZXQsXG4gKiBvdmVycmlkZSBhbnkgcHJvcGVydHkgdGFyZ2V0IGhhc1xuICogQHBhcmFtIHtPYmplY3R9IHRvXG4gKlxuICogQGFwaTogcHVibGljXG4gKi9cblxuQ29weS5wcm90b3R5cGUudG9Db3ZlciA9IGZ1bmN0aW9uKHRvKSB7XG4gIHZhciBrZXlzID0gdGhpcy5rZXlzIHx8IE9iamVjdC5rZXlzKHRoaXMuc3JjKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBkZWxldGUgdG9ba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdGhpcy5zcmMuX19sb29rdXBHZXR0ZXJfXyhrZXkpO1xuICAgIHZhciBzZXR0ZXIgPSB0aGlzLnNyYy5fX2xvb2t1cFNldHRlcl9fKGtleSk7XG4gICAgaWYgKGdldHRlcikgdG8uX19kZWZpbmVHZXR0ZXJfXyhrZXksIGdldHRlcik7XG4gICAgaWYgKHNldHRlcikgdG8uX19kZWZpbmVTZXR0ZXJfXyhrZXksIHNldHRlcik7XG5cbiAgICBpZiAoIWdldHRlciAmJiAhc2V0dGVyKSB7XG4gICAgICB0b1trZXldID0gdGhpcy5zcmNba2V5XTtcbiAgICB9XG4gIH1cbn07XG5cbkNvcHkucHJvdG90eXBlLm92ZXJyaWRlID0gQ29weS5wcm90b3R5cGUudG9Db3ZlcjtcblxuLyoqXG4gKiBhcHBlbmQgYW5vdGhlciBvYmplY3QgdG8gc3JjXG4gKiBAcGFyYW0ge09ian0gb2JqXG4gKiBAcmV0dXJuIHtDb3B5fVxuICovXG5cbkNvcHkucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHNyYyA9IHt9O1xuICB0aGlzLnRvKHNyYyk7XG4gIHRoaXMuc3JjID0gb2JqO1xuICB0aGlzLnRvKHNyYyk7XG4gIHRoaXMuc3JjID0gc3JjO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBjaGVjayBvYmpba2V5XSBpZiBub3QgZGVmaWVuZFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBub3REZWZpbmVkKG9iaiwga2V5KSB7XG4gIHJldHVybiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkXG4gICAgJiYgb2JqLl9fbG9va3VwR2V0dGVyX18oa2V5KSA9PT0gdW5kZWZpbmVkXG4gICAgJiYgb2JqLl9fbG9va3VwU2V0dGVyX18oa2V5KSA9PT0gdW5kZWZpbmVkO1xufVxuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5mcm9tO1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJyk7XG52YXIgJEpTT04gPSBjb3JlLkpTT04gfHwgKGNvcmUuSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuICRKU09OLnN0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJndW1lbnRzKTtcbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuYXNzaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZScpO1xudmFyICRPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGUoUCwgRCkge1xuICByZXR1cm4gJE9iamVjdC5jcmVhdGUoUCwgRCk7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xudmFyICRPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKSB7XG4gIHJldHVybiAkT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuZW50cmllcztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG59O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5cztcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UudHJ5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5zZXRJbW1lZGlhdGU7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5TdHJpbmcuZnJvbUNvZGVQb2ludDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaGFzSW5zdGFuY2UnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fd2tzLWV4dCcpLmYoJ2l0ZXJhdG9yJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjcnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgsIHZhbHVlKSB7XG4gIGlmIChpbmRleCBpbiBvYmplY3QpICRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgSVNfV1JBUCA9IHR5cGUgJiAkZXhwb3J0Llc7XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXTtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBrZXksIG93biwgb3V0O1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChvd24gJiYgaGFzKGV4cG9ydHMsIGtleSkpIGNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24gKEMpIHtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDKSB7XG4gICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQygpO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZiAoSVNfUFJPVE8pIHtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZiAodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSkgaGlkZShleHBQcm90bywga2V5LCBvdXQpO1xuICAgIH1cbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB0cnVlO1xuIiwidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIFMgPSBTeW1ib2woKTtcbiAgdmFyIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgd2hpbGUgKGFMZW4gPiBpbmRleCkge1xuICAgIHZhciBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIGlmIChpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKSBUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iLCJ2YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGlzRW51bSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXNFbnRyaWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdChpdCk7XG4gICAgdmFyIGtleXMgPSBnZXRLZXlzKE8pO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChPLCBrZXkgPSBrZXlzW2krK10pKSB7XG4gICAgICByZXN1bHQucHVzaChpc0VudHJpZXMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGU6IGZhbHNlLCB2OiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGU6IHRydWUsIHY6IGUgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwidmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKHNhZmUgJiYgdGFyZ2V0W2tleV0pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBoaWRlKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiB3a3NFeHQuZihuYW1lKSB9KTtcbn07XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikgeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKG1hcHBpbmcpIG1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDKCk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvciAocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBIQVNfSU5TVEFOQ0UgPSByZXF1aXJlKCcuL193a3MnKSgnaGFzSW5zdGFuY2UnKTtcbnZhciBGdW5jdGlvblByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gMTkuMi4zLjYgRnVuY3Rpb24ucHJvdG90eXBlW0BAaGFzSW5zdGFuY2VdKFYpXG5pZiAoIShIQVNfSU5TVEFOQ0UgaW4gRnVuY3Rpb25Qcm90bykpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoRnVuY3Rpb25Qcm90bywgSEFTX0lOU1RBTkNFLCB7IHZhbHVlOiBmdW5jdGlvbiAoTykge1xuICBpZiAodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFpc09iamVjdCh0aGlzLnByb3RvdHlwZSkpIHJldHVybiBPIGluc3RhbmNlb2YgdGhpcztcbiAgLy8gZm9yIGVudmlyb25tZW50IHcvbyBuYXRpdmUgYEBAaGFzSW5zdGFuY2VgIGxvZ2ljIGVub3VnaCBgaW5zdGFuY2VvZmAsIGJ1dCBhZGQgdGhpczpcbiAgd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSkgaWYgKHRoaXMucHJvdG90eXBlID09PSBPKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufSB9KTtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpLmY7XG59KTtcbiIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGNvZGU7XG4gICAgd2hpbGUgKGFMZW4gPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgTUVUQSA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIHdrc0RlZmluZSA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKTtcbnZhciBlbnVtS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QRCA9ICRHT1BELmY7XG52YXIgZFAgPSAkRFAuZjtcbnZhciBnT1BOID0gZ09QTkV4dC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSB3a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSB3a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyIFVTRV9OQVRJVkUgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKGl0KSB7XG4gICAgcmV0dXJuICRlbnRyaWVzKGl0KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWZpbmFsbHlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdQcm9taXNlJywgeyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKTtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gIHJldHVybiB0aGlzLnRoZW4oXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgfSA6IG9uRmluYWxseSxcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHlcbiAgKTtcbn0gfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpO1xuIiwicmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIFRPX1NUUklOR19UQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxudmFyIERPTUl0ZXJhYmxlcyA9ICgnQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCwnICtcbiAgJ0RPTVRva2VuTGlzdCxEYXRhVHJhbnNmZXJJdGVtTGlzdCxGaWxlTGlzdCxIVE1MQWxsQ29sbGVjdGlvbixIVE1MQ29sbGVjdGlvbixIVE1MRm9ybUVsZW1lbnQsSFRNTFNlbGVjdEVsZW1lbnQsJyArXG4gICdNZWRpYUxpc3QsTWltZVR5cGVBcnJheSxOYW1lZE5vZGVNYXAsTm9kZUxpc3QsUGFpbnRSZXF1ZXN0TGlzdCxQbHVnaW4sUGx1Z2luQXJyYXksU1ZHTGVuZ3RoTGlzdCxTVkdOdW1iZXJMaXN0LCcgK1xuICAnU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsJyArXG4gICdUZXh0VHJhY2tMaXN0LFRvdWNoTGlzdCcpLnNwbGl0KCcsJyk7XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgRE9NSXRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gRE9NSXRlcmFibGVzW2ldO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn1cbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHRhc2sgPSByZXF1aXJlKCcuL190YXNrJyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiwge1xuICBzZXRJbW1lZGlhdGU6ICR0YXNrLnNldCxcbiAgY2xlYXJJbW1lZGlhdGU6ICR0YXNrLmNsZWFyXG59KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIi8qXHJcbiAqIERhdGUgRm9ybWF0IDEuMi4zXHJcbiAqIChjKSAyMDA3LTIwMDkgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XHJcbiAqIE1JVCBsaWNlbnNlXHJcbiAqXHJcbiAqIEluY2x1ZGVzIGVuaGFuY2VtZW50cyBieSBTY290dCBUcmVuZGEgPHNjb3R0LnRyZW5kYS5uZXQ+XHJcbiAqIGFuZCBLcmlzIEtvd2FsIDxjaXhhci5jb20vfmtyaXMua293YWwvPlxyXG4gKlxyXG4gKiBBY2NlcHRzIGEgZGF0ZSwgYSBtYXNrLCBvciBhIGRhdGUgYW5kIGEgbWFzay5cclxuICogUmV0dXJucyBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBkYXRlLlxyXG4gKiBUaGUgZGF0ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBkYXRlL3RpbWUuXHJcbiAqIFRoZSBtYXNrIGRlZmF1bHRzIHRvIGRhdGVGb3JtYXQubWFza3MuZGVmYXVsdC5cclxuICovXHJcblxyXG4oZnVuY3Rpb24oZ2xvYmFsKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICB2YXIgZGF0ZUZvcm1hdCA9IChmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIHRva2VuID0gL2R7MSw0fXxtezEsNH18eXkoPzp5eSk/fChbSGhNc1R0XSlcXDE/fFtMbG9TWldOXXwnW14nXSonfCdbXiddKicvZztcclxuICAgICAgdmFyIHRpbWV6b25lID0gL1xcYig/OltQTUNFQV1bU0RQXVR8KD86UGFjaWZpY3xNb3VudGFpbnxDZW50cmFsfEVhc3Rlcm58QXRsYW50aWMpICg/OlN0YW5kYXJkfERheWxpZ2h0fFByZXZhaWxpbmcpIFRpbWV8KD86R01UfFVUQykoPzpbLStdXFxkezR9KT8pXFxiL2c7XHJcbiAgICAgIHZhciB0aW1lem9uZUNsaXAgPSAvW14tK1xcZEEtWl0vZztcclxuICBcclxuICAgICAgLy8gUmVnZXhlcyBhbmQgc3VwcG9ydGluZyBmdW5jdGlvbnMgYXJlIGNhY2hlZCB0aHJvdWdoIGNsb3N1cmVcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlLCBtYXNrLCB1dGMsIGdtdCkge1xyXG4gIFxyXG4gICAgICAgIC8vIFlvdSBjYW4ndCBwcm92aWRlIHV0YyBpZiB5b3Ugc2tpcCBvdGhlciBhcmdzICh1c2UgdGhlICdVVEM6JyBtYXNrIHByZWZpeClcclxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBraW5kT2YoZGF0ZSkgPT09ICdzdHJpbmcnICYmICEvXFxkLy50ZXN0KGRhdGUpKSB7XHJcbiAgICAgICAgICBtYXNrID0gZGF0ZTtcclxuICAgICAgICAgIGRhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGRhdGUgPSBkYXRlIHx8IG5ldyBEYXRlO1xyXG4gIFxyXG4gICAgICAgIGlmKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGlmIChpc05hTihkYXRlKSkge1xyXG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIGRhdGUnKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgbWFzayA9IFN0cmluZyhkYXRlRm9ybWF0Lm1hc2tzW21hc2tdIHx8IG1hc2sgfHwgZGF0ZUZvcm1hdC5tYXNrc1snZGVmYXVsdCddKTtcclxuICBcclxuICAgICAgICAvLyBBbGxvdyBzZXR0aW5nIHRoZSB1dGMvZ210IGFyZ3VtZW50IHZpYSB0aGUgbWFza1xyXG4gICAgICAgIHZhciBtYXNrU2xpY2UgPSBtYXNrLnNsaWNlKDAsIDQpO1xyXG4gICAgICAgIGlmIChtYXNrU2xpY2UgPT09ICdVVEM6JyB8fCBtYXNrU2xpY2UgPT09ICdHTVQ6Jykge1xyXG4gICAgICAgICAgbWFzayA9IG1hc2suc2xpY2UoNCk7XHJcbiAgICAgICAgICB1dGMgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKG1hc2tTbGljZSA9PT0gJ0dNVDonKSB7XHJcbiAgICAgICAgICAgIGdtdCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIHZhciBfID0gdXRjID8gJ2dldFVUQycgOiAnZ2V0JztcclxuICAgICAgICB2YXIgZCA9IGRhdGVbXyArICdEYXRlJ10oKTtcclxuICAgICAgICB2YXIgRCA9IGRhdGVbXyArICdEYXknXSgpO1xyXG4gICAgICAgIHZhciBtID0gZGF0ZVtfICsgJ01vbnRoJ10oKTtcclxuICAgICAgICB2YXIgeSA9IGRhdGVbXyArICdGdWxsWWVhciddKCk7XHJcbiAgICAgICAgdmFyIEggPSBkYXRlW18gKyAnSG91cnMnXSgpO1xyXG4gICAgICAgIHZhciBNID0gZGF0ZVtfICsgJ01pbnV0ZXMnXSgpO1xyXG4gICAgICAgIHZhciBzID0gZGF0ZVtfICsgJ1NlY29uZHMnXSgpO1xyXG4gICAgICAgIHZhciBMID0gZGF0ZVtfICsgJ01pbGxpc2Vjb25kcyddKCk7XHJcbiAgICAgICAgdmFyIG8gPSB1dGMgPyAwIDogZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG4gICAgICAgIHZhciBXID0gZ2V0V2VlayhkYXRlKTtcclxuICAgICAgICB2YXIgTiA9IGdldERheU9mV2VlayhkYXRlKTtcclxuICAgICAgICB2YXIgZmxhZ3MgPSB7XHJcbiAgICAgICAgICBkOiAgICBkLFxyXG4gICAgICAgICAgZGQ6ICAgcGFkKGQpLFxyXG4gICAgICAgICAgZGRkOiAgZGF0ZUZvcm1hdC5pMThuLmRheU5hbWVzW0RdLFxyXG4gICAgICAgICAgZGRkZDogZGF0ZUZvcm1hdC5pMThuLmRheU5hbWVzW0QgKyA3XSxcclxuICAgICAgICAgIG06ICAgIG0gKyAxLFxyXG4gICAgICAgICAgbW06ICAgcGFkKG0gKyAxKSxcclxuICAgICAgICAgIG1tbTogIGRhdGVGb3JtYXQuaTE4bi5tb250aE5hbWVzW21dLFxyXG4gICAgICAgICAgbW1tbTogZGF0ZUZvcm1hdC5pMThuLm1vbnRoTmFtZXNbbSArIDEyXSxcclxuICAgICAgICAgIHl5OiAgIFN0cmluZyh5KS5zbGljZSgyKSxcclxuICAgICAgICAgIHl5eXk6IHksXHJcbiAgICAgICAgICBoOiAgICBIICUgMTIgfHwgMTIsXHJcbiAgICAgICAgICBoaDogICBwYWQoSCAlIDEyIHx8IDEyKSxcclxuICAgICAgICAgIEg6ICAgIEgsXHJcbiAgICAgICAgICBISDogICBwYWQoSCksXHJcbiAgICAgICAgICBNOiAgICBNLFxyXG4gICAgICAgICAgTU06ICAgcGFkKE0pLFxyXG4gICAgICAgICAgczogICAgcyxcclxuICAgICAgICAgIHNzOiAgIHBhZChzKSxcclxuICAgICAgICAgIGw6ICAgIHBhZChMLCAzKSxcclxuICAgICAgICAgIEw6ICAgIHBhZChNYXRoLnJvdW5kKEwgLyAxMCkpLFxyXG4gICAgICAgICAgdDogICAgSCA8IDEyID8gJ2EnICA6ICdwJyxcclxuICAgICAgICAgIHR0OiAgIEggPCAxMiA/ICdhbScgOiAncG0nLFxyXG4gICAgICAgICAgVDogICAgSCA8IDEyID8gJ0EnICA6ICdQJyxcclxuICAgICAgICAgIFRUOiAgIEggPCAxMiA/ICdBTScgOiAnUE0nLFxyXG4gICAgICAgICAgWjogICAgZ210ID8gJ0dNVCcgOiB1dGMgPyAnVVRDJyA6IChTdHJpbmcoZGF0ZSkubWF0Y2godGltZXpvbmUpIHx8IFsnJ10pLnBvcCgpLnJlcGxhY2UodGltZXpvbmVDbGlwLCAnJyksXHJcbiAgICAgICAgICBvOiAgICAobyA+IDAgPyAnLScgOiAnKycpICsgcGFkKE1hdGguZmxvb3IoTWF0aC5hYnMobykgLyA2MCkgKiAxMDAgKyBNYXRoLmFicyhvKSAlIDYwLCA0KSxcclxuICAgICAgICAgIFM6ICAgIFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXVtkICUgMTAgPiAzID8gMCA6IChkICUgMTAwIC0gZCAlIDEwICE9IDEwKSAqIGQgJSAxMF0sXHJcbiAgICAgICAgICBXOiAgICBXLFxyXG4gICAgICAgICAgTjogICAgTlxyXG4gICAgICAgIH07XHJcbiAgXHJcbiAgICAgICAgcmV0dXJuIG1hc2sucmVwbGFjZSh0b2tlbiwgZnVuY3Rpb24gKG1hdGNoKSB7XHJcbiAgICAgICAgICBpZiAobWF0Y2ggaW4gZmxhZ3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZsYWdzW21hdGNoXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBtYXRjaC5zbGljZSgxLCBtYXRjaC5sZW5ndGggLSAxKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIH0pKCk7XHJcblxyXG4gIGRhdGVGb3JtYXQubWFza3MgPSB7XHJcbiAgICAnZGVmYXVsdCc6ICAgICAgICAgICAgICAgJ2RkZCBtbW0gZGQgeXl5eSBISDpNTTpzcycsXHJcbiAgICAnc2hvcnREYXRlJzogICAgICAgICAgICAgJ20vZC95eScsXHJcbiAgICAnbWVkaXVtRGF0ZSc6ICAgICAgICAgICAgJ21tbSBkLCB5eXl5JyxcclxuICAgICdsb25nRGF0ZSc6ICAgICAgICAgICAgICAnbW1tbSBkLCB5eXl5JyxcclxuICAgICdmdWxsRGF0ZSc6ICAgICAgICAgICAgICAnZGRkZCwgbW1tbSBkLCB5eXl5JyxcclxuICAgICdzaG9ydFRpbWUnOiAgICAgICAgICAgICAnaDpNTSBUVCcsXHJcbiAgICAnbWVkaXVtVGltZSc6ICAgICAgICAgICAgJ2g6TU06c3MgVFQnLFxyXG4gICAgJ2xvbmdUaW1lJzogICAgICAgICAgICAgICdoOk1NOnNzIFRUIFonLFxyXG4gICAgJ2lzb0RhdGUnOiAgICAgICAgICAgICAgICd5eXl5LW1tLWRkJyxcclxuICAgICdpc29UaW1lJzogICAgICAgICAgICAgICAnSEg6TU06c3MnLFxyXG4gICAgJ2lzb0RhdGVUaW1lJzogICAgICAgICAgICd5eXl5LW1tLWRkXFwnVFxcJ0hIOk1NOnNzbycsXHJcbiAgICAnaXNvVXRjRGF0ZVRpbWUnOiAgICAgICAgJ1VUQzp5eXl5LW1tLWRkXFwnVFxcJ0hIOk1NOnNzXFwnWlxcJycsXHJcbiAgICAnZXhwaXJlc0hlYWRlckZvcm1hdCc6ICAgJ2RkZCwgZGQgbW1tIHl5eXkgSEg6TU06c3MgWidcclxuICB9O1xyXG5cclxuICAvLyBJbnRlcm5hdGlvbmFsaXphdGlvbiBzdHJpbmdzXHJcbiAgZGF0ZUZvcm1hdC5pMThuID0ge1xyXG4gICAgZGF5TmFtZXM6IFtcclxuICAgICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsXHJcbiAgICAgICdTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSdcclxuICAgIF0sXHJcbiAgICBtb250aE5hbWVzOiBbXHJcbiAgICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYycsXHJcbiAgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xyXG4gICAgXVxyXG4gIH07XHJcblxyXG5mdW5jdGlvbiBwYWQodmFsLCBsZW4pIHtcclxuICB2YWwgPSBTdHJpbmcodmFsKTtcclxuICBsZW4gPSBsZW4gfHwgMjtcclxuICB3aGlsZSAodmFsLmxlbmd0aCA8IGxlbikge1xyXG4gICAgdmFsID0gJzAnICsgdmFsO1xyXG4gIH1cclxuICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBJU08gODYwMSB3ZWVrIG51bWJlclxyXG4gKiBCYXNlZCBvbiBjb21tZW50cyBmcm9tXHJcbiAqIGh0dHA6Ly90ZWNoYmxvZy5wcm9jdXJpb3Mubmwvay9uNjE4L25ld3Mvdmlldy8zMzc5Ni8xNDg2My9DYWxjdWxhdGUtSVNPLTg2MDEtd2Vlay1hbmQteWVhci1pbi1qYXZhc2NyaXB0Lmh0bWxcclxuICpcclxuICogQHBhcmFtICB7T2JqZWN0fSBgZGF0ZWBcclxuICogQHJldHVybiB7TnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0V2VlayhkYXRlKSB7XHJcbiAgLy8gUmVtb3ZlIHRpbWUgY29tcG9uZW50cyBvZiBkYXRlXHJcbiAgdmFyIHRhcmdldFRodXJzZGF5ID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcclxuXHJcbiAgLy8gQ2hhbmdlIGRhdGUgdG8gVGh1cnNkYXkgc2FtZSB3ZWVrXHJcbiAgdGFyZ2V0VGh1cnNkYXkuc2V0RGF0ZSh0YXJnZXRUaHVyc2RheS5nZXREYXRlKCkgLSAoKHRhcmdldFRodXJzZGF5LmdldERheSgpICsgNikgJSA3KSArIDMpO1xyXG5cclxuICAvLyBUYWtlIEphbnVhcnkgNHRoIGFzIGl0IGlzIGFsd2F5cyBpbiB3ZWVrIDEgKHNlZSBJU08gODYwMSlcclxuICB2YXIgZmlyc3RUaHVyc2RheSA9IG5ldyBEYXRlKHRhcmdldFRodXJzZGF5LmdldEZ1bGxZZWFyKCksIDAsIDQpO1xyXG5cclxuICAvLyBDaGFuZ2UgZGF0ZSB0byBUaHVyc2RheSBzYW1lIHdlZWtcclxuICBmaXJzdFRodXJzZGF5LnNldERhdGUoZmlyc3RUaHVyc2RheS5nZXREYXRlKCkgLSAoKGZpcnN0VGh1cnNkYXkuZ2V0RGF5KCkgKyA2KSAlIDcpICsgMyk7XHJcblxyXG4gIC8vIENoZWNrIGlmIGRheWxpZ2h0LXNhdmluZy10aW1lLXN3aXRjaCBvY2N1cnJlZCBhbmQgY29ycmVjdCBmb3IgaXRcclxuICB2YXIgZHMgPSB0YXJnZXRUaHVyc2RheS5nZXRUaW1lem9uZU9mZnNldCgpIC0gZmlyc3RUaHVyc2RheS5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG4gIHRhcmdldFRodXJzZGF5LnNldEhvdXJzKHRhcmdldFRodXJzZGF5LmdldEhvdXJzKCkgLSBkcyk7XHJcblxyXG4gIC8vIE51bWJlciBvZiB3ZWVrcyBiZXR3ZWVuIHRhcmdldCBUaHVyc2RheSBhbmQgZmlyc3QgVGh1cnNkYXlcclxuICB2YXIgd2Vla0RpZmYgPSAodGFyZ2V0VGh1cnNkYXkgLSBmaXJzdFRodXJzZGF5KSAvICg4NjQwMDAwMCo3KTtcclxuICByZXR1cm4gMSArIE1hdGguZmxvb3Iod2Vla0RpZmYpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IElTTy04NjAxIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRheSBvZiB0aGUgd2Vla1xyXG4gKiAxIChmb3IgTW9uZGF5KSB0aHJvdWdoIDcgKGZvciBTdW5kYXkpXHJcbiAqIFxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IGBkYXRlYFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXREYXlPZldlZWsoZGF0ZSkge1xyXG4gIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xyXG4gIGlmKGRvdyA9PT0gMCkge1xyXG4gICAgZG93ID0gNztcclxuICB9XHJcbiAgcmV0dXJuIGRvdztcclxufVxyXG5cclxuLyoqXHJcbiAqIGtpbmQtb2Ygc2hvcnRjdXRcclxuICogQHBhcmFtICB7Kn0gdmFsXHJcbiAqIEByZXR1cm4ge1N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcclxuICBpZiAodmFsID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4gJ251bGwnO1xyXG4gIH1cclxuXHJcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsO1xyXG4gIH1cclxuXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xyXG4gICAgcmV0dXJuICdhcnJheSc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge30udG9TdHJpbmcuY2FsbCh2YWwpXHJcbiAgICAuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XHJcbn07XHJcblxyXG5cclxuXHJcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIGRhdGVGb3JtYXQ7XHJcbiAgICB9KTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xyXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBkYXRlRm9ybWF0O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBnbG9iYWwuZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgfVxyXG59KSh0aGlzKTtcclxuIiwiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnbGlnaHRzZWFncmVlbicsXG4gICdmb3Jlc3RncmVlbicsXG4gICdnb2xkZW5yb2QnLFxuICAnZG9kZ2VyYmx1ZScsXG4gICdkYXJrb3JjaGlkJyxcbiAgJ2NyaW1zb24nXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICAvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcbiAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcbiAgICAvLyBpcyBmaXJlZm94ID49IHYzMT9cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcbiAgICAvLyBkb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0JylcblxuICAvLyB0aGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG4gIC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEMgPSAwO1xuICBhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICBpZiAoJyUlJyA9PT0gbWF0Y2gpIHJldHVybjtcbiAgICBpbmRleCsrO1xuICAgIGlmICgnJWMnID09PSBtYXRjaCkge1xuICAgICAgLy8gd2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG4gICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuICAgICAgbGFzdEMgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIHRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LzksIHdoZXJlXG4gIC8vIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gZXhwb3J0cy5zdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG5cbiAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuICBpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcbiAgICByID0gcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH1cblxuICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYGxvY2FsU3RvcmFnZS5kZWJ1Z2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xudmFyIGZvcmVhY2ggPSByZXF1aXJlKCdmb3JlYWNoJyk7XG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbCgpID09PSAnc3ltYm9sJztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2JqID0ge307XG5cdHRyeSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqIH0pO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG5cdFx0cmV0dXJuIG9iai54ID09PSBvYmo7XG5cdH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBJRSA4LiAqL1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmplY3RbbmFtZV0gPSB2YWx1ZTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBwcm9wcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3JlYWNoKHByb3BzLCBmdW5jdGlvbiAobmFtZSkge1xuXHRcdGRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwgbWFwW25hbWVdLCBwcmVkaWNhdGVzW25hbWVdKTtcblx0fSk7XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsc1xuXHRBdG9taWNzLFxuXHRTaGFyZWRBcnJheUJ1ZmZlcixcbiovXG5cbnZhciB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcblxudmFyIFRocm93VHlwZUVycm9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvclxuXHQ/IChmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDsgfSgpKVxuXHQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyB9O1xuXG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCc7XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5fX3Byb3RvX187IH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblxudmFyIGdlbmVyYXRvcjsgLy8gPSBmdW5jdGlvbiAqICgpIHt9O1xudmFyIGdlbmVyYXRvckZ1bmN0aW9uID0gZ2VuZXJhdG9yID8gZ2V0UHJvdG8oZ2VuZXJhdG9yKSA6IHVuZGVmaW5lZDtcbnZhciBhc3luY0ZuOyAvLyBhc3luYyBmdW5jdGlvbigpIHt9O1xudmFyIGFzeW5jRnVuY3Rpb24gPSBhc3luY0ZuID8gYXN5bmNGbi5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZDtcbnZhciBhc3luY0dlbjsgLy8gYXN5bmMgZnVuY3Rpb24gKiAoKSB7fTtcbnZhciBhc3luY0dlbkZ1bmN0aW9uID0gYXN5bmNHZW4gPyBnZXRQcm90byhhc3luY0dlbikgOiB1bmRlZmluZWQ7XG52YXIgYXN5bmNHZW5JdGVyYXRvciA9IGFzeW5jR2VuID8gYXN5bmNHZW4oKSA6IHVuZGVmaW5lZDtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBnZXRQcm90byhVaW50OEFycmF5KTtcblxudmFyIElOVFJJTlNJQ1MgPSB7XG5cdCckICVBcnJheSUnOiBBcnJheSxcblx0JyQgJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyQgJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG5cdCckICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJCAlQXJyYXlQcm90b3R5cGUlJzogQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlQXJyYXlQcm90b19lbnRyaWVzJSc6IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzLFxuXHQnJCAlQXJyYXlQcm90b19mb3JFYWNoJSc6IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLFxuXHQnJCAlQXJyYXlQcm90b19rZXlzJSc6IEFycmF5LnByb3RvdHlwZS5rZXlzLFxuXHQnJCAlQXJyYXlQcm90b192YWx1ZXMlJzogQXJyYXkucHJvdG90eXBlLnZhbHVlcyxcblx0JyQgJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0Z1bmN0aW9uJSc6IGFzeW5jRnVuY3Rpb24sXG5cdCckICVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IGFzeW5jRnVuY3Rpb24gPyBhc3luY0Z1bmN0aW9uLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJUFzeW5jR2VuZXJhdG9yJSc6IGFzeW5jR2VuID8gZ2V0UHJvdG8oYXN5bmNHZW5JdGVyYXRvcikgOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IGFzeW5jR2VuRnVuY3Rpb24sXG5cdCckICVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBhc3luY0dlbkZ1bmN0aW9uID8gYXN5bmNHZW5GdW5jdGlvbi5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IGFzeW5jR2VuSXRlcmF0b3IgJiYgaGFzU3ltYm9scyAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvciA/IGFzeW5jR2VuSXRlcmF0b3JbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOiB1bmRlZmluZWQsXG5cdCckICVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEF0b21pY3MsXG5cdCckICVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCckICVCb29sZWFuUHJvdG90eXBlJSc6IEJvb2xlYW4ucHJvdG90eXBlLFxuXHQnJCAlRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJCAlRGF0YVZpZXdQcm90b3R5cGUlJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LnByb3RvdHlwZSxcblx0JyQgJURhdGUlJzogRGF0ZSxcblx0JyQgJURhdGVQcm90b3R5cGUlJzogRGF0ZS5wcm90b3R5cGUsXG5cdCckICVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJCAlZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyQgJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG5cdCckICVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJCAlRXJyb3IlJzogRXJyb3IsXG5cdCckICVFcnJvclByb3RvdHlwZSUnOiBFcnJvci5wcm90b3R5cGUsXG5cdCckICVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJCAlRXZhbEVycm9yJSc6IEV2YWxFcnJvcixcblx0JyQgJUV2YWxFcnJvclByb3RvdHlwZSUnOiBFdmFsRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LFxuXHQnJCAlRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRmxvYXQzMkFycmF5LnByb3RvdHlwZSxcblx0JyQgJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheSxcblx0JyQgJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0NjRBcnJheS5wcm90b3R5cGUsXG5cdCckICVGdW5jdGlvbiUnOiBGdW5jdGlvbixcblx0JyQgJUZ1bmN0aW9uUHJvdG90eXBlJSc6IEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0JyQgJUdlbmVyYXRvciUnOiBnZW5lcmF0b3IgPyBnZXRQcm90byhnZW5lcmF0b3IoKSkgOiB1bmRlZmluZWQsXG5cdCckICVHZW5lcmF0b3JGdW5jdGlvbiUnOiBnZW5lcmF0b3JGdW5jdGlvbixcblx0JyQgJUdlbmVyYXRvclByb3RvdHlwZSUnOiBnZW5lcmF0b3JGdW5jdGlvbiA/IGdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJUludDhBcnJheSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheSxcblx0JyQgJUludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVJbnQxNkFycmF5JSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDE2QXJyYXksXG5cdCckICVJbnQxNkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCckICVJbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCckICVpc05hTiUnOiBpc05hTixcblx0JyQgJUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90byhnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKSA6IHVuZGVmaW5lZCxcblx0JyQgJUpTT04lJzogSlNPTixcblx0JyQgJUpTT05QYXJzZSUnOiBKU09OLnBhcnNlLFxuXHQnJCAlTWFwJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTWFwLFxuXHQnJCAlTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyQgJU1hcFByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcC5wcm90b3R5cGUsXG5cdCckICVNYXRoJSc6IE1hdGgsXG5cdCckICVOdW1iZXIlJzogTnVtYmVyLFxuXHQnJCAlTnVtYmVyUHJvdG90eXBlJSc6IE51bWJlci5wcm90b3R5cGUsXG5cdCckICVPYmplY3QlJzogT2JqZWN0LFxuXHQnJCAlT2JqZWN0UHJvdG90eXBlJSc6IE9iamVjdC5wcm90b3R5cGUsXG5cdCckICVPYmpQcm90b190b1N0cmluZyUnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxuXHQnJCAlT2JqUHJvdG9fdmFsdWVPZiUnOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsXG5cdCckICVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCckICVwYXJzZUludCUnOiBwYXJzZUludCxcblx0JyQgJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZSxcblx0JyQgJVByb21pc2VQcm90b3R5cGUlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5wcm90b3R5cGUsXG5cdCckICVQcm9taXNlUHJvdG9fdGhlbiUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnByb3RvdHlwZS50aGVuLFxuXHQnJCAlUHJvbWlzZV9hbGwlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5hbGwsXG5cdCckICVQcm9taXNlX3JlamVjdCUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnJlamVjdCxcblx0JyQgJVByb21pc2VfcmVzb2x2ZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLnJlc29sdmUsXG5cdCckICVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJveHksXG5cdCckICVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCckICVSYW5nZUVycm9yUHJvdG90eXBlJSc6IFJhbmdlRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCckICVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBSZWZlcmVuY2VFcnJvci5wcm90b3R5cGUsXG5cdCckICVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCckICVSZWdFeHAlJzogUmVnRXhwLFxuXHQnJCAlUmVnRXhwUHJvdG90eXBlJSc6IFJlZ0V4cC5wcm90b3R5cGUsXG5cdCckICVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCckICVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJCAlU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LnByb3RvdHlwZSxcblx0JyQgJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyQgJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG5cdCckICVTdHJpbmclJzogU3RyaW5nLFxuXHQnJCAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCckICVTdHJpbmdQcm90b3R5cGUlJzogU3RyaW5nLnByb3RvdHlwZSxcblx0JyQgJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJCAlU3ltYm9sUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlU3ludGF4RXJyb3IlJzogU3ludGF4RXJyb3IsXG5cdCckICVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBTeW50YXhFcnJvci5wcm90b3R5cGUsXG5cdCckICVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyQgJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyQgJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheSA/IFR5cGVkQXJyYXkucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlVHlwZUVycm9yJSc6IFR5cGVFcnJvcixcblx0JyQgJVR5cGVFcnJvclByb3RvdHlwZSUnOiBUeXBlRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJCAlVWludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyQgJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGUsXG5cdCckICVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCckICVVaW50MTZBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXkucHJvdG90eXBlLFxuXHQnJCAlVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJCAlVWludDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJCAlVVJJRXJyb3JQcm90b3R5cGUlJzogVVJJRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLFxuXHQnJCAlV2Vha01hcFByb3RvdHlwZSUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrTWFwLnByb3RvdHlwZSxcblx0JyQgJVdlYWtTZXQlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldCxcblx0JyQgJVdlYWtTZXRQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha1NldC5wcm90b3R5cGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0dmFyIGtleSA9ICckICcgKyBuYW1lO1xuXHRpZiAoIShrZXkgaW4gSU5UUklOU0lDUykpIHtcblx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG5cdH1cblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgaWYgLy8gaG9wZWZ1bGx5IHRoaXMgaXMgaW1wb3NzaWJsZSB0byB0ZXN0IDotKVxuXHRpZiAodHlwZW9mIElOVFJJTlNJQ1Nba2V5XSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdH1cblx0cmV0dXJuIElOVFJJTlNJQ1Nba2V5XTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJ2VzLXRvLXByaW1pdGl2ZS9lczYnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRSYW5nZUVycm9yID0gR2V0SW50cmluc2ljKCclUmFuZ2VFcnJvciUnKTtcbnZhciAkU3ludGF4RXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVTeW50YXhFcnJvciUnKTtcbnZhciAkQXJyYXkgPSBHZXRJbnRyaW5zaWMoJyVBcnJheSUnKTtcbnZhciAkQXJyYXlQcm90b3R5cGUgPSAkQXJyYXkucHJvdG90eXBlO1xudmFyICRTdHJpbmcgPSBHZXRJbnRyaW5zaWMoJyVTdHJpbmclJyk7XG52YXIgJE9iamVjdCA9IEdldEludHJpbnNpYygnJU9iamVjdCUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xudmFyICRTeW1ib2wgPSBHZXRJbnRyaW5zaWMoJyVTeW1ib2wlJywgdHJ1ZSk7XG52YXIgJFJlZ0V4cCA9IEdldEludHJpbnNpYygnJVJlZ0V4cCUnKTtcbnZhciAkUHJvbWlzZSA9IEdldEludHJpbnNpYygnJVByb21pc2UlJywgdHJ1ZSk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gJE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scycpKCk7XG5cbnZhciBhc3NlcnRSZWNvcmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzZXJ0UmVjb3JkJyk7XG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzTmFOJyk7XG52YXIgJGlzRmluaXRlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzRmluaXRlJyk7XG52YXIgTUFYX0FSUkFZX0xFTkdUSCA9IE1hdGgucG93KDIsIDMyKSAtIDE7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9ICROdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9oZWxwZXJzL2Fzc2lnbicpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvc2lnbicpO1xudmFyIG1vZCA9IHJlcXVpcmUoJy4vaGVscGVycy9tb2QnKTtcbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuL2hlbHBlcnMvZm9yRWFjaCcpO1xudmFyIGV2ZXJ5ID0gcmVxdWlyZSgnLi9oZWxwZXJzL2V2ZXJ5Jyk7XG52YXIgaXNTYW1lUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzU2FtZVByb3BlcnR5RGVzY3JpcHRvcicpO1xudmFyIGlzUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJvcGVydHlEZXNjcmlwdG9yJyk7XG52YXIgcGFyc2VJbnRlZ2VyID0gcGFyc2VJbnQ7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJpbmQnKTtcbnZhciAkUHJvbWlzZVRoZW4gPSAkUHJvbWlzZSA/IGNhbGxCaW5kKEdldEludHJpbnNpYygnJVByb21pc2VQcm90b190aGVuJScpKSA6IG51bGw7XG52YXIgYXJyYXlTbGljZSA9IGNhbGxCaW5kKCRBcnJheS5wcm90b3R5cGUuc2xpY2UpO1xudmFyIHN0clNsaWNlID0gY2FsbEJpbmQoJFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyIGlzQmluYXJ5ID0gY2FsbEJpbmQoJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgL14wYlswMV0rJC9pKTtcbnZhciBpc09jdGFsID0gY2FsbEJpbmQoJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgL14wb1swLTddKyQvaSk7XG52YXIgaXNEaWdpdCA9IGNhbGxCaW5kKCRSZWdFeHAucHJvdG90eXBlLnRlc3QsIC9eWzAtOV0kLyk7XG52YXIgcmVnZXhFeGVjID0gY2FsbEJpbmQoJFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG52YXIgbm9uV1MgPSBbJ1xcdTAwODUnLCAnXFx1MjAwYicsICdcXHVmZmZlJ10uam9pbignJyk7XG52YXIgbm9uV1NyZWdleCA9IG5ldyAkUmVnRXhwKCdbJyArIG5vbldTICsgJ10nLCAnZycpO1xudmFyIGhhc05vbldTID0gY2FsbEJpbmQoJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgbm9uV1NyZWdleCk7XG52YXIgaW52YWxpZEhleExpdGVyYWwgPSAvXlstK10weFswLTlhLWZdKyQvaTtcbnZhciBpc0ludmFsaWRIZXhMaXRlcmFsID0gY2FsbEJpbmQoJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgaW52YWxpZEhleExpdGVyYWwpO1xudmFyICRjaGFyQ29kZUF0ID0gY2FsbEJpbmQoJFN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdCk7XG52YXIgJGlzRW51bWVyYWJsZSA9IGNhbGxCaW5kKCRPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlKTtcblxudmFyIHRvU3RyID0gY2FsbEJpbmQoJE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuXG52YXIgJE51bWJlclZhbHVlT2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJyVOdW1iZXJQcm90b3R5cGUlJykudmFsdWVPZik7XG52YXIgJEJvb2xlYW5WYWx1ZU9mID0gY2FsbEJpbmQoR2V0SW50cmluc2ljKCclQm9vbGVhblByb3RvdHlwZSUnKS52YWx1ZU9mKTtcbnZhciAkU3RyaW5nVmFsdWVPZiA9IGNhbGxCaW5kKEdldEludHJpbnNpYygnJVN0cmluZ1Byb3RvdHlwZSUnKS52YWx1ZU9mKTtcbnZhciAkRGF0ZVZhbHVlT2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJyVEYXRlUHJvdG90eXBlJScpLnZhbHVlT2YpO1xudmFyICRTeW1ib2xUb1N0cmluZyA9IGhhc1N5bWJvbHMgJiYgY2FsbEJpbmQoR2V0SW50cmluc2ljKCclU3ltYm9sUHJvdG90eXBlJScpLnRvU3RyaW5nKTtcblxudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgJGFicyA9IE1hdGguYWJzO1xuXG52YXIgJE9iamVjdENyZWF0ZSA9ICRPYmplY3QuY3JlYXRlO1xudmFyICRnT1BEID0gJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgJGdPUE4gPSAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgJGdPUFMgPSAkT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciAkaXNFeHRlbnNpYmxlID0gJE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciAkc2V0UHJvdG8gPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKFxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG8sIG5vLW5lZ2F0ZWQtY29uZGl0aW9uXG5cdFtdLl9fcHJvdG9fXyAhPT0gQXJyYXkucHJvdG90eXBlXG5cdFx0PyBudWxsXG5cdFx0OiBmdW5jdGlvbiAoTywgcHJvdG8pIHtcblx0XHRcdE8uX19wcm90b19fID0gcHJvdG87IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblx0XHRcdHJldHVybiBPO1xuXHRcdH1cbik7XG5cbnZhciBEZWZpbmVPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIERlZmluZU93blByb3BlcnR5KEVTLCBPLCBQLCBkZXNjKSB7XG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0aWYgKCFFUy5Jc0RhdGFEZXNjcmlwdG9yKGRlc2MpKSB7XG5cdFx0XHQvLyBFUzMgZG9lcyBub3Qgc3VwcG9ydCBnZXR0ZXJzL3NldHRlcnNcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFkZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ10gfHwgIWRlc2NbJ1tbV3JpdGFibGVdXSddKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gZmFsbGJhY2sgZm9yIEVTM1xuXHRcdGlmIChQIGluIE8gJiYgJGlzRW51bWVyYWJsZShPLCBQKSAhPT0gISFkZXNjWydbW0VudW1lcmFibGVdXSddKSB7XG5cdFx0XHQvLyBhIG5vbi1lbnVtZXJhYmxlIGV4aXN0aW5nIHByb3BlcnR5XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgYXQgYWxsLCBvciBleGlzdHMgYnV0IGlzIGVudW1lcmFibGVcblx0XHR2YXIgViA9IGRlc2NbJ1tbVmFsdWVdXSddO1xuXHRcdE9bUF0gPSBWOyAvLyB3aWxsIHVzZSBbW0RlZmluZV1dXG5cdFx0cmV0dXJuIEVTLlNhbWVWYWx1ZShPW1BdLCBWKTtcblx0fVxuXHQkZGVmaW5lUHJvcGVydHkoTywgUCwgRVMuRnJvbVByb3BlcnR5RGVzY3JpcHRvcihkZXNjKSk7XG5cdHJldHVybiB0cnVlO1xufTtcblxuLy8gd2hpdGVzcGFjZSBmcm9tOiBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS41LjQuMjBcbi8vIGltcGxlbWVudGF0aW9uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2Jsb2IvdjMuNC4wL2VzNS1zaGltLmpzI0wxMzA0LUwxMzI0XG52YXIgd3MgPSBbXG5cdCdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycsXG5cdCdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOCcsXG5cdCdcXHUyMDI5XFx1RkVGRidcbl0uam9pbignJyk7XG52YXIgdHJpbVJlZ2V4ID0gbmV3IFJlZ0V4cCgnKF5bJyArIHdzICsgJ10rKXwoWycgKyB3cyArICddKyQpJywgJ2cnKTtcbnZhciAkcmVwbGFjZSA9IGNhbGxCaW5kKCRTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyIHRyaW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuICRyZXBsYWNlKHZhbHVlLCB0cmltUmVnZXgsICcnKTtcbn07XG5cbnZhciBFUzUgPSByZXF1aXJlKCcuL2VzNScpO1xuXG52YXIgaGFzUmVnRXhwTWF0Y2hlciA9IHJlcXVpcmUoJ2lzLXJlZ2V4Jyk7XG5cbi8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1hYnN0cmFjdC1vcGVyYXRpb25zXG52YXIgRVM2ID0gYXNzaWduKGFzc2lnbih7fSwgRVM1KSwge1xuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1jYWxsLWYtdi1hcmdzXG5cdENhbGw6IGZ1bmN0aW9uIENhbGwoRiwgVikge1xuXHRcdHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBbXTtcblx0XHRpZiAoIXRoaXMuSXNDYWxsYWJsZShGKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoaW5zcGVjdChGKSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHR9XG5cdFx0cmV0dXJuIEYuYXBwbHkoViwgYXJncyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvcHJpbWl0aXZlXG5cdFRvUHJpbWl0aXZlOiB0b1ByaW1pdGl2ZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9ib29sZWFuXG5cdC8vIFRvQm9vbGVhbjogRVM1LlRvQm9vbGVhbixcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9udW1iZXJcblx0VG9OdW1iZXI6IGZ1bmN0aW9uIFRvTnVtYmVyKGFyZ3VtZW50KSB7XG5cdFx0dmFyIHZhbHVlID0gaXNQcmltaXRpdmUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJE51bWJlcik7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIG51bWJlcicpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKGlzQmluYXJ5KHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcihwYXJzZUludGVnZXIoc3RyU2xpY2UodmFsdWUsIDIpLCAyKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlzT2N0YWwodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHBhcnNlSW50ZWdlcihzdHJTbGljZSh2YWx1ZSwgMiksIDgpKTtcblx0XHRcdH0gZWxzZSBpZiAoaGFzTm9uV1ModmFsdWUpIHx8IGlzSW52YWxpZEhleExpdGVyYWwodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiBOYU47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgdHJpbW1lZCA9IHRyaW0odmFsdWUpO1xuXHRcdFx0XHRpZiAodHJpbW1lZCAhPT0gdmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih0cmltbWVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gJE51bWJlcih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvaW50ZWdlclxuXHQvLyBUb0ludGVnZXI6IEVTNS5Ub051bWJlcixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnQzMlxuXHQvLyBUb0ludDMyOiBFUzUuVG9JbnQzMixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG91aW50MzJcblx0Ly8gVG9VaW50MzI6IEVTNS5Ub1VpbnQzMixcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnQxNlxuXHRUb0ludDE2OiBmdW5jdGlvbiBUb0ludDE2KGFyZ3VtZW50KSB7XG5cdFx0dmFyIGludDE2Yml0ID0gdGhpcy5Ub1VpbnQxNihhcmd1bWVudCk7XG5cdFx0cmV0dXJuIGludDE2Yml0ID49IDB4ODAwMCA/IGludDE2Yml0IC0gMHgxMDAwMCA6IGludDE2Yml0O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQxNlxuXHQvLyBUb1VpbnQxNjogRVM1LlRvVWludDE2LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDhcblx0VG9JbnQ4OiBmdW5jdGlvbiBUb0ludDgoYXJndW1lbnQpIHtcblx0XHR2YXIgaW50OGJpdCA9IHRoaXMuVG9VaW50OChhcmd1bWVudCk7XG5cdFx0cmV0dXJuIGludDhiaXQgPj0gMHg4MCA/IGludDhiaXQgLSAweDEwMCA6IGludDhiaXQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDhcblx0VG9VaW50ODogZnVuY3Rpb24gVG9VaW50OChhcmd1bWVudCkge1xuXHRcdHZhciBudW1iZXIgPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09PSAwIHx8ICEkaXNGaW5pdGUobnVtYmVyKSkgeyByZXR1cm4gMDsgfVxuXHRcdHZhciBwb3NJbnQgPSBzaWduKG51bWJlcikgKiAkZmxvb3IoJGFicyhudW1iZXIpKTtcblx0XHRyZXR1cm4gbW9kKHBvc0ludCwgMHgxMDApO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQ4Y2xhbXBcblx0VG9VaW50OENsYW1wOiBmdW5jdGlvbiBUb1VpbnQ4Q2xhbXAoYXJndW1lbnQpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcihhcmd1bWVudCk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA8PSAwKSB7IHJldHVybiAwOyB9XG5cdFx0aWYgKG51bWJlciA+PSAweEZGKSB7IHJldHVybiAweEZGOyB9XG5cdFx0dmFyIGYgPSAkZmxvb3IoYXJndW1lbnQpO1xuXHRcdGlmIChmICsgMC41IDwgbnVtYmVyKSB7IHJldHVybiBmICsgMTsgfVxuXHRcdGlmIChudW1iZXIgPCBmICsgMC41KSB7IHJldHVybiBmOyB9XG5cdFx0aWYgKGYgJSAyICE9PSAwKSB7IHJldHVybiBmICsgMTsgfVxuXHRcdHJldHVybiBmO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3N0cmluZ1xuXHRUb1N0cmluZzogZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3ltYm9sJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9vYmplY3Rcblx0VG9PYmplY3Q6IGZ1bmN0aW9uIFRvT2JqZWN0KHZhbHVlKSB7XG5cdFx0dGhpcy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHZhbHVlKTtcblx0XHRyZXR1cm4gJE9iamVjdCh2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvcHJvcGVydHlrZXlcblx0VG9Qcm9wZXJ0eUtleTogZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuXHRcdHZhciBrZXkgPSB0aGlzLlRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkU3RyaW5nKTtcblx0XHRyZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgPyBrZXkgOiB0aGlzLlRvU3RyaW5nKGtleSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG5cdFRvTGVuZ3RoOiBmdW5jdGlvbiBUb0xlbmd0aChhcmd1bWVudCkge1xuXHRcdHZhciBsZW4gPSB0aGlzLlRvSW50ZWdlcihhcmd1bWVudCk7XG5cdFx0aWYgKGxlbiA8PSAwKSB7IHJldHVybiAwOyB9IC8vIGluY2x1ZGVzIGNvbnZlcnRpbmcgLTAgdG8gKzBcblx0XHRpZiAobGVuID4gTUFYX1NBRkVfSU5URUdFUikgeyByZXR1cm4gTUFYX1NBRkVfSU5URUdFUjsgfVxuXHRcdHJldHVybiBsZW47XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNhbm9uaWNhbG51bWVyaWNpbmRleHN0cmluZ1xuXHRDYW5vbmljYWxOdW1lcmljSW5kZXhTdHJpbmc6IGZ1bmN0aW9uIENhbm9uaWNhbE51bWVyaWNJbmRleFN0cmluZyhhcmd1bWVudCkge1xuXHRcdGlmICh0b1N0cihhcmd1bWVudCkgIT09ICdbb2JqZWN0IFN0cmluZ10nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignbXVzdCBiZSBhIHN0cmluZycpO1xuXHRcdH1cblx0XHRpZiAoYXJndW1lbnQgPT09ICctMCcpIHsgcmV0dXJuIC0wOyB9XG5cdFx0dmFyIG4gPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAodGhpcy5TYW1lVmFsdWUodGhpcy5Ub1N0cmluZyhuKSwgYXJndW1lbnQpKSB7IHJldHVybiBuOyB9XG5cdFx0cmV0dXJuIHZvaWQgMDtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxuXHRSZXF1aXJlT2JqZWN0Q29lcmNpYmxlOiBFUzUuQ2hlY2tPYmplY3RDb2VyY2libGUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzYXJyYXlcblx0SXNBcnJheTogJEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gSXNBcnJheShhcmd1bWVudCkge1xuXHRcdHJldHVybiB0b1N0cihhcmd1bWVudCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzY2FsbGFibGVcblx0Ly8gSXNDYWxsYWJsZTogRVM1LklzQ2FsbGFibGUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzY29uc3RydWN0b3Jcblx0SXNDb25zdHJ1Y3RvcjogZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuXHRcdHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicgJiYgISFhcmd1bWVudC5wcm90b3R5cGU7IC8vIHVuZm9ydHVuYXRlbHkgdGhlcmUncyBubyB3YXkgdG8gdHJ1bHkgY2hlY2sgdGhpcyB3aXRob3V0IHRyeS9jYXRjaCBgbmV3IGFyZ3VtZW50YFxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1pc2V4dGVuc2libGUtb1xuXHRJc0V4dGVuc2libGU6ICRwcmV2ZW50RXh0ZW5zaW9uc1xuXHRcdD8gZnVuY3Rpb24gSXNFeHRlbnNpYmxlKG9iaikge1xuXHRcdFx0aWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICRpc0V4dGVuc2libGUob2JqKTtcblx0XHR9XG5cdFx0OiBmdW5jdGlvbiBpc0V4dGVuc2libGUob2JqKSB7IHJldHVybiB0cnVlOyB9LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzaW50ZWdlclxuXHRJc0ludGVnZXI6IGZ1bmN0aW9uIElzSW50ZWdlcihhcmd1bWVudCkge1xuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgIT09ICdudW1iZXInIHx8ICRpc05hTihhcmd1bWVudCkgfHwgISRpc0Zpbml0ZShhcmd1bWVudCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dmFyIGFicyA9ICRhYnMoYXJndW1lbnQpO1xuXHRcdHJldHVybiAkZmxvb3IoYWJzKSA9PT0gYWJzO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1pc3Byb3BlcnR5a2V5XG5cdElzUHJvcGVydHlLZXk6IGZ1bmN0aW9uIElzUHJvcGVydHlLZXkoYXJndW1lbnQpIHtcblx0XHRyZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc3JlZ2V4cFxuXHRJc1JlZ0V4cDogZnVuY3Rpb24gSXNSZWdFeHAoYXJndW1lbnQpIHtcblx0XHRpZiAoIWFyZ3VtZW50IHx8IHR5cGVvZiBhcmd1bWVudCAhPT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGhhc1N5bWJvbHMpIHtcblx0XHRcdHZhciBpc1JlZ0V4cCA9IGFyZ3VtZW50WyRTeW1ib2wubWF0Y2hdO1xuXHRcdFx0aWYgKHR5cGVvZiBpc1JlZ0V4cCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuIEVTNS5Ub0Jvb2xlYW4oaXNSZWdFeHApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaGFzUmVnRXhwTWF0Y2hlcihhcmd1bWVudCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXNhbWV2YWx1ZVxuXHQvLyBTYW1lVmFsdWU6IEVTNS5TYW1lVmFsdWUsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXNhbWV2YWx1ZXplcm9cblx0U2FtZVZhbHVlWmVybzogZnVuY3Rpb24gU2FtZVZhbHVlWmVybyh4LCB5KSB7XG5cdFx0cmV0dXJuICh4ID09PSB5KSB8fCAoJGlzTmFOKHgpICYmICRpc05hTih5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy4yIEdldFYgKFYsIFApXG5cdCAqIDEuIEFzc2VydDogSXNQcm9wZXJ0eUtleShQKSBpcyB0cnVlLlxuXHQgKiAyLiBMZXQgTyBiZSBUb09iamVjdChWKS5cblx0ICogMy4gUmV0dXJuSWZBYnJ1cHQoTykuXG5cdCAqIDQuIFJldHVybiBPLltbR2V0XV0oUCwgVikuXG5cdCAqL1xuXHRHZXRWOiBmdW5jdGlvbiBHZXRWKFYsIFApIHtcblx0XHQvLyA3LjMuMi4xXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjIuMi0zXG5cdFx0dmFyIE8gPSB0aGlzLlRvT2JqZWN0KFYpO1xuXG5cdFx0Ly8gNy4zLjIuNFxuXHRcdHJldHVybiBPW1BdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiA3LjMuOSAtIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRtZXRob2Rcblx0ICogMS4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDIuIExldCBmdW5jIGJlIEdldFYoTywgUCkuXG5cdCAqIDMuIFJldHVybklmQWJydXB0KGZ1bmMpLlxuXHQgKiA0LiBJZiBmdW5jIGlzIGVpdGhlciB1bmRlZmluZWQgb3IgbnVsbCwgcmV0dXJuIHVuZGVmaW5lZC5cblx0ICogNS4gSWYgSXNDYWxsYWJsZShmdW5jKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuXHQgKiA2LiBSZXR1cm4gZnVuYy5cblx0ICovXG5cdEdldE1ldGhvZDogZnVuY3Rpb24gR2V0TWV0aG9kKE8sIFApIHtcblx0XHQvLyA3LjMuOS4xXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuMlxuXHRcdHZhciBmdW5jID0gdGhpcy5HZXRWKE8sIFApO1xuXG5cdFx0Ly8gNy4zLjkuNFxuXHRcdGlmIChmdW5jID09IG51bGwpIHtcblx0XHRcdHJldHVybiB2b2lkIDA7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuNVxuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKGZ1bmMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcihQICsgJ2lzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0Ly8gNy4zLjkuNlxuXHRcdHJldHVybiBmdW5jO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiA3LjMuMSBHZXQgKE8sIFApIC0gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldC1vLXBcblx0ICogMS4gQXNzZXJ0OiBUeXBlKE8pIGlzIE9iamVjdC5cblx0ICogMi4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDMuIFJldHVybiBPLltbR2V0XV0oUCwgTykuXG5cdCAqL1xuXHRHZXQ6IGZ1bmN0aW9uIEdldChPLCBQKSB7XG5cdFx0Ly8gNy4zLjEuMVxuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdC8vIDcuMy4xLjJcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUsIGdvdCAnICsgaW5zcGVjdChQKSk7XG5cdFx0fVxuXHRcdC8vIDcuMy4xLjNcblx0XHRyZXR1cm4gT1tQXTtcblx0fSxcblxuXHRUeXBlOiBmdW5jdGlvbiBUeXBlKHgpIHtcblx0XHRpZiAodHlwZW9mIHggPT09ICdzeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gJ1N5bWJvbCc7XG5cdFx0fVxuXHRcdHJldHVybiBFUzUuVHlwZSh4KTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5cdFNwZWNpZXNDb25zdHJ1Y3RvcjogZnVuY3Rpb24gU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHZhciBDID0gTy5jb25zdHJ1Y3Rvcjtcblx0XHRpZiAodHlwZW9mIEMgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdENvbnN0cnVjdG9yO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKEMpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ08uY29uc3RydWN0b3IgaXMgbm90IGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgUyA9IGhhc1N5bWJvbHMgJiYgJFN5bWJvbC5zcGVjaWVzID8gQ1skU3ltYm9sLnNwZWNpZXNdIDogdm9pZCAwO1xuXHRcdGlmIChTID09IG51bGwpIHtcblx0XHRcdHJldHVybiBkZWZhdWx0Q29uc3RydWN0b3I7XG5cdFx0fVxuXHRcdGlmICh0aGlzLklzQ29uc3RydWN0b3IoUykpIHtcblx0XHRcdHJldHVybiBTO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignbm8gY29uc3RydWN0b3IgZm91bmQnKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWZyb21wcm9wZXJ0eWRlc2NyaXB0b3Jcblx0RnJvbVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gRnJvbVByb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIERlc2M7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdHZhciBvYmogPSB7fTtcblx0XHRpZiAoJ1tbVmFsdWVdXScgaW4gRGVzYykge1xuXHRcdFx0b2JqLnZhbHVlID0gRGVzY1snW1tWYWx1ZV1dJ107XG5cdFx0fVxuXHRcdGlmICgnW1tXcml0YWJsZV1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmoud3JpdGFibGUgPSBEZXNjWydbW1dyaXRhYmxlXV0nXTtcblx0XHR9XG5cdFx0aWYgKCdbW0dldF1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmouZ2V0ID0gRGVzY1snW1tHZXRdXSddO1xuXHRcdH1cblx0XHRpZiAoJ1tbU2V0XV0nIGluIERlc2MpIHtcblx0XHRcdG9iai5zZXQgPSBEZXNjWydbW1NldF1dJ107XG5cdFx0fVxuXHRcdGlmICgnW1tFbnVtZXJhYmxlXV0nIGluIERlc2MpIHtcblx0XHRcdG9iai5lbnVtZXJhYmxlID0gRGVzY1snW1tFbnVtZXJhYmxlXV0nXTtcblx0XHR9XG5cdFx0aWYgKCdbW0NvbmZpZ3VyYWJsZV1dJyBpbiBEZXNjKSB7XG5cdFx0XHRvYmouY29uZmlndXJhYmxlID0gRGVzY1snW1tDb25maWd1cmFibGVdXSddO1xuXHRcdH1cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jb21wbGV0ZXByb3BlcnR5ZGVzY3JpcHRvclxuXHRDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gQ29tcGxldGVQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykge1xuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAodGhpcy5Jc0dlbmVyaWNEZXNjcmlwdG9yKERlc2MpIHx8IHRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbVmFsdWVdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbVmFsdWVdXSddID0gdm9pZCAwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbV3JpdGFibGVdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbV3JpdGFibGVdXSddID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghaGFzKERlc2MsICdbW0dldF1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tHZXRdXSddID0gdm9pZCAwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbU2V0XV0nKSkge1xuXHRcdFx0XHREZXNjWydbW1NldF1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghaGFzKERlc2MsICdbW0VudW1lcmFibGVdXScpKSB7XG5cdFx0XHREZXNjWydbW0VudW1lcmFibGVdXSddID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghaGFzKERlc2MsICdbW0NvbmZpZ3VyYWJsZV1dJykpIHtcblx0XHRcdERlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXSA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gRGVzYztcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2V0LW8tcC12LXRocm93XG5cdFNldDogZnVuY3Rpb24gU2V0KE8sIFAsIFYsIFRocm93KSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUoVGhyb3cpICE9PSAnQm9vbGVhbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdUaHJvdyBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHRcdH1cblx0XHRpZiAoVGhyb3cpIHtcblx0XHRcdE9bUF0gPSBWO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdE9bUF0gPSBWO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1oYXNvd25wcm9wZXJ0eVxuXHRIYXNPd25Qcm9wZXJ0eTogZnVuY3Rpb24gSGFzT3duUHJvcGVydHkoTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignTyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRyZXR1cm4gaGFzKE8sIFApO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1oYXNwcm9wZXJ0eVxuXHRIYXNQcm9wZXJ0eTogZnVuY3Rpb24gSGFzUHJvcGVydHkoTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignTyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRyZXR1cm4gUCBpbiBPO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc2NvbmNhdHNwcmVhZGFibGVcblx0SXNDb25jYXRTcHJlYWRhYmxlOiBmdW5jdGlvbiBJc0NvbmNhdFNwcmVhZGFibGUoTykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChoYXNTeW1ib2xzICYmIHR5cGVvZiAkU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA9PT0gJ3N5bWJvbCcpIHtcblx0XHRcdHZhciBzcHJlYWRhYmxlID0gdGhpcy5HZXQoTywgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSk7XG5cdFx0XHRpZiAodHlwZW9mIHNwcmVhZGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvQm9vbGVhbihzcHJlYWRhYmxlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuSXNBcnJheShPKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaW52b2tlXG5cdEludm9rZTogZnVuY3Rpb24gSW52b2tlKE8sIFApIHtcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1AgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHR2YXIgYXJndW1lbnRzTGlzdCA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAyKTtcblx0XHR2YXIgZnVuYyA9IHRoaXMuR2V0VihPLCBQKTtcblx0XHRyZXR1cm4gdGhpcy5DYWxsKGZ1bmMsIE8sIGFyZ3VtZW50c0xpc3QpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRpdGVyYXRvclxuXHRHZXRJdGVyYXRvcjogZnVuY3Rpb24gR2V0SXRlcmF0b3Iob2JqLCBtZXRob2QpIHtcblx0XHR2YXIgYWN0dWFsTWV0aG9kID0gbWV0aG9kO1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuXHRcdFx0aWYgKCFoYXNTeW1ib2xzKSB7XG5cdFx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcignR2V0SXRlcmF0b3IgZGVwZW5kcyBvbiBuYXRpdmUgU3ltYm9sIHN1cHBvcnQgd2hlbiBgbWV0aG9kYCBpcyBub3QgcGFzc2VkJyk7XG5cdFx0XHR9XG5cdFx0XHRhY3R1YWxNZXRob2QgPSB0aGlzLkdldE1ldGhvZChvYmosICRTeW1ib2wuaXRlcmF0b3IpO1xuXHRcdH1cblx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLkNhbGwoYWN0dWFsTWV0aG9kLCBvYmopO1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVyYXRvcjtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JuZXh0XG5cdEl0ZXJhdG9yTmV4dDogZnVuY3Rpb24gSXRlcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWx1ZSkge1xuXHRcdHZhciByZXN1bHQgPSB0aGlzLkludm9rZShpdGVyYXRvciwgJ25leHQnLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFtdIDogW3ZhbHVlXSk7XG5cdFx0aWYgKHRoaXMuVHlwZShyZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG5leHQgbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY29tcGxldGVcblx0SXRlcmF0b3JDb21wbGV0ZTogZnVuY3Rpb24gSXRlcmF0b3JDb21wbGV0ZShpdGVyUmVzdWx0KSB7XG5cdFx0aWYgKHRoaXMuVHlwZShpdGVyUmVzdWx0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKGl0ZXJSZXN1bHQpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHRoaXMuR2V0KGl0ZXJSZXN1bHQsICdkb25lJykpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pdGVyYXRvcnZhbHVlXG5cdEl0ZXJhdG9yVmFsdWU6IGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlclJlc3VsdCkgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShpdGVyUmVzdWx0KSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLkdldChpdGVyUmVzdWx0LCAndmFsdWUnKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JzdGVwXG5cdEl0ZXJhdG9yU3RlcDogZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuSXRlcmF0b3JOZXh0KGl0ZXJhdG9yKTtcblx0XHR2YXIgZG9uZSA9IHRoaXMuSXRlcmF0b3JDb21wbGV0ZShyZXN1bHQpO1xuXHRcdHJldHVybiBkb25lID09PSB0cnVlID8gZmFsc2UgOiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY2xvc2Vcblx0SXRlcmF0b3JDbG9zZTogZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoaXRlcmF0b3IpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoY29tcGxldGlvbikpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBjb21wbGV0aW9uIGlzIG5vdCBhIHRodW5rIGZvciBhIENvbXBsZXRpb24gUmVjb3JkJyk7XG5cdFx0fVxuXHRcdHZhciBjb21wbGV0aW9uVGh1bmsgPSBjb21wbGV0aW9uO1xuXG5cdFx0dmFyIGl0ZXJhdG9yUmV0dXJuID0gdGhpcy5HZXRNZXRob2QoaXRlcmF0b3IsICdyZXR1cm4nKTtcblxuXHRcdGlmICh0eXBlb2YgaXRlcmF0b3JSZXR1cm4gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gY29tcGxldGlvblRodW5rKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbXBsZXRpb25SZWNvcmQ7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBpbm5lclJlc3VsdCA9IHRoaXMuQ2FsbChpdGVyYXRvclJldHVybiwgaXRlcmF0b3IsIFtdKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHQvLyBpZiB3ZSBoaXQgaGVyZSwgdGhlbiBcImVcIiBpcyB0aGUgaW5uZXJSZXN1bHQgY29tcGxldGlvbiB0aGF0IG5lZWRzIHJlLXRocm93aW5nXG5cblx0XHRcdC8vIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9mIHR5cGUgXCJ0aHJvd1wiLCB0aGlzIHdpbGwgdGhyb3cuXG5cdFx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7XG5cdFx0XHRjb21wbGV0aW9uVGh1bmsgPSBudWxsOyAvLyBlbnN1cmUgaXQncyBub3QgY2FsbGVkIHR3aWNlLlxuXG5cdFx0XHQvLyBpZiBub3QsIHRoZW4gcmV0dXJuIHRoZSBpbm5lclJlc3VsdCBjb21wbGV0aW9uXG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7IC8vIGlmIGlubmVyUmVzdWx0IHdvcmtlZCwgdGhlbiB0aHJvdyBpZiB0aGUgY29tcGxldGlvbiBkb2VzXG5cdFx0Y29tcGxldGlvblRodW5rID0gbnVsbDsgLy8gZW5zdXJlIGl0J3Mgbm90IGNhbGxlZCB0d2ljZS5cblxuXHRcdGlmICh0aGlzLlR5cGUoaW5uZXJSZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIC5yZXR1cm4gbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBsZXRpb25SZWNvcmQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNyZWF0ZWl0ZXJyZXN1bHRvYmplY3Rcblx0Q3JlYXRlSXRlclJlc3VsdE9iamVjdDogZnVuY3Rpb24gQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh2YWx1ZSwgZG9uZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoZG9uZSkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoZG9uZSkgaXMgbm90IEJvb2xlYW4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRvbmU6IGRvbmVcblx0XHR9O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1yZWdleHBleGVjXG5cdFJlZ0V4cEV4ZWM6IGZ1bmN0aW9uIFJlZ0V4cEV4ZWMoUiwgUykge1xuXHRcdGlmICh0aGlzLlR5cGUoUikgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUiBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKFMpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1MgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgZXhlYyA9IHRoaXMuR2V0KFIsICdleGVjJyk7XG5cdFx0aWYgKHRoaXMuSXNDYWxsYWJsZShleGVjKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMuQ2FsbChleGVjLCBSLCBbU10pO1xuXHRcdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0aGlzLlR5cGUocmVzdWx0KSA9PT0gJ09iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImV4ZWNcIiBtZXRob2QgbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVnZXhFeGVjKFIsIFMpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcblx0QXJyYXlTcGVjaWVzQ3JlYXRlOiBmdW5jdGlvbiBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG5cdFx0aWYgKCF0aGlzLklzSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDAnKTtcblx0XHR9XG5cdFx0dmFyIGxlbiA9IGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGg7XG5cdFx0dmFyIEM7XG5cdFx0dmFyIGlzQXJyYXkgPSB0aGlzLklzQXJyYXkob3JpZ2luYWxBcnJheSk7XG5cdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdEMgPSB0aGlzLkdldChvcmlnaW5hbEFycmF5LCAnY29uc3RydWN0b3InKTtcblx0XHRcdC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjcm9zcy1yZWFsbSBub3JtYWwgQXJyYXksIGEgc2FtZS1yZWFsbSBBcnJheVxuXHRcdFx0Ly8gaWYgKHRoaXMuSXNDb25zdHJ1Y3RvcihDKSkge1xuXHRcdFx0Ly8gXHRpZiBDIGlzIGFub3RoZXIgcmVhbG0ncyBBcnJheSwgQyA9IHVuZGVmaW5lZFxuXHRcdFx0Ly8gXHRPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihBcnJheSkpKSA9PT0gbnVsbCA/XG5cdFx0XHQvLyB9XG5cdFx0XHRpZiAodGhpcy5UeXBlKEMpID09PSAnT2JqZWN0JyAmJiBoYXNTeW1ib2xzICYmICRTeW1ib2wuc3BlY2llcykge1xuXHRcdFx0XHRDID0gdGhpcy5HZXQoQywgJFN5bWJvbC5zcGVjaWVzKTtcblx0XHRcdFx0aWYgKEMgPT09IG51bGwpIHtcblx0XHRcdFx0XHRDID0gdm9pZCAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiAkQXJyYXkobGVuKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ29uc3RydWN0b3IoQykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDIG11c3QgYmUgYSBjb25zdHJ1Y3RvcicpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IEMobGVuKTsgLy8gdGhpcy5Db25zdHJ1Y3QoQywgbGVuKTtcblx0fSxcblxuXHRDcmVhdGVEYXRhUHJvcGVydHk6IGZ1bmN0aW9uIENyZWF0ZURhdGFQcm9wZXJ0eShPLCBQLCBWKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXHRcdHZhciBvbGREZXNjID0gJGdPUEQoTywgUCk7XG5cdFx0dmFyIGV4dGVuc2libGUgPSBvbGREZXNjIHx8IHRoaXMuSXNFeHRlbnNpYmxlKE8pO1xuXHRcdHZhciBpbW11dGFibGUgPSBvbGREZXNjICYmICghb2xkRGVzYy53cml0YWJsZSB8fCAhb2xkRGVzYy5jb25maWd1cmFibGUpO1xuXHRcdGlmIChpbW11dGFibGUgfHwgIWV4dGVuc2libGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIHtcblx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogdHJ1ZSxcblx0XHRcdCdbW0VudW1lcmFibGVdXSc6IHRydWUsXG5cdFx0XHQnW1tWYWx1ZV1dJzogVixcblx0XHRcdCdbW1dyaXRhYmxlXV0nOiB0cnVlXG5cdFx0fSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNyZWF0ZWRhdGFwcm9wZXJ0eW9ydGhyb3dcblx0Q3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdzogZnVuY3Rpb24gQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyhPLCBQLCBWKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXHRcdHZhciBzdWNjZXNzID0gdGhpcy5DcmVhdGVEYXRhUHJvcGVydHkoTywgUCwgVik7XG5cdFx0aWYgKCFzdWNjZXNzKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcigndW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHByb3BlcnR5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBzdWNjZXNzO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0Y3JlYXRlXG5cdE9iamVjdENyZWF0ZTogZnVuY3Rpb24gT2JqZWN0Q3JlYXRlKHByb3RvLCBpbnRlcm5hbFNsb3RzTGlzdCkge1xuXHRcdGlmIChwcm90byAhPT0gbnVsbCAmJiB0aGlzLlR5cGUocHJvdG8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHByb3RvIG11c3QgYmUgbnVsbCBvciBhbiBvYmplY3QnKTtcblx0XHR9XG5cdFx0dmFyIHNsb3RzID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBbXSA6IGludGVybmFsU2xvdHNMaXN0O1xuXHRcdGlmIChzbG90cy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdlcy1hYnN0cmFjdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBpbnRlcm5hbCBzbG90cycpO1xuXHRcdH1cblxuXHRcdGlmIChwcm90byA9PT0gbnVsbCAmJiAhJE9iamVjdENyZWF0ZSkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignbmF0aXZlIE9iamVjdC5jcmVhdGUgc3VwcG9ydCBpcyByZXF1aXJlZCB0byBjcmVhdGUgbnVsbCBvYmplY3RzJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICRPYmplY3RDcmVhdGUocHJvdG8pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcblx0QWR2YW5jZVN0cmluZ0luZGV4OiBmdW5jdGlvbiBBZHZhbmNlU3RyaW5nSW5kZXgoUywgaW5kZXgsIHVuaWNvZGUpIHtcblx0XHRpZiAodGhpcy5UeXBlKFMpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1MgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAwIGFuZCA8PSAyKio1MycpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKHVuaWNvZGUpICE9PSAnQm9vbGVhbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiB1bmljb2RlIG11c3QgYmUgYSBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdGlmICghdW5pY29kZSkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cdFx0dmFyIGxlbmd0aCA9IFMubGVuZ3RoO1xuXHRcdGlmICgoaW5kZXggKyAxKSA+PSBsZW5ndGgpIHtcblx0XHRcdHJldHVybiBpbmRleCArIDE7XG5cdFx0fVxuXG5cdFx0dmFyIGZpcnN0ID0gJGNoYXJDb2RlQXQoUywgaW5kZXgpO1xuXHRcdGlmIChmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRikge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgc2Vjb25kID0gJGNoYXJDb2RlQXQoUywgaW5kZXggKyAxKTtcblx0XHRpZiAoc2Vjb25kIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRikge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaW5kZXggKyAyO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY3JlYXRlbWV0aG9kcHJvcGVydHlcblx0Q3JlYXRlTWV0aG9kUHJvcGVydHk6IGZ1bmN0aW9uIENyZWF0ZU1ldGhvZFByb3BlcnR5KE8sIFAsIFYpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblxuXHRcdHZhciBuZXdEZXNjID0ge1xuXHRcdFx0J1tbQ29uZmlndXJhYmxlXV0nOiB0cnVlLFxuXHRcdFx0J1tbRW51bWVyYWJsZV1dJzogZmFsc2UsXG5cdFx0XHQnW1tWYWx1ZV1dJzogVixcblx0XHRcdCdbW1dyaXRhYmxlXV0nOiB0cnVlXG5cdFx0fTtcblx0XHRyZXR1cm4gRGVmaW5lT3duUHJvcGVydHkodGhpcywgTywgUCwgbmV3RGVzYyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1kZWZpbmVwcm9wZXJ0eW9ydGhyb3dcblx0RGVmaW5lUHJvcGVydHlPclRocm93OiBmdW5jdGlvbiBEZWZpbmVQcm9wZXJ0eU9yVGhyb3coTywgUCwgZGVzYykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0dmFyIERlc2MgPSBpc1Byb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBkZXNjKSA/IGRlc2MgOiB0aGlzLlRvUHJvcGVydHlEZXNjcmlwdG9yKGRlc2MpO1xuXHRcdGlmICghaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBEZXNjIGlzIG5vdCBhIHZhbGlkIFByb3BlcnR5IERlc2NyaXB0b3InKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gRGVmaW5lT3duUHJvcGVydHkodGhpcywgTywgUCwgRGVzYyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1kZWxldGVwcm9wZXJ0eW9ydGhyb3dcblx0RGVsZXRlUHJvcGVydHlPclRocm93OiBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eU9yVGhyb3coTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0dmFyIHN1Y2Nlc3MgPSBkZWxldGUgT1tQXTtcblx0XHRpZiAoIXN1Y2Nlc3MpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0F0dGVtcHQgdG8gZGVsZXRlIHByb3BlcnR5IGZhaWxlZC4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1lbnVtZXJhYmxlb3dubmFtZXNcblx0RW51bWVyYWJsZU93bk5hbWVzOiBmdW5jdGlvbiBFbnVtZXJhYmxlT3duTmFtZXMoTykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGtleXMoTyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW51bWJlci1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNOdW1iZXJWYWx1ZTogZnVuY3Rpb24gdGhpc051bWJlclZhbHVlKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdOdW1iZXInKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICROdW1iZXJWYWx1ZU9mKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtYm9vbGVhbi1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNCb29sZWFuVmFsdWU6IGZ1bmN0aW9uIHRoaXNCb29sZWFuVmFsdWUodmFsdWUpIHtcblx0XHRpZiAodGhpcy5UeXBlKHZhbHVlKSA9PT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICRCb29sZWFuVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLXN0cmluZy1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNTdHJpbmdWYWx1ZTogZnVuY3Rpb24gdGhpc1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdTdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICRTdHJpbmdWYWx1ZU9mKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtZGF0ZS1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNUaW1lVmFsdWU6IGZ1bmN0aW9uIHRoaXNUaW1lVmFsdWUodmFsdWUpIHtcblx0XHRyZXR1cm4gJERhdGVWYWx1ZU9mKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNldGludGVncml0eWxldmVsXG5cdFNldEludGVncml0eUxldmVsOiBmdW5jdGlvbiBTZXRJbnRlZ3JpdHlMZXZlbChPLCBsZXZlbCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmIChsZXZlbCAhPT0gJ3NlYWxlZCcgJiYgbGV2ZWwgIT09ICdmcm96ZW4nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogYGxldmVsYCBtdXN0IGJlIGBcInNlYWxlZFwiYCBvciBgXCJmcm96ZW5cImAnKTtcblx0XHR9XG5cdFx0aWYgKCEkcHJldmVudEV4dGVuc2lvbnMpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ1NldEludGVncml0eUxldmVsIHJlcXVpcmVzIG5hdGl2ZSBgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zYCBzdXBwb3J0Jyk7XG5cdFx0fVxuXHRcdHZhciBzdGF0dXMgPSAkcHJldmVudEV4dGVuc2lvbnMoTyk7XG5cdFx0aWYgKCFzdGF0dXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCEkZ09QTikge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignU2V0SW50ZWdyaXR5TGV2ZWwgcmVxdWlyZXMgbmF0aXZlIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2Agc3VwcG9ydCcpO1xuXHRcdH1cblx0XHR2YXIgdGhlS2V5cyA9ICRnT1BOKE8pO1xuXHRcdHZhciBFUyA9IHRoaXM7XG5cdFx0aWYgKGxldmVsID09PSAnc2VhbGVkJykge1xuXHRcdFx0Zm9yRWFjaCh0aGVLZXlzLCBmdW5jdGlvbiAoaykge1xuXHRcdFx0XHRFUy5EZWZpbmVQcm9wZXJ0eU9yVGhyb3coTywgaywgeyBjb25maWd1cmFibGU6IGZhbHNlIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChsZXZlbCA9PT0gJ2Zyb3plbicpIHtcblx0XHRcdGZvckVhY2godGhlS2V5cywgZnVuY3Rpb24gKGspIHtcblx0XHRcdFx0dmFyIGN1cnJlbnREZXNjID0gJGdPUEQoTywgayk7XG5cdFx0XHRcdGlmICh0eXBlb2YgY3VycmVudERlc2MgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0dmFyIGRlc2M7XG5cdFx0XHRcdFx0aWYgKEVTLklzQWNjZXNzb3JEZXNjcmlwdG9yKEVTLlRvUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnREZXNjKSkpIHtcblx0XHRcdFx0XHRcdGRlc2MgPSB7IGNvbmZpZ3VyYWJsZTogZmFsc2UgfTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZGVzYyA9IHsgY29uZmlndXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IGZhbHNlIH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdEVTLkRlZmluZVByb3BlcnR5T3JUaHJvdyhPLCBrLCBkZXNjKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdGVzdGludGVncml0eWxldmVsXG5cdFRlc3RJbnRlZ3JpdHlMZXZlbDogZnVuY3Rpb24gVGVzdEludGVncml0eUxldmVsKE8sIGxldmVsKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKGxldmVsICE9PSAnc2VhbGVkJyAmJiBsZXZlbCAhPT0gJ2Zyb3plbicpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgbGV2ZWxgIG11c3QgYmUgYFwic2VhbGVkXCJgIG9yIGBcImZyb3plblwiYCcpO1xuXHRcdH1cblx0XHR2YXIgc3RhdHVzID0gdGhpcy5Jc0V4dGVuc2libGUoTyk7XG5cdFx0aWYgKHN0YXR1cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgdGhlS2V5cyA9ICRnT1BOKE8pO1xuXHRcdHZhciBFUyA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoZUtleXMubGVuZ3RoID09PSAwIHx8IGV2ZXJ5KHRoZUtleXMsIGZ1bmN0aW9uIChrKSB7XG5cdFx0XHR2YXIgY3VycmVudERlc2MgPSAkZ09QRChPLCBrKTtcblx0XHRcdGlmICh0eXBlb2YgY3VycmVudERlc2MgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdGlmIChjdXJyZW50RGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGxldmVsID09PSAnZnJvemVuJyAmJiBFUy5Jc0RhdGFEZXNjcmlwdG9yKEVTLlRvUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnREZXNjKSkgJiYgY3VycmVudERlc2Mud3JpdGFibGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb3JkaW5hcnloYXNpbnN0YW5jZVxuXHRPcmRpbmFyeUhhc0luc3RhbmNlOiBmdW5jdGlvbiBPcmRpbmFyeUhhc0luc3RhbmNlKEMsIE8pIHtcblx0XHRpZiAodGhpcy5Jc0NhbGxhYmxlKEMpID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgUCA9IHRoaXMuR2V0KEMsICdwcm90b3R5cGUnKTtcblx0XHRpZiAodGhpcy5UeXBlKFApICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ09yZGluYXJ5SGFzSW5zdGFuY2UgY2FsbGVkIG9uIGFuIG9iamVjdCB3aXRoIGFuIGludmFsaWQgcHJvdG90eXBlIHByb3BlcnR5LicpO1xuXHRcdH1cblx0XHRyZXR1cm4gTyBpbnN0YW5jZW9mIEM7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vcmRpbmFyeWhhc3Byb3BlcnR5XG5cdE9yZGluYXJ5SGFzUHJvcGVydHk6IGZ1bmN0aW9uIE9yZGluYXJ5SGFzUHJvcGVydHkoTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBQIGluIE87XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pbnN0YW5jZW9mb3BlcmF0b3Jcblx0SW5zdGFuY2VvZk9wZXJhdG9yOiBmdW5jdGlvbiBJbnN0YW5jZW9mT3BlcmF0b3IoTywgQykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHZhciBpbnN0T2ZIYW5kbGVyID0gaGFzU3ltYm9scyAmJiAkU3ltYm9sLmhhc0luc3RhbmNlID8gdGhpcy5HZXRNZXRob2QoQywgJFN5bWJvbC5oYXNJbnN0YW5jZSkgOiB2b2lkIDA7XG5cdFx0aWYgKHR5cGVvZiBpbnN0T2ZIYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHRoaXMuQ2FsbChpbnN0T2ZIYW5kbGVyLCBDLCBbT10pKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoQykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgQ2AgaXMgbm90IENhbGxhYmxlJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLk9yZGluYXJ5SGFzSW5zdGFuY2UoQywgTyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc3Byb21pc2Vcblx0SXNQcm9taXNlOiBmdW5jdGlvbiBJc1Byb21pc2UoeCkge1xuXHRcdGlmICh0aGlzLlR5cGUoeCkgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghJFByb21pc2UpIHsgLy8gUHJvbWlzZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdCRQcm9taXNlVGhlbih4KTsgLy8gdGhyb3dzIGlmIG5vdCBhIHByb21pc2Vcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYWJzdHJhY3QtZXF1YWxpdHktY29tcGFyaXNvblxuXHQnQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbic6IGZ1bmN0aW9uIEFic3RyYWN0RXF1YWxpdHlDb21wYXJpc29uKHgsIHkpIHtcblx0XHR2YXIgeFR5cGUgPSB0aGlzLlR5cGUoeCk7XG5cdFx0dmFyIHlUeXBlID0gdGhpcy5UeXBlKHkpO1xuXHRcdGlmICh4VHlwZSA9PT0geVR5cGUpIHtcblx0XHRcdHJldHVybiB4ID09PSB5OyAvLyBFUzYrIHNwZWNpZmllZCB0aGlzIHNob3J0Y3V0IGFueXdheXMuXG5cdFx0fVxuXHRcdGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnTnVtYmVyJyAmJiB5VHlwZSA9PT0gJ1N0cmluZycpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10oeCwgdGhpcy5Ub051bWJlcih5KSk7XG5cdFx0fVxuXHRcdGlmICh4VHlwZSA9PT0gJ1N0cmluZycgJiYgeVR5cGUgPT09ICdOdW1iZXInKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHRoaXMuVG9OdW1iZXIoeCksIHkpO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdCb29sZWFuJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh0aGlzLlRvTnVtYmVyKHgpLCB5KTtcblx0XHR9XG5cdFx0aWYgKHlUeXBlID09PSAnQm9vbGVhbicpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10oeCwgdGhpcy5Ub051bWJlcih5KSk7XG5cdFx0fVxuXHRcdGlmICgoeFR5cGUgPT09ICdTdHJpbmcnIHx8IHhUeXBlID09PSAnTnVtYmVyJyB8fCB4VHlwZSA9PT0gJ1N5bWJvbCcpICYmIHlUeXBlID09PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvUHJpbWl0aXZlKHkpKTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnT2JqZWN0JyAmJiAoeVR5cGUgPT09ICdTdHJpbmcnIHx8IHlUeXBlID09PSAnTnVtYmVyJyB8fCB5VHlwZSA9PT0gJ1N5bWJvbCcpKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHRoaXMuVG9QcmltaXRpdmUoeCksIHkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb24sIG1heC1zdGF0ZW1lbnRzLCBpZC1sZW5ndGgsIG1heC1wYXJhbXNcblx0VmFsaWRhdGVBbmRBcHBseVByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gVmFsaWRhdGVBbmRBcHBseVByb3BlcnR5RGVzY3JpcHRvcihPLCBQLCBleHRlbnNpYmxlLCBEZXNjLCBjdXJyZW50KSB7XG5cdFx0Ly8gdGhpcyB1c2VzIHRoZSBFUzIwMTcrIGxvZ2ljLCBzaW5jZSBpdCBmaXhlcyBhIG51bWJlciBvZiBidWdzIGluIHRoZSBFUzIwMTUgbG9naWMuXG5cdFx0dmFyIG9UeXBlID0gdGhpcy5UeXBlKE8pO1xuXHRcdGlmIChvVHlwZSAhPT0gJ1VuZGVmaW5lZCcgJiYgb1R5cGUgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogTyBtdXN0IGJlIHVuZGVmaW5lZCBvciBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShleHRlbnNpYmxlKSAhPT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogZXh0ZW5zaWJsZSBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHRcdH1cblx0XHRpZiAoIWlzUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIERlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogRGVzYyBtdXN0IGJlIGEgUHJvcGVydHkgRGVzY3JpcHRvcicpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKGN1cnJlbnQpICE9PSAnVW5kZWZpbmVkJyAmJiAhaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgY3VycmVudCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBjdXJyZW50IG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yLCBvciB1bmRlZmluZWQnKTtcblx0XHR9XG5cdFx0aWYgKG9UeXBlICE9PSAnVW5kZWZpbmVkJyAmJiAhdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogaWYgTyBpcyBub3QgdW5kZWZpbmVkLCBQIG11c3QgYmUgYSBQcm9wZXJ0eSBLZXknKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShjdXJyZW50KSA9PT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdGlmICghZXh0ZW5zaWJsZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5Jc0dlbmVyaWNEZXNjcmlwdG9yKERlc2MpIHx8IHRoaXMuSXNEYXRhRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0XHRpZiAob1R5cGUgIT09ICdVbmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0RGVmaW5lT3duUHJvcGVydHkodGhpcywgTywgUCwge1xuXHRcdFx0XHRcdFx0J1tbQ29uZmlndXJhYmxlXV0nOiBEZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ10sXG5cdFx0XHRcdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiBEZXNjWydbW0VudW1lcmFibGVdXSddLFxuXHRcdFx0XHRcdFx0J1tbVmFsdWVdXSc6IERlc2NbJ1tbVmFsdWVdXSddLFxuXHRcdFx0XHRcdFx0J1tbV3JpdGFibGVdXSc6IERlc2NbJ1tbV3JpdGFibGVdXSddXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghdGhpcy5Jc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBEZXNjIGlzIG5vdCBhbiBhY2Nlc3NvciBkZXNjcmlwdG9yJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9UeXBlICE9PSAnVW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdHJldHVybiBEZWZpbmVPd25Qcm9wZXJ0eSh0aGlzLCBPLCBQLCBEZXNjKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh0aGlzLklzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykgJiYgISgnW1tDb25maWd1cmFibGVdXScgaW4gRGVzYykgJiYgISgnW1tFbnVtZXJhYmxlXV0nIGluIERlc2MpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKGlzU2FtZVByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBEZXNjLCBjdXJyZW50KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7IC8vIHJlbW92ZWQgYnkgRVMyMDE3LCBidXQgc2hvdWxkIHN0aWxsIGJlIGNvcnJlY3Rcblx0XHR9XG5cdFx0Ly8gXCJpZiBldmVyeSBmaWVsZCBpbiBEZXNjIGlzIGFic2VudCwgcmV0dXJuIHRydWVcIiBjYW4ndCByZWFsbHkgbWF0Y2ggdGhlIGFzc2VydGlvbiB0aGF0IGl0J3MgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yXG5cdFx0aWYgKCFjdXJyZW50WydbW0NvbmZpZ3VyYWJsZV1dJ10pIHtcblx0XHRcdGlmIChEZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ10pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCdbW0VudW1lcmFibGVdXScgaW4gRGVzYyAmJiAhRGVzY1snW1tFbnVtZXJhYmxlXV0nXSA9PT0gISFjdXJyZW50WydbW0VudW1lcmFibGVdXSddKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHRoaXMuSXNHZW5lcmljRGVzY3JpcHRvcihEZXNjKSkge1xuXHRcdFx0Ly8gbm8gZnVydGhlciB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLlxuXHRcdH0gZWxzZSBpZiAodGhpcy5Jc0RhdGFEZXNjcmlwdG9yKGN1cnJlbnQpICE9PSB0aGlzLklzRGF0YURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdGlmICghY3VycmVudFsnW1tDb25maWd1cmFibGVdXSddKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLklzRGF0YURlc2NyaXB0b3IoY3VycmVudCkpIHtcblx0XHRcdFx0aWYgKG9UeXBlICE9PSAnVW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIHtcblx0XHRcdFx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogY3VycmVudFsnW1tDb25maWd1cmFibGVdXSddLFxuXHRcdFx0XHRcdFx0J1tbRW51bWVyYWJsZV1dJzogY3VycmVudFsnW1tFbnVtZXJhYmxlXV0nXSxcblx0XHRcdFx0XHRcdCdbW0dldF1dJzogdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob1R5cGUgIT09ICdVbmRlZmluZWQnKSB7XG5cdFx0XHRcdERlZmluZU93blByb3BlcnR5KHRoaXMsIE8sIFAsIHtcblx0XHRcdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IGN1cnJlbnRbJ1tbQ29uZmlndXJhYmxlXV0nXSxcblx0XHRcdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiBjdXJyZW50WydbW0VudW1lcmFibGVdXSddLFxuXHRcdFx0XHRcdCdbW1ZhbHVlXV0nOiB1bmRlZmluZWRcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLklzRGF0YURlc2NyaXB0b3IoY3VycmVudCkgJiYgdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRbJ1tbQ29uZmlndXJhYmxlXV0nXSAmJiAhY3VycmVudFsnW1tXcml0YWJsZV1dJ10pIHtcblx0XHRcdFx0aWYgKCdbW1dyaXRhYmxlXV0nIGluIERlc2MgJiYgRGVzY1snW1tXcml0YWJsZV1dJ10pIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCdbW1ZhbHVlXV0nIGluIERlc2MgJiYgIXRoaXMuU2FtZVZhbHVlKERlc2NbJ1tbVmFsdWVdXSddLCBjdXJyZW50WydbW1ZhbHVlXV0nXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKGN1cnJlbnQpICYmIHRoaXMuSXNBY2Nlc3NvckRlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdGlmICghY3VycmVudFsnW1tDb25maWd1cmFibGVdXSddKSB7XG5cdFx0XHRcdGlmICgnW1tTZXRdXScgaW4gRGVzYyAmJiAhdGhpcy5TYW1lVmFsdWUoRGVzY1snW1tTZXRdXSddLCBjdXJyZW50WydbW1NldF1dJ10pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgnW1tHZXRdXScgaW4gRGVzYyAmJiAhdGhpcy5TYW1lVmFsdWUoRGVzY1snW1tHZXRdXSddLCBjdXJyZW50WydbW0dldF1dJ10pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogY3VycmVudCBhbmQgRGVzYyBhcmUgbm90IGJvdGggZGF0YSwgYm90aCBhY2Nlc3NvcnMsIG9yIG9uZSBhY2Nlc3NvciBhbmQgb25lIGRhdGEuJyk7XG5cdFx0fVxuXHRcdGlmIChvVHlwZSAhPT0gJ1VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBEZWZpbmVPd25Qcm9wZXJ0eSh0aGlzLCBPLCBQLCBEZXNjKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vcmRpbmFyeWRlZmluZW93bnByb3BlcnR5XG5cdE9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHk6IGZ1bmN0aW9uIE9yZGluYXJ5RGVmaW5lT3duUHJvcGVydHkoTywgUCwgRGVzYykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogTyBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFAgbXVzdCBiZSBhIFByb3BlcnR5IEtleScpO1xuXHRcdH1cblx0XHRpZiAoIWlzUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIERlc2MpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogRGVzYyBtdXN0IGJlIGEgUHJvcGVydHkgRGVzY3JpcHRvcicpO1xuXHRcdH1cblx0XHR2YXIgZGVzYyA9ICRnT1BEKE8sIFApO1xuXHRcdHZhciBjdXJyZW50ID0gZGVzYyAmJiB0aGlzLlRvUHJvcGVydHlEZXNjcmlwdG9yKGRlc2MpO1xuXHRcdHZhciBleHRlbnNpYmxlID0gdGhpcy5Jc0V4dGVuc2libGUoTyk7XG5cdFx0cmV0dXJuIHRoaXMuVmFsaWRhdGVBbmRBcHBseVByb3BlcnR5RGVzY3JpcHRvcihPLCBQLCBleHRlbnNpYmxlLCBEZXNjLCBjdXJyZW50KTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9yZGluYXJ5Z2V0b3ducHJvcGVydHlcblx0T3JkaW5hcnlHZXRPd25Qcm9wZXJ0eTogZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25Qcm9wZXJ0eShPLCBQKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdGlmICghaGFzKE8sIFApKSB7XG5cdFx0XHRyZXR1cm4gdm9pZCAwO1xuXHRcdH1cblx0XHRpZiAoISRnT1BEKSB7XG5cdFx0XHQvLyBFUzMgZmFsbGJhY2tcblx0XHRcdHZhciBhcnJheUxlbmd0aCA9IHRoaXMuSXNBcnJheShPKSAmJiBQID09PSAnbGVuZ3RoJztcblx0XHRcdHZhciByZWdleExhc3RJbmRleCA9IHRoaXMuSXNSZWdFeHAoTykgJiYgUCA9PT0gJ2xhc3RJbmRleCc7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQnW1tDb25maWd1cmFibGVdXSc6ICEoYXJyYXlMZW5ndGggfHwgcmVnZXhMYXN0SW5kZXgpLFxuXHRcdFx0XHQnW1tFbnVtZXJhYmxlXV0nOiAkaXNFbnVtZXJhYmxlKE8sIFApLFxuXHRcdFx0XHQnW1tWYWx1ZV1dJzogT1tQXSxcblx0XHRcdFx0J1tbV3JpdGFibGVdXSc6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLlRvUHJvcGVydHlEZXNjcmlwdG9yKCRnT1BEKE8sIFApKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFycmF5Y3JlYXRlXG5cdEFycmF5Q3JlYXRlOiBmdW5jdGlvbiBBcnJheUNyZWF0ZShsZW5ndGgpIHtcblx0XHRpZiAoIXRoaXMuSXNJbnRlZ2VyKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBsZW5ndGhgIG11c3QgYmUgYW4gaW50ZWdlciBOdW1iZXIgPj0gMCcpO1xuXHRcdH1cblx0XHRpZiAobGVuZ3RoID4gTUFYX0FSUkFZX0xFTkdUSCkge1xuXHRcdFx0dGhyb3cgbmV3ICRSYW5nZUVycm9yKCdsZW5ndGggaXMgZ3JlYXRlciB0aGFuICgyKiozMiAtIDEpJyk7XG5cdFx0fVxuXHRcdHZhciBwcm90byA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogJEFycmF5UHJvdG90eXBlO1xuXHRcdHZhciBBID0gW107IC8vIHN0ZXBzIDUgLSA3LCBhbmQgOVxuXHRcdGlmIChwcm90byAhPT0gJEFycmF5UHJvdG90eXBlKSB7IC8vIHN0ZXAgOFxuXHRcdFx0aWYgKCEkc2V0UHJvdG8pIHtcblx0XHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignQXJyYXlDcmVhdGU6IGEgYHByb3RvYCBhcmd1bWVudCB0aGF0IGlzIG5vdCBgQXJyYXkucHJvdG90eXBlYCBpcyBub3Qgc3VwcG9ydGVkIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSBbW1Byb3RvdHlwZV1dJyk7XG5cdFx0XHR9XG5cdFx0XHQkc2V0UHJvdG8oQSwgcHJvdG8pO1xuXHRcdH1cblx0XHRpZiAobGVuZ3RoICE9PSAwKSB7IC8vIGJ5cGFzc2VzIHRoZSBuZWVkIGZvciBzdGVwIDJcblx0XHRcdEEubGVuZ3RoID0gbGVuZ3RoO1xuXHRcdH1cblx0XHQvKiBzdGVwIDEwLCB0aGUgYWJvdmUgYXMgYSBzaG9ydGN1dCBmb3IgdGhlIGJlbG93XG5cdFx0dGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCB7XG5cdFx0XHQnW1tDb25maWd1cmFibGVdXSc6IGZhbHNlLFxuXHRcdFx0J1tbRW51bWVyYWJsZV1dJzogZmFsc2UsXG5cdFx0XHQnW1tWYWx1ZV1dJzogbGVuZ3RoLFxuXHRcdFx0J1tbV3JpdGFibGVdXSc6IHRydWVcblx0XHR9KTtcblx0XHQqL1xuXHRcdHJldHVybiBBO1xuXHR9LFxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50cywgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuXHRBcnJheVNldExlbmd0aDogZnVuY3Rpb24gQXJyYXlTZXRMZW5ndGgoQSwgRGVzYykge1xuXHRcdGlmICghdGhpcy5Jc0FycmF5KEEpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogQSBtdXN0IGJlIGFuIEFycmF5Jyk7XG5cdFx0fVxuXHRcdGlmICghaXNQcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgRGVzYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBEZXNjIG11c3QgYmUgYSBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXHRcdGlmICghKCdbW1ZhbHVlXV0nIGluIERlc2MpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCBEZXNjKTtcblx0XHR9XG5cdFx0dmFyIG5ld0xlbkRlc2MgPSBhc3NpZ24oe30sIERlc2MpO1xuXHRcdHZhciBuZXdMZW4gPSB0aGlzLlRvVWludDMyKERlc2NbJ1tbVmFsdWVdXSddKTtcblx0XHR2YXIgbnVtYmVyTGVuID0gdGhpcy5Ub051bWJlcihEZXNjWydbW1ZhbHVlXV0nXSk7XG5cdFx0aWYgKG5ld0xlbiAhPT0gbnVtYmVyTGVuKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFJhbmdlRXJyb3IoJ0ludmFsaWQgYXJyYXkgbGVuZ3RoJyk7XG5cdFx0fVxuXHRcdG5ld0xlbkRlc2NbJ1tbVmFsdWVdXSddID0gbmV3TGVuO1xuXHRcdHZhciBvbGRMZW5EZXNjID0gdGhpcy5PcmRpbmFyeUdldE93blByb3BlcnR5KEEsICdsZW5ndGgnKTtcblx0XHRpZiAoIXRoaXMuSXNEYXRhRGVzY3JpcHRvcihvbGRMZW5EZXNjKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGFuIGFycmF5IGhhZCBhIG5vbi1kYXRhIGRlc2NyaXB0b3Igb24gYGxlbmd0aGAnKTtcblx0XHR9XG5cdFx0dmFyIG9sZExlbiA9IG9sZExlbkRlc2NbJ1tbVmFsdWVdXSddO1xuXHRcdGlmIChuZXdMZW4gPj0gb2xkTGVuKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCBuZXdMZW5EZXNjKTtcblx0XHR9XG5cdFx0aWYgKCFvbGRMZW5EZXNjWydbW1dyaXRhYmxlXV0nXSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgbmV3V3JpdGFibGU7XG5cdFx0aWYgKCEoJ1tbV3JpdGFibGVdXScgaW4gbmV3TGVuRGVzYykgfHwgbmV3TGVuRGVzY1snW1tXcml0YWJsZV1dJ10pIHtcblx0XHRcdG5ld1dyaXRhYmxlID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3V3JpdGFibGUgPSBmYWxzZTtcblx0XHRcdG5ld0xlbkRlc2NbJ1tbV3JpdGFibGVdXSddID0gdHJ1ZTtcblx0XHR9XG5cdFx0dmFyIHN1Y2NlZWRlZCA9IHRoaXMuT3JkaW5hcnlEZWZpbmVPd25Qcm9wZXJ0eShBLCAnbGVuZ3RoJywgbmV3TGVuRGVzYyk7XG5cdFx0aWYgKCFzdWNjZWVkZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0d2hpbGUgKG5ld0xlbiA8IG9sZExlbikge1xuXHRcdFx0b2xkTGVuIC09IDE7XG5cdFx0XHR2YXIgZGVsZXRlU3VjY2VlZGVkID0gZGVsZXRlIEFbdGhpcy5Ub1N0cmluZyhvbGRMZW4pXTtcblx0XHRcdGlmICghZGVsZXRlU3VjY2VlZGVkKSB7XG5cdFx0XHRcdG5ld0xlbkRlc2NbJ1tbVmFsdWVdXSddID0gb2xkTGVuICsgMTtcblx0XHRcdFx0aWYgKCFuZXdXcml0YWJsZSkge1xuXHRcdFx0XHRcdG5ld0xlbkRlc2NbJ1tbV3JpdGFibGVdXSddID0gZmFsc2U7XG5cdFx0XHRcdFx0dGhpcy5PcmRpbmFyeURlZmluZU93blByb3BlcnR5KEEsICdsZW5ndGgnLCBuZXdMZW5EZXNjKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFuZXdXcml0YWJsZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuT3JkaW5hcnlEZWZpbmVPd25Qcm9wZXJ0eShBLCAnbGVuZ3RoJywgeyAnW1tXcml0YWJsZV1dJzogZmFsc2UgfSk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY3JlYXRlaHRtbFxuXHRDcmVhdGVIVE1MOiBmdW5jdGlvbiBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh0YWcpICE9PSAnU3RyaW5nJyB8fCB0aGlzLlR5cGUoYXR0cmlidXRlKSAhPT0gJ1N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgdGFnYCBhbmQgYGF0dHJpYnV0ZWAgbXVzdCBiZSBzdHJpbmdzJyk7XG5cdFx0fVxuXHRcdHZhciBzdHIgPSB0aGlzLlJlcXVpcmVPYmplY3RDb2VyY2libGUoc3RyaW5nKTtcblx0XHR2YXIgUyA9IHRoaXMuVG9TdHJpbmcoc3RyKTtcblx0XHR2YXIgcDEgPSAnPCcgKyB0YWc7XG5cdFx0aWYgKGF0dHJpYnV0ZSAhPT0gJycpIHtcblx0XHRcdHZhciBWID0gdGhpcy5Ub1N0cmluZyh2YWx1ZSk7XG5cdFx0XHR2YXIgZXNjYXBlZFYgPSAkcmVwbGFjZShWLCAvXFx4MjIvZywgJyZxdW90OycpO1xuXHRcdFx0cDEgKz0gJ1xceDIwJyArIGF0dHJpYnV0ZSArICdcXHgzRFxceDIyJyArIGVzY2FwZWRWICsgJ1xceDIyJztcblx0XHR9XG5cdFx0cmV0dXJuIHAxICsgJz4nICsgUyArICc8LycgKyB0YWcgKyAnPic7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1nZXRvd25wcm9wZXJ0eWtleXNcblx0R2V0T3duUHJvcGVydHlLZXlzOiBmdW5jdGlvbiBHZXRPd25Qcm9wZXJ0eUtleXMoTywgVHlwZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmIChUeXBlID09PSAnU3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIGhhc1N5bWJvbHMgJiYgJGdPUFMgPyAkZ09QUyhPKSA6IFtdO1xuXHRcdH1cblx0XHRpZiAoVHlwZSA9PT0gJ1N0cmluZycpIHtcblx0XHRcdGlmICghJGdPUE4pIHtcblx0XHRcdFx0cmV0dXJuIGtleXMoTyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJGdPUE4oTyk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgVHlwZWAgbXVzdCBiZSBgXCJTdHJpbmdcImAgb3IgYFwiU3ltYm9sXCJgJyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zeW1ib2xkZXNjcmlwdGl2ZXN0cmluZ1xuXHRTeW1ib2xEZXNjcmlwdGl2ZVN0cmluZzogZnVuY3Rpb24gU3ltYm9sRGVzY3JpcHRpdmVTdHJpbmcoc3ltKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShzeW0pICE9PSAnU3ltYm9sJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBzeW1gIG11c3QgYmUgYSBTeW1ib2wnKTtcblx0XHR9XG5cdFx0cmV0dXJuICRTeW1ib2xUb1N0cmluZyhzeW0pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZ2V0c3Vic3RpdHV0aW9uXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50cywgbWF4LXBhcmFtcywgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuXHRHZXRTdWJzdGl0dXRpb246IGZ1bmN0aW9uIEdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcblx0XHRpZiAodGhpcy5UeXBlKG1hdGNoZWQpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBtYXRjaGVkYCBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHRcdHZhciBtYXRjaExlbmd0aCA9IG1hdGNoZWQubGVuZ3RoO1xuXG5cdFx0aWYgKHRoaXMuVHlwZShzdHIpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGBzdHJgIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cdFx0dmFyIHN0cmluZ0xlbmd0aCA9IHN0ci5sZW5ndGg7XG5cblx0XHRpZiAoIXRoaXMuSXNJbnRlZ2VyKHBvc2l0aW9uKSB8fCBwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiBzdHJpbmdMZW5ndGgpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgcG9zaXRpb25gIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyLCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgYHN0cmluZ2AsIGdvdCAnICsgaW5zcGVjdChwb3NpdGlvbikpO1xuXHRcdH1cblxuXHRcdHZhciBFUyA9IHRoaXM7XG5cdFx0dmFyIGlzU3RyaW5nT3JIb2xlID0gZnVuY3Rpb24gKGNhcHR1cmUsIGluZGV4LCBhcnIpIHsgcmV0dXJuIEVTLlR5cGUoY2FwdHVyZSkgPT09ICdTdHJpbmcnIHx8ICEoaW5kZXggaW4gYXJyKTsgfTtcblx0XHRpZiAoIXRoaXMuSXNBcnJheShjYXB0dXJlcykgfHwgIWV2ZXJ5KGNhcHR1cmVzLCBpc1N0cmluZ09ySG9sZSkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBgY2FwdHVyZXNgIG11c3QgYmUgYSBMaXN0IG9mIFN0cmluZ3MsIGdvdCAnICsgaW5zcGVjdChjYXB0dXJlcykpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLlR5cGUocmVwbGFjZW1lbnQpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IGByZXBsYWNlbWVudGAgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaExlbmd0aDtcblx0XHR2YXIgbSA9IGNhcHR1cmVzLmxlbmd0aDtcblxuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJlcGxhY2VtZW50Lmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHQvLyBpZiB0aGlzIGlzIGEgJCwgYW5kIGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHJlcGxhY2VtZW50XG5cdFx0XHR2YXIgY3VycmVudCA9IHJlcGxhY2VtZW50W2ldO1xuXHRcdFx0dmFyIGlzTGFzdCA9IChpICsgMSkgPj0gcmVwbGFjZW1lbnQubGVuZ3RoO1xuXHRcdFx0dmFyIG5leHRJc0xhc3QgPSAoaSArIDIpID49IHJlcGxhY2VtZW50Lmxlbmd0aDtcblx0XHRcdGlmIChjdXJyZW50ID09PSAnJCcgJiYgIWlzTGFzdCkge1xuXHRcdFx0XHR2YXIgbmV4dCA9IHJlcGxhY2VtZW50W2kgKyAxXTtcblx0XHRcdFx0aWYgKG5leHQgPT09ICckJykge1xuXHRcdFx0XHRcdHJlc3VsdCArPSAnJCc7XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG5leHQgPT09ICcmJykge1xuXHRcdFx0XHRcdHJlc3VsdCArPSBtYXRjaGVkO1xuXHRcdFx0XHRcdGkgKz0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChuZXh0ID09PSAnYCcpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gcG9zaXRpb24gPT09IDAgPyAnJyA6IHN0clNsaWNlKHN0ciwgMCwgcG9zaXRpb24gLSAxKTtcblx0XHRcdFx0XHRpICs9IDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAobmV4dCA9PT0gXCInXCIpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gdGFpbFBvcyA+PSBzdHJpbmdMZW5ndGggPyAnJyA6IHN0clNsaWNlKHN0ciwgdGFpbFBvcyk7XG5cdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBuZXh0TmV4dCA9IG5leHRJc0xhc3QgPyBudWxsIDogcmVwbGFjZW1lbnRbaSArIDJdO1xuXHRcdFx0XHRcdGlmIChpc0RpZ2l0KG5leHQpICYmIG5leHQgIT09ICcwJyAmJiAobmV4dElzTGFzdCB8fCAhaXNEaWdpdChuZXh0TmV4dCkpKSB7XG5cdFx0XHRcdFx0XHQvLyAkMSB0aHJvdWdoICQ5LCBhbmQgbm90IGZvbGxvd2VkIGJ5IGEgZGlnaXRcblx0XHRcdFx0XHRcdHZhciBuID0gcGFyc2VJbnRlZ2VyKG5leHQsIDEwKTtcblx0XHRcdFx0XHRcdC8vIGlmIChuID4gbSwgaW1wbC1kZWZpbmVkKVxuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IChuIDw9IG0gJiYgdGhpcy5UeXBlKGNhcHR1cmVzW24gLSAxXSkgPT09ICdVbmRlZmluZWQnKSA/ICcnIDogY2FwdHVyZXNbbiAtIDFdO1xuXHRcdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNEaWdpdChuZXh0KSAmJiAobmV4dElzTGFzdCB8fCBpc0RpZ2l0KG5leHROZXh0KSkpIHtcblx0XHRcdFx0XHRcdC8vICQwMCB0aHJvdWdoICQ5OVxuXHRcdFx0XHRcdFx0dmFyIG5uID0gbmV4dCArIG5leHROZXh0O1xuXHRcdFx0XHRcdFx0dmFyIG5uSSA9IHBhcnNlSW50ZWdlcihubiwgMTApIC0gMTtcblx0XHRcdFx0XHRcdC8vIGlmIG5uID09PSAnMDAnIG9yIG5uID4gbSwgaW1wbC1kZWZpbmVkXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gKG5uIDw9IG0gJiYgdGhpcy5UeXBlKGNhcHR1cmVzW25uSV0pID09PSAnVW5kZWZpbmVkJykgPyAnJyA6IGNhcHR1cmVzW25uSV07XG5cdFx0XHRcdFx0XHRpICs9IDI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc3VsdCArPSAnJCc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyB0aGUgZmluYWwgJCwgb3IgZWxzZSBub3QgYSAkXG5cdFx0XHRcdHJlc3VsdCArPSByZXBsYWNlbWVudFtpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufSk7XG5cbmRlbGV0ZSBFUzYuQ2hlY2tPYmplY3RDb2VyY2libGU7IC8vIHJlbmFtZWQgaW4gRVM2IHRvIFJlcXVpcmVPYmplY3RDb2VyY2libGVcblxubW9kdWxlLmV4cG9ydHMgPSBFUzY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuL0dldEludHJpbnNpYycpO1xuXG52YXIgJEFycmF5ID0gR2V0SW50cmluc2ljKCclQXJyYXklJyk7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgRVMyMDE1ID0gcmVxdWlyZSgnLi9lczIwMTUnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJpbmQnKTtcblxudmFyICRhcnJheVB1c2ggPSBjYWxsQmluZCgkQXJyYXkucHJvdG90eXBlLnB1c2gpO1xudmFyICRhcnJheVNsaWNlID0gY2FsbEJpbmQoJEFycmF5LnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGFycmF5Sm9pbiA9IGNhbGxCaW5kKCRBcnJheS5wcm90b3R5cGUuam9pbik7XG5cbnZhciBFUzIwMTYgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzIwMTUpLCB7XG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlbm9ubnVtYmVyXG5cdFNhbWVWYWx1ZU5vbk51bWJlcjogZnVuY3Rpb24gU2FtZVZhbHVlTm9uTnVtYmVyKHgsIHkpIHtcblx0XHRpZiAodHlwZW9mIHggPT09ICdudW1iZXInIHx8IHR5cGVvZiB4ICE9PSB0eXBlb2YgeSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignU2FtZVZhbHVlTm9uTnVtYmVyIHJlcXVpcmVzIHR3byBub24tbnVtYmVyIHZhbHVlcyBvZiB0aGUgc2FtZSB0eXBlLicpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5TYW1lVmFsdWUoeCwgeSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1pdGVyYWJsZXRvYXJyYXlsaWtlXG5cdEl0ZXJhYmxlVG9BcnJheUxpa2U6IGZ1bmN0aW9uIEl0ZXJhYmxlVG9BcnJheUxpa2UoaXRlbXMpIHtcblx0XHR2YXIgdXNpbmdJdGVyYXRvcjtcblx0XHRpZiAoaGFzU3ltYm9scykge1xuXHRcdFx0dXNpbmdJdGVyYXRvciA9IHRoaXMuR2V0TWV0aG9kKGl0ZW1zLCBTeW1ib2wuaXRlcmF0b3IpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5Jc0FycmF5KGl0ZW1zKSkge1xuXHRcdFx0dXNpbmdJdGVyYXRvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyIGkgPSAtMTtcblx0XHRcdFx0dmFyIGFyciA9IHRoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8taW52YWxpZC10aGlzXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bmV4dDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aSArPSAxO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0ZG9uZTogaSA+PSBhcnIubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogYXJyW2ldXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0aGlzLlR5cGUoaXRlbXMpID09PSAnU3RyaW5nJykge1xuXHRcdFx0dmFyIEVTID0gdGhpcztcblx0XHRcdHVzaW5nSXRlcmF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBpID0gMDtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRuZXh0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR2YXIgbmV4dEluZGV4ID0gRVMuQWR2YW5jZVN0cmluZ0luZGV4KGl0ZW1zLCBpLCB0cnVlKTtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICRhcnJheUpvaW4oJGFycmF5U2xpY2UoaXRlbXMsIGksIG5leHRJbmRleCksICcnKTtcblx0XHRcdFx0XHRcdGkgPSBuZXh0SW5kZXg7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRkb25lOiBuZXh0SW5kZXggPiBpdGVtcy5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHVzaW5nSXRlcmF0b3IgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLkdldEl0ZXJhdG9yKGl0ZW1zLCB1c2luZ0l0ZXJhdG9yKTtcblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdHZhciBuZXh0ID0gdHJ1ZTtcblx0XHRcdHdoaWxlIChuZXh0KSB7XG5cdFx0XHRcdG5leHQgPSB0aGlzLkl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0dmFyIG5leHRWYWx1ZSA9IHRoaXMuSXRlcmF0b3JWYWx1ZShuZXh0KTtcblx0XHRcdFx0XHQkYXJyYXlQdXNoKHZhbHVlcywgbmV4dFZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5Ub09iamVjdChpdGVtcyk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVTMjAxNjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xuXG52YXIgYXNzZXJ0UmVjb3JkID0gcmVxdWlyZSgnLi9oZWxwZXJzL2Fzc2VydFJlY29yZCcpO1xudmFyIGlzUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzUHJvcGVydHlEZXNjcmlwdG9yJyk7XG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzTmFOJyk7XG52YXIgJGlzRmluaXRlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzRmluaXRlJyk7XG5cbnZhciBzaWduID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NpZ24nKTtcbnZhciBtb2QgPSByZXF1aXJlKCcuL2hlbHBlcnMvbW9kJyk7XG5cbnZhciBJc0NhbGxhYmxlID0gcmVxdWlyZSgnaXMtY2FsbGFibGUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJ2VzLXRvLXByaW1pdGl2ZS9lczUnKTtcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvY2FsbEJpbmQnKTtcbnZhciBzdHJTbGljZSA9IGNhbGxCaW5kKCRTdHJpbmcucHJvdG90eXBlLnNsaWNlKTtcblxudmFyIGlzUHJlZml4T2YgPSBmdW5jdGlvbiBpc1ByZWZpeE9mKHByZWZpeCwgc3RyaW5nKSB7XG5cdGlmIChwcmVmaXggPT09IHN0cmluZykge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdGlmIChwcmVmaXgubGVuZ3RoID4gc3RyaW5nLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZXR1cm4gc3RyU2xpY2Uoc3RyaW5nLCAwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufTtcblxuLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OVxudmFyIEVTNSA9IHtcblx0VG9QcmltaXRpdmU6IHRvUHJpbWl0aXZlLFxuXG5cdFRvQm9vbGVhbjogZnVuY3Rpb24gVG9Cb29sZWFuKHZhbHVlKSB7XG5cdFx0cmV0dXJuICEhdmFsdWU7XG5cdH0sXG5cdFRvTnVtYmVyOiBmdW5jdGlvbiBUb051bWJlcih2YWx1ZSkge1xuXHRcdHJldHVybiArdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0fSxcblx0VG9JbnRlZ2VyOiBmdW5jdGlvbiBUb0ludGVnZXIodmFsdWUpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcih2YWx1ZSk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0aWYgKG51bWJlciA9PT0gMCB8fCAhJGlzRmluaXRlKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuXHRcdHJldHVybiBzaWduKG51bWJlcikgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuXHR9LFxuXHRUb0ludDMyOiBmdW5jdGlvbiBUb0ludDMyKHgpIHtcblx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih4KSA+PiAwO1xuXHR9LFxuXHRUb1VpbnQzMjogZnVuY3Rpb24gVG9VaW50MzIoeCkge1xuXHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHgpID4+PiAwO1xuXHR9LFxuXHRUb1VpbnQxNjogZnVuY3Rpb24gVG9VaW50MTYodmFsdWUpIHtcblx0XHR2YXIgbnVtYmVyID0gdGhpcy5Ub051bWJlcih2YWx1ZSk7XG5cdFx0aWYgKCRpc05hTihudW1iZXIpIHx8IG51bWJlciA9PT0gMCB8fCAhJGlzRmluaXRlKG51bWJlcikpIHsgcmV0dXJuIDA7IH1cblx0XHR2YXIgcG9zSW50ID0gc2lnbihudW1iZXIpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcblx0XHRyZXR1cm4gbW9kKHBvc0ludCwgMHgxMDAwMCk7XG5cdH0sXG5cdFRvU3RyaW5nOiBmdW5jdGlvbiBUb1N0cmluZyh2YWx1ZSkge1xuXHRcdHJldHVybiAkU3RyaW5nKHZhbHVlKTtcblx0fSxcblx0VG9PYmplY3Q6IGZ1bmN0aW9uIFRvT2JqZWN0KHZhbHVlKSB7XG5cdFx0dGhpcy5DaGVja09iamVjdENvZXJjaWJsZSh2YWx1ZSk7XG5cdFx0cmV0dXJuICRPYmplY3QodmFsdWUpO1xuXHR9LFxuXHRDaGVja09iamVjdENvZXJjaWJsZTogZnVuY3Rpb24gQ2hlY2tPYmplY3RDb2VyY2libGUodmFsdWUsIG9wdE1lc3NhZ2UpIHtcblx0XHQvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0XHRpZiAodmFsdWUgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3Iob3B0TWVzc2FnZSB8fCAnQ2Fubm90IGNhbGwgbWV0aG9kIG9uICcgKyB2YWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0SXNDYWxsYWJsZTogSXNDYWxsYWJsZSxcblx0U2FtZVZhbHVlOiBmdW5jdGlvbiBTYW1lVmFsdWUoeCwgeSkge1xuXHRcdGlmICh4ID09PSB5KSB7IC8vIDAgPT09IC0wLCBidXQgdGhleSBhcmUgbm90IGlkZW50aWNhbC5cblx0XHRcdGlmICh4ID09PSAwKSB7IHJldHVybiAxIC8geCA9PT0gMSAvIHk7IH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gJGlzTmFOKHgpICYmICRpc05hTih5KTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLThcblx0VHlwZTogZnVuY3Rpb24gVHlwZSh4KSB7XG5cdFx0aWYgKHggPT09IG51bGwpIHtcblx0XHRcdHJldHVybiAnTnVsbCc7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiAnVW5kZWZpbmVkJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuICdPYmplY3QnO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG5cdFx0XHRyZXR1cm4gJ051bWJlcic7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gJ0Jvb2xlYW4nO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gJ1N0cmluZyc7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wcm9wZXJ0eS1kZXNjcmlwdG9yLXNwZWNpZmljYXRpb24tdHlwZVxuXHRJc1Byb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gSXNQcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykge1xuXHRcdHJldHVybiBpc1Byb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBEZXNjKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC4xXG5cdElzQWNjZXNzb3JEZXNjcmlwdG9yOiBmdW5jdGlvbiBJc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAoIWhhcyhEZXNjLCAnW1tHZXRdXScpICYmICFoYXMoRGVzYywgJ1tbU2V0XV0nKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjJcblx0SXNEYXRhRGVzY3JpcHRvcjogZnVuY3Rpb24gSXNEYXRhRGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAoIWhhcyhEZXNjLCAnW1tWYWx1ZV1dJykgJiYgIWhhcyhEZXNjLCAnW1tXcml0YWJsZV1dJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC4zXG5cdElzR2VuZXJpY0Rlc2NyaXB0b3I6IGZ1bmN0aW9uIElzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRhc3NlcnRSZWNvcmQodGhpcywgJ1Byb3BlcnR5IERlc2NyaXB0b3InLCAnRGVzYycsIERlc2MpO1xuXG5cdFx0aWYgKCF0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpICYmICF0aGlzLklzRGF0YURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC40XG5cdEZyb21Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIEZyb21Qcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBEZXNjO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAodGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR2YWx1ZTogRGVzY1snW1tWYWx1ZV1dJ10sXG5cdFx0XHRcdHdyaXRhYmxlOiAhIURlc2NbJ1tbV3JpdGFibGVdXSddLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiAhIURlc2NbJ1tbRW51bWVyYWJsZV1dJ10sXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogISFEZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ11cblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXQ6IERlc2NbJ1tbR2V0XV0nXSxcblx0XHRcdFx0c2V0OiBEZXNjWydbW1NldF1dJ10sXG5cdFx0XHRcdGVudW1lcmFibGU6ICEhRGVzY1snW1tFbnVtZXJhYmxlXV0nXSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiAhIURlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Zyb21Qcm9wZXJ0eURlc2NyaXB0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bGx5IHBvcHVsYXRlZCBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjVcblx0VG9Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIFRvUHJvcGVydHlEZXNjcmlwdG9yKE9iaikge1xuXHRcdGlmICh0aGlzLlR5cGUoT2JqKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdUb1Byb3BlcnR5RGVzY3JpcHRvciByZXF1aXJlcyBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgZGVzYyA9IHt9O1xuXHRcdGlmIChoYXMoT2JqLCAnZW51bWVyYWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW0VudW1lcmFibGVdXSddID0gdGhpcy5Ub0Jvb2xlYW4oT2JqLmVudW1lcmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ2NvbmZpZ3VyYWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ10gPSB0aGlzLlRvQm9vbGVhbihPYmouY29uZmlndXJhYmxlKTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICd2YWx1ZScpKSB7XG5cdFx0XHRkZXNjWydbW1ZhbHVlXV0nXSA9IE9iai52YWx1ZTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICd3cml0YWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW1dyaXRhYmxlXV0nXSA9IHRoaXMuVG9Cb29sZWFuKE9iai53cml0YWJsZSk7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnZ2V0JykpIHtcblx0XHRcdHZhciBnZXR0ZXIgPSBPYmouZ2V0O1xuXHRcdFx0aWYgKHR5cGVvZiBnZXR0ZXIgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLklzQ2FsbGFibGUoZ2V0dGVyKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXR0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0XHR9XG5cdFx0XHRkZXNjWydbW0dldF1dJ10gPSBnZXR0ZXI7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnc2V0JykpIHtcblx0XHRcdHZhciBzZXR0ZXIgPSBPYmouc2V0O1xuXHRcdFx0aWYgKHR5cGVvZiBzZXR0ZXIgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLklzQ2FsbGFibGUoc2V0dGVyKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignc2V0dGVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0fVxuXHRcdFx0ZGVzY1snW1tTZXRdXSddID0gc2V0dGVyO1xuXHRcdH1cblxuXHRcdGlmICgoaGFzKGRlc2MsICdbW0dldF1dJykgfHwgaGFzKGRlc2MsICdbW1NldF1dJykpICYmIChoYXMoZGVzYywgJ1tbVmFsdWVdXScpIHx8IGhhcyhkZXNjLCAnW1tXcml0YWJsZV1dJykpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignSW52YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9yLiBDYW5ub3QgYm90aCBzcGVjaWZ5IGFjY2Vzc29ycyBhbmQgYSB2YWx1ZSBvciB3cml0YWJsZSBhdHRyaWJ1dGUnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRlc2M7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xMS45LjNcblx0J0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nOiBmdW5jdGlvbiBBYnN0cmFjdEVxdWFsaXR5Q29tcGFyaXNvbih4LCB5KSB7XG5cdFx0dmFyIHhUeXBlID0gdGhpcy5UeXBlKHgpO1xuXHRcdHZhciB5VHlwZSA9IHRoaXMuVHlwZSh5KTtcblx0XHRpZiAoeFR5cGUgPT09IHlUeXBlKSB7XG5cdFx0XHRyZXR1cm4geCA9PT0geTsgLy8gRVM2KyBzcGVjaWZpZWQgdGhpcyBzaG9ydGN1dCBhbnl3YXlzLlxuXHRcdH1cblx0XHRpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh4VHlwZSA9PT0gJ051bWJlcicgJiYgeVR5cGUgPT09ICdTdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHgsIHRoaXMuVG9OdW1iZXIoeSkpO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdTdHJpbmcnICYmIHlUeXBlID09PSAnTnVtYmVyJykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh0aGlzLlRvTnVtYmVyKHgpLCB5KTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnQm9vbGVhbicpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10odGhpcy5Ub051bWJlcih4KSwgeSk7XG5cdFx0fVxuXHRcdGlmICh5VHlwZSA9PT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gdGhpc1snQWJzdHJhY3QgRXF1YWxpdHkgQ29tcGFyaXNvbiddKHgsIHRoaXMuVG9OdW1iZXIoeSkpO1xuXHRcdH1cblx0XHRpZiAoKHhUeXBlID09PSAnU3RyaW5nJyB8fCB4VHlwZSA9PT0gJ051bWJlcicpICYmIHlUeXBlID09PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIHRoaXNbJ0Fic3RyYWN0IEVxdWFsaXR5IENvbXBhcmlzb24nXSh4LCB0aGlzLlRvUHJpbWl0aXZlKHkpKTtcblx0XHR9XG5cdFx0aWYgKHhUeXBlID09PSAnT2JqZWN0JyAmJiAoeVR5cGUgPT09ICdTdHJpbmcnIHx8IHlUeXBlID09PSAnTnVtYmVyJykpIHtcblx0XHRcdHJldHVybiB0aGlzWydBYnN0cmFjdCBFcXVhbGl0eSBDb21wYXJpc29uJ10odGhpcy5Ub1ByaW1pdGl2ZSh4KSwgeSk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTExLjkuNlxuXHQnU3RyaWN0IEVxdWFsaXR5IENvbXBhcmlzb24nOiBmdW5jdGlvbiBTdHJpY3RFcXVhbGl0eUNvbXBhcmlzb24oeCwgeSkge1xuXHRcdHZhciB4VHlwZSA9IHRoaXMuVHlwZSh4KTtcblx0XHR2YXIgeVR5cGUgPSB0aGlzLlR5cGUoeSk7XG5cdFx0aWYgKHhUeXBlICE9PSB5VHlwZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoeFR5cGUgPT09ICdVbmRlZmluZWQnIHx8IHhUeXBlID09PSAnTnVsbCcpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4geCA9PT0geTsgLy8gc2hvcnRjdXQgZm9yIHN0ZXBzIDQtN1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTEuOC41XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuXHQnQWJzdHJhY3QgUmVsYXRpb25hbCBDb21wYXJpc29uJzogZnVuY3Rpb24gQWJzdHJhY3RSZWxhdGlvbmFsQ29tcGFyaXNvbih4LCB5LCBMZWZ0Rmlyc3QpIHtcblx0XHRpZiAodGhpcy5UeXBlKExlZnRGaXJzdCkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IExlZnRGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHRcdH1cblx0XHR2YXIgcHg7XG5cdFx0dmFyIHB5O1xuXHRcdGlmIChMZWZ0Rmlyc3QpIHtcblx0XHRcdHB4ID0gdGhpcy5Ub1ByaW1pdGl2ZSh4LCAkTnVtYmVyKTtcblx0XHRcdHB5ID0gdGhpcy5Ub1ByaW1pdGl2ZSh5LCAkTnVtYmVyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHkgPSB0aGlzLlRvUHJpbWl0aXZlKHksICROdW1iZXIpO1xuXHRcdFx0cHggPSB0aGlzLlRvUHJpbWl0aXZlKHgsICROdW1iZXIpO1xuXHRcdH1cblx0XHR2YXIgYm90aFN0cmluZ3MgPSB0aGlzLlR5cGUocHgpID09PSAnU3RyaW5nJyAmJiB0aGlzLlR5cGUocHkpID09PSAnU3RyaW5nJztcblx0XHRpZiAoIWJvdGhTdHJpbmdzKSB7XG5cdFx0XHR2YXIgbnggPSB0aGlzLlRvTnVtYmVyKHB4KTtcblx0XHRcdHZhciBueSA9IHRoaXMuVG9OdW1iZXIocHkpO1xuXHRcdFx0aWYgKCRpc05hTihueCkgfHwgJGlzTmFOKG55KSkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCRpc0Zpbml0ZShueCkgJiYgJGlzRmluaXRlKG55KSAmJiBueCA9PT0gbnkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG54ID09PSAwICYmIG55ID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChueCA9PT0gSW5maW5pdHkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG55ID09PSBJbmZpbml0eSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChueSA9PT0gLUluZmluaXR5KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChueCA9PT0gLUluZmluaXR5KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG54IDwgbnk7IC8vIGJ5IG5vdywgdGhlc2UgYXJlIGJvdGggbm9uemVybywgZmluaXRlLCBhbmQgbm90IGVxdWFsXG5cdFx0fVxuXHRcdGlmIChpc1ByZWZpeE9mKHB5LCBweCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGlzUHJlZml4T2YocHgsIHB5KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBweCA8IHB5OyAvLyBib3RoIHN0cmluZ3MsIG5laXRoZXIgYSBwcmVmaXggb2YgdGhlIG90aGVyLiBzaG9ydGN1dCBmb3Igc3RlcHMgYy1mXG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRVM1O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZXMyMDE2Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFN5bnRheEVycm9yID0gR2V0SW50cmluc2ljKCclU3ludGF4RXJyb3IlJyk7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcblxudmFyIHByZWRpY2F0ZXMgPSB7XG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wcm9wZXJ0eS1kZXNjcmlwdG9yLXNwZWNpZmljYXRpb24tdHlwZVxuXHQnUHJvcGVydHkgRGVzY3JpcHRvcic6IGZ1bmN0aW9uIGlzUHJvcGVydHlEZXNjcmlwdG9yKEVTLCBEZXNjKSB7XG5cdFx0aWYgKEVTLlR5cGUoRGVzYykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHZhciBhbGxvd2VkID0ge1xuXHRcdFx0J1tbQ29uZmlndXJhYmxlXV0nOiB0cnVlLFxuXHRcdFx0J1tbRW51bWVyYWJsZV1dJzogdHJ1ZSxcblx0XHRcdCdbW0dldF1dJzogdHJ1ZSxcblx0XHRcdCdbW1NldF1dJzogdHJ1ZSxcblx0XHRcdCdbW1ZhbHVlXV0nOiB0cnVlLFxuXHRcdFx0J1tbV3JpdGFibGVdXSc6IHRydWVcblx0XHR9O1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIERlc2MpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXHRcdFx0aWYgKGhhcyhEZXNjLCBrZXkpICYmICFhbGxvd2VkW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBpc0RhdGEgPSBoYXMoRGVzYywgJ1tbVmFsdWVdXScpO1xuXHRcdHZhciBJc0FjY2Vzc29yID0gaGFzKERlc2MsICdbW0dldF1dJykgfHwgaGFzKERlc2MsICdbW1NldF1dJyk7XG5cdFx0aWYgKGlzRGF0YSAmJiBJc0FjY2Vzc29yKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUHJvcGVydHkgRGVzY3JpcHRvcnMgbWF5IG5vdCBiZSBib3RoIGFjY2Vzc29yIGFuZCBkYXRhIGRlc2NyaXB0b3JzJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzc2VydFJlY29yZChFUywgcmVjb3JkVHlwZSwgYXJndW1lbnROYW1lLCB2YWx1ZSkge1xuXHR2YXIgcHJlZGljYXRlID0gcHJlZGljYXRlc1tyZWNvcmRUeXBlXTtcblx0aWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCd1bmtub3duIHJlY29yZCB0eXBlOiAnICsgcmVjb3JkVHlwZSk7XG5cdH1cblx0aWYgKCFwcmVkaWNhdGUoRVMsIHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKGFyZ3VtZW50TmFtZSArICcgbXVzdCBiZSBhICcgKyByZWNvcmRUeXBlKTtcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG5cbnZhciAkYXNzaWduID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpLmFzc2lnbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHtcblx0aWYgKCRhc3NpZ24pIHtcblx0XHRyZXR1cm4gJGFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuXHRcdGlmIChoYXMoc291cmNlLCBrZXkpKSB7XG5cdFx0XHR0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyICRGdW5jdGlvbiA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uJScpO1xudmFyICRhcHBseSA9ICRGdW5jdGlvbi5hcHBseTtcbnZhciAkY2FsbCA9ICRGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKCkge1xuXHRyZXR1cm4gYmluZC5hcHBseSgkY2FsbCwgYXJndW1lbnRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmFwcGx5ID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gYmluZC5hcHBseSgkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdGlmICghcHJlZGljYXRlKGFycmF5W2ldLCBpLCBhcnJheSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrKSB7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRjYWxsYmFjayhhcnJheVtpXSwgaSwgYXJyYXkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbGxiYWNrLXJldHVyblxuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgJGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICE9PSBhOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmICEkaXNOYU4oeCkgJiYgeCAhPT0gSW5maW5pdHkgJiYgeCAhPT0gLUluZmluaXR5OyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc05hTihhKSB7XG5cdHJldHVybiBhICE9PSBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuLi9HZXRJbnRyaW5zaWMnKTtcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gSXNQcm9wZXJ0eURlc2NyaXB0b3IoRVMsIERlc2MpIHtcblx0aWYgKEVTLlR5cGUoRGVzYykgIT09ICdPYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHZhciBhbGxvd2VkID0ge1xuXHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogdHJ1ZSxcblx0XHQnW1tFbnVtZXJhYmxlXV0nOiB0cnVlLFxuXHRcdCdbW0dldF1dJzogdHJ1ZSxcblx0XHQnW1tTZXRdXSc6IHRydWUsXG5cdFx0J1tbVmFsdWVdXSc6IHRydWUsXG5cdFx0J1tbV3JpdGFibGVdXSc6IHRydWVcblx0fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBEZXNjKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblx0XHRpZiAoaGFzKERlc2MsIGtleSkgJiYgIWFsbG93ZWRba2V5XSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChFUy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpICYmIEVTLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1Byb3BlcnR5IERlc2NyaXB0b3JzIG1heSBub3QgYmUgYm90aCBhY2Nlc3NvciBhbmQgZGF0YSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV2ZXJ5ID0gcmVxdWlyZSgnLi9ldmVyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU2FtZVByb3BlcnR5RGVzY3JpcHRvcihFUywgRDEsIEQyKSB7XG5cdHZhciBmaWVsZHMgPSBbXG5cdFx0J1tbQ29uZmlndXJhYmxlXV0nLFxuXHRcdCdbW0VudW1lcmFibGVdXScsXG5cdFx0J1tbR2V0XV0nLFxuXHRcdCdbW1NldF1dJyxcblx0XHQnW1tWYWx1ZV1dJyxcblx0XHQnW1tXcml0YWJsZV1dJ1xuXHRdO1xuXHRyZXR1cm4gZXZlcnkoZmllbGRzLCBmdW5jdGlvbiAoZmllbGQpIHtcblx0XHRpZiAoKGZpZWxkIGluIEQxKSAhPT0gKGZpZWxkIGluIEQyKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gRVMuU2FtZVZhbHVlKEQxW2ZpZWxkXSwgRDJbZmllbGRdKTtcblx0fSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1vZChudW1iZXIsIG1vZHVsbykge1xuXHR2YXIgcmVtYWluID0gbnVtYmVyICUgbW9kdWxvO1xuXHRyZXR1cm4gTWF0aC5mbG9vcihyZW1haW4gPj0gMCA/IHJlbWFpbiA6IHJlbWFpbiArIG1vZHVsbyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNpZ24obnVtYmVyKSB7XG5cdHJldHVybiBudW1iZXIgPj0gMCA/IDEgOiAtMTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzU2hpbTtcbmlmICghT2JqZWN0LmtleXMpIHtcblx0Ly8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cblx0dmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cdHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cdHZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2xvYmFsLXJlcXVpcmVcblx0dmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cdHZhciBoYXNEb250RW51bUJ1ZyA9ICFpc0VudW1lcmFibGUuY2FsbCh7IHRvU3RyaW5nOiBudWxsIH0sICd0b1N0cmluZycpO1xuXHR2YXIgaGFzUHJvdG9FbnVtQnVnID0gaXNFbnVtZXJhYmxlLmNhbGwoZnVuY3Rpb24gKCkge30sICdwcm90b3R5cGUnKTtcblx0dmFyIGRvbnRFbnVtcyA9IFtcblx0XHQndG9TdHJpbmcnLFxuXHRcdCd0b0xvY2FsZVN0cmluZycsXG5cdFx0J3ZhbHVlT2YnLFxuXHRcdCdoYXNPd25Qcm9wZXJ0eScsXG5cdFx0J2lzUHJvdG90eXBlT2YnLFxuXHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdFx0J2NvbnN0cnVjdG9yJ1xuXHRdO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuXHRcdHZhciBjdG9yID0gby5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gY3RvciAmJiBjdG9yLnByb3RvdHlwZSA9PT0gbztcblx0fTtcblx0dmFyIGV4Y2x1ZGVkS2V5cyA9IHtcblx0XHQkYXBwbGljYXRpb25DYWNoZTogdHJ1ZSxcblx0XHQkY29uc29sZTogdHJ1ZSxcblx0XHQkZXh0ZXJuYWw6IHRydWUsXG5cdFx0JGZyYW1lOiB0cnVlLFxuXHRcdCRmcmFtZUVsZW1lbnQ6IHRydWUsXG5cdFx0JGZyYW1lczogdHJ1ZSxcblx0XHQkaW5uZXJIZWlnaHQ6IHRydWUsXG5cdFx0JGlubmVyV2lkdGg6IHRydWUsXG5cdFx0JG9ubW96ZnVsbHNjcmVlbmNoYW5nZTogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuZXJyb3I6IHRydWUsXG5cdFx0JG91dGVySGVpZ2h0OiB0cnVlLFxuXHRcdCRvdXRlcldpZHRoOiB0cnVlLFxuXHRcdCRwYWdlWE9mZnNldDogdHJ1ZSxcblx0XHQkcGFnZVlPZmZzZXQ6IHRydWUsXG5cdFx0JHBhcmVudDogdHJ1ZSxcblx0XHQkc2Nyb2xsTGVmdDogdHJ1ZSxcblx0XHQkc2Nyb2xsVG9wOiB0cnVlLFxuXHRcdCRzY3JvbGxYOiB0cnVlLFxuXHRcdCRzY3JvbGxZOiB0cnVlLFxuXHRcdCRzZWxmOiB0cnVlLFxuXHRcdCR3ZWJraXRJbmRleGVkREI6IHRydWUsXG5cdFx0JHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuXHRcdCR3aW5kb3c6IHRydWVcblx0fTtcblx0dmFyIGhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1ZyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmb3IgKHZhciBrIGluIHdpbmRvdykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKCFleGNsdWRlZEtleXNbJyQnICsga10gJiYgaGFzLmNhbGwod2luZG93LCBrKSAmJiB3aW5kb3dba10gIT09IG51bGwgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSgpKTtcblx0dmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnKSB7XG5cdFx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcblxuXHRrZXlzU2hpbSA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG5cdFx0dmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuXHRcdHZhciBpc0Z1bmN0aW9uID0gdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHRcdHZhciBpc0FyZ3VtZW50cyA9IGlzQXJncyhvYmplY3QpO1xuXHRcdHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdFx0dmFyIHRoZUtleXMgPSBbXTtcblxuXHRcdGlmICghaXNPYmplY3QgJiYgIWlzRnVuY3Rpb24gJiYgIWlzQXJndW1lbnRzKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0dmFyIHNraXBQcm90byA9IGhhc1Byb3RvRW51bUJ1ZyAmJiBpc0Z1bmN0aW9uO1xuXHRcdGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzQXJndW1lbnRzICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGopKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcblx0XHRcdFx0aWYgKCEoc2tpcFByb3RvICYmIG5hbWUgPT09ICdwcm90b3R5cGUnKSAmJiBoYXMuY2FsbChvYmplY3QsIG5hbWUpKSB7XG5cdFx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcblx0XHRcdHZhciBza2lwQ29uc3RydWN0b3IgPSBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kob2JqZWN0KTtcblxuXHRcdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcblx0XHRcdFx0aWYgKCEoc2tpcENvbnN0cnVjdG9yICYmIGRvbnRFbnVtc1trXSA9PT0gJ2NvbnN0cnVjdG9yJykgJiYgaGFzLmNhbGwob2JqZWN0LCBkb250RW51bXNba10pKSB7XG5cdFx0XHRcdFx0dGhlS2V5cy5wdXNoKGRvbnRFbnVtc1trXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoZUtleXM7XG5cdH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpO1xuXG52YXIgb3JpZ0tleXMgPSBPYmplY3Qua2V5cztcbnZhciBrZXlzU2hpbSA9IG9yaWdLZXlzID8gZnVuY3Rpb24ga2V5cyhvKSB7IHJldHVybiBvcmlnS2V5cyhvKTsgfSA6IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxudmFyIG9yaWdpbmFsS2V5cyA9IE9iamVjdC5rZXlzO1xuXG5rZXlzU2hpbS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG5cdGlmIChPYmplY3Qua2V5cykge1xuXHRcdHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIFNhZmFyaSA1LjAgYnVnXG5cdFx0XHR2YXIgYXJncyA9IE9iamVjdC5rZXlzKGFyZ3VtZW50cyk7XG5cdFx0XHRyZXR1cm4gYXJncyAmJiBhcmdzLmxlbmd0aCA9PT0gYXJndW1lbnRzLmxlbmd0aDtcblx0XHR9KDEsIDIpKTtcblx0XHRpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcblx0XHRcdE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcblx0XHRcdFx0aWYgKGlzQXJncyhvYmplY3QpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdE9iamVjdC5rZXlzID0ga2V5c1NoaW07XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzIHx8IGtleXNTaGltO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzU2hpbTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXHRpZiAoIWlzQXJncykge1xuXHRcdGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0XHR2YWx1ZS5sZW5ndGggPj0gMCAmJlxuXHRcdFx0dG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHR9XG5cdHJldHVybiBpc0FyZ3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCc7XG5cbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xudmFyIGlzRGF0ZSA9IHJlcXVpcmUoJ2lzLWRhdGUtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCdpcy1zeW1ib2wnKTtcblxudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSBmdW5jdGlvbiBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpIHtcblx0aWYgKHR5cGVvZiBPID09PSAndW5kZWZpbmVkJyB8fCBPID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgbWV0aG9kIG9uICcgKyBPKTtcblx0fVxuXHRpZiAodHlwZW9mIGhpbnQgIT09ICdzdHJpbmcnIHx8IChoaW50ICE9PSAnbnVtYmVyJyAmJiBoaW50ICE9PSAnc3RyaW5nJykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdoaW50IG11c3QgYmUgXCJzdHJpbmdcIiBvciBcIm51bWJlclwiJyk7XG5cdH1cblx0dmFyIG1ldGhvZE5hbWVzID0gaGludCA9PT0gJ3N0cmluZycgPyBbJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXSA6IFsndmFsdWVPZicsICd0b1N0cmluZyddO1xuXHR2YXIgbWV0aG9kLCByZXN1bHQsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCBtZXRob2ROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdG1ldGhvZCA9IE9bbWV0aG9kTmFtZXNbaV1dO1xuXHRcdGlmIChpc0NhbGxhYmxlKG1ldGhvZCkpIHtcblx0XHRcdHJlc3VsdCA9IG1ldGhvZC5jYWxsKE8pO1xuXHRcdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignTm8gZGVmYXVsdCB2YWx1ZScpO1xufTtcblxudmFyIEdldE1ldGhvZCA9IGZ1bmN0aW9uIEdldE1ldGhvZChPLCBQKSB7XG5cdHZhciBmdW5jID0gT1tQXTtcblx0aWYgKGZ1bmMgIT09IG51bGwgJiYgdHlwZW9mIGZ1bmMgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0aWYgKCFpc0NhbGxhYmxlKGZ1bmMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGZ1bmMgKyAnIHJldHVybmVkIGZvciBwcm9wZXJ0eSAnICsgUCArICcgb2Ygb2JqZWN0ICcgKyBPICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRyZXR1cm4gZnVuYztcblx0fVxuXHRyZXR1cm4gdm9pZCAwO1xufTtcblxuLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFRvUHJpbWl0aXZlKGlucHV0KSB7XG5cdGlmIChpc1ByaW1pdGl2ZShpbnB1dCkpIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cblx0dmFyIGhpbnQgPSAnZGVmYXVsdCc7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdGlmIChhcmd1bWVudHNbMV0gPT09IFN0cmluZykge1xuXHRcdFx0aGludCA9ICdzdHJpbmcnO1xuXHRcdH0gZWxzZSBpZiAoYXJndW1lbnRzWzFdID09PSBOdW1iZXIpIHtcblx0XHRcdGhpbnQgPSAnbnVtYmVyJztcblx0XHR9XG5cdH1cblxuXHR2YXIgZXhvdGljVG9QcmltO1xuXHRpZiAoaGFzU3ltYm9scykge1xuXHRcdGlmIChTeW1ib2wudG9QcmltaXRpdmUpIHtcblx0XHRcdGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgU3ltYm9sLnRvUHJpbWl0aXZlKTtcblx0XHR9IGVsc2UgaWYgKGlzU3ltYm9sKGlucHV0KSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mO1xuXHRcdH1cblx0fVxuXHRpZiAodHlwZW9mIGV4b3RpY1RvUHJpbSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR2YXIgcmVzdWx0ID0gZXhvdGljVG9QcmltLmNhbGwoaW5wdXQsIGhpbnQpO1xuXHRcdGlmIChpc1ByaW1pdGl2ZShyZXN1bHQpKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmFibGUgdG8gY29udmVydCBleG90aWMgb2JqZWN0IHRvIHByaW1pdGl2ZScpO1xuXHR9XG5cdGlmIChoaW50ID09PSAnZGVmYXVsdCcgJiYgKGlzRGF0ZShpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSkge1xuXHRcdGhpbnQgPSAnc3RyaW5nJztcblx0fVxuXHRyZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gJ2RlZmF1bHQnID8gJ251bWJlcicgOiBoaW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xuXG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG5cbi8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTguMTIuOFxudmFyIEVTNWludGVybmFsU2xvdHMgPSB7XG5cdCdbW0RlZmF1bHRWYWx1ZV1dJzogZnVuY3Rpb24gKE8pIHtcblx0XHR2YXIgYWN0dWFsSGludDtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFjdHVhbEhpbnQgPSBhcmd1bWVudHNbMV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFjdHVhbEhpbnQgPSB0b1N0ci5jYWxsKE8pID09PSAnW29iamVjdCBEYXRlXScgPyBTdHJpbmcgOiBOdW1iZXI7XG5cdFx0fVxuXG5cdFx0aWYgKGFjdHVhbEhpbnQgPT09IFN0cmluZyB8fCBhY3R1YWxIaW50ID09PSBOdW1iZXIpIHtcblx0XHRcdHZhciBtZXRob2RzID0gYWN0dWFsSGludCA9PT0gU3RyaW5nID8gWyd0b1N0cmluZycsICd2YWx1ZU9mJ10gOiBbJ3ZhbHVlT2YnLCAndG9TdHJpbmcnXTtcblx0XHRcdHZhciB2YWx1ZSwgaTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdGlmIChpc0NhbGxhYmxlKE9bbWV0aG9kc1tpXV0pKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBPW21ldGhvZHNbaV1dKCk7XG5cdFx0XHRcdFx0aWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignTm8gZGVmYXVsdCB2YWx1ZScpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIFtbRGVmYXVsdFZhbHVlXV0gaGludCBzdXBwbGllZCcpO1xuXHR9XG59O1xuXG4vLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy05LjFcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQpIHtcblx0aWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRyZXR1cm4gRVM1aW50ZXJuYWxTbG90c1snW1tEZWZhdWx0VmFsdWVdXSddKGlucHV0LCBhcmd1bWVudHNbMV0pO1xuXHR9XG5cdHJldHVybiBFUzVpbnRlcm5hbFNsb3RzWydbW0RlZmF1bHRWYWx1ZV1dJ10oaW5wdXQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VzMjAxNScpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbn07XG4iLCIvKiFcbiAqIGVzY2FwZS1odG1sXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3VcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZUh0bWw7XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OiAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTogLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiMzOTsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6IC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXhcbiAgICA/IGh0bWwgKyBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgOiBodG1sO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiXG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZm9yRWFjaCAob2JqLCBmbiwgY3R4KSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwoZm4pICE9PSAnW29iamVjdCBGdW5jdGlvbl0nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgbCA9IG9iai5sZW5ndGg7XG4gICAgaWYgKGwgPT09ICtsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBmbi5jYWxsKGN0eCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChvYmosIGspKSB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChjdHgsIG9ialtrXSwgaywgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgaGFzU3ltYm9sU2hhbSA9IHJlcXVpcmUoJy4vc2hhbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIG9yaWdTeW1ib2woJ2ZvbycpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRyZXR1cm4gaGFzU3ltYm9sU2hhbSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxN10sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4iLCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxudmFyIGh0dHBzID0gbW9kdWxlLmV4cG9ydHM7XG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gICAgaWYgKGh0dHAuaGFzT3duUHJvcGVydHkoa2V5KSkgaHR0cHNba2V5XSA9IGh0dHBba2V5XTtcbn07XG5cbmh0dHBzLnJlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYikge1xuICAgIGlmICghcGFyYW1zKSBwYXJhbXMgPSB7fTtcbiAgICBwYXJhbXMuc2NoZW1lID0gJ2h0dHBzJztcbiAgICBwYXJhbXMucHJvdG9jb2wgPSAnaHR0cHM6JztcbiAgICByZXR1cm4gaHR0cC5yZXF1ZXN0LmNhbGwodGhpcywgcGFyYW1zLCBjYik7XG59XG4iLCIvKiFcbiAqIGh1bWFuaXplLW1zIC0gaW5kZXguanNcbiAqIENvcHlyaWdodChjKSAyMDE0IGRlYWRfaG9yc2UgPGRlYWRfaG9yc2VAcXEuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgbXMgPSByZXF1aXJlKCdtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gIGlmICh0eXBlb2YgdCA9PT0gJ251bWJlcicpIHJldHVybiB0O1xuICB2YXIgciA9IG1zKHQpO1xuICBpZiAociA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcih1dGlsLmZvcm1hdCgnaHVtYW5pemUtbXMoJWopIHJlc3VsdCB1bmRlZmluZWQnLCB0KSk7XG4gICAgY29uc29sZS53YXJuKGVyci5zdGFjayk7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG5cdH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmICF2YWx1ZS5wcm90b3R5cGUpIHsgcmV0dXJuIHRydWU7IH1cblx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdHZhciBzdHJDbGFzcyA9IHRvU3RyLmNhbGwodmFsdWUpO1xuXHRyZXR1cm4gc3RyQ2xhc3MgPT09IGZuQ2xhc3MgfHwgc3RyQ2xhc3MgPT09IGdlbkNsYXNzO1xufTtcbiIsIihmdW5jdGlvbihyb290KSB7XG4gIHZhciB0b1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcblxuICBmdW5jdGlvbiBmbkJvZHkoZm4pIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChmbikucmVwbGFjZSgvXltee10qe1xccyovLCcnKS5yZXBsYWNlKC9cXHMqfVtefV0qJC8sJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDbGFzcyhmbikge1xuICAgIHJldHVybiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICAoL15jbGFzcyg/Olxcc3x7KS8udGVzdCh0b1N0cmluZy5jYWxsKGZuKSkgfHxcbiAgICAgICAgICAgICAgKC9eLipjbGFzc0NhbGxDaGVja1xcKC8udGVzdChmbkJvZHkoZm4pKSkpIC8vIGJhYmVsLmpzXG4gICAgICAgICAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gaXNDbGFzcztcbiAgICB9XG4gICAgZXhwb3J0cy5pc0NsYXNzID0gaXNDbGFzcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzQ2xhc3M7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5pc0NsYXNzID0gaXNDbGFzcztcbiAgfVxuXG59KSh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldERheSA9IERhdGUucHJvdG90eXBlLmdldERheTtcbnZhciB0cnlEYXRlT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdGdldERheS5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cblx0cmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkgOiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gZGF0ZUNsYXNzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIHRyeVJlZ2V4RXhlY0NhbGwgPSBmdW5jdGlvbiB0cnlSZWdleEV4ZWModmFsdWUpIHtcblx0dHJ5IHtcblx0XHR2YXIgbGFzdEluZGV4ID0gdmFsdWUubGFzdEluZGV4O1xuXHRcdHZhbHVlLmxhc3RJbmRleCA9IDA7XG5cblx0XHRyZWdleEV4ZWMuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICghaGFzVG9TdHJpbmdUYWcpIHtcblx0XHRyZXR1cm4gdG9TdHIuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG5cdH1cblxuXHR2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcblx0dmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXHRpZiAoIWhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0cnlSZWdleEV4ZWNDYWxsKHZhbHVlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxuaWYgKGhhc1N5bWJvbHMpIHtcblx0dmFyIHN5bVRvU3RyID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIHN5bVN0cmluZ1JlZ2V4ID0gL15TeW1ib2xcXCguKlxcKSQvO1xuXHR2YXIgaXNTeW1ib2xPYmplY3QgPSBmdW5jdGlvbiBpc1JlYWxTeW1ib2xPYmplY3QodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSAhPT0gJ3N5bWJvbCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHN5bVN0cmluZ1JlZ2V4LnRlc3Qoc3ltVG9TdHIuY2FsbCh2YWx1ZSkpO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBpc1N5bWJvbE9iamVjdCh2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn0gZWxzZSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdC8vIHRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTeW1ib2xzLlxuXHRcdHJldHVybiBmYWxzZSAmJiB2YWx1ZTtcblx0fTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG52YXIgaXNTdGVhcm0gPSByZXF1aXJlKCdpc3N0cmVhbScpO1xuLy8gd2FpdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21pZ3VlbG1vdGEvaXMtY2xhc3MvcHVsbC82IG1lcmdlXG52YXIgaXNDbGFzcyA9IHJlcXVpcmUoJ2lzLWNsYXNzLWhvdGZpeCcpO1xuXG4vKipcbiAqIEV4cG9zZSBhbGwgbWV0aG9kcyBpbiBjb3JlLXV0aWwtaXNcbiAqL1xuXG5PYmplY3Qua2V5cyh1dGlscykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gIGV4cG9ydHNbdHJhbnNmb3JtKG5hbWUpXSA9IHV0aWxzW25hbWVdO1xufSk7XG5cbi8qKlxuICogU3RyZWFtIGRldGVjdGVkIGJ5IGlzc3RyZWFtXG4gKi9cblxuZXhwb3J0cy5zdHJlYW0gPSBpc1N0ZWFybTtcbmV4cG9ydHMucmVhZGFibGVTdHJlYW0gPSBpc1N0ZWFybS5pc1JlYWRhYmxlO1xuZXhwb3J0cy53cml0YWJsZVN0cmVhbSA9IGlzU3RlYXJtLmlzV3JpdGFibGU7XG5leHBvcnRzLmR1cGxleFN0cmVhbSA9IGlzU3RlYXJtLmlzRHVwbGV4O1xuXG4vKipcbiAqIENsYXNzIGRldGVjdGVkIGJ5IGlzLWNsYXNzXG4gKi9cbiBleHBvcnRzLmNsYXNzID0gaXNDbGFzcztcblxuLyoqXG4gKiBFeHRlbmQgbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5maW5pdGUgPSBOdW1iZXIuaXNGaW5pdGU7XG5cbmV4cG9ydHMuTmFOID0gTnVtYmVyLmlzTmFOXG5cbmV4cG9ydHMuZ2VuZXJhdG9yID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqXG4gICAgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai5uZXh0XG4gICAgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iai50aHJvdztcbn07XG5cbmV4cG9ydHMuZ2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmpcbiAgICAmJiBvYmouY29uc3RydWN0b3JcbiAgICAmJiAnR2VuZXJhdG9yRnVuY3Rpb24nID09PSBvYmouY29uc3RydWN0b3IubmFtZTtcbn07XG5cbmV4cG9ydHMuYXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9ialxuICAgICYmIG9iai5jb25zdHJ1Y3RvclxuICAgICYmICdBc3luY0Z1bmN0aW9uJyA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG59O1xuXG5leHBvcnRzLnByb21pc2UgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmpcbiAgICAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnRoZW47XG59O1xuXG52YXIgTUFYX0lOVF8zMSA9IE1hdGgucG93KDIsIDMxKTtcblxuZXhwb3J0cy5pbnQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB1dGlscy5pc051bWJlcihvYmopXG4gICAgJiYgb2JqICUgMSA9PT0gMDtcbn07XG5cbmV4cG9ydHMuaW50MzIgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBleHBvcnRzLmludChvYmopXG4gICAgJiYgb2JqIDwgTUFYX0lOVF8zMVxuICAgICYmIG9iaiA+PSAtTUFYX0lOVF8zMTtcbn07XG5cbmV4cG9ydHMubG9uZyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIGV4cG9ydHMuaW50KG9iailcbiAgICAmJiAob2JqID49IE1BWF9JTlRfMzEgfHwgb2JqIDwgLU1BWF9JTlRfMzEpO1xufTtcblxuZXhwb3J0cy5Mb25nID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gZXhwb3J0cy5vYmplY3Qob2JqKVxuICAgICYmIGV4cG9ydHMubnVtYmVyKG9iai5oaWdoKVxuICAgICYmIGV4cG9ydHMubnVtYmVyKG9iai5sb3cpO1xufTtcblxuZXhwb3J0cy5kb3VibGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB1dGlscy5pc051bWJlcihvYmopXG4gICAgJiYgIWlzTmFOKG9iailcbiAgICAmJiBvYmogJSAxICE9PSAwO1xufTtcblxuLyoqXG4gKiBvdmVycmlkZSBjb3JlLXV0aWwtaXNcbiAqL1xuXG5leHBvcnRzLmRhdGUgPSBmdW5jdGlvbiBpc0RhdGUob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlO1xufTtcblxuZXhwb3J0cy5yZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlZ0V4cDtcbn07XG5leHBvcnRzLnJlZ2V4cCA9IGV4cG9ydHMucmVnRXhwO1xuXG5leHBvcnRzLmVycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yO1xufTtcblxuZXhwb3J0cy5hcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogdHJhbnNmb3JtIGlzTnVsbCB0eXBlIHRvIG51bGxcbiAqIEBwYXJhbSB7W3R5cGVdfSBtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICovXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybShtKSB7XG4gIHZhciBuYW1lID0gbS5zbGljZSgyKTtcbiAgbmFtZSA9IG5hbWVbMF0udG9Mb3dlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIHJldHVybiBuYW1lO1xufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJ2YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxuXG5mdW5jdGlvbiBpc1N0cmVhbSAob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBzdHJlYW0uU3RyZWFtXG59XG5cblxuZnVuY3Rpb24gaXNSZWFkYWJsZSAob2JqKSB7XG4gIHJldHVybiBpc1N0cmVhbShvYmopICYmIHR5cGVvZiBvYmouX3JlYWQgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLl9yZWFkYWJsZVN0YXRlID09ICdvYmplY3QnXG59XG5cblxuZnVuY3Rpb24gaXNXcml0YWJsZSAob2JqKSB7XG4gIHJldHVybiBpc1N0cmVhbShvYmopICYmIHR5cGVvZiBvYmouX3dyaXRlID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5fd3JpdGFibGVTdGF0ZSA9PSAnb2JqZWN0J1xufVxuXG5cbmZ1bmN0aW9uIGlzRHVwbGV4IChvYmopIHtcbiAgcmV0dXJuIGlzUmVhZGFibGUob2JqKSAmJiBpc1dyaXRhYmxlKG9iailcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyAgICAgICAgICAgID0gaXNTdHJlYW1cbm1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBpc1JlYWRhYmxlXG5tb2R1bGUuZXhwb3J0cy5pc1dyaXRhYmxlID0gaXNXcml0YWJsZVxubW9kdWxlLmV4cG9ydHMuaXNEdXBsZXggICA9IGlzRHVwbGV4XG4iLCIvKiFcbiAqIG1lcmdlLWRlc2NyaXB0b3JzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG4vKipcbiAqIE1lcmdlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiBgc3JjYCBpbnRvIGBkZXN0YFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0IE9iamVjdCB0byBhZGQgZGVzY3JpcHRvcnMgdG9cbiAqIEBwYXJhbSB7b2JqZWN0fSBzcmMgT2JqZWN0IHRvIGNsb25lIGRlc2NyaXB0b3JzIGZyb21cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlZGVmaW5lPXRydWVdIFJlZGVmaW5lIGBkZXN0YCBwcm9wZXJ0aWVzIHdpdGggYHNyY2AgcHJvcGVydGllc1xuICogQHJldHVybnMge29iamVjdH0gUmVmZXJlbmNlIHRvIGRlc3RcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBtZXJnZShkZXN0LCBzcmMsIHJlZGVmaW5lKSB7XG4gIGlmICghZGVzdCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGRlc3QgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFzcmMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzcmMgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKHJlZGVmaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICByZWRlZmluZSA9IHRydWVcbiAgfVxuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNyYykuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoT3duUHJvcGVydHlOYW1lKG5hbWUpIHtcbiAgICBpZiAoIXJlZGVmaW5lICYmIGhhc093blByb3BlcnR5LmNhbGwoZGVzdCwgbmFtZSkpIHtcbiAgICAgIC8vIFNraXAgZGVzcmlwdG9yXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDb3B5IGRlc2NyaXB0b3JcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBuYW1lKVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZXN0LCBuYW1lLCBkZXNjcmlwdG9yKVxuICB9KVxuXG4gIHJldHVybiBkZXN0XG59XG4iLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG4iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgYm9vbGVhblZhbHVlT2YgPSBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mO1xudmFyIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBiaWdJbnRWYWx1ZU9mID0gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyA/IEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZiA6IG51bGw7XG5cbnZhciBpbnNwZWN0Q3VzdG9tID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKS5jdXN0b207XG52YXIgaW5zcGVjdFN5bWJvbCA9IChpbnNwZWN0Q3VzdG9tICYmIGlzU3ltYm9sKGluc3BlY3RDdXN0b20pKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfIChvYmosIG9wdHMsIGRlcHRoLCBzZWVuKSB7XG4gICAgaWYgKCFvcHRzKSBvcHRzID0ge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBvYmogPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZyhvYmosIG9wdHMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvYmogPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEluZmluaXR5IC8gb2JqID4gMCA/ICcwJyA6ICctMCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3RyaW5nKG9iaik7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgcmV0dXJuIFN0cmluZyhvYmopICsgJ24nO1xuICAgIH1cblxuICAgIHZhciBtYXhEZXB0aCA9IHR5cGVvZiBvcHRzLmRlcHRoID09PSAndW5kZWZpbmVkJyA/IDUgOiBvcHRzLmRlcHRoO1xuICAgIGlmICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnKSBkZXB0aCA9IDA7XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNlZW4gPT09ICd1bmRlZmluZWQnKSBzZWVuID0gW107XG4gICAgZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICh2YWx1ZSwgZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9IHNlZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIHNlZW4ucHVzaChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG9wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lT2Yob2JqKTtcbiAgICAgICAgcmV0dXJuICdbRnVuY3Rpb24nICsgKG5hbWUgPyAnOiAnICsgbmFtZSA6ICcnKSArICddJztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKG9iaikpIHtcbiAgICAgICAgdmFyIHN5bVN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgPyBtYXJrQm94ZWQoc3ltU3RyaW5nKSA6IHN5bVN0cmluZztcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChvYmopKSB7XG4gICAgICAgIHZhciBzID0gJzwnICsgU3RyaW5nKG9iai5ub2RlTmFtZSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGF0dHJzID0gb2JqLmF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHMgKz0gJyAnICsgYXR0cnNbaV0ubmFtZSArICc9JyArIHdyYXBRdW90ZXMocXVvdGUoYXR0cnNbaV0udmFsdWUpLCAnZG91YmxlJywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcyArPSAnPic7XG4gICAgICAgIGlmIChvYmouY2hpbGROb2RlcyAmJiBvYmouY2hpbGROb2Rlcy5sZW5ndGgpIHMgKz0gJy4uLic7XG4gICAgICAgIHMgKz0gJzwvJyArIFN0cmluZyhvYmoubm9kZU5hbWUpLnRvTG93ZXJDYXNlKCkgKyAnPic7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChvYmoubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICAgICAgcmV0dXJuICdbICcgKyBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCkuam9pbignLCAnKSArICcgXSc7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7XG4gICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArIHBhcnRzLmpvaW4oJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGluc3BlY3RTeW1ib2wgJiYgdHlwZW9mIG9ialtpbnNwZWN0U3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtpbnNwZWN0U3ltYm9sXSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gW107XG4gICAgICAgIG1hcEZvckVhY2guY2FsbChvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgcGFydHMpO1xuICAgIH1cbiAgICBpZiAoaXNTZXQob2JqKSkge1xuICAgICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgICAgc2V0Rm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlICkge1xuICAgICAgICAgICAgcGFydHMucHVzaChpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ1NldCcsIHNldFNpemUuY2FsbChvYmopLCBwYXJ0cyk7XG4gICAgfVxuICAgIGlmIChpc051bWJlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChOdW1iZXIob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdJbnQob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoYmlnSW50VmFsdWVPZi5jYWxsKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQm9vbGVhbihvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KFN0cmluZyhvYmopKSk7XG4gICAgfVxuICAgIGlmICghaXNEYXRlKG9iaikgJiYgIWlzUmVnRXhwKG9iaikpIHtcbiAgICAgICAgdmFyIHhzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoeHMubGVuZ3RoID09PSAwKSByZXR1cm4gJ3t9JztcbiAgICAgICAgcmV0dXJuICd7ICcgKyB4cy5qb2luKCcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyAocywgZGVmYXVsdFN0eWxlLCBvcHRzKSB7XG4gICAgdmFyIHF1b3RlQ2hhciA9IChvcHRzLnF1b3RlU3R5bGUgfHwgZGVmYXVsdFN0eWxlKSA9PT0gJ2RvdWJsZScgPyAnXCInIDogXCInXCI7XG4gICAgcmV0dXJuIHF1b3RlQ2hhciArIHMgKyBxdW90ZUNoYXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RlIChzKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXkgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJzsgfVxuZnVuY3Rpb24gaXNEYXRlIChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IERhdGVdJzsgfVxuZnVuY3Rpb24gaXNSZWdFeHAgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7IH1cbmZ1bmN0aW9uIGlzRXJyb3IgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRXJyb3JdJzsgfVxuZnVuY3Rpb24gaXNTeW1ib2wgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgU3ltYm9sXSc7IH1cbmZ1bmN0aW9uIGlzU3RyaW5nIChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nOyB9XG5mdW5jdGlvbiBpc051bWJlciAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJzsgfVxuZnVuY3Rpb24gaXNCaWdJbnQgKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQmlnSW50XSc7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbiAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7IH1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMgKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn1cblxuZnVuY3Rpb24gdG9TdHIgKG9iaikge1xuICAgIHJldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iaik7XG59XG5cbmZ1bmN0aW9uIG5hbWVPZiAoZikge1xuICAgIGlmIChmLm5hbWUpIHJldHVybiBmLm5hbWU7XG4gICAgdmFyIG0gPSBTdHJpbmcoZikubWF0Y2goL15mdW5jdGlvblxccyooW1xcdyRdKykvKTtcbiAgICBpZiAobSkgcmV0dXJuIG1bMV07XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKHhzLCB4KSB7XG4gICAgaWYgKHhzLmluZGV4T2YpIHJldHVybiB4cy5pbmRleE9mKHgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNNYXAgKHgpIHtcbiAgICBpZiAoIW1hcFNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNTZXQgKHgpIHtcbiAgICBpZiAoIXNldFNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzZXRTaXplLmNhbGwoeCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXBTaXplLmNhbGwoeCk7XG4gICAgICAgIH0gY2F0Y2ggKG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50ICh4KSB7XG4gICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbidcbiAgICA7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcgKHN0ciwgb3B0cykge1xuICAgIHZhciBzID0gc3RyLnJlcGxhY2UoLyhbJ1xcXFxdKS9nLCAnXFxcXCQxJykucmVwbGFjZSgvW1xceDAwLVxceDFmXS9nLCBsb3dieXRlKTtcbiAgICByZXR1cm4gd3JhcFF1b3RlcyhzLCAnc2luZ2xlJywgb3B0cyk7XG59XG5cbmZ1bmN0aW9uIGxvd2J5dGUgKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHsgODogJ2InLCA5OiAndCcsIDEwOiAnbicsIDEyOiAnZicsIDEzOiAncicgfVtuXTtcbiAgICBpZiAoeCkgcmV0dXJuICdcXFxcJyArIHg7XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyBuLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gbWFya0JveGVkIChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YgKHR5cGUsIHNpemUsIGVudHJpZXMpIHtcbiAgICByZXR1cm4gdHlwZSArICcgKCcgKyBzaXplICsgJykgeycgKyBlbnRyaWVzLmpvaW4oJywgJykgKyAnfSc7XG59XG5cbmZ1bmN0aW9uIGFyck9iaktleXMgKG9iaiwgaW5zcGVjdCkge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqKTtcbiAgICB2YXIgeHMgPSBbXTtcbiAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgeHMubGVuZ3RoID0gb2JqLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHhzW2ldID0gaGFzKG9iaiwgaSkgPyBpbnNwZWN0KG9ialtpXSwgb2JqKSA6ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFoYXMob2JqLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgaWYgKC9bXlxcdyRdLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIHhzLnB1c2goaW5zcGVjdChrZXksIG9iaikgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4cy5wdXNoKGtleSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtZXJhYmxlLmNhbGwoeyB0b1N0cmluZzogbnVsbCB9LCAndG9TdHJpbmcnKTtcbnZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xudmFyIGRvbnRFbnVtcyA9IFtcblx0J3RvU3RyaW5nJyxcblx0J3RvTG9jYWxlU3RyaW5nJyxcblx0J3ZhbHVlT2YnLFxuXHQnaGFzT3duUHJvcGVydHknLFxuXHQnaXNQcm90b3R5cGVPZicsXG5cdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdCdjb25zdHJ1Y3Rvcidcbl07XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuXHR2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG5cdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xufTtcbnZhciBleGNsdWRlZEtleXMgPSB7XG5cdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHQkY29uc29sZTogdHJ1ZSxcblx0JGV4dGVybmFsOiB0cnVlLFxuXHQkZnJhbWU6IHRydWUsXG5cdCRmcmFtZUVsZW1lbnQ6IHRydWUsXG5cdCRmcmFtZXM6IHRydWUsXG5cdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0JGlubmVyV2lkdGg6IHRydWUsXG5cdCRvdXRlckhlaWdodDogdHJ1ZSxcblx0JG91dGVyV2lkdGg6IHRydWUsXG5cdCRwYWdlWE9mZnNldDogdHJ1ZSxcblx0JHBhZ2VZT2Zmc2V0OiB0cnVlLFxuXHQkcGFyZW50OiB0cnVlLFxuXHQkc2Nyb2xsTGVmdDogdHJ1ZSxcblx0JHNjcm9sbFRvcDogdHJ1ZSxcblx0JHNjcm9sbFg6IHRydWUsXG5cdCRzY3JvbGxZOiB0cnVlLFxuXHQkc2VsZjogdHJ1ZSxcblx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0JHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuXHQkd2luZG93OiB0cnVlXG59O1xudmFyIGhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1ZyA9IChmdW5jdGlvbiAoKSB7XG5cdC8qIGdsb2JhbCB3aW5kb3cgKi9cblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRmb3IgKHZhciBrIGluIHdpbmRvdykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKHdpbmRvd1trXSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59KCkpO1xudmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSA9IGZ1bmN0aW9uIChvKSB7XG5cdC8qIGdsb2JhbCB3aW5kb3cgKi9cblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbnZhciBrZXlzU2hpbSA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG5cdHZhciBpc09iamVjdCA9IG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jztcblx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdHZhciBpc0FyZ3VtZW50cyA9IGlzQXJncyhvYmplY3QpO1xuXHR2YXIgaXNTdHJpbmcgPSBpc09iamVjdCAmJiB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuXHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdGlmICghaXNPYmplY3QgJiYgIWlzRnVuY3Rpb24gJiYgIWlzQXJndW1lbnRzKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuXHR9XG5cblx0dmFyIHNraXBQcm90byA9IGhhc1Byb3RvRW51bUJ1ZyAmJiBpc0Z1bmN0aW9uO1xuXHRpZiAoaXNTdHJpbmcgJiYgb2JqZWN0Lmxlbmd0aCA+IDAgJiYgIWhhcy5jYWxsKG9iamVjdCwgMCkpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhpKSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGlzQXJndW1lbnRzICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBvYmplY3QubGVuZ3RoOyArK2opIHtcblx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0aWYgKCEoc2tpcFByb3RvICYmIG5hbWUgPT09ICdwcm90b3R5cGUnKSAmJiBoYXMuY2FsbChvYmplY3QsIG5hbWUpKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcobmFtZSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdHZhciBza2lwQ29uc3RydWN0b3IgPSBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kob2JqZWN0KTtcblxuXHRcdGZvciAodmFyIGsgPSAwOyBrIDwgZG9udEVudW1zLmxlbmd0aDsgKytrKSB7XG5cdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKGRvbnRFbnVtc1trXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0aGVLZXlzO1xufTtcblxua2V5c1NoaW0uc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RLZXlzKCkge1xuXHRpZiAoT2JqZWN0LmtleXMpIHtcblx0XHR2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBTYWZhcmkgNS4wIGJ1Z1xuXHRcdFx0cmV0dXJuIChPYmplY3Qua2V5cyhhcmd1bWVudHMpIHx8ICcnKS5sZW5ndGggPT09IDI7XG5cdFx0fSgxLCAyKSk7XG5cdFx0aWYgKCFrZXlzV29ya3NXaXRoQXJndW1lbnRzKSB7XG5cdFx0XHR2YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cdFx0XHRPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG5cdFx0XHRcdGlmIChpc0FyZ3Mob2JqZWN0KSkge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdE9iamVjdC5rZXlzID0ga2V5c1NoaW07XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzIHx8IGtleXNTaGltO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzU2hpbTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXM3Jyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRPd25OYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGNvbmNhdCA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciByZWR1Y2UgPSBGdW5jdGlvbi5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLnJlZHVjZSk7XG52YXIgZ2V0QWxsID0gZ2V0U3ltYm9scyA/IGZ1bmN0aW9uIChvYmopIHtcblx0cmV0dXJuIGNvbmNhdChnZXRPd25OYW1lcyhvYmopLCBnZXRTeW1ib2xzKG9iaikpO1xufSA6IGdldE93bk5hbWVzO1xuXG52YXIgaXNFUzUgPSBFUy5Jc0NhbGxhYmxlKGdldERlc2NyaXB0b3IpICYmIEVTLklzQ2FsbGFibGUoZ2V0T3duTmFtZXMpO1xuXG52YXIgc2FmZVB1dCA9IGZ1bmN0aW9uIHB1dChvYmosIHByb3AsIHZhbCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1wYXJhbXNcblx0aWYgKGRlZmluZVByb3BlcnR5ICYmIHByb3AgaW4gb2JqKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHZhbCxcblx0XHRcdHdyaXRhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b2JqW3Byb3BdID0gdmFsO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnModmFsdWUpIHtcblx0RVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh2YWx1ZSk7XG5cdGlmICghaXNFUzUpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIHJlcXVpcmVzIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKTtcblx0fVxuXG5cdHZhciBPID0gRVMuVG9PYmplY3QodmFsdWUpO1xuXHRyZXR1cm4gcmVkdWNlKGdldEFsbChPKSwgZnVuY3Rpb24gKGFjYywga2V5KSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKE8sIGtleSk7XG5cdFx0aWYgKHR5cGVvZiBkZXNjcmlwdG9yICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0c2FmZVB1dChhY2MsIGtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHRcdHJldHVybiBhY2M7XG5cdH0sIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJy4vc2hpbScpO1xuXG5kZWZpbmUoaW1wbGVtZW50YXRpb24sIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGltcGxlbWVudGF0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA6IGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShcblx0XHRPYmplY3QsXG5cdFx0eyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBwb2x5ZmlsbCB9LFxuXHRcdHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIi8vIC5kaXJuYW1lLCAuYmFzZW5hbWUsIGFuZCAuZXh0bmFtZSBtZXRob2RzIGFyZSBleHRyYWN0ZWQgZnJvbSBOb2RlLmpzIHY4LjExLjEsXG4vLyBiYWNrcG9ydGVkIGFuZCB0cmFuc3BsaXRlZCB3aXRoIEJhYmVsLCB3aXRoIGJhY2t3YXJkcy1jb21wYXQgZml4ZXNcblxuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xufTtcblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKSxcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBzdWJzdHIocGF0aCwgLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocGF0aC5zcGxpdCgnLycpLCBmdW5jdGlvbihwKSB7XG4gICAgcmV0dXJuICEhcDtcbiAgfSksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XG4gICAgcGF0aCA9ICcuJztcbiAgfVxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgcGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuam9pbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICByZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHBhdGhzLCBmdW5jdGlvbihwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJykpO1xufTtcblxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG4gIGZyb20gPSBleHBvcnRzLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IGV4cG9ydHMucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuXG4gIGZ1bmN0aW9uIHRyaW0oYXJyKSB7XG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xuICB9XG5cbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICB9XG5cbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcblxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xufTtcblxuZXhwb3J0cy5zZXAgPSAnLyc7XG5leHBvcnRzLmRlbGltaXRlciA9ICc6JztcblxuZXhwb3J0cy5kaXJuYW1lID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykgcGF0aCA9IHBhdGggKyAnJztcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTtcbiAgdmFyIGhhc1Jvb3QgPSBjb2RlID09PSA0NyAvKi8qLztcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvclxuICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiBoYXNSb290ID8gJy8nIDogJy4nO1xuICBpZiAoaGFzUm9vdCAmJiBlbmQgPT09IDEpIHtcbiAgICAvLyByZXR1cm4gJy8vJztcbiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IGZpeDpcbiAgICByZXR1cm4gJy8nO1xuICB9XG4gIHJldHVybiBwYXRoLnNsaWNlKDAsIGVuZCk7XG59O1xuXG5mdW5jdGlvbiBiYXNlbmFtZShwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoICsgJyc7XG5cbiAgdmFyIHN0YXJ0ID0gMDtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaSkgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSkge1xuICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgLy8gcGF0aCBjb21wb25lbnRcbiAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgZW5kID0gaSArIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiAnJztcbiAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8vIFVzZXMgYSBtaXhlZCBhcHByb2FjaCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIGFzIGV4dCBiZWhhdmlvciBjaGFuZ2VkXG4vLyBpbiBuZXcgTm9kZS5qcyB2ZXJzaW9ucywgc28gb25seSBiYXNlbmFtZSgpIGFib3ZlIGlzIGJhY2twb3J0ZWQgaGVyZVxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uIChwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBiYXNlbmFtZShwYXRoKTtcbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cbmV4cG9ydHMuZXh0bmFtZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoICsgJyc7XG4gIHZhciBzdGFydERvdCA9IC0xO1xuICB2YXIgc3RhcnRQYXJ0ID0gMDtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgbWF0Y2hlZFNsYXNoID0gdHJ1ZTtcbiAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZFxuICB2YXIgcHJlRG90U3RhdGUgPSAwO1xuICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIHZhciBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgLy8gZXh0ZW5zaW9uXG4gICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgIGVuZCA9IGkgKyAxO1xuICAgIH1cbiAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8pIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEpXG4gICAgICAgICAgc3RhcnREb3QgPSBpO1xuICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSlcbiAgICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7XG4gICAgfSBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvblxuICAgICAgcHJlRG90U3RhdGUgPSAtMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnREb3QgPT09IC0xIHx8IGVuZCA9PT0gLTEgfHxcbiAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90XG4gICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fFxuICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJ1xuICAgICAgcHJlRG90U3RhdGUgPT09IDEgJiYgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCIvKiFcbiAqIFBsYXRmb3JtLmpzIDxodHRwczovL210aHMuYmUvcGxhdGZvcm0+XG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE4IEJlbmphbWluIFRhbiA8aHR0cHM6Ly9ibmptbnQ0bi5ub3cuc2gvPlxuICogQ29weXJpZ2h0IDIwMTEtMjAxMyBKb2huLURhdmlkIERhbHRvbiA8aHR0cDovL2FsbHlvdWNhbmxlZXQuY29tLz5cbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9tdGhzLmJlL21pdD5cbiAqL1xuOyhmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVybWluZSBpZiB2YWx1ZXMgYXJlIG9mIHRoZSBsYW5ndWFnZSB0eXBlIGBPYmplY3RgLiAqL1xuICB2YXIgb2JqZWN0VHlwZXMgPSB7XG4gICAgJ2Z1bmN0aW9uJzogdHJ1ZSxcbiAgICAnb2JqZWN0JzogdHJ1ZVxuICB9O1xuXG4gIC8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgcm9vdCA9IChvYmplY3RUeXBlc1t0eXBlb2Ygd2luZG93XSAmJiB3aW5kb3cpIHx8IHRoaXM7XG5cbiAgLyoqIEJhY2t1cCBwb3NzaWJsZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgb2xkUm9vdCA9IHJvb3Q7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGV4cG9ydHNdICYmIGV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xuICB2YXIgZnJlZU1vZHVsZSA9IG9iamVjdFR5cGVzW3R5cGVvZiBtb2R1bGVdICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzIG9yIEJyb3dzZXJpZmllZCBjb2RlIGFuZCB1c2UgaXQgYXMgYHJvb3RgLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUgJiYgdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG4gIGlmIChmcmVlR2xvYmFsICYmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLnNlbGYgPT09IGZyZWVHbG9iYWwpKSB7XG4gICAgcm9vdCA9IGZyZWVHbG9iYWw7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBhcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gYXJyYXktbGlrZSBvYmplY3QuXG4gICAqIFNlZSB0aGUgW0VTNiBzcGVjXShodHRwOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2xlbmd0aClcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbiAgLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgT3BlcmEuICovXG4gIHZhciByZU9wZXJhID0gL1xcYk9wZXJhLztcblxuICAvKiogUG9zc2libGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHRoaXNCaW5kaW5nID0gdGhpcztcblxuICAvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuICB2YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gIC8qKiBVc2VkIHRvIGNoZWNrIGZvciBvd24gcHJvcGVydGllcyBvZiBhbiBvYmplY3QuICovXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGludGVybmFsIGBbW0NsYXNzXV1gIG9mIHZhbHVlcy4gKi9cbiAgdmFyIHRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENhcGl0YWxpemVzIGEgc3RyaW5nIHZhbHVlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gU3RyaW5nKHN0cmluZyk7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlIE9TIG5hbWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcyBUaGUgT1MgbmFtZSB0byBjbGVhbiB1cC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXR0ZXJuXSBBIGBSZWdFeHBgIHBhdHRlcm4gbWF0Y2hpbmcgdGhlIE9TIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdIEEgbGFiZWwgZm9yIHRoZSBPUy5cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFudXBPUyhvcywgcGF0dGVybiwgbGFiZWwpIHtcbiAgICAvLyBQbGF0Zm9ybSB0b2tlbnMgYXJlIGRlZmluZWQgYXQ6XG4gICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM3NTAzKFZTLjg1KS5hc3B4XG4gICAgLy8gaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwODExMjIwNTM5NTAvaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM3NTAzKFZTLjg1KS5hc3B4XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICAnMTAuMCc6ICcxMCcsXG4gICAgICAnNi40JzogICcxMCBUZWNobmljYWwgUHJldmlldycsXG4gICAgICAnNi4zJzogICc4LjEnLFxuICAgICAgJzYuMic6ICAnOCcsXG4gICAgICAnNi4xJzogICdTZXJ2ZXIgMjAwOCBSMiAvIDcnLFxuICAgICAgJzYuMCc6ICAnU2VydmVyIDIwMDggLyBWaXN0YScsXG4gICAgICAnNS4yJzogICdTZXJ2ZXIgMjAwMyAvIFhQIDY0LWJpdCcsXG4gICAgICAnNS4xJzogICdYUCcsXG4gICAgICAnNS4wMSc6ICcyMDAwIFNQMScsXG4gICAgICAnNS4wJzogICcyMDAwJyxcbiAgICAgICc0LjAnOiAgJ05UJyxcbiAgICAgICc0LjkwJzogJ01FJ1xuICAgIH07XG4gICAgLy8gRGV0ZWN0IFdpbmRvd3MgdmVyc2lvbiBmcm9tIHBsYXRmb3JtIHRva2Vucy5cbiAgICBpZiAocGF0dGVybiAmJiBsYWJlbCAmJiAvXldpbi9pLnRlc3Qob3MpICYmICEvXldpbmRvd3MgUGhvbmUgL2kudGVzdChvcykgJiZcbiAgICAgICAgKGRhdGEgPSBkYXRhWy9bXFxkLl0rJC8uZXhlYyhvcyldKSkge1xuICAgICAgb3MgPSAnV2luZG93cyAnICsgZGF0YTtcbiAgICB9XG4gICAgLy8gQ29ycmVjdCBjaGFyYWN0ZXIgY2FzZSBhbmQgY2xlYW51cCBzdHJpbmcuXG4gICAgb3MgPSBTdHJpbmcob3MpO1xuXG4gICAgaWYgKHBhdHRlcm4gJiYgbGFiZWwpIHtcbiAgICAgIG9zID0gb3MucmVwbGFjZShSZWdFeHAocGF0dGVybiwgJ2knKSwgbGFiZWwpO1xuICAgIH1cblxuICAgIG9zID0gZm9ybWF0KFxuICAgICAgb3MucmVwbGFjZSgvIGNlJC9pLCAnIENFJylcbiAgICAgICAgLnJlcGxhY2UoL1xcYmhwdy9pLCAnd2ViJylcbiAgICAgICAgLnJlcGxhY2UoL1xcYk1hY2ludG9zaFxcYi8sICdNYWMgT1MnKVxuICAgICAgICAucmVwbGFjZSgvX1Bvd2VyUENcXGIvaSwgJyBPUycpXG4gICAgICAgIC5yZXBsYWNlKC9cXGIoT1MgWCkgW14gXFxkXSsvaSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UoL1xcYk1hYyAoT1MgWClcXGIvLCAnJDEnKVxuICAgICAgICAucmVwbGFjZSgvXFwvKFxcZCkvLCAnICQxJylcbiAgICAgICAgLnJlcGxhY2UoL18vZywgJy4nKVxuICAgICAgICAucmVwbGFjZSgvKD86IEJlUEN8WyAuXSpmY1sgXFxkLl0rKSQvaSwgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXGJ4ODZcXC42NFxcYi9naSwgJ3g4Nl82NCcpXG4gICAgICAgIC5yZXBsYWNlKC9cXGIoV2luZG93cyBQaG9uZSkgT1NcXGIvLCAnJDEnKVxuICAgICAgICAucmVwbGFjZSgvXFxiKENocm9tZSBPUyBcXHcrKSBbXFxkLl0rXFxiLywgJyQxJylcbiAgICAgICAgLnNwbGl0KCcgb24gJylbMF1cbiAgICApO1xuXG4gICAgcmV0dXJuIG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGl0ZXJhdGlvbiB1dGlsaXR5IGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGVhY2gob2JqZWN0LCBjYWxsYmFjaykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBvYmplY3QgPyBvYmplY3QubGVuZ3RoIDogMDtcblxuICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInICYmIGxlbmd0aCA+IC0xICYmIGxlbmd0aCA8PSBtYXhTYWZlSW50ZWdlcikge1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2sob2JqZWN0W2luZGV4XSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck93bihvYmplY3QsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpbSBhbmQgY29uZGl0aW9uYWxseSBjYXBpdGFsaXplIHN0cmluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBmb3JtYXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybWF0KHN0cmluZykge1xuICAgIHN0cmluZyA9IHRyaW0oc3RyaW5nKTtcbiAgICByZXR1cm4gL14oPzp3ZWJPU3xpKD86T1N8UCkpLy50ZXN0KHN0cmluZylcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IGNhcGl0YWxpemUoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLCBleGVjdXRpbmcgdGhlIGBjYWxsYmFja2AgZm9yIGVhY2guXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBleGVjdXRlZCBwZXIgb3duIHByb3BlcnR5LlxuICAgKi9cbiAgZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW50ZXJuYWwgYFtbQ2xhc3NdXWAgb2YgYSB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBgW1tDbGFzc11dYC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsYXNzT2YodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbFxuICAgICAgPyBjYXBpdGFsaXplKHZhbHVlKVxuICAgICAgOiB0b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSk7XG4gIH1cblxuICAvKipcbiAgICogSG9zdCBvYmplY3RzIGNhbiByZXR1cm4gdHlwZSB2YWx1ZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhlaXIgYWN0dWFsXG4gICAqIGRhdGEgdHlwZS4gVGhlIG9iamVjdHMgd2UgYXJlIGNvbmNlcm5lZCB3aXRoIHVzdWFsbHkgcmV0dXJuIG5vbi1wcmltaXRpdmVcbiAgICogdHlwZXMgb2YgXCJvYmplY3RcIiwgXCJmdW5jdGlvblwiLCBvciBcInVua25vd25cIi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG93bmVyIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIG5vbi1wcmltaXRpdmUsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGlzSG9zdFR5cGUob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHZhciB0eXBlID0gb2JqZWN0ICE9IG51bGwgPyB0eXBlb2Ygb2JqZWN0W3Byb3BlcnR5XSA6ICdudW1iZXInO1xuICAgIHJldHVybiAhL14oPzpib29sZWFufG51bWJlcnxzdHJpbmd8dW5kZWZpbmVkKSQvLnRlc3QodHlwZSkgJiZcbiAgICAgICh0eXBlID09ICdvYmplY3QnID8gISFvYmplY3RbcHJvcGVydHldIDogdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBzdHJpbmcgZm9yIHVzZSBpbiBhIGBSZWdFeHBgIGJ5IG1ha2luZyBoeXBoZW5zIGFuZCBzcGFjZXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBxdWFsaWZ5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcXVhbGlmaWVkIHN0cmluZy5cbiAgICovXG4gIGZ1bmN0aW9uIHF1YWxpZnkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UoLyhbIC1dKSg/ISQpL2csICckMT8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGJhcmUtYm9uZXMgYEFycmF5I3JlZHVjZWAgbGlrZSB1dGlsaXR5IGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHsqfSBUaGUgYWNjdW11bGF0ZWQgcmVzdWx0LlxuICAgKi9cbiAgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBjYWxsYmFjaykge1xuICAgIHZhciBhY2N1bXVsYXRvciA9IG51bGw7XG4gICAgZWFjaChhcnJheSwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGFycmF5KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJpbW1lZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiB0cmltKHN0cmluZykge1xuICAgIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKC9eICt8ICskL2csICcnKTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsYXRmb3JtIG9iamVjdC5cbiAgICpcbiAgICogQG1lbWJlck9mIHBsYXRmb3JtXG4gICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gW3VhPW5hdmlnYXRvci51c2VyQWdlbnRdIFRoZSB1c2VyIGFnZW50IHN0cmluZyBvclxuICAgKiAgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEEgcGxhdGZvcm0gb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2UodWEpIHtcblxuICAgIC8qKiBUaGUgZW52aXJvbm1lbnQgY29udGV4dCBvYmplY3QuICovXG4gICAgdmFyIGNvbnRleHQgPSByb290O1xuXG4gICAgLyoqIFVzZWQgdG8gZmxhZyB3aGVuIGEgY3VzdG9tIGNvbnRleHQgaXMgcHJvdmlkZWQuICovXG4gICAgdmFyIGlzQ3VzdG9tQ29udGV4dCA9IHVhICYmIHR5cGVvZiB1YSA9PSAnb2JqZWN0JyAmJiBnZXRDbGFzc09mKHVhKSAhPSAnU3RyaW5nJztcblxuICAgIC8vIEp1Z2dsZSBhcmd1bWVudHMuXG4gICAgaWYgKGlzQ3VzdG9tQ29udGV4dCkge1xuICAgICAgY29udGV4dCA9IHVhO1xuICAgICAgdWEgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKiBCcm93c2VyIG5hdmlnYXRvciBvYmplY3QuICovXG4gICAgdmFyIG5hdiA9IGNvbnRleHQubmF2aWdhdG9yIHx8IHt9O1xuXG4gICAgLyoqIEJyb3dzZXIgdXNlciBhZ2VudCBzdHJpbmcuICovXG4gICAgdmFyIHVzZXJBZ2VudCA9IG5hdi51c2VyQWdlbnQgfHwgJyc7XG5cbiAgICB1YSB8fCAodWEgPSB1c2VyQWdlbnQpO1xuXG4gICAgLyoqIFVzZWQgdG8gZmxhZyB3aGVuIGB0aGlzQmluZGluZ2AgaXMgdGhlIFtNb2R1bGVTY29wZV0uICovXG4gICAgdmFyIGlzTW9kdWxlU2NvcGUgPSBpc0N1c3RvbUNvbnRleHQgfHwgdGhpc0JpbmRpbmcgPT0gb2xkUm9vdDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBicm93c2VyIGlzIGxpa2UgQ2hyb21lLiAqL1xuICAgIHZhciBsaWtlQ2hyb21lID0gaXNDdXN0b21Db250ZXh0XG4gICAgICA/ICEhbmF2Lmxpa2VDaHJvbWVcbiAgICAgIDogL1xcYkNocm9tZVxcYi8udGVzdCh1YSkgJiYgIS9pbnRlcm5hbHxcXG4vaS50ZXN0KHRvU3RyaW5nLnRvU3RyaW5nKCkpO1xuXG4gICAgLyoqIEludGVybmFsIGBbW0NsYXNzXV1gIHZhbHVlIHNob3J0Y3V0cy4gKi9cbiAgICB2YXIgb2JqZWN0Q2xhc3MgPSAnT2JqZWN0JyxcbiAgICAgICAgYWlyUnVudGltZUNsYXNzID0gaXNDdXN0b21Db250ZXh0ID8gb2JqZWN0Q2xhc3MgOiAnU2NyaXB0QnJpZGdpbmdQcm94eU9iamVjdCcsXG4gICAgICAgIGVudmlyb0NsYXNzID0gaXNDdXN0b21Db250ZXh0ID8gb2JqZWN0Q2xhc3MgOiAnRW52aXJvbm1lbnQnLFxuICAgICAgICBqYXZhQ2xhc3MgPSAoaXNDdXN0b21Db250ZXh0ICYmIGNvbnRleHQuamF2YSkgPyAnSmF2YVBhY2thZ2UnIDogZ2V0Q2xhc3NPZihjb250ZXh0LmphdmEpLFxuICAgICAgICBwaGFudG9tQ2xhc3MgPSBpc0N1c3RvbUNvbnRleHQgPyBvYmplY3RDbGFzcyA6ICdSdW50aW1lT2JqZWN0JztcblxuICAgIC8qKiBEZXRlY3QgSmF2YSBlbnZpcm9ubWVudHMuICovXG4gICAgdmFyIGphdmEgPSAvXFxiSmF2YS8udGVzdChqYXZhQ2xhc3MpICYmIGNvbnRleHQuamF2YTtcblxuICAgIC8qKiBEZXRlY3QgUmhpbm8uICovXG4gICAgdmFyIHJoaW5vID0gamF2YSAmJiBnZXRDbGFzc09mKGNvbnRleHQuZW52aXJvbm1lbnQpID09IGVudmlyb0NsYXNzO1xuXG4gICAgLyoqIEEgY2hhcmFjdGVyIHRvIHJlcHJlc2VudCBhbHBoYS4gKi9cbiAgICB2YXIgYWxwaGEgPSBqYXZhID8gJ2EnIDogJ1xcdTAzYjEnO1xuXG4gICAgLyoqIEEgY2hhcmFjdGVyIHRvIHJlcHJlc2VudCBiZXRhLiAqL1xuICAgIHZhciBiZXRhID0gamF2YSA/ICdiJyA6ICdcXHUwM2IyJztcblxuICAgIC8qKiBCcm93c2VyIGRvY3VtZW50IG9iamVjdC4gKi9cbiAgICB2YXIgZG9jID0gY29udGV4dC5kb2N1bWVudCB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBPcGVyYSBicm93c2VyIChQcmVzdG8tYmFzZWQpLlxuICAgICAqIGh0dHA6Ly93d3cuaG93dG9jcmVhdGUuY28udWsvb3BlcmFTdHVmZi9vcGVyYU9iamVjdC5odG1sXG4gICAgICogaHR0cDovL2Rldi5vcGVyYS5jb20vYXJ0aWNsZXMvdmlldy9vcGVyYS1taW5pLXdlYi1jb250ZW50LWF1dGhvcmluZy1ndWlkZWxpbmVzLyNvcGVyYW1pbmlcbiAgICAgKi9cbiAgICB2YXIgb3BlcmEgPSBjb250ZXh0Lm9wZXJhbWluaSB8fCBjb250ZXh0Lm9wZXJhO1xuXG4gICAgLyoqIE9wZXJhIGBbW0NsYXNzXV1gLiAqL1xuICAgIHZhciBvcGVyYUNsYXNzID0gcmVPcGVyYS50ZXN0KG9wZXJhQ2xhc3MgPSAoaXNDdXN0b21Db250ZXh0ICYmIG9wZXJhKSA/IG9wZXJhWydbW0NsYXNzXV0nXSA6IGdldENsYXNzT2Yob3BlcmEpKVxuICAgICAgPyBvcGVyYUNsYXNzXG4gICAgICA6IChvcGVyYSA9IG51bGwpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqIFRlbXBvcmFyeSB2YXJpYWJsZSB1c2VkIG92ZXIgdGhlIHNjcmlwdCdzIGxpZmV0aW1lLiAqL1xuICAgIHZhciBkYXRhO1xuXG4gICAgLyoqIFRoZSBDUFUgYXJjaGl0ZWN0dXJlLiAqL1xuICAgIHZhciBhcmNoID0gdWE7XG5cbiAgICAvKiogUGxhdGZvcm0gZGVzY3JpcHRpb24gYXJyYXkuICovXG4gICAgdmFyIGRlc2NyaXB0aW9uID0gW107XG5cbiAgICAvKiogUGxhdGZvcm0gYWxwaGEvYmV0YSBpbmRpY2F0b3IuICovXG4gICAgdmFyIHByZXJlbGVhc2UgPSBudWxsO1xuXG4gICAgLyoqIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGVudmlyb25tZW50IGZlYXR1cmVzIHNob3VsZCBiZSB1c2VkIHRvIHJlc29sdmUgdGhlIHBsYXRmb3JtLiAqL1xuICAgIHZhciB1c2VGZWF0dXJlcyA9IHVhID09IHVzZXJBZ2VudDtcblxuICAgIC8qKiBUaGUgYnJvd3Nlci9lbnZpcm9ubWVudCB2ZXJzaW9uLiAqL1xuICAgIHZhciB2ZXJzaW9uID0gdXNlRmVhdHVyZXMgJiYgb3BlcmEgJiYgdHlwZW9mIG9wZXJhLnZlcnNpb24gPT0gJ2Z1bmN0aW9uJyAmJiBvcGVyYS52ZXJzaW9uKCk7XG5cbiAgICAvKiogQSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBPUyBlbmRzIHdpdGggXCIvIFZlcnNpb25cIiAqL1xuICAgIHZhciBpc1NwZWNpYWxDYXNlZE9TO1xuXG4gICAgLyogRGV0ZWN0YWJsZSBsYXlvdXQgZW5naW5lcyAob3JkZXIgaXMgaW1wb3J0YW50KS4gKi9cbiAgICB2YXIgbGF5b3V0ID0gZ2V0TGF5b3V0KFtcbiAgICAgIHsgJ2xhYmVsJzogJ0VkZ2VIVE1MJywgJ3BhdHRlcm4nOiAnRWRnZScgfSxcbiAgICAgICdUcmlkZW50JyxcbiAgICAgIHsgJ2xhYmVsJzogJ1dlYktpdCcsICdwYXR0ZXJuJzogJ0FwcGxlV2ViS2l0JyB9LFxuICAgICAgJ2lDYWInLFxuICAgICAgJ1ByZXN0bycsXG4gICAgICAnTmV0RnJvbnQnLFxuICAgICAgJ1Rhc21hbicsXG4gICAgICAnS0hUTUwnLFxuICAgICAgJ0dlY2tvJ1xuICAgIF0pO1xuXG4gICAgLyogRGV0ZWN0YWJsZSBicm93c2VyIG5hbWVzIChvcmRlciBpcyBpbXBvcnRhbnQpLiAqL1xuICAgIHZhciBuYW1lID0gZ2V0TmFtZShbXG4gICAgICAnQWRvYmUgQUlSJyxcbiAgICAgICdBcm9yYScsXG4gICAgICAnQXZhbnQgQnJvd3NlcicsXG4gICAgICAnQnJlYWNoJyxcbiAgICAgICdDYW1pbm8nLFxuICAgICAgJ0VsZWN0cm9uJyxcbiAgICAgICdFcGlwaGFueScsXG4gICAgICAnRmVubmVjJyxcbiAgICAgICdGbG9jaycsXG4gICAgICAnR2FsZW9uJyxcbiAgICAgICdHcmVlbkJyb3dzZXInLFxuICAgICAgJ2lDYWInLFxuICAgICAgJ0ljZXdlYXNlbCcsXG4gICAgICAnSy1NZWxlb24nLFxuICAgICAgJ0tvbnF1ZXJvcicsXG4gICAgICAnTHVuYXNjYXBlJyxcbiAgICAgICdNYXh0aG9uJyxcbiAgICAgIHsgJ2xhYmVsJzogJ01pY3Jvc29mdCBFZGdlJywgJ3BhdHRlcm4nOiAnRWRnZScgfSxcbiAgICAgICdNaWRvcmknLFxuICAgICAgJ05vb2sgQnJvd3NlcicsXG4gICAgICAnUGFsZU1vb24nLFxuICAgICAgJ1BoYW50b21KUycsXG4gICAgICAnUmF2ZW4nLFxuICAgICAgJ1Jla29ucScsXG4gICAgICAnUm9ja01lbHQnLFxuICAgICAgeyAnbGFiZWwnOiAnU2Ftc3VuZyBJbnRlcm5ldCcsICdwYXR0ZXJuJzogJ1NhbXN1bmdCcm93c2VyJyB9LFxuICAgICAgJ1NlYU1vbmtleScsXG4gICAgICB7ICdsYWJlbCc6ICdTaWxrJywgJ3BhdHRlcm4nOiAnKD86Q2xvdWQ5fFNpbGstQWNjZWxlcmF0ZWQpJyB9LFxuICAgICAgJ1NsZWlwbmlyJyxcbiAgICAgICdTbGltQnJvd3NlcicsXG4gICAgICB7ICdsYWJlbCc6ICdTUldhcmUgSXJvbicsICdwYXR0ZXJuJzogJ0lyb24nIH0sXG4gICAgICAnU3VucmlzZScsXG4gICAgICAnU3dpZnRmb3gnLFxuICAgICAgJ1dhdGVyZm94JyxcbiAgICAgICdXZWJQb3NpdGl2ZScsXG4gICAgICAnT3BlcmEgTWluaScsXG4gICAgICB7ICdsYWJlbCc6ICdPcGVyYSBNaW5pJywgJ3BhdHRlcm4nOiAnT1BpT1MnIH0sXG4gICAgICAnT3BlcmEnLFxuICAgICAgeyAnbGFiZWwnOiAnT3BlcmEnLCAncGF0dGVybic6ICdPUFInIH0sXG4gICAgICAnQ2hyb21lJyxcbiAgICAgIHsgJ2xhYmVsJzogJ0Nocm9tZSBNb2JpbGUnLCAncGF0dGVybic6ICcoPzpDcmlPU3xDck1vKScgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0ZpcmVmb3gnLCAncGF0dGVybic6ICcoPzpGaXJlZm94fE1pbmVmaWVsZCknIH0sXG4gICAgICB7ICdsYWJlbCc6ICdGaXJlZm94IGZvciBpT1MnLCAncGF0dGVybic6ICdGeGlPUycgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0lFJywgJ3BhdHRlcm4nOiAnSUVNb2JpbGUnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdJRScsICdwYXR0ZXJuJzogJ01TSUUnIH0sXG4gICAgICAnU2FmYXJpJ1xuICAgIF0pO1xuXG4gICAgLyogRGV0ZWN0YWJsZSBwcm9kdWN0cyAob3JkZXIgaXMgaW1wb3J0YW50KS4gKi9cbiAgICB2YXIgcHJvZHVjdCA9IGdldFByb2R1Y3QoW1xuICAgICAgeyAnbGFiZWwnOiAnQmxhY2tCZXJyeScsICdwYXR0ZXJuJzogJ0JCMTAnIH0sXG4gICAgICAnQmxhY2tCZXJyeScsXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUycsICdwYXR0ZXJuJzogJ0dULUk5MDAwJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnR2FsYXh5IFMyJywgJ3BhdHRlcm4nOiAnR1QtSTkxMDAnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzMnLCAncGF0dGVybic6ICdHVC1JOTMwMCcgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTNCcsICdwYXR0ZXJuJzogJ0dULUk5NTAwJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnR2FsYXh5IFM1JywgJ3BhdHRlcm4nOiAnU00tRzkwMCcgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTNicsICdwYXR0ZXJuJzogJ1NNLUc5MjAnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzYgRWRnZScsICdwYXR0ZXJuJzogJ1NNLUc5MjUnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzcnLCAncGF0dGVybic6ICdTTS1HOTMwJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnR2FsYXh5IFM3IEVkZ2UnLCAncGF0dGVybic6ICdTTS1HOTM1JyB9LFxuICAgICAgJ0dvb2dsZSBUVicsXG4gICAgICAnTHVtaWEnLFxuICAgICAgJ2lQYWQnLFxuICAgICAgJ2lQb2QnLFxuICAgICAgJ2lQaG9uZScsXG4gICAgICAnS2luZGxlJyxcbiAgICAgIHsgJ2xhYmVsJzogJ0tpbmRsZSBGaXJlJywgJ3BhdHRlcm4nOiAnKD86Q2xvdWQ5fFNpbGstQWNjZWxlcmF0ZWQpJyB9LFxuICAgICAgJ05leHVzJyxcbiAgICAgICdOb29rJyxcbiAgICAgICdQbGF5Qm9vaycsXG4gICAgICAnUGxheVN0YXRpb24gVml0YScsXG4gICAgICAnUGxheVN0YXRpb24nLFxuICAgICAgJ1RvdWNoUGFkJyxcbiAgICAgICdUcmFuc2Zvcm1lcicsXG4gICAgICB7ICdsYWJlbCc6ICdXaWkgVScsICdwYXR0ZXJuJzogJ1dpaVUnIH0sXG4gICAgICAnV2lpJyxcbiAgICAgICdYYm94IE9uZScsXG4gICAgICB7ICdsYWJlbCc6ICdYYm94IDM2MCcsICdwYXR0ZXJuJzogJ1hib3gnIH0sXG4gICAgICAnWG9vbSdcbiAgICBdKTtcblxuICAgIC8qIERldGVjdGFibGUgbWFudWZhY3R1cmVycy4gKi9cbiAgICB2YXIgbWFudWZhY3R1cmVyID0gZ2V0TWFudWZhY3R1cmVyKHtcbiAgICAgICdBcHBsZSc6IHsgJ2lQYWQnOiAxLCAnaVBob25lJzogMSwgJ2lQb2QnOiAxIH0sXG4gICAgICAnQXJjaG9zJzoge30sXG4gICAgICAnQW1hem9uJzogeyAnS2luZGxlJzogMSwgJ0tpbmRsZSBGaXJlJzogMSB9LFxuICAgICAgJ0FzdXMnOiB7ICdUcmFuc2Zvcm1lcic6IDEgfSxcbiAgICAgICdCYXJuZXMgJiBOb2JsZSc6IHsgJ05vb2snOiAxIH0sXG4gICAgICAnQmxhY2tCZXJyeSc6IHsgJ1BsYXlCb29rJzogMSB9LFxuICAgICAgJ0dvb2dsZSc6IHsgJ0dvb2dsZSBUVic6IDEsICdOZXh1cyc6IDEgfSxcbiAgICAgICdIUCc6IHsgJ1RvdWNoUGFkJzogMSB9LFxuICAgICAgJ0hUQyc6IHt9LFxuICAgICAgJ0xHJzoge30sXG4gICAgICAnTWljcm9zb2Z0JzogeyAnWGJveCc6IDEsICdYYm94IE9uZSc6IDEgfSxcbiAgICAgICdNb3Rvcm9sYSc6IHsgJ1hvb20nOiAxIH0sXG4gICAgICAnTmludGVuZG8nOiB7ICdXaWkgVSc6IDEsICAnV2lpJzogMSB9LFxuICAgICAgJ05va2lhJzogeyAnTHVtaWEnOiAxIH0sXG4gICAgICAnU2Ftc3VuZyc6IHsgJ0dhbGF4eSBTJzogMSwgJ0dhbGF4eSBTMic6IDEsICdHYWxheHkgUzMnOiAxLCAnR2FsYXh5IFM0JzogMSB9LFxuICAgICAgJ1NvbnknOiB7ICdQbGF5U3RhdGlvbic6IDEsICdQbGF5U3RhdGlvbiBWaXRhJzogMSB9XG4gICAgfSk7XG5cbiAgICAvKiBEZXRlY3RhYmxlIG9wZXJhdGluZyBzeXN0ZW1zIChvcmRlciBpcyBpbXBvcnRhbnQpLiAqL1xuICAgIHZhciBvcyA9IGdldE9TKFtcbiAgICAgICdXaW5kb3dzIFBob25lJyxcbiAgICAgICdBbmRyb2lkJyxcbiAgICAgICdDZW50T1MnLFxuICAgICAgeyAnbGFiZWwnOiAnQ2hyb21lIE9TJywgJ3BhdHRlcm4nOiAnQ3JPUycgfSxcbiAgICAgICdEZWJpYW4nLFxuICAgICAgJ0ZlZG9yYScsXG4gICAgICAnRnJlZUJTRCcsXG4gICAgICAnR2VudG9vJyxcbiAgICAgICdIYWlrdScsXG4gICAgICAnS3VidW50dScsXG4gICAgICAnTGludXggTWludCcsXG4gICAgICAnT3BlbkJTRCcsXG4gICAgICAnUmVkIEhhdCcsXG4gICAgICAnU3VTRScsXG4gICAgICAnVWJ1bnR1JyxcbiAgICAgICdYdWJ1bnR1JyxcbiAgICAgICdDeWd3aW4nLFxuICAgICAgJ1N5bWJpYW4gT1MnLFxuICAgICAgJ2hwd09TJyxcbiAgICAgICd3ZWJPUyAnLFxuICAgICAgJ3dlYk9TJyxcbiAgICAgICdUYWJsZXQgT1MnLFxuICAgICAgJ1RpemVuJyxcbiAgICAgICdMaW51eCcsXG4gICAgICAnTWFjIE9TIFgnLFxuICAgICAgJ01hY2ludG9zaCcsXG4gICAgICAnTWFjJyxcbiAgICAgICdXaW5kb3dzIDk4OycsXG4gICAgICAnV2luZG93cyAnXG4gICAgXSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgbGF5b3V0IGVuZ2luZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBsYXlvdXQgZW5naW5lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExheW91dChndWVzc2VzKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGd1ZXNzZXMsIGZ1bmN0aW9uKHJlc3VsdCwgZ3Vlc3MpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBSZWdFeHAoJ1xcXFxiJyArIChcbiAgICAgICAgICBndWVzcy5wYXR0ZXJuIHx8IHF1YWxpZnkoZ3Vlc3MpXG4gICAgICAgICkgKyAnXFxcXGInLCAnaScpLmV4ZWModWEpICYmIChndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgbWFudWZhY3R1cmVyIGZyb20gYW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZ3Vlc3NlcyBBbiBvYmplY3Qgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBtYW51ZmFjdHVyZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyKGd1ZXNzZXMpIHtcbiAgICAgIHJldHVybiByZWR1Y2UoZ3Vlc3NlcywgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICAgIC8vIExvb2t1cCB0aGUgbWFudWZhY3R1cmVyIGJ5IHByb2R1Y3Qgb3Igc2NhbiB0aGUgVUEgZm9yIHRoZSBtYW51ZmFjdHVyZXIuXG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgKFxuICAgICAgICAgIHZhbHVlW3Byb2R1Y3RdIHx8XG4gICAgICAgICAgdmFsdWVbL15bYS16XSsoPzogK1thLXpdK1xcYikqL2kuZXhlYyhwcm9kdWN0KV0gfHxcbiAgICAgICAgICBSZWdFeHAoJ1xcXFxiJyArIHF1YWxpZnkoa2V5KSArICcoPzpcXFxcYnxcXFxcdypcXFxcZCknLCAnaScpLmV4ZWModWEpXG4gICAgICAgICkgJiYga2V5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlja3MgdGhlIGJyb3dzZXIgbmFtZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBicm93c2VyIG5hbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmFtZShndWVzc2VzKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGd1ZXNzZXMsIGZ1bmN0aW9uKHJlc3VsdCwgZ3Vlc3MpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBSZWdFeHAoJ1xcXFxiJyArIChcbiAgICAgICAgICBndWVzcy5wYXR0ZXJuIHx8IHF1YWxpZnkoZ3Vlc3MpXG4gICAgICAgICkgKyAnXFxcXGInLCAnaScpLmV4ZWModWEpICYmIChndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgT1MgbmFtZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBPUyBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE9TKGd1ZXNzZXMpIHtcbiAgICAgIHJldHVybiByZWR1Y2UoZ3Vlc3NlcywgZnVuY3Rpb24ocmVzdWx0LCBndWVzcykge1xuICAgICAgICB2YXIgcGF0dGVybiA9IGd1ZXNzLnBhdHRlcm4gfHwgcXVhbGlmeShndWVzcyk7XG4gICAgICAgIGlmICghcmVzdWx0ICYmIChyZXN1bHQgPVxuICAgICAgICAgICAgICBSZWdFeHAoJ1xcXFxiJyArIHBhdHRlcm4gKyAnKD86L1tcXFxcZC5dK3xbIFxcXFx3Ll0qKScsICdpJykuZXhlYyh1YSlcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBjbGVhbnVwT1MocmVzdWx0LCBwYXR0ZXJuLCBndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpY2tzIHRoZSBwcm9kdWN0IG5hbWUgZnJvbSBhbiBhcnJheSBvZiBndWVzc2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBndWVzc2VzIEFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICogQHJldHVybnMge251bGx8c3RyaW5nfSBUaGUgZGV0ZWN0ZWQgcHJvZHVjdCBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFByb2R1Y3QoZ3Vlc3Nlcykge1xuICAgICAgcmV0dXJuIHJlZHVjZShndWVzc2VzLCBmdW5jdGlvbihyZXN1bHQsIGd1ZXNzKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuID0gZ3Vlc3MucGF0dGVybiB8fCBxdWFsaWZ5KGd1ZXNzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgKHJlc3VsdCA9XG4gICAgICAgICAgICAgIFJlZ0V4cCgnXFxcXGInICsgcGF0dGVybiArICcgKlxcXFxkK1suXFxcXHdfXSonLCAnaScpLmV4ZWModWEpIHx8XG4gICAgICAgICAgICAgIFJlZ0V4cCgnXFxcXGInICsgcGF0dGVybiArICcgKlxcXFx3Ky1bXFxcXHddKicsICdpJykuZXhlYyh1YSkgfHxcbiAgICAgICAgICAgICAgUmVnRXhwKCdcXFxcYicgKyBwYXR0ZXJuICsgJyg/OjsgKig/OlthLXpdK1tfLV0pP1thLXpdK1xcXFxkK3xbXiAoKTstXSopJywgJ2knKS5leGVjKHVhKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIC8vIFNwbGl0IGJ5IGZvcndhcmQgc2xhc2ggYW5kIGFwcGVuZCBwcm9kdWN0IHZlcnNpb24gaWYgbmVlZGVkLlxuICAgICAgICAgIGlmICgocmVzdWx0ID0gU3RyaW5nKChndWVzcy5sYWJlbCAmJiAhUmVnRXhwKHBhdHRlcm4sICdpJykudGVzdChndWVzcy5sYWJlbCkpID8gZ3Vlc3MubGFiZWwgOiByZXN1bHQpLnNwbGl0KCcvJykpWzFdICYmICEvW1xcZC5dKy8udGVzdChyZXN1bHRbMF0pKSB7XG4gICAgICAgICAgICByZXN1bHRbMF0gKz0gJyAnICsgcmVzdWx0WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDb3JyZWN0IGNoYXJhY3RlciBjYXNlIGFuZCBjbGVhbnVwIHN0cmluZy5cbiAgICAgICAgICBndWVzcyA9IGd1ZXNzLmxhYmVsIHx8IGd1ZXNzO1xuICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdChyZXN1bHRbMF1cbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cChwYXR0ZXJuLCAnaScpLCBndWVzcylcbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cCgnOyAqKD86JyArIGd1ZXNzICsgJ1tfLV0pPycsICdpJyksICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cCgnKCcgKyBndWVzcyArICcpWy1fLl0/KFxcXFx3KScsICdpJyksICckMSAkMicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIHZlcnNpb24gdXNpbmcgYW4gYXJyYXkgb2YgVUEgcGF0dGVybnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdHRlcm5zIEFuIGFycmF5IG9mIFVBIHBhdHRlcm5zLlxuICAgICAqIEByZXR1cm5zIHtudWxsfHN0cmluZ30gVGhlIGRldGVjdGVkIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmVyc2lvbihwYXR0ZXJucykge1xuICAgICAgcmV0dXJuIHJlZHVjZShwYXR0ZXJucywgZnVuY3Rpb24ocmVzdWx0LCBwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgKFJlZ0V4cChwYXR0ZXJuICtcbiAgICAgICAgICAnKD86LVtcXFxcZC5dKy98KD86IGZvciBbXFxcXHctXSspP1sgLy1dKShbXFxcXGQuXStbXiAoKTsvXy1dKiknLCAnaScpLmV4ZWModWEpIHx8IDApWzFdIHx8IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBwbGF0Zm9ybS5kZXNjcmlwdGlvbmAgd2hlbiB0aGUgcGxhdGZvcm0gb2JqZWN0IGlzIGNvZXJjZWQgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSB0b1N0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgYHBsYXRmb3JtLmRlc2NyaXB0aW9uYCBpZiBhdmFpbGFibGUsIGVsc2UgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nUGxhdGZvcm0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBDb252ZXJ0IGxheW91dCB0byBhbiBhcnJheSBzbyB3ZSBjYW4gYWRkIGV4dHJhIGRldGFpbHMuXG4gICAgbGF5b3V0ICYmIChsYXlvdXQgPSBbbGF5b3V0XSk7XG5cbiAgICAvLyBEZXRlY3QgcHJvZHVjdCBuYW1lcyB0aGF0IGNvbnRhaW4gdGhlaXIgbWFudWZhY3R1cmVyJ3MgbmFtZS5cbiAgICBpZiAobWFudWZhY3R1cmVyICYmICFwcm9kdWN0KSB7XG4gICAgICBwcm9kdWN0ID0gZ2V0UHJvZHVjdChbbWFudWZhY3R1cmVyXSk7XG4gICAgfVxuICAgIC8vIENsZWFuIHVwIEdvb2dsZSBUVi5cbiAgICBpZiAoKGRhdGEgPSAvXFxiR29vZ2xlIFRWXFxiLy5leGVjKHByb2R1Y3QpKSkge1xuICAgICAgcHJvZHVjdCA9IGRhdGFbMF07XG4gICAgfVxuICAgIC8vIERldGVjdCBzaW11bGF0b3JzLlxuICAgIGlmICgvXFxiU2ltdWxhdG9yXFxiL2kudGVzdCh1YSkpIHtcbiAgICAgIHByb2R1Y3QgPSAocHJvZHVjdCA/IHByb2R1Y3QgKyAnICcgOiAnJykgKyAnU2ltdWxhdG9yJztcbiAgICB9XG4gICAgLy8gRGV0ZWN0IE9wZXJhIE1pbmkgOCsgcnVubmluZyBpbiBUdXJiby9VbmNvbXByZXNzZWQgbW9kZSBvbiBpT1MuXG4gICAgaWYgKG5hbWUgPT0gJ09wZXJhIE1pbmknICYmIC9cXGJPUGlPU1xcYi8udGVzdCh1YSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ3J1bm5pbmcgaW4gVHVyYm8vVW5jb21wcmVzc2VkIG1vZGUnKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IElFIE1vYmlsZSAxMS5cbiAgICBpZiAobmFtZSA9PSAnSUUnICYmIC9cXGJsaWtlIGlQaG9uZSBPU1xcYi8udGVzdCh1YSkpIHtcbiAgICAgIGRhdGEgPSBwYXJzZSh1YS5yZXBsYWNlKC9saWtlIGlQaG9uZSBPUy8sICcnKSk7XG4gICAgICBtYW51ZmFjdHVyZXIgPSBkYXRhLm1hbnVmYWN0dXJlcjtcbiAgICAgIHByb2R1Y3QgPSBkYXRhLnByb2R1Y3Q7XG4gICAgfVxuICAgIC8vIERldGVjdCBpT1MuXG4gICAgZWxzZSBpZiAoL15pUC8udGVzdChwcm9kdWN0KSkge1xuICAgICAgbmFtZSB8fCAobmFtZSA9ICdTYWZhcmknKTtcbiAgICAgIG9zID0gJ2lPUycgKyAoKGRhdGEgPSAvIE9TIChbXFxkX10rKS9pLmV4ZWModWEpKVxuICAgICAgICA/ICcgJyArIGRhdGFbMV0ucmVwbGFjZSgvXy9nLCAnLicpXG4gICAgICAgIDogJycpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgS3VidW50dS5cbiAgICBlbHNlIGlmIChuYW1lID09ICdLb25xdWVyb3InICYmICEvYnVudHUvaS50ZXN0KG9zKSkge1xuICAgICAgb3MgPSAnS3VidW50dSc7XG4gICAgfVxuICAgIC8vIERldGVjdCBBbmRyb2lkIGJyb3dzZXJzLlxuICAgIGVsc2UgaWYgKChtYW51ZmFjdHVyZXIgJiYgbWFudWZhY3R1cmVyICE9ICdHb29nbGUnICYmXG4gICAgICAgICgoL0Nocm9tZS8udGVzdChuYW1lKSAmJiAhL1xcYk1vYmlsZSBTYWZhcmlcXGIvaS50ZXN0KHVhKSkgfHwgL1xcYlZpdGFcXGIvLnRlc3QocHJvZHVjdCkpKSB8fFxuICAgICAgICAoL1xcYkFuZHJvaWRcXGIvLnRlc3Qob3MpICYmIC9eQ2hyb21lLy50ZXN0KG5hbWUpICYmIC9cXGJWZXJzaW9uXFwvL2kudGVzdCh1YSkpKSB7XG4gICAgICBuYW1lID0gJ0FuZHJvaWQgQnJvd3Nlcic7XG4gICAgICBvcyA9IC9cXGJBbmRyb2lkXFxiLy50ZXN0KG9zKSA/IG9zIDogJ0FuZHJvaWQnO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgU2lsayBkZXNrdG9wL2FjY2VsZXJhdGVkIG1vZGVzLlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ1NpbGsnKSB7XG4gICAgICBpZiAoIS9cXGJNb2JpL2kudGVzdCh1YSkpIHtcbiAgICAgICAgb3MgPSAnQW5kcm9pZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2Rlc2t0b3AgbW9kZScpO1xuICAgICAgfVxuICAgICAgaWYgKC9BY2NlbGVyYXRlZCAqPSAqdHJ1ZS9pLnRlc3QodWEpKSB7XG4gICAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2FjY2VsZXJhdGVkJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERldGVjdCBQYWxlTW9vbiBpZGVudGlmeWluZyBhcyBGaXJlZm94LlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ1BhbGVNb29uJyAmJiAoZGF0YSA9IC9cXGJGaXJlZm94XFwvKFtcXGQuXSspXFxiLy5leGVjKHVhKSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ2lkZW50aWZ5aW5nIGFzIEZpcmVmb3ggJyArIGRhdGFbMV0pO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgRmlyZWZveCBPUyBhbmQgcHJvZHVjdHMgcnVubmluZyBGaXJlZm94LlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ0ZpcmVmb3gnICYmIChkYXRhID0gL1xcYihNb2JpbGV8VGFibGV0fFRWKVxcYi9pLmV4ZWModWEpKSkge1xuICAgICAgb3MgfHwgKG9zID0gJ0ZpcmVmb3ggT1MnKTtcbiAgICAgIHByb2R1Y3QgfHwgKHByb2R1Y3QgPSBkYXRhWzFdKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IGZhbHNlIHBvc2l0aXZlcyBmb3IgRmlyZWZveC9TYWZhcmkuXG4gICAgZWxzZSBpZiAoIW5hbWUgfHwgKGRhdGEgPSAhL1xcYk1pbmVmaWVsZFxcYi9pLnRlc3QodWEpICYmIC9cXGIoPzpGaXJlZm94fFNhZmFyaSlcXGIvLmV4ZWMobmFtZSkpKSB7XG4gICAgICAvLyBFc2NhcGUgdGhlIGAvYCBmb3IgRmlyZWZveCAxLlxuICAgICAgaWYgKG5hbWUgJiYgIXByb2R1Y3QgJiYgL1tcXC8sXXxeW14oXSs/XFwpLy50ZXN0KHVhLnNsaWNlKHVhLmluZGV4T2YoZGF0YSArICcvJykgKyA4KSkpIHtcbiAgICAgICAgLy8gQ2xlYXIgbmFtZSBvZiBmYWxzZSBwb3NpdGl2ZXMuXG4gICAgICAgIG5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gUmVhc3NpZ24gYSBnZW5lcmljIG5hbWUuXG4gICAgICBpZiAoKGRhdGEgPSBwcm9kdWN0IHx8IG1hbnVmYWN0dXJlciB8fCBvcykgJiZcbiAgICAgICAgICAocHJvZHVjdCB8fCBtYW51ZmFjdHVyZXIgfHwgL1xcYig/OkFuZHJvaWR8U3ltYmlhbiBPU3xUYWJsZXQgT1N8d2ViT1MpXFxiLy50ZXN0KG9zKSkpIHtcbiAgICAgICAgbmFtZSA9IC9bYS16XSsoPzogSGF0KT8vaS5leGVjKC9cXGJBbmRyb2lkXFxiLy50ZXN0KG9zKSA/IG9zIDogZGF0YSkgKyAnIEJyb3dzZXInO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgQ2hyb21lIHZlcnNpb24gdG8gZGVzY3JpcHRpb24gZm9yIEVsZWN0cm9uLlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ0VsZWN0cm9uJyAmJiAoZGF0YSA9ICgvXFxiQ2hyb21lXFwvKFtcXGQuXSspXFxiLy5leGVjKHVhKSB8fCAwKVsxXSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ0Nocm9taXVtICcgKyBkYXRhKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IG5vbi1PcGVyYSAoUHJlc3RvLWJhc2VkKSB2ZXJzaW9ucyAob3JkZXIgaXMgaW1wb3J0YW50KS5cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSBnZXRWZXJzaW9uKFtcbiAgICAgICAgJyg/OkNsb3VkOXxDcmlPU3xDck1vfEVkZ2V8RnhpT1N8SUVNb2JpbGV8SXJvbnxPcGVyYSA/TWluaXxPUGlPU3xPUFJ8UmF2ZW58U2Ftc3VuZ0Jyb3dzZXJ8U2lsayg/IS9bXFxcXGQuXSskKSknLFxuICAgICAgICAnVmVyc2lvbicsXG4gICAgICAgIHF1YWxpZnkobmFtZSksXG4gICAgICAgICcoPzpGaXJlZm94fE1pbmVmaWVsZHxOZXRGcm9udCknXG4gICAgICBdKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IHN0dWJib3JuIGxheW91dCBlbmdpbmVzLlxuICAgIGlmICgoZGF0YSA9XG4gICAgICAgICAgbGF5b3V0ID09ICdpQ2FiJyAmJiBwYXJzZUZsb2F0KHZlcnNpb24pID4gMyAmJiAnV2ViS2l0JyB8fFxuICAgICAgICAgIC9cXGJPcGVyYVxcYi8udGVzdChuYW1lKSAmJiAoL1xcYk9QUlxcYi8udGVzdCh1YSkgPyAnQmxpbmsnIDogJ1ByZXN0bycpIHx8XG4gICAgICAgICAgL1xcYig/Ok1pZG9yaXxOb29rfFNhZmFyaSlcXGIvaS50ZXN0KHVhKSAmJiAhL14oPzpUcmlkZW50fEVkZ2VIVE1MKSQvLnRlc3QobGF5b3V0KSAmJiAnV2ViS2l0JyB8fFxuICAgICAgICAgICFsYXlvdXQgJiYgL1xcYk1TSUVcXGIvaS50ZXN0KHVhKSAmJiAob3MgPT0gJ01hYyBPUycgPyAnVGFzbWFuJyA6ICdUcmlkZW50JykgfHxcbiAgICAgICAgICBsYXlvdXQgPT0gJ1dlYktpdCcgJiYgL1xcYlBsYXlTdGF0aW9uXFxiKD8hIFZpdGFcXGIpL2kudGVzdChuYW1lKSAmJiAnTmV0RnJvbnQnXG4gICAgICAgICkpIHtcbiAgICAgIGxheW91dCA9IFtkYXRhXTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFdpbmRvd3MgUGhvbmUgNyBkZXNrdG9wIG1vZGUuXG4gICAgaWYgKG5hbWUgPT0gJ0lFJyAmJiAoZGF0YSA9ICgvOyAqKD86WEJMV1B8WnVuZVdQKShcXGQrKS9pLmV4ZWModWEpIHx8IDApWzFdKSkge1xuICAgICAgbmFtZSArPSAnIE1vYmlsZSc7XG4gICAgICBvcyA9ICdXaW5kb3dzIFBob25lICcgKyAoL1xcKyQvLnRlc3QoZGF0YSkgPyBkYXRhIDogZGF0YSArICcueCcpO1xuICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnZGVza3RvcCBtb2RlJyk7XG4gICAgfVxuICAgIC8vIERldGVjdCBXaW5kb3dzIFBob25lIDgueCBkZXNrdG9wIG1vZGUuXG4gICAgZWxzZSBpZiAoL1xcYldQRGVza3RvcFxcYi9pLnRlc3QodWEpKSB7XG4gICAgICBuYW1lID0gJ0lFIE1vYmlsZSc7XG4gICAgICBvcyA9ICdXaW5kb3dzIFBob25lIDgueCc7XG4gICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCdkZXNrdG9wIG1vZGUnKTtcbiAgICAgIHZlcnNpb24gfHwgKHZlcnNpb24gPSAoL1xcYnJ2OihbXFxkLl0rKS8uZXhlYyh1YSkgfHwgMClbMV0pO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgSUUgMTEgaWRlbnRpZnlpbmcgYXMgb3RoZXIgYnJvd3NlcnMuXG4gICAgZWxzZSBpZiAobmFtZSAhPSAnSUUnICYmIGxheW91dCA9PSAnVHJpZGVudCcgJiYgKGRhdGEgPSAvXFxicnY6KFtcXGQuXSspLy5leGVjKHVhKSkpIHtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ2lkZW50aWZ5aW5nIGFzICcgKyBuYW1lICsgKHZlcnNpb24gPyAnICcgKyB2ZXJzaW9uIDogJycpKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSAnSUUnO1xuICAgICAgdmVyc2lvbiA9IGRhdGFbMV07XG4gICAgfVxuICAgIC8vIExldmVyYWdlIGVudmlyb25tZW50IGZlYXR1cmVzLlxuICAgIGlmICh1c2VGZWF0dXJlcykge1xuICAgICAgLy8gRGV0ZWN0IHNlcnZlci1zaWRlIGVudmlyb25tZW50cy5cbiAgICAgIC8vIFJoaW5vIGhhcyBhIGdsb2JhbCBmdW5jdGlvbiB3aGlsZSBvdGhlcnMgaGF2ZSBhIGdsb2JhbCBvYmplY3QuXG4gICAgICBpZiAoaXNIb3N0VHlwZShjb250ZXh0LCAnZ2xvYmFsJykpIHtcbiAgICAgICAgaWYgKGphdmEpIHtcbiAgICAgICAgICBkYXRhID0gamF2YS5sYW5nLlN5c3RlbTtcbiAgICAgICAgICBhcmNoID0gZGF0YS5nZXRQcm9wZXJ0eSgnb3MuYXJjaCcpO1xuICAgICAgICAgIG9zID0gb3MgfHwgZGF0YS5nZXRQcm9wZXJ0eSgnb3MubmFtZScpICsgJyAnICsgZGF0YS5nZXRQcm9wZXJ0eSgnb3MudmVyc2lvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaGlubykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gY29udGV4dC5yZXF1aXJlKCdyaW5nby9lbmdpbmUnKS52ZXJzaW9uLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIG5hbWUgPSAnUmluZ29KUyc7XG4gICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBpZiAoKGRhdGEgPSBjb250ZXh0LnN5c3RlbSkgJiYgZGF0YS5nbG9iYWwuc3lzdGVtID09IGNvbnRleHQuc3lzdGVtKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSAnTmFyd2hhbCc7XG4gICAgICAgICAgICAgIG9zIHx8IChvcyA9IGRhdGFbMF0ub3MgfHwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgbmFtZSA9ICdSaGlubyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiBjb250ZXh0LnByb2Nlc3MgPT0gJ29iamVjdCcgJiYgIWNvbnRleHQucHJvY2Vzcy5icm93c2VyICYmXG4gICAgICAgICAgKGRhdGEgPSBjb250ZXh0LnByb2Nlc3MpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS52ZXJzaW9ucyA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnZlcnNpb25zLmVsZWN0cm9uID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ05vZGUgJyArIGRhdGEudmVyc2lvbnMubm9kZSk7XG4gICAgICAgICAgICAgIG5hbWUgPSAnRWxlY3Ryb24nO1xuICAgICAgICAgICAgICB2ZXJzaW9uID0gZGF0YS52ZXJzaW9ucy5lbGVjdHJvbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEudmVyc2lvbnMubncgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucHVzaCgnQ2hyb21pdW0gJyArIHZlcnNpb24sICdOb2RlICcgKyBkYXRhLnZlcnNpb25zLm5vZGUpO1xuICAgICAgICAgICAgICBuYW1lID0gJ05XLmpzJztcbiAgICAgICAgICAgICAgdmVyc2lvbiA9IGRhdGEudmVyc2lvbnMubnc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgbmFtZSA9ICdOb2RlLmpzJztcbiAgICAgICAgICAgIGFyY2ggPSBkYXRhLmFyY2g7XG4gICAgICAgICAgICBvcyA9IGRhdGEucGxhdGZvcm07XG4gICAgICAgICAgICB2ZXJzaW9uID0gL1tcXGQuXSsvLmV4ZWMoZGF0YS52ZXJzaW9uKTtcbiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uID8gdmVyc2lvblswXSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgQWRvYmUgQUlSLlxuICAgICAgZWxzZSBpZiAoZ2V0Q2xhc3NPZigoZGF0YSA9IGNvbnRleHQucnVudGltZSkpID09IGFpclJ1bnRpbWVDbGFzcykge1xuICAgICAgICBuYW1lID0gJ0Fkb2JlIEFJUic7XG4gICAgICAgIG9zID0gZGF0YS5mbGFzaC5zeXN0ZW0uQ2FwYWJpbGl0aWVzLm9zO1xuICAgICAgfVxuICAgICAgLy8gRGV0ZWN0IFBoYW50b21KUy5cbiAgICAgIGVsc2UgaWYgKGdldENsYXNzT2YoKGRhdGEgPSBjb250ZXh0LnBoYW50b20pKSA9PSBwaGFudG9tQ2xhc3MpIHtcbiAgICAgICAgbmFtZSA9ICdQaGFudG9tSlMnO1xuICAgICAgICB2ZXJzaW9uID0gKGRhdGEgPSBkYXRhLnZlcnNpb24gfHwgbnVsbCkgJiYgKGRhdGEubWFqb3IgKyAnLicgKyBkYXRhLm1pbm9yICsgJy4nICsgZGF0YS5wYXRjaCk7XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgSUUgY29tcGF0aWJpbGl0eSBtb2Rlcy5cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2MuZG9jdW1lbnRNb2RlID09ICdudW1iZXInICYmIChkYXRhID0gL1xcYlRyaWRlbnRcXC8oXFxkKykvaS5leGVjKHVhKSkpIHtcbiAgICAgICAgLy8gV2UncmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlIHdoZW4gdGhlIFRyaWRlbnQgdmVyc2lvbiArIDQgZG9lc24ndFxuICAgICAgICAvLyBlcXVhbCB0aGUgZG9jdW1lbnQgbW9kZS5cbiAgICAgICAgdmVyc2lvbiA9IFt2ZXJzaW9uLCBkb2MuZG9jdW1lbnRNb2RlXTtcbiAgICAgICAgaWYgKChkYXRhID0gK2RhdGFbMV0gKyA0KSAhPSB2ZXJzaW9uWzFdKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb24ucHVzaCgnSUUgJyArIHZlcnNpb25bMV0gKyAnIG1vZGUnKTtcbiAgICAgICAgICBsYXlvdXQgJiYgKGxheW91dFsxXSA9ICcnKTtcbiAgICAgICAgICB2ZXJzaW9uWzFdID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uID0gbmFtZSA9PSAnSUUnID8gU3RyaW5nKHZlcnNpb25bMV0udG9GaXhlZCgxKSkgOiB2ZXJzaW9uWzBdO1xuICAgICAgfVxuICAgICAgLy8gRGV0ZWN0IElFIDExIG1hc2tpbmcgYXMgb3RoZXIgYnJvd3NlcnMuXG4gICAgICBlbHNlIGlmICh0eXBlb2YgZG9jLmRvY3VtZW50TW9kZSA9PSAnbnVtYmVyJyAmJiAvXig/OkNocm9tZXxGaXJlZm94KVxcYi8udGVzdChuYW1lKSkge1xuICAgICAgICBkZXNjcmlwdGlvbi5wdXNoKCdtYXNraW5nIGFzICcgKyBuYW1lICsgJyAnICsgdmVyc2lvbik7XG4gICAgICAgIG5hbWUgPSAnSUUnO1xuICAgICAgICB2ZXJzaW9uID0gJzExLjAnO1xuICAgICAgICBsYXlvdXQgPSBbJ1RyaWRlbnQnXTtcbiAgICAgICAgb3MgPSAnV2luZG93cyc7XG4gICAgICB9XG4gICAgICBvcyA9IG9zICYmIGZvcm1hdChvcyk7XG4gICAgfVxuICAgIC8vIERldGVjdCBwcmVyZWxlYXNlIHBoYXNlcy5cbiAgICBpZiAodmVyc2lvbiAmJiAoZGF0YSA9XG4gICAgICAgICAgLyg/OlthYl18ZHB8cHJlfFthYl1cXGQrcHJlKSg/OlxcZCtcXCs/KT8kL2kuZXhlYyh2ZXJzaW9uKSB8fFxuICAgICAgICAgIC8oPzphbHBoYXxiZXRhKSg/OiA/XFxkKT8vaS5leGVjKHVhICsgJzsnICsgKHVzZUZlYXR1cmVzICYmIG5hdi5hcHBNaW5vclZlcnNpb24pKSB8fFxuICAgICAgICAgIC9cXGJNaW5lZmllbGRcXGIvaS50ZXN0KHVhKSAmJiAnYSdcbiAgICAgICAgKSkge1xuICAgICAgcHJlcmVsZWFzZSA9IC9iL2kudGVzdChkYXRhKSA/ICdiZXRhJyA6ICdhbHBoYSc7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKFJlZ0V4cChkYXRhICsgJ1xcXFwrPyQnKSwgJycpICtcbiAgICAgICAgKHByZXJlbGVhc2UgPT0gJ2JldGEnID8gYmV0YSA6IGFscGhhKSArICgvXFxkK1xcKz8vLmV4ZWMoZGF0YSkgfHwgJycpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgRmlyZWZveCBNb2JpbGUuXG4gICAgaWYgKG5hbWUgPT0gJ0Zlbm5lYycgfHwgbmFtZSA9PSAnRmlyZWZveCcgJiYgL1xcYig/OkFuZHJvaWR8RmlyZWZveCBPUylcXGIvLnRlc3Qob3MpKSB7XG4gICAgICBuYW1lID0gJ0ZpcmVmb3ggTW9iaWxlJztcbiAgICB9XG4gICAgLy8gT2JzY3VyZSBNYXh0aG9uJ3MgdW5yZWxpYWJsZSB2ZXJzaW9uLlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ01heHRob24nICYmIHZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoL1xcLltcXGQuXSsvLCAnLngnKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFhib3ggMzYwIGFuZCBYYm94IE9uZS5cbiAgICBlbHNlIGlmICgvXFxiWGJveFxcYi9pLnRlc3QocHJvZHVjdCkpIHtcbiAgICAgIGlmIChwcm9kdWN0ID09ICdYYm94IDM2MCcpIHtcbiAgICAgICAgb3MgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHByb2R1Y3QgPT0gJ1hib3ggMzYwJyAmJiAvXFxiSUVNb2JpbGVcXGIvLnRlc3QodWEpKSB7XG4gICAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ21vYmlsZSBtb2RlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBtb2JpbGUgcG9zdGZpeC5cbiAgICBlbHNlIGlmICgoL14oPzpDaHJvbWV8SUV8T3BlcmEpJC8udGVzdChuYW1lKSB8fCBuYW1lICYmICFwcm9kdWN0ICYmICEvQnJvd3NlcnxNb2JpLy50ZXN0KG5hbWUpKSAmJlxuICAgICAgICAob3MgPT0gJ1dpbmRvd3MgQ0UnIHx8IC9Nb2JpL2kudGVzdCh1YSkpKSB7XG4gICAgICBuYW1lICs9ICcgTW9iaWxlJztcbiAgICB9XG4gICAgLy8gRGV0ZWN0IElFIHBsYXRmb3JtIHByZXZpZXcuXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnSUUnICYmIHVzZUZlYXR1cmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY29udGV4dC5leHRlcm5hbCA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ3BsYXRmb3JtIHByZXZpZXcnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2VtYmVkZGVkJyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERldGVjdCBCbGFja0JlcnJ5IE9TIHZlcnNpb24uXG4gICAgLy8gaHR0cDovL2RvY3MuYmxhY2tiZXJyeS5jb20vZW4vZGV2ZWxvcGVycy9kZWxpdmVyYWJsZXMvMTgxNjkvSFRUUF9oZWFkZXJzX3NlbnRfYnlfQkJfQnJvd3Nlcl8xMjM0OTExXzExLmpzcFxuICAgIGVsc2UgaWYgKCgvXFxiQmxhY2tCZXJyeVxcYi8udGVzdChwcm9kdWN0KSB8fCAvXFxiQkIxMFxcYi8udGVzdCh1YSkpICYmIChkYXRhID1cbiAgICAgICAgICAoUmVnRXhwKHByb2R1Y3QucmVwbGFjZSgvICsvZywgJyAqJykgKyAnLyhbLlxcXFxkXSspJywgJ2knKS5leGVjKHVhKSB8fCAwKVsxXSB8fFxuICAgICAgICAgIHZlcnNpb25cbiAgICAgICAgKSkge1xuICAgICAgZGF0YSA9IFtkYXRhLCAvQkIxMC8udGVzdCh1YSldO1xuICAgICAgb3MgPSAoZGF0YVsxXSA/IChwcm9kdWN0ID0gbnVsbCwgbWFudWZhY3R1cmVyID0gJ0JsYWNrQmVycnknKSA6ICdEZXZpY2UgU29mdHdhcmUnKSArICcgJyArIGRhdGFbMF07XG4gICAgICB2ZXJzaW9uID0gbnVsbDtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IE9wZXJhIGlkZW50aWZ5aW5nL21hc2tpbmcgaXRzZWxmIGFzIGFub3RoZXIgYnJvd3Nlci5cbiAgICAvLyBodHRwOi8vd3d3Lm9wZXJhLmNvbS9zdXBwb3J0L2tiL3ZpZXcvODQzL1xuICAgIGVsc2UgaWYgKHRoaXMgIT0gZm9yT3duICYmIHByb2R1Y3QgIT0gJ1dpaScgJiYgKFxuICAgICAgICAgICh1c2VGZWF0dXJlcyAmJiBvcGVyYSkgfHxcbiAgICAgICAgICAoL09wZXJhLy50ZXN0KG5hbWUpICYmIC9cXGIoPzpNU0lFfEZpcmVmb3gpXFxiL2kudGVzdCh1YSkpIHx8XG4gICAgICAgICAgKG5hbWUgPT0gJ0ZpcmVmb3gnICYmIC9cXGJPUyBYICg/OlxcZCtcXC4pezIsfS8udGVzdChvcykpIHx8XG4gICAgICAgICAgKG5hbWUgPT0gJ0lFJyAmJiAoXG4gICAgICAgICAgICAob3MgJiYgIS9eV2luLy50ZXN0KG9zKSAmJiB2ZXJzaW9uID4gNS41KSB8fFxuICAgICAgICAgICAgL1xcYldpbmRvd3MgWFBcXGIvLnRlc3Qob3MpICYmIHZlcnNpb24gPiA4IHx8XG4gICAgICAgICAgICB2ZXJzaW9uID09IDggJiYgIS9cXGJUcmlkZW50XFxiLy50ZXN0KHVhKVxuICAgICAgICAgICkpXG4gICAgICAgICkgJiYgIXJlT3BlcmEudGVzdCgoZGF0YSA9IHBhcnNlLmNhbGwoZm9yT3duLCB1YS5yZXBsYWNlKHJlT3BlcmEsICcnKSArICc7JykpKSAmJiBkYXRhLm5hbWUpIHtcbiAgICAgIC8vIFdoZW4gXCJpZGVudGlmeWluZ1wiLCB0aGUgVUEgY29udGFpbnMgYm90aCBPcGVyYSBhbmQgdGhlIG90aGVyIGJyb3dzZXIncyBuYW1lLlxuICAgICAgZGF0YSA9ICdpbmcgYXMgJyArIGRhdGEubmFtZSArICgoZGF0YSA9IGRhdGEudmVyc2lvbikgPyAnICcgKyBkYXRhIDogJycpO1xuICAgICAgaWYgKHJlT3BlcmEudGVzdChuYW1lKSkge1xuICAgICAgICBpZiAoL1xcYklFXFxiLy50ZXN0KGRhdGEpICYmIG9zID09ICdNYWMgT1MnKSB7XG4gICAgICAgICAgb3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSAnaWRlbnRpZnknICsgZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gXCJtYXNraW5nXCIsIHRoZSBVQSBjb250YWlucyBvbmx5IHRoZSBvdGhlciBicm93c2VyJ3MgbmFtZS5cbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gJ21hc2snICsgZGF0YTtcbiAgICAgICAgaWYgKG9wZXJhQ2xhc3MpIHtcbiAgICAgICAgICBuYW1lID0gZm9ybWF0KG9wZXJhQ2xhc3MucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxICQyJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hbWUgPSAnT3BlcmEnO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvXFxiSUVcXGIvLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBvcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1c2VGZWF0dXJlcykge1xuICAgICAgICAgIHZlcnNpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXlvdXQgPSBbJ1ByZXN0byddO1xuICAgICAgZGVzY3JpcHRpb24ucHVzaChkYXRhKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFdlYktpdCBOaWdodGx5IGFuZCBhcHByb3hpbWF0ZSBDaHJvbWUvU2FmYXJpIHZlcnNpb25zLlxuICAgIGlmICgoZGF0YSA9ICgvXFxiQXBwbGVXZWJLaXRcXC8oW1xcZC5dK1xcKz8pL2kuZXhlYyh1YSkgfHwgMClbMV0pKSB7XG4gICAgICAvLyBDb3JyZWN0IGJ1aWxkIG51bWJlciBmb3IgbnVtZXJpYyBjb21wYXJpc29uLlxuICAgICAgLy8gKGUuZy4gXCI1MzIuNVwiIGJlY29tZXMgXCI1MzIuMDVcIilcbiAgICAgIGRhdGEgPSBbcGFyc2VGbG9hdChkYXRhLnJlcGxhY2UoL1xcLihcXGQpJC8sICcuMCQxJykpLCBkYXRhXTtcbiAgICAgIC8vIE5pZ2h0bHkgYnVpbGRzIGFyZSBwb3N0Zml4ZWQgd2l0aCBhIFwiK1wiLlxuICAgICAgaWYgKG5hbWUgPT0gJ1NhZmFyaScgJiYgZGF0YVsxXS5zbGljZSgtMSkgPT0gJysnKSB7XG4gICAgICAgIG5hbWUgPSAnV2ViS2l0IE5pZ2h0bHknO1xuICAgICAgICBwcmVyZWxlYXNlID0gJ2FscGhhJztcbiAgICAgICAgdmVyc2lvbiA9IGRhdGFbMV0uc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYXIgaW5jb3JyZWN0IGJyb3dzZXIgdmVyc2lvbnMuXG4gICAgICBlbHNlIGlmICh2ZXJzaW9uID09IGRhdGFbMV0gfHxcbiAgICAgICAgICB2ZXJzaW9uID09IChkYXRhWzJdID0gKC9cXGJTYWZhcmlcXC8oW1xcZC5dK1xcKz8pL2kuZXhlYyh1YSkgfHwgMClbMV0pKSB7XG4gICAgICAgIHZlcnNpb24gPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHRoZSBmdWxsIENocm9tZSB2ZXJzaW9uIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgZGF0YVsxXSA9ICgvXFxiQ2hyb21lXFwvKFtcXGQuXSspL2kuZXhlYyh1YSkgfHwgMClbMV07XG4gICAgICAvLyBEZXRlY3QgQmxpbmsgbGF5b3V0IGVuZ2luZS5cbiAgICAgIGlmIChkYXRhWzBdID09IDUzNy4zNiAmJiBkYXRhWzJdID09IDUzNy4zNiAmJiBwYXJzZUZsb2F0KGRhdGFbMV0pID49IDI4ICYmIGxheW91dCA9PSAnV2ViS2l0Jykge1xuICAgICAgICBsYXlvdXQgPSBbJ0JsaW5rJ107XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgSmF2YVNjcmlwdENvcmUuXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY3Njg0NzQvaG93LWNhbi1pLWRldGVjdC13aGljaC1qYXZhc2NyaXB0LWVuZ2luZS12OC1vci1qc2MtaXMtdXNlZC1hdC1ydW50aW1lLWluLWFuZHJvaVxuICAgICAgaWYgKCF1c2VGZWF0dXJlcyB8fCAoIWxpa2VDaHJvbWUgJiYgIWRhdGFbMV0pKSB7XG4gICAgICAgIGxheW91dCAmJiAobGF5b3V0WzFdID0gJ2xpa2UgU2FmYXJpJyk7XG4gICAgICAgIGRhdGEgPSAoZGF0YSA9IGRhdGFbMF0sIGRhdGEgPCA0MDAgPyAxIDogZGF0YSA8IDUwMCA/IDIgOiBkYXRhIDwgNTI2ID8gMyA6IGRhdGEgPCA1MzMgPyA0IDogZGF0YSA8IDUzNCA/ICc0KycgOiBkYXRhIDwgNTM1ID8gNSA6IGRhdGEgPCA1MzcgPyA2IDogZGF0YSA8IDUzOCA/IDcgOiBkYXRhIDwgNjAxID8gOCA6ICc4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQgJiYgKGxheW91dFsxXSA9ICdsaWtlIENocm9tZScpO1xuICAgICAgICBkYXRhID0gZGF0YVsxXSB8fCAoZGF0YSA9IGRhdGFbMF0sIGRhdGEgPCA1MzAgPyAxIDogZGF0YSA8IDUzMiA/IDIgOiBkYXRhIDwgNTMyLjA1ID8gMyA6IGRhdGEgPCA1MzMgPyA0IDogZGF0YSA8IDUzNC4wMyA/IDUgOiBkYXRhIDwgNTM0LjA3ID8gNiA6IGRhdGEgPCA1MzQuMTAgPyA3IDogZGF0YSA8IDUzNC4xMyA/IDggOiBkYXRhIDwgNTM0LjE2ID8gOSA6IGRhdGEgPCA1MzQuMjQgPyAxMCA6IGRhdGEgPCA1MzQuMzAgPyAxMSA6IGRhdGEgPCA1MzUuMDEgPyAxMiA6IGRhdGEgPCA1MzUuMDIgPyAnMTMrJyA6IGRhdGEgPCA1MzUuMDcgPyAxNSA6IGRhdGEgPCA1MzUuMTEgPyAxNiA6IGRhdGEgPCA1MzUuMTkgPyAxNyA6IGRhdGEgPCA1MzYuMDUgPyAxOCA6IGRhdGEgPCA1MzYuMTAgPyAxOSA6IGRhdGEgPCA1MzcuMDEgPyAyMCA6IGRhdGEgPCA1MzcuMTEgPyAnMjErJyA6IGRhdGEgPCA1MzcuMTMgPyAyMyA6IGRhdGEgPCA1MzcuMTggPyAyNCA6IGRhdGEgPCA1MzcuMjQgPyAyNSA6IGRhdGEgPCA1MzcuMzYgPyAyNiA6IGxheW91dCAhPSAnQmxpbmsnID8gJzI3JyA6ICcyOCcpO1xuICAgICAgfVxuICAgICAgLy8gQWRkIHRoZSBwb3N0Zml4IG9mIFwiLnhcIiBvciBcIitcIiBmb3IgYXBwcm94aW1hdGUgdmVyc2lvbnMuXG4gICAgICBsYXlvdXQgJiYgKGxheW91dFsxXSArPSAnICcgKyAoZGF0YSArPSB0eXBlb2YgZGF0YSA9PSAnbnVtYmVyJyA/ICcueCcgOiAvWy4rXS8udGVzdChkYXRhKSA/ICcnIDogJysnKSk7XG4gICAgICAvLyBPYnNjdXJlIHZlcnNpb24gZm9yIHNvbWUgU2FmYXJpIDEtMiByZWxlYXNlcy5cbiAgICAgIGlmIChuYW1lID09ICdTYWZhcmknICYmICghdmVyc2lvbiB8fCBwYXJzZUludCh2ZXJzaW9uKSA+IDQ1KSkge1xuICAgICAgICB2ZXJzaW9uID0gZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGV0ZWN0IE9wZXJhIGRlc2t0b3AgbW9kZXMuXG4gICAgaWYgKG5hbWUgPT0gJ09wZXJhJyAmJiAgKGRhdGEgPSAvXFxiemJvdnx6dmF2JC8uZXhlYyhvcykpKSB7XG4gICAgICBuYW1lICs9ICcgJztcbiAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2Rlc2t0b3AgbW9kZScpO1xuICAgICAgaWYgKGRhdGEgPT0gJ3p2YXYnKSB7XG4gICAgICAgIG5hbWUgKz0gJ01pbmknO1xuICAgICAgICB2ZXJzaW9uID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWUgKz0gJ01vYmlsZSc7XG4gICAgICB9XG4gICAgICBvcyA9IG9zLnJlcGxhY2UoUmVnRXhwKCcgKicgKyBkYXRhICsgJyQnKSwgJycpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgQ2hyb21lIGRlc2t0b3AgbW9kZS5cbiAgICBlbHNlIGlmIChuYW1lID09ICdTYWZhcmknICYmIC9cXGJDaHJvbWVcXGIvLmV4ZWMobGF5b3V0ICYmIGxheW91dFsxXSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2Rlc2t0b3AgbW9kZScpO1xuICAgICAgbmFtZSA9ICdDaHJvbWUgTW9iaWxlJztcbiAgICAgIHZlcnNpb24gPSBudWxsO1xuXG4gICAgICBpZiAoL1xcYk9TIFhcXGIvLnRlc3Qob3MpKSB7XG4gICAgICAgIG1hbnVmYWN0dXJlciA9ICdBcHBsZSc7XG4gICAgICAgIG9zID0gJ2lPUyA0LjMrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9zID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3RyaXAgaW5jb3JyZWN0IE9TIHZlcnNpb25zLlxuICAgIGlmICh2ZXJzaW9uICYmIHZlcnNpb24uaW5kZXhPZigoZGF0YSA9IC9bXFxkLl0rJC8uZXhlYyhvcykpKSA9PSAwICYmXG4gICAgICAgIHVhLmluZGV4T2YoJy8nICsgZGF0YSArICctJykgPiAtMSkge1xuICAgICAgb3MgPSB0cmltKG9zLnJlcGxhY2UoZGF0YSwgJycpKTtcbiAgICB9XG4gICAgLy8gQWRkIGxheW91dCBlbmdpbmUuXG4gICAgaWYgKGxheW91dCAmJiAhL1xcYig/OkF2YW50fE5vb2spXFxiLy50ZXN0KG5hbWUpICYmIChcbiAgICAgICAgL0Jyb3dzZXJ8THVuYXNjYXBlfE1heHRob24vLnRlc3QobmFtZSkgfHxcbiAgICAgICAgbmFtZSAhPSAnU2FmYXJpJyAmJiAvXmlPUy8udGVzdChvcykgJiYgL1xcYlNhZmFyaVxcYi8udGVzdChsYXlvdXRbMV0pIHx8XG4gICAgICAgIC9eKD86QWRvYmV8QXJvcmF8QnJlYWNofE1pZG9yaXxPcGVyYXxQaGFudG9tfFJla29ucXxSb2NrfFNhbXN1bmcgSW50ZXJuZXR8U2xlaXBuaXJ8V2ViKS8udGVzdChuYW1lKSAmJiBsYXlvdXRbMV0pKSB7XG4gICAgICAvLyBEb24ndCBhZGQgbGF5b3V0IGRldGFpbHMgdG8gZGVzY3JpcHRpb24gaWYgdGhleSBhcmUgZmFsc2V5LlxuICAgICAgKGRhdGEgPSBsYXlvdXRbbGF5b3V0Lmxlbmd0aCAtIDFdKSAmJiBkZXNjcmlwdGlvbi5wdXNoKGRhdGEpO1xuICAgIH1cbiAgICAvLyBDb21iaW5lIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uXG4gICAgaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCkge1xuICAgICAgZGVzY3JpcHRpb24gPSBbJygnICsgZGVzY3JpcHRpb24uam9pbignOyAnKSArICcpJ107XG4gICAgfVxuICAgIC8vIEFwcGVuZCBtYW51ZmFjdHVyZXIgdG8gZGVzY3JpcHRpb24uXG4gICAgaWYgKG1hbnVmYWN0dXJlciAmJiBwcm9kdWN0ICYmIHByb2R1Y3QuaW5kZXhPZihtYW51ZmFjdHVyZXIpIDwgMCkge1xuICAgICAgZGVzY3JpcHRpb24ucHVzaCgnb24gJyArIG1hbnVmYWN0dXJlcik7XG4gICAgfVxuICAgIC8vIEFwcGVuZCBwcm9kdWN0IHRvIGRlc2NyaXB0aW9uLlxuICAgIGlmIChwcm9kdWN0KSB7XG4gICAgICBkZXNjcmlwdGlvbi5wdXNoKCgvXm9uIC8udGVzdChkZXNjcmlwdGlvbltkZXNjcmlwdGlvbi5sZW5ndGggLSAxXSkgPyAnJyA6ICdvbiAnKSArIHByb2R1Y3QpO1xuICAgIH1cbiAgICAvLyBQYXJzZSB0aGUgT1MgaW50byBhbiBvYmplY3QuXG4gICAgaWYgKG9zKSB7XG4gICAgICBkYXRhID0gLyAoW1xcZC4rXSspJC8uZXhlYyhvcyk7XG4gICAgICBpc1NwZWNpYWxDYXNlZE9TID0gZGF0YSAmJiBvcy5jaGFyQXQob3MubGVuZ3RoIC0gZGF0YVswXS5sZW5ndGggLSAxKSA9PSAnLyc7XG4gICAgICBvcyA9IHtcbiAgICAgICAgJ2FyY2hpdGVjdHVyZSc6IDMyLFxuICAgICAgICAnZmFtaWx5JzogKGRhdGEgJiYgIWlzU3BlY2lhbENhc2VkT1MpID8gb3MucmVwbGFjZShkYXRhWzBdLCAnJykgOiBvcyxcbiAgICAgICAgJ3ZlcnNpb24nOiBkYXRhID8gZGF0YVsxXSA6IG51bGwsXG4gICAgICAgICd0b1N0cmluZyc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpcy52ZXJzaW9uO1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhbWlseSArICgodmVyc2lvbiAmJiAhaXNTcGVjaWFsQ2FzZWRPUykgPyAnICcgKyB2ZXJzaW9uIDogJycpICsgKHRoaXMuYXJjaGl0ZWN0dXJlID09IDY0ID8gJyA2NC1iaXQnIDogJycpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBBZGQgYnJvd3Nlci9PUyBhcmNoaXRlY3R1cmUuXG4gICAgaWYgKChkYXRhID0gL1xcYig/OkFNRHxJQXxXaW58V09XfHg4Nl98eCk2NFxcYi9pLmV4ZWMoYXJjaCkpICYmICEvXFxiaTY4NlxcYi9pLnRlc3QoYXJjaCkpIHtcbiAgICAgIGlmIChvcykge1xuICAgICAgICBvcy5hcmNoaXRlY3R1cmUgPSA2NDtcbiAgICAgICAgb3MuZmFtaWx5ID0gb3MuZmFtaWx5LnJlcGxhY2UoUmVnRXhwKCcgKicgKyBkYXRhKSwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgJiYgKC9cXGJXT1c2NFxcYi9pLnRlc3QodWEpIHx8XG4gICAgICAgICAgKHVzZUZlYXR1cmVzICYmIC9cXHcoPzo4NnwzMikkLy50ZXN0KG5hdi5jcHVDbGFzcyB8fCBuYXYucGxhdGZvcm0pICYmICEvXFxiV2luNjQ7IHg2NFxcYi9pLnRlc3QodWEpKSlcbiAgICAgICkge1xuICAgICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCczMi1iaXQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hyb21lIDM5IGFuZCBhYm92ZSBvbiBPUyBYIGlzIGFsd2F5cyA2NC1iaXQuXG4gICAgZWxzZSBpZiAoXG4gICAgICAgIG9zICYmIC9eT1MgWC8udGVzdChvcy5mYW1pbHkpICYmXG4gICAgICAgIG5hbWUgPT0gJ0Nocm9tZScgJiYgcGFyc2VGbG9hdCh2ZXJzaW9uKSA+PSAzOVxuICAgICkge1xuICAgICAgb3MuYXJjaGl0ZWN0dXJlID0gNjQ7XG4gICAgfVxuXG4gICAgdWEgfHwgKHVhID0gbnVsbCk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxhdGZvcm0gb2JqZWN0LlxuICAgICAqXG4gICAgICogQG5hbWUgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgKi9cbiAgICB2YXIgcGxhdGZvcm0gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF0Zm9ybSBkZXNjcmlwdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICovXG4gICAgcGxhdGZvcm0uZGVzY3JpcHRpb24gPSB1YTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBicm93c2VyJ3MgbGF5b3V0IGVuZ2luZS5cbiAgICAgKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW1vbiBsYXlvdXQgZW5naW5lcyBpbmNsdWRlOlxuICAgICAqIFwiQmxpbmtcIiwgXCJFZGdlSFRNTFwiLCBcIkdlY2tvXCIsIFwiVHJpZGVudFwiIGFuZCBcIldlYktpdFwiXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLmxheW91dCA9IGxheW91dCAmJiBsYXlvdXRbMF07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvZHVjdCdzIG1hbnVmYWN0dXJlci5cbiAgICAgKlxuICAgICAqIFRoZSBsaXN0IG9mIG1hbnVmYWN0dXJlcnMgaW5jbHVkZTpcbiAgICAgKiBcIkFwcGxlXCIsIFwiQXJjaG9zXCIsIFwiQW1hem9uXCIsIFwiQXN1c1wiLCBcIkJhcm5lcyAmIE5vYmxlXCIsIFwiQmxhY2tCZXJyeVwiLFxuICAgICAqIFwiR29vZ2xlXCIsIFwiSFBcIiwgXCJIVENcIiwgXCJMR1wiLCBcIk1pY3Jvc29mdFwiLCBcIk1vdG9yb2xhXCIsIFwiTmludGVuZG9cIixcbiAgICAgKiBcIk5va2lhXCIsIFwiU2Ftc3VuZ1wiIGFuZCBcIlNvbnlcIlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHBsYXRmb3JtXG4gICAgICogQHR5cGUgc3RyaW5nfG51bGxcbiAgICAgKi9cbiAgICBwbGF0Zm9ybS5tYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJvd3Nlci9lbnZpcm9ubWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW1vbiBicm93c2VyIG5hbWVzIGluY2x1ZGU6XG4gICAgICogXCJDaHJvbWVcIiwgXCJFbGVjdHJvblwiLCBcIkZpcmVmb3hcIiwgXCJGaXJlZm94IGZvciBpT1NcIiwgXCJJRVwiLFxuICAgICAqIFwiTWljcm9zb2Z0IEVkZ2VcIiwgXCJQaGFudG9tSlNcIiwgXCJTYWZhcmlcIiwgXCJTZWFNb25rZXlcIiwgXCJTaWxrXCIsXG4gICAgICogXCJPcGVyYSBNaW5pXCIgYW5kIFwiT3BlcmFcIlxuICAgICAqXG4gICAgICogTW9iaWxlIHZlcnNpb25zIG9mIHNvbWUgYnJvd3NlcnMgaGF2ZSBcIk1vYmlsZVwiIGFwcGVuZGVkIHRvIHRoZWlyIG5hbWU6XG4gICAgICogZWcuIFwiQ2hyb21lIE1vYmlsZVwiLCBcIkZpcmVmb3ggTW9iaWxlXCIsIFwiSUUgTW9iaWxlXCIgYW5kIFwiT3BlcmEgTW9iaWxlXCJcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICovXG4gICAgcGxhdGZvcm0ubmFtZSA9IG5hbWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxwaGEvYmV0YSByZWxlYXNlIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICovXG4gICAgcGxhdGZvcm0ucHJlcmVsZWFzZSA9IHByZXJlbGVhc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBob3N0aW5nIHRoZSBicm93c2VyLlxuICAgICAqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbW9uIHByb2R1Y3RzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiBcIkJsYWNrQmVycnlcIiwgXCJHYWxheHkgUzRcIiwgXCJMdW1pYVwiLCBcImlQYWRcIiwgXCJpUG9kXCIsIFwiaVBob25lXCIsIFwiS2luZGxlXCIsXG4gICAgICogXCJLaW5kbGUgRmlyZVwiLCBcIk5leHVzXCIsIFwiTm9va1wiLCBcIlBsYXlCb29rXCIsIFwiVG91Y2hQYWRcIiBhbmQgXCJUcmFuc2Zvcm1lclwiXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLnByb2R1Y3QgPSBwcm9kdWN0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJyb3dzZXIncyB1c2VyIGFnZW50IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICovXG4gICAgcGxhdGZvcm0udWEgPSB1YTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBicm93c2VyL2Vudmlyb25tZW50IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLnZlcnNpb24gPSBuYW1lICYmIHZlcnNpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAqL1xuICAgIHBsYXRmb3JtLm9zID0gb3MgfHwge1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBDUFUgYXJjaGl0ZWN0dXJlIHRoZSBPUyBpcyBidWlsdCBmb3IuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIHBsYXRmb3JtLm9zXG4gICAgICAgKiBAdHlwZSBudW1iZXJ8bnVsbFxuICAgICAgICovXG4gICAgICAnYXJjaGl0ZWN0dXJlJzogbnVsbCxcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZmFtaWx5IG9mIHRoZSBPUy5cbiAgICAgICAqXG4gICAgICAgKiBDb21tb24gdmFsdWVzIGluY2x1ZGU6XG4gICAgICAgKiBcIldpbmRvd3NcIiwgXCJXaW5kb3dzIFNlcnZlciAyMDA4IFIyIC8gN1wiLCBcIldpbmRvd3MgU2VydmVyIDIwMDggLyBWaXN0YVwiLFxuICAgICAgICogXCJXaW5kb3dzIFhQXCIsIFwiT1MgWFwiLCBcIlVidW50dVwiLCBcIkRlYmlhblwiLCBcIkZlZG9yYVwiLCBcIlJlZCBIYXRcIiwgXCJTdVNFXCIsXG4gICAgICAgKiBcIkFuZHJvaWRcIiwgXCJpT1NcIiBhbmQgXCJXaW5kb3dzIFBob25lXCJcbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm0ub3NcbiAgICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICAgKi9cbiAgICAgICdmYW1pbHknOiBudWxsLFxuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPUy5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm0ub3NcbiAgICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICAgKi9cbiAgICAgICd2ZXJzaW9uJzogbnVsbCxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIHRoZSBPUyBzdHJpbmcuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIHBsYXRmb3JtLm9zXG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgT1Mgc3RyaW5nLlxuICAgICAgICovXG4gICAgICAndG9TdHJpbmcnOiBmdW5jdGlvbigpIHsgcmV0dXJuICdudWxsJzsgfVxuICAgIH07XG5cbiAgICBwbGF0Zm9ybS5wYXJzZSA9IHBhcnNlO1xuICAgIHBsYXRmb3JtLnRvU3RyaW5nID0gdG9TdHJpbmdQbGF0Zm9ybTtcblxuICAgIGlmIChwbGF0Zm9ybS52ZXJzaW9uKSB7XG4gICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KHZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAocGxhdGZvcm0ubmFtZSkge1xuICAgICAgZGVzY3JpcHRpb24udW5zaGlmdChuYW1lKTtcbiAgICB9XG4gICAgaWYgKG9zICYmIG5hbWUgJiYgIShvcyA9PSBTdHJpbmcob3MpLnNwbGl0KCcgJylbMF0gJiYgKG9zID09IG5hbWUuc3BsaXQoJyAnKVswXSB8fCBwcm9kdWN0KSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2gocHJvZHVjdCA/ICcoJyArIG9zICsgJyknIDogJ29uICcgKyBvcyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGgpIHtcbiAgICAgIHBsYXRmb3JtLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uam9pbignICcpO1xuICAgIH1cbiAgICByZXR1cm4gcGxhdGZvcm07XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvLyBFeHBvcnQgcGxhdGZvcm0uXG4gIHZhciBwbGF0Zm9ybSA9IHBhcnNlKCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIHBsYXRmb3JtIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIHByZXZlbnQgZXJyb3JzIHdoZW4gcGxhdGZvcm0gaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgcm9vdC5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28gcGxhdGZvcm0gY2FuIGJlIGFsaWFzZWQgdGhyb3VnaCBwYXRoIG1hcHBpbmcuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBsYXRmb3JtO1xuICAgIH0pO1xuICB9XG4gIC8vIENoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGFuIGBleHBvcnRzYCBvYmplY3QuXG4gIGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZm9yT3duKHBsYXRmb3JtLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICBmcmVlRXhwb3J0c1trZXldID0gdmFsdWU7XG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSB7IG5leHRUaWNrOiBuZXh0VGljayB9O1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzXG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cblxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4xIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcblx0ICogaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcblx0ICogYWRkcmVzc2VzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcblx0ICogY2hhcmFjdGVyLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuXHQgKiBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG5cdFx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0XHR9XG5cdFx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdFx0dmFyIGxhYmVscyA9IHN0cmluZy5zcGxpdCgnLicpO1xuXHRcdHZhciBlbmNvZGVkID0gbWFwKGxhYmVscywgZm4pLmpvaW4oJy4nKTtcblx0XHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG5cdCAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcblx0ICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG5cdCAqIG1hdGNoaW5nIFVURi0xNi5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBkZWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cblx0ICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxuXHRcdCAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuXHRcdCAgICB2YWx1ZSxcblx0XHQgICAgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGVuY29kZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cblx0ICogQHNlZSBgZGlnaXRUb0Jhc2ljKClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50IChmb3IgdXNlIGluXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcblx0ICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCAtIDQ4IDwgMTApIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSAyMjtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDY1IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA2NTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDk3IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA5Nztcblx0XHR9XG5cdFx0cmV0dXJuIGJhc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3Jcblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Vcblx0ICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG5cdCAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG5cdCAqL1xuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcblx0XHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHRcdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG5cdH1cblxuXHQvKipcblx0ICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cblx0ICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRcdHZhciBrID0gMDtcblx0XHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRcdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0XHQvLyBEb24ndCB1c2UgVUNTLTJcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxuXHRcdCAgICBvdXQsXG5cdFx0ICAgIGkgPSAwLFxuXHRcdCAgICBuID0gaW5pdGlhbE4sXG5cdFx0ICAgIGJpYXMgPSBpbml0aWFsQmlhcyxcblx0XHQgICAgYmFzaWMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIGluZGV4LFxuXHRcdCAgICBvbGRpLFxuXHRcdCAgICB3LFxuXHRcdCAgICBrLFxuXHRcdCAgICBkaWdpdCxcblx0XHQgICAgdCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGJhc2VNaW51c1Q7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHRcdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRcdGlmIChiYXNpYyA8IDApIHtcblx0XHRcdGJhc2ljID0gMDtcblx0XHR9XG5cblx0XHRmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHRcdH1cblx0XHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0XHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdFx0Zm9yIChpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdFx0Zm9yIChvbGRpID0gaSwgdyA9IDEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXG5cdFx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XG5cdFx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHRcdC8vIGluY3JlbWVudGluZyBgbmAgZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6XG5cdFx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdFx0aSAlPSBvdXQ7XG5cblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcblx0XHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcblx0ICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG5cdFx0dmFyIG4sXG5cdFx0ICAgIGRlbHRhLFxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcblx0XHQgICAgYmFzaWNMZW5ndGgsXG5cdFx0ICAgIGJpYXMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIG0sXG5cdFx0ICAgIHEsXG5cdFx0ICAgIGssXG5cdFx0ICAgIHQsXG5cdFx0ICAgIGN1cnJlbnRWYWx1ZSxcblx0XHQgICAgb3V0cHV0ID0gW10sXG5cdFx0ICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG5cdFx0ICAgIGlucHV0TGVuZ3RoLFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuXHRcdCAgICBiYXNlTWludXNULFxuXHRcdCAgICBxTWludXNUO1xuXG5cdFx0Ly8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gVW5pY29kZVxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0XHQvLyBDYWNoZSB0aGUgbGVuZ3RoXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuXHRcdG4gPSBpbml0aWFsTjtcblx0XHRkZWx0YSA9IDA7XG5cdFx0YmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuXHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblxuXHRcdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHRcdC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIC0gaWYgaXQgaXMgbm90IGVtcHR5IC0gd2l0aCBhIGRlbGltaXRlclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xuXHRcdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGVuY29kaW5nIGxvb3A6XG5cdFx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdFx0Ly8gbGFyZ2VyIG9uZTpcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdFx0Ly8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3dcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuXHRcdFx0biA9IG07XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG5cdFx0XHRcdFx0Zm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG5cdFx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0KytkZWx0YTtcblx0XHRcdCsrbjtcblxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3Ncblx0ICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuXHQgKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuXHQgKiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG5cdCAqIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG5cdCAqIGVtYWlsIGFkZHJlc3MuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuNC4xJyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0ICovXG5cdFx0J3VjczInOiB7XG5cdFx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdFx0fSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J3RvQVNDSUknOiB0b0FTQ0lJLFxuXHRcdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcblx0fTtcblxuXHQvKiogRXhwb3NlIGBwdW55Y29kZWAgKi9cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoJ3B1bnljb2RlJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcHVueWNvZGU7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cykge1xuXHRcdFx0Ly8gaW4gTm9kZS5qcywgaW8uanMsIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbntcbiAgLy8gYXZvaWQgc2NvcGUgY3JlZXAsIHRoZSBrZXlzIGFycmF5IGNhbiB0aGVuIGJlIGNvbGxlY3RlZFxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcG5hLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgdGhpcy5lbmQoKTtcblxuICBwbmEubmV4dFRpY2soY2IsIGVycik7XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgcmVhZGFibGVId20gPSBvcHRpb25zLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmIChyZWFkYWJsZUh3bSB8fCByZWFkYWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwbmEubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHBuYS5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgdGhpcy5lbWl0LmJpbmQodGhpcywga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCd3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKSk7XG4gIH1cblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMyLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qIDxyZXBsYWNlbWVudD4gKi9cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgb25Db3JrZWRGaW5pc2goX3RoaXMsIHN0YXRlKTtcbiAgfTtcbn1cbi8qIDwvcmVwbGFjZW1lbnQ+ICovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcG5hLm5leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbS5cbiAgLy8gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgc2VwYXJhdGVseSBhcyByZWFkYWJsZVhYWCBhbmQgd3JpdGFibGVYWFguXG4gIHZhciBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleDtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoaXNEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgd3JpdGFibGVId20gPSBvcHRpb25zLndyaXRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmICh3cml0YWJsZUh3bSB8fCB3cml0YWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHdyaXRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBpZiBfZmluYWwgaGFzIGJlZW4gY2FsbGVkXG4gIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZTtcblxuICAvLyBkcmFpbiBldmVudCBmbGFnLlxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJywgJ0RFUDAwMDMnKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxuLy8gVGVzdCBfd3JpdGFibGVTdGF0ZSBmb3IgaW5oZXJpdGFuY2UgdG8gYWNjb3VudCBmb3IgRHVwbGV4IHN0cmVhbXMsXG4vLyB3aG9zZSBwcm90b3R5cGUgY2hhaW4gb25seSBwb2ludHMgdG8gUmVhZGFibGUuXG52YXIgcmVhbEhhc0luc3RhbmNlO1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmhhc0luc3RhbmNlICYmIHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICByZWFsSGFzSW5zdGFuY2UgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgaWYgKHJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsIG9iamVjdCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMgIT09IFdyaXRhYmxlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHBuYS5uZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHBuYS5uZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIF9pc1VpbnQ4QXJyYXkoY2h1bmspO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICghaXNCdWYpIHtcbiAgICB2YXIgbmV3Q2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG5cbiAgaWYgKHN5bmMpIHtcbiAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gdG8gYXZvaWQgcGlsaW5nIHVwIHRoaW5ncyBvbiB0aGUgc3RhY2tcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYW5kIGl0IHdpbGwgYWx3YXlzIGhhcHBlblxuICAgIC8vIGFmdGVyIGVycm9yXG4gICAgcG5hLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGNhbGxlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVmb3JlIGlmXG4gICAgLy8gaXQgaXMgYXN5bmNcbiAgICBjYihlcik7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBidXQgZmluaXNoIG11c3RcbiAgICAvLyBhbHdheXMgZm9sbG93IGVycm9yXG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGFsbEJ1ZmZlcnMgPSB0cnVlO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgaWYgKCFlbnRyeS5pc0J1ZikgYWxsQnVmZmVycyA9IGZhbHNlO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgYnVmZmVyLmFsbEJ1ZmZlcnMgPSBhbGxCdWZmZXJzO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tO1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cbmZ1bmN0aW9uIGNhbGxGaW5hbChzdHJlYW0sIHN0YXRlKSB7XG4gIHN0cmVhbS5fZmluYWwoZnVuY3Rpb24gKGVycikge1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfVxuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCAmJiAhc3RhdGUuZmluYWxDYWxsZWQpIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlO1xuICAgICAgcG5hLm5leHRUaWNrKGNhbGxGaW5hbCwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBwbmEubmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbkNvcmtlZEZpbmlzaChjb3JrUmVxLCBzdGF0ZSwgZXJyKSB7XG4gIHZhciBlbnRyeSA9IGNvcmtSZXEuZW50cnk7XG4gIGNvcmtSZXEuZW50cnkgPSBudWxsO1xuICB3aGlsZSAoZW50cnkpIHtcbiAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBjYihlcnIpO1xuICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgfVxuICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBjb3JrUmVxO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGNvcmtSZXE7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLmVuZCgpO1xuICBjYihlcnIpO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyKHNyYywgdGFyZ2V0LCBvZmZzZXQpIHtcbiAgc3JjLmNvcHkodGFyZ2V0LCBvZmZzZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVmZmVyTGlzdCk7XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2godikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IHRoaXMuaGVhZCB9O1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICAtLXRoaXMubGVuZ3RoO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihzKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICAgIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgICB9cmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQobikge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLmhlYWQuZGF0YTtcbiAgICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAocCkge1xuICAgICAgY29weUJ1ZmZlcihwLmRhdGEsIHJldCwgaSk7XG4gICAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgICBwID0gcC5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIHJldHVybiBCdWZmZXJMaXN0O1xufSgpO1xuXG5pZiAodXRpbCAmJiB1dGlsLmluc3BlY3QgJiYgdXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBtb2R1bGUuZXhwb3J0cy5wcm90b3R5cGVbdXRpbC5pbnNwZWN0LmN1c3RvbV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IHV0aWwuaW5zcGVjdCh7IGxlbmd0aDogdGhpcy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgJyArIG9iajtcbiAgfTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8vIHVuZG9jdW1lbnRlZCBjYigpIEFQSSwgbmVlZGVkIGZvciBjb3JlLCBub3QgZm9yIHB1YmxpYyBBUElcbmZ1bmN0aW9uIGRlc3Ryb3koZXJyLCBjYikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciByZWFkYWJsZURlc3Ryb3llZCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIHZhciB3cml0YWJsZURlc3Ryb3llZCA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG5cbiAgaWYgKHJlYWRhYmxlRGVzdHJveWVkIHx8IHdyaXRhYmxlRGVzdHJveWVkKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyICYmICghdGhpcy5fd3JpdGFibGVTdGF0ZSB8fCAhdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIHRoaXMsIGVycik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBhIGR1cGxleCBzdHJlYW0gbWFyayB0aGUgd3JpdGFibGUgcGFydCBhcyBkZXN0cm95ZWQgYXMgd2VsbFxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRoaXMuX2Rlc3Ryb3koZXJyIHx8IG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoIWNiICYmIGVycikge1xuICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCBfdGhpcywgZXJyKTtcbiAgICAgIGlmIChfdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gdW5kZXN0cm95KCkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gIHVuZGVzdHJveTogdW5kZXN0cm95XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuUGFzc1Rocm91Z2hcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5UcmFuc2Zvcm1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCI7KGZ1bmN0aW9uIChzYXgpIHsgLy8gd3JhcHBlciBmb3Igbm9uLW5vZGUgZW52c1xuICBzYXgucGFyc2VyID0gZnVuY3Rpb24gKHN0cmljdCwgb3B0KSB7IHJldHVybiBuZXcgU0FYUGFyc2VyKHN0cmljdCwgb3B0KSB9XG4gIHNheC5TQVhQYXJzZXIgPSBTQVhQYXJzZXJcbiAgc2F4LlNBWFN0cmVhbSA9IFNBWFN0cmVhbVxuICBzYXguY3JlYXRlU3RyZWFtID0gY3JlYXRlU3RyZWFtXG5cbiAgLy8gV2hlbiB3ZSBwYXNzIHRoZSBNQVhfQlVGRkVSX0xFTkdUSCBwb3NpdGlvbiwgc3RhcnQgY2hlY2tpbmcgZm9yIGJ1ZmZlciBvdmVycnVucy5cbiAgLy8gV2hlbiB3ZSBjaGVjaywgc2NoZWR1bGUgdGhlIG5leHQgY2hlY2sgZm9yIE1BWF9CVUZGRVJfTEVOR1RIIC0gKG1heChidWZmZXIgbGVuZ3RocykpLFxuICAvLyBzaW5jZSB0aGF0J3MgdGhlIGVhcmxpZXN0IHRoYXQgYSBidWZmZXIgb3ZlcnJ1biBjb3VsZCBvY2N1ci4gIFRoaXMgd2F5LCBjaGVja3MgYXJlXG4gIC8vIGFzIHJhcmUgYXMgcmVxdWlyZWQsIGJ1dCBhcyBvZnRlbiBhcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5ldmVyIGNyb3NzaW5nIHRoaXMgYm91bmQuXG4gIC8vIEZ1cnRoZXJtb3JlLCBidWZmZXJzIGFyZSBvbmx5IHRlc3RlZCBhdCBtb3N0IG9uY2UgcGVyIHdyaXRlKCksIHNvIHBhc3NpbmcgYSB2ZXJ5XG4gIC8vIGxhcmdlIHN0cmluZyBpbnRvIHdyaXRlKCkgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzLCBidXQgdGhpcyBpcyBtYW5hZ2VhYmxlIGJ5XG4gIC8vIHRoZSBjYWxsZXIsIHNvIGl0IGlzIGFzc3VtZWQgdG8gYmUgc2FmZS4gIFRodXMsIGEgY2FsbCB0byB3cml0ZSgpIG1heSwgaW4gdGhlIGV4dHJlbWVcbiAgLy8gZWRnZSBjYXNlLCByZXN1bHQgaW4gY3JlYXRpbmcgYXQgbW9zdCBvbmUgY29tcGxldGUgY29weSBvZiB0aGUgc3RyaW5nIHBhc3NlZCBpbi5cbiAgLy8gU2V0IHRvIEluZmluaXR5IHRvIGhhdmUgdW5saW1pdGVkIGJ1ZmZlcnMuXG4gIHNheC5NQVhfQlVGRkVSX0xFTkdUSCA9IDY0ICogMTAyNFxuXG4gIHZhciBidWZmZXJzID0gW1xuICAgICdjb21tZW50JywgJ3NnbWxEZWNsJywgJ3RleHROb2RlJywgJ3RhZ05hbWUnLCAnZG9jdHlwZScsXG4gICAgJ3Byb2NJbnN0TmFtZScsICdwcm9jSW5zdEJvZHknLCAnZW50aXR5JywgJ2F0dHJpYk5hbWUnLFxuICAgICdhdHRyaWJWYWx1ZScsICdjZGF0YScsICdzY3JpcHQnXG4gIF1cblxuICBzYXguRVZFTlRTID0gW1xuICAgICd0ZXh0JyxcbiAgICAncHJvY2Vzc2luZ2luc3RydWN0aW9uJyxcbiAgICAnc2dtbGRlY2xhcmF0aW9uJyxcbiAgICAnZG9jdHlwZScsXG4gICAgJ2NvbW1lbnQnLFxuICAgICdvcGVudGFnc3RhcnQnLFxuICAgICdhdHRyaWJ1dGUnLFxuICAgICdvcGVudGFnJyxcbiAgICAnY2xvc2V0YWcnLFxuICAgICdvcGVuY2RhdGEnLFxuICAgICdjZGF0YScsXG4gICAgJ2Nsb3NlY2RhdGEnLFxuICAgICdlcnJvcicsXG4gICAgJ2VuZCcsXG4gICAgJ3JlYWR5JyxcbiAgICAnc2NyaXB0JyxcbiAgICAnb3Blbm5hbWVzcGFjZScsXG4gICAgJ2Nsb3NlbmFtZXNwYWNlJ1xuICBdXG5cbiAgZnVuY3Rpb24gU0FYUGFyc2VyIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFBhcnNlcihzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICB2YXIgcGFyc2VyID0gdGhpc1xuICAgIGNsZWFyQnVmZmVycyhwYXJzZXIpXG4gICAgcGFyc2VyLnEgPSBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEhcbiAgICBwYXJzZXIub3B0ID0gb3B0IHx8IHt9XG4gICAgcGFyc2VyLm9wdC5sb3dlcmNhc2UgPSBwYXJzZXIub3B0Lmxvd2VyY2FzZSB8fCBwYXJzZXIub3B0Lmxvd2VyY2FzZXRhZ3NcbiAgICBwYXJzZXIubG9vc2VDYXNlID0gcGFyc2VyLm9wdC5sb3dlcmNhc2UgPyAndG9Mb3dlckNhc2UnIDogJ3RvVXBwZXJDYXNlJ1xuICAgIHBhcnNlci50YWdzID0gW11cbiAgICBwYXJzZXIuY2xvc2VkID0gcGFyc2VyLmNsb3NlZFJvb3QgPSBwYXJzZXIuc2F3Um9vdCA9IGZhbHNlXG4gICAgcGFyc2VyLnRhZyA9IHBhcnNlci5lcnJvciA9IG51bGxcbiAgICBwYXJzZXIuc3RyaWN0ID0gISFzdHJpY3RcbiAgICBwYXJzZXIubm9zY3JpcHQgPSAhIShzdHJpY3QgfHwgcGFyc2VyLm9wdC5ub3NjcmlwdClcbiAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOXG4gICAgcGFyc2VyLnN0cmljdEVudGl0aWVzID0gcGFyc2VyLm9wdC5zdHJpY3RFbnRpdGllc1xuICAgIHBhcnNlci5FTlRJVElFUyA9IHBhcnNlci5zdHJpY3RFbnRpdGllcyA/IE9iamVjdC5jcmVhdGUoc2F4LlhNTF9FTlRJVElFUykgOiBPYmplY3QuY3JlYXRlKHNheC5FTlRJVElFUylcbiAgICBwYXJzZXIuYXR0cmliTGlzdCA9IFtdXG5cbiAgICAvLyBuYW1lc3BhY2VzIGZvcm0gYSBwcm90b3R5cGUgY2hhaW4uXG4gICAgLy8gaXQgYWx3YXlzIHBvaW50cyBhdCB0aGUgY3VycmVudCB0YWcsXG4gICAgLy8gd2hpY2ggcHJvdG9zIHRvIGl0cyBwYXJlbnQgdGFnLlxuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICBwYXJzZXIubnMgPSBPYmplY3QuY3JlYXRlKHJvb3ROUylcbiAgICB9XG5cbiAgICAvLyBtb3N0bHkganVzdCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAgcGFyc2VyLnRyYWNrUG9zaXRpb24gPSBwYXJzZXIub3B0LnBvc2l0aW9uICE9PSBmYWxzZVxuICAgIGlmIChwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gcGFyc2VyLmxpbmUgPSBwYXJzZXIuY29sdW1uID0gMFxuICAgIH1cbiAgICBlbWl0KHBhcnNlciwgJ29ucmVhZHknKVxuICB9XG5cbiAgaWYgKCFPYmplY3QuY3JlYXRlKSB7XG4gICAgT2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICBmdW5jdGlvbiBGICgpIHt9XG4gICAgICBGLnByb3RvdHlwZSA9IG9cbiAgICAgIHZhciBuZXdmID0gbmV3IEYoKVxuICAgICAgcmV0dXJuIG5ld2ZcbiAgICB9XG4gIH1cblxuICBpZiAoIU9iamVjdC5rZXlzKSB7XG4gICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGEgPSBbXVxuICAgICAgZm9yICh2YXIgaSBpbiBvKSBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgYS5wdXNoKGkpXG4gICAgICByZXR1cm4gYVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQnVmZmVyTGVuZ3RoIChwYXJzZXIpIHtcbiAgICB2YXIgbWF4QWxsb3dlZCA9IE1hdGgubWF4KHNheC5NQVhfQlVGRkVSX0xFTkdUSCwgMTApXG4gICAgdmFyIG1heEFjdHVhbCA9IDBcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGJ1ZmZlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgbGVuID0gcGFyc2VyW2J1ZmZlcnNbaV1dLmxlbmd0aFxuICAgICAgaWYgKGxlbiA+IG1heEFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGV4dC9jZGF0YSBub2RlcyBjYW4gZ2V0IGJpZywgYW5kIHNpbmNlIHRoZXkncmUgYnVmZmVyZWQsXG4gICAgICAgIC8vIHdlIGNhbiBnZXQgaGVyZSB1bmRlciBub3JtYWwgY29uZGl0aW9ucy5cbiAgICAgICAgLy8gQXZvaWQgaXNzdWVzIGJ5IGVtaXR0aW5nIHRoZSB0ZXh0IG5vZGUgbm93LFxuICAgICAgICAvLyBzbyBhdCBsZWFzdCBpdCB3b24ndCBnZXQgYW55IGJpZ2dlci5cbiAgICAgICAgc3dpdGNoIChidWZmZXJzW2ldKSB7XG4gICAgICAgICAgY2FzZSAndGV4dE5vZGUnOlxuICAgICAgICAgICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdjZGF0YSc6XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNkYXRhJywgcGFyc2VyLmNkYXRhKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdzY3JpcHQnOlxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zY3JpcHQnLCBwYXJzZXIuc2NyaXB0KVxuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCA9ICcnXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKHBhcnNlciwgJ01heCBidWZmZXIgbGVuZ3RoIGV4Y2VlZGVkOiAnICsgYnVmZmVyc1tpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4QWN0dWFsID0gTWF0aC5tYXgobWF4QWN0dWFsLCBsZW4pXG4gICAgfVxuICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IGNoZWNrIGZvciB0aGUgZWFybGllc3QgcG9zc2libGUgYnVmZmVyIG92ZXJydW4uXG4gICAgdmFyIG0gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEggLSBtYXhBY3R1YWxcbiAgICBwYXJzZXIuYnVmZmVyQ2hlY2tQb3NpdGlvbiA9IG0gKyBwYXJzZXIucG9zaXRpb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQnVmZmVycyAocGFyc2VyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBidWZmZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcGFyc2VyW2J1ZmZlcnNbaV1dID0gJydcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaEJ1ZmZlcnMgKHBhcnNlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci5jZGF0YSAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgIH1cbiAgICBpZiAocGFyc2VyLnNjcmlwdCAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIFNBWFBhcnNlci5wcm90b3R5cGUgPSB7XG4gICAgZW5kOiBmdW5jdGlvbiAoKSB7IGVuZCh0aGlzKSB9LFxuICAgIHdyaXRlOiB3cml0ZSxcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpIHsgdGhpcy5lcnJvciA9IG51bGw7IHJldHVybiB0aGlzIH0sXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMud3JpdGUobnVsbCkgfSxcbiAgICBmbHVzaDogZnVuY3Rpb24gKCkgeyBmbHVzaEJ1ZmZlcnModGhpcykgfVxuICB9XG5cbiAgdmFyIFN0cmVhbVxuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuICB9IGNhdGNoIChleCkge1xuICAgIFN0cmVhbSA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICB2YXIgc3RyZWFtV3JhcHMgPSBzYXguRVZFTlRTLmZpbHRlcihmdW5jdGlvbiAoZXYpIHtcbiAgICByZXR1cm4gZXYgIT09ICdlcnJvcicgJiYgZXYgIT09ICdlbmQnXG4gIH0pXG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIHJldHVybiBuZXcgU0FYU3RyZWFtKHN0cmljdCwgb3B0KVxuICB9XG5cbiAgZnVuY3Rpb24gU0FYU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhTdHJlYW0pKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFN0cmVhbShzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICBTdHJlYW0uYXBwbHkodGhpcylcblxuICAgIHRoaXMuX3BhcnNlciA9IG5ldyBTQVhQYXJzZXIoc3RyaWN0LCBvcHQpXG4gICAgdGhpcy53cml0YWJsZSA9IHRydWVcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgdmFyIG1lID0gdGhpc1xuXG4gICAgdGhpcy5fcGFyc2VyLm9uZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuZW1pdCgnZW5kJylcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIub25lcnJvciA9IGZ1bmN0aW9uIChlcikge1xuICAgICAgbWUuZW1pdCgnZXJyb3InLCBlcilcblxuICAgICAgLy8gaWYgZGlkbid0IHRocm93LCB0aGVuIG1lYW5zIGVycm9yIHdhcyBoYW5kbGVkLlxuICAgICAgLy8gZ28gYWhlYWQgYW5kIGNsZWFyIGVycm9yLCBzbyB3ZSBjYW4gd3JpdGUgYWdhaW4uXG4gICAgICBtZS5fcGFyc2VyLmVycm9yID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX2RlY29kZXIgPSBudWxsXG5cbiAgICBzdHJlYW1XcmFwcy5mb3JFYWNoKGZ1bmN0aW9uIChldikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCAnb24nICsgZXYsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lLl9wYXJzZXJbJ29uJyArIGV2XVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChoKSB7XG4gICAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgICBtZS5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpXG4gICAgICAgICAgICBtZS5fcGFyc2VyWydvbicgKyBldl0gPSBoXG4gICAgICAgICAgICByZXR1cm4gaFxuICAgICAgICAgIH1cbiAgICAgICAgICBtZS5vbihldiwgaClcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogU0FYU3RyZWFtXG4gICAgfVxuICB9KVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgIGlmICghdGhpcy5fZGVjb2Rlcikge1xuICAgICAgICB2YXIgU0QgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcbiAgICAgICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTRCgndXRmOCcpXG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy5fZGVjb2Rlci53cml0ZShkYXRhKVxuICAgIH1cblxuICAgIHRoaXMuX3BhcnNlci53cml0ZShkYXRhLnRvU3RyaW5nKCkpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICB0aGlzLndyaXRlKGNodW5rKVxuICAgIH1cbiAgICB0aGlzLl9wYXJzZXIuZW5kKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgaGFuZGxlcikge1xuICAgIHZhciBtZSA9IHRoaXNcbiAgICBpZiAoIW1lLl9wYXJzZXJbJ29uJyArIGV2XSAmJiBzdHJlYW1XcmFwcy5pbmRleE9mKGV2KSAhPT0gLTEpIHtcbiAgICAgIG1lLl9wYXJzZXJbJ29uJyArIGV2XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gW2FyZ3VtZW50c1swXV0gOiBBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgICAgIGFyZ3Muc3BsaWNlKDAsIDAsIGV2KVxuICAgICAgICBtZS5lbWl0LmFwcGx5KG1lLCBhcmdzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwobWUsIGV2LCBoYW5kbGVyKVxuICB9XG5cbiAgLy8gdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBjaGFyYWN0ZXIgY2xhc3Nlcy5cbiAgLy8gWE1MIGFsbG93cyBhbGwgbWFubmVyIG9mIHJpZGljdWxvdXMgbnVtYmVycyBhbmQgZGlnaXRzLlxuICB2YXIgQ0RBVEEgPSAnW0NEQVRBWydcbiAgdmFyIERPQ1RZUEUgPSAnRE9DVFlQRSdcbiAgdmFyIFhNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJ1xuICB2YXIgWE1MTlNfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJ1xuICB2YXIgcm9vdE5TID0geyB4bWw6IFhNTF9OQU1FU1BBQ0UsIHhtbG5zOiBYTUxOU19OQU1FU1BBQ0UgfVxuXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI05ULU5hbWVTdGFydENoYXJcbiAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBvbiBzdHJpbmdzLCBhIHNpbmdsZSBjaGFyYWN0ZXIgYXQgYSB0aW1lXG4gIC8vIGFzIHN1Y2gsIGl0IGNhbm5vdCBldmVyIHN1cHBvcnQgYXN0cmFsLXBsYW5lIGNoYXJhY3RlcnMgKDEwMDAwLUVGRkZGKVxuICAvLyB3aXRob3V0IGEgc2lnbmlmaWNhbnQgYnJlYWtpbmcgY2hhbmdlIHRvIGVpdGhlciB0aGlzICBwYXJzZXIsIG9yIHRoZVxuICAvLyBKYXZhU2NyaXB0IGxhbmd1YWdlLiAgSW1wbGVtZW50YXRpb24gb2YgYW4gZW1vamktY2FwYWJsZSB4bWwgcGFyc2VyXG4gIC8vIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuXG4gIHZhciBuYW1lU3RhcnQgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS9cblxuICB2YXIgbmFtZUJvZHkgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MC5cXGQtXS9cblxuICB2YXIgZW50aXR5U3RhcnQgPSAvWyM6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF0vXG4gIHZhciBlbnRpdHlCb2R5ID0gL1sjOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwLlxcZC1dL1xuXG4gIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAoYykge1xuICAgIHJldHVybiBjID09PSAnICcgfHwgYyA9PT0gJ1xcbicgfHwgYyA9PT0gJ1xccicgfHwgYyA9PT0gJ1xcdCdcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUXVvdGUgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJ1wiJyB8fCBjID09PSAnXFwnJ1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBdHRyaWJFbmQgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJz4nIHx8IGlzV2hpdGVzcGFjZShjKVxuICB9XG5cbiAgZnVuY3Rpb24gaXNNYXRjaCAocmVnZXgsIGMpIHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChjKVxuICB9XG5cbiAgZnVuY3Rpb24gbm90TWF0Y2ggKHJlZ2V4LCBjKSB7XG4gICAgcmV0dXJuICFpc01hdGNoKHJlZ2V4LCBjKVxuICB9XG5cbiAgdmFyIFMgPSAwXG4gIHNheC5TVEFURSA9IHtcbiAgICBCRUdJTjogUysrLCAvLyBsZWFkaW5nIGJ5dGUgb3JkZXIgbWFyayBvciB3aGl0ZXNwYWNlXG4gICAgQkVHSU5fV0hJVEVTUEFDRTogUysrLCAvLyBsZWFkaW5nIHdoaXRlc3BhY2VcbiAgICBURVhUOiBTKyssIC8vIGdlbmVyYWwgc3R1ZmZcbiAgICBURVhUX0VOVElUWTogUysrLCAvLyAmYW1wIGFuZCBzdWNoLlxuICAgIE9QRU5fV0FLQTogUysrLCAvLyA8XG4gICAgU0dNTF9ERUNMOiBTKyssIC8vIDwhQkxBUkdcbiAgICBTR01MX0RFQ0xfUVVPVEVEOiBTKyssIC8vIDwhQkxBUkcgZm9vIFwiYmFyXG4gICAgRE9DVFlQRTogUysrLCAvLyA8IURPQ1RZUEVcbiAgICBET0NUWVBFX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcbiAgICBET0NUWVBFX0RURDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIC4uLlxuICAgIERPQ1RZUEVfRFREX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIFwiZm9vXG4gICAgQ09NTUVOVF9TVEFSVElORzogUysrLCAvLyA8IS1cbiAgICBDT01NRU5UOiBTKyssIC8vIDwhLS1cbiAgICBDT01NRU5UX0VORElORzogUysrLCAvLyA8IS0tIGJsYWggLVxuICAgIENPTU1FTlRfRU5ERUQ6IFMrKywgLy8gPCEtLSBibGFoIC0tXG4gICAgQ0RBVEE6IFMrKywgLy8gPCFbQ0RBVEFbIHNvbWV0aGluZ1xuICAgIENEQVRBX0VORElORzogUysrLCAvLyBdXG4gICAgQ0RBVEFfRU5ESU5HXzI6IFMrKywgLy8gXV1cbiAgICBQUk9DX0lOU1Q6IFMrKywgLy8gPD9oaVxuICAgIFBST0NfSU5TVF9CT0RZOiBTKyssIC8vIDw/aGkgdGhlcmVcbiAgICBQUk9DX0lOU1RfRU5ESU5HOiBTKyssIC8vIDw/aGkgXCJ0aGVyZVwiID9cbiAgICBPUEVOX1RBRzogUysrLCAvLyA8c3Ryb25nXG4gICAgT1BFTl9UQUdfU0xBU0g6IFMrKywgLy8gPHN0cm9uZyAvXG4gICAgQVRUUklCOiBTKyssIC8vIDxhXG4gICAgQVRUUklCX05BTUU6IFMrKywgLy8gPGEgZm9vXG4gICAgQVRUUklCX05BTUVfU0FXX1dISVRFOiBTKyssIC8vIDxhIGZvbyBfXG4gICAgQVRUUklCX1ZBTFVFOiBTKyssIC8vIDxhIGZvbz1cbiAgICBBVFRSSUJfVkFMVUVfUVVPVEVEOiBTKyssIC8vIDxhIGZvbz1cImJhclxuICAgIEFUVFJJQl9WQUxVRV9DTE9TRUQ6IFMrKywgLy8gPGEgZm9vPVwiYmFyXCJcbiAgICBBVFRSSUJfVkFMVUVfVU5RVU9URUQ6IFMrKywgLy8gPGEgZm9vPWJhclxuICAgIEFUVFJJQl9WQUxVRV9FTlRJVFlfUTogUysrLCAvLyA8Zm9vIGJhcj1cIiZxdW90O1wiXG4gICAgQVRUUklCX1ZBTFVFX0VOVElUWV9VOiBTKyssIC8vIDxmb28gYmFyPSZxdW90XG4gICAgQ0xPU0VfVEFHOiBTKyssIC8vIDwvYVxuICAgIENMT1NFX1RBR19TQVdfV0hJVEU6IFMrKywgLy8gPC9hICAgPlxuICAgIFNDUklQVDogUysrLCAvLyA8c2NyaXB0PiAuLi5cbiAgICBTQ1JJUFRfRU5ESU5HOiBTKysgLy8gPHNjcmlwdD4gLi4uIDxcbiAgfVxuXG4gIHNheC5YTUxfRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiXG4gIH1cblxuICBzYXguRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiLFxuICAgICdBRWxpZyc6IDE5OCxcbiAgICAnQWFjdXRlJzogMTkzLFxuICAgICdBY2lyYyc6IDE5NCxcbiAgICAnQWdyYXZlJzogMTkyLFxuICAgICdBcmluZyc6IDE5NyxcbiAgICAnQXRpbGRlJzogMTk1LFxuICAgICdBdW1sJzogMTk2LFxuICAgICdDY2VkaWwnOiAxOTksXG4gICAgJ0VUSCc6IDIwOCxcbiAgICAnRWFjdXRlJzogMjAxLFxuICAgICdFY2lyYyc6IDIwMixcbiAgICAnRWdyYXZlJzogMjAwLFxuICAgICdFdW1sJzogMjAzLFxuICAgICdJYWN1dGUnOiAyMDUsXG4gICAgJ0ljaXJjJzogMjA2LFxuICAgICdJZ3JhdmUnOiAyMDQsXG4gICAgJ0l1bWwnOiAyMDcsXG4gICAgJ050aWxkZSc6IDIwOSxcbiAgICAnT2FjdXRlJzogMjExLFxuICAgICdPY2lyYyc6IDIxMixcbiAgICAnT2dyYXZlJzogMjEwLFxuICAgICdPc2xhc2gnOiAyMTYsXG4gICAgJ090aWxkZSc6IDIxMyxcbiAgICAnT3VtbCc6IDIxNCxcbiAgICAnVEhPUk4nOiAyMjIsXG4gICAgJ1VhY3V0ZSc6IDIxOCxcbiAgICAnVWNpcmMnOiAyMTksXG4gICAgJ1VncmF2ZSc6IDIxNyxcbiAgICAnVXVtbCc6IDIyMCxcbiAgICAnWWFjdXRlJzogMjIxLFxuICAgICdhYWN1dGUnOiAyMjUsXG4gICAgJ2FjaXJjJzogMjI2LFxuICAgICdhZWxpZyc6IDIzMCxcbiAgICAnYWdyYXZlJzogMjI0LFxuICAgICdhcmluZyc6IDIyOSxcbiAgICAnYXRpbGRlJzogMjI3LFxuICAgICdhdW1sJzogMjI4LFxuICAgICdjY2VkaWwnOiAyMzEsXG4gICAgJ2VhY3V0ZSc6IDIzMyxcbiAgICAnZWNpcmMnOiAyMzQsXG4gICAgJ2VncmF2ZSc6IDIzMixcbiAgICAnZXRoJzogMjQwLFxuICAgICdldW1sJzogMjM1LFxuICAgICdpYWN1dGUnOiAyMzcsXG4gICAgJ2ljaXJjJzogMjM4LFxuICAgICdpZ3JhdmUnOiAyMzYsXG4gICAgJ2l1bWwnOiAyMzksXG4gICAgJ250aWxkZSc6IDI0MSxcbiAgICAnb2FjdXRlJzogMjQzLFxuICAgICdvY2lyYyc6IDI0NCxcbiAgICAnb2dyYXZlJzogMjQyLFxuICAgICdvc2xhc2gnOiAyNDgsXG4gICAgJ290aWxkZSc6IDI0NSxcbiAgICAnb3VtbCc6IDI0NixcbiAgICAnc3psaWcnOiAyMjMsXG4gICAgJ3Rob3JuJzogMjU0LFxuICAgICd1YWN1dGUnOiAyNTAsXG4gICAgJ3VjaXJjJzogMjUxLFxuICAgICd1Z3JhdmUnOiAyNDksXG4gICAgJ3V1bWwnOiAyNTIsXG4gICAgJ3lhY3V0ZSc6IDI1MyxcbiAgICAneXVtbCc6IDI1NSxcbiAgICAnY29weSc6IDE2OSxcbiAgICAncmVnJzogMTc0LFxuICAgICduYnNwJzogMTYwLFxuICAgICdpZXhjbCc6IDE2MSxcbiAgICAnY2VudCc6IDE2MixcbiAgICAncG91bmQnOiAxNjMsXG4gICAgJ2N1cnJlbic6IDE2NCxcbiAgICAneWVuJzogMTY1LFxuICAgICdicnZiYXInOiAxNjYsXG4gICAgJ3NlY3QnOiAxNjcsXG4gICAgJ3VtbCc6IDE2OCxcbiAgICAnb3JkZic6IDE3MCxcbiAgICAnbGFxdW8nOiAxNzEsXG4gICAgJ25vdCc6IDE3MixcbiAgICAnc2h5JzogMTczLFxuICAgICdtYWNyJzogMTc1LFxuICAgICdkZWcnOiAxNzYsXG4gICAgJ3BsdXNtbic6IDE3NyxcbiAgICAnc3VwMSc6IDE4NSxcbiAgICAnc3VwMic6IDE3OCxcbiAgICAnc3VwMyc6IDE3OSxcbiAgICAnYWN1dGUnOiAxODAsXG4gICAgJ21pY3JvJzogMTgxLFxuICAgICdwYXJhJzogMTgyLFxuICAgICdtaWRkb3QnOiAxODMsXG4gICAgJ2NlZGlsJzogMTg0LFxuICAgICdvcmRtJzogMTg2LFxuICAgICdyYXF1byc6IDE4NyxcbiAgICAnZnJhYzE0JzogMTg4LFxuICAgICdmcmFjMTInOiAxODksXG4gICAgJ2ZyYWMzNCc6IDE5MCxcbiAgICAnaXF1ZXN0JzogMTkxLFxuICAgICd0aW1lcyc6IDIxNSxcbiAgICAnZGl2aWRlJzogMjQ3LFxuICAgICdPRWxpZyc6IDMzOCxcbiAgICAnb2VsaWcnOiAzMzksXG4gICAgJ1NjYXJvbic6IDM1MixcbiAgICAnc2Nhcm9uJzogMzUzLFxuICAgICdZdW1sJzogMzc2LFxuICAgICdmbm9mJzogNDAyLFxuICAgICdjaXJjJzogNzEwLFxuICAgICd0aWxkZSc6IDczMixcbiAgICAnQWxwaGEnOiA5MTMsXG4gICAgJ0JldGEnOiA5MTQsXG4gICAgJ0dhbW1hJzogOTE1LFxuICAgICdEZWx0YSc6IDkxNixcbiAgICAnRXBzaWxvbic6IDkxNyxcbiAgICAnWmV0YSc6IDkxOCxcbiAgICAnRXRhJzogOTE5LFxuICAgICdUaGV0YSc6IDkyMCxcbiAgICAnSW90YSc6IDkyMSxcbiAgICAnS2FwcGEnOiA5MjIsXG4gICAgJ0xhbWJkYSc6IDkyMyxcbiAgICAnTXUnOiA5MjQsXG4gICAgJ051JzogOTI1LFxuICAgICdYaSc6IDkyNixcbiAgICAnT21pY3Jvbic6IDkyNyxcbiAgICAnUGknOiA5MjgsXG4gICAgJ1Jobyc6IDkyOSxcbiAgICAnU2lnbWEnOiA5MzEsXG4gICAgJ1RhdSc6IDkzMixcbiAgICAnVXBzaWxvbic6IDkzMyxcbiAgICAnUGhpJzogOTM0LFxuICAgICdDaGknOiA5MzUsXG4gICAgJ1BzaSc6IDkzNixcbiAgICAnT21lZ2EnOiA5MzcsXG4gICAgJ2FscGhhJzogOTQ1LFxuICAgICdiZXRhJzogOTQ2LFxuICAgICdnYW1tYSc6IDk0NyxcbiAgICAnZGVsdGEnOiA5NDgsXG4gICAgJ2Vwc2lsb24nOiA5NDksXG4gICAgJ3pldGEnOiA5NTAsXG4gICAgJ2V0YSc6IDk1MSxcbiAgICAndGhldGEnOiA5NTIsXG4gICAgJ2lvdGEnOiA5NTMsXG4gICAgJ2thcHBhJzogOTU0LFxuICAgICdsYW1iZGEnOiA5NTUsXG4gICAgJ211JzogOTU2LFxuICAgICdudSc6IDk1NyxcbiAgICAneGknOiA5NTgsXG4gICAgJ29taWNyb24nOiA5NTksXG4gICAgJ3BpJzogOTYwLFxuICAgICdyaG8nOiA5NjEsXG4gICAgJ3NpZ21hZic6IDk2MixcbiAgICAnc2lnbWEnOiA5NjMsXG4gICAgJ3RhdSc6IDk2NCxcbiAgICAndXBzaWxvbic6IDk2NSxcbiAgICAncGhpJzogOTY2LFxuICAgICdjaGknOiA5NjcsXG4gICAgJ3BzaSc6IDk2OCxcbiAgICAnb21lZ2EnOiA5NjksXG4gICAgJ3RoZXRhc3ltJzogOTc3LFxuICAgICd1cHNpaCc6IDk3OCxcbiAgICAncGl2JzogOTgyLFxuICAgICdlbnNwJzogODE5NCxcbiAgICAnZW1zcCc6IDgxOTUsXG4gICAgJ3RoaW5zcCc6IDgyMDEsXG4gICAgJ3p3bmonOiA4MjA0LFxuICAgICd6d2onOiA4MjA1LFxuICAgICdscm0nOiA4MjA2LFxuICAgICdybG0nOiA4MjA3LFxuICAgICduZGFzaCc6IDgyMTEsXG4gICAgJ21kYXNoJzogODIxMixcbiAgICAnbHNxdW8nOiA4MjE2LFxuICAgICdyc3F1byc6IDgyMTcsXG4gICAgJ3NicXVvJzogODIxOCxcbiAgICAnbGRxdW8nOiA4MjIwLFxuICAgICdyZHF1byc6IDgyMjEsXG4gICAgJ2JkcXVvJzogODIyMixcbiAgICAnZGFnZ2VyJzogODIyNCxcbiAgICAnRGFnZ2VyJzogODIyNSxcbiAgICAnYnVsbCc6IDgyMjYsXG4gICAgJ2hlbGxpcCc6IDgyMzAsXG4gICAgJ3Blcm1pbCc6IDgyNDAsXG4gICAgJ3ByaW1lJzogODI0MixcbiAgICAnUHJpbWUnOiA4MjQzLFxuICAgICdsc2FxdW8nOiA4MjQ5LFxuICAgICdyc2FxdW8nOiA4MjUwLFxuICAgICdvbGluZSc6IDgyNTQsXG4gICAgJ2ZyYXNsJzogODI2MCxcbiAgICAnZXVybyc6IDgzNjQsXG4gICAgJ2ltYWdlJzogODQ2NSxcbiAgICAnd2VpZXJwJzogODQ3MixcbiAgICAncmVhbCc6IDg0NzYsXG4gICAgJ3RyYWRlJzogODQ4MixcbiAgICAnYWxlZnN5bSc6IDg1MDEsXG4gICAgJ2xhcnInOiA4NTkyLFxuICAgICd1YXJyJzogODU5MyxcbiAgICAncmFycic6IDg1OTQsXG4gICAgJ2RhcnInOiA4NTk1LFxuICAgICdoYXJyJzogODU5NixcbiAgICAnY3JhcnInOiA4NjI5LFxuICAgICdsQXJyJzogODY1NixcbiAgICAndUFycic6IDg2NTcsXG4gICAgJ3JBcnInOiA4NjU4LFxuICAgICdkQXJyJzogODY1OSxcbiAgICAnaEFycic6IDg2NjAsXG4gICAgJ2ZvcmFsbCc6IDg3MDQsXG4gICAgJ3BhcnQnOiA4NzA2LFxuICAgICdleGlzdCc6IDg3MDcsXG4gICAgJ2VtcHR5JzogODcwOSxcbiAgICAnbmFibGEnOiA4NzExLFxuICAgICdpc2luJzogODcxMixcbiAgICAnbm90aW4nOiA4NzEzLFxuICAgICduaSc6IDg3MTUsXG4gICAgJ3Byb2QnOiA4NzE5LFxuICAgICdzdW0nOiA4NzIxLFxuICAgICdtaW51cyc6IDg3MjIsXG4gICAgJ2xvd2FzdCc6IDg3MjcsXG4gICAgJ3JhZGljJzogODczMCxcbiAgICAncHJvcCc6IDg3MzMsXG4gICAgJ2luZmluJzogODczNCxcbiAgICAnYW5nJzogODczNixcbiAgICAnYW5kJzogODc0MyxcbiAgICAnb3InOiA4NzQ0LFxuICAgICdjYXAnOiA4NzQ1LFxuICAgICdjdXAnOiA4NzQ2LFxuICAgICdpbnQnOiA4NzQ3LFxuICAgICd0aGVyZTQnOiA4NzU2LFxuICAgICdzaW0nOiA4NzY0LFxuICAgICdjb25nJzogODc3MyxcbiAgICAnYXN5bXAnOiA4Nzc2LFxuICAgICduZSc6IDg4MDAsXG4gICAgJ2VxdWl2JzogODgwMSxcbiAgICAnbGUnOiA4ODA0LFxuICAgICdnZSc6IDg4MDUsXG4gICAgJ3N1Yic6IDg4MzQsXG4gICAgJ3N1cCc6IDg4MzUsXG4gICAgJ25zdWInOiA4ODM2LFxuICAgICdzdWJlJzogODgzOCxcbiAgICAnc3VwZSc6IDg4MzksXG4gICAgJ29wbHVzJzogODg1MyxcbiAgICAnb3RpbWVzJzogODg1NSxcbiAgICAncGVycCc6IDg4NjksXG4gICAgJ3Nkb3QnOiA4OTAxLFxuICAgICdsY2VpbCc6IDg5NjgsXG4gICAgJ3JjZWlsJzogODk2OSxcbiAgICAnbGZsb29yJzogODk3MCxcbiAgICAncmZsb29yJzogODk3MSxcbiAgICAnbGFuZyc6IDkwMDEsXG4gICAgJ3JhbmcnOiA5MDAyLFxuICAgICdsb3onOiA5Njc0LFxuICAgICdzcGFkZXMnOiA5ODI0LFxuICAgICdjbHVicyc6IDk4MjcsXG4gICAgJ2hlYXJ0cyc6IDk4MjksXG4gICAgJ2RpYW1zJzogOTgzMFxuICB9XG5cbiAgT2JqZWN0LmtleXMoc2F4LkVOVElUSUVTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZSA9IHNheC5FTlRJVElFU1trZXldXG4gICAgdmFyIHMgPSB0eXBlb2YgZSA9PT0gJ251bWJlcicgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpIDogZVxuICAgIHNheC5FTlRJVElFU1trZXldID0gc1xuICB9KVxuXG4gIGZvciAodmFyIHMgaW4gc2F4LlNUQVRFKSB7XG4gICAgc2F4LlNUQVRFW3NheC5TVEFURVtzXV0gPSBzXG4gIH1cblxuICAvLyBzaG9ydGhhbmRcbiAgUyA9IHNheC5TVEFURVxuXG4gIGZ1bmN0aW9uIGVtaXQgKHBhcnNlciwgZXZlbnQsIGRhdGEpIHtcbiAgICBwYXJzZXJbZXZlbnRdICYmIHBhcnNlcltldmVudF0oZGF0YSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXROb2RlIChwYXJzZXIsIG5vZGVUeXBlLCBkYXRhKSB7XG4gICAgaWYgKHBhcnNlci50ZXh0Tm9kZSkgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBlbWl0KHBhcnNlciwgbm9kZVR5cGUsIGRhdGEpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVRleHQgKHBhcnNlcikge1xuICAgIHBhcnNlci50ZXh0Tm9kZSA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBpZiAocGFyc2VyLnRleHROb2RlKSBlbWl0KHBhcnNlciwgJ29udGV4dCcsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBwYXJzZXIudGV4dE5vZGUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dG9wdHMgKG9wdCwgdGV4dCkge1xuICAgIGlmIChvcHQudHJpbSkgdGV4dCA9IHRleHQudHJpbSgpXG4gICAgaWYgKG9wdC5ub3JtYWxpemUpIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgIHJldHVybiB0ZXh0XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciAocGFyc2VyLCBlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICBlciArPSAnXFxuTGluZTogJyArIHBhcnNlci5saW5lICtcbiAgICAgICAgJ1xcbkNvbHVtbjogJyArIHBhcnNlci5jb2x1bW4gK1xuICAgICAgICAnXFxuQ2hhcjogJyArIHBhcnNlci5jXG4gICAgfVxuICAgIGVyID0gbmV3IEVycm9yKGVyKVxuICAgIHBhcnNlci5lcnJvciA9IGVyXG4gICAgZW1pdChwYXJzZXIsICdvbmVycm9yJywgZXIpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gZW5kIChwYXJzZXIpIHtcbiAgICBpZiAocGFyc2VyLnNhd1Jvb3QgJiYgIXBhcnNlci5jbG9zZWRSb290KSBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuY2xvc2VkIHJvb3QgdGFnJylcbiAgICBpZiAoKHBhcnNlci5zdGF0ZSAhPT0gUy5CRUdJTikgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuQkVHSU5fV0hJVEVTUEFDRSkgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuVEVYVCkpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgJ1VuZXhwZWN0ZWQgZW5kJylcbiAgICB9XG4gICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmNsb3NlZCA9IHRydWVcbiAgICBlbWl0KHBhcnNlciwgJ29uZW5kJylcbiAgICBTQVhQYXJzZXIuY2FsbChwYXJzZXIsIHBhcnNlci5zdHJpY3QsIHBhcnNlci5vcHQpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaWN0RmFpbCAocGFyc2VyLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJzZXIgIT09ICdvYmplY3QnIHx8ICEocGFyc2VyIGluc3RhbmNlb2YgU0FYUGFyc2VyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2FsbCB0byBzdHJpY3RGYWlsJylcbiAgICB9XG4gICAgaWYgKHBhcnNlci5zdHJpY3QpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgbWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnN0cmljdCkgcGFyc2VyLnRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVtwYXJzZXIubG9vc2VDYXNlXSgpXG4gICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0geyBuYW1lOiBwYXJzZXIudGFnTmFtZSwgYXR0cmlidXRlczoge30gfVxuXG4gICAgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGlmIHRhZyBjb250YWlscyBhbiB4bWxucz1cImZvb1wiIG9yIHhtbG5zOmZvbz1cImJhclwiXG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIHRhZy5ucyA9IHBhcmVudC5uc1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVudGFnc3RhcnQnLCB0YWcpXG4gIH1cblxuICBmdW5jdGlvbiBxbmFtZSAobmFtZSwgYXR0cmlidXRlKSB7XG4gICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoJzonKVxuICAgIHZhciBxdWFsTmFtZSA9IGkgPCAwID8gWyAnJywgbmFtZSBdIDogbmFtZS5zcGxpdCgnOicpXG4gICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lWzBdXG4gICAgdmFyIGxvY2FsID0gcXVhbE5hbWVbMV1cblxuICAgIC8vIDx4IFwieG1sbnNcIj1cImh0dHA6Ly9mb29cIj5cbiAgICBpZiAoYXR0cmlidXRlICYmIG5hbWUgPT09ICd4bWxucycpIHtcbiAgICAgIHByZWZpeCA9ICd4bWxucydcbiAgICAgIGxvY2FsID0gJydcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcmVmaXg6IHByZWZpeCwgbG9jYWw6IGxvY2FsIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJpYiAocGFyc2VyKSB7XG4gICAgaWYgKCFwYXJzZXIuc3RyaWN0KSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJOYW1lW3BhcnNlci5sb29zZUNhc2VdKClcbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLmF0dHJpYkxpc3QuaW5kZXhPZihwYXJzZXIuYXR0cmliTmFtZSkgIT09IC0xIHx8XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocGFyc2VyLmF0dHJpYk5hbWUpKSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLmF0dHJpYk5hbWUsIHRydWUpXG4gICAgICB2YXIgcHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB2YXIgbG9jYWwgPSBxbi5sb2NhbFxuXG4gICAgICBpZiAocHJlZml4ID09PSAneG1sbnMnKSB7XG4gICAgICAgIC8vIG5hbWVzcGFjZSBiaW5kaW5nIGF0dHJpYnV0ZS4gcHVzaCB0aGUgYmluZGluZyBpbnRvIHNjb3BlXG4gICAgICAgIGlmIChsb2NhbCA9PT0gJ3htbCcgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsXG4gICAgICAgICAgICAneG1sOiBwcmVmaXggbXVzdCBiZSBib3VuZCB0byAnICsgWE1MX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWwgPT09ICd4bWxucycgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxOU19OQU1FU1BBQ0UpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlcixcbiAgICAgICAgICAgICd4bWxuczogcHJlZml4IG11c3QgYmUgYm91bmQgdG8gJyArIFhNTE5TX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgICAgICAgaWYgKHRhZy5ucyA9PT0gcGFyZW50Lm5zKSB7XG4gICAgICAgICAgICB0YWcubnMgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5ucylcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFnLm5zW2xvY2FsXSA9IHBhcnNlci5hdHRyaWJWYWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZmVyIG9uYXR0cmlidXRlIGV2ZW50cyB1bnRpbCBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2VlblxuICAgICAgLy8gc28gYW55IG5ldyBiaW5kaW5ncyBjYW4gdGFrZSBlZmZlY3QuIHByZXNlcnZlIGF0dHJpYnV0ZSBvcmRlclxuICAgICAgLy8gc28gZGVmZXJyZWQgZXZlbnRzIGNhbiBiZSBlbWl0dGVkIGluIGRvY3VtZW50IG9yZGVyXG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5wdXNoKFtwYXJzZXIuYXR0cmliTmFtZSwgcGFyc2VyLmF0dHJpYlZhbHVlXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gbm9uLXhtbG5zIG1vZGUsIHdlIGNhbiBlbWl0IHRoZSBldmVudCByaWdodCBhd2F5XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXNbcGFyc2VyLmF0dHJpYk5hbWVdID0gcGFyc2VyLmF0dHJpYlZhbHVlXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIHtcbiAgICAgICAgbmFtZTogcGFyc2VyLmF0dHJpYk5hbWUsXG4gICAgICAgIHZhbHVlOiBwYXJzZXIuYXR0cmliVmFsdWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblRhZyAocGFyc2VyLCBzZWxmQ2xvc2luZykge1xuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICAvLyBlbWl0IG5hbWVzcGFjZSBiaW5kaW5nIGV2ZW50c1xuICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcblxuICAgICAgLy8gYWRkIG5hbWVzcGFjZSBpbmZvIHRvIHRhZ1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLnRhZ05hbWUpXG4gICAgICB0YWcucHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB0YWcubG9jYWwgPSBxbi5sb2NhbFxuICAgICAgdGFnLnVyaSA9IHRhZy5uc1txbi5wcmVmaXhdIHx8ICcnXG5cbiAgICAgIGlmICh0YWcucHJlZml4ICYmICF0YWcudXJpKSB7XG4gICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5ib3VuZCBuYW1lc3BhY2UgcHJlZml4OiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJzZXIudGFnTmFtZSkpXG4gICAgICAgIHRhZy51cmkgPSBxbi5wcmVmaXhcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHRhZy5ucyAmJiBwYXJlbnQubnMgIT09IHRhZy5ucykge1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW5uYW1lc3BhY2UnLCB7XG4gICAgICAgICAgICBwcmVmaXg6IHAsXG4gICAgICAgICAgICB1cmk6IHRhZy5uc1twXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBkZWZlcnJlZCBvbmF0dHJpYnV0ZSBldmVudHNcbiAgICAgIC8vIE5vdGU6IGRvIG5vdCBhcHBseSBkZWZhdWx0IG5zIHRvIGF0dHJpYnV0ZXM6XG4gICAgICAvLyAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI2RlZmF1bHRpbmdcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBudiA9IHBhcnNlci5hdHRyaWJMaXN0W2ldXG4gICAgICAgIHZhciBuYW1lID0gbnZbMF1cbiAgICAgICAgdmFyIHZhbHVlID0gbnZbMV1cbiAgICAgICAgdmFyIHF1YWxOYW1lID0gcW5hbWUobmFtZSwgdHJ1ZSlcbiAgICAgICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lLnByZWZpeFxuICAgICAgICB2YXIgbG9jYWwgPSBxdWFsTmFtZS5sb2NhbFxuICAgICAgICB2YXIgdXJpID0gcHJlZml4ID09PSAnJyA/ICcnIDogKHRhZy5uc1twcmVmaXhdIHx8ICcnKVxuICAgICAgICB2YXIgYSA9IHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICBsb2NhbDogbG9jYWwsXG4gICAgICAgICAgdXJpOiB1cmlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGF0dHJpYnV0ZXMgd2l0aCBhbiB1bmRlZmluZWQgbmFtZXNwYWNlLFxuICAgICAgICAvLyB0aGVuIGZhaWwgb24gdGhlbSBub3cuXG4gICAgICAgIGlmIChwcmVmaXggJiYgcHJlZml4ICE9PSAneG1sbnMnICYmICF1cmkpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuYm91bmQgbmFtZXNwYWNlIHByZWZpeDogJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcmVmaXgpKVxuICAgICAgICAgIGEudXJpID0gcHJlZml4XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzW25hbWVdID0gYVxuICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIGEpXG4gICAgICB9XG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgfVxuXG4gICAgcGFyc2VyLnRhZy5pc1NlbGZDbG9zaW5nID0gISFzZWxmQ2xvc2luZ1xuXG4gICAgLy8gcHJvY2VzcyB0aGUgdGFnXG4gICAgcGFyc2VyLnNhd1Jvb3QgPSB0cnVlXG4gICAgcGFyc2VyLnRhZ3MucHVzaChwYXJzZXIudGFnKVxuICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbnRhZycsIHBhcnNlci50YWcpXG4gICAgaWYgKCFzZWxmQ2xvc2luZykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciA8c2NyaXB0PiBpbiBub24tc3RyaWN0IG1vZGUuXG4gICAgICBpZiAoIXBhcnNlci5ub3NjcmlwdCAmJiBwYXJzZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc2NyaXB0Jykge1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICB9XG4gICAgICBwYXJzZXIudGFnID0gbnVsbFxuICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnRhZ05hbWUpIHtcbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnV2VpcmQgZW1wdHkgY2xvc2UgdGFnLicpXG4gICAgICBwYXJzZXIudGV4dE5vZGUgKz0gJzwvPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcnNlci5zY3JpcHQpIHtcbiAgICAgIGlmIChwYXJzZXIudGFnTmFtZSAhPT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBjbG9zaW5nIHRhZyBhY3R1YWxseSBleGlzdHMuXG4gICAgLy8gPGE+PGI+PC9jPjwvYj48L2E+IHdpbGwgY2xvc2UgZXZlcnl0aGluZywgb3RoZXJ3aXNlLlxuICAgIHZhciB0ID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgdmFyIHRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVxuICAgIGlmICghcGFyc2VyLnN0cmljdCkge1xuICAgICAgdGFnTmFtZSA9IHRhZ05hbWVbcGFyc2VyLmxvb3NlQ2FzZV0oKVxuICAgIH1cbiAgICB2YXIgY2xvc2VUbyA9IHRhZ05hbWVcbiAgICB3aGlsZSAodC0tKSB7XG4gICAgICB2YXIgY2xvc2UgPSBwYXJzZXIudGFnc1t0XVxuICAgICAgaWYgKGNsb3NlLm5hbWUgIT09IGNsb3NlVG8pIHtcbiAgICAgICAgLy8gZmFpbCB0aGUgZmlyc3QgdGltZSBpbiBzdHJpY3QgbW9kZVxuICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuZXhwZWN0ZWQgY2xvc2UgdGFnJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGlkbid0IGZpbmQgaXQuICB3ZSBhbHJlYWR5IGZhaWxlZCBmb3Igc3RyaWN0LCBzbyBqdXN0IGFib3J0LlxuICAgIGlmICh0IDwgMCkge1xuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbm1hdGNoZWQgY2xvc2luZyB0YWc6ICcgKyBwYXJzZXIudGFnTmFtZSlcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHBhcnNlci50YWdOYW1lID0gdGFnTmFtZVxuICAgIHZhciBzID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgd2hpbGUgKHMtLSA+IHQpIHtcbiAgICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0gcGFyc2VyLnRhZ3MucG9wKClcbiAgICAgIHBhcnNlci50YWdOYW1lID0gcGFyc2VyLnRhZy5uYW1lXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NldGFnJywgcGFyc2VyLnRhZ05hbWUpXG5cbiAgICAgIHZhciB4ID0ge31cbiAgICAgIGZvciAodmFyIGkgaW4gdGFnLm5zKSB7XG4gICAgICAgIHhbaV0gPSB0YWcubnNbaV1cbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHBhcnNlci5vcHQueG1sbnMgJiYgdGFnLm5zICE9PSBwYXJlbnQubnMpIHtcbiAgICAgICAgLy8gcmVtb3ZlIG5hbWVzcGFjZSBiaW5kaW5ncyBpbnRyb2R1Y2VkIGJ5IHRhZ1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgbiA9IHRhZy5uc1twXVxuICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2xvc2VuYW1lc3BhY2UnLCB7IHByZWZpeDogcCwgdXJpOiBuIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ID09PSAwKSBwYXJzZXIuY2xvc2VkUm9vdCA9IHRydWVcbiAgICBwYXJzZXIudGFnTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9IHBhcnNlci5hdHRyaWJOYW1lID0gJydcbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUVudGl0eSAocGFyc2VyKSB7XG4gICAgdmFyIGVudGl0eSA9IHBhcnNlci5lbnRpdHlcbiAgICB2YXIgZW50aXR5TEMgPSBlbnRpdHkudG9Mb3dlckNhc2UoKVxuICAgIHZhciBudW1cbiAgICB2YXIgbnVtU3RyID0gJydcblxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5XSkge1xuICAgICAgcmV0dXJuIHBhcnNlci5FTlRJVElFU1tlbnRpdHldXG4gICAgfVxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5TENdKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLkVOVElUSUVTW2VudGl0eUxDXVxuICAgIH1cbiAgICBlbnRpdHkgPSBlbnRpdHlMQ1xuICAgIGlmIChlbnRpdHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGlmIChlbnRpdHkuY2hhckF0KDEpID09PSAneCcpIHtcbiAgICAgICAgZW50aXR5ID0gZW50aXR5LnNsaWNlKDIpXG4gICAgICAgIG51bSA9IHBhcnNlSW50KGVudGl0eSwgMTYpXG4gICAgICAgIG51bVN0ciA9IG51bS50b1N0cmluZygxNilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudGl0eSA9IGVudGl0eS5zbGljZSgxKVxuICAgICAgICBudW0gPSBwYXJzZUludChlbnRpdHksIDEwKVxuICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoMTApXG4gICAgICB9XG4gICAgfVxuICAgIGVudGl0eSA9IGVudGl0eS5yZXBsYWNlKC9eMCsvLCAnJylcbiAgICBpZiAoaXNOYU4obnVtKSB8fCBudW1TdHIudG9Mb3dlckNhc2UoKSAhPT0gZW50aXR5KSB7XG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGVudGl0eScpXG4gICAgICByZXR1cm4gJyYnICsgcGFyc2VyLmVudGl0eSArICc7J1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChudW0pXG4gIH1cblxuICBmdW5jdGlvbiBiZWdpbldoaXRlU3BhY2UgKHBhcnNlciwgYykge1xuICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9XQUtBXG4gICAgICBwYXJzZXIuc3RhcnRUYWdQb3NpdGlvbiA9IHBhcnNlci5wb3NpdGlvblxuICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgLy8gaGF2ZSB0byBwcm9jZXNzIHRoaXMgYXMgYSB0ZXh0IG5vZGUuXG4gICAgICAvLyB3ZWlyZCwgYnV0IGhhcHBlbnMuXG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vbi13aGl0ZXNwYWNlIGJlZm9yZSBmaXJzdCB0YWcuJylcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSA9IGNcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoYXJBdCAoY2h1bmssIGkpIHtcbiAgICB2YXIgcmVzdWx0ID0gJydcbiAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gY2h1bmsuY2hhckF0KGkpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlIChjaHVuaykge1xuICAgIHZhciBwYXJzZXIgPSB0aGlzXG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuZXJyb3JcbiAgICB9XG4gICAgaWYgKHBhcnNlci5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBlcnJvcihwYXJzZXIsXG4gICAgICAgICdDYW5ub3Qgd3JpdGUgYWZ0ZXIgY2xvc2UuIEFzc2lnbiBhbiBvbnJlYWR5IGhhbmRsZXIuJylcbiAgICB9XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5kKHBhcnNlcilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNodW5rID0gY2h1bmsudG9TdHJpbmcoKVxuICAgIH1cbiAgICB2YXIgaSA9IDBcbiAgICB2YXIgYyA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGMgPSBjaGFyQXQoY2h1bmssIGkrKylcbiAgICAgIHBhcnNlci5jID0gY1xuXG4gICAgICBpZiAoIWMpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbisrXG4gICAgICAgIGlmIChjID09PSAnXFxuJykge1xuICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICBwYXJzZXIuY29sdW1uID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocGFyc2VyLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgUy5CRUdJTjpcbiAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOX1dISVRFU1BBQ0VcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcdUZFRkYnKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBiZWdpbldoaXRlU3BhY2UocGFyc2VyLCBjKVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkJFR0lOX1dISVRFU1BBQ0U6XG4gICAgICAgICAgYmVnaW5XaGl0ZVNwYWNlKHBhcnNlciwgYylcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5URVhUOlxuICAgICAgICAgIGlmIChwYXJzZXIuc2F3Um9vdCAmJiAhcGFyc2VyLmNsb3NlZFJvb3QpIHtcbiAgICAgICAgICAgIHZhciBzdGFydGkgPSBpIC0gMVxuICAgICAgICAgICAgd2hpbGUgKGMgJiYgYyAhPT0gJzwnICYmIGMgIT09ICcmJykge1xuICAgICAgICAgICAgICBjID0gY2hhckF0KGNodW5rLCBpKyspXG4gICAgICAgICAgICAgIGlmIChjICYmIHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnBvc2l0aW9uKytcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4gPSAwXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNodW5rLnN1YnN0cmluZyhzdGFydGksIGkgLSAxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gJzwnICYmICEocGFyc2VyLnNhd1Jvb3QgJiYgcGFyc2VyLmNsb3NlZFJvb3QgJiYgIXBhcnNlci5zdHJpY3QpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fV0FLQVxuICAgICAgICAgICAgcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb24gPSBwYXJzZXIucG9zaXRpb25cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykgJiYgKCFwYXJzZXIuc2F3Um9vdCB8fCBwYXJzZXIuY2xvc2VkUm9vdCkpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdUZXh0IGRhdGEgb3V0c2lkZSBvZiByb290IG5vZGUuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUX0VOVElUWVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUOlxuICAgICAgICAgIC8vIG9ubHkgbm9uLXN0cmljdFxuICAgICAgICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNMT1NFX1RBR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLk9QRU5fV0FLQTpcbiAgICAgICAgICAvLyBlaXRoZXIgYSAvLCA/LCAhLCBvciB0ZXh0IGlzIGNvbWluZyBuZXh0LlxuICAgICAgICAgIGlmIChjID09PSAnIScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0dNTF9ERUNMXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciBpdC4uLlxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHXG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9IGNcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmVuY29kZWQgPCcpXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgc29tZSB3aGl0ZXNwYWNlLCB0aGVuIGFkZCB0aGF0IGluLlxuICAgICAgICAgICAgaWYgKHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uICsgMSA8IHBhcnNlci5wb3NpdGlvbikge1xuICAgICAgICAgICAgICB2YXIgcGFkID0gcGFyc2VyLnBvc2l0aW9uIC0gcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb25cbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheShwYWQpLmpvaW4oJyAnKSArIGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPCcgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0dNTF9ERUNMOlxuICAgICAgICAgIGlmICgocGFyc2VyLnNnbWxEZWNsICsgYykudG9VcHBlckNhc2UoKSA9PT0gQ0RBVEEpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbmNkYXRhJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLnNnbWxEZWNsICsgYyA9PT0gJy0tJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcnNlci5zZ21sRGVjbCArIGMpLnRvVXBwZXJDYXNlKCkgPT09IERPQ1RZUEUpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRVxuICAgICAgICAgICAgaWYgKHBhcnNlci5kb2N0eXBlIHx8IHBhcnNlci5zYXdSb290KSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLFxuICAgICAgICAgICAgICAgICdJbmFwcHJvcHJpYXRlbHkgbG9jYXRlZCBkb2N0eXBlIGRlY2xhcmF0aW9uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci5kb2N0eXBlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2dtbGRlY2xhcmF0aW9uJywgcGFyc2VyLnNnbWxEZWNsKVxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TR01MX0RFQ0xfUVVPVEVEOlxuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VyLnNnbWxEZWNsICs9IGNcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25kb2N0eXBlJywgcGFyc2VyLmRvY3R5cGUpXG4gICAgICAgICAgICBwYXJzZXIuZG9jdHlwZSA9IHRydWUgLy8ganVzdCByZW1lbWJlciB0aGF0IHdlIHNhdyBpdC5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgICAgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfRFREXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX1FVT1RFRFxuICAgICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9RVU9URUQ6XG4gICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEVfRFREOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9EVERfUVVPVEVEOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVDpcbiAgICAgICAgICBpZiAoYyA9PT0gJy0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICctJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UX0VOREVEXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgaWYgKHBhcnNlci5jb21tZW50KSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY29tbWVudCcsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgPSAnJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRFRDpcbiAgICAgICAgICBpZiAoYyAhPT0gJz4nKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ01hbGZvcm1lZCBjb21tZW50JylcbiAgICAgICAgICAgIC8vIGFsbG93IDwhLS0gYmxhaCAtLSBibG9vIC0tPiBpbiBub24tc3RyaWN0IG1vZGUsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyBhIGNvbW1lbnQgb2YgXCIgYmxhaCAtLSBibG9vIFwiXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLS0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQTpcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQV9FTkRJTkdfMlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkdfMjpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyLmNkYXRhKSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NlY2RhdGEnKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSAnXV0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5QUk9DX0lOU1Q6XG4gICAgICAgICAgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0TmFtZSArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlBST0NfSU5TVF9CT0RZOlxuICAgICAgICAgIGlmICghcGFyc2VyLnByb2NJbnN0Qm9keSAmJiBpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuUFJPQ19JTlNUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnByb2Nlc3NpbmdpbnN0cnVjdGlvbicsIHtcbiAgICAgICAgICAgICAgbmFtZTogcGFyc2VyLnByb2NJbnN0TmFtZSxcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VyLnByb2NJbnN0Qm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9ICc/JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuT1BFTl9UQUc6XG4gICAgICAgICAgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1RhZyhwYXJzZXIpXG4gICAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIHRhZyBuYW1lJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5PUEVOX1RBR19TTEFTSDpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlciwgdHJ1ZSlcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdGb3J3YXJkLXNsYXNoIGluIG9wZW5pbmcgdGFnIG5vdCBmb2xsb3dlZCBieSA+JylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQjpcbiAgICAgICAgICAvLyBoYXZlbid0IHJlYWQgdGhlIGF0dHJpYnV0ZSBuYW1lIHlldC5cbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IGNcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FOlxuICAgICAgICAgIGlmIChjID09PSAnPScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnQXR0cmlidXRlIHdpdGhvdXQgdmFsdWUnKVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gcGFyc2VyLmF0dHJpYk5hbWVcbiAgICAgICAgICAgIGF0dHJpYihwYXJzZXIpXG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRV9TQVdfV0hJVEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FX1NBV19XSElURTpcbiAgICAgICAgICBpZiAoYyA9PT0gJz0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0F0dHJpYnV0ZSB3aXRob3V0IHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlc1twYXJzZXIuYXR0cmliTmFtZV0gPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uYXR0cmlidXRlJywge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJzZXIuYXR0cmliTmFtZSxcbiAgICAgICAgICAgICAgdmFsdWU6ICcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSAnJ1xuICAgICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5xID0gY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9RVU9URUQ6XG4gICAgICAgICAgaWYgKGMgIT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX0VOVElUWV9RXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgKz0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgYXR0cmliKHBhcnNlcilcbiAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfQ0xPU0VEXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0NMT1NFRDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vIHdoaXRlc3BhY2UgYmV0d2VlbiBhdHRyaWJ1dGVzJylcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEOlxuICAgICAgICAgIGlmICghaXNBdHRyaWJFbmQoYykpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfRU5USVRZX1VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSArPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhdHRyaWIocGFyc2VyKVxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DTE9TRV9UQUc6XG4gICAgICAgICAgaWYgKCFwYXJzZXIudGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChub3RNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgY1xuICAgICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcuJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8LycgKyBwYXJzZXIudGFnTmFtZVxuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdfU0FXX1dISVRFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNMT1NFX1RBR19TQVdfV0hJVEU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgY2xvc2VUYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjbG9zaW5nIHRhZycpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9ROlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9VOlxuICAgICAgICAgIHZhciByZXR1cm5TdGF0ZVxuICAgICAgICAgIHZhciBidWZmZXJcbiAgICAgICAgICBzd2l0Y2ggKHBhcnNlci5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICAgICAgICByZXR1cm5TdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgICBidWZmZXIgPSAndGV4dE5vZGUnXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1E6XG4gICAgICAgICAgICAgIHJldHVyblN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICdhdHRyaWJWYWx1ZSdcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfVTpcbiAgICAgICAgICAgICAgcmV0dXJuU3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9VTlFVT1RFRFxuICAgICAgICAgICAgICBidWZmZXIgPSAnYXR0cmliVmFsdWUnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09ICc7Jykge1xuICAgICAgICAgICAgcGFyc2VyW2J1ZmZlcl0gKz0gcGFyc2VFbnRpdHkocGFyc2VyKVxuICAgICAgICAgICAgcGFyc2VyLmVudGl0eSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSByZXR1cm5TdGF0ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChwYXJzZXIuZW50aXR5Lmxlbmd0aCA/IGVudGl0eUJvZHkgOiBlbnRpdHlTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5lbnRpdHkgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIGVudGl0eSBuYW1lJylcbiAgICAgICAgICAgIHBhcnNlcltidWZmZXJdICs9ICcmJyArIHBhcnNlci5lbnRpdHkgKyBjXG4gICAgICAgICAgICBwYXJzZXIuZW50aXR5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IHJldHVyblN0YXRlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwYXJzZXIsICdVbmtub3duIHN0YXRlOiAnICsgcGFyc2VyLnN0YXRlKVxuICAgICAgfVxuICAgIH0gLy8gd2hpbGVcblxuICAgIGlmIChwYXJzZXIucG9zaXRpb24gPj0gcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24pIHtcbiAgICAgIGNoZWNrQnVmZmVyTGVuZ3RoKHBhcnNlcilcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLyohIGh0dHA6Ly9tdGhzLmJlL2Zyb21jb2RlcG9pbnQgdjAuMS4wIGJ5IEBtYXRoaWFzICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3JcbiAgICAgIHZhciBmcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUFYX1NJWkUgPSAweDQwMDBcbiAgICAgICAgdmFyIGNvZGVVbml0cyA9IFtdXG4gICAgICAgIHZhciBoaWdoU3Vycm9nYXRlXG4gICAgICAgIHZhciBsb3dTdXJyb2dhdGVcbiAgICAgICAgdmFyIGluZGV4ID0gLTFcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gJydcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRmluaXRlKGNvZGVQb2ludCkgfHwgLy8gYE5hTmAsIGArSW5maW5pdHlgLCBvciBgLUluZmluaXR5YFxuICAgICAgICAgICAgY29kZVBvaW50IDwgMCB8fCAvLyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGNvZGVQb2ludCA+IDB4MTBGRkZGIHx8IC8vIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludFxuICAgICAgICAgICAgZmxvb3IoY29kZVBvaW50KSAhPT0gY29kZVBvaW50IC8vIG5vdCBhbiBpbnRlZ2VyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQ6ICcgKyBjb2RlUG9pbnQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhGRkZGKSB7IC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpXG4gICAgICAgICAgfSBlbHNlIHsgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwXG4gICAgICAgICAgICBsb3dTdXJyb2dhdGUgPSAoY29kZVBvaW50ICUgMHg0MDApICsgMHhEQzAwXG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmdGcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKVxuICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZywgJ2Zyb21Db2RlUG9pbnQnLCB7XG4gICAgICAgICAgdmFsdWU6IGZyb21Db2RlUG9pbnQsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdHJpbmcuZnJvbUNvZGVQb2ludCA9IGZyb21Db2RlUG9pbnRcbiAgICAgIH1cbiAgICB9KCkpXG4gIH1cbn0pKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/IHRoaXMuc2F4ID0ge30gOiBleHBvcnRzKVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCJ2YXIgQ2xpZW50UmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL3JlcXVlc3QnKVxudmFyIHJlc3BvbnNlID0gcmVxdWlyZSgnLi9saWIvcmVzcG9uc2UnKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJylcbnZhciBzdGF0dXNDb2RlcyA9IHJlcXVpcmUoJ2J1aWx0aW4tc3RhdHVzLWNvZGVzJylcbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKVxuXG52YXIgaHR0cCA9IGV4cG9ydHNcblxuaHR0cC5yZXF1ZXN0ID0gZnVuY3Rpb24gKG9wdHMsIGNiKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpXG5cdFx0b3B0cyA9IHVybC5wYXJzZShvcHRzKVxuXHRlbHNlXG5cdFx0b3B0cyA9IGV4dGVuZChvcHRzKVxuXG5cdC8vIE5vcm1hbGx5LCB0aGUgcGFnZSBpcyBsb2FkZWQgZnJvbSBodHRwIG9yIGh0dHBzLCBzbyBub3Qgc3BlY2lmeWluZyBhIHByb3RvY29sXG5cdC8vIHdpbGwgcmVzdWx0IGluIGEgKHZhbGlkKSBwcm90b2NvbC1yZWxhdGl2ZSB1cmwuIEhvd2V2ZXIsIHRoaXMgd29uJ3Qgd29yayBpZlxuXHQvLyB0aGUgcHJvdG9jb2wgaXMgc29tZXRoaW5nIGVsc2UsIGxpa2UgJ2ZpbGU6J1xuXHR2YXIgZGVmYXVsdFByb3RvY29sID0gZ2xvYmFsLmxvY2F0aW9uLnByb3RvY29sLnNlYXJjaCgvXmh0dHBzPzokLykgPT09IC0xID8gJ2h0dHA6JyA6ICcnXG5cblx0dmFyIHByb3RvY29sID0gb3B0cy5wcm90b2NvbCB8fCBkZWZhdWx0UHJvdG9jb2xcblx0dmFyIGhvc3QgPSBvcHRzLmhvc3RuYW1lIHx8IG9wdHMuaG9zdFxuXHR2YXIgcG9ydCA9IG9wdHMucG9ydFxuXHR2YXIgcGF0aCA9IG9wdHMucGF0aCB8fCAnLydcblxuXHQvLyBOZWNlc3NhcnkgZm9yIElQdjYgYWRkcmVzc2VzXG5cdGlmIChob3N0ICYmIGhvc3QuaW5kZXhPZignOicpICE9PSAtMSlcblx0XHRob3N0ID0gJ1snICsgaG9zdCArICddJ1xuXG5cdC8vIFRoaXMgbWF5IGJlIGEgcmVsYXRpdmUgdXJsLiBUaGUgYnJvd3NlciBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gaW50ZXJwcmV0IGl0IGNvcnJlY3RseS5cblx0b3B0cy51cmwgPSAoaG9zdCA/IChwcm90b2NvbCArICcvLycgKyBob3N0KSA6ICcnKSArIChwb3J0ID8gJzonICsgcG9ydCA6ICcnKSArIHBhdGhcblx0b3B0cy5tZXRob2QgPSAob3B0cy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKClcblx0b3B0cy5oZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cblx0Ly8gQWxzbyB2YWxpZCBvcHRzLmF1dGgsIG9wdHMubW9kZVxuXG5cdHZhciByZXEgPSBuZXcgQ2xpZW50UmVxdWVzdChvcHRzKVxuXHRpZiAoY2IpXG5cdFx0cmVxLm9uKCdyZXNwb25zZScsIGNiKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvcHRzLCBjYikge1xuXHR2YXIgcmVxID0gaHR0cC5yZXF1ZXN0KG9wdHMsIGNiKVxuXHRyZXEuZW5kKClcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLkNsaWVudFJlcXVlc3QgPSBDbGllbnRSZXF1ZXN0XG5odHRwLkluY29taW5nTWVzc2FnZSA9IHJlc3BvbnNlLkluY29taW5nTWVzc2FnZVxuXG5odHRwLkFnZW50ID0gZnVuY3Rpb24gKCkge31cbmh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHMgPSA0XG5cbmh0dHAuZ2xvYmFsQWdlbnQgPSBuZXcgaHR0cC5BZ2VudCgpXG5cbmh0dHAuU1RBVFVTX0NPREVTID0gc3RhdHVzQ29kZXNcblxuaHR0cC5NRVRIT0RTID0gW1xuXHQnQ0hFQ0tPVVQnLFxuXHQnQ09OTkVDVCcsXG5cdCdDT1BZJyxcblx0J0RFTEVURScsXG5cdCdHRVQnLFxuXHQnSEVBRCcsXG5cdCdMT0NLJyxcblx0J00tU0VBUkNIJyxcblx0J01FUkdFJyxcblx0J01LQUNUSVZJVFknLFxuXHQnTUtDT0wnLFxuXHQnTU9WRScsXG5cdCdOT1RJRlknLFxuXHQnT1BUSU9OUycsXG5cdCdQQVRDSCcsXG5cdCdQT1NUJyxcblx0J1BST1BGSU5EJyxcblx0J1BST1BQQVRDSCcsXG5cdCdQVVJHRScsXG5cdCdQVVQnLFxuXHQnUkVQT1JUJyxcblx0J1NFQVJDSCcsXG5cdCdTVUJTQ1JJQkUnLFxuXHQnVFJBQ0UnLFxuXHQnVU5MT0NLJyxcblx0J1VOU1VCU0NSSUJFJ1xuXSIsImV4cG9ydHMuZmV0Y2ggPSBpc0Z1bmN0aW9uKGdsb2JhbC5mZXRjaCkgJiYgaXNGdW5jdGlvbihnbG9iYWwuUmVhZGFibGVTdHJlYW0pXG5cbmV4cG9ydHMud3JpdGFibGVTdHJlYW0gPSBpc0Z1bmN0aW9uKGdsb2JhbC5Xcml0YWJsZVN0cmVhbSlcblxuZXhwb3J0cy5hYm9ydENvbnRyb2xsZXIgPSBpc0Z1bmN0aW9uKGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG5cbmV4cG9ydHMuYmxvYkNvbnN0cnVjdG9yID0gZmFsc2VcbnRyeSB7XG5cdG5ldyBCbG9iKFtuZXcgQXJyYXlCdWZmZXIoMSldKVxuXHRleHBvcnRzLmJsb2JDb25zdHJ1Y3RvciA9IHRydWVcbn0gY2F0Y2ggKGUpIHt9XG5cbi8vIFRoZSB4aHIgcmVxdWVzdCB0byBleGFtcGxlLmNvbSBtYXkgdmlvbGF0ZSBzb21lIHJlc3RyaWN0aXZlIENTUCBjb25maWd1cmF0aW9ucyxcbi8vIHNvIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgYGZldGNoYCwgYXZvaWQgY2FsbGluZyBnZXRYSFIoKVxuLy8gYW5kIGFzc3VtZSBzdXBwb3J0IGZvciBjZXJ0YWluIGZlYXR1cmVzIGJlbG93LlxudmFyIHhoclxuZnVuY3Rpb24gZ2V0WEhSICgpIHtcblx0Ly8gQ2FjaGUgdGhlIHhociB2YWx1ZVxuXHRpZiAoeGhyICE9PSB1bmRlZmluZWQpIHJldHVybiB4aHJcblxuXHRpZiAoZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KSB7XG5cdFx0eGhyID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpXG5cdFx0Ly8gSWYgWERvbWFpblJlcXVlc3QgaXMgYXZhaWxhYmxlIChpZSBvbmx5LCB3aGVyZSB4aHIgbWlnaHQgbm90IHdvcmtcblx0XHQvLyBjcm9zcyBkb21haW4pLCB1c2UgdGhlIHBhZ2UgbG9jYXRpb24uIE90aGVyd2lzZSB1c2UgZXhhbXBsZS5jb21cblx0XHQvLyBOb3RlOiB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgbWFrZSBhbiBodHRwIHJlcXVlc3QuXG5cdFx0dHJ5IHtcblx0XHRcdHhoci5vcGVuKCdHRVQnLCBnbG9iYWwuWERvbWFpblJlcXVlc3QgPyAnLycgOiAnaHR0cHM6Ly9leGFtcGxlLmNvbScpXG5cdFx0fSBjYXRjaChlKSB7XG5cdFx0XHR4aHIgPSBudWxsXG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIFNlcnZpY2Ugd29ya2VycyBkb24ndCBoYXZlIFhIUlxuXHRcdHhociA9IG51bGxcblx0fVxuXHRyZXR1cm4geGhyXG59XG5cbmZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQgKHR5cGUpIHtcblx0dmFyIHhociA9IGdldFhIUigpXG5cdGlmICgheGhyKSByZXR1cm4gZmFsc2Vcblx0dHJ5IHtcblx0XHR4aHIucmVzcG9uc2VUeXBlID0gdHlwZVxuXHRcdHJldHVybiB4aHIucmVzcG9uc2VUeXBlID09PSB0eXBlXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZVxufVxuXG4vLyBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgU2FmYXJpIDcuMCByZXBvcnRzIHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdvYmplY3QnLlxuLy8gU2FmYXJpIDcuMSBhcHBlYXJzIHRvIGhhdmUgZml4ZWQgdGhpcyBidWcuXG52YXIgaGF2ZUFycmF5QnVmZmVyID0gdHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbnZhciBoYXZlU2xpY2UgPSBoYXZlQXJyYXlCdWZmZXIgJiYgaXNGdW5jdGlvbihnbG9iYWwuQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKVxuXG4vLyBJZiBmZXRjaCBpcyBzdXBwb3J0ZWQsIHRoZW4gYXJyYXlidWZmZXIgd2lsbCBiZSBzdXBwb3J0ZWQgdG9vLiBTa2lwIGNhbGxpbmdcbi8vIGNoZWNrVHlwZVN1cHBvcnQoKSwgc2luY2UgdGhhdCBjYWxscyBnZXRYSFIoKS5cbmV4cG9ydHMuYXJyYXlidWZmZXIgPSBleHBvcnRzLmZldGNoIHx8IChoYXZlQXJyYXlCdWZmZXIgJiYgY2hlY2tUeXBlU3VwcG9ydCgnYXJyYXlidWZmZXInKSlcblxuLy8gVGhlc2UgbmV4dCB0d28gdGVzdHMgdW5hdm9pZGFibHkgc2hvdyB3YXJuaW5ncyBpbiBDaHJvbWUuIFNpbmNlIGZldGNoIHdpbGwgYWx3YXlzXG4vLyBiZSB1c2VkIGlmIGl0J3MgYXZhaWxhYmxlLCBqdXN0IHJldHVybiBmYWxzZSBmb3IgdGhlc2UgdG8gYXZvaWQgdGhlIHdhcm5pbmdzLlxuZXhwb3J0cy5tc3N0cmVhbSA9ICFleHBvcnRzLmZldGNoICYmIGhhdmVTbGljZSAmJiBjaGVja1R5cGVTdXBwb3J0KCdtcy1zdHJlYW0nKVxuZXhwb3J0cy5tb3pjaHVua2VkYXJyYXlidWZmZXIgPSAhZXhwb3J0cy5mZXRjaCAmJiBoYXZlQXJyYXlCdWZmZXIgJiZcblx0Y2hlY2tUeXBlU3VwcG9ydCgnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKVxuXG4vLyBJZiBmZXRjaCBpcyBzdXBwb3J0ZWQsIHRoZW4gb3ZlcnJpZGVNaW1lVHlwZSB3aWxsIGJlIHN1cHBvcnRlZCB0b28uIFNraXAgY2FsbGluZ1xuLy8gZ2V0WEhSKCkuXG5leHBvcnRzLm92ZXJyaWRlTWltZVR5cGUgPSBleHBvcnRzLmZldGNoIHx8IChnZXRYSFIoKSA/IGlzRnVuY3Rpb24oZ2V0WEhSKCkub3ZlcnJpZGVNaW1lVHlwZSkgOiBmYWxzZSlcblxuZXhwb3J0cy52YkFycmF5ID0gaXNGdW5jdGlvbihnbG9iYWwuVkJBcnJheSlcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG54aHIgPSBudWxsIC8vIEhlbHAgZ2NcbiIsInZhciBjYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9jYXBhYmlsaXR5JylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG52YXIgdG9BcnJheUJ1ZmZlciA9IHJlcXVpcmUoJ3RvLWFycmF5YnVmZmVyJylcblxudmFyIEluY29taW5nTWVzc2FnZSA9IHJlc3BvbnNlLkluY29taW5nTWVzc2FnZVxudmFyIHJTdGF0ZXMgPSByZXNwb25zZS5yZWFkeVN0YXRlc1xuXG5mdW5jdGlvbiBkZWNpZGVNb2RlIChwcmVmZXJCaW5hcnksIHVzZUZldGNoKSB7XG5cdGlmIChjYXBhYmlsaXR5LmZldGNoICYmIHVzZUZldGNoKSB7XG5cdFx0cmV0dXJuICdmZXRjaCdcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5Lm1vemNodW5rZWRhcnJheWJ1ZmZlcikge1xuXHRcdHJldHVybiAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5tc3N0cmVhbSkge1xuXHRcdHJldHVybiAnbXMtc3RyZWFtJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkuYXJyYXlidWZmZXIgJiYgcHJlZmVyQmluYXJ5KSB7XG5cdFx0cmV0dXJuICdhcnJheWJ1ZmZlcidcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5LnZiQXJyYXkgJiYgcHJlZmVyQmluYXJ5KSB7XG5cdFx0cmV0dXJuICd0ZXh0OnZiYXJyYXknXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICd0ZXh0J1xuXHR9XG59XG5cbnZhciBDbGllbnRSZXF1ZXN0ID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0cykge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c3RyZWFtLldyaXRhYmxlLmNhbGwoc2VsZilcblxuXHRzZWxmLl9vcHRzID0gb3B0c1xuXHRzZWxmLl9ib2R5ID0gW11cblx0c2VsZi5faGVhZGVycyA9IHt9XG5cdGlmIChvcHRzLmF1dGgpXG5cdFx0c2VsZi5zZXRIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIG5ldyBCdWZmZXIob3B0cy5hdXRoKS50b1N0cmluZygnYmFzZTY0JykpXG5cdE9iamVjdC5rZXlzKG9wdHMuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHRcdHNlbGYuc2V0SGVhZGVyKG5hbWUsIG9wdHMuaGVhZGVyc1tuYW1lXSlcblx0fSlcblxuXHR2YXIgcHJlZmVyQmluYXJ5XG5cdHZhciB1c2VGZXRjaCA9IHRydWVcblx0aWYgKG9wdHMubW9kZSA9PT0gJ2Rpc2FibGUtZmV0Y2gnIHx8ICgncmVxdWVzdFRpbWVvdXQnIGluIG9wdHMgJiYgIWNhcGFiaWxpdHkuYWJvcnRDb250cm9sbGVyKSkge1xuXHRcdC8vIElmIHRoZSB1c2Ugb2YgWEhSIHNob3VsZCBiZSBwcmVmZXJyZWQuIE5vdCB0eXBpY2FsbHkgbmVlZGVkLlxuXHRcdHVzZUZldGNoID0gZmFsc2Vcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSBpZiAob3B0cy5tb2RlID09PSAncHJlZmVyLXN0cmVhbWluZycpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgYSBoaWdoIHByaW9yaXR5IGJ1dCBiaW5hcnkgY29tcGF0aWJpbGl0eSBhbmRcblx0XHQvLyB0aGUgYWNjdXJhY3kgb2YgdGhlICdjb250ZW50LXR5cGUnIGhlYWRlciBhcmVuJ3Rcblx0XHRwcmVmZXJCaW5hcnkgPSBmYWxzZVxuXHR9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ2FsbG93LXdyb25nLWNvbnRlbnQtdHlwZScpIHtcblx0XHQvLyBJZiBzdHJlYW1pbmcgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBwcmVzZXJ2aW5nIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXJcblx0XHRwcmVmZXJCaW5hcnkgPSAhY2FwYWJpbGl0eS5vdmVycmlkZU1pbWVUeXBlXG5cdH0gZWxzZSBpZiAoIW9wdHMubW9kZSB8fCBvcHRzLm1vZGUgPT09ICdkZWZhdWx0JyB8fCBvcHRzLm1vZGUgPT09ICdwcmVmZXItZmFzdCcpIHtcblx0XHQvLyBVc2UgYmluYXJ5IGlmIHRleHQgc3RyZWFtaW5nIG1heSBjb3JydXB0IGRhdGEgb3IgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIsIG9yIGZvciBzcGVlZFxuXHRcdHByZWZlckJpbmFyeSA9IHRydWVcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdHMubW9kZScpXG5cdH1cblx0c2VsZi5fbW9kZSA9IGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5LCB1c2VGZXRjaClcblx0c2VsZi5fZmV0Y2hUaW1lciA9IG51bGxcblxuXHRzZWxmLm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5fb25GaW5pc2goKVxuXHR9KVxufVxuXG5pbmhlcml0cyhDbGllbnRSZXF1ZXN0LCBzdHJlYW0uV3JpdGFibGUpXG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0dmFyIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXHQvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGJyb3dzZXJzIGFib3V0IHNldHRpbmcgdW5zYWZlXG5cdC8vIGhlYWRlcnMuIFRvIGJlIGhvbmVzdCBJJ20gbm90IGVudGlyZWx5IHN1cmUgaGlkaW5nIHRoZXNlIHdhcm5pbmdzIGlzIGEgZ29vZCB0aGluZywgYnV0XG5cdC8vIGh0dHAtYnJvd3NlcmlmeSBkaWQgaXQsIHNvIEkgd2lsbCB0b28uXG5cdGlmICh1bnNhZmVIZWFkZXJzLmluZGV4T2YobG93ZXJOYW1lKSAhPT0gLTEpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5faGVhZGVyc1tsb3dlck5hbWVdID0ge1xuXHRcdG5hbWU6IG5hbWUsXG5cdFx0dmFsdWU6IHZhbHVlXG5cdH1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0dmFyIGhlYWRlciA9IHRoaXMuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXVxuXHRpZiAoaGVhZGVyKVxuXHRcdHJldHVybiBoZWFkZXIudmFsdWVcblx0cmV0dXJuIG51bGxcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdGRlbGV0ZSBzZWxmLl9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV1cbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdHJldHVyblxuXHR2YXIgb3B0cyA9IHNlbGYuX29wdHNcblxuXHR2YXIgaGVhZGVyc09iaiA9IHNlbGYuX2hlYWRlcnNcblx0dmFyIGJvZHkgPSBudWxsXG5cdGlmIChvcHRzLm1ldGhvZCAhPT0gJ0dFVCcgJiYgb3B0cy5tZXRob2QgIT09ICdIRUFEJykge1xuXHRcdGlmIChjYXBhYmlsaXR5LmFycmF5YnVmZmVyKSB7XG5cdFx0XHRib2R5ID0gdG9BcnJheUJ1ZmZlcihCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpKVxuXHRcdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5ibG9iQ29uc3RydWN0b3IpIHtcblx0XHRcdGJvZHkgPSBuZXcgZ2xvYmFsLkJsb2Ioc2VsZi5fYm9keS5tYXAoZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHRcdFx0XHRyZXR1cm4gdG9BcnJheUJ1ZmZlcihidWZmZXIpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHR0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBnZXQgdXRmOCBzdHJpbmdcblx0XHRcdGJvZHkgPSBCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpLnRvU3RyaW5nKClcblx0XHR9XG5cdH1cblxuXHQvLyBjcmVhdGUgZmxhdHRlbmVkIGxpc3Qgb2YgaGVhZGVyc1xuXHR2YXIgaGVhZGVyc0xpc3QgPSBbXVxuXHRPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXlOYW1lKSB7XG5cdFx0dmFyIG5hbWUgPSBoZWFkZXJzT2JqW2tleU5hbWVdLm5hbWVcblx0XHR2YXIgdmFsdWUgPSBoZWFkZXJzT2JqW2tleU5hbWVdLnZhbHVlXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHR2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG5cdFx0XHRcdGhlYWRlcnNMaXN0LnB1c2goW25hbWUsIHZdKVxuXHRcdFx0fSlcblx0XHR9IGVsc2Uge1xuXHRcdFx0aGVhZGVyc0xpc3QucHVzaChbbmFtZSwgdmFsdWVdKVxuXHRcdH1cblx0fSlcblxuXHRpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHZhciBzaWduYWwgPSBudWxsXG5cdFx0dmFyIGZldGNoVGltZXIgPSBudWxsXG5cdFx0aWYgKGNhcGFiaWxpdHkuYWJvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR2YXIgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuXHRcdFx0c2lnbmFsID0gY29udHJvbGxlci5zaWduYWxcblx0XHRcdHNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyID0gY29udHJvbGxlclxuXG5cdFx0XHRpZiAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzICYmIG9wdHMucmVxdWVzdFRpbWVvdXQgIT09IDApIHtcblx0XHRcdFx0c2VsZi5fZmV0Y2hUaW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRzZWxmLmVtaXQoJ3JlcXVlc3RUaW1lb3V0Jylcblx0XHRcdFx0XHRpZiAoc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIpXG5cdFx0XHRcdFx0XHRzZWxmLl9mZXRjaEFib3J0Q29udHJvbGxlci5hYm9ydCgpXG5cdFx0XHRcdH0sIG9wdHMucmVxdWVzdFRpbWVvdXQpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Z2xvYmFsLmZldGNoKHNlbGYuX29wdHMudXJsLCB7XG5cdFx0XHRtZXRob2Q6IHNlbGYuX29wdHMubWV0aG9kLFxuXHRcdFx0aGVhZGVyczogaGVhZGVyc0xpc3QsXG5cdFx0XHRib2R5OiBib2R5IHx8IHVuZGVmaW5lZCxcblx0XHRcdG1vZGU6ICdjb3JzJyxcblx0XHRcdGNyZWRlbnRpYWxzOiBvcHRzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbicsXG5cdFx0XHRzaWduYWw6IHNpZ25hbFxuXHRcdH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdFx0XHRzZWxmLl9mZXRjaFJlc3BvbnNlID0gcmVzcG9uc2Vcblx0XHRcdHNlbGYuX2Nvbm5lY3QoKVxuXHRcdH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcblx0XHRcdGdsb2JhbC5jbGVhclRpbWVvdXQoc2VsZi5fZmV0Y2hUaW1lcilcblx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgcmVhc29uKVxuXHRcdH0pXG5cdH0gZWxzZSB7XG5cdFx0dmFyIHhociA9IHNlbGYuX3hociA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKVxuXHRcdHRyeSB7XG5cdFx0XHR4aHIub3BlbihzZWxmLl9vcHRzLm1ldGhvZCwgc2VsZi5fb3B0cy51cmwsIHRydWUpXG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHQvLyBDYW4ndCBzZXQgcmVzcG9uc2VUeXBlIG9uIHJlYWxseSBvbGQgYnJvd3NlcnNcblx0XHRpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLnJlc3BvbnNlVHlwZSA9IHNlbGYuX21vZGUuc3BsaXQoJzonKVswXVxuXG5cdFx0aWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocilcblx0XHRcdHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdHMud2l0aENyZWRlbnRpYWxzXG5cblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ3RleHQnICYmICdvdmVycmlkZU1pbWVUeXBlJyBpbiB4aHIpXG5cdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCcpXG5cblx0XHRpZiAoJ3JlcXVlc3RUaW1lb3V0JyBpbiBvcHRzKSB7XG5cdFx0XHR4aHIudGltZW91dCA9IG9wdHMucmVxdWVzdFRpbWVvdXRcblx0XHRcdHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgncmVxdWVzdFRpbWVvdXQnKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhlYWRlcnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG5cdFx0fSlcblxuXHRcdHNlbGYuX3Jlc3BvbnNlID0gbnVsbFxuXHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG5cdFx0XHRcdGNhc2UgclN0YXRlcy5MT0FESU5HOlxuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuRE9ORTpcblx0XHRcdFx0XHRzZWxmLl9vblhIUlByb2dyZXNzKClcblx0XHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBOZWNlc3NhcnkgZm9yIHN0cmVhbWluZyBpbiBGaXJlZm94LCBzaW5jZSB4aHIucmVzcG9uc2UgaXMgT05MWSBkZWZpbmVkXG5cdFx0Ly8gaW4gb25wcm9ncmVzcywgbm90IGluIG9ucmVhZHlzdGF0ZWNoYW5nZSB3aXRoIHhoci5yZWFkeVN0YXRlID0gM1xuXHRcdGlmIChzZWxmLl9tb2RlID09PSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKSB7XG5cdFx0XHR4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0eGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1hIUiBlcnJvcicpKVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR4aHIuc2VuZChib2R5KVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHhoci5zdGF0dXMgaXMgcmVhZGFibGUgYW5kIG5vbi16ZXJvLCBpbmRpY2F0aW5nIG5vIGVycm9yLlxuICogRXZlbiB0aG91Z2ggdGhlIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHJlYWR5U3RhdGUgMyxcbiAqIGFjY2Vzc2luZyBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIElFOFxuICovXG5mdW5jdGlvbiBzdGF0dXNWYWxpZCAoeGhyKSB7XG5cdHRyeSB7XG5cdFx0dmFyIHN0YXR1cyA9IHhoci5zdGF0dXNcblx0XHRyZXR1cm4gKHN0YXR1cyAhPT0gbnVsbCAmJiBzdGF0dXMgIT09IDApXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKCFzdGF0dXNWYWxpZChzZWxmLl94aHIpIHx8IHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblxuXHRpZiAoIXNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX2Nvbm5lY3QoKVxuXG5cdHNlbGYuX3Jlc3BvbnNlLl9vblhIUlByb2dyZXNzKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5fcmVzcG9uc2UgPSBuZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hociwgc2VsZi5fZmV0Y2hSZXNwb25zZSwgc2VsZi5fbW9kZSwgc2VsZi5fZmV0Y2hUaW1lcilcblx0c2VsZi5fcmVzcG9uc2Uub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG5cdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0fSlcblxuXHRzZWxmLmVtaXQoJ3Jlc3BvbnNlJywgc2VsZi5fcmVzcG9uc2UpXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdHNlbGYuX2JvZHkucHVzaChjaHVuaylcblx0Y2IoKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IENsaWVudFJlcXVlc3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRzZWxmLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGdsb2JhbC5jbGVhclRpbWVvdXQoc2VsZi5fZmV0Y2hUaW1lcilcblx0aWYgKHNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX3Jlc3BvbnNlLl9kZXN0cm95ZWQgPSB0cnVlXG5cdGlmIChzZWxmLl94aHIpXG5cdFx0c2VsZi5feGhyLmFib3J0KClcblx0ZWxzZSBpZiAoc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIpXG5cdFx0c2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcsIGNiKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcblx0XHRjYiA9IGRhdGFcblx0XHRkYXRhID0gdW5kZWZpbmVkXG5cdH1cblxuXHRzdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLmVuZC5jYWxsKHNlbGYsIGRhdGEsIGVuY29kaW5nLCBjYilcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZmx1c2hIZWFkZXJzID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheSA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRTb2NrZXRLZWVwQWxpdmUgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyN0aGUtc2V0cmVxdWVzdGhlYWRlciUyOCUyOS1tZXRob2RcbnZhciB1bnNhZmVIZWFkZXJzID0gW1xuXHQnYWNjZXB0LWNoYXJzZXQnLFxuXHQnYWNjZXB0LWVuY29kaW5nJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVycycsXG5cdCdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LW1ldGhvZCcsXG5cdCdjb25uZWN0aW9uJyxcblx0J2NvbnRlbnQtbGVuZ3RoJyxcblx0J2Nvb2tpZScsXG5cdCdjb29raWUyJyxcblx0J2RhdGUnLFxuXHQnZG50Jyxcblx0J2V4cGVjdCcsXG5cdCdob3N0Jyxcblx0J2tlZXAtYWxpdmUnLFxuXHQnb3JpZ2luJyxcblx0J3JlZmVyZXInLFxuXHQndGUnLFxuXHQndHJhaWxlcicsXG5cdCd0cmFuc2Zlci1lbmNvZGluZycsXG5cdCd1cGdyYWRlJyxcblx0J3VzZXItYWdlbnQnLFxuXHQndmlhJ1xuXVxuIiwidmFyIGNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL2NhcGFiaWxpdHknKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUsIGZldGNoVGltZXIpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi51cmwgPSByZXNwb25zZS51cmxcblx0XHRzZWxmLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0XG5cdFx0XG5cdFx0cmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIsIGtleSl7XG5cdFx0XHRzZWxmLmhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gaGVhZGVyXG5cdFx0XHRzZWxmLnJhd0hlYWRlcnMucHVzaChrZXksIGhlYWRlcilcblx0XHR9KVxuXG5cdFx0aWYgKGNhcGFiaWxpdHkud3JpdGFibGVTdHJlYW0pIHtcblx0XHRcdHZhciB3cml0YWJsZSA9IG5ldyBXcml0YWJsZVN0cmVhbSh7XG5cdFx0XHRcdHdyaXRlOiBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZCkge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoKVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmKHNlbGYucHVzaChuZXcgQnVmZmVyKGNodW5rKSkpIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzZWxmLl9yZXN1bWVGZXRjaCA9IHJlc29sdmVcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGdsb2JhbC5jbGVhclRpbWVvdXQoZmV0Y2hUaW1lcilcblx0XHRcdFx0XHRpZiAoIXNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIGVycilcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzcG9uc2UuYm9keS5waXBlVG8od3JpdGFibGUpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdFx0aWYgKCFzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdH0gY2F0Y2ggKGUpIHt9IC8vIHBpcGVUbyBtZXRob2QgaXNuJ3QgZGVmaW5lZC4gQ2FuJ3QgZmluZCBhIGJldHRlciB3YXkgdG8gZmVhdHVyZSB0ZXN0IHRoaXNcblx0XHR9XG5cdFx0Ly8gZmFsbGJhY2sgZm9yIHdoZW4gd3JpdGFibGVTdHJlYW0gb3IgcGlwZVRvIGFyZW4ndCBhdmFpbGFibGVcblx0XHR2YXIgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKVxuXHRcdGZ1bmN0aW9uIHJlYWQgKCkge1xuXHRcdFx0cmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcblx0XHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0aWYgKHJlc3VsdC5kb25lKSB7XG5cdFx0XHRcdFx0Z2xvYmFsLmNsZWFyVGltZW91dChmZXRjaFRpbWVyKVxuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRnbG9iYWwuY2xlYXJUaW1lb3V0KGZldGNoVGltZXIpXG5cdFx0XHRcdGlmICghc2VsZi5fZGVzdHJveWVkKVxuXHRcdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdH1cblx0XHRyZWFkKClcblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnVybCA9IHhoci5yZXNwb25zZVVSTFxuXHRcdHNlbGYuc3RhdHVzQ29kZSA9IHhoci5zdGF0dXNcblx0XHRzZWxmLnN0YXR1c01lc3NhZ2UgPSB4aHIuc3RhdHVzVGV4dFxuXHRcdHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KC9cXHI/XFxuLylcblx0XHRoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuXHRcdFx0dmFyIG1hdGNoZXMgPSBoZWFkZXIubWF0Y2goL14oW146XSspOlxccyooLiopLylcblx0XHRcdGlmIChtYXRjaGVzKSB7XG5cdFx0XHRcdHZhciBrZXkgPSBtYXRjaGVzWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0aWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG5cdFx0XHRcdFx0aWYgKHNlbGYuaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gW11cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKVxuXHRcdFx0XHR9IGVsc2UgaWYgKHNlbGYuaGVhZGVyc1trZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYuaGVhZGVyc1trZXldID0gbWF0Y2hlc1syXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHR2YXIgcmVzb2x2ZSA9IHNlbGYuX3Jlc3VtZUZldGNoXG5cdGlmIChyZXNvbHZlKSB7XG5cdFx0c2VsZi5fcmVzdW1lRmV0Y2ggPSBudWxsXG5cdFx0cmVzb2x2ZSgpXG5cdH1cbn1cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0dmFyIHhociA9IHNlbGYuX3hoclxuXG5cdHZhciByZXNwb25zZSA9IG51bGxcblx0c3dpdGNoIChzZWxmLl9tb2RlKSB7XG5cdFx0Y2FzZSAndGV4dDp2YmFycmF5JzogLy8gRm9yIElFOVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIGZhaWxzIGluIElFOFxuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBnbG9iYWwuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KClcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Ly8gRmFsbHMgdGhyb3VnaCBpbiBJRThcdFxuXHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0dHJ5IHsgLy8gVGhpcyB3aWxsIGZhaWwgd2hlbiByZWFkeVN0YXRlID0gMyBpbiBJRTkuIFN3aXRjaCBtb2RlIGFuZCB3YWl0IGZvciByZWFkeVN0YXRlID0gNFxuXHRcdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0c2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdHZhciBuZXdEYXRhID0gcmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcylcblx0XHRcdFx0aWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSB8fCAheGhyLnJlc3BvbnNlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJzogLy8gdGFrZSB3aG9sZVxuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HIHx8ICFyZXNwb25zZSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ21zLXN0cmVhbSc6XG5cdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkxPQURJTkcpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR2YXIgcmVhZGVyID0gbmV3IGdsb2JhbC5NU1N0cmVhbVJlYWRlcigpXG5cdFx0XHRyZWFkZXIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aCA+IHNlbGYuX3Bvcykge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlYWRlci5yZXN1bHQuc2xpY2Uoc2VsZi5fcG9zKSkpKVxuXHRcdFx0XHRcdHNlbGYuX3BvcyA9IHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLnB1c2gobnVsbClcblx0XHRcdH1cblx0XHRcdC8vIHJlYWRlci5vbmVycm9yID0gPz8/IC8vIFRPRE86IHRoaXNcblx0XHRcdHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihyZXNwb25zZSlcblx0XHRcdGJyZWFrXG5cdH1cblxuXHQvLyBUaGUgbXMtc3RyZWFtIGNhc2UgaGFuZGxlcyBlbmQgc2VwYXJhdGVseSBpbiByZWFkZXIub25sb2FkKClcblx0aWYgKHNlbGYuX3hoci5yZWFkeVN0YXRlID09PSByU3RhdGVzLkRPTkUgJiYgc2VsZi5fbW9kZSAhPT0gJ21zLXN0cmVhbScpIHtcblx0XHRzZWxmLnB1c2gobnVsbClcblx0fVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59IiwidmFyIG5leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaW1tZWRpYXRlSWRzID0ge307XG52YXIgbmV4dEltbWVkaWF0ZUlkID0gMDtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsgdGltZW91dC5jbG9zZSgpOyB9O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIFRoYXQncyBub3QgaG93IG5vZGUuanMgaW1wbGVtZW50cyBpdCBidXQgdGhlIGV4cG9zZWQgYXBpIGlzIHRoZSBzYW1lLlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBzZXRJbW1lZGlhdGUgOiBmdW5jdGlvbihmbikge1xuICB2YXIgaWQgPSBuZXh0SW1tZWRpYXRlSWQrKztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGZhbHNlIDogc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGltbWVkaWF0ZUlkc1tpZF0gPSB0cnVlO1xuXG4gIG5leHRUaWNrKGZ1bmN0aW9uIG9uTmV4dFRpY2soKSB7XG4gICAgaWYgKGltbWVkaWF0ZUlkc1tpZF0pIHtcbiAgICAgIC8vIGZuLmNhbGwoKSBpcyBmYXN0ZXIgc28gd2Ugb3B0aW1pemUgZm9yIHRoZSBjb21tb24gdXNlLWNhc2VcbiAgICAgIC8vIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vY2FsbC1hcHBseS1zZWd1XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCk7XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IGlkcyBmcm9tIGxlYWtpbmdcbiAgICAgIGV4cG9ydHMuY2xlYXJJbW1lZGlhdGUoaWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlkO1xufTtcblxuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IHR5cGVvZiBjbGVhckltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY2xlYXJJbW1lZGlhdGUgOiBmdW5jdGlvbihpZCkge1xuICBkZWxldGUgaW1tZWRpYXRlSWRzW2lkXTtcbn07IiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlclxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChidWYpIHtcblx0Ly8gSWYgdGhlIGJ1ZmZlciBpcyBiYWNrZWQgYnkgYSBVaW50OEFycmF5LCBhIGZhc3RlciB2ZXJzaW9uIHdpbGwgd29ya1xuXHRpZiAoYnVmIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuXHRcdC8vIElmIHRoZSBidWZmZXIgaXNuJ3QgYSBzdWJhcnJheSwgcmV0dXJuIHRoZSB1bmRlcmx5aW5nIEFycmF5QnVmZmVyXG5cdFx0aWYgKGJ1Zi5ieXRlT2Zmc2V0ID09PSAwICYmIGJ1Zi5ieXRlTGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcblx0XHRcdHJldHVybiBidWYuYnVmZmVyXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgYnVmLmJ1ZmZlci5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gZ2V0IGEgcHJvcGVyIGNvcHlcblx0XHRcdHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5ieXRlTGVuZ3RoKVxuXHRcdH1cblx0fVxuXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuXHRcdC8vIFRoaXMgaXMgdGhlIHNsb3cgdmVyc2lvbiB0aGF0IHdpbGwgd29yayB3aXRoIGFueSBCdWZmZXJcblx0XHQvLyBpbXBsZW1lbnRhdGlvbiAoZXZlbiBpbiBvbGQgYnJvd3NlcnMpXG5cdFx0dmFyIGFycmF5Q29weSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5sZW5ndGgpXG5cdFx0dmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRhcnJheUNvcHlbaV0gPSBidWZbaV1cblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5Q29weS5idWZmZXJcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuXHR9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8vIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4vLyBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICAgIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSBzaW1wbGUgcGF0aCBVUkxcbiAgICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC8sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAgIC8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICAgIHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKSxcblxuICAgIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgICAvLyB0aGVtLlxuICAgIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICAgIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvLFxuICAgIGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLFxuICAgIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICAgIHVuc2FmZVByb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICAgIGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgICAnaHR0cCc6IHRydWUsXG4gICAgICAnaHR0cHMnOiB0cnVlLFxuICAgICAgJ2Z0cCc6IHRydWUsXG4gICAgICAnZ29waGVyJzogdHJ1ZSxcbiAgICAgICdmaWxlJzogdHJ1ZSxcbiAgICAgICdodHRwOic6IHRydWUsXG4gICAgICAnaHR0cHM6JzogdHJ1ZSxcbiAgICAgICdmdHA6JzogdHJ1ZSxcbiAgICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAgICdmaWxlOic6IHRydWVcbiAgICB9LFxuICAgIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHV0aWwuaXNPYmplY3QodXJsKSAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmw7XG5cbiAgdmFyIHUgPSBuZXcgVXJsO1xuICB1LnBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpO1xuICByZXR1cm4gdTtcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgLy8gQ29weSBjaHJvbWUsIElFLCBvcGVyYSBiYWNrc2xhc2gtaGFuZGxpbmcgYmVoYXZpb3IuXG4gIC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yNTkxNlxuICB2YXIgcXVlcnlJbmRleCA9IHVybC5pbmRleE9mKCc/JyksXG4gICAgICBzcGxpdHRlciA9XG4gICAgICAgICAgKHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpKSA/ICc/JyA6ICcjJyxcbiAgICAgIHVTcGxpdCA9IHVybC5zcGxpdChzcGxpdHRlciksXG4gICAgICBzbGFzaFJlZ2V4ID0gL1xcXFwvZztcbiAgdVNwbGl0WzBdID0gdVNwbGl0WzBdLnJlcGxhY2Uoc2xhc2hSZWdleCwgJy8nKTtcbiAgdXJsID0gdVNwbGl0LmpvaW4oc3BsaXR0ZXIpO1xuXG4gIHZhciByZXN0ID0gdXJsO1xuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpO1xuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICB2YXIgc2ltcGxlUGF0aCA9IHNpbXBsZVBhdGhQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHRoaXMucGF0aCA9IHJlc3Q7XG4gICAgICB0aGlzLmhyZWYgPSByZXN0O1xuICAgICAgdGhpcy5wYXRobmFtZSA9IHNpbXBsZVBhdGhbMV07XG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl07XG4gICAgICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMuc2VhcmNoLnN1YnN0cigxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm90byA9IHByb3RvY29sUGF0dGVybi5leGVjKHJlc3QpO1xuICBpZiAocHJvdG8pIHtcbiAgICBwcm90byA9IHByb3RvWzBdO1xuICAgIHZhciBsb3dlclByb3RvID0gcHJvdG8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnByb3RvY29sID0gbG93ZXJQcm90bztcbiAgICByZXN0ID0gcmVzdC5zdWJzdHIocHJvdG8ubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBnb3QgYSBob3N0XG4gIC8vIHVzZXJAc2VydmVyIGlzICphbHdheXMqIGludGVycHJldGVkIGFzIGEgaG9zdG5hbWUsIGFuZCB1cmxcbiAgLy8gcmVzb2x1dGlvbiB3aWxsIHRyZWF0IC8vZm9vL2JhciBhcyBob3N0PWZvbyxwYXRoPWJhciBiZWNhdXNlIHRoYXQnc1xuICAvLyBob3cgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgcmVsYXRpdmUgVVJMcy5cbiAgaWYgKHNsYXNoZXNEZW5vdGVIb3N0IHx8IHByb3RvIHx8IHJlc3QubWF0Y2goL15cXC9cXC9bXkBcXC9dK0BbXkBcXC9dKy8pKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LnN1YnN0cigwLCAyKSA9PT0gJy8vJztcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc3Vic3RyKDIpO1xuICAgICAgdGhpcy5zbGFzaGVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuXG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICAvLyBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkgaG9zdEVuZGluZ0NoYXJzXG4gICAgdmFyIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihob3N0RW5kaW5nQ2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgIHZhciBhdXRoLCBhdFNpZ247XG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7XG4gICAgICAvLyBhdFNpZ24gY2FuIGJlIGFueXdoZXJlLlxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAvLyBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcsIGhvc3RFbmQpO1xuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgIC8vIFB1bGwgdGhhdCBvZmYuXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbik7XG4gICAgICByZXN0ID0gcmVzdC5zbGljZShhdFNpZ24gKyAxKTtcbiAgICAgIHRoaXMuYXV0aCA9IGRlY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKG5vbkhvc3RDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuICAgIC8vIGlmIHdlIHN0aWxsIGhhdmUgbm90IGhpdCBpdCwgdGhlbiB0aGUgZW50aXJlIHRoaW5nIGlzIGEgaG9zdC5cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpXG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGg7XG5cbiAgICB0aGlzLmhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpO1xuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICB0aGlzLnBhcnNlSG9zdCgpO1xuXG4gICAgLy8gd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAvLyBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmXG4gICAgICAgIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgcGFydCA9IGhvc3RwYXJ0c1tpXTtcbiAgICAgICAgaWYgKCFwYXJ0KSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgdmFyIG5ld3BhcnQgPSAnJztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8vIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgIC8vIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgbmV3cGFydCArPSAneCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9IHBhcnRbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIHRlc3QgYWdhaW4gd2l0aCBBU0NJSSBjaGFyIG9ubHlcbiAgICAgICAgICBpZiAoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZFBhcnRzID0gaG9zdHBhcnRzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgdmFyIG5vdEhvc3QgPSBob3N0cGFydHMuc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgdmFyIGJpdCA9IHBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0U3RhcnQpO1xuICAgICAgICAgICAgaWYgKGJpdCkge1xuICAgICAgICAgICAgICB2YWxpZFBhcnRzLnB1c2goYml0WzFdKTtcbiAgICAgICAgICAgICAgbm90SG9zdC51bnNoaWZ0KGJpdFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm90SG9zdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmVzdCA9ICcvJyArIG5vdEhvc3Quam9pbignLicpICsgcmVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSB2YWxpZFBhcnRzLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RuYW1lLmxlbmd0aCA+IGhvc3RuYW1lTWF4TGVuKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvc3RuYW1lcyBhcmUgYWx3YXlzIGxvd2VyIGNhc2UuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICAvLyBJRE5BIFN1cHBvcnQ6IFJldHVybnMgYSBwdW55Y29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgIC8vIEl0IG9ubHkgY29udmVydHMgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgIC8vIGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWZcbiAgICAgIC8vIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIEFTQ0lJLW9ubHkuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLmhvc3RuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgcCA9IHRoaXMucG9ydCA/ICc6JyArIHRoaXMucG9ydCA6ICcnO1xuICAgIHZhciBoID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcbiAgICB0aGlzLmhvc3QgPSBoICsgcDtcbiAgICB0aGlzLmhyZWYgKz0gdGhpcy5ob3N0O1xuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcblxuICAgIC8vIEZpcnN0LCBtYWtlIDEwMCUgc3VyZSB0aGF0IGFueSBcImF1dG9Fc2NhcGVcIiBjaGFycyBnZXRcbiAgICAvLyBlc2NhcGVkLCBldmVuIGlmIGVuY29kZVVSSUNvbXBvbmVudCBkb2Vzbid0IHRoaW5rIHRoZXlcbiAgICAvLyBuZWVkIHRvIGJlLlxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXV0b0VzY2FwZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhZSA9IGF1dG9Fc2NhcGVbaV07XG4gICAgICBpZiAocmVzdC5pbmRleE9mKGFlKSA9PT0gLTEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFyIGVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChhZSk7XG4gICAgICBpZiAoZXNjID09PSBhZSkge1xuICAgICAgICBlc2MgPSBlc2NhcGUoYWUpO1xuICAgICAgfVxuICAgICAgcmVzdCA9IHJlc3Quc3BsaXQoYWUpLmpvaW4oZXNjKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgdGhpcy5wYXRobmFtZSA9IHJlc3Q7XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIHZhciBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICB2YXIgcyA9IHRoaXMuc2VhcmNoIHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IHAgKyBzO1xuICB9XG5cbiAgLy8gZmluYWxseSwgcmVjb25zdHJ1Y3QgdGhlIGhyZWYgYmFzZWQgb24gd2hhdCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gIHRoaXMuaHJlZiA9IHRoaXMuZm9ybWF0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZm9ybWF0IGEgcGFyc2VkIG9iamVjdCBpbnRvIGEgdXJsIHN0cmluZ1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvLyBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAvLyBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAvLyB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gIC8vIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gIGlmICh1dGlsLmlzU3RyaW5nKG9iaikpIG9iaiA9IHVybFBhcnNlKG9iaik7XG4gIGlmICghKG9iaiBpbnN0YW5jZW9mIFVybCkpIHJldHVybiBVcmwucHJvdG90eXBlLmZvcm1hdC5jYWxsKG9iaik7XG4gIHJldHVybiBvYmouZm9ybWF0KCk7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhdXRoID0gdGhpcy5hdXRoIHx8ICcnO1xuICBpZiAoYXV0aCkge1xuICAgIGF1dGggPSBlbmNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgYXV0aCA9IGF1dGgucmVwbGFjZSgvJTNBL2ksICc6Jyk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sIHx8ICcnLFxuICAgICAgcGF0aG5hbWUgPSB0aGlzLnBhdGhuYW1lIHx8ICcnLFxuICAgICAgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJyxcbiAgICAgIGhvc3QgPSBmYWxzZSxcbiAgICAgIHF1ZXJ5ID0gJyc7XG5cbiAgaWYgKHRoaXMuaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdGhpcy5ob3N0O1xuICB9IGVsc2UgaWYgKHRoaXMuaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArICh0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSA9PT0gLTEgP1xuICAgICAgICB0aGlzLmhvc3RuYW1lIDpcbiAgICAgICAgJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyk7XG4gICAgaWYgKHRoaXMucG9ydCkge1xuICAgICAgaG9zdCArPSAnOicgKyB0aGlzLnBvcnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkgJiZcbiAgICAgIHV0aWwuaXNPYmplY3QodGhpcy5xdWVyeSkgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHRoaXMucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHxcbiAgICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKHV0aWwuaXNTdHJpbmcocmVsYXRpdmUpKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIHZhciB0a2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICBmb3IgKHZhciB0ayA9IDA7IHRrIDwgdGtleXMubGVuZ3RoOyB0aysrKSB7XG4gICAgdmFyIHRrZXkgPSB0a2V5c1t0a107XG4gICAgcmVzdWx0W3RrZXldID0gdGhpc1t0a2V5XTtcbiAgfVxuXG4gIC8vIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAvLyBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgcmVzdWx0Lmhhc2ggPSByZWxhdGl2ZS5oYXNoO1xuXG4gIC8vIGlmIHRoZSByZWxhdGl2ZSB1cmwgaXMgZW1wdHksIHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gaGVyZS5cbiAgaWYgKHJlbGF0aXZlLmhyZWYgPT09ICcnKSB7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGhyZWZzIGxpa2UgLy9mb28vYmFyIGFsd2F5cyBjdXQgdG8gdGhlIHByb3RvY29sLlxuICBpZiAocmVsYXRpdmUuc2xhc2hlcyAmJiAhcmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAvLyB0YWtlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBwcm90b2NvbCBmcm9tIHJlbGF0aXZlXG4gICAgdmFyIHJrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgIGZvciAodmFyIHJrID0gMDsgcmsgPCBya2V5cy5sZW5ndGg7IHJrKyspIHtcbiAgICAgIHZhciBya2V5ID0gcmtleXNbcmtdO1xuICAgICAgaWYgKHJrZXkgIT09ICdwcm90b2NvbCcpXG4gICAgICAgIHJlc3VsdFtya2V5XSA9IHJlbGF0aXZlW3JrZXldO1xuICAgIH1cblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmXG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbdl07XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdC5wcm90b2NvbCA9IHJlbGF0aXZlLnByb3RvY29sO1xuICAgIGlmICghcmVsYXRpdmUuaG9zdCAmJiAhaG9zdGxlc3NQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoICYmICEocmVsYXRpdmUuaG9zdCA9IHJlbFBhdGguc2hpZnQoKSkpO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0KSByZWxhdGl2ZS5ob3N0ID0gJyc7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSByZWxhdGl2ZS5ob3N0bmFtZSA9ICcnO1xuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoIDwgMikgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gKHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpLFxuICAgICAgaXNSZWxBYnMgPSAoXG4gICAgICAgICAgcmVsYXRpdmUuaG9zdCB8fFxuICAgICAgICAgIHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICApLFxuICAgICAgbXVzdEVuZEFicyA9IChpc1JlbEFicyB8fCBpc1NvdXJjZUFicyB8fFxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0Lmhvc3QgJiYgcmVsYXRpdmUucGF0aG5hbWUpKSxcbiAgICAgIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzLFxuICAgICAgc3JjUGF0aCA9IHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHJlbFBhdGggPSByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcHN5Y2hvdGljID0gcmVzdWx0LnByb3RvY29sICYmICFzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXTtcblxuICAvLyBpZiB0aGUgdXJsIGlzIGEgbm9uLXNsYXNoZWQgdXJsLCB0aGVuIHJlbGF0aXZlXG4gIC8vIGxpbmtzIGxpa2UgLi4vLi4gc2hvdWxkIGJlIGFibGVcbiAgLy8gdG8gY3Jhd2wgdXAgdG8gdGhlIGhvc3RuYW1lLCBhcyB3ZWxsLiAgVGhpcyBpcyBzdHJhbmdlLlxuICAvLyByZXN1bHQucHJvdG9jb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgbm93LlxuICAvLyBMYXRlciBvbiwgcHV0IHRoZSBmaXJzdCBwYXRoIHBhcnQgaW50byB0aGUgaG9zdCBmaWVsZC5cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0O1xuICAgICAgZWxzZSBzcmNQYXRoLnVuc2hpZnQocmVzdWx0Lmhvc3QpO1xuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICBlbHNlIHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTtcbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG5cbiAgaWYgKGlzUmVsQWJzKSB7XG4gICAgLy8gaXQncyBhYnNvbHV0ZS5cbiAgICByZXN1bHQuaG9zdCA9IChyZWxhdGl2ZS5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0IDogcmVzdWx0Lmhvc3Q7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gKHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3RuYW1lID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3RuYW1lIDogcmVzdWx0Lmhvc3RuYW1lO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgc3JjUGF0aCA9IHJlbFBhdGg7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkb3QtaGFuZGxpbmcgYmVsb3cuXG4gIH0gZWxzZSBpZiAocmVsUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBpdCdzIHJlbGF0aXZlXG4gICAgLy8gdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgaWYgKCFzcmNQYXRoKSBzcmNQYXRoID0gW107XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmICghdXRpbC5pc051bGxPclVuZGVmaW5lZChyZWxhdGl2ZS5zZWFyY2gpKSB7XG4gICAgLy8ganVzdCBwdWxsIG91dCB0aGUgc2VhcmNoLlxuICAgIC8vIGxpa2UgaHJlZj0nP2ZvbycuXG4gICAgLy8gUHV0IHRoaXMgYWZ0ZXIgdGhlIG90aGVyIHR3byBjYXNlcyBiZWNhdXNlIGl0IHNpbXBsaWZpZXMgdGhlIGJvb2xlYW5zXG4gICAgaWYgKHBzeWNob3RpYykge1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBzcmNQYXRoLnNoaWZ0KCk7XG4gICAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBubyBwYXRoIGF0IGFsbC4gIGVhc3kuXG4gICAgLy8gd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBvdGhlciBzdHVmZiBhYm92ZS5cbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgLy8gaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gIC8vIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKFxuICAgICAgKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgfHwgc3JjUGF0aC5sZW5ndGggPiAxKSAmJlxuICAgICAgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSB8fCBsYXN0ID09PSAnJyk7XG5cbiAgLy8gc3RyaXAgc2luZ2xlIGRvdHMsIHJlc29sdmUgZG91YmxlIGRvdHMgdG8gcGFyZW50IGRpclxuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKCFtdXN0RW5kQWJzICYmICFyZW1vdmVBbGxEb3RzKSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBzcmNQYXRoLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgc3JjUGF0aFswXSAhPT0gJycgJiZcbiAgICAgICghc3JjUGF0aFswXSB8fCBzcmNQYXRoWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiAoc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgucHVzaCgnJyk7XG4gIH1cblxuICB2YXIgaXNBYnNvbHV0ZSA9IHNyY1BhdGhbMF0gPT09ICcnIHx8XG4gICAgICAoc3JjUGF0aFswXSAmJiBzcmNQYXRoWzBdLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAvLyBwdXQgdGhlIGhvc3QgYmFja1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBpc0Fic29sdXRlID8gJycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGF0aC5sZW5ndGggPyBzcmNQYXRoLnNoaWZ0KCkgOiAnJztcbiAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzIHx8IChyZXN1bHQuaG9zdCAmJiBzcmNQYXRoLmxlbmd0aCk7XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IHNyY1BhdGguam9pbignLycpO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaG9zdCA9IHRoaXMuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzU3RyaW5nOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdzdHJpbmcnO1xuICB9LFxuICBpc09iamVjdDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsT3JVbmRlZmluZWQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT0gbnVsbDtcbiAgfVxufTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzRVM1ID0gdHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJ1xuXHQmJiB0eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgPT09ICdmdW5jdGlvbidcblx0JiYgdHlwZW9mIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9PT0gJ2Z1bmN0aW9uJ1xuXHQmJiB0eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoIWlzRVM1KSB7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoJ3V0aWwucHJvbWlzaWZ5IHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQnKTtcbn1cblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSByZXF1aXJlKCdvYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycycpO1xuXG5pZiAodHlwZW9mIFByb21pc2UgIT09ICdmdW5jdGlvbicpIHtcblx0dGhyb3cgbmV3IFR5cGVFcnJvcignYFByb21pc2VgIG11c3QgYmUgZ2xvYmFsbHkgYXZhaWxhYmxlIGZvciB1dGlsLnByb21pc2lmeSB0byB3b3JrLicpO1xufVxuXG52YXIgc2xpY2UgPSBGdW5jdGlvbi5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcbnZhciBjb25jYXQgPSBGdW5jdGlvbi5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG52YXIgZm9yRWFjaCA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG5cbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCcnKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wgPSBoYXNTeW1ib2xzID8gU3ltYm9sKCd1dGlsLnByb21pc2lmeS5jdXN0b20nKSA6IG51bGw7XG52YXIga0N1c3RvbVByb21pc2lmeUFyZ3NTeW1ib2wgPSBoYXNTeW1ib2xzID8gU3ltYm9sKCdjdXN0b21Qcm9taXNpZnlBcmdzJykgOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHByb21pc2lmeShvcmlnKSB7XG5cdGlmICh0eXBlb2Ygb3JpZyAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9yaWdpbmFsXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIGZ1bmN0aW9uJyk7XG5cdFx0ZXJyb3IubmFtZSA9ICdUeXBlRXJyb3IgW0VSUl9JTlZBTElEX0FSR19UWVBFXSc7XG5cdFx0ZXJyb3IuY29kZSA9ICdFUlJfSU5WQUxJRF9BUkdfVFlQRSc7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cblxuXHRpZiAoaGFzU3ltYm9scyAmJiBvcmlnW2tDdXN0b21Qcm9taXNpZmllZFN5bWJvbF0pIHtcblx0XHR2YXIgY3VzdG9tRnVuY3Rpb24gPSBvcmlnW2tDdXN0b21Qcm9taXNpZmllZFN5bWJvbF07XG5cdFx0aWYgKHR5cGVvZiBjdXN0b21GdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFt1dGlsLnByb21pc2lmeS5jdXN0b21dIHByb3BlcnR5IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VzdG9tRnVuY3Rpb24sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZTogY3VzdG9tRnVuY3Rpb24sXG5cdFx0XHR3cml0YWJsZTogZmFsc2Vcblx0XHR9KTtcblx0XHRyZXR1cm4gY3VzdG9tRnVuY3Rpb247XG5cdH1cblxuXHQvLyBOYW1lcyB0byBjcmVhdGUgYW4gb2JqZWN0IGZyb20gaW4gY2FzZSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgbXVsdGlwbGVcblx0Ly8gYXJndW1lbnRzLCBlLmcuIFsnc3Rkb3V0JywgJ3N0ZGVyciddIGZvciBjaGlsZF9wcm9jZXNzLmV4ZWMuXG5cdHZhciBhcmd1bWVudE5hbWVzID0gb3JpZ1trQ3VzdG9tUHJvbWlzaWZ5QXJnc1N5bWJvbF07XG5cblx0dmFyIHByb21pc2lmaWVkID0gZnVuY3Rpb24gZm4oKSB7XG5cdFx0dmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXHRcdHZhciBzZWxmID0gdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1pbnZhbGlkLXRoaXNcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0b3JpZy5hcHBseShzZWxmLCBjb25jYXQoYXJncywgZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZShhcmd1bWVudHMsIDEpIDogW107XG5cdFx0XHRcdGlmIChlcnIpIHtcblx0XHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnROYW1lcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHR2YXIgb2JqID0ge307XG5cdFx0XHRcdFx0Zm9yRWFjaChhcmd1bWVudE5hbWVzLCBmdW5jdGlvbiAobmFtZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdG9ialtuYW1lXSA9IHZhbHVlc1tpbmRleF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShvYmopO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodmFsdWVzWzBdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm9taXNpZmllZCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWcpKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvbWlzaWZpZWQsIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR2YWx1ZTogcHJvbWlzaWZpZWQsXG5cdFx0d3JpdGFibGU6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJvbWlzaWZpZWQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZykpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuY3VzdG9tID0ga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sO1xubW9kdWxlLmV4cG9ydHMuY3VzdG9tUHJvbWlzaWZ5QXJncyA9IGtDdXN0b21Qcm9taXNpZnlBcmdzU3ltYm9sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBib3VuZFByb21pc2lmeSA9IGZ1bmN0aW9uIHByb21pc2lmeShvcmlnKSB7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cdHJldHVybiBwb2x5ZmlsbC5hcHBseSh1dGlsLCBhcmd1bWVudHMpO1xufTtcbmRlZmluZShib3VuZFByb21pc2lmeSwge1xuXHRjdXN0b206IHBvbHlmaWxsLmN1c3RvbSxcblx0Y3VzdG9tUHJvbWlzaWZ5QXJnczogcG9seWZpbGwuY3VzdG9tUHJvbWlzaWZ5QXJncyxcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJvdW5kUHJvbWlzaWZ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0aWYgKHR5cGVvZiB1dGlsLnByb21pc2lmeSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiB1dGlsLnByb21pc2lmeTtcblx0fVxuXHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltVXRpbFByb21pc2lmeSgpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0aWYgKHBvbHlmaWxsICE9PSB1dGlsLnByb21pc2lmeSkge1xuXHRcdHV0aWwucHJvbWlzaWZ5ID0gcG9seWZpbGw7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHV0aWwsICdwcm9taXNpZnknLCB7IHZhbHVlOiBwb2x5ZmlsbCB9KTtcblx0fVxuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICBleHBvcnRzLnN0cmlwQk9NID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKHN0clswXSA9PT0gJ1xcdUZFRkYnKSB7XG4gICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcbiAgdmFyIGJ1aWxkZXIsIGRlZmF1bHRzLCBlc2NhcGVDREFUQSwgcmVxdWlyZXNDREFUQSwgd3JhcENEQVRBLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBidWlsZGVyID0gcmVxdWlyZSgneG1sYnVpbGRlcicpO1xuXG4gIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpLmRlZmF1bHRzO1xuXG4gIHJlcXVpcmVzQ0RBVEEgPSBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgJiYgKGVudHJ5LmluZGV4T2YoJyYnKSA+PSAwIHx8IGVudHJ5LmluZGV4T2YoJz4nKSA+PSAwIHx8IGVudHJ5LmluZGV4T2YoJzwnKSA+PSAwKTtcbiAgfTtcblxuICB3cmFwQ0RBVEEgPSBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBcIjwhW0NEQVRBW1wiICsgKGVzY2FwZUNEQVRBKGVudHJ5KSkgKyBcIl1dPlwiO1xuICB9O1xuXG4gIGVzY2FwZUNEQVRBID0gZnVuY3Rpb24oZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkucmVwbGFjZSgnXV0+JywgJ11dXV0+PCFbQ0RBVEFbPicpO1xuICB9O1xuXG4gIGV4cG9ydHMuQnVpbGRlciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBCdWlsZGVyKG9wdHMpIHtcbiAgICAgIHZhciBrZXksIHJlZiwgdmFsdWU7XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICAgIHJlZiA9IGRlZmF1bHRzW1wiMC4yXCJdO1xuICAgICAgZm9yIChrZXkgaW4gcmVmKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwga2V5KSkgY29udGludWU7XG4gICAgICAgIHZhbHVlID0gcmVmW2tleV07XG4gICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvcHRzKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG9wdHMsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IG9wdHNba2V5XTtcbiAgICAgICAgdGhpcy5vcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBCdWlsZGVyLnByb3RvdHlwZS5idWlsZE9iamVjdCA9IGZ1bmN0aW9uKHJvb3RPYmopIHtcbiAgICAgIHZhciBhdHRya2V5LCBjaGFya2V5LCByZW5kZXIsIHJvb3RFbGVtZW50LCByb290TmFtZTtcbiAgICAgIGF0dHJrZXkgPSB0aGlzLm9wdGlvbnMuYXR0cmtleTtcbiAgICAgIGNoYXJrZXkgPSB0aGlzLm9wdGlvbnMuY2hhcmtleTtcbiAgICAgIGlmICgoT2JqZWN0LmtleXMocm9vdE9iaikubGVuZ3RoID09PSAxKSAmJiAodGhpcy5vcHRpb25zLnJvb3ROYW1lID09PSBkZWZhdWx0c1snMC4yJ10ucm9vdE5hbWUpKSB7XG4gICAgICAgIHJvb3ROYW1lID0gT2JqZWN0LmtleXMocm9vdE9iailbMF07XG4gICAgICAgIHJvb3RPYmogPSByb290T2JqW3Jvb3ROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3ROYW1lID0gdGhpcy5vcHRpb25zLnJvb3ROYW1lO1xuICAgICAgfVxuICAgICAgcmVuZGVyID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihlbGVtZW50LCBvYmopIHtcbiAgICAgICAgICB2YXIgYXR0ciwgY2hpbGQsIGVudHJ5LCBpbmRleCwga2V5LCB2YWx1ZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNkYXRhICYmIHJlcXVpcmVzQ0RBVEEob2JqKSkge1xuICAgICAgICAgICAgICBlbGVtZW50LnJhdyh3cmFwQ0RBVEEob2JqKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50LnR4dChvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IgKGluZGV4IGluIG9iaikge1xuICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGluZGV4KSkgY29udGludWU7XG4gICAgICAgICAgICAgIGNoaWxkID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgICAgZm9yIChrZXkgaW4gY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IGNoaWxkW2tleV07XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHJlbmRlcihlbGVtZW50LmVsZShrZXkpLCBlbnRyeSkudXAoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwob2JqLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2hpbGQgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgaWYgKGtleSA9PT0gYXR0cmtleSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoYXR0ciBpbiBjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNoaWxkW2F0dHJdO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5hdHQoYXR0ciwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IGNoYXJrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5jZGF0YSAmJiByZXF1aXJlc0NEQVRBKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucmF3KHdyYXBDREFUQShjaGlsZCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC50eHQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaW5kZXggaW4gY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKGNoaWxkLCBpbmRleCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgZW50cnkgPSBjaGlsZFtpbmRleF07XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5jZGF0YSAmJiByZXF1aXJlc0NEQVRBKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmVsZShrZXkpLnJhdyh3cmFwQ0RBVEEoZW50cnkpKS51cCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmVsZShrZXksIGVudHJ5KS51cCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyKGVsZW1lbnQuZWxlKGtleSksIGVudHJ5KS51cCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyKGVsZW1lbnQuZWxlKGtleSksIGNoaWxkKS51cCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnICYmIF90aGlzLm9wdGlvbnMuY2RhdGEgJiYgcmVxdWlyZXNDREFUQShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmVsZShrZXkpLnJhdyh3cmFwQ0RBVEEoY2hpbGQpKS51cCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSwgY2hpbGQudG9TdHJpbmcoKSkudXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHJvb3RFbGVtZW50ID0gYnVpbGRlci5jcmVhdGUocm9vdE5hbWUsIHRoaXMub3B0aW9ucy54bWxkZWMsIHRoaXMub3B0aW9ucy5kb2N0eXBlLCB7XG4gICAgICAgIGhlYWRsZXNzOiB0aGlzLm9wdGlvbnMuaGVhZGxlc3MsXG4gICAgICAgIGFsbG93U3Vycm9nYXRlQ2hhcnM6IHRoaXMub3B0aW9ucy5hbGxvd1N1cnJvZ2F0ZUNoYXJzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZW5kZXIocm9vdEVsZW1lbnQsIHJvb3RPYmopLmVuZCh0aGlzLm9wdGlvbnMucmVuZGVyT3B0cyk7XG4gICAgfTtcblxuICAgIHJldHVybiBCdWlsZGVyO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICBleHBvcnRzLmRlZmF1bHRzID0ge1xuICAgIFwiMC4xXCI6IHtcbiAgICAgIGV4cGxpY2l0Q2hhcmtleTogZmFsc2UsXG4gICAgICB0cmltOiB0cnVlLFxuICAgICAgbm9ybWFsaXplOiB0cnVlLFxuICAgICAgbm9ybWFsaXplVGFnczogZmFsc2UsXG4gICAgICBhdHRya2V5OiBcIkBcIixcbiAgICAgIGNoYXJrZXk6IFwiI1wiLFxuICAgICAgZXhwbGljaXRBcnJheTogZmFsc2UsXG4gICAgICBpZ25vcmVBdHRyczogZmFsc2UsXG4gICAgICBtZXJnZUF0dHJzOiBmYWxzZSxcbiAgICAgIGV4cGxpY2l0Um9vdDogZmFsc2UsXG4gICAgICB2YWxpZGF0b3I6IG51bGwsXG4gICAgICB4bWxuczogZmFsc2UsXG4gICAgICBleHBsaWNpdENoaWxkcmVuOiBmYWxzZSxcbiAgICAgIGNoaWxka2V5OiAnQEAnLFxuICAgICAgY2hhcnNBc0NoaWxkcmVuOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVXaGl0ZUNoYXJzOiBmYWxzZSxcbiAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgIGF0dHJOYW1lUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIGF0dHJWYWx1ZVByb2Nlc3NvcnM6IG51bGwsXG4gICAgICB0YWdOYW1lUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIGVtcHR5VGFnOiAnJ1xuICAgIH0sXG4gICAgXCIwLjJcIjoge1xuICAgICAgZXhwbGljaXRDaGFya2V5OiBmYWxzZSxcbiAgICAgIHRyaW06IGZhbHNlLFxuICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgIG5vcm1hbGl6ZVRhZ3M6IGZhbHNlLFxuICAgICAgYXR0cmtleTogXCIkXCIsXG4gICAgICBjaGFya2V5OiBcIl9cIixcbiAgICAgIGV4cGxpY2l0QXJyYXk6IHRydWUsXG4gICAgICBpZ25vcmVBdHRyczogZmFsc2UsXG4gICAgICBtZXJnZUF0dHJzOiBmYWxzZSxcbiAgICAgIGV4cGxpY2l0Um9vdDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRvcjogbnVsbCxcbiAgICAgIHhtbG5zOiBmYWxzZSxcbiAgICAgIGV4cGxpY2l0Q2hpbGRyZW46IGZhbHNlLFxuICAgICAgcHJlc2VydmVDaGlsZHJlbk9yZGVyOiBmYWxzZSxcbiAgICAgIGNoaWxka2V5OiAnJCQnLFxuICAgICAgY2hhcnNBc0NoaWxkcmVuOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVXaGl0ZUNoYXJzOiBmYWxzZSxcbiAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgIGF0dHJOYW1lUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIGF0dHJWYWx1ZVByb2Nlc3NvcnM6IG51bGwsXG4gICAgICB0YWdOYW1lUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHJvb3ROYW1lOiAncm9vdCcsXG4gICAgICB4bWxkZWM6IHtcbiAgICAgICAgJ3ZlcnNpb24nOiAnMS4wJyxcbiAgICAgICAgJ2VuY29kaW5nJzogJ1VURi04JyxcbiAgICAgICAgJ3N0YW5kYWxvbmUnOiB0cnVlXG4gICAgICB9LFxuICAgICAgZG9jdHlwZTogbnVsbCxcbiAgICAgIHJlbmRlck9wdHM6IHtcbiAgICAgICAgJ3ByZXR0eSc6IHRydWUsXG4gICAgICAgICdpbmRlbnQnOiAnICAnLFxuICAgICAgICAnbmV3bGluZSc6ICdcXG4nXG4gICAgICB9LFxuICAgICAgaGVhZGxlc3M6IGZhbHNlLFxuICAgICAgY2h1bmtTaXplOiAxMDAwMCxcbiAgICAgIGVtcHR5VGFnOiAnJyxcbiAgICAgIGNkYXRhOiBmYWxzZVxuICAgIH1cbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgYm9tLCBkZWZhdWx0cywgZXZlbnRzLCBpc0VtcHR5LCBwcm9jZXNzSXRlbSwgcHJvY2Vzc29ycywgcHJvbWlzaWZ5LCBzYXgsIHNldEltbWVkaWF0ZSxcbiAgICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHNheCA9IHJlcXVpcmUoJ3NheCcpO1xuXG4gIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4gIGJvbSA9IHJlcXVpcmUoJy4vYm9tJyk7XG5cbiAgcHJvY2Vzc29ycyA9IHJlcXVpcmUoJy4vcHJvY2Vzc29ycycpO1xuXG4gIHNldEltbWVkaWF0ZSA9IHJlcXVpcmUoJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcblxuICBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKS5kZWZhdWx0cztcblxuICBwcm9taXNpZnkgPSByZXF1aXJlKCd1dGlsLnByb21pc2lmeScpO1xuXG4gIGlzRW1wdHkgPSBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IFwib2JqZWN0XCIgJiYgKHRoaW5nICE9IG51bGwpICYmIE9iamVjdC5rZXlzKHRoaW5nKS5sZW5ndGggPT09IDA7XG4gIH07XG5cbiAgcHJvY2Vzc0l0ZW0gPSBmdW5jdGlvbihwcm9jZXNzb3JzLCBpdGVtLCBrZXkpIHtcbiAgICB2YXIgaSwgbGVuLCBwcm9jZXNzO1xuICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb2Nlc3NvcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHByb2Nlc3MgPSBwcm9jZXNzb3JzW2ldO1xuICAgICAgaXRlbSA9IHByb2Nlc3MoaXRlbSwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cbiAgZXhwb3J0cy5QYXJzZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChQYXJzZXIsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gUGFyc2VyKG9wdHMpIHtcbiAgICAgIHRoaXMucGFyc2VTdHJpbmdQcm9taXNlID0gYmluZCh0aGlzLnBhcnNlU3RyaW5nUHJvbWlzZSwgdGhpcyk7XG4gICAgICB0aGlzLnBhcnNlU3RyaW5nID0gYmluZCh0aGlzLnBhcnNlU3RyaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMucmVzZXQgPSBiaW5kKHRoaXMucmVzZXQsIHRoaXMpO1xuICAgICAgdGhpcy5hc3NpZ25PclB1c2ggPSBiaW5kKHRoaXMuYXNzaWduT3JQdXNoLCB0aGlzKTtcbiAgICAgIHRoaXMucHJvY2Vzc0FzeW5jID0gYmluZCh0aGlzLnByb2Nlc3NBc3luYywgdGhpcyk7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGV4cG9ydHMuUGFyc2VyKSkge1xuICAgICAgICByZXR1cm4gbmV3IGV4cG9ydHMuUGFyc2VyKG9wdHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgICByZWYgPSBkZWZhdWx0c1tcIjAuMlwiXTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZm9yIChrZXkgaW4gb3B0cykge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvcHRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSBvcHRzW2tleV07XG4gICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnhtbG5zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy54bWxuc2tleSA9IHRoaXMub3B0aW9ucy5hdHRya2V5ICsgXCJuc1wiO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub3JtYWxpemVUYWdzKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzLnVuc2hpZnQocHJvY2Vzc29ycy5ub3JtYWxpemUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIFBhcnNlci5wcm90b3R5cGUucHJvY2Vzc0FzeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2h1bmssIGVycjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZy5sZW5ndGggPD0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZSkge1xuICAgICAgICAgIGNodW5rID0gdGhpcy5yZW1haW5pbmc7XG4gICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSAnJztcbiAgICAgICAgICB0aGlzLnNheFBhcnNlciA9IHRoaXMuc2F4UGFyc2VyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVuayA9IHRoaXMucmVtYWluaW5nLnN1YnN0cigwLCB0aGlzLm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnN1YnN0cih0aGlzLm9wdGlvbnMuY2h1bmtTaXplLCB0aGlzLnJlbWFpbmluZy5sZW5ndGgpO1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyID0gdGhpcy5zYXhQYXJzZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUodGhpcy5wcm9jZXNzQXN5bmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyID0gZXJyb3IxO1xuICAgICAgICBpZiAoIXRoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFBhcnNlci5wcm90b3R5cGUuYXNzaWduT3JQdXNoID0gZnVuY3Rpb24ob2JqLCBrZXksIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5leHBsaWNpdEFycmF5KSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gW25ld1ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEob2JqW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialtrZXldLnB1c2gobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBQYXJzZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXR0cmtleSwgY2hhcmtleSwgb250ZXh0LCBzdGFjaztcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLnNheFBhcnNlciA9IHNheC5wYXJzZXIodGhpcy5vcHRpb25zLnN0cmljdCwge1xuICAgICAgICB0cmltOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgeG1sbnM6IHRoaXMub3B0aW9ucy54bWxuc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lcnJUaHJvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZXJyb3IgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLnJlc3VtZSgpO1xuICAgICAgICAgIGlmICghX3RoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZW5kID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLnNheFBhcnNlci5lbmRlZCkge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbWl0KFwiZW5kXCIsIF90aGlzLnJlc3VsdE9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lbmRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5FWFBMSUNJVF9DSEFSS0VZID0gdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hhcmtleTtcbiAgICAgIHRoaXMucmVzdWx0T2JqZWN0ID0gbnVsbDtcbiAgICAgIHN0YWNrID0gW107XG4gICAgICBhdHRya2V5ID0gdGhpcy5vcHRpb25zLmF0dHJrZXk7XG4gICAgICBjaGFya2V5ID0gdGhpcy5vcHRpb25zLmNoYXJrZXk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbm9wZW50YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICB2YXIga2V5LCBuZXdWYWx1ZSwgb2JqLCBwcm9jZXNzZWRLZXksIHJlZjtcbiAgICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbY2hhcmtleV0gPSBcIlwiO1xuICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5pZ25vcmVBdHRycykge1xuICAgICAgICAgICAgcmVmID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gcmVmKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmICghKGF0dHJrZXkgaW4gb2JqKSAmJiAhX3RoaXMub3B0aW9ucy5tZXJnZUF0dHJzKSB7XG4gICAgICAgICAgICAgICAgb2JqW2F0dHJrZXldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3VmFsdWUgPSBfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMsIG5vZGUuYXR0cmlidXRlc1trZXldLCBrZXkpIDogbm9kZS5hdHRyaWJ1dGVzW2tleV07XG4gICAgICAgICAgICAgIHByb2Nlc3NlZEtleSA9IF90aGlzLm9wdGlvbnMuYXR0ck5hbWVQcm9jZXNzb3JzID8gcHJvY2Vzc0l0ZW0oX3RoaXMub3B0aW9ucy5hdHRyTmFtZVByb2Nlc3NvcnMsIGtleSkgOiBrZXk7XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm1lcmdlQXR0cnMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5hc3NpZ25PclB1c2gob2JqLCBwcm9jZXNzZWRLZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbYXR0cmtleV1bcHJvY2Vzc2VkS2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtcIiNuYW1lXCJdID0gX3RoaXMub3B0aW9ucy50YWdOYW1lUHJvY2Vzc29ycyA/IHByb2Nlc3NJdGVtKF90aGlzLm9wdGlvbnMudGFnTmFtZVByb2Nlc3NvcnMsIG5vZGUubmFtZSkgOiBub2RlLm5hbWU7XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMueG1sbnMpIHtcbiAgICAgICAgICAgIG9ialtfdGhpcy5vcHRpb25zLnhtbG5za2V5XSA9IHtcbiAgICAgICAgICAgICAgdXJpOiBub2RlLnVyaSxcbiAgICAgICAgICAgICAgbG9jYWw6IG5vZGUubG9jYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdGFjay5wdXNoKG9iaik7XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uY2xvc2V0YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBjZGF0YSwgZW1wdHlTdHIsIGtleSwgbm9kZSwgbm9kZU5hbWUsIG9iaiwgb2JqQ2xvbmUsIG9sZCwgcywgeHBhdGg7XG4gICAgICAgICAgb2JqID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgbm9kZU5hbWUgPSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZXhwbGljaXRDaGlsZHJlbiB8fCAhX3RoaXMub3B0aW9ucy5wcmVzZXJ2ZUNoaWxkcmVuT3JkZXIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9iai5jZGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2RhdGEgPSBvYmouY2RhdGE7XG4gICAgICAgICAgICBkZWxldGUgb2JqLmNkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKG9ialtjaGFya2V5XS5tYXRjaCgvXlxccyokLykgJiYgIWNkYXRhKSB7XG4gICAgICAgICAgICBlbXB0eVN0ciA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbY2hhcmtleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnRyaW0pIHtcbiAgICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gb2JqW2NoYXJrZXldLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICBvYmpbY2hhcmtleV0gPSBvYmpbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gX3RoaXMub3B0aW9ucy52YWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLnZhbHVlUHJvY2Vzc29ycywgb2JqW2NoYXJrZXldLCBub2RlTmFtZSkgOiBvYmpbY2hhcmtleV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDEgJiYgY2hhcmtleSBpbiBvYmogJiYgIV90aGlzLkVYUExJQ0lUX0NIQVJLRVkpIHtcbiAgICAgICAgICAgICAgb2JqID0gb2JqW2NoYXJrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNFbXB0eShvYmopKSB7XG4gICAgICAgICAgICBvYmogPSBfdGhpcy5vcHRpb25zLmVtcHR5VGFnICE9PSAnJyA/IF90aGlzLm9wdGlvbnMuZW1wdHlUYWcgOiBlbXB0eVN0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMudmFsaWRhdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIHhwYXRoID0gXCIvXCIgKyAoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgaSwgbGVuLCByZXN1bHRzO1xuICAgICAgICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0YWNrLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHN0YWNrW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlW1wiI25hbWVcIl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfSkoKSkuY29uY2F0KG5vZGVOYW1lKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqID0gX3RoaXMub3B0aW9ucy52YWxpZGF0b3IoeHBhdGgsIHMgJiYgc1tub2RlTmFtZV0sIG9iaik7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hpbGRyZW4gJiYgIV90aGlzLm9wdGlvbnMubWVyZ2VBdHRycyAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLnByZXNlcnZlQ2hpbGRyZW5PcmRlcikge1xuICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF0dHJrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmF0dHJrZXldID0gb2JqW190aGlzLm9wdGlvbnMuYXR0cmtleV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9ialtfdGhpcy5vcHRpb25zLmF0dHJrZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5jaGFyc0FzQ2hpbGRyZW4gJiYgX3RoaXMub3B0aW9ucy5jaGFya2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIG5vZGVbX3RoaXMub3B0aW9ucy5jaGFya2V5XSA9IG9ialtfdGhpcy5vcHRpb25zLmNoYXJrZXldO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbX3RoaXMub3B0aW9ucy5jaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmNoaWxka2V5XSA9IG9iajtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvYmogPSBub2RlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBvYmpDbG9uZSA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG9iakNsb25lW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldLnB1c2gob2JqQ2xvbmUpO1xuICAgICAgICAgICAgICBkZWxldGUgb2JqW1wiI25hbWVcIl07XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMSAmJiBjaGFya2V5IGluIG9iaiAmJiAhX3RoaXMuRVhQTElDSVRfQ0hBUktFWSkge1xuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFzc2lnbk9yUHVzaChzLCBub2RlTmFtZSwgb2JqKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuZXhwbGljaXRSb290KSB7XG4gICAgICAgICAgICAgIG9sZCA9IG9iajtcbiAgICAgICAgICAgICAgb2JqID0ge307XG4gICAgICAgICAgICAgIG9ialtub2RlTmFtZV0gPSBvbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5yZXN1bHRPYmplY3QgPSBvYmo7XG4gICAgICAgICAgICBfdGhpcy5zYXhQYXJzZXIuZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVtaXQoXCJlbmRcIiwgX3RoaXMucmVzdWx0T2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIG9udGV4dCA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBjaGFyQ2hpbGQsIHM7XG4gICAgICAgICAgcyA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzW2NoYXJrZXldICs9IHRleHQ7XG4gICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5leHBsaWNpdENoaWxkcmVuICYmIF90aGlzLm9wdGlvbnMucHJlc2VydmVDaGlsZHJlbk9yZGVyICYmIF90aGlzLm9wdGlvbnMuY2hhcnNBc0NoaWxkcmVuICYmIChfdGhpcy5vcHRpb25zLmluY2x1ZGVXaGl0ZUNoYXJzIHx8IHRleHQucmVwbGFjZSgvXFxcXG4vZywgJycpLnRyaW0oKSAhPT0gJycpKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBjaGFyQ2hpbGQgPSB7XG4gICAgICAgICAgICAgICAgJyNuYW1lJzogJ19fdGV4dF9fJ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSB0ZXh0O1xuICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSBjaGFyQ2hpbGRbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0ucHVzaChjaGFyQ2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbnRleHQgPSBvbnRleHQ7XG4gICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIub25jZGF0YSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBzO1xuICAgICAgICAgIHMgPSBvbnRleHQodGV4dCk7XG4gICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmNkYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICB9O1xuXG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgY2IpIHtcbiAgICAgIHZhciBlcnI7XG4gICAgICBpZiAoKGNiICE9IG51bGwpICYmIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub24oXCJlbmRcIiwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzdHIgPSBzdHIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHN0ci50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIsIG51bGwpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0ciA9IGJvbS5zdHJpcEJPTShzdHIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFzeW5jKSB7XG4gICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSBzdHI7XG4gICAgICAgICAgc2V0SW1tZWRpYXRlKHRoaXMucHJvY2Vzc0FzeW5jKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2F4UGFyc2VyLndyaXRlKHN0cikuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnIgPSBlcnJvcjE7XG4gICAgICAgIGlmICghKHRoaXMuc2F4UGFyc2VyLmVyclRocm93biB8fCB0aGlzLnNheFBhcnNlci5lbmRlZCkpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIuZXJyVGhyb3duID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNheFBhcnNlci5lbmRlZCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RyaW5nUHJvbWlzZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgcmV0dXJuIHByb21pc2lmeSh0aGlzLnBhcnNlU3RyaW5nKShzdHIpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUGFyc2VyO1xuXG4gIH0pKGV2ZW50cyk7XG5cbiAgZXhwb3J0cy5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgYSwgYikge1xuICAgIHZhciBjYiwgb3B0aW9ucywgcGFyc2VyO1xuICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IGI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBhO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBwYXJzZXIgPSBuZXcgZXhwb3J0cy5QYXJzZXIob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZVN0cmluZyhzdHIsIGNiKTtcbiAgfTtcblxuICBleHBvcnRzLnBhcnNlU3RyaW5nUHJvbWlzZSA9IGZ1bmN0aW9uKHN0ciwgYSkge1xuICAgIHZhciBvcHRpb25zLCBwYXJzZXI7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgb3B0aW9ucyA9IGE7XG4gICAgfVxuICAgIHBhcnNlciA9IG5ldyBleHBvcnRzLlBhcnNlcihvcHRpb25zKTtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlU3RyaW5nUHJvbWlzZShzdHIpO1xuICB9O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBwcmVmaXhNYXRjaDtcblxuICBwcmVmaXhNYXRjaCA9IG5ldyBSZWdFeHAoLyg/IXhtbG5zKV4uKjovKTtcblxuICBleHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbiAgfTtcblxuICBleHBvcnRzLmZpcnN0Q2hhckxvd2VyQ2FzZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG4gIH07XG5cbiAgZXhwb3J0cy5zdHJpcFByZWZpeCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShwcmVmaXhNYXRjaCwgJycpO1xuICB9O1xuXG4gIGV4cG9ydHMucGFyc2VOdW1iZXJzID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKCFpc05hTihzdHIpKSB7XG4gICAgICBzdHIgPSBzdHIgJSAxID09PSAwID8gcGFyc2VJbnQoc3RyLCAxMCkgOiBwYXJzZUZsb2F0KHN0cik7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgZXhwb3J0cy5wYXJzZUJvb2xlYW5zID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKC9eKD86dHJ1ZXxmYWxzZSkkL2kudGVzdChzdHIpKSB7XG4gICAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBidWlsZGVyLCBkZWZhdWx0cywgcGFyc2VyLCBwcm9jZXNzb3JzLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbiAgYnVpbGRlciA9IHJlcXVpcmUoJy4vYnVpbGRlcicpO1xuXG4gIHBhcnNlciA9IHJlcXVpcmUoJy4vcGFyc2VyJyk7XG5cbiAgcHJvY2Vzc29ycyA9IHJlcXVpcmUoJy4vcHJvY2Vzc29ycycpO1xuXG4gIGV4cG9ydHMuZGVmYXVsdHMgPSBkZWZhdWx0cy5kZWZhdWx0cztcblxuICBleHBvcnRzLnByb2Nlc3NvcnMgPSBwcm9jZXNzb3JzO1xuXG4gIGV4cG9ydHMuVmFsaWRhdGlvbkVycm9yID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoVmFsaWRhdGlvbkVycm9yLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFZhbGlkYXRpb25FcnJvcihtZXNzYWdlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBWYWxpZGF0aW9uRXJyb3I7XG5cbiAgfSkoRXJyb3IpO1xuXG4gIGV4cG9ydHMuQnVpbGRlciA9IGJ1aWxkZXIuQnVpbGRlcjtcblxuICBleHBvcnRzLlBhcnNlciA9IHBhcnNlci5QYXJzZXI7XG5cbiAgZXhwb3J0cy5wYXJzZVN0cmluZyA9IHBhcnNlci5wYXJzZVN0cmluZztcblxuICBleHBvcnRzLnBhcnNlU3RyaW5nUHJvbWlzZSA9IHBhcnNlci5wYXJzZVN0cmluZ1Byb21pc2U7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBEaXNjb25uZWN0ZWQ6IDEsXG4gICAgUHJlY2VkaW5nOiAyLFxuICAgIEZvbGxvd2luZzogNCxcbiAgICBDb250YWluczogOCxcbiAgICBDb250YWluZWRCeTogMTYsXG4gICAgSW1wbGVtZW50YXRpb25TcGVjaWZpYzogMzJcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIG1vZHVsZS5leHBvcnRzID0ge1xuICAgIEVsZW1lbnQ6IDEsXG4gICAgQXR0cmlidXRlOiAyLFxuICAgIFRleHQ6IDMsXG4gICAgQ0RhdGE6IDQsXG4gICAgRW50aXR5UmVmZXJlbmNlOiA1LFxuICAgIEVudGl0eURlY2xhcmF0aW9uOiA2LFxuICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjogNyxcbiAgICBDb21tZW50OiA4LFxuICAgIERvY3VtZW50OiA5LFxuICAgIERvY1R5cGU6IDEwLFxuICAgIERvY3VtZW50RnJhZ21lbnQ6IDExLFxuICAgIE5vdGF0aW9uRGVjbGFyYXRpb246IDEyLFxuICAgIERlY2xhcmF0aW9uOiAyMDEsXG4gICAgUmF3OiAyMDIsXG4gICAgQXR0cmlidXRlRGVjbGFyYXRpb246IDIwMyxcbiAgICBFbGVtZW50RGVjbGFyYXRpb246IDIwNCxcbiAgICBEdW1teTogMjA1XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgYXNzaWduLCBnZXRWYWx1ZSwgaXNBcnJheSwgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzUGxhaW5PYmplY3QsXG4gICAgc2xpY2UgPSBbXS5zbGljZSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGksIGtleSwgbGVuLCBzb3VyY2UsIHNvdXJjZXMsIHRhcmdldDtcbiAgICB0YXJnZXQgPSBhcmd1bWVudHNbMF0sIHNvdXJjZXMgPSAyIDw9IGFyZ3VtZW50cy5sZW5ndGggPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkgOiBbXTtcbiAgICBpZiAoaXNGdW5jdGlvbihPYmplY3QuYXNzaWduKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHJldHVybiAhIXZhbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcblxuICBpc09iamVjdCA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuICEhdmFsICYmICgocmVmID0gdHlwZW9mIHZhbCkgPT09ICdmdW5jdGlvbicgfHwgcmVmID09PSAnb2JqZWN0Jyk7XG4gIH07XG5cbiAgaXNBcnJheSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKEFycmF5LmlzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuICB9O1xuXG4gIGlzRW1wdHkgPSBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIga2V5O1xuICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJldHVybiAhdmFsLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChrZXkgaW4gdmFsKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHZhbCwga2V5KSkgY29udGludWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIGN0b3IsIHByb3RvO1xuICAgIHJldHVybiBpc09iamVjdCh2YWwpICYmIChwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKSAmJiAoY3RvciA9IHByb3RvLmNvbnN0cnVjdG9yKSAmJiAodHlwZW9mIGN0b3IgPT09ICdmdW5jdGlvbicpICYmIChjdG9yIGluc3RhbmNlb2YgY3RvcikgJiYgKEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGN0b3IpID09PSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChPYmplY3QpKTtcbiAgfTtcblxuICBnZXRWYWx1ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChpc0Z1bmN0aW9uKG9iai52YWx1ZU9mKSkge1xuICAgICAgcmV0dXJuIG9iai52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLmFzc2lnbiA9IGFzc2lnbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuXG4gIG1vZHVsZS5leHBvcnRzLmdldFZhbHVlID0gZ2V0VmFsdWU7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBOb25lOiAwLFxuICAgIE9wZW5UYWc6IDEsXG4gICAgSW5zaWRlVGFnOiAyLFxuICAgIENsb3NlVGFnOiAzXG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTEF0dHJpYnV0ZSwgWE1MTm9kZTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxBdHRyaWJ1dGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gWE1MQXR0cmlidXRlKHBhcmVudCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHRoaXMucGFyZW50Lm9wdGlvbnM7XG4gICAgICAgIHRoaXMuc3RyaW5naWZ5ID0gdGhpcy5wYXJlbnQuc3RyaW5naWZ5O1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGF0dHJpYnV0ZSBuYW1lLiBcIiArIHRoaXMuZGVidWdJbmZvKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5Lm5hbWUobmFtZSk7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuYXR0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy50eXBlID0gTm9kZVR5cGUuQXR0cmlidXRlO1xuICAgICAgdGhpcy5pc0lkID0gZmFsc2U7XG4gICAgICB0aGlzLnNjaGVtYVR5cGVJbmZvID0gbnVsbDtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MQXR0cmlidXRlLnByb3RvdHlwZSwgJ25vZGVUeXBlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxBdHRyaWJ1dGUucHJvdG90eXBlLCAnb3duZXJFbGVtZW50Jywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEF0dHJpYnV0ZS5wcm90b3R5cGUsICd0ZXh0Q29udGVudCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmFtZXNwYWNlVVJJJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEF0dHJpYnV0ZS5wcm90b3R5cGUsICdwcmVmaXgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MQXR0cmlidXRlLnByb3RvdHlwZSwgJ2xvY2FsTmFtZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MQXR0cmlidXRlLnByb3RvdHlwZSwgJ3NwZWNpZmllZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgWE1MQXR0cmlidXRlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTEF0dHJpYnV0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5hdHRyaWJ1dGUodGhpcywgdGhpcy5vcHRpb25zLndyaXRlci5maWx0ZXJPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9O1xuXG4gICAgWE1MQXR0cmlidXRlLnByb3RvdHlwZS5kZWJ1Z0luZm8gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBuYW1lID0gbmFtZSB8fCB0aGlzLm5hbWU7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcInBhcmVudDogPFwiICsgdGhpcy5wYXJlbnQubmFtZSArIFwiPlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlOiB7XCIgKyBuYW1lICsgXCJ9LCBwYXJlbnQ6IDxcIiArIHRoaXMucGFyZW50Lm5hbWUgKyBcIj5cIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MQXR0cmlidXRlLnByb3RvdHlwZS5pc0VxdWFsTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWVzcGFjZVVSSSAhPT0gdGhpcy5uYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUucHJlZml4ICE9PSB0aGlzLnByZWZpeCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5sb2NhbE5hbWUgIT09IHRoaXMubG9jYWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MQXR0cmlidXRlO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTENEYXRhLCBYTUxDaGFyYWN0ZXJEYXRhLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgTm9kZVR5cGUgPSByZXF1aXJlKCcuL05vZGVUeXBlJyk7XG5cbiAgWE1MQ2hhcmFjdGVyRGF0YSA9IHJlcXVpcmUoJy4vWE1MQ2hhcmFjdGVyRGF0YScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MQ0RhdGEgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxDRGF0YSwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDRGF0YShwYXJlbnQsIHRleHQpIHtcbiAgICAgIFhNTENEYXRhLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgQ0RBVEEgdGV4dC4gXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IFwiI2NkYXRhLXNlY3Rpb25cIjtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkNEYXRhO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3RyaW5naWZ5LmNkYXRhKHRleHQpO1xuICAgIH1cblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmNkYXRhKHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxDRGF0YTtcblxuICB9KShYTUxDaGFyYWN0ZXJEYXRhKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxDaGFyYWN0ZXJEYXRhLCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MQ2hhcmFjdGVyRGF0YSA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTENoYXJhY3RlckRhdGEsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MQ2hhcmFjdGVyRGF0YShwYXJlbnQpIHtcbiAgICAgIFhNTENoYXJhY3RlckRhdGEuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MQ2hhcmFjdGVyRGF0YS5wcm90b3R5cGUsICdkYXRhJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLCAnbGVuZ3RoJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLCAndGV4dENvbnRlbnQnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBYTUxDaGFyYWN0ZXJEYXRhLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLnN1YnN0cmluZ0RhdGEgPSBmdW5jdGlvbihvZmZzZXQsIGNvdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLmFwcGVuZERhdGEgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MQ2hhcmFjdGVyRGF0YS5wcm90b3R5cGUuaW5zZXJ0RGF0YSA9IGZ1bmN0aW9uKG9mZnNldCwgYXJnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihvZmZzZXQsIGNvdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLnJlcGxhY2VEYXRhID0gZnVuY3Rpb24ob2Zmc2V0LCBjb3VudCwgYXJnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTENoYXJhY3RlckRhdGEucHJvdG90eXBlLmlzRXF1YWxOb2RlID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKCFYTUxDaGFyYWN0ZXJEYXRhLl9fc3VwZXJfXy5pc0VxdWFsTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLmlzRXF1YWxOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmRhdGEgIT09IHRoaXMuZGF0YSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTENoYXJhY3RlckRhdGE7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTENoYXJhY3RlckRhdGEsIFhNTENvbW1lbnQsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxDaGFyYWN0ZXJEYXRhID0gcmVxdWlyZSgnLi9YTUxDaGFyYWN0ZXJEYXRhJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxDb21tZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MQ29tbWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDb21tZW50KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MQ29tbWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbW1lbnQgdGV4dC4gXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IFwiI2NvbW1lbnRcIjtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkNvbW1lbnQ7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuY29tbWVudCh0ZXh0KTtcbiAgICB9XG5cbiAgICBYTUxDb21tZW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTENvbW1lbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuY29tbWVudCh0aGlzLCB0aGlzLm9wdGlvbnMud3JpdGVyLmZpbHRlck9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MQ29tbWVudDtcblxuICB9KShYTUxDaGFyYWN0ZXJEYXRhKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxET01Db25maWd1cmF0aW9uLCBYTUxET01FcnJvckhhbmRsZXIsIFhNTERPTVN0cmluZ0xpc3Q7XG5cbiAgWE1MRE9NRXJyb3JIYW5kbGVyID0gcmVxdWlyZSgnLi9YTUxET01FcnJvckhhbmRsZXInKTtcblxuICBYTUxET01TdHJpbmdMaXN0ID0gcmVxdWlyZSgnLi9YTUxET01TdHJpbmdMaXN0Jyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxET01Db25maWd1cmF0aW9uID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFhNTERPTUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgICB2YXIgY2xvbmVkU2VsZjtcbiAgICAgIHRoaXMuZGVmYXVsdFBhcmFtcyA9IHtcbiAgICAgICAgXCJjYW5vbmljYWwtZm9ybVwiOiBmYWxzZSxcbiAgICAgICAgXCJjZGF0YS1zZWN0aW9uc1wiOiBmYWxzZSxcbiAgICAgICAgXCJjb21tZW50c1wiOiBmYWxzZSxcbiAgICAgICAgXCJkYXRhdHlwZS1ub3JtYWxpemF0aW9uXCI6IGZhbHNlLFxuICAgICAgICBcImVsZW1lbnQtY29udGVudC13aGl0ZXNwYWNlXCI6IHRydWUsXG4gICAgICAgIFwiZW50aXRpZXNcIjogdHJ1ZSxcbiAgICAgICAgXCJlcnJvci1oYW5kbGVyXCI6IG5ldyBYTUxET01FcnJvckhhbmRsZXIoKSxcbiAgICAgICAgXCJpbmZvc2V0XCI6IHRydWUsXG4gICAgICAgIFwidmFsaWRhdGUtaWYtc2NoZW1hXCI6IGZhbHNlLFxuICAgICAgICBcIm5hbWVzcGFjZXNcIjogdHJ1ZSxcbiAgICAgICAgXCJuYW1lc3BhY2UtZGVjbGFyYXRpb25zXCI6IHRydWUsXG4gICAgICAgIFwibm9ybWFsaXplLWNoYXJhY3RlcnNcIjogZmFsc2UsXG4gICAgICAgIFwic2NoZW1hLWxvY2F0aW9uXCI6ICcnLFxuICAgICAgICBcInNjaGVtYS10eXBlXCI6ICcnLFxuICAgICAgICBcInNwbGl0LWNkYXRhLXNlY3Rpb25zXCI6IHRydWUsXG4gICAgICAgIFwidmFsaWRhdGVcIjogZmFsc2UsXG4gICAgICAgIFwid2VsbC1mb3JtZWRcIjogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMucGFyYW1zID0gY2xvbmVkU2VsZiA9IE9iamVjdC5jcmVhdGUodGhpcy5kZWZhdWx0UGFyYW1zKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRE9NQ29uZmlndXJhdGlvbi5wcm90b3R5cGUsICdwYXJhbWV0ZXJOYW1lcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MRE9NU3RyaW5nTGlzdChPYmplY3Qua2V5cyh0aGlzLmRlZmF1bHRQYXJhbXMpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFhNTERPTUNvbmZpZ3VyYXRpb24ucHJvdG90eXBlLmdldFBhcmFtZXRlciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIGlmICh0aGlzLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXNbbmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MRE9NQ29uZmlndXJhdGlvbi5wcm90b3R5cGUuY2FuU2V0UGFyYW1ldGVyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBYTUxET01Db25maWd1cmF0aW9uLnByb3RvdHlwZS5zZXRQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zW25hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVsZXRlIHRoaXMucGFyYW1zW25hbWVdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRE9NQ29uZmlndXJhdGlvbjtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTERPTUVycm9ySGFuZGxlcjtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERPTUVycm9ySGFuZGxlciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxET01FcnJvckhhbmRsZXIoKSB7fVxuXG4gICAgWE1MRE9NRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRE9NRXJyb3JIYW5kbGVyO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRE9NSW1wbGVtZW50YXRpb247XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxET01JbXBsZW1lbnRhdGlvbiA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxET01JbXBsZW1lbnRhdGlvbigpIHt9XG5cbiAgICBYTUxET01JbXBsZW1lbnRhdGlvbi5wcm90b3R5cGUuaGFzRmVhdHVyZSA9IGZ1bmN0aW9uKGZlYXR1cmUsIHZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBYTUxET01JbXBsZW1lbnRhdGlvbi5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRUeXBlID0gZnVuY3Rpb24ocXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9O1xuXG4gICAgWE1MRE9NSW1wbGVtZW50YXRpb24ucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50ID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCBkb2N0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9O1xuXG4gICAgWE1MRE9NSW1wbGVtZW50YXRpb24ucHJvdG90eXBlLmNyZWF0ZUhUTUxEb2N1bWVudCA9IGZ1bmN0aW9uKHRpdGxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9O1xuXG4gICAgWE1MRE9NSW1wbGVtZW50YXRpb24ucHJvdG90eXBlLmdldEZlYXR1cmUgPSBmdW5jdGlvbihmZWF0dXJlLCB2ZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERPTUltcGxlbWVudGF0aW9uO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRE9NU3RyaW5nTGlzdDtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERPTVN0cmluZ0xpc3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gWE1MRE9NU3RyaW5nTGlzdChhcnIpIHtcbiAgICAgIHRoaXMuYXJyID0gYXJyIHx8IFtdO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxET01TdHJpbmdMaXN0LnByb3RvdHlwZSwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyci5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBYTUxET01TdHJpbmdMaXN0LnByb3RvdHlwZS5pdGVtID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFycltpbmRleF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgWE1MRE9NU3RyaW5nTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyci5pbmRleE9mKHN0cikgIT09IC0xO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRE9NU3RyaW5nTGlzdDtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIE5vZGVUeXBlLCBYTUxEVERBdHRMaXN0LCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFREQXR0TGlzdCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERUREF0dExpc3QsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFREQXR0TGlzdChwYXJlbnQsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIFhNTERUREF0dExpc3QuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGVsZW1lbnQgbmFtZS4gXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIG5hbWUuIFwiICsgdGhpcy5kZWJ1Z0luZm8oZWxlbWVudE5hbWUpKTtcbiAgICAgIH1cbiAgICAgIGlmICghYXR0cmlidXRlVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIERURCBhdHRyaWJ1dGUgdHlwZS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhlbGVtZW50TmFtZSkpO1xuICAgICAgfVxuICAgICAgaWYgKCFkZWZhdWx0VmFsdWVUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGF0dHJpYnV0ZSBkZWZhdWx0LiBcIiArIHRoaXMuZGVidWdJbmZvKGVsZW1lbnROYW1lKSk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlVHlwZS5pbmRleE9mKCcjJykgIT09IDApIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlVHlwZSA9ICcjJyArIGRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZmF1bHRWYWx1ZVR5cGUubWF0Y2goL14oI1JFUVVJUkVEfCNJTVBMSUVEfCNGSVhFRHwjREVGQVVMVCkkLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkZWZhdWx0IHZhbHVlIHR5cGU7IGV4cGVjdGVkOiAjUkVRVUlSRUQsICNJTVBMSUVELCAjRklYRUQgb3IgI0RFRkFVTFQuIFwiICsgdGhpcy5kZWJ1Z0luZm8oZWxlbWVudE5hbWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgJiYgIWRlZmF1bHRWYWx1ZVR5cGUubWF0Y2goL14oI0ZJWEVEfCNERUZBVUxUKSQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IHZhbHVlIG9ubHkgYXBwbGllcyB0byAjRklYRUQgb3IgI0RFRkFVTFQuIFwiICsgdGhpcy5kZWJ1Z0luZm8oZWxlbWVudE5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSB0aGlzLnN0cmluZ2lmeS5uYW1lKGVsZW1lbnROYW1lKTtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkF0dHJpYnV0ZURlY2xhcmF0aW9uO1xuICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gdGhpcy5zdHJpbmdpZnkubmFtZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEF0dFR5cGUoYXR0cmlidXRlVHlwZSk7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5zdHJpbmdpZnkuZHRkQXR0RGVmYXVsdChkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVUeXBlID0gZGVmYXVsdFZhbHVlVHlwZTtcbiAgICB9XG5cbiAgICBYTUxEVERBdHRMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmR0ZEF0dExpc3QodGhpcywgdGhpcy5vcHRpb25zLndyaXRlci5maWx0ZXJPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREF0dExpc3Q7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTERUREVsZW1lbnQsIFhNTE5vZGUsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgTm9kZVR5cGUgPSByZXF1aXJlKCcuL05vZGVUeXBlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxEVERFbGVtZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRERWxlbWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxEVERFbGVtZW50KHBhcmVudCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIFhNTERUREVsZW1lbnQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgZWxlbWVudCBuYW1lLiBcIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9ICcoI1BDREFUQSknO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gJygnICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfVxuICAgICAgdGhpcy5uYW1lID0gdGhpcy5zdHJpbmdpZnkubmFtZShuYW1lKTtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkVsZW1lbnREZWNsYXJhdGlvbjtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnN0cmluZ2lmeS5kdGRFbGVtZW50VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIFhNTERUREVsZW1lbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuZHRkRWxlbWVudCh0aGlzLCB0aGlzLm9wdGlvbnMud3JpdGVyLmZpbHRlck9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRFRERWxlbWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgWE1MRFRERW50aXR5LCBYTUxOb2RlLCBpc09iamVjdCxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNPYmplY3Q7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFRERW50aXR5ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRERW50aXR5LCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERUREVudGl0eShwYXJlbnQsIHBlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRERW50aXR5Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGVudGl0eSBuYW1lLiBcIiArIHRoaXMuZGVidWdJbmZvKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGVudGl0eSB2YWx1ZS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhuYW1lKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlID0gISFwZTtcbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5Lm5hbWUobmFtZSk7XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5FbnRpdHlEZWNsYXJhdGlvbjtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnN0cmluZ2lmeS5kdGRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF2YWx1ZS5wdWJJRCAmJiAhdmFsdWUuc3lzSUQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQdWJsaWMgYW5kL29yIHN5c3RlbSBpZGVudGlmaWVycyBhcmUgcmVxdWlyZWQgZm9yIGFuIGV4dGVybmFsIGVudGl0eS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLnB1YklEICYmICF2YWx1ZS5zeXNJRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5c3RlbSBpZGVudGlmaWVyIGlzIHJlcXVpcmVkIGZvciBhIHB1YmxpYyBleHRlcm5hbCBlbnRpdHkuIFwiICsgdGhpcy5kZWJ1Z0luZm8obmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHZhbHVlLnB1YklEICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnB1YklEID0gdGhpcy5zdHJpbmdpZnkuZHRkUHViSUQodmFsdWUucHViSUQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5zeXNJRCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zeXNJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFN5c0lEKHZhbHVlLnN5c0lEKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUubkRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubkRhdGEgPSB0aGlzLnN0cmluZ2lmeS5kdGRORGF0YSh2YWx1ZS5uRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGUgJiYgdGhpcy5uRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdGF0aW9uIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRFRERW50aXR5LnByb3RvdHlwZSwgJ3B1YmxpY0lkJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHViSUQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRFRERW50aXR5LnByb3RvdHlwZSwgJ3N5c3RlbUlkJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3lzSUQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRFRERW50aXR5LnByb3RvdHlwZSwgJ25vdGF0aW9uTmFtZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5EYXRhIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRFRERW50aXR5LnByb3RvdHlwZSwgJ2lucHV0RW5jb2RpbmcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEVERFbnRpdHkucHJvdG90eXBlLCAneG1sRW5jb2RpbmcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEVERFbnRpdHkucHJvdG90eXBlLCAneG1sVmVyc2lvbicsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgWE1MRFRERW50aXR5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmR0ZEVudGl0eSh0aGlzLCB0aGlzLm9wdGlvbnMud3JpdGVyLmZpbHRlck9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRFRERW50aXR5O1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIE5vZGVUeXBlLCBYTUxEVEROb3RhdGlvbiwgWE1MTm9kZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERURE5vdGF0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRETm90YXRpb24sIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFRETm90YXRpb24ocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRETm90YXRpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgbm90YXRpb24gbmFtZS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhuYW1lKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlLnB1YklEICYmICF2YWx1ZS5zeXNJRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQdWJsaWMgb3Igc3lzdGVtIGlkZW50aWZpZXJzIGFyZSByZXF1aXJlZCBmb3IgYW4gZXh0ZXJuYWwgZW50aXR5LiBcIiArIHRoaXMuZGVidWdJbmZvKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5Lm5hbWUobmFtZSk7XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5Ob3RhdGlvbkRlY2xhcmF0aW9uO1xuICAgICAgaWYgKHZhbHVlLnB1YklEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHZhbHVlLnB1YklEKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5zeXNJRCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRCh2YWx1ZS5zeXNJRCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERURE5vdGF0aW9uLnByb3RvdHlwZSwgJ3B1YmxpY0lkJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHViSUQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRFRETm90YXRpb24ucHJvdG90eXBlLCAnc3lzdGVtSWQnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeXNJRDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFhNTERURE5vdGF0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmR0ZE5vdGF0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEVEROb3RhdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgWE1MRGVjbGFyYXRpb24sIFhNTE5vZGUsIGlzT2JqZWN0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgaXNPYmplY3QgPSByZXF1aXJlKCcuL1V0aWxpdHknKS5pc09iamVjdDtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgTm9kZVR5cGUgPSByZXF1aXJlKCcuL05vZGVUeXBlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxEZWNsYXJhdGlvbiA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERlY2xhcmF0aW9uLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERlY2xhcmF0aW9uKHBhcmVudCwgdmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHZhciByZWY7XG4gICAgICBYTUxEZWNsYXJhdGlvbi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKGlzT2JqZWN0KHZlcnNpb24pKSB7XG4gICAgICAgIHJlZiA9IHZlcnNpb24sIHZlcnNpb24gPSByZWYudmVyc2lvbiwgZW5jb2RpbmcgPSByZWYuZW5jb2RpbmcsIHN0YW5kYWxvbmUgPSByZWYuc3RhbmRhbG9uZTtcbiAgICAgIH1cbiAgICAgIGlmICghdmVyc2lvbikge1xuICAgICAgICB2ZXJzaW9uID0gJzEuMCc7XG4gICAgICB9XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5EZWNsYXJhdGlvbjtcbiAgICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuc3RyaW5naWZ5LnhtbFZlcnNpb24odmVyc2lvbik7XG4gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gdGhpcy5zdHJpbmdpZnkueG1sRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmUgPSB0aGlzLnN0cmluZ2lmeS54bWxTdGFuZGFsb25lKHN0YW5kYWxvbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTERlY2xhcmF0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmRlY2xhcmF0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEZWNsYXJhdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgWE1MRFREQXR0TGlzdCwgWE1MRFRERWxlbWVudCwgWE1MRFRERW50aXR5LCBYTUxEVEROb3RhdGlvbiwgWE1MRG9jVHlwZSwgWE1MTmFtZWROb2RlTWFwLCBYTUxOb2RlLCBpc09iamVjdCxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNPYmplY3Q7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIFhNTERUREF0dExpc3QgPSByZXF1aXJlKCcuL1hNTERUREF0dExpc3QnKTtcblxuICBYTUxEVERFbnRpdHkgPSByZXF1aXJlKCcuL1hNTERUREVudGl0eScpO1xuXG4gIFhNTERUREVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTERUREVsZW1lbnQnKTtcblxuICBYTUxEVEROb3RhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRFRETm90YXRpb24nKTtcblxuICBYTUxOYW1lZE5vZGVNYXAgPSByZXF1aXJlKCcuL1hNTE5hbWVkTm9kZU1hcCcpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jVHlwZSA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERvY1R5cGUsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRG9jVHlwZShwYXJlbnQsIHB1YklELCBzeXNJRCkge1xuICAgICAgdmFyIGNoaWxkLCBpLCBsZW4sIHJlZiwgcmVmMSwgcmVmMjtcbiAgICAgIFhNTERvY1R5cGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkRvY1R5cGU7XG4gICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIHJlZiA9IHBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWZbaV07XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IE5vZGVUeXBlLkVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZG9jdW1lbnRPYmplY3QgPSBwYXJlbnQ7XG4gICAgICBpZiAoaXNPYmplY3QocHViSUQpKSB7XG4gICAgICAgIHJlZjEgPSBwdWJJRCwgcHViSUQgPSByZWYxLnB1YklELCBzeXNJRCA9IHJlZjEuc3lzSUQ7XG4gICAgICB9XG4gICAgICBpZiAoc3lzSUQgPT0gbnVsbCkge1xuICAgICAgICByZWYyID0gW3B1YklELCBzeXNJRF0sIHN5c0lEID0gcmVmMlswXSwgcHViSUQgPSByZWYyWzFdO1xuICAgICAgfVxuICAgICAgaWYgKHB1YklEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHB1YklEKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeXNJRCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRChzeXNJRCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY1R5cGUucHJvdG90eXBlLCAnZW50aXRpZXMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2hpbGQsIGksIGxlbiwgbm9kZXMsIHJlZjtcbiAgICAgICAgbm9kZXMgPSB7fTtcbiAgICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWZbaV07XG4gICAgICAgICAgaWYgKChjaGlsZC50eXBlID09PSBOb2RlVHlwZS5FbnRpdHlEZWNsYXJhdGlvbikgJiYgIWNoaWxkLnBlKSB7XG4gICAgICAgICAgICBub2Rlc1tjaGlsZC5uYW1lXSA9IGNoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFhNTE5hbWVkTm9kZU1hcChub2Rlcyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jVHlwZS5wcm90b3R5cGUsICdub3RhdGlvbnMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2hpbGQsIGksIGxlbiwgbm9kZXMsIHJlZjtcbiAgICAgICAgbm9kZXMgPSB7fTtcbiAgICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWZbaV07XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IE5vZGVUeXBlLk5vdGF0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIG5vZGVzW2NoaWxkLm5hbWVdID0gY2hpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWE1MTmFtZWROb2RlTWFwKG5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEb2NUeXBlLnByb3RvdHlwZSwgJ3B1YmxpY0lkJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHViSUQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jVHlwZS5wcm90b3R5cGUsICdzeXN0ZW1JZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5c0lEO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY1R5cGUucHJvdG90eXBlLCAnaW50ZXJuYWxTdWJzZXQnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBYTUxEb2NUeXBlLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERUREVsZW1lbnQodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2NUeXBlLnByb3RvdHlwZS5hdHRMaXN0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIGNoaWxkO1xuICAgICAgY2hpbGQgPSBuZXcgWE1MRFREQXR0TGlzdCh0aGlzLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVHlwZSwgZGVmYXVsdFZhbHVlVHlwZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZW50aXR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERUREVudGl0eSh0aGlzLCBmYWxzZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2NUeXBlLnByb3RvdHlwZS5wRW50aXR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERUREVudGl0eSh0aGlzLCB0cnVlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLm5vdGF0aW9uID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERURE5vdGF0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5kb2NUeXBlKHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdChlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVHlwZSwgZGVmYXVsdFZhbHVlVHlwZSwgZGVmYXVsdFZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnBlbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucEVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RhdGlvbihuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290KCkgfHwgdGhpcy5kb2N1bWVudE9iamVjdDtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuaXNFcXVhbE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAoIVhNTERvY1R5cGUuX19zdXBlcl9fLmlzRXF1YWxOb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykuaXNFcXVhbE5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUubmFtZSAhPT0gdGhpcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnB1YmxpY0lkICE9PSB0aGlzLnB1YmxpY0lkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnN5c3RlbUlkICE9PSB0aGlzLnN5c3RlbUlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRG9jVHlwZTtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgWE1MRE9NQ29uZmlndXJhdGlvbiwgWE1MRE9NSW1wbGVtZW50YXRpb24sIFhNTERvY3VtZW50LCBYTUxOb2RlLCBYTUxTdHJpbmdXcml0ZXIsIFhNTFN0cmluZ2lmaWVyLCBpc1BsYWluT2JqZWN0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLmlzUGxhaW5PYmplY3Q7XG5cbiAgWE1MRE9NSW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL1hNTERPTUltcGxlbWVudGF0aW9uJyk7XG5cbiAgWE1MRE9NQ29uZmlndXJhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRE9NQ29uZmlndXJhdGlvbicpO1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxTdHJpbmdpZmllciA9IHJlcXVpcmUoJy4vWE1MU3RyaW5naWZpZXInKTtcblxuICBYTUxTdHJpbmdXcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmluZ1dyaXRlcicpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jdW1lbnQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxEb2N1bWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxEb2N1bWVudChvcHRpb25zKSB7XG4gICAgICBYTUxEb2N1bWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBudWxsKTtcbiAgICAgIHRoaXMubmFtZSA9IFwiI2RvY3VtZW50XCI7XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5Eb2N1bWVudDtcbiAgICAgIHRoaXMuZG9jdW1lbnRVUkkgPSBudWxsO1xuICAgICAgdGhpcy5kb21Db25maWcgPSBuZXcgWE1MRE9NQ29uZmlndXJhdGlvbigpO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIGlmICghb3B0aW9ucy53cml0ZXIpIHtcbiAgICAgICAgb3B0aW9ucy53cml0ZXIgPSBuZXcgWE1MU3RyaW5nV3JpdGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgdGhpcy5zdHJpbmdpZnkgPSBuZXcgWE1MU3RyaW5naWZpZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY3VtZW50LnByb3RvdHlwZSwgJ2ltcGxlbWVudGF0aW9uJywge1xuICAgICAgdmFsdWU6IG5ldyBYTUxET01JbXBsZW1lbnRhdGlvbigpXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jdW1lbnQucHJvdG90eXBlLCAnZG9jdHlwZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByZWY7XG4gICAgICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBOb2RlVHlwZS5Eb2NUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY3VtZW50LnByb3RvdHlwZSwgJ2RvY3VtZW50RWxlbWVudCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RPYmplY3QgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEb2N1bWVudC5wcm90b3R5cGUsICdpbnB1dEVuY29kaW5nJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jdW1lbnQucHJvdG90eXBlLCAnc3RyaWN0RXJyb3JDaGVja2luZycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEb2N1bWVudC5wcm90b3R5cGUsICd4bWxFbmNvZGluZycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCAmJiB0aGlzLmNoaWxkcmVuWzBdLnR5cGUgPT09IE5vZGVUeXBlLkRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bMF0uZW5jb2Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEb2N1bWVudC5wcm90b3R5cGUsICd4bWxTdGFuZGFsb25lJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9PSAwICYmIHRoaXMuY2hpbGRyZW5bMF0udHlwZSA9PT0gTm9kZVR5cGUuRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXS5zdGFuZGFsb25lID09PSAneWVzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxEb2N1bWVudC5wcm90b3R5cGUsICd4bWxWZXJzaW9uJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9PSAwICYmIHRoaXMuY2hpbGRyZW5bMF0udHlwZSA9PT0gTm9kZVR5cGUuRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXS52ZXJzaW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jdW1lbnQucHJvdG90eXBlLCAnVVJMJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRVUkk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jdW1lbnQucHJvdG90eXBlLCAnb3JpZ2luJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MRG9jdW1lbnQucHJvdG90eXBlLCAnY29tcGF0TW9kZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY3VtZW50LnByb3RvdHlwZSwgJ2NoYXJhY3RlclNldCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTERvY3VtZW50LnByb3RvdHlwZSwgJ2NvbnRlbnRUeXBlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24od3JpdGVyKSB7XG4gICAgICB2YXIgd3JpdGVyT3B0aW9ucztcbiAgICAgIHdyaXRlck9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghd3JpdGVyKSB7XG4gICAgICAgIHdyaXRlciA9IHRoaXMub3B0aW9ucy53cml0ZXI7XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qod3JpdGVyKSkge1xuICAgICAgICB3cml0ZXJPcHRpb25zID0gd3JpdGVyO1xuICAgICAgICB3cml0ZXIgPSB0aGlzLm9wdGlvbnMud3JpdGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlci5kb2N1bWVudCh0aGlzLCB3cml0ZXIuZmlsdGVyT3B0aW9ucyh3cml0ZXJPcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmRvY3VtZW50KHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlVGV4dE5vZGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQ0RBVEFTZWN0aW9uID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCBkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbnRpdHlSZWZlcmVuY2UgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGZ1bmN0aW9uKHRhZ25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUgPSBmdW5jdGlvbihpbXBvcnRlZE5vZGUsIGRlZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnROUyA9IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQXR0cmlidXRlTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbihlbGVtZW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmFkb3B0Tm9kZSA9IGZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUubm9ybWFsaXplRG9jdW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLnJlbmFtZU5vZGUgPSBmdW5jdGlvbihub2RlLCBuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbihjbGFzc05hbWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50SW50ZXJmYWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVSYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlTm9kZUl0ZXJhdG9yID0gZnVuY3Rpb24ocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVUcmVlV2Fsa2VyID0gZnVuY3Rpb24ocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEb2N1bWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgV3JpdGVyU3RhdGUsIFhNTEF0dHJpYnV0ZSwgWE1MQ0RhdGEsIFhNTENvbW1lbnQsIFhNTERUREF0dExpc3QsIFhNTERUREVsZW1lbnQsIFhNTERUREVudGl0eSwgWE1MRFRETm90YXRpb24sIFhNTERlY2xhcmF0aW9uLCBYTUxEb2NUeXBlLCBYTUxEb2N1bWVudCwgWE1MRG9jdW1lbnRDQiwgWE1MRWxlbWVudCwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFN0cmluZ1dyaXRlciwgWE1MU3RyaW5naWZpZXIsIFhNTFRleHQsIGdldFZhbHVlLCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNQbGFpbk9iamVjdCwgcmVmLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICByZWYgPSByZXF1aXJlKCcuL1V0aWxpdHknKSwgaXNPYmplY3QgPSByZWYuaXNPYmplY3QsIGlzRnVuY3Rpb24gPSByZWYuaXNGdW5jdGlvbiwgaXNQbGFpbk9iamVjdCA9IHJlZi5pc1BsYWluT2JqZWN0LCBnZXRWYWx1ZSA9IHJlZi5nZXRWYWx1ZTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxEb2N1bWVudCA9IHJlcXVpcmUoJy4vWE1MRG9jdW1lbnQnKTtcblxuICBYTUxFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxFbGVtZW50Jyk7XG5cbiAgWE1MQ0RhdGEgPSByZXF1aXJlKCcuL1hNTENEYXRhJyk7XG5cbiAgWE1MQ29tbWVudCA9IHJlcXVpcmUoJy4vWE1MQ29tbWVudCcpO1xuXG4gIFhNTFJhdyA9IHJlcXVpcmUoJy4vWE1MUmF3Jyk7XG5cbiAgWE1MVGV4dCA9IHJlcXVpcmUoJy4vWE1MVGV4dCcpO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHJlcXVpcmUoJy4vWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uJyk7XG5cbiAgWE1MRGVjbGFyYXRpb24gPSByZXF1aXJlKCcuL1hNTERlY2xhcmF0aW9uJyk7XG5cbiAgWE1MRG9jVHlwZSA9IHJlcXVpcmUoJy4vWE1MRG9jVHlwZScpO1xuXG4gIFhNTERUREF0dExpc3QgPSByZXF1aXJlKCcuL1hNTERUREF0dExpc3QnKTtcblxuICBYTUxEVERFbnRpdHkgPSByZXF1aXJlKCcuL1hNTERUREVudGl0eScpO1xuXG4gIFhNTERUREVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTERUREVsZW1lbnQnKTtcblxuICBYTUxEVEROb3RhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRFRETm90YXRpb24nKTtcblxuICBYTUxBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL1hNTEF0dHJpYnV0ZScpO1xuXG4gIFhNTFN0cmluZ2lmaWVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdpZmllcicpO1xuXG4gIFhNTFN0cmluZ1dyaXRlciA9IHJlcXVpcmUoJy4vWE1MU3RyaW5nV3JpdGVyJyk7XG5cbiAgV3JpdGVyU3RhdGUgPSByZXF1aXJlKCcuL1dyaXRlclN0YXRlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxEb2N1bWVudENCID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFhNTERvY3VtZW50Q0Iob3B0aW9ucywgb25EYXRhLCBvbkVuZCkge1xuICAgICAgdmFyIHdyaXRlck9wdGlvbnM7XG4gICAgICB0aGlzLm5hbWUgPSBcIj94bWxcIjtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkRvY3VtZW50O1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIHdyaXRlck9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghb3B0aW9ucy53cml0ZXIpIHtcbiAgICAgICAgb3B0aW9ucy53cml0ZXIgPSBuZXcgWE1MU3RyaW5nV3JpdGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qob3B0aW9ucy53cml0ZXIpKSB7XG4gICAgICAgIHdyaXRlck9wdGlvbnMgPSBvcHRpb25zLndyaXRlcjtcbiAgICAgICAgb3B0aW9ucy53cml0ZXIgPSBuZXcgWE1MU3RyaW5nV3JpdGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgdGhpcy53cml0ZXIgPSBvcHRpb25zLndyaXRlcjtcbiAgICAgIHRoaXMud3JpdGVyT3B0aW9ucyA9IHRoaXMud3JpdGVyLmZpbHRlck9wdGlvbnMod3JpdGVyT3B0aW9ucyk7XG4gICAgICB0aGlzLnN0cmluZ2lmeSA9IG5ldyBYTUxTdHJpbmdpZmllcihvcHRpb25zKTtcbiAgICAgIHRoaXMub25EYXRhQ2FsbGJhY2sgPSBvbkRhdGEgfHwgZnVuY3Rpb24oKSB7fTtcbiAgICAgIHRoaXMub25FbmRDYWxsYmFjayA9IG9uRW5kIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudExldmVsID0gLTE7XG4gICAgICB0aGlzLm9wZW5UYWdzID0ge307XG4gICAgICB0aGlzLmRvY3VtZW50U3RhcnRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kb2N1bWVudENvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICB9XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5jcmVhdGVDaGlsZE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgYXR0LCBhdHROYW1lLCBhdHRyaWJ1dGVzLCBjaGlsZCwgaSwgbGVuLCByZWYxLCByZWYyO1xuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBOb2RlVHlwZS5DRGF0YTpcbiAgICAgICAgICB0aGlzLmNkYXRhKG5vZGUudmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkNvbW1lbnQ6XG4gICAgICAgICAgdGhpcy5jb21tZW50KG5vZGUudmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkVsZW1lbnQ6XG4gICAgICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICAgIHJlZjEgPSBub2RlLmF0dHJpYnM7XG4gICAgICAgICAgZm9yIChhdHROYW1lIGluIHJlZjEpIHtcbiAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZjEsIGF0dE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF0dCA9IHJlZjFbYXR0TmFtZV07XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW2F0dE5hbWVdID0gYXR0LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm5vZGUobm9kZS5uYW1lLCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBOb2RlVHlwZS5EdW1teTpcbiAgICAgICAgICB0aGlzLmR1bW15KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuUmF3OlxuICAgICAgICAgIHRoaXMucmF3KG5vZGUudmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLlRleHQ6XG4gICAgICAgICAgdGhpcy50ZXh0KG5vZGUudmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjpcbiAgICAgICAgICB0aGlzLmluc3RydWN0aW9uKG5vZGUudGFyZ2V0LCBub2RlLnZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIFhNTCBub2RlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBpbiBhIEpTIG9iamVjdDogXCIgKyBub2RlLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgfVxuICAgICAgcmVmMiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMltpXTtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGlsZE5vZGUoY2hpbGQpO1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gTm9kZVR5cGUuRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR1bW15ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciByZWYxO1xuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG5vZGUgbmFtZS5cIik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yb290ICYmIHRoaXMuY3VycmVudExldmVsID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb2N1bWVudCBjYW4gb25seSBoYXZlIG9uZSByb290IG5vZGUuIFwiICsgdGhpcy5kZWJ1Z0luZm8obmFtZSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbmFtZSA9IGdldFZhbHVlKG5hbWUpO1xuICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICBhdHRyaWJ1dGVzID0ge307XG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzID0gZ2V0VmFsdWUoYXR0cmlidXRlcyk7XG4gICAgICBpZiAoIWlzT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHJlZjEgPSBbYXR0cmlidXRlcywgdGV4dF0sIHRleHQgPSByZWYxWzBdLCBhdHRyaWJ1dGVzID0gcmVmMVsxXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBuZXcgWE1MRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTtcbiAgICAgIHRoaXMuY3VycmVudE5vZGUuY2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudExldmVsKys7XG4gICAgICB0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXSA9IHRoaXMuY3VycmVudE5vZGU7XG4gICAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudGV4dCh0ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgdmFyIGNoaWxkLCBpLCBsZW4sIG9sZFZhbGlkYXRpb25GbGFnLCByZWYxLCByb290O1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUgJiYgdGhpcy5jdXJyZW50Tm9kZS50eXBlID09PSBOb2RlVHlwZS5Eb2NUeXBlKSB7XG4gICAgICAgIHRoaXMuZHRkRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkgfHwgaXNPYmplY3QobmFtZSkgfHwgaXNGdW5jdGlvbihuYW1lKSkge1xuICAgICAgICAgIG9sZFZhbGlkYXRpb25GbGFnID0gdGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbjtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICByb290ID0gbmV3IFhNTERvY3VtZW50KHRoaXMub3B0aW9ucykuZWxlbWVudCgnVEVNUF9ST09UJyk7XG4gICAgICAgICAgcm9vdC5lbGVtZW50KG5hbWUpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5ub1ZhbGlkYXRpb24gPSBvbGRWYWxpZGF0aW9uRmxhZztcbiAgICAgICAgICByZWYxID0gcm9vdC5jaGlsZHJlbjtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHJlZjFbaV07XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoaWxkTm9kZShjaGlsZCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gTm9kZVR5cGUuRWxlbWVudCkge1xuICAgICAgICAgICAgICB0aGlzLnVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubm9kZShuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgYXR0TmFtZSwgYXR0VmFsdWU7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudE5vZGUgfHwgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHQoKSBjYW4gb25seSBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGVsZSgpIGNhbGwgaW4gY2FsbGJhY2sgbW9kZS4gXCIgKyB0aGlzLmRlYnVnSW5mbyhuYW1lKSk7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBnZXRWYWx1ZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgICAgICBmb3IgKGF0dE5hbWUgaW4gbmFtZSkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG5hbWUsIGF0dE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICBhdHRWYWx1ZSA9IG5hbWVbYXR0TmFtZV07XG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmFwcGx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5rZWVwTnVsbEF0dHJpYnV0ZXMgJiYgKHZhbHVlID09IG51bGwpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5hdHRyaWJzW25hbWVdID0gbmV3IFhNTEF0dHJpYnV0ZSh0aGlzLCBuYW1lLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5hdHRyaWJzW25hbWVdID0gbmV3IFhNTEF0dHJpYnV0ZSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxUZXh0KHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnRleHQobm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNkYXRhID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxDRGF0YSh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5jZGF0YShub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsICsgMSksIHRoaXMuY3VycmVudExldmVsICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuY29tbWVudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MQ29tbWVudCh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5jb21tZW50KG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTFJhdyh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5yYXcobm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmluc3RydWN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgdmFyIGksIGluc1RhcmdldCwgaW5zVmFsdWUsIGxlbiwgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkge1xuICAgICAgICB0YXJnZXQgPSBnZXRWYWx1ZSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRhcmdldC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGluc1RhcmdldCA9IHRhcmdldFtpXTtcbiAgICAgICAgICB0aGlzLmluc3RydWN0aW9uKGluc1RhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGluc1RhcmdldCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbCh0YXJnZXQsIGluc1RhcmdldCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGluc1ZhbHVlID0gdGFyZ2V0W2luc1RhcmdldF07XG4gICAgICAgICAgdGhpcy5pbnN0cnVjdGlvbihpbnNUYXJnZXQsIGluc1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5hcHBseSgpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBuZXcgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRoaXMsIHRhcmdldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRlY2xhcmF0aW9uID0gZnVuY3Rpb24odmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRTdGFydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImRlY2xhcmF0aW9uKCkgbXVzdCBiZSB0aGUgZmlyc3Qgbm9kZS5cIik7XG4gICAgICB9XG4gICAgICBub2RlID0gbmV3IFhNTERlY2xhcmF0aW9uKHRoaXMsIHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmRlY2xhcmF0aW9uKG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5kb2N0eXBlID0gZnVuY3Rpb24ocm9vdCwgcHViSUQsIHN5c0lEKSB7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBpZiAocm9vdCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgcm9vdCBub2RlIG5hbWUuXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkdGQoKSBtdXN0IGNvbWUgYmVmb3JlIHRoZSByb290IG5vZGUuXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG5ldyBYTUxEb2NUeXBlKHRoaXMsIHB1YklELCBzeXNJRCk7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLnJvb3ROb2RlTmFtZSA9IHJvb3Q7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCsrO1xuICAgICAgdGhpcy5vcGVuVGFnc1t0aGlzLmN1cnJlbnRMZXZlbF0gPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZEVsZW1lbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERUREVsZW1lbnQodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkRWxlbWVudChub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsICsgMSksIHRoaXMuY3VycmVudExldmVsICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYXR0TGlzdCA9IGZ1bmN0aW9uKGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxEVERBdHRMaXN0KHRoaXMsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkQXR0TGlzdChub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsICsgMSksIHRoaXMuY3VycmVudExldmVsICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZW50aXR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxEVERFbnRpdHkodGhpcywgZmFsc2UsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZEVudGl0eShub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsICsgMSksIHRoaXMuY3VycmVudExldmVsICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUucEVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRERW50aXR5KHRoaXMsIHRydWUsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZEVudGl0eShub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsICsgMSksIHRoaXMuY3VycmVudExldmVsICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubm90YXRpb24gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERURE5vdGF0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZE5vdGF0aW9uKG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS51cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudExldmVsIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZG9jdW1lbnQgbm9kZSBoYXMgbm8gcGFyZW50LlwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU5vZGUodGhpcy5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTm9kZSh0aGlzLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VOb2RlKHRoaXMub3BlblRhZ3NbdGhpcy5jdXJyZW50TGV2ZWxdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXTtcbiAgICAgIHRoaXMuY3VycmVudExldmVsLS07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aGlsZSAodGhpcy5jdXJyZW50TGV2ZWwgPj0gMCkge1xuICAgICAgICB0aGlzLnVwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZCgpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuQ3VycmVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Ob2RlKHRoaXMuY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBhdHQsIGNodW5rLCBuYW1lLCByZWYxO1xuICAgICAgaWYgKCFub2RlLmlzT3Blbikge1xuICAgICAgICBpZiAoIXRoaXMucm9vdCAmJiB0aGlzLmN1cnJlbnRMZXZlbCA9PT0gMCAmJiBub2RlLnR5cGUgPT09IE5vZGVUeXBlLkVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGNodW5rID0gJyc7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLndyaXRlck9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgICAgIGNodW5rID0gdGhpcy53cml0ZXIuaW5kZW50KG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwpICsgJzwnICsgbm9kZS5uYW1lO1xuICAgICAgICAgIHJlZjEgPSBub2RlLmF0dHJpYnM7XG4gICAgICAgICAgZm9yIChuYW1lIGluIHJlZjEpIHtcbiAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZjEsIG5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF0dCA9IHJlZjFbbmFtZV07XG4gICAgICAgICAgICBjaHVuayArPSB0aGlzLndyaXRlci5hdHRyaWJ1dGUoYXR0LCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2h1bmsgKz0gKG5vZGUuY2hpbGRyZW4gPyAnPicgOiAnLz4nKSArIHRoaXMud3JpdGVyLmVuZGxpbmUobm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCk7XG4gICAgICAgICAgdGhpcy53cml0ZXJPcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMud3JpdGVyT3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk9wZW5UYWc7XG4gICAgICAgICAgY2h1bmsgPSB0aGlzLndyaXRlci5pbmRlbnQobm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCkgKyAnPCFET0NUWVBFICcgKyBub2RlLnJvb3ROb2RlTmFtZTtcbiAgICAgICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgICAgICBjaHVuayArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgICAgY2h1bmsgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjaHVuayArPSAnIFsnO1xuICAgICAgICAgICAgdGhpcy53cml0ZXJPcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlck9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgICAgICAgIGNodW5rICs9ICc+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2h1bmsgKz0gdGhpcy53cml0ZXIuZW5kbGluZShub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRGF0YShjaHVuaywgdGhpcy5jdXJyZW50TGV2ZWwpO1xuICAgICAgICByZXR1cm4gbm9kZS5pc09wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5jbG9zZU5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgY2h1bms7XG4gICAgICBpZiAoIW5vZGUuaXNDbG9zZWQpIHtcbiAgICAgICAgY2h1bmsgPSAnJztcbiAgICAgICAgdGhpcy53cml0ZXJPcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkVsZW1lbnQpIHtcbiAgICAgICAgICBjaHVuayA9IHRoaXMud3JpdGVyLmluZGVudChub2RlLCB0aGlzLndyaXRlck9wdGlvbnMsIHRoaXMuY3VycmVudExldmVsKSArICc8LycgKyBub2RlLm5hbWUgKyAnPicgKyB0aGlzLndyaXRlci5lbmRsaW5lKG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNodW5rID0gdGhpcy53cml0ZXIuaW5kZW50KG5vZGUsIHRoaXMud3JpdGVyT3B0aW9ucywgdGhpcy5jdXJyZW50TGV2ZWwpICsgJ10+JyArIHRoaXMud3JpdGVyLmVuZGxpbmUobm9kZSwgdGhpcy53cml0ZXJPcHRpb25zLCB0aGlzLmN1cnJlbnRMZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cml0ZXJPcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgICAgdGhpcy5vbkRhdGEoY2h1bmssIHRoaXMuY3VycmVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaywgbGV2ZWwpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRTdGFydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLm9uRGF0YUNhbGxiYWNrKGNodW5rLCBsZXZlbCArIDEpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb2N1bWVudENvbXBsZXRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZENhbGxiYWNrKCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRlYnVnSW5mbyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJub2RlOiA8XCIgKyBuYW1lICsgXCI+XCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub2QgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50eHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRhdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZGF0YSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNvbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuaW5zID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRlYyA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNsYXJhdGlvbih2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZCA9IGZ1bmN0aW9uKHJvb3QsIHB1YklELCBzeXNJRCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdHlwZShyb290LCBwdWJJRCwgc3lzSUQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5lID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubiA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2RhdGEodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5jID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhdyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmkgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSAmJiB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPT09IE5vZGVUeXBlLkRvY1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmEgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlICYmIHRoaXMuY3VycmVudE5vZGUudHlwZSA9PT0gTm9kZVR5cGUuRG9jVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRMaXN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLnBlbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucEVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RhdGlvbihuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEb2N1bWVudENCO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTER1bW15LCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRHVtbXkgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxEdW1teSwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxEdW1teShwYXJlbnQpIHtcbiAgICAgIFhNTER1bW15Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5EdW1teTtcbiAgICB9XG5cbiAgICBYTUxEdW1teS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxEdW1teS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEdW1teTtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgWE1MQXR0cmlidXRlLCBYTUxFbGVtZW50LCBYTUxOYW1lZE5vZGVNYXAsIFhNTE5vZGUsIGdldFZhbHVlLCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgcmVmLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgcmVmID0gcmVxdWlyZSgnLi9VdGlsaXR5JyksIGlzT2JqZWN0ID0gcmVmLmlzT2JqZWN0LCBpc0Z1bmN0aW9uID0gcmVmLmlzRnVuY3Rpb24sIGdldFZhbHVlID0gcmVmLmdldFZhbHVlO1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL1hNTEF0dHJpYnV0ZScpO1xuXG4gIFhNTE5hbWVkTm9kZU1hcCA9IHJlcXVpcmUoJy4vWE1MTmFtZWROb2RlTWFwJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxFbGVtZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRWxlbWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxFbGVtZW50KHBhcmVudCwgbmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjE7XG4gICAgICBYTUxFbGVtZW50Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgZWxlbWVudCBuYW1lLiBcIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgICAgdGhpcy5uYW1lID0gdGhpcy5zdHJpbmdpZnkubmFtZShuYW1lKTtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkVsZW1lbnQ7XG4gICAgICB0aGlzLmF0dHJpYnMgPSB7fTtcbiAgICAgIHRoaXMuc2NoZW1hVHlwZUluZm8gPSBudWxsO1xuICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZShhdHRyaWJ1dGVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gTm9kZVR5cGUuRG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy5pc1Jvb3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmRvY3VtZW50T2JqZWN0ID0gcGFyZW50O1xuICAgICAgICBwYXJlbnQucm9vdE9iamVjdCA9IHRoaXM7XG4gICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICByZWYxID0gcGFyZW50LmNoaWxkcmVuO1xuICAgICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZjEubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGNoaWxkID0gcmVmMVtqXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBOb2RlVHlwZS5Eb2NUeXBlKSB7XG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxFbGVtZW50LnByb3RvdHlwZSwgJ3RhZ05hbWUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAnbmFtZXNwYWNlVVJJJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAncHJlZml4Jywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAnbG9jYWxOYW1lJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxFbGVtZW50LnByb3RvdHlwZSwgJ2lkJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAnY2xhc3NOYW1lJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAnY2xhc3NMaXN0Jywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEVsZW1lbnQucHJvdG90eXBlLCAnYXR0cmlidXRlcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5hdHRyaWJ1dGVNYXAgfHwgIXRoaXMuYXR0cmlidXRlTWFwLm5vZGVzKSB7XG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAgPSBuZXcgWE1MTmFtZWROb2RlTWFwKHRoaXMuYXR0cmlicyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBhdHQsIGF0dE5hbWUsIGNsb25lZFNlbGYsIHJlZjE7XG4gICAgICBjbG9uZWRTZWxmID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgIGlmIChjbG9uZWRTZWxmLmlzUm9vdCkge1xuICAgICAgICBjbG9uZWRTZWxmLmRvY3VtZW50T2JqZWN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNsb25lZFNlbGYuYXR0cmlicyA9IHt9O1xuICAgICAgcmVmMSA9IHRoaXMuYXR0cmlicztcbiAgICAgIGZvciAoYXR0TmFtZSBpbiByZWYxKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZjEsIGF0dE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgYXR0ID0gcmVmMVthdHROYW1lXTtcbiAgICAgICAgY2xvbmVkU2VsZi5hdHRyaWJzW2F0dE5hbWVdID0gYXR0LmNsb25lKCk7XG4gICAgICB9XG4gICAgICBjbG9uZWRTZWxmLmNoaWxkcmVuID0gW107XG4gICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgdmFyIGNsb25lZENoaWxkO1xuICAgICAgICBjbG9uZWRDaGlsZCA9IGNoaWxkLmNsb25lKCk7XG4gICAgICAgIGNsb25lZENoaWxkLnBhcmVudCA9IGNsb25lZFNlbGY7XG4gICAgICAgIHJldHVybiBjbG9uZWRTZWxmLmNoaWxkcmVuLnB1c2goY2xvbmVkQ2hpbGQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2xvbmVkU2VsZjtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuYXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBhdHROYW1lLCBhdHRWYWx1ZTtcbiAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IGdldFZhbHVlKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICAgIGZvciAoYXR0TmFtZSBpbiBuYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwobmFtZSwgYXR0TmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGF0dFZhbHVlID0gbmFtZVthdHROYW1lXTtcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBOdWxsQXR0cmlidXRlcyAmJiAodmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgICAgICB0aGlzLmF0dHJpYnNbbmFtZV0gPSBuZXcgWE1MQXR0cmlidXRlKHRoaXMsIG5hbWUsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmF0dHJpYnNbbmFtZV0gPSBuZXcgWE1MQXR0cmlidXRlKHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBhdHROYW1lLCBqLCBsZW47XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXR0cmlidXRlIG5hbWUuIFwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgICB9XG4gICAgICBuYW1lID0gZ2V0VmFsdWUobmFtZSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSBuYW1lLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgYXR0TmFtZSA9IG5hbWVbal07XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYXR0cmlic1thdHROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYXR0cmlic1tuYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLmVsZW1lbnQodGhpcywgdGhpcy5vcHRpb25zLndyaXRlci5maWx0ZXJPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmEgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgaWYgKHRoaXMuYXR0cmlicy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJzW25hbWVdLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5vZGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBpZiAodGhpcy5hdHRyaWJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnNbbmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTm9kZSA9IGZ1bmN0aW9uKG5ld0F0dHIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlTm9kZSA9IGZ1bmN0aW9uKG9sZEF0dHIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUsIHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlTm9kZU5TID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTm9kZU5TID0gZnVuY3Rpb24obmV3QXR0cikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuaGFzQXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlicy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuaGFzQXR0cmlidXRlTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5zZXRJZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIGlzSWQpIHtcbiAgICAgIGlmICh0aGlzLmF0dHJpYnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlic1tuYW1lXS5pc0lkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzSWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnNldElkQXR0cmlidXRlTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgaXNJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5zZXRJZEF0dHJpYnV0ZU5vZGUgPSBmdW5jdGlvbihpZEF0dHIsIGlzSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbih0YWduYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMgPSBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5pc0VxdWFsTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBpLCBqLCByZWYxO1xuICAgICAgaWYgKCFYTUxFbGVtZW50Ll9fc3VwZXJfXy5pc0VxdWFsTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLmlzRXF1YWxOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5hbWVzcGFjZVVSSSAhPT0gdGhpcy5uYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUucHJlZml4ICE9PSB0aGlzLnByZWZpeCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5sb2NhbE5hbWUgIT09IHRoaXMubG9jYWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmF0dHJpYnMubGVuZ3RoICE9PSB0aGlzLmF0dHJpYnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IGogPSAwLCByZWYxID0gdGhpcy5hdHRyaWJzLmxlbmd0aCAtIDE7IDAgPD0gcmVmMSA/IGogPD0gcmVmMSA6IGogPj0gcmVmMTsgaSA9IDAgPD0gcmVmMSA/ICsraiA6IC0taikge1xuICAgICAgICBpZiAoIXRoaXMuYXR0cmlic1tpXS5pc0VxdWFsTm9kZShub2RlLmF0dHJpYnNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTEVsZW1lbnQ7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MTmFtZWROb2RlTWFwO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MTmFtZWROb2RlTWFwID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFhNTE5hbWVkTm9kZU1hcChub2Rlcykge1xuICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxOYW1lZE5vZGVNYXAucHJvdG90eXBlLCAnbGVuZ3RoJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aCB8fCAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgWE1MTmFtZWROb2RlTWFwLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBudWxsO1xuICAgIH07XG5cbiAgICBYTUxOYW1lZE5vZGVNYXAucHJvdG90eXBlLmdldE5hbWVkSXRlbSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25hbWVdO1xuICAgIH07XG5cbiAgICBYTUxOYW1lZE5vZGVNYXAucHJvdG90eXBlLnNldE5hbWVkSXRlbSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBvbGROb2RlO1xuICAgICAgb2xkTm9kZSA9IHRoaXMubm9kZXNbbm9kZS5ub2RlTmFtZV07XG4gICAgICB0aGlzLm5vZGVzW25vZGUubm9kZU5hbWVdID0gbm9kZTtcbiAgICAgIHJldHVybiBvbGROb2RlIHx8IG51bGw7XG4gICAgfTtcblxuICAgIFhNTE5hbWVkTm9kZU1hcC5wcm90b3R5cGUucmVtb3ZlTmFtZWRJdGVtID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIG9sZE5vZGU7XG4gICAgICBvbGROb2RlID0gdGhpcy5ub2Rlc1tuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzW25hbWVdO1xuICAgICAgcmV0dXJuIG9sZE5vZGUgfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgWE1MTmFtZWROb2RlTWFwLnByb3RvdHlwZS5pdGVtID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW09iamVjdC5rZXlzKHRoaXMubm9kZXMpW2luZGV4XV0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgWE1MTmFtZWROb2RlTWFwLnByb3RvdHlwZS5nZXROYW1lZEl0ZW1OUyA9IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9O1xuXG4gICAgWE1MTmFtZWROb2RlTWFwLnByb3RvdHlwZS5zZXROYW1lZEl0ZW1OUyA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH07XG5cbiAgICBYTUxOYW1lZE5vZGVNYXAucHJvdG90eXBlLnJlbW92ZU5hbWVkSXRlbU5TID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MTmFtZWROb2RlTWFwO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgRG9jdW1lbnRQb3NpdGlvbiwgTm9kZVR5cGUsIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRHVtbXksIFhNTEVsZW1lbnQsIFhNTE5hbWVkTm9kZU1hcCwgWE1MTm9kZSwgWE1MTm9kZUxpc3QsIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwgWE1MUmF3LCBYTUxUZXh0LCBnZXRWYWx1ZSwgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIHJlZjEsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZjEgPSByZXF1aXJlKCcuL1V0aWxpdHknKSwgaXNPYmplY3QgPSByZWYxLmlzT2JqZWN0LCBpc0Z1bmN0aW9uID0gcmVmMS5pc0Z1bmN0aW9uLCBpc0VtcHR5ID0gcmVmMS5pc0VtcHR5LCBnZXRWYWx1ZSA9IHJlZjEuZ2V0VmFsdWU7XG5cbiAgWE1MRWxlbWVudCA9IG51bGw7XG5cbiAgWE1MQ0RhdGEgPSBudWxsO1xuXG4gIFhNTENvbW1lbnQgPSBudWxsO1xuXG4gIFhNTERlY2xhcmF0aW9uID0gbnVsbDtcblxuICBYTUxEb2NUeXBlID0gbnVsbDtcblxuICBYTUxSYXcgPSBudWxsO1xuXG4gIFhNTFRleHQgPSBudWxsO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IG51bGw7XG5cbiAgWE1MRHVtbXkgPSBudWxsO1xuXG4gIE5vZGVUeXBlID0gbnVsbDtcblxuICBYTUxOb2RlTGlzdCA9IG51bGw7XG5cbiAgWE1MTmFtZWROb2RlTWFwID0gbnVsbDtcblxuICBEb2N1bWVudFBvc2l0aW9uID0gbnVsbDtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTE5vZGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gWE1MTm9kZShwYXJlbnQxKSB7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDE7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5wYXJlbnQub3B0aW9ucztcbiAgICAgICAgdGhpcy5zdHJpbmdpZnkgPSB0aGlzLnBhcmVudC5zdHJpbmdpZnk7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgIHRoaXMuYmFzZVVSSSA9IG51bGw7XG4gICAgICBpZiAoIVhNTEVsZW1lbnQpIHtcbiAgICAgICAgWE1MRWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRWxlbWVudCcpO1xuICAgICAgICBYTUxDRGF0YSA9IHJlcXVpcmUoJy4vWE1MQ0RhdGEnKTtcbiAgICAgICAgWE1MQ29tbWVudCA9IHJlcXVpcmUoJy4vWE1MQ29tbWVudCcpO1xuICAgICAgICBYTUxEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRGVjbGFyYXRpb24nKTtcbiAgICAgICAgWE1MRG9jVHlwZSA9IHJlcXVpcmUoJy4vWE1MRG9jVHlwZScpO1xuICAgICAgICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuICAgICAgICBYTUxUZXh0ID0gcmVxdWlyZSgnLi9YTUxUZXh0Jyk7XG4gICAgICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHJlcXVpcmUoJy4vWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uJyk7XG4gICAgICAgIFhNTER1bW15ID0gcmVxdWlyZSgnLi9YTUxEdW1teScpO1xuICAgICAgICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcbiAgICAgICAgWE1MTm9kZUxpc3QgPSByZXF1aXJlKCcuL1hNTE5vZGVMaXN0Jyk7XG4gICAgICAgIFhNTE5hbWVkTm9kZU1hcCA9IHJlcXVpcmUoJy4vWE1MTmFtZWROb2RlTWFwJyk7XG4gICAgICAgIERvY3VtZW50UG9zaXRpb24gPSByZXF1aXJlKCcuL0RvY3VtZW50UG9zaXRpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdub2RlTmFtZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdub2RlVHlwZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdub2RlVmFsdWUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxOb2RlLnByb3RvdHlwZSwgJ3BhcmVudE5vZGUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdjaGlsZE5vZGVzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkTm9kZUxpc3QgfHwgIXRoaXMuY2hpbGROb2RlTGlzdC5ub2Rlcykge1xuICAgICAgICAgIHRoaXMuY2hpbGROb2RlTGlzdCA9IG5ldyBYTUxOb2RlTGlzdCh0aGlzLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVMaXN0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTE5vZGUucHJvdG90eXBlLCAnZmlyc3RDaGlsZCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdsYXN0Q2hpbGQnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdwcmV2aW91c1NpYmxpbmcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltpIC0gMV0gfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxOb2RlLnByb3RvdHlwZSwgJ25leHRTaWJsaW5nJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baSArIDFdIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MTm9kZS5wcm90b3R5cGUsICdvd25lckRvY3VtZW50Jywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQoKSB8fCBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTE5vZGUucHJvdG90eXBlLCAndGV4dENvbnRlbnQnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmMiwgc3RyO1xuICAgICAgICBpZiAodGhpcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuRWxlbWVudCB8fCB0aGlzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5Eb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgc3RyID0gJyc7XG4gICAgICAgICAgcmVmMiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmMi5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgY2hpbGQgPSByZWYyW2pdO1xuICAgICAgICAgICAgaWYgKGNoaWxkLnRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgIHN0ciArPSBjaGlsZC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmMiwgcmVzdWx0cztcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBwYXJlbnQub3B0aW9ucztcbiAgICAgICAgdGhpcy5zdHJpbmdpZnkgPSBwYXJlbnQuc3RyaW5naWZ5O1xuICAgICAgfVxuICAgICAgcmVmMiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMltqXTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkLnNldFBhcmVudCh0aGlzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciBjaGlsZE5vZGUsIGl0ZW0sIGosIGssIGtleSwgbGFzdENoaWxkLCBsZW4sIGxlbjEsIHJlZjIsIHJlZjMsIHZhbDtcbiAgICAgIGxhc3RDaGlsZCA9IG51bGw7XG4gICAgICBpZiAoYXR0cmlidXRlcyA9PT0gbnVsbCAmJiAodGV4dCA9PSBudWxsKSkge1xuICAgICAgICByZWYyID0gW3t9LCBudWxsXSwgYXR0cmlidXRlcyA9IHJlZjJbMF0sIHRleHQgPSByZWYyWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICBhdHRyaWJ1dGVzID0ge307XG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzID0gZ2V0VmFsdWUoYXR0cmlidXRlcyk7XG4gICAgICBpZiAoIWlzT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHJlZjMgPSBbYXR0cmlidXRlcywgdGV4dF0sIHRleHQgPSByZWYzWzBdLCBhdHRyaWJ1dGVzID0gcmVmM1sxXTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IGdldFZhbHVlKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gbmFtZS5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGl0ZW0gPSBuYW1lW2pdO1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG5hbWUpKSB7XG4gICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChuYW1lLmFwcGx5KCkpO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgICAgICBmb3IgKGtleSBpbiBuYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwobmFtZSwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgdmFsID0gbmFtZVtrZXldO1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5hcHBseSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkgJiYga2V5LmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydEF0dEtleSkgPT09IDApIHtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuYXR0cmlidXRlKGtleS5zdWJzdHIodGhpcy5zdHJpbmdpZnkuY29udmVydEF0dEtleS5sZW5ndGgpLCB2YWwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5zZXBhcmF0ZUFycmF5SXRlbXMgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIGlzRW1wdHkodmFsKSkge1xuICAgICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5kdW1teSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSAmJiBpc0VtcHR5KHZhbCkpIHtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChrZXkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5rZWVwTnVsbE5vZGVzICYmICh2YWwgPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZHVtbXkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdGVBcnJheUl0ZW1zICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHZhbC5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHtcbiAgICAgICAgICAgICAgaXRlbSA9IHZhbFtrXTtcbiAgICAgICAgICAgICAgY2hpbGROb2RlID0ge307XG4gICAgICAgICAgICAgIGNoaWxkTm9kZVtrZXldID0gaXRlbTtcbiAgICAgICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5lbGVtZW50KGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRUZXh0S2V5ICYmIGtleS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRUZXh0S2V5KSA9PT0gMCkge1xuICAgICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQodmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChrZXkpO1xuICAgICAgICAgICAgICBsYXN0Q2hpbGQuZWxlbWVudCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQoa2V5LCB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zLmtlZXBOdWxsTm9kZXMgJiYgdGV4dCA9PT0gbnVsbCkge1xuICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmR1bW15KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRUZXh0S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0VGV4dEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLnRleHQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDRGF0YUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydENEYXRhS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuY2RhdGEodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDb21tZW50S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0Q29tbWVudEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmNvbW1lbnQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkgJiYgbmFtZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkpID09PSAwKSB7XG4gICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5yYXcodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRQSUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuaW5zdHJ1Y3Rpb24obmFtZS5zdWJzdHIodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5Lmxlbmd0aCksIHRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMubm9kZShuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBjcmVhdGUgYW55IGVsZW1lbnRzIHdpdGg6IFwiICsgbmFtZSArIFwiLiBcIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhc3RDaGlsZDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgdmFyIGNoaWxkLCBpLCBuZXdDaGlsZCwgcmVmQ2hpbGQsIHJlbW92ZWQ7XG4gICAgICBpZiAobmFtZSAhPSBudWxsID8gbmFtZS50eXBlIDogdm9pZCAwKSB7XG4gICAgICAgIG5ld0NoaWxkID0gbmFtZTtcbiAgICAgICAgcmVmQ2hpbGQgPSBhdHRyaWJ1dGVzO1xuICAgICAgICBuZXdDaGlsZC5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgIGlmIChyZWZDaGlsZCkge1xuICAgICAgICAgIGkgPSBjaGlsZHJlbi5pbmRleE9mKHJlZkNoaWxkKTtcbiAgICAgICAgICByZW1vdmVkID0gY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgICAgIGNoaWxkcmVuLnB1c2gobmV3Q2hpbGQpO1xuICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5pc1Jvb3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zZXJ0IGVsZW1lbnRzIGF0IHJvb3QgbGV2ZWwuIFwiICsgdGhpcy5kZWJ1Z0luZm8obmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgICBjaGlsZCA9IHRoaXMucGFyZW50LmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgcmVtb3ZlZDtcbiAgICAgIGlmICh0aGlzLmlzUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zZXJ0IGVsZW1lbnRzIGF0IHJvb3QgbGV2ZWwuIFwiICsgdGhpcy5kZWJ1Z0luZm8obmFtZSkpO1xuICAgICAgfVxuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkgKyAxKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJlbnQuZWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSwgcmVmMjtcbiAgICAgIGlmICh0aGlzLmlzUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVtb3ZlIHRoZSByb290IGVsZW1lbnQuIFwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgICB9XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIFtdLnNwbGljZS5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbiwgW2ksIGkgLSBpICsgMV0uY29uY2F0KHJlZjIgPSBbXSkpLCByZWYyO1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgdmFyIGNoaWxkLCByZWYyO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgICBuYW1lID0gZ2V0VmFsdWUobmFtZSk7XG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzIHx8IChhdHRyaWJ1dGVzID0ge30pO1xuICAgICAgYXR0cmlidXRlcyA9IGdldFZhbHVlKGF0dHJpYnV0ZXMpO1xuICAgICAgaWYgKCFpc09iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgICAgICByZWYyID0gW2F0dHJpYnV0ZXMsIHRleHRdLCB0ZXh0ID0gcmVmMlswXSwgYXR0cmlidXRlcyA9IHJlZjJbMV07XG4gICAgICB9XG4gICAgICBjaGlsZCA9IG5ldyBYTUxFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpO1xuICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xuICAgICAgICBjaGlsZC50ZXh0KHRleHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IG5ldyBYTUxUZXh0KHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkO1xuICAgICAgY2hpbGQgPSBuZXcgWE1MQ0RhdGEodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTENvbW1lbnQodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jb21tZW50QmVmb3JlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgcmVtb3ZlZDtcbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgcmVtb3ZlZCA9IHRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShpKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJlbnQuY29tbWVudCh2YWx1ZSk7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbiwgcmVtb3ZlZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuY29tbWVudEFmdGVyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgcmVtb3ZlZDtcbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgcmVtb3ZlZCA9IHRoaXMucGFyZW50LmNoaWxkcmVuLnNwbGljZShpICsgMSk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyZW50LmNvbW1lbnQodmFsdWUpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxSYXcodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kdW1teSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNoaWxkO1xuICAgICAgY2hpbGQgPSBuZXcgWE1MRHVtbXkodGhpcyk7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgdmFyIGluc1RhcmdldCwgaW5zVmFsdWUsIGluc3RydWN0aW9uLCBqLCBsZW47XG4gICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0ID0gZ2V0VmFsdWUodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gZ2V0VmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSB0YXJnZXQubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpbnNUYXJnZXQgPSB0YXJnZXRbal07XG4gICAgICAgICAgdGhpcy5pbnN0cnVjdGlvbihpbnNUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChpbnNUYXJnZXQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwodGFyZ2V0LCBpbnNUYXJnZXQpKSBjb250aW51ZTtcbiAgICAgICAgICBpbnNWYWx1ZSA9IHRhcmdldFtpbnNUYXJnZXRdO1xuICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb24oaW5zVGFyZ2V0LCBpbnNWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IG5ldyBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcywgdGFyZ2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChpbnN0cnVjdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW5zdHJ1Y3Rpb25CZWZvcmUgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyZW50Lmluc3RydWN0aW9uKHRhcmdldCwgdmFsdWUpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uQWZ0ZXIgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSArIDEpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgZG9jLCB4bWxkZWM7XG4gICAgICBkb2MgPSB0aGlzLmRvY3VtZW50KCk7XG4gICAgICB4bWxkZWMgPSBuZXcgWE1MRGVjbGFyYXRpb24oZG9jLCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgICBpZiAoZG9jLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkb2MuY2hpbGRyZW4udW5zaGlmdCh4bWxkZWMpO1xuICAgICAgfSBlbHNlIGlmIChkb2MuY2hpbGRyZW5bMF0udHlwZSA9PT0gTm9kZVR5cGUuRGVjbGFyYXRpb24pIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuWzBdID0geG1sZGVjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuLnVuc2hpZnQoeG1sZGVjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2Mucm9vdCgpIHx8IGRvYztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZHRkID0gZnVuY3Rpb24ocHViSUQsIHN5c0lEKSB7XG4gICAgICB2YXIgY2hpbGQsIGRvYywgZG9jdHlwZSwgaSwgaiwgaywgbGVuLCBsZW4xLCByZWYyLCByZWYzO1xuICAgICAgZG9jID0gdGhpcy5kb2N1bWVudCgpO1xuICAgICAgZG9jdHlwZSA9IG5ldyBYTUxEb2NUeXBlKGRvYywgcHViSUQsIHN5c0lEKTtcbiAgICAgIHJlZjIgPSBkb2MuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gcmVmMi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHtcbiAgICAgICAgY2hpbGQgPSByZWYyW2ldO1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gTm9kZVR5cGUuRG9jVHlwZSkge1xuICAgICAgICAgIGRvYy5jaGlsZHJlbltpXSA9IGRvY3R5cGU7XG4gICAgICAgICAgcmV0dXJuIGRvY3R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZjMgPSBkb2MuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSBrID0gMCwgbGVuMSA9IHJlZjMubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykge1xuICAgICAgICBjaGlsZCA9IHJlZjNbaV07XG4gICAgICAgIGlmIChjaGlsZC5pc1Jvb3QpIHtcbiAgICAgICAgICBkb2MuY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRvY3R5cGUpO1xuICAgICAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb2MuY2hpbGRyZW4ucHVzaChkb2N0eXBlKTtcbiAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS51cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuaXNSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSByb290IG5vZGUgaGFzIG5vIHBhcmVudC4gVXNlIGRvYygpIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgZG9jdW1lbnQgb2JqZWN0LlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucm9vdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICBub2RlID0gdGhpcztcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkRvY3VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUucm9vdE9iamVjdDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmlzUm9vdCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kb2N1bWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICBub2RlID0gdGhpcztcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkRvY3VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50KCkuZW5kKG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgaWYgKGkgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFscmVhZHkgYXQgdGhlIGZpcnN0IG5vZGUuIFwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGRyZW5baSAtIDFdO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgaWYgKGkgPT09IC0xIHx8IGkgPT09IHRoaXMucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWxyZWFkeSBhdCB0aGUgbGFzdCBub2RlLiBcIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2kgKyAxXTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW1wb3J0RG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciBjbG9uZWRSb290O1xuICAgICAgY2xvbmVkUm9vdCA9IGRvYy5yb290KCkuY2xvbmUoKTtcbiAgICAgIGNsb25lZFJvb3QucGFyZW50ID0gdGhpcztcbiAgICAgIGNsb25lZFJvb3QuaXNSb290ID0gZmFsc2U7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2xvbmVkUm9vdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZGVidWdJbmZvID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIHJlZjIsIHJlZjM7XG4gICAgICBuYW1lID0gbmFtZSB8fCB0aGlzLm5hbWU7XG4gICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgJiYgISgocmVmMiA9IHRoaXMucGFyZW50KSAhPSBudWxsID8gcmVmMi5uYW1lIDogdm9pZCAwKSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcInBhcmVudDogPFwiICsgdGhpcy5wYXJlbnQubmFtZSArIFwiPlwiO1xuICAgICAgfSBlbHNlIGlmICghKChyZWYzID0gdGhpcy5wYXJlbnQpICE9IG51bGwgPyByZWYzLm5hbWUgOiB2b2lkIDApKSB7XG4gICAgICAgIHJldHVybiBcIm5vZGU6IDxcIiArIG5hbWUgKyBcIj5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIm5vZGU6IDxcIiArIG5hbWUgKyBcIj4sIHBhcmVudDogPFwiICsgdGhpcy5wYXJlbnQubmFtZSArIFwiPlwiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5lbGUgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5ub2QgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50eHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmRhdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZGF0YSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW5zID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmRvYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQoKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZGVjID0gZnVuY3Rpb24odmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlY2xhcmF0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm4gPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNkYXRhKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuYyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXcodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwKCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmltcG9ydFhNTEJ1aWxkZXIgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydERvY3VtZW50KGRvYyk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ld0NoaWxkLCBvbGRDaGlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKG9sZENoaWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkID0gZnVuY3Rpb24obmV3Q2hpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaGFzQ2hpbGROb2RlcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9PSAwO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGUgPSBmdW5jdGlvbihkZWVwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uKGZlYXR1cmUsIHZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJzLmxlbmd0aCAhPT0gMDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgdmFyIHJlZiwgcmVzO1xuICAgICAgcmVmID0gdGhpcztcbiAgICAgIGlmIChyZWYgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRvY3VtZW50KCkgIT09IG90aGVyLmRvY3VtZW50KCkpIHtcbiAgICAgICAgcmVzID0gRG9jdW1lbnRQb3NpdGlvbi5EaXNjb25uZWN0ZWQgfCBEb2N1bWVudFBvc2l0aW9uLkltcGxlbWVudGF0aW9uU3BlY2lmaWM7XG4gICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC41KSB7XG4gICAgICAgICAgcmVzIHw9IERvY3VtZW50UG9zaXRpb24uUHJlY2VkaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcyB8PSBEb2N1bWVudFBvc2l0aW9uLkZvbGxvd2luZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSBlbHNlIGlmIChyZWYuaXNBbmNlc3RvcihvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIERvY3VtZW50UG9zaXRpb24uQ29udGFpbnMgfCBEb2N1bWVudFBvc2l0aW9uLlByZWNlZGluZztcbiAgICAgIH0gZWxzZSBpZiAocmVmLmlzRGVzY2VuZGFudChvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIERvY3VtZW50UG9zaXRpb24uQ29udGFpbnMgfCBEb2N1bWVudFBvc2l0aW9uLkZvbGxvd2luZztcbiAgICAgIH0gZWxzZSBpZiAocmVmLmlzUHJlY2VkaW5nKG90aGVyKSkge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRQb3NpdGlvbi5QcmVjZWRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRG9jdW1lbnRQb3NpdGlvbi5Gb2xsb3dpbmc7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmlzU2FtZU5vZGUgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5sb29rdXBQcmVmaXggPSBmdW5jdGlvbihuYW1lc3BhY2VVUkkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaXNEZWZhdWx0TmFtZXNwYWNlID0gZnVuY3Rpb24obmFtZXNwYWNlVVJJKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmxvb2t1cE5hbWVzcGFjZVVSSSA9IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pc0VxdWFsTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBpLCBqLCByZWYyO1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IHRoaXMubm9kZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSBqID0gMCwgcmVmMiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgMCA8PSByZWYyID8gaiA8PSByZWYyIDogaiA+PSByZWYyOyBpID0gMCA8PSByZWYyID8gKytqIDogLS1qKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGlsZHJlbltpXS5pc0VxdWFsTm9kZShub2RlLmNoaWxkcmVuW2ldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmdldEZlYXR1cmUgPSBmdW5jdGlvbihmZWF0dXJlLCB2ZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnNldFVzZXJEYXRhID0gZnVuY3Rpb24oa2V5LCBkYXRhLCBoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmdldFVzZXJEYXRhID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIERPTSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIGlmICghb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG90aGVyID09PSB0aGlzIHx8IHRoaXMuaXNEZXNjZW5kYW50KG90aGVyKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaXNEZXNjZW5kYW50ID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoaWxkLCBpc0Rlc2NlbmRhbnRDaGlsZCwgaiwgbGVuLCByZWYyO1xuICAgICAgcmVmMiA9IHRoaXMuY2hpbGRyZW47XG4gICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMltqXTtcbiAgICAgICAgaWYgKG5vZGUgPT09IGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaXNEZXNjZW5kYW50Q2hpbGQgPSBjaGlsZC5pc0Rlc2NlbmRhbnQobm9kZSk7XG4gICAgICAgIGlmIChpc0Rlc2NlbmRhbnRDaGlsZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmlzQW5jZXN0b3IgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5pc0Rlc2NlbmRhbnQodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmlzUHJlY2VkaW5nID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIG5vZGVQb3MsIHRoaXNQb3M7XG4gICAgICBub2RlUG9zID0gdGhpcy50cmVlUG9zaXRpb24obm9kZSk7XG4gICAgICB0aGlzUG9zID0gdGhpcy50cmVlUG9zaXRpb24odGhpcyk7XG4gICAgICBpZiAobm9kZVBvcyA9PT0gLTEgfHwgdGhpc1BvcyA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5vZGVQb3MgPCB0aGlzUG9zO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pc0ZvbGxvd2luZyA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBub2RlUG9zLCB0aGlzUG9zO1xuICAgICAgbm9kZVBvcyA9IHRoaXMudHJlZVBvc2l0aW9uKG5vZGUpO1xuICAgICAgdGhpc1BvcyA9IHRoaXMudHJlZVBvc2l0aW9uKHRoaXMpO1xuICAgICAgaWYgKG5vZGVQb3MgPT09IC0xIHx8IHRoaXNQb3MgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBub2RlUG9zID4gdGhpc1BvcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUudHJlZVBvc2l0aW9uID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGZvdW5kLCBwb3M7XG4gICAgICBwb3MgPSAwO1xuICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9yZWFjaFRyZWVOb2RlKHRoaXMuZG9jdW1lbnQoKSwgZnVuY3Rpb24oY2hpbGROb2RlKSB7XG4gICAgICAgIHBvcysrO1xuICAgICAgICBpZiAoIWZvdW5kICYmIGNoaWxkTm9kZSA9PT0gbm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmZvcmVhY2hUcmVlTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIGZ1bmMpIHtcbiAgICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYyLCByZXM7XG4gICAgICBub2RlIHx8IChub2RlID0gdGhpcy5kb2N1bWVudCgpKTtcbiAgICAgIHJlZjIgPSBub2RlLmNoaWxkcmVuO1xuICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmMi5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICBjaGlsZCA9IHJlZjJbal07XG4gICAgICAgIGlmIChyZXMgPSBmdW5jKGNoaWxkKSkge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5mb3JlYWNoVHJlZU5vZGUoY2hpbGQsIGZ1bmMpO1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxOb2RlO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MTm9kZUxpc3Q7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxOb2RlTGlzdCA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxOb2RlTGlzdChub2Rlcykge1xuICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxOb2RlTGlzdC5wcm90b3R5cGUsICdsZW5ndGgnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGggfHwgMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFhNTE5vZGVMaXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBudWxsO1xuICAgIH07XG5cbiAgICBYTUxOb2RlTGlzdC5wcm90b3R5cGUuaXRlbSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1tpbmRleF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTE5vZGVMaXN0O1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTENoYXJhY3RlckRhdGEsIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbixcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIFhNTENoYXJhY3RlckRhdGEgPSByZXF1aXJlKCcuL1hNTENoYXJhY3RlckRhdGEnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocGFyZW50LCB0YXJnZXQsIHZhbHVlKSB7XG4gICAgICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGluc3RydWN0aW9uIHRhcmdldC4gXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5zdHJpbmdpZnkuaW5zVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLnRhcmdldDtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuaW5zVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5wcm90b3R5cGUuaXNFcXVhbE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAoIVhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5fX3N1cGVyX18uaXNFcXVhbE5vZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKS5pc0VxdWFsTm9kZShub2RlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS50YXJnZXQgIT09IHRoaXMudGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uO1xuXG4gIH0pKFhNTENoYXJhY3RlckRhdGEpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIE5vZGVUeXBlLCBYTUxOb2RlLCBYTUxSYXcsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxSYXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxSYXcsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MUmF3KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MUmF3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmF3IHRleHQuIFwiICsgdGhpcy5kZWJ1Z0luZm8oKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnR5cGUgPSBOb2RlVHlwZS5SYXc7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkucmF3KHRleHQpO1xuICAgIH1cblxuICAgIFhNTFJhdy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxSYXcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIucmF3KHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxSYXc7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFdyaXRlclN0YXRlLCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFdyaXRlckJhc2UsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi9YTUxXcml0ZXJCYXNlJyk7XG5cbiAgV3JpdGVyU3RhdGUgPSByZXF1aXJlKCcuL1dyaXRlclN0YXRlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxTdHJlYW1Xcml0ZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxTdHJlYW1Xcml0ZXIsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucykge1xuICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICBYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5lbmRsaW5lID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIGlmIChub2RlLmlzTGFzdFJvb3ROb2RlICYmIG9wdGlvbnMuc3RhdGUgPT09IFdyaXRlclN0YXRlLkNsb3NlVGFnKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmVuZGxpbmUuY2FsbCh0aGlzLCBub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZG9jdW1lbnQgPSBmdW5jdGlvbihkb2MsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgaiwgaywgbGVuLCBsZW4xLCByZWYsIHJlZjEsIHJlc3VsdHM7XG4gICAgICByZWYgPSBkb2MuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikge1xuICAgICAgICBjaGlsZCA9IHJlZltpXTtcbiAgICAgICAgY2hpbGQuaXNMYXN0Um9vdE5vZGUgPSBpID09PSBkb2MuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSB0aGlzLmZpbHRlck9wdGlvbnMob3B0aW9ucyk7XG4gICAgICByZWYxID0gZG9jLmNoaWxkcmVuO1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMVtrXTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMud3JpdGVDaGlsZE5vZGUoY2hpbGQsIG9wdGlvbnMsIDApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dCwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZShYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmF0dHJpYnV0ZS5jYWxsKHRoaXMsIGF0dCwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoWE1MU3RyZWFtV3JpdGVyLl9fc3VwZXJfXy5jZGF0YS5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuY29tbWVudCA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoWE1MU3RyZWFtV3JpdGVyLl9fc3VwZXJfXy5jb21tZW50LmNhbGwodGhpcywgbm9kZSwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoWE1MU3RyZWFtV3JpdGVyLl9fc3VwZXJfXy5kZWNsYXJhdGlvbi5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZG9jVHlwZSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmO1xuICAgICAgbGV2ZWwgfHwgKGxldmVsID0gMCk7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5pbmRlbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc8IURPQ1RZUEUgJyArIG5vZGUucm9vdCgpLm5hbWUpO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFNZU1RFTSBcIicgKyBub2RlLnN5c0lEICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgWycpO1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgICAgcmVmID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWZbal07XG4gICAgICAgICAgdGhpcy53cml0ZUNoaWxkTm9kZShjaGlsZCwgb3B0aW9ucywgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCddJyk7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZShvcHRpb25zLnNwYWNlQmVmb3JlU2xhc2ggKyAnPicpO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICB2YXIgYXR0LCBjaGlsZCwgY2hpbGROb2RlQ291bnQsIGZpcnN0Q2hpbGROb2RlLCBqLCBsZW4sIG5hbWUsIHByZXR0eVN1cHByZXNzZWQsIHJlZiwgcmVmMTtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgdGhpcy5vcGVuTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuT3BlblRhZztcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8JyArIG5vZGUubmFtZSk7XG4gICAgICByZWYgPSBub2RlLmF0dHJpYnM7XG4gICAgICBmb3IgKG5hbWUgaW4gcmVmKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBhdHQgPSByZWZbbmFtZV07XG4gICAgICAgIHRoaXMuYXR0cmlidXRlKGF0dCwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgfVxuICAgICAgY2hpbGROb2RlQ291bnQgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgIGZpcnN0Q2hpbGROb2RlID0gY2hpbGROb2RlQ291bnQgPT09IDAgPyBudWxsIDogbm9kZS5jaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZE5vZGVDb3VudCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIChlLnR5cGUgPT09IE5vZGVUeXBlLlRleHQgfHwgZS50eXBlID09PSBOb2RlVHlwZS5SYXcpICYmIGUudmFsdWUgPT09ICcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxsb3dFbXB0eSkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc+Jyk7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc8LycgKyBub2RlLm5hbWUgKyAnPicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShvcHRpb25zLnNwYWNlQmVmb3JlU2xhc2ggKyAnLz4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnByZXR0eSAmJiBjaGlsZE5vZGVDb3VudCA9PT0gMSAmJiAoZmlyc3RDaGlsZE5vZGUudHlwZSA9PT0gTm9kZVR5cGUuVGV4dCB8fCBmaXJzdENoaWxkTm9kZS50eXBlID09PSBOb2RlVHlwZS5SYXcpICYmIChmaXJzdENoaWxkTm9kZS52YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicpO1xuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgICBvcHRpb25zLnN1cHByZXNzUHJldHR5Q291bnQrKztcbiAgICAgICAgcHJldHR5U3VwcHJlc3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMud3JpdGVDaGlsZE5vZGUoZmlyc3RDaGlsZE5vZGUsIG9wdGlvbnMsIGxldmVsICsgMSk7XG4gICAgICAgIG9wdGlvbnMuc3VwcHJlc3NQcmV0dHlDb3VudC0tO1xuICAgICAgICBwcmV0dHlTdXBwcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJzwvJyArIG5vZGUubmFtZSArICc+Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicgKyB0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgICAgcmVmMSA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZjEubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBjaGlsZCA9IHJlZjFbal07XG4gICAgICAgICAgdGhpcy53cml0ZUNoaWxkTm9kZShjaGlsZCwgb3B0aW9ucywgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8LycgKyBub2RlLm5hbWUgKyAnPicpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUucHJvY2Vzc2luZ0luc3RydWN0aW9uID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZShYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLnByb2Nlc3NpbmdJbnN0cnVjdGlvbi5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZShYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLnJhdy5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoWE1MU3RyZWFtV3JpdGVyLl9fc3VwZXJfXy50ZXh0LmNhbGwodGhpcywgbm9kZSwgb3B0aW9ucywgbGV2ZWwpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kdGRBdHRMaXN0ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZShYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmR0ZEF0dExpc3QuY2FsbCh0aGlzLCBub2RlLCBvcHRpb25zLCBsZXZlbCkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmR0ZEVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKFhNTFN0cmVhbVdyaXRlci5fX3N1cGVyX18uZHRkRWxlbWVudC5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZHRkRW50aXR5ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZShYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmR0ZEVudGl0eS5jYWxsKHRoaXMsIG5vZGUsIG9wdGlvbnMsIGxldmVsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZHRkTm90YXRpb24gPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKFhNTFN0cmVhbVdyaXRlci5fX3N1cGVyX18uZHRkTm90YXRpb24uY2FsbCh0aGlzLCBub2RlLCBvcHRpb25zLCBsZXZlbCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MU3RyZWFtV3JpdGVyO1xuXG4gIH0pKFhNTFdyaXRlckJhc2UpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTFN0cmluZ1dyaXRlciwgWE1MV3JpdGVyQmFzZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTFdyaXRlckJhc2UgPSByZXF1aXJlKCcuL1hNTFdyaXRlckJhc2UnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTFN0cmluZ1dyaXRlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFN0cmluZ1dyaXRlciwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxTdHJpbmdXcml0ZXIob3B0aW9ucykge1xuICAgICAgWE1MU3RyaW5nV3JpdGVyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZG9jdW1lbnQgPSBmdW5jdGlvbihkb2MsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICBvcHRpb25zID0gdGhpcy5maWx0ZXJPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgciA9ICcnO1xuICAgICAgcmVmID0gZG9jLmNoaWxkcmVuO1xuICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICByICs9IHRoaXMud3JpdGVDaGlsZE5vZGUoY2hpbGQsIG9wdGlvbnMsIDApO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucHJldHR5ICYmIHIuc2xpY2UoLW9wdGlvbnMubmV3bGluZS5sZW5ndGgpID09PSBvcHRpb25zLm5ld2xpbmUpIHtcbiAgICAgICAgciA9IHIuc2xpY2UoMCwgLW9wdGlvbnMubmV3bGluZS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxTdHJpbmdXcml0ZXI7XG5cbiAgfSkoWE1MV3JpdGVyQmFzZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MU3RyaW5naWZpZXIsXG4gICAgYmluZCA9IGZ1bmN0aW9uKGZuLCBtZSl7IHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gZm4uYXBwbHkobWUsIGFyZ3VtZW50cyk7IH07IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MU3RyaW5naWZpZXIgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gWE1MU3RyaW5naWZpZXIob3B0aW9ucykge1xuICAgICAgdGhpcy5hc3NlcnRMZWdhbE5hbWUgPSBiaW5kKHRoaXMuYXNzZXJ0TGVnYWxOYW1lLCB0aGlzKTtcbiAgICAgIHRoaXMuYXNzZXJ0TGVnYWxDaGFyID0gYmluZCh0aGlzLmFzc2VydExlZ2FsQ2hhciwgdGhpcyk7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy52ZXJzaW9uID0gJzEuMCc7XG4gICAgICB9XG4gICAgICByZWYgPSBvcHRpb25zLnN0cmluZ2lmeSB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub1ZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFzc2VydExlZ2FsTmFtZSgnJyArIHZhbCB8fCAnJyk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHRoaXMudGV4dEVzY2FwZSgnJyArIHZhbCB8fCAnJykpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCddXT4nLCAnXV1dXT48IVtDREFUQVs+Jyk7XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIodmFsKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIGlmICh2YWwubWF0Y2goLy0tLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWVudCB0ZXh0IGNhbm5vdCBjb250YWluIGRvdWJsZS1oeXBlbjogXCIgKyB2YWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHZhbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5hdHRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub1ZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFzc2VydExlZ2FsQ2hhcih0aGlzLmF0dEVzY2FwZSh2YWwgPSAnJyArIHZhbCB8fCAnJykpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuaW5zVGFyZ2V0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKCcnICsgdmFsIHx8ICcnKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmluc1ZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAodmFsLm1hdGNoKC9cXD8+LykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHZhbHVlOiBcIiArIHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIodmFsKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLnhtbFZlcnNpb24gPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIGlmICghdmFsLm1hdGNoKC8xXFwuWzAtOV0rLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogXCIgKyB2YWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLnhtbEVuY29kaW5nID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAoIXZhbC5tYXRjaCgvXltBLVphLXpdKD86W0EtWmEtejAtOS5fLV0pKiQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVuY29kaW5nOiBcIiArIHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIodmFsKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLnhtbFN0YW5kYWxvbmUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHJldHVybiBcInllc1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwibm9cIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZFB1YklEID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKCcnICsgdmFsIHx8ICcnKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZFN5c0lEID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKCcnICsgdmFsIHx8ICcnKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZEVsZW1lbnRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub1ZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFzc2VydExlZ2FsQ2hhcignJyArIHZhbCB8fCAnJyk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRBdHRUeXBlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKCcnICsgdmFsIHx8ICcnKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZEF0dERlZmF1bHQgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIoJycgKyB2YWwgfHwgJycpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZHRkRW50aXR5VmFsdWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIoJycgKyB2YWwgfHwgJycpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZHRkTkRhdGEgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIoJycgKyB2YWwgfHwgJycpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydEF0dEtleSA9ICdAJztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UElLZXkgPSAnPyc7XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydFRleHRLZXkgPSAnI3RleHQnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDRGF0YUtleSA9ICcjY2RhdGEnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDb21tZW50S2V5ID0gJyNjb21tZW50JztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UmF3S2V5ID0gJyNyYXcnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmFzc2VydExlZ2FsQ2hhciA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgdmFyIHJlZ2V4LCByZXM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfVxuICAgICAgcmVnZXggPSAnJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICAgICAgcmVnZXggPSAvW1xcMC1cXHgwOFxceDBCXFxmXFx4MEUtXFx4MUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xuICAgICAgICBpZiAocmVzID0gc3RyLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGluIHN0cmluZzogXCIgKyBzdHIgKyBcIiBhdCBpbmRleCBcIiArIHJlcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnZlcnNpb24gPT09ICcxLjEnKSB7XG4gICAgICAgIHJlZ2V4ID0gL1tcXDBcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xuICAgICAgICBpZiAocmVzID0gc3RyLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGluIHN0cmluZzogXCIgKyBzdHIgKyBcIiBhdCBpbmRleCBcIiArIHJlcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5hc3NlcnRMZWdhbE5hbWUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICAgIHZhciByZWdleDtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9WYWxpZGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgICB0aGlzLmFzc2VydExlZ2FsQ2hhcihzdHIpO1xuICAgICAgcmVnZXggPSAvXihbOkEtWl9hLXpcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMENcXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXXxbXFx1RDgwMC1cXHVEQjdGXVtcXHVEQzAwLVxcdURGRkZdKShbXFx4MkRcXC4wLTpBLVpfYS16XFx4QjdcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMENcXHUyMDBEXFx1MjAzRlxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdfFtcXHVEODAwLVxcdURCN0ZdW1xcdURDMDAtXFx1REZGRl0pKiQvO1xuICAgICAgaWYgKCFzdHIubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGluIG5hbWVcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUudGV4dEVzY2FwZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgdmFyIGFtcHJlZ2V4O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub1ZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIH1cbiAgICAgIGFtcHJlZ2V4ID0gdGhpcy5vcHRpb25zLm5vRG91YmxlRW5jb2RpbmcgPyAvKD8hJlxcUys7KSYvZyA6IC8mL2c7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoYW1wcmVnZXgsICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXFxyL2csICcmI3hEOycpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuYXR0RXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgICB2YXIgYW1wcmVnZXg7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm5vVmFsaWRhdGlvbikge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfVxuICAgICAgYW1wcmVnZXggPSB0aGlzLm9wdGlvbnMubm9Eb3VibGVFbmNvZGluZyA/IC8oPyEmXFxTKzspJi9nIDogLyYvZztcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShhbXByZWdleCwgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKS5yZXBsYWNlKC9cXHQvZywgJyYjeDk7JykucmVwbGFjZSgvXFxuL2csICcmI3hBOycpLnJlcGxhY2UoL1xcci9nLCAnJiN4RDsnKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFN0cmluZ2lmaWVyO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTm9kZVR5cGUsIFhNTENoYXJhY3RlckRhdGEsIFhNTFRleHQsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxDaGFyYWN0ZXJEYXRhID0gcmVxdWlyZSgnLi9YTUxDaGFyYWN0ZXJEYXRhJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxUZXh0ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MVGV4dCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxUZXh0KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MVGV4dC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGVsZW1lbnQgdGV4dC4gXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IFwiI3RleHRcIjtcbiAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLlRleHQ7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkudGV4dCh0ZXh0KTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MVGV4dC5wcm90b3R5cGUsICdpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgRE9NIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXCIgKyB0aGlzLmRlYnVnSW5mbygpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxUZXh0LnByb3RvdHlwZSwgJ3dob2xlVGV4dCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBuZXh0LCBwcmV2LCBzdHI7XG4gICAgICAgIHN0ciA9ICcnO1xuICAgICAgICBwcmV2ID0gdGhpcy5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHdoaWxlIChwcmV2KSB7XG4gICAgICAgICAgc3RyID0gcHJldi5kYXRhICsgc3RyO1xuICAgICAgICAgIHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0gdGhpcy5kYXRhO1xuICAgICAgICBuZXh0ID0gdGhpcy5uZXh0U2libGluZztcbiAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICBzdHIgPSBzdHIgKyBuZXh0LmRhdGE7XG4gICAgICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFhNTFRleHQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICB9O1xuXG4gICAgWE1MVGV4dC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci50ZXh0KHRoaXMsIHRoaXMub3B0aW9ucy53cml0ZXIuZmlsdGVyT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIFhNTFRleHQucHJvdG90eXBlLnNwbGl0VGV4dCA9IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICBYTUxUZXh0LnByb3RvdHlwZS5yZXBsYWNlV2hvbGVUZXh0ID0gZnVuY3Rpb24oY29udGVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBET00gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIiArIHRoaXMuZGVidWdJbmZvKCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MVGV4dDtcblxuICB9KShYTUxDaGFyYWN0ZXJEYXRhKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOb2RlVHlwZSwgV3JpdGVyU3RhdGUsIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEVERBdHRMaXN0LCBYTUxEVERFbGVtZW50LCBYTUxEVERFbnRpdHksIFhNTERURE5vdGF0aW9uLCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRHVtbXksIFhNTEVsZW1lbnQsIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwgWE1MUmF3LCBYTUxUZXh0LCBYTUxXcml0ZXJCYXNlLCBhc3NpZ24sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGFzc2lnbiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLmFzc2lnbjtcblxuICBOb2RlVHlwZSA9IHJlcXVpcmUoJy4vTm9kZVR5cGUnKTtcblxuICBYTUxEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRGVjbGFyYXRpb24nKTtcblxuICBYTUxEb2NUeXBlID0gcmVxdWlyZSgnLi9YTUxEb2NUeXBlJyk7XG5cbiAgWE1MQ0RhdGEgPSByZXF1aXJlKCcuL1hNTENEYXRhJyk7XG5cbiAgWE1MQ29tbWVudCA9IHJlcXVpcmUoJy4vWE1MQ29tbWVudCcpO1xuXG4gIFhNTEVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTEVsZW1lbnQnKTtcblxuICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuXG4gIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcblxuICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSByZXF1aXJlKCcuL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbicpO1xuXG4gIFhNTER1bW15ID0gcmVxdWlyZSgnLi9YTUxEdW1teScpO1xuXG4gIFhNTERUREF0dExpc3QgPSByZXF1aXJlKCcuL1hNTERUREF0dExpc3QnKTtcblxuICBYTUxEVERFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxEVERFbGVtZW50Jyk7XG5cbiAgWE1MRFRERW50aXR5ID0gcmVxdWlyZSgnLi9YTUxEVERFbnRpdHknKTtcblxuICBYTUxEVEROb3RhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRFRETm90YXRpb24nKTtcblxuICBXcml0ZXJTdGF0ZSA9IHJlcXVpcmUoJy4vV3JpdGVyU3RhdGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTFdyaXRlckJhc2UgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gWE1MV3JpdGVyQmFzZShvcHRpb25zKSB7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWYgPSBvcHRpb25zLndyaXRlciB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzW1wiX1wiICsga2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUuZmlsdGVyT3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNjtcbiAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gICAgICBvcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgZmlsdGVyZWRPcHRpb25zID0ge1xuICAgICAgICB3cml0ZXI6IHRoaXNcbiAgICAgIH07XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMucHJldHR5ID0gb3B0aW9ucy5wcmV0dHkgfHwgZmFsc2U7XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMuYWxsb3dFbXB0eSA9IG9wdGlvbnMuYWxsb3dFbXB0eSB8fCBmYWxzZTtcbiAgICAgIGZpbHRlcmVkT3B0aW9ucy5pbmRlbnQgPSAocmVmID0gb3B0aW9ucy5pbmRlbnQpICE9IG51bGwgPyByZWYgOiAnICAnO1xuICAgICAgZmlsdGVyZWRPcHRpb25zLm5ld2xpbmUgPSAocmVmMSA9IG9wdGlvbnMubmV3bGluZSkgIT0gbnVsbCA/IHJlZjEgOiAnXFxuJztcbiAgICAgIGZpbHRlcmVkT3B0aW9ucy5vZmZzZXQgPSAocmVmMiA9IG9wdGlvbnMub2Zmc2V0KSAhPSBudWxsID8gcmVmMiA6IDA7XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMuZG9udFByZXR0eVRleHROb2RlcyA9IChyZWYzID0gKHJlZjQgPSBvcHRpb25zLmRvbnRQcmV0dHlUZXh0Tm9kZXMpICE9IG51bGwgPyByZWY0IDogb3B0aW9ucy5kb250cHJldHR5dGV4dG5vZGVzKSAhPSBudWxsID8gcmVmMyA6IDA7XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMuc3BhY2VCZWZvcmVTbGFzaCA9IChyZWY1ID0gKHJlZjYgPSBvcHRpb25zLnNwYWNlQmVmb3JlU2xhc2gpICE9IG51bGwgPyByZWY2IDogb3B0aW9ucy5zcGFjZWJlZm9yZXNsYXNoKSAhPSBudWxsID8gcmVmNSA6ICcnO1xuICAgICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoID09PSB0cnVlKSB7XG4gICAgICAgIGZpbHRlcmVkT3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoID0gJyAnO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRPcHRpb25zLnN1cHByZXNzUHJldHR5Q291bnQgPSAwO1xuICAgICAgZmlsdGVyZWRPcHRpb25zLnVzZXIgPSB7fTtcbiAgICAgIGZpbHRlcmVkT3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk5vbmU7XG4gICAgICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xuICAgIH07XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5pbmRlbnQgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIGluZGVudExldmVsO1xuICAgICAgaWYgKCFvcHRpb25zLnByZXR0eSB8fCBvcHRpb25zLnN1cHByZXNzUHJldHR5Q291bnQpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLnByZXR0eSkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IChsZXZlbCB8fCAwKSArIG9wdGlvbnMub2Zmc2V0ICsgMTtcbiAgICAgICAgaWYgKGluZGVudExldmVsID4gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkoaW5kZW50TGV2ZWwpLmpvaW4ob3B0aW9ucy5pbmRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmVuZGxpbmUgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgaWYgKCFvcHRpb25zLnByZXR0eSB8fCBvcHRpb25zLnN1cHByZXNzUHJldHR5Q291bnQpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubmV3bGluZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUuYXR0cmlidXRlID0gZnVuY3Rpb24oYXR0LCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0aGlzLm9wZW5BdHRyaWJ1dGUoYXR0LCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICByID0gJyAnICsgYXR0Lm5hbWUgKyAnPVwiJyArIGF0dC52YWx1ZSArICdcIic7XG4gICAgICB0aGlzLmNsb3NlQXR0cmlidXRlKGF0dCwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmNkYXRhID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHZhciByO1xuICAgICAgdGhpcy5vcGVuTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuT3BlblRhZztcbiAgICAgIHIgPSB0aGlzLmluZGVudChub2RlLCBvcHRpb25zLCBsZXZlbCkgKyAnPCFbQ0RBVEFbJztcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5JbnNpZGVUYWc7XG4gICAgICByICs9IG5vZGUudmFsdWU7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICByICs9ICddXT4nICsgdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5Ob25lO1xuICAgICAgdGhpcy5jbG9zZU5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgciA9IHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8IS0tICc7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgciArPSBub2RlLnZhbHVlO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgciArPSAnIC0tPicgKyB0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk5vbmU7XG4gICAgICB0aGlzLmNsb3NlTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUuZGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgciA9IHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8P3htbCc7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgciArPSAnIHZlcnNpb249XCInICsgbm9kZS52ZXJzaW9uICsgJ1wiJztcbiAgICAgIGlmIChub2RlLmVuY29kaW5nICE9IG51bGwpIHtcbiAgICAgICAgciArPSAnIGVuY29kaW5nPVwiJyArIG5vZGUuZW5jb2RpbmcgKyAnXCInO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuc3RhbmRhbG9uZSAhPSBudWxsKSB7XG4gICAgICAgIHIgKz0gJyBzdGFuZGFsb25lPVwiJyArIG5vZGUuc3RhbmRhbG9uZSArICdcIic7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICByICs9IG9wdGlvbnMuc3BhY2VCZWZvcmVTbGFzaCArICc/Pic7XG4gICAgICByICs9IHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIHRoaXMuY2xvc2VOb2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5kb2NUeXBlID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICBsZXZlbCB8fCAobGV2ZWwgPSAwKTtcbiAgICAgIHRoaXMub3Blbk5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk9wZW5UYWc7XG4gICAgICByID0gdGhpcy5pbmRlbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgciArPSAnPCFET0NUWVBFICcgKyBub2RlLnJvb3QoKS5uYW1lO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuc3lzSUQpIHtcbiAgICAgICAgciArPSAnIFNZU1RFTSBcIicgKyBub2RlLnN5c0lEICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgciArPSAnIFsnO1xuICAgICAgICByICs9IHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5JbnNpZGVUYWc7XG4gICAgICAgIHJlZiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIHIgKz0gdGhpcy53cml0ZUNoaWxkTm9kZShjaGlsZCwgb3B0aW9ucywgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICAgIHIgKz0gJ10nO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgciArPSBvcHRpb25zLnNwYWNlQmVmb3JlU2xhc2ggKyAnPic7XG4gICAgICByICs9IHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIHRoaXMuY2xvc2VOb2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHZhciBhdHQsIGNoaWxkLCBjaGlsZE5vZGVDb3VudCwgZmlyc3RDaGlsZE5vZGUsIGksIGosIGxlbiwgbGVuMSwgbmFtZSwgcHJldHR5U3VwcHJlc3NlZCwgciwgcmVmLCByZWYxLCByZWYyO1xuICAgICAgbGV2ZWwgfHwgKGxldmVsID0gMCk7XG4gICAgICBwcmV0dHlTdXBwcmVzc2VkID0gZmFsc2U7XG4gICAgICByID0gJyc7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgciArPSB0aGlzLmluZGVudChub2RlLCBvcHRpb25zLCBsZXZlbCkgKyAnPCcgKyBub2RlLm5hbWU7XG4gICAgICByZWYgPSBub2RlLmF0dHJpYnM7XG4gICAgICBmb3IgKG5hbWUgaW4gcmVmKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBhdHQgPSByZWZbbmFtZV07XG4gICAgICAgIHIgKz0gdGhpcy5hdHRyaWJ1dGUoYXR0LCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICB9XG4gICAgICBjaGlsZE5vZGVDb3VudCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgZmlyc3RDaGlsZE5vZGUgPSBjaGlsZE5vZGVDb3VudCA9PT0gMCA/IG51bGwgOiBub2RlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkTm9kZUNvdW50ID09PSAwIHx8IG5vZGUuY2hpbGRyZW4uZXZlcnkoZnVuY3Rpb24oZSkge1xuICAgICAgICByZXR1cm4gKGUudHlwZSA9PT0gTm9kZVR5cGUuVGV4dCB8fCBlLnR5cGUgPT09IE5vZGVUeXBlLlJhdykgJiYgZS52YWx1ZSA9PT0gJyc7XG4gICAgICB9KSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hbGxvd0VtcHR5KSB7XG4gICAgICAgICAgciArPSAnPic7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgICAgIHIgKz0gJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgICAgIHIgKz0gb3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoICsgJy8+JyArIHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wcmV0dHkgJiYgY2hpbGROb2RlQ291bnQgPT09IDEgJiYgKGZpcnN0Q2hpbGROb2RlLnR5cGUgPT09IE5vZGVUeXBlLlRleHQgfHwgZmlyc3RDaGlsZE5vZGUudHlwZSA9PT0gTm9kZVR5cGUuUmF3KSAmJiAoZmlyc3RDaGlsZE5vZGUudmFsdWUgIT0gbnVsbCkpIHtcbiAgICAgICAgciArPSAnPic7XG4gICAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5JbnNpZGVUYWc7XG4gICAgICAgIG9wdGlvbnMuc3VwcHJlc3NQcmV0dHlDb3VudCsrO1xuICAgICAgICBwcmV0dHlTdXBwcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgciArPSB0aGlzLndyaXRlQ2hpbGROb2RlKGZpcnN0Q2hpbGROb2RlLCBvcHRpb25zLCBsZXZlbCArIDEpO1xuICAgICAgICBvcHRpb25zLnN1cHByZXNzUHJldHR5Q291bnQtLTtcbiAgICAgICAgcHJldHR5U3VwcHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICAgIHIgKz0gJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy5kb250UHJldHR5VGV4dE5vZGVzKSB7XG4gICAgICAgICAgcmVmMSA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmMS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY2hpbGQgPSByZWYxW2ldO1xuICAgICAgICAgICAgaWYgKChjaGlsZC50eXBlID09PSBOb2RlVHlwZS5UZXh0IHx8IGNoaWxkLnR5cGUgPT09IE5vZGVUeXBlLlJhdykgJiYgKGNoaWxkLnZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMuc3VwcHJlc3NQcmV0dHlDb3VudCsrO1xuICAgICAgICAgICAgICBwcmV0dHlTdXBwcmVzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHIgKz0gJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgICAgcmVmMiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgaiA8IGxlbjE7IGorKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmMltqXTtcbiAgICAgICAgICByICs9IHRoaXMud3JpdGVDaGlsZE5vZGUoY2hpbGQsIG9wdGlvbnMsIGxldmVsICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgICByICs9IHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8LycgKyBub2RlLm5hbWUgKyAnPic7XG4gICAgICAgIGlmIChwcmV0dHlTdXBwcmVzc2VkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdXBwcmVzc1ByZXR0eUNvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgciArPSB0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VOb2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS53cml0ZUNoaWxkTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkNEYXRhOlxuICAgICAgICAgIHJldHVybiB0aGlzLmNkYXRhKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgICAgY2FzZSBOb2RlVHlwZS5Db21tZW50OlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkVsZW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuUmF3OlxuICAgICAgICAgIHJldHVybiB0aGlzLnJhdyhub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuVGV4dDpcbiAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0KG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgICAgY2FzZSBOb2RlVHlwZS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb246XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgICAgY2FzZSBOb2RlVHlwZS5EdW1teTpcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuRGVjbGFyYXRpb246XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkRvY1R5cGU6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG9jVHlwZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuQXR0cmlidXRlRGVjbGFyYXRpb246XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZHRkQXR0TGlzdChub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuRWxlbWVudERlY2xhcmF0aW9uOlxuICAgICAgICAgIHJldHVybiB0aGlzLmR0ZEVsZW1lbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgICBjYXNlIE5vZGVUeXBlLkVudGl0eURlY2xhcmF0aW9uOlxuICAgICAgICAgIHJldHVybiB0aGlzLmR0ZEVudGl0eShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGNhc2UgTm9kZVR5cGUuTm90YXRpb25EZWNsYXJhdGlvbjpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kdGROb3RhdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBYTUwgbm9kZSB0eXBlOiBcIiArIG5vZGUuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLnByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHRoaXMub3Blbk5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk9wZW5UYWc7XG4gICAgICByID0gdGhpcy5pbmRlbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpICsgJzw/JztcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5JbnNpZGVUYWc7XG4gICAgICByICs9IG5vZGUudGFyZ2V0O1xuICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgciArPSAnICcgKyBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgciArPSBvcHRpb25zLnNwYWNlQmVmb3JlU2xhc2ggKyAnPz4nO1xuICAgICAgciArPSB0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk5vbmU7XG4gICAgICB0aGlzLmNsb3NlTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHZhciByO1xuICAgICAgdGhpcy5vcGVuTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuT3BlblRhZztcbiAgICAgIHIgPSB0aGlzLmluZGVudChub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgciArPSBub2RlLnZhbHVlO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkNsb3NlVGFnO1xuICAgICAgciArPSB0aGlzLmVuZGxpbmUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk5vbmU7XG4gICAgICB0aGlzLmNsb3NlTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHRoaXMub3Blbk5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk9wZW5UYWc7XG4gICAgICByID0gdGhpcy5pbmRlbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgIHIgKz0gbm9kZS52YWx1ZTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgIHIgKz0gdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5Ob25lO1xuICAgICAgdGhpcy5jbG9zZU5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmR0ZEF0dExpc3QgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgciA9IHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8IUFUVExJU1QnO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgIHIgKz0gJyAnICsgbm9kZS5lbGVtZW50TmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlTmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlVHlwZTtcbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZVR5cGUgIT09ICcjREVGQVVMVCcpIHtcbiAgICAgICAgciArPSAnICcgKyBub2RlLmRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgciArPSAnIFwiJyArIG5vZGUuZGVmYXVsdFZhbHVlICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgIHIgKz0gb3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoICsgJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5Ob25lO1xuICAgICAgdGhpcy5jbG9zZU5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmR0ZEVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICB0aGlzLm9wZW5Ob2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5PcGVuVGFnO1xuICAgICAgciA9IHRoaXMuaW5kZW50KG5vZGUsIG9wdGlvbnMsIGxldmVsKSArICc8IUVMRU1FTlQnO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLkluc2lkZVRhZztcbiAgICAgIHIgKz0gJyAnICsgbm9kZS5uYW1lICsgJyAnICsgbm9kZS52YWx1ZTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgIHIgKz0gb3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoICsgJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5Ob25lO1xuICAgICAgdGhpcy5jbG9zZU5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmR0ZEVudGl0eSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHRoaXMub3Blbk5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgb3B0aW9ucy5zdGF0ZSA9IFdyaXRlclN0YXRlLk9wZW5UYWc7XG4gICAgICByID0gdGhpcy5pbmRlbnQobm9kZSwgb3B0aW9ucywgbGV2ZWwpICsgJzwhRU5USVRZJztcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5JbnNpZGVUYWc7XG4gICAgICBpZiAobm9kZS5wZSkge1xuICAgICAgICByICs9ICcgJSc7XG4gICAgICB9XG4gICAgICByICs9ICcgJyArIG5vZGUubmFtZTtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHIgKz0gJyBcIicgKyBub2RlLnZhbHVlICsgJ1wiJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub2RlLnB1YklEICYmIG5vZGUuc3lzSUQpIHtcbiAgICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubkRhdGEpIHtcbiAgICAgICAgICByICs9ICcgTkRBVEEgJyArIG5vZGUubkRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5DbG9zZVRhZztcbiAgICAgIHIgKz0gb3B0aW9ucy5zcGFjZUJlZm9yZVNsYXNoICsgJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIG9wdGlvbnMuc3RhdGUgPSBXcml0ZXJTdGF0ZS5Ob25lO1xuICAgICAgdGhpcy5jbG9zZU5vZGUobm9kZSwgb3B0aW9ucywgbGV2ZWwpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmR0ZE5vdGF0aW9uID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucywgbGV2ZWwpIHtcbiAgICAgIHZhciByO1xuICAgICAgdGhpcy5vcGVuTm9kZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuT3BlblRhZztcbiAgICAgIHIgPSB0aGlzLmluZGVudChub2RlLCBvcHRpb25zLCBsZXZlbCkgKyAnPCFOT1RBVElPTic7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuSW5zaWRlVGFnO1xuICAgICAgciArPSAnICcgKyBub2RlLm5hbWU7XG4gICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgIHIgKz0gJyBQVUJMSUMgXCInICsgbm9kZS5wdWJJRCArICdcIiBcIicgKyBub2RlLnN5c0lEICsgJ1wiJztcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5wdWJJRCkge1xuICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnN5c0lEKSB7XG4gICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuQ2xvc2VUYWc7XG4gICAgICByICs9IG9wdGlvbnMuc3BhY2VCZWZvcmVTbGFzaCArICc+JyArIHRoaXMuZW5kbGluZShub2RlLCBvcHRpb25zLCBsZXZlbCk7XG4gICAgICBvcHRpb25zLnN0YXRlID0gV3JpdGVyU3RhdGUuTm9uZTtcbiAgICAgIHRoaXMuY2xvc2VOb2RlKG5vZGUsIG9wdGlvbnMsIGxldmVsKTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7fTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmNsb3NlTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIG9wdGlvbnMsIGxldmVsKSB7fTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLm9wZW5BdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHQsIG9wdGlvbnMsIGxldmVsKSB7fTtcblxuICAgIFhNTFdyaXRlckJhc2UucHJvdG90eXBlLmNsb3NlQXR0cmlidXRlID0gZnVuY3Rpb24oYXR0LCBvcHRpb25zLCBsZXZlbCkge307XG5cbiAgICByZXR1cm4gWE1MV3JpdGVyQmFzZTtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgdmFyIE5vZGVUeXBlLCBXcml0ZXJTdGF0ZSwgWE1MRE9NSW1wbGVtZW50YXRpb24sIFhNTERvY3VtZW50LCBYTUxEb2N1bWVudENCLCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFN0cmluZ1dyaXRlciwgYXNzaWduLCBpc0Z1bmN0aW9uLCByZWY7XG5cbiAgcmVmID0gcmVxdWlyZSgnLi9VdGlsaXR5JyksIGFzc2lnbiA9IHJlZi5hc3NpZ24sIGlzRnVuY3Rpb24gPSByZWYuaXNGdW5jdGlvbjtcblxuICBYTUxET01JbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRE9NSW1wbGVtZW50YXRpb24nKTtcblxuICBYTUxEb2N1bWVudCA9IHJlcXVpcmUoJy4vWE1MRG9jdW1lbnQnKTtcblxuICBYTUxEb2N1bWVudENCID0gcmVxdWlyZSgnLi9YTUxEb2N1bWVudENCJyk7XG5cbiAgWE1MU3RyaW5nV3JpdGVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdXcml0ZXInKTtcblxuICBYTUxTdHJlYW1Xcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmVhbVdyaXRlcicpO1xuXG4gIE5vZGVUeXBlID0gcmVxdWlyZSgnLi9Ob2RlVHlwZScpO1xuXG4gIFdyaXRlclN0YXRlID0gcmVxdWlyZSgnLi9Xcml0ZXJTdGF0ZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKG5hbWUsIHhtbGRlYywgZG9jdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBkb2MsIHJvb3Q7XG4gICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUm9vdCBlbGVtZW50IG5lZWRzIGEgbmFtZS5cIik7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBhc3NpZ24oe30sIHhtbGRlYywgZG9jdHlwZSwgb3B0aW9ucyk7XG4gICAgZG9jID0gbmV3IFhNTERvY3VtZW50KG9wdGlvbnMpO1xuICAgIHJvb3QgPSBkb2MuZWxlbWVudChuYW1lKTtcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGxlc3MpIHtcbiAgICAgIGRvYy5kZWNsYXJhdGlvbihvcHRpb25zKTtcbiAgICAgIGlmICgob3B0aW9ucy5wdWJJRCAhPSBudWxsKSB8fCAob3B0aW9ucy5zeXNJRCAhPSBudWxsKSkge1xuICAgICAgICBkb2MuZHRkKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cy5iZWdpbiA9IGZ1bmN0aW9uKG9wdGlvbnMsIG9uRGF0YSwgb25FbmQpIHtcbiAgICB2YXIgcmVmMTtcbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgcmVmMSA9IFtvcHRpb25zLCBvbkRhdGFdLCBvbkRhdGEgPSByZWYxWzBdLCBvbkVuZCA9IHJlZjFbMV07XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmIChvbkRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MRG9jdW1lbnRDQihvcHRpb25zLCBvbkRhdGEsIG9uRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBYTUxEb2N1bWVudChvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMuc3RyaW5nV3JpdGVyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyaW5nV3JpdGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLnN0cmVhbVdyaXRlciA9IGZ1bmN0aW9uKHN0cmVhbSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMuaW1wbGVtZW50YXRpb24gPSBuZXcgWE1MRE9NSW1wbGVtZW50YXRpb24oKTtcblxuICBtb2R1bGUuZXhwb3J0cy5ub2RlVHlwZSA9IE5vZGVUeXBlO1xuXG4gIG1vZHVsZS5leHBvcnRzLndyaXRlclN0YXRlID0gV3JpdGVyU3RhdGU7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIHNoYSA9IHJlcXVpcmUoJy4vc2hhJyk7XG52YXIgc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEyNTYnKTtcbnZhciBtZDUgPSByZXF1aXJlKCcuL21kNScpO1xuXG52YXIgYWxnb3JpdGhtcyA9IHtcbiAgc2hhMTogc2hhLFxuICBzaGEyNTY6IHNoYTI1NixcbiAgbWQ1OiBtZDVcbn07XG5cbnZhciBibG9ja3NpemUgPSA2NDtcbnZhciB6ZXJvQnVmZmVyID0gQnVmZmVyLmFsbG9jKGJsb2Nrc2l6ZSk7XG56ZXJvQnVmZmVyLmZpbGwoMCk7XG5cbmZ1bmN0aW9uIGhtYWMoZm4sIGtleSwgZGF0YSkge1xuICBpZighQnVmZmVyLmlzQnVmZmVyKGtleSkpIGtleSA9IEJ1ZmZlci5mcm9tKGtleSk7XG4gIGlmKCFCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhKTtcblxuICBpZihrZXkubGVuZ3RoID4gYmxvY2tzaXplKSB7XG4gICAga2V5ID0gZm4oa2V5KVxuICB9IGVsc2UgaWYoa2V5Lmxlbmd0aCA8IGJsb2Nrc2l6ZSkge1xuICAgIGtleSA9IEJ1ZmZlci5jb25jYXQoW2tleSwgemVyb0J1ZmZlcl0sIGJsb2Nrc2l6ZSlcbiAgfVxuXG4gIHZhciBpcGFkID0gQnVmZmVyLmFsbG9jKGJsb2Nrc2l6ZSksIG9wYWQgPSBCdWZmZXIuYWxsb2MoYmxvY2tzaXplKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGJsb2Nrc2l6ZTsgaSsrKSB7XG4gICAgaXBhZFtpXSA9IGtleVtpXSBeIDB4MzZcbiAgICBvcGFkW2ldID0ga2V5W2ldIF4gMHg1Q1xuICB9XG5cbiAgdmFyIGhhc2ggPSBmbihCdWZmZXIuY29uY2F0KFtpcGFkLCBkYXRhXSkpXG4gIHJldHVybiBmbihCdWZmZXIuY29uY2F0KFtvcGFkLCBoYXNoXSkpXG59XG5cbmZ1bmN0aW9uIGhhc2goYWxnLCBrZXkpIHtcbiAgYWxnID0gYWxnIHx8ICdzaGExJztcbiAgdmFyIGZuID0gYWxnb3JpdGhtc1thbGddO1xuICB2YXIgYnVmcyA9IFtdO1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgaWYoIWZuKSBlcnJvcignYWxnb3JpdGhtOicsIGFsZywgJ2lzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYoIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuXG4gICAgICBidWZzLnB1c2goZGF0YSk7XG4gICAgICBsZW5ndGggKz0gZGF0YS5sZW5ndGg7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgZGlnZXN0OiBmdW5jdGlvbiAoZW5jKSB7XG4gICAgICB2YXIgYnVmID0gQnVmZmVyLmNvbmNhdChidWZzKTtcbiAgICAgIHZhciByID0ga2V5ID8gaG1hYyhmbiwga2V5LCBidWYpIDogZm4oYnVmKTtcbiAgICAgIGJ1ZnMgPSBudWxsO1xuICAgICAgcmV0dXJuIGVuYyA/IHIudG9TdHJpbmcoZW5jKSA6IHJcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXJyb3IgKCkge1xuICB2YXIgbSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCcgJylcbiAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICBtLFxuICAgICd3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cycsXG4gICAgJ2h0dHA6Ly9naXRodWIuY29tL2RvbWluaWN0YXJyL2NyeXB0by1icm93c2VyaWZ5J1xuICBdLmpvaW4oJ1xcbicpKVxufVxuXG5leHBvcnRzLmNyZWF0ZUhhc2ggPSBmdW5jdGlvbiAoYWxnKSB7IHJldHVybiBoYXNoKGFsZykgfTtcbmV4cG9ydHMuY3JlYXRlSG1hYyA9IGZ1bmN0aW9uIChhbGcsIGtleSkgeyByZXR1cm4gaGFzaChhbGcsIGtleSkgfTtcblxuZnVuY3Rpb24gZWFjaChhLCBmKSB7XG4gIGZvcih2YXIgaSBpbiBhKVxuICAgIGYoYVtpXSwgaSlcbn1cblxuLy8gdGhlIGxlYXN0IEkgY2FuIGRvIGlzIG1ha2UgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSByZXN0IG9mIHRoZSBub2RlLmpzL2NyeXB0byBhcGkuXG5lYWNoKFsnY3JlYXRlQ3JlZGVudGlhbHMnXG4gICwgJ2NyZWF0ZUNpcGhlcidcbiAgLCAnY3JlYXRlQ2lwaGVyaXYnXG4gICwgJ2NyZWF0ZURlY2lwaGVyJ1xuICAsICdjcmVhdGVEZWNpcGhlcml2J1xuICAsICdjcmVhdGVTaWduJ1xuICAsICdjcmVhdGVWZXJpZnknXG4gICwgJ2NyZWF0ZURpZmZpZUhlbGxtYW4nXG4gICwgJ3Bia2RmMiddLCBmdW5jdGlvbiAobmFtZSkge1xuICBleHBvcnRzW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdzb3JyeSwnLCBuYW1lLCAnaXMgbm90IGltcGxlbWVudGVkIHlldCcpXG4gIH1cbn0pOyIsInZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG52YXIgaW50U2l6ZSA9IDQ7XG52YXIgemVyb0J1ZmZlciA9IEJ1ZmZlci5hbGxvYyhpbnRTaXplKTsgemVyb0J1ZmZlci5maWxsKDApO1xudmFyIGNocnN6ID0gODtcblxuZnVuY3Rpb24gdG9BcnJheShidWYsIGJpZ0VuZGlhbikge1xuICBpZiAoKGJ1Zi5sZW5ndGggJSBpbnRTaXplKSAhPT0gMCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoICsgKGludFNpemUgLSAoYnVmLmxlbmd0aCAlIGludFNpemUpKTtcbiAgICBidWYgPSBCdWZmZXIuY29uY2F0KFtidWYsIHplcm9CdWZmZXJdLCBsZW4pO1xuICB9XG5cbiAgdmFyIGFyciA9IFtdO1xuICB2YXIgZm4gPSBiaWdFbmRpYW4gPyBidWYucmVhZEludDMyQkUgOiBidWYucmVhZEludDMyTEU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSBpbnRTaXplKSB7XG4gICAgYXJyLnB1c2goZm4uY2FsbChidWYsIGkpKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB0b0J1ZmZlcihhcnIsIHNpemUsIGJpZ0VuZGlhbikge1xuICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICB2YXIgZm4gPSBiaWdFbmRpYW4gPyBidWYud3JpdGVJbnQzMkJFIDogYnVmLndyaXRlSW50MzJMRTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBmbi5jYWxsKGJ1ZiwgYXJyW2ldLCBpICogNCwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZnVuY3Rpb24gaGFzaChidWYsIGZuLCBoYXNoU2l6ZSwgYmlnRW5kaWFuKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1Zik7XG4gIHZhciBhcnIgPSBmbih0b0FycmF5KGJ1ZiwgYmlnRW5kaWFuKSwgYnVmLmxlbmd0aCAqIGNocnN6KTtcbiAgcmV0dXJuIHRvQnVmZmVyKGFyciwgaGFzaFNpemUsIGJpZ0VuZGlhbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBoYXNoOiBoYXNoIH07XG4iLCIvKlxyXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXHJcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXHJcbiAqIFZlcnNpb24gMi4xIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwMi5cclxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxyXG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcclxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cclxuICovXHJcblxyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xyXG5cclxuLypcclxuICogUGVyZm9ybSBhIHNpbXBsZSBzZWxmLXRlc3QgdG8gc2VlIGlmIHRoZSBWTSBpcyB3b3JraW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBtZDVfdm1fdGVzdCgpXHJcbntcclxuICByZXR1cm4gaGV4X21kNShcImFiY1wiKSA9PSBcIjkwMDE1MDk4M2NkMjRmYjBkNjk2M2Y3ZDI4ZTE3ZjcyXCI7XHJcbn1cclxuXHJcbi8qXHJcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGhcclxuICovXHJcbmZ1bmN0aW9uIGNvcmVfbWQ1KHgsIGxlbilcclxue1xyXG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXHJcbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCAoKGxlbikgJSAzMik7XHJcbiAgeFsoKChsZW4gKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gbGVuO1xyXG5cclxuICB2YXIgYSA9ICAxNzMyNTg0MTkzO1xyXG4gIHZhciBiID0gLTI3MTczMzg3OTtcclxuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xyXG4gIHZhciBkID0gIDI3MTczMzg3ODtcclxuXHJcbiAgZm9yKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KVxyXG4gIHtcclxuICAgIHZhciBvbGRhID0gYTtcclxuICAgIHZhciBvbGRiID0gYjtcclxuICAgIHZhciBvbGRjID0gYztcclxuICAgIHZhciBvbGRkID0gZDtcclxuXHJcbiAgICBhID0gbWQ1X2ZmKGEsIGIsIGMsIGQsIHhbaSsgMF0sIDcgLCAtNjgwODc2OTM2KTtcclxuICAgIGQgPSBtZDVfZmYoZCwgYSwgYiwgYywgeFtpKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xyXG4gICAgYyA9IG1kNV9mZihjLCBkLCBhLCBiLCB4W2krIDJdLCAxNywgIDYwNjEwNTgxOSk7XHJcbiAgICBiID0gbWQ1X2ZmKGIsIGMsIGQsIGEsIHhbaSsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XHJcbiAgICBhID0gbWQ1X2ZmKGEsIGIsIGMsIGQsIHhbaSsgNF0sIDcgLCAtMTc2NDE4ODk3KTtcclxuICAgIGQgPSBtZDVfZmYoZCwgYSwgYiwgYywgeFtpKyA1XSwgMTIsICAxMjAwMDgwNDI2KTtcclxuICAgIGMgPSBtZDVfZmYoYywgZCwgYSwgYiwgeFtpKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcclxuICAgIGIgPSBtZDVfZmYoYiwgYywgZCwgYSwgeFtpKyA3XSwgMjIsIC00NTcwNTk4Myk7XHJcbiAgICBhID0gbWQ1X2ZmKGEsIGIsIGMsIGQsIHhbaSsgOF0sIDcgLCAgMTc3MDAzNTQxNik7XHJcbiAgICBkID0gbWQ1X2ZmKGQsIGEsIGIsIGMsIHhbaSsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XHJcbiAgICBjID0gbWQ1X2ZmKGMsIGQsIGEsIGIsIHhbaSsxMF0sIDE3LCAtNDIwNjMpO1xyXG4gICAgYiA9IG1kNV9mZihiLCBjLCBkLCBhLCB4W2krMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xyXG4gICAgYSA9IG1kNV9mZihhLCBiLCBjLCBkLCB4W2krMTJdLCA3ICwgIDE4MDQ2MDM2ODIpO1xyXG4gICAgZCA9IG1kNV9mZihkLCBhLCBiLCBjLCB4W2krMTNdLCAxMiwgLTQwMzQxMTAxKTtcclxuICAgIGMgPSBtZDVfZmYoYywgZCwgYSwgYiwgeFtpKzE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcclxuICAgIGIgPSBtZDVfZmYoYiwgYywgZCwgYSwgeFtpKzE1XSwgMjIsICAxMjM2NTM1MzI5KTtcclxuXHJcbiAgICBhID0gbWQ1X2dnKGEsIGIsIGMsIGQsIHhbaSsgMV0sIDUgLCAtMTY1Nzk2NTEwKTtcclxuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyA2XSwgOSAsIC0xMDY5NTAxNjMyKTtcclxuICAgIGMgPSBtZDVfZ2coYywgZCwgYSwgYiwgeFtpKzExXSwgMTQsICA2NDM3MTc3MTMpO1xyXG4gICAgYiA9IG1kNV9nZyhiLCBjLCBkLCBhLCB4W2krIDBdLCAyMCwgLTM3Mzg5NzMwMik7XHJcbiAgICBhID0gbWQ1X2dnKGEsIGIsIGMsIGQsIHhbaSsgNV0sIDUgLCAtNzAxNTU4NjkxKTtcclxuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKzEwXSwgOSAsICAzODAxNjA4Myk7XHJcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsxNV0sIDE0LCAtNjYwNDc4MzM1KTtcclxuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xyXG4gICAgYSA9IG1kNV9nZyhhLCBiLCBjLCBkLCB4W2krIDldLCA1ICwgIDU2ODQ0NjQzOCk7XHJcbiAgICBkID0gbWQ1X2dnKGQsIGEsIGIsIGMsIHhbaSsxNF0sIDkgLCAtMTAxOTgwMzY5MCk7XHJcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsgM10sIDE0LCAtMTg3MzYzOTYxKTtcclxuICAgIGIgPSBtZDVfZ2coYiwgYywgZCwgYSwgeFtpKyA4XSwgMjAsICAxMTYzNTMxNTAxKTtcclxuICAgIGEgPSBtZDVfZ2coYSwgYiwgYywgZCwgeFtpKzEzXSwgNSAsIC0xNDQ0NjgxNDY3KTtcclxuICAgIGQgPSBtZDVfZ2coZCwgYSwgYiwgYywgeFtpKyAyXSwgOSAsIC01MTQwMzc4NCk7XHJcbiAgICBjID0gbWQ1X2dnKGMsIGQsIGEsIGIsIHhbaSsgN10sIDE0LCAgMTczNTMyODQ3Myk7XHJcbiAgICBiID0gbWQ1X2dnKGIsIGMsIGQsIGEsIHhbaSsxMl0sIDIwLCAtMTkyNjYwNzczNCk7XHJcblxyXG4gICAgYSA9IG1kNV9oaChhLCBiLCBjLCBkLCB4W2krIDVdLCA0ICwgLTM3ODU1OCk7XHJcbiAgICBkID0gbWQ1X2hoKGQsIGEsIGIsIGMsIHhbaSsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XHJcbiAgICBjID0gbWQ1X2hoKGMsIGQsIGEsIGIsIHhbaSsxMV0sIDE2LCAgMTgzOTAzMDU2Mik7XHJcbiAgICBiID0gbWQ1X2hoKGIsIGMsIGQsIGEsIHhbaSsxNF0sIDIzLCAtMzUzMDk1NTYpO1xyXG4gICAgYSA9IG1kNV9oaChhLCBiLCBjLCBkLCB4W2krIDFdLCA0ICwgLTE1MzA5OTIwNjApO1xyXG4gICAgZCA9IG1kNV9oaChkLCBhLCBiLCBjLCB4W2krIDRdLCAxMSwgIDEyNzI4OTMzNTMpO1xyXG4gICAgYyA9IG1kNV9oaChjLCBkLCBhLCBiLCB4W2krIDddLCAxNiwgLTE1NTQ5NzYzMik7XHJcbiAgICBiID0gbWQ1X2hoKGIsIGMsIGQsIGEsIHhbaSsxMF0sIDIzLCAtMTA5NDczMDY0MCk7XHJcbiAgICBhID0gbWQ1X2hoKGEsIGIsIGMsIGQsIHhbaSsxM10sIDQgLCAgNjgxMjc5MTc0KTtcclxuICAgIGQgPSBtZDVfaGgoZCwgYSwgYiwgYywgeFtpKyAwXSwgMTEsIC0zNTg1MzcyMjIpO1xyXG4gICAgYyA9IG1kNV9oaChjLCBkLCBhLCBiLCB4W2krIDNdLCAxNiwgLTcyMjUyMTk3OSk7XHJcbiAgICBiID0gbWQ1X2hoKGIsIGMsIGQsIGEsIHhbaSsgNl0sIDIzLCAgNzYwMjkxODkpO1xyXG4gICAgYSA9IG1kNV9oaChhLCBiLCBjLCBkLCB4W2krIDldLCA0ICwgLTY0MDM2NDQ4Nyk7XHJcbiAgICBkID0gbWQ1X2hoKGQsIGEsIGIsIGMsIHhbaSsxMl0sIDExLCAtNDIxODE1ODM1KTtcclxuICAgIGMgPSBtZDVfaGgoYywgZCwgYSwgYiwgeFtpKzE1XSwgMTYsICA1MzA3NDI1MjApO1xyXG4gICAgYiA9IG1kNV9oaChiLCBjLCBkLCBhLCB4W2krIDJdLCAyMywgLTk5NTMzODY1MSk7XHJcblxyXG4gICAgYSA9IG1kNV9paShhLCBiLCBjLCBkLCB4W2krIDBdLCA2ICwgLTE5ODYzMDg0NCk7XHJcbiAgICBkID0gbWQ1X2lpKGQsIGEsIGIsIGMsIHhbaSsgN10sIDEwLCAgMTEyNjg5MTQxNSk7XHJcbiAgICBjID0gbWQ1X2lpKGMsIGQsIGEsIGIsIHhbaSsxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XHJcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgNV0sIDIxLCAtNTc0MzQwNTUpO1xyXG4gICAgYSA9IG1kNV9paShhLCBiLCBjLCBkLCB4W2krMTJdLCA2ICwgIDE3MDA0ODU1NzEpO1xyXG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xyXG4gICAgYyA9IG1kNV9paShjLCBkLCBhLCBiLCB4W2krMTBdLCAxNSwgLTEwNTE1MjMpO1xyXG4gICAgYiA9IG1kNV9paShiLCBjLCBkLCBhLCB4W2krIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xyXG4gICAgYSA9IG1kNV9paShhLCBiLCBjLCBkLCB4W2krIDhdLCA2ICwgIDE4NzMzMTMzNTkpO1xyXG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krMTVdLCAxMCwgLTMwNjExNzQ0KTtcclxuICAgIGMgPSBtZDVfaWkoYywgZCwgYSwgYiwgeFtpKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcclxuICAgIGIgPSBtZDVfaWkoYiwgYywgZCwgYSwgeFtpKzEzXSwgMjEsICAxMzA5MTUxNjQ5KTtcclxuICAgIGEgPSBtZDVfaWkoYSwgYiwgYywgZCwgeFtpKyA0XSwgNiAsIC0xNDU1MjMwNzApO1xyXG4gICAgZCA9IG1kNV9paShkLCBhLCBiLCBjLCB4W2krMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xyXG4gICAgYyA9IG1kNV9paShjLCBkLCBhLCBiLCB4W2krIDJdLCAxNSwgIDcxODc4NzI1OSk7XHJcbiAgICBiID0gbWQ1X2lpKGIsIGMsIGQsIGEsIHhbaSsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcclxuXHJcbiAgICBhID0gc2FmZV9hZGQoYSwgb2xkYSk7XHJcbiAgICBiID0gc2FmZV9hZGQoYiwgb2xkYik7XHJcbiAgICBjID0gc2FmZV9hZGQoYywgb2xkYyk7XHJcbiAgICBkID0gc2FmZV9hZGQoZCwgb2xkZCk7XHJcbiAgfVxyXG4gIHJldHVybiBBcnJheShhLCBiLCBjLCBkKTtcclxuXHJcbn1cclxuXHJcbi8qXHJcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBtZDVfY21uKHEsIGEsIGIsIHgsIHMsIHQpXHJcbntcclxuICByZXR1cm4gc2FmZV9hZGQoYml0X3JvbChzYWZlX2FkZChzYWZlX2FkZChhLCBxKSwgc2FmZV9hZGQoeCwgdCkpLCBzKSxiKTtcclxufVxyXG5mdW5jdGlvbiBtZDVfZmYoYSwgYiwgYywgZCwgeCwgcywgdClcclxue1xyXG4gIHJldHVybiBtZDVfY21uKChiICYgYykgfCAoKH5iKSAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcclxufVxyXG5mdW5jdGlvbiBtZDVfZ2coYSwgYiwgYywgZCwgeCwgcywgdClcclxue1xyXG4gIHJldHVybiBtZDVfY21uKChiICYgZCkgfCAoYyAmICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcclxufVxyXG5mdW5jdGlvbiBtZDVfaGgoYSwgYiwgYywgZCwgeCwgcywgdClcclxue1xyXG4gIHJldHVybiBtZDVfY21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XHJcbn1cclxuZnVuY3Rpb24gbWQ1X2lpKGEsIGIsIGMsIGQsIHgsIHMsIHQpXHJcbntcclxuICByZXR1cm4gbWQ1X2NtbihjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7XHJcbn1cclxuXHJcbi8qXHJcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcclxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cclxuICovXHJcbmZ1bmN0aW9uIHNhZmVfYWRkKHgsIHkpXHJcbntcclxuICB2YXIgbHN3ID0gKHggJiAweEZGRkYpICsgKHkgJiAweEZGRkYpO1xyXG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcclxuICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcclxufVxyXG5cclxuLypcclxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxyXG4gKi9cclxuZnVuY3Rpb24gYml0X3JvbChudW0sIGNudClcclxue1xyXG4gIHJldHVybiAobnVtIDw8IGNudCkgfCAobnVtID4+PiAoMzIgLSBjbnQpKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZDUoYnVmKSB7XHJcbiAgcmV0dXJuIGhlbHBlcnMuaGFzaChidWYsIGNvcmVfbWQ1LCAxNik7XHJcbn07XHJcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTEsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBWZXJzaW9uIDIuMWEgQ29weXJpZ2h0IFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDIuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBkZXRhaWxzLlxuICovXG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIFNIQS0xIG9mIGFuIGFycmF5IG9mIGJpZy1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGhcbiAqL1xuZnVuY3Rpb24gY29yZV9zaGExKHgsIGxlbilcbntcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBsZW4gJSAzMik7XG4gIHhbKChsZW4gKyA2NCA+PiA5KSA8PCA0KSArIDE1XSA9IGxlbjtcblxuICB2YXIgdyA9IEFycmF5KDgwKTtcbiAgdmFyIGEgPSAgMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9ICAyNzE3MzM4Nzg7XG4gIHZhciBlID0gLTEwMDk1ODk3NzY7XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KVxuICB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIHZhciBvbGRlID0gZTtcblxuICAgIGZvcih2YXIgaiA9IDA7IGogPCA4MDsgaisrKVxuICAgIHtcbiAgICAgIGlmKGogPCAxNikgd1tqXSA9IHhbaSArIGpdO1xuICAgICAgZWxzZSB3W2pdID0gcm9sKHdbai0zXSBeIHdbai04XSBeIHdbai0xNF0gXiB3W2otMTZdLCAxKTtcbiAgICAgIHZhciB0ID0gc2FmZV9hZGQoc2FmZV9hZGQocm9sKGEsIDUpLCBzaGExX2Z0KGosIGIsIGMsIGQpKSxcbiAgICAgICAgc2FmZV9hZGQoc2FmZV9hZGQoZSwgd1tqXSksIHNoYTFfa3QoaikpKTtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gcm9sKGIsIDMwKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuXG4gICAgYSA9IHNhZmVfYWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlX2FkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZV9hZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVfYWRkKGQsIG9sZGQpO1xuICAgIGUgPSBzYWZlX2FkZChlLCBvbGRlKTtcbiAgfVxuICByZXR1cm4gQXJyYXkoYSwgYiwgYywgZCwgZSk7XG5cbn1cblxuLypcbiAqIFBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIHRyaXBsZXQgY29tYmluYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50XG4gKiBpdGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gc2hhMV9mdCh0LCBiLCBjLCBkKVxue1xuICBpZih0IDwgMjApIHJldHVybiAoYiAmIGMpIHwgKCh+YikgJiBkKTtcbiAgaWYodCA8IDQwKSByZXR1cm4gYiBeIGMgXiBkO1xuICBpZih0IDwgNjApIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCk7XG4gIHJldHVybiBiIF4gYyBeIGQ7XG59XG5cbi8qXG4gKiBEZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGFkZGl0aXZlIGNvbnN0YW50IGZvciB0aGUgY3VycmVudCBpdGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gc2hhMV9rdCh0KVxue1xuICByZXR1cm4gKHQgPCAyMCkgPyAgMTUxODUwMDI0OSA6ICh0IDwgNDApID8gIDE4NTk3NzUzOTMgOlxuICAgICh0IDwgNjApID8gLTE4OTQwMDc1ODggOiAtODk5NDk3NTE0O1xufVxuXG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuZnVuY3Rpb24gc2FmZV9hZGQoeCwgeSlcbntcbiAgdmFyIGxzdyA9ICh4ICYgMHhGRkZGKSArICh5ICYgMHhGRkZGKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbn1cblxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuZnVuY3Rpb24gcm9sKG51bSwgY250KVxue1xuICByZXR1cm4gKG51bSA8PCBjbnQpIHwgKG51bSA+Pj4gKDMyIC0gY250KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhMShidWYpIHtcbiAgcmV0dXJuIGhlbHBlcnMuaGFzaChidWYsIGNvcmVfc2hhMSwgMjAsIHRydWUpO1xufTtcbiIsIlxuLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7XG5cbnZhciBzYWZlX2FkZCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhGRkZGKSArICh5ICYgMHhGRkZGKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbn07XG5cbnZhciBTID0gZnVuY3Rpb24oWCwgbikge1xuICByZXR1cm4gKFggPj4+IG4pIHwgKFggPDwgKDMyIC0gbikpO1xufTtcblxudmFyIFIgPSBmdW5jdGlvbihYLCBuKSB7XG4gIHJldHVybiAoWCA+Pj4gbik7XG59O1xuXG52YXIgQ2ggPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gIHJldHVybiAoKHggJiB5KSBeICgofngpICYgeikpO1xufTtcblxudmFyIE1haiA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgcmV0dXJuICgoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeikpO1xufTtcblxudmFyIFNpZ21hMDI1NiA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIChTKHgsIDIpIF4gUyh4LCAxMykgXiBTKHgsIDIyKSk7XG59O1xuXG52YXIgU2lnbWExMjU2ID0gZnVuY3Rpb24oeCkge1xuICByZXR1cm4gKFMoeCwgNikgXiBTKHgsIDExKSBeIFMoeCwgMjUpKTtcbn07XG5cbnZhciBHYW1tYTAyNTYgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiAoUyh4LCA3KSBeIFMoeCwgMTgpIF4gUih4LCAzKSk7XG59O1xuXG52YXIgR2FtbWExMjU2ID0gZnVuY3Rpb24oeCkge1xuICByZXR1cm4gKFMoeCwgMTcpIF4gUyh4LCAxOSkgXiBSKHgsIDEwKSk7XG59O1xuXG52YXIgY29yZV9zaGEyNTYgPSBmdW5jdGlvbihtLCBsKSB7XG4gIHZhciBLID0gbmV3IEFycmF5KDB4NDI4QTJGOTgsMHg3MTM3NDQ5MSwweEI1QzBGQkNGLDB4RTlCNURCQTUsMHgzOTU2QzI1QiwweDU5RjExMUYxLDB4OTIzRjgyQTQsMHhBQjFDNUVENSwweEQ4MDdBQTk4LDB4MTI4MzVCMDEsMHgyNDMxODVCRSwweDU1MEM3REMzLDB4NzJCRTVENzQsMHg4MERFQjFGRSwweDlCREMwNkE3LDB4QzE5QkYxNzQsMHhFNDlCNjlDMSwweEVGQkU0Nzg2LDB4RkMxOURDNiwweDI0MENBMUNDLDB4MkRFOTJDNkYsMHg0QTc0ODRBQSwweDVDQjBBOURDLDB4NzZGOTg4REEsMHg5ODNFNTE1MiwweEE4MzFDNjZELDB4QjAwMzI3QzgsMHhCRjU5N0ZDNywweEM2RTAwQkYzLDB4RDVBNzkxNDcsMHg2Q0E2MzUxLDB4MTQyOTI5NjcsMHgyN0I3MEE4NSwweDJFMUIyMTM4LDB4NEQyQzZERkMsMHg1MzM4MEQxMywweDY1MEE3MzU0LDB4NzY2QTBBQkIsMHg4MUMyQzkyRSwweDkyNzIyQzg1LDB4QTJCRkU4QTEsMHhBODFBNjY0QiwweEMyNEI4QjcwLDB4Qzc2QzUxQTMsMHhEMTkyRTgxOSwweEQ2OTkwNjI0LDB4RjQwRTM1ODUsMHgxMDZBQTA3MCwweDE5QTRDMTE2LDB4MUUzNzZDMDgsMHgyNzQ4Nzc0QywweDM0QjBCQ0I1LDB4MzkxQzBDQjMsMHg0RUQ4QUE0QSwweDVCOUNDQTRGLDB4NjgyRTZGRjMsMHg3NDhGODJFRSwweDc4QTU2MzZGLDB4ODRDODc4MTQsMHg4Q0M3MDIwOCwweDkwQkVGRkZBLDB4QTQ1MDZDRUIsMHhCRUY5QTNGNywweEM2NzE3OEYyKTtcbiAgdmFyIEhBU0ggPSBuZXcgQXJyYXkoMHg2QTA5RTY2NywgMHhCQjY3QUU4NSwgMHgzQzZFRjM3MiwgMHhBNTRGRjUzQSwgMHg1MTBFNTI3RiwgMHg5QjA1Njg4QywgMHgxRjgzRDlBQiwgMHg1QkUwQ0QxOSk7XG4gICAgdmFyIFcgPSBuZXcgQXJyYXkoNjQpO1xuICAgIHZhciBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqO1xuICAgIHZhciBUMSwgVDI7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIG1bbCA+PiA1XSB8PSAweDgwIDw8ICgyNCAtIGwgJSAzMik7XG4gIG1bKChsICsgNjQgPj4gOSkgPDwgNCkgKyAxNV0gPSBsO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG0ubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgYSA9IEhBU0hbMF07IGIgPSBIQVNIWzFdOyBjID0gSEFTSFsyXTsgZCA9IEhBU0hbM107IGUgPSBIQVNIWzRdOyBmID0gSEFTSFs1XTsgZyA9IEhBU0hbNl07IGggPSBIQVNIWzddO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgaWYgKGogPCAxNikge1xuICAgICAgICBXW2pdID0gbVtqICsgaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBXW2pdID0gc2FmZV9hZGQoc2FmZV9hZGQoc2FmZV9hZGQoR2FtbWExMjU2KFdbaiAtIDJdKSwgV1tqIC0gN10pLCBHYW1tYTAyNTYoV1tqIC0gMTVdKSksIFdbaiAtIDE2XSk7XG4gICAgICB9XG4gICAgICBUMSA9IHNhZmVfYWRkKHNhZmVfYWRkKHNhZmVfYWRkKHNhZmVfYWRkKGgsIFNpZ21hMTI1NihlKSksIENoKGUsIGYsIGcpKSwgS1tqXSksIFdbal0pO1xuICAgICAgVDIgPSBzYWZlX2FkZChTaWdtYTAyNTYoYSksIE1haihhLCBiLCBjKSk7XG4gICAgICBoID0gZzsgZyA9IGY7IGYgPSBlOyBlID0gc2FmZV9hZGQoZCwgVDEpOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gc2FmZV9hZGQoVDEsIFQyKTtcbiAgICB9XG4gICAgSEFTSFswXSA9IHNhZmVfYWRkKGEsIEhBU0hbMF0pOyBIQVNIWzFdID0gc2FmZV9hZGQoYiwgSEFTSFsxXSk7IEhBU0hbMl0gPSBzYWZlX2FkZChjLCBIQVNIWzJdKTsgSEFTSFszXSA9IHNhZmVfYWRkKGQsIEhBU0hbM10pO1xuICAgIEhBU0hbNF0gPSBzYWZlX2FkZChlLCBIQVNIWzRdKTsgSEFTSFs1XSA9IHNhZmVfYWRkKGYsIEhBU0hbNV0pOyBIQVNIWzZdID0gc2FmZV9hZGQoZywgSEFTSFs2XSk7IEhBU0hbN10gPSBzYWZlX2FkZChoLCBIQVNIWzddKTtcbiAgfVxuICByZXR1cm4gSEFTSDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhMjU2KGJ1Zikge1xuICByZXR1cm4gaGVscGVycy5oYXNoKGJ1ZiwgY29yZV9zaGEyNTYsIDMyLCB0cnVlKTtcbn07XG4iLCIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5taW1lID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0eXBlTWFwIFtPYmplY3RdIE1hcCBvZiBNSU1FIHR5cGUgLT4gQXJyYXlbZXh0ZW5zaW9uc11cbiAgICogQHBhcmFtIC4uLlxuICAgKi9cbiAgY2xhc3MgTWltZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl90eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5kZWZpbmUoYXJndW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbWltZXR5cGUgLT4geHRlbnNpb24gbWFwcGluZ3MuICBFYWNoIGtleSBpcyBhIG1pbWUtdHlwZSB0aGF0IG1hcHNcbiAgICAgKiB0byBhbiBhcnJheSBvZiBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHlwZS4gIFRoZSBmaXJzdCBleHRlbnNpb24gaXNcbiAgICAgKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlIHR5cGUuXG4gICAgICpcbiAgICAgKiBlLmcuIG1pbWUuZGVmaW5lKHsnYXVkaW8vb2dnJywgWydvZ2EnLCAnb2dnJywgJ3NweCddfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFwIChPYmplY3QpIHR5cGUgZGVmaW5pdGlvbnNcbiAgICAgKi9cbiAgICBkZWZpbmUodHlwZU1hcCwgZm9yY2UpIHtcbiAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZU1hcCkge1xuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IHR5cGVNYXBbdHlwZV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHQgPSBleHRlbnNpb25zW2ldO1xuICAgICAgICAgIGlmICghZm9yY2UgJiYgKGV4dCBpbiB0aGlzLl90eXBlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBjaGFuZ2UgbWFwcGluZyBmb3IgXCIke2V4dH1cIiBleHRlbnNpb24gZnJvbSBcIiR7dGhpcy5fdHlwZXNbZXh0XX1cIiB0byBcIiR7dHlwZX1cIi4gUGFzcyBcXGBmb3JjZT10cnVlXFxgIHRvIGFsbG93IHRoaXMsIG90aGVyd2lzZSByZW1vdmUgXCIke2V4dH1cIiBmcm9tIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZm9yIFwiJHt0eXBlfVwiLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3R5cGVzW2V4dF0gPSB0eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGZpcnN0IGV4dGVuc2lvbiBhcyBkZWZhdWx0XG4gICAgICAgIGlmIChmb3JjZSB8fCAhdGhpcy5fZXh0ZW5zaW9uc1t0eXBlXSkge1xuICAgICAgICAgIHRoaXMuX2V4dGVuc2lvbnNbdHlwZV0gPSBleHRlbnNpb25zWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3VwIGEgbWltZSB0eXBlIGJhc2VkIG9uIGV4dGVuc2lvblxuICAgICAqL1xuICAgIGdldFR5cGUocGF0aCkge1xuICAgICAgcGF0aCA9IFN0cmluZyhwYXRoKTtcbiAgICAgIHZhciBsYXN0ID0gcGF0aC5yZXBsYWNlKC9eLipbL1xcXFxdLywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgZXh0ID0gbGFzdC5yZXBsYWNlKC9eLipcXC4vLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdmFyIGhhc1BhdGggPSBsYXN0Lmxlbmd0aCA8IHBhdGgubGVuZ3RoO1xuICAgICAgdmFyIGhhc0RvdCA9IGV4dC5sZW5ndGggPCBsYXN0Lmxlbmd0aCAtIDE7XG5cbiAgICAgIHJldHVybiAoaGFzRG90IHx8ICFoYXNQYXRoKSAmJiB0aGlzLl90eXBlc1tleHRdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1pbWUgdHlwZVxuICAgICAqL1xuICAgIGdldEV4dGVuc2lvbih0eXBlKSB7XG4gICAgICB0eXBlID0gL15cXHMqKFteO1xcc10qKS8udGVzdCh0eXBlKSAmJiBSZWdFeHAuJDE7XG4gICAgICByZXR1cm4gdHlwZSAmJiB0aGlzLl9leHRlbnNpb25zW3R5cGUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcbiAgICB9XG4gIH1cblxuICBtb2R1bGUuZXhwb3J0cyA9IE1pbWU7XG5cbn0se31dLDI6W2Z1bmN0aW9uKHIsbW9kdWxlLGV4cG9ydHMpe1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTWltZSA9IHIoJy4vTWltZScpO1xuICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBNaW1lKHIoJy4vdHlwZXMvc3RhbmRhcmQnKSwgcignLi90eXBlcy9vdGhlcicpKTtcblxufSx7XCIuL01pbWVcIjoxLFwiLi90eXBlcy9vdGhlclwiOjMsXCIuL3R5cGVzL3N0YW5kYXJkXCI6NH1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuICBtb2R1bGUuZXhwb3J0cz17XCJhcHBsaWNhdGlvbi9wcnMuY3d3XCI6W1wiY3d3XCJdLFwiYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LWxhcmdlXCI6W1wicGxiXCJdLFwiYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXNtYWxsXCI6W1wicHNiXCJdLFwiYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXZhclwiOltcInB2YlwiXSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi50Y2FwXCI6W1widGNhcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC4zbS5wb3N0LWl0LW5vdGVzXCI6W1wicHduXCJdLFwiYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuYXNvXCI6W1wiYXNvXCJdLFwiYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wXCI6W1wiaW1wXCJdLFwiYXBwbGljYXRpb24vdm5kLmFjdWNvYm9sXCI6W1wiYWN1XCJdLFwiYXBwbGljYXRpb24vdm5kLmFjdWNvcnBcIjpbXCJhdGNcIixcImFjdXRjXCJdLFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLmFpci1hcHBsaWNhdGlvbi1pbnN0YWxsZXItcGFja2FnZSt6aXBcIjpbXCJhaXJcIl0sXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUuZm9ybXNjZW50cmFsLmZjZHRcIjpbXCJmY2R0XCJdLFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLmZ4cFwiOltcImZ4cFwiLFwiZnhwbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZHAreG1sXCI6W1wieGRwXCJdLFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLnhmZGZcIjpbXCJ4ZmRmXCJdLFwiYXBwbGljYXRpb24vdm5kLmFoZWFkLnNwYWNlXCI6W1wiYWhlYWRcIl0sXCJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpmXCI6W1wiYXpmXCJdLFwiYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6c1wiOltcImF6c1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2tcIjpbXCJhendcIl0sXCJhcHBsaWNhdGlvbi92bmQuYW1lcmljYW5keW5hbWljcy5hY2NcIjpbXCJhY2NcIl0sXCJhcHBsaWNhdGlvbi92bmQuYW1pZ2EuYW1pXCI6W1wiYW1pXCJdLFwiYXBwbGljYXRpb24vdm5kLmFuZHJvaWQucGFja2FnZS1hcmNoaXZlXCI6W1wiYXBrXCJdLFwiYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1jZXJ0aWZpY2F0ZS1pc3N1ZS1pbml0aWF0aW9uXCI6W1wiY2lpXCJdLFwiYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1mdW5kcy10cmFuc2Zlci1pbml0aWF0aW9uXCI6W1wiZnRpXCJdLFwiYXBwbGljYXRpb24vdm5kLmFudGl4LmdhbWUtY29tcG9uZW50XCI6W1wiYXR4XCJdLFwiYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWxcIjpbXCJtcGtnXCJdLFwiYXBwbGljYXRpb24vdm5kLmFwcGxlLm1wZWd1cmxcIjpbXCJtM3U4XCJdLFwiYXBwbGljYXRpb24vdm5kLmFwcGxlLnBrcGFzc1wiOltcInBrcGFzc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hcmlzdGFuZXR3b3Jrcy5zd2lcIjpbXCJzd2lcIl0sXCJhcHBsaWNhdGlvbi92bmQuYXN0cmFlYS1zb2Z0d2FyZS5pb3RhXCI6W1wiaW90YVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hdWRpb2dyYXBoXCI6W1wiYWVwXCJdLFwiYXBwbGljYXRpb24vdm5kLmJsdWVpY2UubXVsdGlwYXNzXCI6W1wibXBtXCJdLFwiYXBwbGljYXRpb24vdm5kLmJtaVwiOltcImJtaVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHNcIjpbXCJyZXBcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2hlbWRyYXcreG1sXCI6W1wiY2R4bWxcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWRcIjpbXCJtbWRcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYVwiOltcImNkeVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jbGF5bW9yZVwiOltcImNsYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jbG9hbnRvLnJwOVwiOltcInJwOVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jbG9uay5jNGdyb3VwXCI6W1wiYzRnXCIsXCJjNGRcIixcImM0ZlwiLFwiYzRwXCIsXCJjNHVcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZ1wiOltcImMxMWFtY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5jbHVldHJ1c3QuY2FydG9tb2JpbGUtY29uZmlnLXBrZ1wiOltcImMxMWFtelwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZVwiOltcImNzcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jb250YWN0LmNtc2dcIjpbXCJjZGJjbXNnXCJdLFwiYXBwbGljYXRpb24vdm5kLmNvc21vY2FsbGVyXCI6W1wiY21jXCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXJcIjpbXCJjbGt4XCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmRcIjpbXCJjbGtrXCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZVwiOltcImNsa3BcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci50ZW1wbGF0ZVwiOltcImNsa3RcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFua1wiOltcImNsa3dcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3JpdGljYWx0b29scy53YnMreG1sXCI6W1wid2JzXCJdLFwiYXBwbGljYXRpb24vdm5kLmN0Yy1wb3NtbFwiOltcInBtbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBwZFwiOltcInBwZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhclwiOltcImNhclwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsXCI6W1wicGN1cmxcIl0sXCJhcHBsaWNhdGlvbi92bmQuZGFydFwiOltcImRhcnRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6XCI6W1wicmR6XCJdLFwiYXBwbGljYXRpb24vdm5kLmRlY2UuZGF0YVwiOltcInV2ZlwiLFwidXZ2ZlwiLFwidXZkXCIsXCJ1dnZkXCJdLFwiYXBwbGljYXRpb24vdm5kLmRlY2UudHRtbCt4bWxcIjpbXCJ1dnRcIixcInV2dnRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZGVjZS51bnNwZWNpZmllZFwiOltcInV2eFwiLFwidXZ2eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnppcFwiOltcInV2elwiLFwidXZ2elwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kZW5vdm8uZmNzZWxheW91dC1saW5rXCI6W1wiZmVfbGF1bmNoXCJdLFwiYXBwbGljYXRpb24vdm5kLmRuYVwiOltcImRuYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tbHBcIjpbXCJtbHBcIl0sXCJhcHBsaWNhdGlvbi92bmQuZHBncmFwaFwiOltcImRwZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5kcmVhbWZhY3RvcnlcIjpbXCJkZmFjXCJdLFwiYXBwbGljYXRpb24vdm5kLmRzLWtleXBvaW50XCI6W1wia3B4eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuYWl0XCI6W1wiYWl0XCJdLFwiYXBwbGljYXRpb24vdm5kLmR2Yi5zZXJ2aWNlXCI6W1wic3ZjXCJdLFwiYXBwbGljYXRpb24vdm5kLmR5bmFnZW9cIjpbXCJnZW9cIl0sXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0XCI6W1wibWFnXCJdLFwiYXBwbGljYXRpb24vdm5kLmVubGl2ZW5cIjpbXCJubWxcIl0sXCJhcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmXCI6W1wiZXNmXCJdLFwiYXBwbGljYXRpb24vdm5kLmVwc29uLm1zZlwiOltcIm1zZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lXCI6W1wicWFtXCJdLFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHRcIjpbXCJzbHRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZXBzb24uc3NmXCI6W1wic3NmXCJdLFwiYXBwbGljYXRpb24vdm5kLmVzemlnbm8zK3htbFwiOltcImVzM1wiLFwiZXQzXCJdLFwiYXBwbGljYXRpb24vdm5kLmV6cGl4LWFsYnVtXCI6W1wiZXoyXCJdLFwiYXBwbGljYXRpb24vdm5kLmV6cGl4LXBhY2thZ2VcIjpbXCJlejNcIl0sXCJhcHBsaWNhdGlvbi92bmQuZmRmXCI6W1wiZmRmXCJdLFwiYXBwbGljYXRpb24vdm5kLmZkc24ubXNlZWRcIjpbXCJtc2VlZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mZHNuLnNlZWRcIjpbXCJzZWVkXCIsXCJkYXRhbGVzc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0XCI6W1wiZ3BoXCJdLFwiYXBwbGljYXRpb24vdm5kLmZsdXh0aW1lLmNsaXBcIjpbXCJmdGNcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlclwiOltcImZtXCIsXCJmcmFtZVwiLFwibWFrZXJcIixcImJvb2tcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5mbmNcIjpbXCJmbmNcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5sdGZcIjpbXCJsdGZcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnNjLndlYmxhdW5jaFwiOltcImZzY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzXCI6W1wib2FzXCJdLFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMyXCI6W1wib2EyXCJdLFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMzXCI6W1wib2EzXCJdLFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNncFwiOltcImZnNVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzcHJzXCI6W1wiYmgyXCJdLFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kZGRcIjpbXCJkZGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrc1wiOltcInhkd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZG9jdXdvcmtzLmJpbmRlclwiOltcInhiZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdXp6eXNoZWV0XCI6W1wiZnpzXCJdLFwiYXBwbGljYXRpb24vdm5kLmdlbm9tYXRpeC50dXhlZG9cIjpbXCJ0eGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEuZmlsZVwiOltcImdnYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nZW9nZWJyYS50b29sXCI6W1wiZ2d0XCJdLFwiYXBwbGljYXRpb24vdm5kLmdlb21ldHJ5LWV4cGxvcmVyXCI6W1wiZ2V4XCIsXCJncmVcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ2VvbmV4dFwiOltcImd4dFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nZW9wbGFuXCI6W1wiZzJ3XCJdLFwiYXBwbGljYXRpb24vdm5kLmdlb3NwYWNlXCI6W1wiZzN3XCJdLFwiYXBwbGljYXRpb24vdm5kLmdteFwiOltcImdteFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5kb2N1bWVudFwiOltcImdkb2NcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWFwcHMucHJlc2VudGF0aW9uXCI6W1wiZ3NsaWRlc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5zcHJlYWRzaGVldFwiOltcImdzaGVldFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua21sK3htbFwiOltcImttbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216XCI6W1wia216XCJdLFwiYXBwbGljYXRpb24vdm5kLmdyYWZlcVwiOltcImdxZlwiLFwiZ3FzXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50XCI6W1wiZ2FjXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1oZWxwXCI6W1wiZ2hmXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1pZGVudGl0eS1tZXNzYWdlXCI6W1wiZ2ltXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvclwiOltcImdydlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC1tZXNzYWdlXCI6W1wiZ3RtXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLXRlbXBsYXRlXCI6W1widHBsXCJdLFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZFwiOltcInZjZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5oYWwreG1sXCI6W1wiaGFsXCJdLFwiYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sXCI6W1wiem1tXCJdLFwiYXBwbGljYXRpb24vdm5kLmhiY2lcIjpbXCJoYmNpXCJdLFwiYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyXCI6W1wibGVzXCJdLFwiYXBwbGljYXRpb24vdm5kLmhwLWhwZ2xcIjpbXCJocGdsXCJdLFwiYXBwbGljYXRpb24vdm5kLmhwLWhwaWRcIjpbXCJocGlkXCJdLFwiYXBwbGljYXRpb24vdm5kLmhwLWhwc1wiOltcImhwc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1qbHl0XCI6W1wiamx0XCJdLFwiYXBwbGljYXRpb24vdm5kLmhwLXBjbFwiOltcInBjbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2x4bFwiOltcInBjbHhsXCJdLFwiYXBwbGljYXRpb24vdm5kLmh5ZHJvc3RhdGl4LnNvZi1kYXRhXCI6W1wic2ZkLWhkc3R4XCJdLFwiYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5XCI6W1wibXB5XCJdLFwiYXBwbGljYXRpb24vdm5kLmlibS5tb2RjYXBcIjpbXCJhZnBcIixcImxpc3RhZnBcIixcImxpc3QzODIwXCJdLFwiYXBwbGljYXRpb24vdm5kLmlibS5yaWdodHMtbWFuYWdlbWVudFwiOltcImlybVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lclwiOltcInNjXCJdLFwiYXBwbGljYXRpb24vdm5kLmljY3Byb2ZpbGVcIjpbXCJpY2NcIixcImljbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlclwiOltcImlnbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnBcIjpbXCJpdnBcIl0sXCJhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZ1XCI6W1wiaXZ1XCJdLFwiYXBwbGljYXRpb24vdm5kLmluc29ycy5pZ21cIjpbXCJpZ21cIl0sXCJhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldFwiOltcInhwd1wiLFwieHB4XCJdLFwiYXBwbGljYXRpb24vdm5kLmludGVyZ2VvXCI6W1wiaTJnXCJdLFwiYXBwbGljYXRpb24vdm5kLmludHUucWJvXCI6W1wicWJvXCJdLFwiYXBwbGljYXRpb24vdm5kLmludHUucWZ4XCI6W1wicWZ4XCJdLFwiYXBwbGljYXRpb24vdm5kLmlwdW5wbHVnZ2VkLnJjcHJvZmlsZVwiOltcInJjcHJvZmlsZVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pcmVwb3NpdG9yeS5wYWNrYWdlK3htbFwiOltcImlycFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pcy14cHJcIjpbXCJ4cHJcIl0sXCJhcHBsaWNhdGlvbi92bmQuaXNhYy5mY3NcIjpbXCJmY3NcIl0sXCJhcHBsaWNhdGlvbi92bmQuamFtXCI6W1wiamFtXCJdLFwiYXBwbGljYXRpb24vdm5kLmpjcC5qYXZhbWUubWlkbGV0LXJtc1wiOltcInJtc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5qaXNwXCI6W1wiamlzcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmVcIjpbXCJqb2RhXCJdLFwiYXBwbGljYXRpb24vdm5kLmthaG9vdHpcIjpbXCJrdHpcIixcImt0clwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua2FyYm9uXCI6W1wia2FyYm9uXCJdLFwiYXBwbGljYXRpb24vdm5kLmtkZS5rY2hhcnRcIjpbXCJjaHJ0XCJdLFwiYXBwbGljYXRpb24vdm5kLmtkZS5rZm9ybXVsYVwiOltcImtmb1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua2l2aW9cIjpbXCJmbHdcIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXJcIjpbXCJrb25cIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtwcmVzZW50ZXJcIjpbXCJrcHJcIixcImtwdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua3NwcmVhZFwiOltcImtzcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua3dvcmRcIjpbXCJrd2RcIixcImt3dFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZW5hbWVhYXBwXCI6W1wiaHRrZVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5raWRzcGlyYXRpb25cIjpbXCJraWFcIl0sXCJhcHBsaWNhdGlvbi92bmQua2luYXJcIjpbXCJrbmVcIixcImtucFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rb2FuXCI6W1wic2twXCIsXCJza2RcIixcInNrdFwiLFwic2ttXCJdLFwiYXBwbGljYXRpb24vdm5kLmtvZGFrLWRlc2NyaXB0b3JcIjpbXCJzc2VcIl0sXCJhcHBsaWNhdGlvbi92bmQubGFzLmxhcyt4bWxcIjpbXCJsYXN4bWxcIl0sXCJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcFwiOltcImxiZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5leGNoYW5nZSt4bWxcIjpbXCJsYmVcIl0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtMS0yLTNcIjpbXCIxMjNcIl0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2hcIjpbXCJhcHJcIl0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtZnJlZWxhbmNlXCI6W1wicHJlXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLW5vdGVzXCI6W1wibnNmXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplclwiOltcIm9yZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1zY3JlZW5jYW1cIjpbXCJzY21cIl0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHByb1wiOltcImx3cFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tYWNwb3J0cy5wb3J0cGtnXCI6W1wicG9ydHBrZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5tY2RcIjpbXCJtY2RcIl0sXCJhcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGFcIjpbXCJtYzFcIl0sXCJhcHBsaWNhdGlvbi92bmQubWVkaWFzdGF0aW9uLmNka2V5XCI6W1wiY2RrZXlcIl0sXCJhcHBsaWNhdGlvbi92bmQubWZlclwiOltcIm13ZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tZm1wXCI6W1wibWZtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguZmxvXCI6W1wiZmxvXCJdLFwiYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguaWd4XCI6W1wiaWd4XCJdLFwiYXBwbGljYXRpb24vdm5kLm1pZlwiOltcIm1pZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmXCI6W1wiZGFmXCJdLFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXNcIjpbXCJkaXNcIl0sXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1ia1wiOltcIm1ia1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5XCI6W1wibXF5XCJdLFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tc2xcIjpbXCJtc2xcIl0sXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnBsY1wiOltcInBsY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmXCI6W1widHhmXCJdLFwiYXBwbGljYXRpb24vdm5kLm1vcGh1bi5hcHBsaWNhdGlvblwiOltcIm1wblwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGVcIjpbXCJtcGNcIl0sXCJhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sXCI6W1wieHVsXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWFydGdhbHJ5XCI6W1wiY2lsXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWNhYi1jb21wcmVzc2VkXCI6W1wiY2FiXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCI6W1wieGxzXCIsXCJ4bG1cIixcInhsYVwiLFwieGxjXCIsXCJ4bHRcIixcInhsd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb2VuYWJsZWQuMTJcIjpbXCJ4bGFtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTJcIjpbXCJ4bHNiXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMlwiOltcInhsc21cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyXCI6W1wieGx0bVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0XCI6W1wiZW90XCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWh0bWxoZWxwXCI6W1wiY2htXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWltc1wiOltcImltc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1scm1cIjpbXCJscm1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNldGhlbWVcIjpbXCJ0aG14XCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2tcIjpbXCJtc2dcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnNlY2NhdFwiOltcImNhdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsXCI6W1wic3RsXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnRcIjpbXCJwcHRcIixcInBwc1wiLFwicG90XCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuYWRkaW4ubWFjcm9lbmFibGVkLjEyXCI6W1wicHBhbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb2VuYWJsZWQuMTJcIjpbXCJwcHRtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGUubWFjcm9lbmFibGVkLjEyXCI6W1wic2xkbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlc2hvdy5tYWNyb2VuYWJsZWQuMTJcIjpbXCJwcHNtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyXCI6W1wicG90bVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0XCI6W1wibXBwXCIsXCJtcHRcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtd29yZC5kb2N1bWVudC5tYWNyb2VuYWJsZWQuMTJcIjpbXCJkb2NtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXdvcmQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyXCI6W1wiZG90bVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13b3Jrc1wiOltcIndwc1wiLFwid2tzXCIsXCJ3Y21cIixcIndkYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13cGxcIjpbXCJ3cGxcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMteHBzZG9jdW1lbnRcIjpbXCJ4cHNcIl0sXCJhcHBsaWNhdGlvbi92bmQubXNlcVwiOltcIm1zZXFcIl0sXCJhcHBsaWNhdGlvbi92bmQubXVzaWNpYW5cIjpbXCJtdXNcIl0sXCJhcHBsaWNhdGlvbi92bmQubXV2ZWUuc3R5bGVcIjpbXCJtc3R5XCJdLFwiYXBwbGljYXRpb24vdm5kLm15bmZjXCI6W1widGFnbGV0XCJdLFwiYXBwbGljYXRpb24vdm5kLm5ldXJvbGFuZ3VhZ2Uubmx1XCI6W1wibmx1XCJdLFwiYXBwbGljYXRpb24vdm5kLm5pdGZcIjpbXCJudGZcIixcIm5pdGZcIl0sXCJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtZGlyZWN0b3J5XCI6W1wibm5kXCJdLFwiYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlclwiOltcIm5uc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC13ZWJcIjpbXCJubndcIl0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmRhdGFcIjpbXCJuZ2RhdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2Uuc3ltYmlhbi5pbnN0YWxsXCI6W1wibi1nYWdlXCJdLFwiYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldFwiOltcInJwc3RcIl0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0c1wiOltcInJwc3NcIl0sXCJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtXCI6W1wiZWRtXCJdLFwiYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkeFwiOltcImVkeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5leHRcIjpbXCJleHRcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0XCI6W1wib2RjXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZVwiOltcIm90Y1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2VcIjpbXCJvZGJcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGFcIjpbXCJvZGZcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGVcIjpbXCJvZGZ0XCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljc1wiOltcIm9kZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGVcIjpbXCJvdGdcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlXCI6W1wib2RpXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZVwiOltcIm90aVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uXCI6W1wib2RwXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGVcIjpbXCJvdHBcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0XCI6W1wib2RzXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZVwiOltcIm90c1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dFwiOltcIm9kdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXJcIjpbXCJvZG1cIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGVcIjpbXCJvdHRcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViXCI6W1wib3RoXCJdLFwiYXBwbGljYXRpb24vdm5kLm9scGMtc3VnYXJcIjpbXCJ4b1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGQyK3htbFwiOltcImRkMlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVub2ZmaWNlb3JnLmV4dGVuc2lvblwiOltcIm94dFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb25cIjpbXCJwcHR4XCJdLFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlXCI6W1wic2xkeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3dcIjpbXCJwcHN4XCJdLFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlXCI6W1wicG90eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCI6W1wieGxzeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlXCI6W1wieGx0eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50XCI6W1wiZG9jeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlXCI6W1wiZG90eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dlby5tYXBndWlkZS5wYWNrYWdlXCI6W1wibWdwXCJdLFwiYXBwbGljYXRpb24vdm5kLm9zZ2kuZHBcIjpbXCJkcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dpLnN1YnN5c3RlbVwiOltcImVzYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5wYWxtXCI6W1wicGRiXCIsXCJwcWFcIixcIm9wcmNcIl0sXCJhcHBsaWNhdGlvbi92bmQucGF3YWFmaWxlXCI6W1wicGF3XCJdLFwiYXBwbGljYXRpb24vdm5kLnBnLmZvcm1hdFwiOltcInN0clwiXSxcImFwcGxpY2F0aW9uL3ZuZC5wZy5vc2FzbGlcIjpbXCJlaTZcIl0sXCJhcHBsaWNhdGlvbi92bmQucGljc2VsXCI6W1wiZWZpZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5wbWkud2lkZ2V0XCI6W1wid2dcIl0sXCJhcHBsaWNhdGlvbi92bmQucG9ja2V0bGVhcm5cIjpbXCJwbGZcIl0sXCJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNlwiOltcInBiZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5wcmV2aWV3c3lzdGVtcy5ib3hcIjpbXCJib3hcIl0sXCJhcHBsaWNhdGlvbi92bmQucHJvdGV1cy5tYWdhemluZVwiOltcIm1nelwiXSxcImFwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWVcIjpbXCJxcHNcIl0sXCJhcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxXCI6W1wicHRpZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzc1wiOltcInF4ZFwiLFwicXh0XCIsXCJxd2RcIixcInF3dFwiLFwicXhsXCIsXCJxeGJcIl0sXCJhcHBsaWNhdGlvbi92bmQucmVhbHZuYy5iZWRcIjpbXCJiZWRcIl0sXCJhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sXCI6W1wibXhsXCJdLFwiYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCt4bWxcIjpbXCJtdXNpY3htbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5yaWcuY3J5cHRvbm90ZVwiOltcImNyeXB0b25vdGVcIl0sXCJhcHBsaWNhdGlvbi92bmQucmltLmNvZFwiOltcImNvZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ybi1yZWFsbWVkaWFcIjpbXCJybVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ybi1yZWFsbWVkaWEtdmJyXCI6W1wicm12YlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWxcIjpbXCJsaW5rNjZcIl0sXCJhcHBsaWNhdGlvbi92bmQuc2FpbGluZ3RyYWNrZXIudHJhY2tcIjpbXCJzdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsXCI6W1wic2VlXCJdLFwiYXBwbGljYXRpb24vdm5kLnNlbWFcIjpbXCJzZW1hXCJdLFwiYXBwbGljYXRpb24vdm5kLnNlbWRcIjpbXCJzZW1kXCJdLFwiYXBwbGljYXRpb24vdm5kLnNlbWZcIjpbXCJzZW1mXCJdLFwiYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm1kYXRhXCI6W1wiaWZtXCJdLFwiYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZVwiOltcIml0cFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZVwiOltcImlpZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5wYWNrYWdlXCI6W1wiaXBrXCJdLFwiYXBwbGljYXRpb24vdm5kLnNpbXRlY2gtbWluZG1hcHBlclwiOltcInR3ZFwiLFwidHdkc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zbWFmXCI6W1wibW1mXCJdLFwiYXBwbGljYXRpb24vdm5kLnNtYXJ0LnRlYWNoZXJcIjpbXCJ0ZWFjaGVyXCJdLFwiYXBwbGljYXRpb24vdm5kLnNvbGVudC5zZGttK3htbFwiOltcInNka21cIixcInNka2RcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwXCI6W1wiZHhwXCJdLFwiYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLnNmc1wiOltcInNmc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uY2FsY1wiOltcInNkY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhd1wiOltcInNkYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzc1wiOltcInNkZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aFwiOltcInNtZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyXCI6W1wic2R3XCIsXCJ2b3JcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlci1nbG9iYWxcIjpbXCJzZ2xcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RlcG1hbmlhLnBhY2thZ2VcIjpbXCJzbXppcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdGVwbWFuaWEuc3RlcGNoYXJ0XCI6W1wic21cIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sXCI6W1wid2FkbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGNcIjpbXCJzeGNcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlXCI6W1wic3RjXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhd1wiOltcInN4ZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGVcIjpbXCJzdGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzXCI6W1wic3hpXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZVwiOltcInN0aVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGhcIjpbXCJzeG1cIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXJcIjpbXCJzeHdcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsXCI6W1wic3hnXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLnRlbXBsYXRlXCI6W1wic3R3XCJdLFwiYXBwbGljYXRpb24vdm5kLnN1cy1jYWxlbmRhclwiOltcInN1c1wiLFwic3VzcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdmRcIjpbXCJzdmRcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsXCI6W1wic2lzXCIsXCJzaXN4XCJdLFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWxcIjpbXCJ4c21cIl0sXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sXCI6W1wiYmRtXCJdLFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWxcIjpbXCJ4ZG1cIl0sXCJhcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZVwiOltcInRhb1wiXSxcImFwcGxpY2F0aW9uL3ZuZC50Y3BkdW1wLnBjYXBcIjpbXCJwY2FwXCIsXCJjYXBcIixcImRtcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0dlwiOltcInRtb1wiXSxcImFwcGxpY2F0aW9uL3ZuZC50cmlkLnRwdFwiOltcInRwdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC50cmlzY2FwZS5teHNcIjpbXCJteHNcIl0sXCJhcHBsaWNhdGlvbi92bmQudHJ1ZWFwcFwiOltcInRyYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC51ZmRsXCI6W1widWZkXCIsXCJ1ZmRsXCJdLFwiYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZVwiOltcInV0elwiXSxcImFwcGxpY2F0aW9uL3ZuZC51bWFqaW5cIjpbXCJ1bWpcIl0sXCJhcHBsaWNhdGlvbi92bmQudW5pdHlcIjpbXCJ1bml0eXdlYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbFwiOltcInVvbWxcIl0sXCJhcHBsaWNhdGlvbi92bmQudmN4XCI6W1widmN4XCJdLFwiYXBwbGljYXRpb24vdm5kLnZpc2lvXCI6W1widnNkXCIsXCJ2c3RcIixcInZzc1wiLFwidnN3XCJdLFwiYXBwbGljYXRpb24vdm5kLnZpc2lvbmFyeVwiOltcInZpc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC52c2ZcIjpbXCJ2c2ZcIl0sXCJhcHBsaWNhdGlvbi92bmQud2FwLndieG1sXCI6W1wid2J4bWxcIl0sXCJhcHBsaWNhdGlvbi92bmQud2FwLndtbGNcIjpbXCJ3bWxjXCJdLFwiYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjXCI6W1wid21sc2NcIl0sXCJhcHBsaWNhdGlvbi92bmQud2VidHVyYm9cIjpbXCJ3dGJcIl0sXCJhcHBsaWNhdGlvbi92bmQud29sZnJhbS5wbGF5ZXJcIjpbXCJuYnBcIl0sXCJhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3RcIjpbXCJ3cGRcIl0sXCJhcHBsaWNhdGlvbi92bmQud3FkXCI6W1wid3FkXCJdLFwiYXBwbGljYXRpb24vdm5kLnd0LnN0ZlwiOltcInN0ZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC54YXJhXCI6W1wieGFyXCJdLFwiYXBwbGljYXRpb24vdm5kLnhmZGxcIjpbXCJ4ZmRsXCJdLFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWNcIjpbXCJodmRcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXNjcmlwdFwiOltcImh2c1wiXSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2VcIjpbXCJodnBcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdFwiOltcIm9zZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWxcIjpbXCJvc2ZwdmdcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW9cIjpbXCJzYWZcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlXCI6W1wic3BmXCJdLFwiYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51XCI6W1wiY21wXCJdLFwiYXBwbGljYXRpb24vdm5kLnp1bFwiOltcInppclwiLFwiemlyelwiXSxcImFwcGxpY2F0aW9uL3ZuZC56emF6ei5kZWNrK3htbFwiOltcInphelwiXSxcImFwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZFwiOltcIjd6XCJdLFwiYXBwbGljYXRpb24veC1hYml3b3JkXCI6W1wiYWJ3XCJdLFwiYXBwbGljYXRpb24veC1hY2UtY29tcHJlc3NlZFwiOltcImFjZVwiXSxcImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlXCI6W10sXCJhcHBsaWNhdGlvbi94LWFyalwiOltcImFyalwiXSxcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1iaW5cIjpbXCJhYWJcIixcIngzMlwiLFwidTMyXCIsXCJ2b3hcIl0sXCJhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtbWFwXCI6W1wiYWFtXCJdLFwiYXBwbGljYXRpb24veC1hdXRob3J3YXJlLXNlZ1wiOltcImFhc1wiXSxcImFwcGxpY2F0aW9uL3gtYmNwaW9cIjpbXCJiY3Bpb1wiXSxcImFwcGxpY2F0aW9uL3gtYmRvY1wiOltdLFwiYXBwbGljYXRpb24veC1iaXR0b3JyZW50XCI6W1widG9ycmVudFwiXSxcImFwcGxpY2F0aW9uL3gtYmxvcmJcIjpbXCJibGJcIixcImJsb3JiXCJdLFwiYXBwbGljYXRpb24veC1iemlwXCI6W1wiYnpcIl0sXCJhcHBsaWNhdGlvbi94LWJ6aXAyXCI6W1wiYnoyXCIsXCJib3pcIl0sXCJhcHBsaWNhdGlvbi94LWNiclwiOltcImNiclwiLFwiY2JhXCIsXCJjYnRcIixcImNielwiLFwiY2I3XCJdLFwiYXBwbGljYXRpb24veC1jZGxpbmtcIjpbXCJ2Y2RcIl0sXCJhcHBsaWNhdGlvbi94LWNmcy1jb21wcmVzc2VkXCI6W1wiY2ZzXCJdLFwiYXBwbGljYXRpb24veC1jaGF0XCI6W1wiY2hhdFwiXSxcImFwcGxpY2F0aW9uL3gtY2hlc3MtcGduXCI6W1wicGduXCJdLFwiYXBwbGljYXRpb24veC1jaHJvbWUtZXh0ZW5zaW9uXCI6W1wiY3J4XCJdLFwiYXBwbGljYXRpb24veC1jb2NvYVwiOltcImNjb1wiXSxcImFwcGxpY2F0aW9uL3gtY29uZmVyZW5jZVwiOltcIm5zY1wiXSxcImFwcGxpY2F0aW9uL3gtY3Bpb1wiOltcImNwaW9cIl0sXCJhcHBsaWNhdGlvbi94LWNzaFwiOltcImNzaFwiXSxcImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2VcIjpbXCJ1ZGViXCJdLFwiYXBwbGljYXRpb24veC1kZ2MtY29tcHJlc3NlZFwiOltcImRnY1wiXSxcImFwcGxpY2F0aW9uL3gtZGlyZWN0b3JcIjpbXCJkaXJcIixcImRjclwiLFwiZHhyXCIsXCJjc3RcIixcImNjdFwiLFwiY3h0XCIsXCJ3M2RcIixcImZnZFwiLFwic3dhXCJdLFwiYXBwbGljYXRpb24veC1kb29tXCI6W1wid2FkXCJdLFwiYXBwbGljYXRpb24veC1kdGJuY3greG1sXCI6W1wibmN4XCJdLFwiYXBwbGljYXRpb24veC1kdGJvb2sreG1sXCI6W1wiZHRiXCJdLFwiYXBwbGljYXRpb24veC1kdGJyZXNvdXJjZSt4bWxcIjpbXCJyZXNcIl0sXCJhcHBsaWNhdGlvbi94LWR2aVwiOltcImR2aVwiXSxcImFwcGxpY2F0aW9uL3gtZW52b3lcIjpbXCJldnlcIl0sXCJhcHBsaWNhdGlvbi94LWV2YVwiOltcImV2YVwiXSxcImFwcGxpY2F0aW9uL3gtZm9udC1iZGZcIjpbXCJiZGZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHRcIjpbXCJnc2ZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtbGludXgtcHNmXCI6W1wicHNmXCJdLFwiYXBwbGljYXRpb24veC1mb250LW90ZlwiOltdLFwiYXBwbGljYXRpb24veC1mb250LXBjZlwiOltcInBjZlwiXSxcImFwcGxpY2F0aW9uL3gtZm9udC1zbmZcIjpbXCJzbmZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtdHRmXCI6W1widHRmXCIsXCJ0dGNcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtdHlwZTFcIjpbXCJwZmFcIixcInBmYlwiLFwicGZtXCIsXCJhZm1cIl0sXCJhcHBsaWNhdGlvbi94LWZyZWVhcmNcIjpbXCJhcmNcIl0sXCJhcHBsaWNhdGlvbi94LWZ1dHVyZXNwbGFzaFwiOltcInNwbFwiXSxcImFwcGxpY2F0aW9uL3gtZ2NhLWNvbXByZXNzZWRcIjpbXCJnY2FcIl0sXCJhcHBsaWNhdGlvbi94LWdsdWx4XCI6W1widWx4XCJdLFwiYXBwbGljYXRpb24veC1nbnVtZXJpY1wiOltcImdudW1lcmljXCJdLFwiYXBwbGljYXRpb24veC1ncmFtcHMteG1sXCI6W1wiZ3JhbXBzXCJdLFwiYXBwbGljYXRpb24veC1ndGFyXCI6W1wiZ3RhclwiXSxcImFwcGxpY2F0aW9uL3gtaGRmXCI6W1wiaGRmXCJdLFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIjpbXCJwaHBcIl0sXCJhcHBsaWNhdGlvbi94LWluc3RhbGwtaW5zdHJ1Y3Rpb25zXCI6W1wiaW5zdGFsbFwiXSxcImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZVwiOltdLFwiYXBwbGljYXRpb24veC1qYXZhLWFyY2hpdmUtZGlmZlwiOltcImphcmRpZmZcIl0sXCJhcHBsaWNhdGlvbi94LWphdmEtam5scC1maWxlXCI6W1wiam5scFwiXSxcImFwcGxpY2F0aW9uL3gtbGF0ZXhcIjpbXCJsYXRleFwiXSxcImFwcGxpY2F0aW9uL3gtbHVhLWJ5dGVjb2RlXCI6W1wibHVhY1wiXSxcImFwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWRcIjpbXCJsemhcIixcImxoYVwiXSxcImFwcGxpY2F0aW9uL3gtbWFrZXNlbGZcIjpbXCJydW5cIl0sXCJhcHBsaWNhdGlvbi94LW1pZVwiOltcIm1pZVwiXSxcImFwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9va1wiOltcInByY1wiLFwibW9iaVwiXSxcImFwcGxpY2F0aW9uL3gtbXMtYXBwbGljYXRpb25cIjpbXCJhcHBsaWNhdGlvblwiXSxcImFwcGxpY2F0aW9uL3gtbXMtc2hvcnRjdXRcIjpbXCJsbmtcIl0sXCJhcHBsaWNhdGlvbi94LW1zLXdtZFwiOltcIndtZFwiXSxcImFwcGxpY2F0aW9uL3gtbXMtd216XCI6W1wid216XCJdLFwiYXBwbGljYXRpb24veC1tcy14YmFwXCI6W1wieGJhcFwiXSxcImFwcGxpY2F0aW9uL3gtbXNhY2Nlc3NcIjpbXCJtZGJcIl0sXCJhcHBsaWNhdGlvbi94LW1zYmluZGVyXCI6W1wib2JkXCJdLFwiYXBwbGljYXRpb24veC1tc2NhcmRmaWxlXCI6W1wiY3JkXCJdLFwiYXBwbGljYXRpb24veC1tc2NsaXBcIjpbXCJjbHBcIl0sXCJhcHBsaWNhdGlvbi94LW1zZG9zLXByb2dyYW1cIjpbXSxcImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZFwiOltcImNvbVwiLFwiYmF0XCJdLFwiYXBwbGljYXRpb24veC1tc21lZGlhdmlld1wiOltcIm12YlwiLFwibTEzXCIsXCJtMTRcIl0sXCJhcHBsaWNhdGlvbi94LW1zbWV0YWZpbGVcIjpbXCJ3bWZcIixcImVtZlwiLFwiZW16XCJdLFwiYXBwbGljYXRpb24veC1tc21vbmV5XCI6W1wibW55XCJdLFwiYXBwbGljYXRpb24veC1tc3B1Ymxpc2hlclwiOltcInB1YlwiXSxcImFwcGxpY2F0aW9uL3gtbXNzY2hlZHVsZVwiOltcInNjZFwiXSxcImFwcGxpY2F0aW9uL3gtbXN0ZXJtaW5hbFwiOltcInRybVwiXSxcImFwcGxpY2F0aW9uL3gtbXN3cml0ZVwiOltcIndyaVwiXSxcImFwcGxpY2F0aW9uL3gtbmV0Y2RmXCI6W1wibmNcIixcImNkZlwiXSxcImFwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZ1wiOltcInBhY1wiXSxcImFwcGxpY2F0aW9uL3gtbnpiXCI6W1wibnpiXCJdLFwiYXBwbGljYXRpb24veC1wZXJsXCI6W1wicGxcIixcInBtXCJdLFwiYXBwbGljYXRpb24veC1waWxvdFwiOltdLFwiYXBwbGljYXRpb24veC1wa2NzMTJcIjpbXCJwMTJcIixcInBmeFwiXSxcImFwcGxpY2F0aW9uL3gtcGtjczctY2VydGlmaWNhdGVzXCI6W1wicDdiXCIsXCJzcGNcIl0sXCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwXCI6W1wicDdyXCJdLFwiYXBwbGljYXRpb24veC1yYXItY29tcHJlc3NlZFwiOltcInJhclwiXSxcImFwcGxpY2F0aW9uL3gtcmVkaGF0LXBhY2thZ2UtbWFuYWdlclwiOltcInJwbVwiXSxcImFwcGxpY2F0aW9uL3gtcmVzZWFyY2gtaW5mby1zeXN0ZW1zXCI6W1wicmlzXCJdLFwiYXBwbGljYXRpb24veC1zZWFcIjpbXCJzZWFcIl0sXCJhcHBsaWNhdGlvbi94LXNoXCI6W1wic2hcIl0sXCJhcHBsaWNhdGlvbi94LXNoYXJcIjpbXCJzaGFyXCJdLFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIjpbXCJzd2ZcIl0sXCJhcHBsaWNhdGlvbi94LXNpbHZlcmxpZ2h0LWFwcFwiOltcInhhcFwiXSxcImFwcGxpY2F0aW9uL3gtc3FsXCI6W1wic3FsXCJdLFwiYXBwbGljYXRpb24veC1zdHVmZml0XCI6W1wic2l0XCJdLFwiYXBwbGljYXRpb24veC1zdHVmZml0eFwiOltcInNpdHhcIl0sXCJhcHBsaWNhdGlvbi94LXN1YnJpcFwiOltcInNydFwiXSxcImFwcGxpY2F0aW9uL3gtc3Y0Y3Bpb1wiOltcInN2NGNwaW9cIl0sXCJhcHBsaWNhdGlvbi94LXN2NGNyY1wiOltcInN2NGNyY1wiXSxcImFwcGxpY2F0aW9uL3gtdDN2bS1pbWFnZVwiOltcInQzXCJdLFwiYXBwbGljYXRpb24veC10YWRzXCI6W1wiZ2FtXCJdLFwiYXBwbGljYXRpb24veC10YXJcIjpbXCJ0YXJcIl0sXCJhcHBsaWNhdGlvbi94LXRjbFwiOltcInRjbFwiLFwidGtcIl0sXCJhcHBsaWNhdGlvbi94LXRleFwiOltcInRleFwiXSxcImFwcGxpY2F0aW9uL3gtdGV4LXRmbVwiOltcInRmbVwiXSxcImFwcGxpY2F0aW9uL3gtdGV4aW5mb1wiOltcInRleGluZm9cIixcInRleGlcIl0sXCJhcHBsaWNhdGlvbi94LXRnaWZcIjpbXCJvYmpcIl0sXCJhcHBsaWNhdGlvbi94LXVzdGFyXCI6W1widXN0YXJcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtaGRkXCI6W1wiaGRkXCJdLFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LW92YVwiOltcIm92YVwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC1vdmZcIjpbXCJvdmZcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtdmJveFwiOltcInZib3hcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtdmJveC1leHRwYWNrXCI6W1widmJveC1leHRwYWNrXCJdLFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LXZkaVwiOltcInZkaVwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC12aGRcIjpbXCJ2aGRcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtdm1ka1wiOltcInZtZGtcIl0sXCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlXCI6W1wic3JjXCJdLFwiYXBwbGljYXRpb24veC13ZWItYXBwLW1hbmlmZXN0K2pzb25cIjpbXCJ3ZWJhcHBcIl0sXCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydFwiOltcImRlclwiLFwiY3J0XCIsXCJwZW1cIl0sXCJhcHBsaWNhdGlvbi94LXhmaWdcIjpbXCJmaWdcIl0sXCJhcHBsaWNhdGlvbi94LXhsaWZmK3htbFwiOltcInhsZlwiXSxcImFwcGxpY2F0aW9uL3gteHBpbnN0YWxsXCI6W1wieHBpXCJdLFwiYXBwbGljYXRpb24veC14elwiOltcInh6XCJdLFwiYXBwbGljYXRpb24veC16bWFjaGluZVwiOltcInoxXCIsXCJ6MlwiLFwiejNcIixcIno0XCIsXCJ6NVwiLFwiejZcIixcIno3XCIsXCJ6OFwiXSxcImF1ZGlvL3ZuZC5kZWNlLmF1ZGlvXCI6W1widXZhXCIsXCJ1dnZhXCJdLFwiYXVkaW8vdm5kLmRpZ2l0YWwtd2luZHNcIjpbXCJlb2xcIl0sXCJhdWRpby92bmQuZHJhXCI6W1wiZHJhXCJdLFwiYXVkaW8vdm5kLmR0c1wiOltcImR0c1wiXSxcImF1ZGlvL3ZuZC5kdHMuaGRcIjpbXCJkdHNoZFwiXSxcImF1ZGlvL3ZuZC5sdWNlbnQudm9pY2VcIjpbXCJsdnBcIl0sXCJhdWRpby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5YVwiOltcInB5YVwiXSxcImF1ZGlvL3ZuZC5udWVyYS5lY2VscDQ4MDBcIjpbXCJlY2VscDQ4MDBcIl0sXCJhdWRpby92bmQubnVlcmEuZWNlbHA3NDcwXCI6W1wiZWNlbHA3NDcwXCJdLFwiYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMFwiOltcImVjZWxwOTYwMFwiXSxcImF1ZGlvL3ZuZC5yaXBcIjpbXCJyaXBcIl0sXCJhdWRpby94LWFhY1wiOltcImFhY1wiXSxcImF1ZGlvL3gtYWlmZlwiOltcImFpZlwiLFwiYWlmZlwiLFwiYWlmY1wiXSxcImF1ZGlvL3gtY2FmXCI6W1wiY2FmXCJdLFwiYXVkaW8veC1mbGFjXCI6W1wiZmxhY1wiXSxcImF1ZGlvL3gtbTRhXCI6W10sXCJhdWRpby94LW1hdHJvc2thXCI6W1wibWthXCJdLFwiYXVkaW8veC1tcGVndXJsXCI6W1wibTN1XCJdLFwiYXVkaW8veC1tcy13YXhcIjpbXCJ3YXhcIl0sXCJhdWRpby94LW1zLXdtYVwiOltcIndtYVwiXSxcImF1ZGlvL3gtcG4tcmVhbGF1ZGlvXCI6W1wicmFtXCIsXCJyYVwiXSxcImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpblwiOltcInJtcFwiXSxcImF1ZGlvL3gtcmVhbGF1ZGlvXCI6W10sXCJhdWRpby94LXdhdlwiOltdLFwiY2hlbWljYWwveC1jZHhcIjpbXCJjZHhcIl0sXCJjaGVtaWNhbC94LWNpZlwiOltcImNpZlwiXSxcImNoZW1pY2FsL3gtY21kZlwiOltcImNtZGZcIl0sXCJjaGVtaWNhbC94LWNtbFwiOltcImNtbFwiXSxcImNoZW1pY2FsL3gtY3NtbFwiOltcImNzbWxcIl0sXCJjaGVtaWNhbC94LXh5elwiOltcInh5elwiXSxcImltYWdlL3Bycy5idGlmXCI6W1wiYnRpZlwiXSxcImltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3BcIjpbXCJwc2RcIl0sXCJpbWFnZS92bmQuZGVjZS5ncmFwaGljXCI6W1widXZpXCIsXCJ1dnZpXCIsXCJ1dmdcIixcInV2dmdcIl0sXCJpbWFnZS92bmQuZGp2dVwiOltcImRqdnVcIixcImRqdlwiXSxcImltYWdlL3ZuZC5kdmIuc3VidGl0bGVcIjpbXSxcImltYWdlL3ZuZC5kd2dcIjpbXCJkd2dcIl0sXCJpbWFnZS92bmQuZHhmXCI6W1wiZHhmXCJdLFwiaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldFwiOltcImZic1wiXSxcImltYWdlL3ZuZC5mcHhcIjpbXCJmcHhcIl0sXCJpbWFnZS92bmQuZnN0XCI6W1wiZnN0XCJdLFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yXCI6W1wibW1yXCJdLFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjXCI6W1wicmxjXCJdLFwiaW1hZ2Uvdm5kLm1zLW1vZGlcIjpbXCJtZGlcIl0sXCJpbWFnZS92bmQubXMtcGhvdG9cIjpbXCJ3ZHBcIl0sXCJpbWFnZS92bmQubmV0LWZweFwiOltcIm5weFwiXSxcImltYWdlL3ZuZC53YXAud2JtcFwiOltcIndibXBcIl0sXCJpbWFnZS92bmQueGlmZlwiOltcInhpZlwiXSxcImltYWdlL3gtM2RzXCI6W1wiM2RzXCJdLFwiaW1hZ2UveC1jbXUtcmFzdGVyXCI6W1wicmFzXCJdLFwiaW1hZ2UveC1jbXhcIjpbXCJjbXhcIl0sXCJpbWFnZS94LWZyZWVoYW5kXCI6W1wiZmhcIixcImZoY1wiLFwiZmg0XCIsXCJmaDVcIixcImZoN1wiXSxcImltYWdlL3gtaWNvblwiOltcImljb1wiXSxcImltYWdlL3gtam5nXCI6W1wiam5nXCJdLFwiaW1hZ2UveC1tcnNpZC1pbWFnZVwiOltcInNpZFwiXSxcImltYWdlL3gtbXMtYm1wXCI6W10sXCJpbWFnZS94LXBjeFwiOltcInBjeFwiXSxcImltYWdlL3gtcGljdFwiOltcInBpY1wiLFwicGN0XCJdLFwiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXBcIjpbXCJwbm1cIl0sXCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcFwiOltcInBibVwiXSxcImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcFwiOltcInBnbVwiXSxcImltYWdlL3gtcG9ydGFibGUtcGl4bWFwXCI6W1wicHBtXCJdLFwiaW1hZ2UveC1yZ2JcIjpbXCJyZ2JcIl0sXCJpbWFnZS94LXRnYVwiOltcInRnYVwiXSxcImltYWdlL3gteGJpdG1hcFwiOltcInhibVwiXSxcImltYWdlL3gteHBpeG1hcFwiOltcInhwbVwiXSxcImltYWdlL3gteHdpbmRvd2R1bXBcIjpbXCJ4d2RcIl0sXCJtb2RlbC92bmQuY29sbGFkYSt4bWxcIjpbXCJkYWVcIl0sXCJtb2RlbC92bmQuZHdmXCI6W1wiZHdmXCJdLFwibW9kZWwvdm5kLmdkbFwiOltcImdkbFwiXSxcIm1vZGVsL3ZuZC5ndHdcIjpbXCJndHdcIl0sXCJtb2RlbC92bmQubXRzXCI6W1wibXRzXCJdLFwibW9kZWwvdm5kLnZ0dVwiOltcInZ0dVwiXSxcInRleHQvcHJzLmxpbmVzLnRhZ1wiOltcImRzY1wiXSxcInRleHQvdm5kLmN1cmxcIjpbXCJjdXJsXCJdLFwidGV4dC92bmQuY3VybC5kY3VybFwiOltcImRjdXJsXCJdLFwidGV4dC92bmQuY3VybC5tY3VybFwiOltcIm1jdXJsXCJdLFwidGV4dC92bmQuY3VybC5zY3VybFwiOltcInNjdXJsXCJdLFwidGV4dC92bmQuZHZiLnN1YnRpdGxlXCI6W1wic3ViXCJdLFwidGV4dC92bmQuZmx5XCI6W1wiZmx5XCJdLFwidGV4dC92bmQuZm1pLmZsZXhzdG9yXCI6W1wiZmx4XCJdLFwidGV4dC92bmQuZ3JhcGh2aXpcIjpbXCJndlwiXSxcInRleHQvdm5kLmluM2QuM2RtbFwiOltcIjNkbWxcIl0sXCJ0ZXh0L3ZuZC5pbjNkLnNwb3RcIjpbXCJzcG90XCJdLFwidGV4dC92bmQuc3VuLmoybWUuYXBwLWRlc2NyaXB0b3JcIjpbXCJqYWRcIl0sXCJ0ZXh0L3ZuZC53YXAud21sXCI6W1wid21sXCJdLFwidGV4dC92bmQud2FwLndtbHNjcmlwdFwiOltcIndtbHNcIl0sXCJ0ZXh0L3gtYXNtXCI6W1wic1wiLFwiYXNtXCJdLFwidGV4dC94LWNcIjpbXCJjXCIsXCJjY1wiLFwiY3h4XCIsXCJjcHBcIixcImhcIixcImhoXCIsXCJkaWNcIl0sXCJ0ZXh0L3gtY29tcG9uZW50XCI6W1wiaHRjXCJdLFwidGV4dC94LWZvcnRyYW5cIjpbXCJmXCIsXCJmb3JcIixcImY3N1wiLFwiZjkwXCJdLFwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIjpbXCJoYnNcIl0sXCJ0ZXh0L3gtamF2YS1zb3VyY2VcIjpbXCJqYXZhXCJdLFwidGV4dC94LWx1YVwiOltcImx1YVwiXSxcInRleHQveC1tYXJrZG93blwiOltcIm1rZFwiXSxcInRleHQveC1uZm9cIjpbXCJuZm9cIl0sXCJ0ZXh0L3gtb3BtbFwiOltcIm9wbWxcIl0sXCJ0ZXh0L3gtb3JnXCI6W10sXCJ0ZXh0L3gtcGFzY2FsXCI6W1wicFwiLFwicGFzXCJdLFwidGV4dC94LXByb2Nlc3NpbmdcIjpbXCJwZGVcIl0sXCJ0ZXh0L3gtc2Fzc1wiOltcInNhc3NcIl0sXCJ0ZXh0L3gtc2Nzc1wiOltcInNjc3NcIl0sXCJ0ZXh0L3gtc2V0ZXh0XCI6W1wiZXR4XCJdLFwidGV4dC94LXNmdlwiOltcInNmdlwiXSxcInRleHQveC1zdXNlLXltcFwiOltcInltcFwiXSxcInRleHQveC11dWVuY29kZVwiOltcInV1XCJdLFwidGV4dC94LXZjYWxlbmRhclwiOltcInZjc1wiXSxcInRleHQveC12Y2FyZFwiOltcInZjZlwiXSxcInZpZGVvL3ZuZC5kZWNlLmhkXCI6W1widXZoXCIsXCJ1dnZoXCJdLFwidmlkZW8vdm5kLmRlY2UubW9iaWxlXCI6W1widXZtXCIsXCJ1dnZtXCJdLFwidmlkZW8vdm5kLmRlY2UucGRcIjpbXCJ1dnBcIixcInV2dnBcIl0sXCJ2aWRlby92bmQuZGVjZS5zZFwiOltcInV2c1wiLFwidXZ2c1wiXSxcInZpZGVvL3ZuZC5kZWNlLnZpZGVvXCI6W1widXZ2XCIsXCJ1dnZ2XCJdLFwidmlkZW8vdm5kLmR2Yi5maWxlXCI6W1wiZHZiXCJdLFwidmlkZW8vdm5kLmZ2dFwiOltcImZ2dFwiXSxcInZpZGVvL3ZuZC5tcGVndXJsXCI6W1wibXh1XCIsXCJtNHVcIl0sXCJ2aWRlby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5dlwiOltcInB5dlwiXSxcInZpZGVvL3ZuZC51dnZ1Lm1wNFwiOltcInV2dVwiLFwidXZ2dVwiXSxcInZpZGVvL3ZuZC52aXZvXCI6W1widml2XCJdLFwidmlkZW8veC1mNHZcIjpbXCJmNHZcIl0sXCJ2aWRlby94LWZsaVwiOltcImZsaVwiXSxcInZpZGVvL3gtZmx2XCI6W1wiZmx2XCJdLFwidmlkZW8veC1tNHZcIjpbXCJtNHZcIl0sXCJ2aWRlby94LW1hdHJvc2thXCI6W1wibWt2XCIsXCJtazNkXCIsXCJta3NcIl0sXCJ2aWRlby94LW1uZ1wiOltcIm1uZ1wiXSxcInZpZGVvL3gtbXMtYXNmXCI6W1wiYXNmXCIsXCJhc3hcIl0sXCJ2aWRlby94LW1zLXZvYlwiOltcInZvYlwiXSxcInZpZGVvL3gtbXMtd21cIjpbXCJ3bVwiXSxcInZpZGVvL3gtbXMtd212XCI6W1wid212XCJdLFwidmlkZW8veC1tcy13bXhcIjpbXCJ3bXhcIl0sXCJ2aWRlby94LW1zLXd2eFwiOltcInd2eFwiXSxcInZpZGVvL3gtbXN2aWRlb1wiOltcImF2aVwiXSxcInZpZGVvL3gtc2dpLW1vdmllXCI6W1wibW92aWVcIl0sXCJ2aWRlby94LXNtdlwiOltcInNtdlwiXSxcIngtY29uZmVyZW5jZS94LWNvb2x0YWxrXCI6W1wiaWNlXCJdfVxufSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4gIG1vZHVsZS5leHBvcnRzPXtcImFwcGxpY2F0aW9uL2FuZHJldy1pbnNldFwiOltcImV6XCJdLFwiYXBwbGljYXRpb24vYXBwbGl4d2FyZVwiOltcImF3XCJdLFwiYXBwbGljYXRpb24vYXRvbSt4bWxcIjpbXCJhdG9tXCJdLFwiYXBwbGljYXRpb24vYXRvbWNhdCt4bWxcIjpbXCJhdG9tY2F0XCJdLFwiYXBwbGljYXRpb24vYXRvbXN2Yyt4bWxcIjpbXCJhdG9tc3ZjXCJdLFwiYXBwbGljYXRpb24vYmRvY1wiOltcImJkb2NcIl0sXCJhcHBsaWNhdGlvbi9jY3htbCt4bWxcIjpbXCJjY3htbFwiXSxcImFwcGxpY2F0aW9uL2NkbWktY2FwYWJpbGl0eVwiOltcImNkbWlhXCJdLFwiYXBwbGljYXRpb24vY2RtaS1jb250YWluZXJcIjpbXCJjZG1pY1wiXSxcImFwcGxpY2F0aW9uL2NkbWktZG9tYWluXCI6W1wiY2RtaWRcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLW9iamVjdFwiOltcImNkbWlvXCJdLFwiYXBwbGljYXRpb24vY2RtaS1xdWV1ZVwiOltcImNkbWlxXCJdLFwiYXBwbGljYXRpb24vY3Utc2VlbWVcIjpbXCJjdVwiXSxcImFwcGxpY2F0aW9uL2Rhc2greG1sXCI6W1wibXBkXCJdLFwiYXBwbGljYXRpb24vZGF2bW91bnQreG1sXCI6W1wiZGF2bW91bnRcIl0sXCJhcHBsaWNhdGlvbi9kb2Nib29rK3htbFwiOltcImRia1wiXSxcImFwcGxpY2F0aW9uL2Rzc2MrZGVyXCI6W1wiZHNzY1wiXSxcImFwcGxpY2F0aW9uL2Rzc2MreG1sXCI6W1wieGRzc2NcIl0sXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCI6W1wiZWNtYVwiXSxcImFwcGxpY2F0aW9uL2VtbWEreG1sXCI6W1wiZW1tYVwiXSxcImFwcGxpY2F0aW9uL2VwdWIremlwXCI6W1wiZXB1YlwiXSxcImFwcGxpY2F0aW9uL2V4aVwiOltcImV4aVwiXSxcImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnJcIjpbXCJwZnJcIl0sXCJhcHBsaWNhdGlvbi9mb250LXdvZmZcIjpbXCJ3b2ZmXCJdLFwiYXBwbGljYXRpb24vZm9udC13b2ZmMlwiOltcIndvZmYyXCJdLFwiYXBwbGljYXRpb24vZ2VvK2pzb25cIjpbXCJnZW9qc29uXCJdLFwiYXBwbGljYXRpb24vZ21sK3htbFwiOltcImdtbFwiXSxcImFwcGxpY2F0aW9uL2dweCt4bWxcIjpbXCJncHhcIl0sXCJhcHBsaWNhdGlvbi9neGZcIjpbXCJneGZcIl0sXCJhcHBsaWNhdGlvbi9nemlwXCI6W1wiZ3pcIl0sXCJhcHBsaWNhdGlvbi9oeXBlcnN0dWRpb1wiOltcInN0a1wiXSxcImFwcGxpY2F0aW9uL2lua21sK3htbFwiOltcImlua1wiLFwiaW5rbWxcIl0sXCJhcHBsaWNhdGlvbi9pcGZpeFwiOltcImlwZml4XCJdLFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCI6W1wiamFyXCIsXCJ3YXJcIixcImVhclwiXSxcImFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3RcIjpbXCJzZXJcIl0sXCJhcHBsaWNhdGlvbi9qYXZhLXZtXCI6W1wiY2xhc3NcIl0sXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCI6W1wianNcIixcIm1qc1wiXSxcImFwcGxpY2F0aW9uL2pzb25cIjpbXCJqc29uXCIsXCJtYXBcIl0sXCJhcHBsaWNhdGlvbi9qc29uNVwiOltcImpzb241XCJdLFwiYXBwbGljYXRpb24vanNvbm1sK2pzb25cIjpbXCJqc29ubWxcIl0sXCJhcHBsaWNhdGlvbi9sZCtqc29uXCI6W1wianNvbmxkXCJdLFwiYXBwbGljYXRpb24vbG9zdCt4bWxcIjpbXCJsb3N0eG1sXCJdLFwiYXBwbGljYXRpb24vbWFjLWJpbmhleDQwXCI6W1wiaHF4XCJdLFwiYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm9cIjpbXCJjcHRcIl0sXCJhcHBsaWNhdGlvbi9tYWRzK3htbFwiOltcIm1hZHNcIl0sXCJhcHBsaWNhdGlvbi9tYW5pZmVzdCtqc29uXCI6W1wid2VibWFuaWZlc3RcIl0sXCJhcHBsaWNhdGlvbi9tYXJjXCI6W1wibXJjXCJdLFwiYXBwbGljYXRpb24vbWFyY3htbCt4bWxcIjpbXCJtcmN4XCJdLFwiYXBwbGljYXRpb24vbWF0aGVtYXRpY2FcIjpbXCJtYVwiLFwibmJcIixcIm1iXCJdLFwiYXBwbGljYXRpb24vbWF0aG1sK3htbFwiOltcIm1hdGhtbFwiXSxcImFwcGxpY2F0aW9uL21ib3hcIjpbXCJtYm94XCJdLFwiYXBwbGljYXRpb24vbWVkaWFzZXJ2ZXJjb250cm9sK3htbFwiOltcIm1zY21sXCJdLFwiYXBwbGljYXRpb24vbWV0YWxpbmsreG1sXCI6W1wibWV0YWxpbmtcIl0sXCJhcHBsaWNhdGlvbi9tZXRhbGluazQreG1sXCI6W1wibWV0YTRcIl0sXCJhcHBsaWNhdGlvbi9tZXRzK3htbFwiOltcIm1ldHNcIl0sXCJhcHBsaWNhdGlvbi9tb2RzK3htbFwiOltcIm1vZHNcIl0sXCJhcHBsaWNhdGlvbi9tcDIxXCI6W1wibTIxXCIsXCJtcDIxXCJdLFwiYXBwbGljYXRpb24vbXA0XCI6W1wibXA0c1wiLFwibTRwXCJdLFwiYXBwbGljYXRpb24vbXN3b3JkXCI6W1wiZG9jXCIsXCJkb3RcIl0sXCJhcHBsaWNhdGlvbi9teGZcIjpbXCJteGZcIl0sXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIjpbXCJiaW5cIixcImRtc1wiLFwibHJmXCIsXCJtYXJcIixcInNvXCIsXCJkaXN0XCIsXCJkaXN0elwiLFwicGtnXCIsXCJicGtcIixcImR1bXBcIixcImVsY1wiLFwiZGVwbG95XCIsXCJleGVcIixcImRsbFwiLFwiZGViXCIsXCJkbWdcIixcImlzb1wiLFwiaW1nXCIsXCJtc2lcIixcIm1zcFwiLFwibXNtXCIsXCJidWZmZXJcIl0sXCJhcHBsaWNhdGlvbi9vZGFcIjpbXCJvZGFcIl0sXCJhcHBsaWNhdGlvbi9vZWJwcy1wYWNrYWdlK3htbFwiOltcIm9wZlwiXSxcImFwcGxpY2F0aW9uL29nZ1wiOltcIm9neFwiXSxcImFwcGxpY2F0aW9uL29tZG9jK3htbFwiOltcIm9tZG9jXCJdLFwiYXBwbGljYXRpb24vb25lbm90ZVwiOltcIm9uZXRvY1wiLFwib25ldG9jMlwiLFwib25ldG1wXCIsXCJvbmVwa2dcIl0sXCJhcHBsaWNhdGlvbi9veHBzXCI6W1wib3hwc1wiXSxcImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWxcIjpbXCJ4ZXJcIl0sXCJhcHBsaWNhdGlvbi9wZGZcIjpbXCJwZGZcIl0sXCJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkXCI6W1wicGdwXCJdLFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiOltcImFzY1wiLFwic2lnXCJdLFwiYXBwbGljYXRpb24vcGljcy1ydWxlc1wiOltcInByZlwiXSxcImFwcGxpY2F0aW9uL3BrY3MxMFwiOltcInAxMFwiXSxcImFwcGxpY2F0aW9uL3BrY3M3LW1pbWVcIjpbXCJwN21cIixcInA3Y1wiXSxcImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZVwiOltcInA3c1wiXSxcImFwcGxpY2F0aW9uL3BrY3M4XCI6W1wicDhcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LWF0dHItY2VydFwiOltcImFjXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jZXJ0XCI6W1wiY2VyXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jcmxcIjpbXCJjcmxcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LXBraXBhdGhcIjpbXCJwa2lwYXRoXCJdLFwiYXBwbGljYXRpb24vcGtpeGNtcFwiOltcInBraVwiXSxcImFwcGxpY2F0aW9uL3Bscyt4bWxcIjpbXCJwbHNcIl0sXCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0XCI6W1wiYWlcIixcImVwc1wiLFwicHNcIl0sXCJhcHBsaWNhdGlvbi9wc2tjK3htbFwiOltcInBza2N4bWxcIl0sXCJhcHBsaWNhdGlvbi9yZGYreG1sXCI6W1wicmRmXCJdLFwiYXBwbGljYXRpb24vcmVnaW5mbyt4bWxcIjpbXCJyaWZcIl0sXCJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheFwiOltcInJuY1wiXSxcImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzK3htbFwiOltcInJsXCJdLFwiYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWxcIjpbXCJybGRcIl0sXCJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sXCI6W1wicnNcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLWdob3N0YnVzdGVyc1wiOltcImdiclwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktbWFuaWZlc3RcIjpbXCJtZnRcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLXJvYVwiOltcInJvYVwiXSxcImFwcGxpY2F0aW9uL3JzZCt4bWxcIjpbXCJyc2RcIl0sXCJhcHBsaWNhdGlvbi9yc3MreG1sXCI6W1wicnNzXCJdLFwiYXBwbGljYXRpb24vcnRmXCI6W1wicnRmXCJdLFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIjpbXCJzYm1sXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0XCI6W1wic2NxXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXNwb25zZVwiOltcInNjc1wiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdFwiOltcInNwcVwiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2VcIjpbXCJzcHBcIl0sXCJhcHBsaWNhdGlvbi9zZHBcIjpbXCJzZHBcIl0sXCJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uXCI6W1wic2V0cGF5XCJdLFwiYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uXCI6W1wic2V0cmVnXCJdLFwiYXBwbGljYXRpb24vc2hmK3htbFwiOltcInNoZlwiXSxcImFwcGxpY2F0aW9uL3NtaWwreG1sXCI6W1wic21pXCIsXCJzbWlsXCJdLFwiYXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5XCI6W1wicnFcIl0sXCJhcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cyt4bWxcIjpbXCJzcnhcIl0sXCJhcHBsaWNhdGlvbi9zcmdzXCI6W1wiZ3JhbVwiXSxcImFwcGxpY2F0aW9uL3NyZ3MreG1sXCI6W1wiZ3J4bWxcIl0sXCJhcHBsaWNhdGlvbi9zcnUreG1sXCI6W1wic3J1XCJdLFwiYXBwbGljYXRpb24vc3NkbCt4bWxcIjpbXCJzc2RsXCJdLFwiYXBwbGljYXRpb24vc3NtbCt4bWxcIjpbXCJzc21sXCJdLFwiYXBwbGljYXRpb24vdGVpK3htbFwiOltcInRlaVwiLFwidGVpY29ycHVzXCJdLFwiYXBwbGljYXRpb24vdGhyYXVkK3htbFwiOltcInRmaVwiXSxcImFwcGxpY2F0aW9uL3RpbWVzdGFtcGVkLWRhdGFcIjpbXCJ0c2RcIl0sXCJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWxcIjpbXCJ2eG1sXCJdLFwiYXBwbGljYXRpb24vd2lkZ2V0XCI6W1wid2d0XCJdLFwiYXBwbGljYXRpb24vd2luaGxwXCI6W1wiaGxwXCJdLFwiYXBwbGljYXRpb24vd3NkbCt4bWxcIjpbXCJ3c2RsXCJdLFwiYXBwbGljYXRpb24vd3Nwb2xpY3kreG1sXCI6W1wid3Nwb2xpY3lcIl0sXCJhcHBsaWNhdGlvbi94YW1sK3htbFwiOltcInhhbWxcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sXCI6W1wieGRmXCJdLFwiYXBwbGljYXRpb24veGVuYyt4bWxcIjpbXCJ4ZW5jXCJdLFwiYXBwbGljYXRpb24veGh0bWwreG1sXCI6W1wieGh0bWxcIixcInhodFwiXSxcImFwcGxpY2F0aW9uL3htbFwiOltcInhtbFwiLFwieHNsXCIsXCJ4c2RcIixcInJuZ1wiXSxcImFwcGxpY2F0aW9uL3htbC1kdGRcIjpbXCJkdGRcIl0sXCJhcHBsaWNhdGlvbi94b3AreG1sXCI6W1wieG9wXCJdLFwiYXBwbGljYXRpb24veHByb2MreG1sXCI6W1wieHBsXCJdLFwiYXBwbGljYXRpb24veHNsdCt4bWxcIjpbXCJ4c2x0XCJdLFwiYXBwbGljYXRpb24veHNwZit4bWxcIjpbXCJ4c3BmXCJdLFwiYXBwbGljYXRpb24veHYreG1sXCI6W1wibXhtbFwiLFwieGh2bWxcIixcInh2bWxcIixcInh2bVwiXSxcImFwcGxpY2F0aW9uL3lhbmdcIjpbXCJ5YW5nXCJdLFwiYXBwbGljYXRpb24veWluK3htbFwiOltcInlpblwiXSxcImFwcGxpY2F0aW9uL3ppcFwiOltcInppcFwiXSxcImF1ZGlvLzNncHBcIjpbXSxcImF1ZGlvL2FkcGNtXCI6W1wiYWRwXCJdLFwiYXVkaW8vYmFzaWNcIjpbXCJhdVwiLFwic25kXCJdLFwiYXVkaW8vbWlkaVwiOltcIm1pZFwiLFwibWlkaVwiLFwia2FyXCIsXCJybWlcIl0sXCJhdWRpby9tcDNcIjpbXSxcImF1ZGlvL21wNFwiOltcIm00YVwiLFwibXA0YVwiXSxcImF1ZGlvL21wZWdcIjpbXCJtcGdhXCIsXCJtcDJcIixcIm1wMmFcIixcIm1wM1wiLFwibTJhXCIsXCJtM2FcIl0sXCJhdWRpby9vZ2dcIjpbXCJvZ2FcIixcIm9nZ1wiLFwic3B4XCJdLFwiYXVkaW8vczNtXCI6W1wiczNtXCJdLFwiYXVkaW8vc2lsa1wiOltcInNpbFwiXSxcImF1ZGlvL3dhdlwiOltcIndhdlwiXSxcImF1ZGlvL3dhdmVcIjpbXSxcImF1ZGlvL3dlYm1cIjpbXCJ3ZWJhXCJdLFwiYXVkaW8veG1cIjpbXCJ4bVwiXSxcImZvbnQvb3RmXCI6W1wib3RmXCJdLFwiaW1hZ2UvYXBuZ1wiOltcImFwbmdcIl0sXCJpbWFnZS9ibXBcIjpbXCJibXBcIl0sXCJpbWFnZS9jZ21cIjpbXCJjZ21cIl0sXCJpbWFnZS9nM2ZheFwiOltcImczXCJdLFwiaW1hZ2UvZ2lmXCI6W1wiZ2lmXCJdLFwiaW1hZ2UvaWVmXCI6W1wiaWVmXCJdLFwiaW1hZ2UvanBlZ1wiOltcImpwZWdcIixcImpwZ1wiLFwianBlXCJdLFwiaW1hZ2Uva3R4XCI6W1wia3R4XCJdLFwiaW1hZ2UvcG5nXCI6W1wicG5nXCJdLFwiaW1hZ2Uvc2dpXCI6W1wic2dpXCJdLFwiaW1hZ2Uvc3ZnK3htbFwiOltcInN2Z1wiLFwic3ZnelwiXSxcImltYWdlL3RpZmZcIjpbXCJ0aWZmXCIsXCJ0aWZcIl0sXCJpbWFnZS93ZWJwXCI6W1wid2VicFwiXSxcIm1lc3NhZ2UvcmZjODIyXCI6W1wiZW1sXCIsXCJtaW1lXCJdLFwibW9kZWwvZ2x0Zitqc29uXCI6W1wiZ2x0ZlwiXSxcIm1vZGVsL2dsdGYtYmluYXJ5XCI6W1wiZ2xiXCJdLFwibW9kZWwvaWdlc1wiOltcImlnc1wiLFwiaWdlc1wiXSxcIm1vZGVsL21lc2hcIjpbXCJtc2hcIixcIm1lc2hcIixcInNpbG9cIl0sXCJtb2RlbC92cm1sXCI6W1wid3JsXCIsXCJ2cm1sXCJdLFwibW9kZWwveDNkK2JpbmFyeVwiOltcIngzZGJcIixcIngzZGJ6XCJdLFwibW9kZWwveDNkK3ZybWxcIjpbXCJ4M2R2XCIsXCJ4M2R2elwiXSxcIm1vZGVsL3gzZCt4bWxcIjpbXCJ4M2RcIixcIngzZHpcIl0sXCJ0ZXh0L2NhY2hlLW1hbmlmZXN0XCI6W1wiYXBwY2FjaGVcIixcIm1hbmlmZXN0XCJdLFwidGV4dC9jYWxlbmRhclwiOltcImljc1wiLFwiaWZiXCJdLFwidGV4dC9jb2ZmZWVzY3JpcHRcIjpbXCJjb2ZmZWVcIixcImxpdGNvZmZlZVwiXSxcInRleHQvY3NzXCI6W1wiY3NzXCJdLFwidGV4dC9jc3ZcIjpbXCJjc3ZcIl0sXCJ0ZXh0L2hqc29uXCI6W1wiaGpzb25cIl0sXCJ0ZXh0L2h0bWxcIjpbXCJodG1sXCIsXCJodG1cIixcInNodG1sXCJdLFwidGV4dC9qYWRlXCI6W1wiamFkZVwiXSxcInRleHQvanN4XCI6W1wianN4XCJdLFwidGV4dC9sZXNzXCI6W1wibGVzc1wiXSxcInRleHQvbWFya2Rvd25cIjpbXCJtYXJrZG93blwiLFwibWRcIl0sXCJ0ZXh0L21hdGhtbFwiOltcIm1tbFwiXSxcInRleHQvbjNcIjpbXCJuM1wiXSxcInRleHQvcGxhaW5cIjpbXCJ0eHRcIixcInRleHRcIixcImNvbmZcIixcImRlZlwiLFwibGlzdFwiLFwibG9nXCIsXCJpblwiLFwiaW5pXCJdLFwidGV4dC9yaWNodGV4dFwiOltcInJ0eFwiXSxcInRleHQvcnRmXCI6W10sXCJ0ZXh0L3NnbWxcIjpbXCJzZ21sXCIsXCJzZ21cIl0sXCJ0ZXh0L3NsaW1cIjpbXCJzbGltXCIsXCJzbG1cIl0sXCJ0ZXh0L3N0eWx1c1wiOltcInN0eWx1c1wiLFwic3R5bFwiXSxcInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXNcIjpbXCJ0c3ZcIl0sXCJ0ZXh0L3Ryb2ZmXCI6W1widFwiLFwidHJcIixcInJvZmZcIixcIm1hblwiLFwibWVcIixcIm1zXCJdLFwidGV4dC90dXJ0bGVcIjpbXCJ0dGxcIl0sXCJ0ZXh0L3VyaS1saXN0XCI6W1widXJpXCIsXCJ1cmlzXCIsXCJ1cmxzXCJdLFwidGV4dC92Y2FyZFwiOltcInZjYXJkXCJdLFwidGV4dC92dHRcIjpbXCJ2dHRcIl0sXCJ0ZXh0L3htbFwiOltdLFwidGV4dC95YW1sXCI6W1wieWFtbFwiLFwieW1sXCJdLFwidmlkZW8vM2dwcFwiOltcIjNncFwiLFwiM2dwcFwiXSxcInZpZGVvLzNncHAyXCI6W1wiM2cyXCJdLFwidmlkZW8vaDI2MVwiOltcImgyNjFcIl0sXCJ2aWRlby9oMjYzXCI6W1wiaDI2M1wiXSxcInZpZGVvL2gyNjRcIjpbXCJoMjY0XCJdLFwidmlkZW8vanBlZ1wiOltcImpwZ3ZcIl0sXCJ2aWRlby9qcG1cIjpbXCJqcG1cIixcImpwZ21cIl0sXCJ2aWRlby9tajJcIjpbXCJtajJcIixcIm1qcDJcIl0sXCJ2aWRlby9tcDJ0XCI6W1widHNcIl0sXCJ2aWRlby9tcDRcIjpbXCJtcDRcIixcIm1wNHZcIixcIm1wZzRcIl0sXCJ2aWRlby9tcGVnXCI6W1wibXBlZ1wiLFwibXBnXCIsXCJtcGVcIixcIm0xdlwiLFwibTJ2XCJdLFwidmlkZW8vb2dnXCI6W1wib2d2XCJdLFwidmlkZW8vcXVpY2t0aW1lXCI6W1wicXRcIixcIm1vdlwiXSxcInZpZGVvL3dlYm1cIjpbXCJ3ZWJtXCJdfVxufSx7fV19LHt9LFsyXSkoMilcbn0pOyIsIi8vIGNvcHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZS1tb2R1bGVzL3V0aWxpdHkgZm9yIGJyb3dzZXJcblxuZXhwb3J0cy5lbmNvZGVVUklDb21wb25lbnQgPSBmdW5jdGlvbiAodGV4dCkge1xuICB0cnkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodGV4dCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufTtcblxuZXhwb3J0cy5lc2NhcGUgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpO1xuXG5leHBvcnRzLnRpbWVzdGFtcCA9IGZ1bmN0aW9uIHRpbWVzdGFtcCh0KSB7XG4gIGlmICh0KSB7XG4gICAgdmFyIHYgPSB0O1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHYgPSBOdW1iZXIodik7XG4gICAgfVxuICAgIGlmIChTdHJpbmcodCkubGVuZ3RoID09PSAxMCkge1xuICAgICAgdiAqPSAxMDAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodik7XG4gIH1cbiAgcmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHVybHV0aWwgPSByZXF1aXJlKCd1cmwnKTtcbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xudmFyIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3VybGxpYicpO1xudmFyIG1zID0gcmVxdWlyZSgnaHVtYW5pemUtbXMnKTtcblxudmFyIF9Qcm9taXNlO1xuXG52YXIgUkVRVUVTVF9JRCA9IDA7XG52YXIgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMzEpIC0gMTA7XG52YXIgUFJPVE9fUkUgPSAvXmh0dHBzPzpcXC9cXC8vaTtcblxuZnVuY3Rpb24gZ2V0QWdlbnQoYWdlbnQsIGRlZmF1bHRBZ2VudCkge1xuICByZXR1cm4gYWdlbnQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRBZ2VudCA6IGFnZW50O1xufVxuXG5mdW5jdGlvbiBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZXJyLCBkYXRhLCByZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgfVxuICAgIHJlc29sdmUoe1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgIHJlczogcmVzXG4gICAgfSk7XG4gIH07XG59XG5cbi8vIGV4cG9ydHMuVElNRU9VVCA9IG1zKCc1cycpO1xuZXhwb3J0cy5USU1FT1VUUyA9IFttcygnMzAwcycpLCBtcygnMzAwcycpXTtcblxudmFyIFRFWFRfREFUQV9UWVBFUyA9IFtcbiAgJ2pzb24nLFxuICAndGV4dCdcbl07XG5cbmV4cG9ydHMucmVxdWVzdCA9IGZ1bmN0aW9uIHJlcXVlc3QodXJsLCBhcmdzLCBjYWxsYmFjaykge1xuICAvLyByZXF1ZXN0KHVybCwgY2FsbGJhY2spXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgIGFyZ3MgPSBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5yZXF1ZXN0V2l0aENhbGxiYWNrKHVybCwgYXJncywgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gUHJvbWlzZVxuICBpZiAoIV9Qcm9taXNlKSB7XG4gICAgX1Byb21pc2UgPSByZXF1aXJlKCdhbnktcHJvbWlzZScpO1xuICB9XG4gIHJldHVybiBuZXcgX1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGV4cG9ydHMucmVxdWVzdFdpdGhDYWxsYmFjayh1cmwsIGFyZ3MsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QpKTtcbiAgfSk7XG59O1xuXG5cbmV4cG9ydHMucmVxdWVzdFdpdGhDYWxsYmFjayA9IGZ1bmN0aW9uIHJlcXVlc3RXaXRoQ2FsbGJhY2sodXJsLCBhcmdzLCBjYWxsYmFjaykge1xuICAvLyByZXF1ZXN0V2l0aENhbGxiYWNrKHVybCwgY2FsbGJhY2spXG4gIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JykpIHtcbiAgICB2YXIgbXNnID0gdXRpbC5mb3JtYXQoJ2V4cGVjdCByZXF1ZXN0IHVybCB0byBiZSBhIHN0cmluZyBvciBhIGh0dHAgcmVxdWVzdCBvcHRpb25zLCBidXQgZ290ICVqJywgdXJsKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBhcmdzO1xuICAgIGFyZ3MgPSBudWxsO1xuICB9XG5cbiAgYXJncyA9IGFyZ3MgfHwge307XG4gIGlmIChSRVFVRVNUX0lEID49IE1BWF9WQUxVRSkge1xuICAgIFJFUVVFU1RfSUQgPSAwO1xuICB9XG4gIHZhciByZXFJZCA9ICsrUkVRVUVTVF9JRDtcblxuICBhcmdzLnJlcXVlc3RVcmxzID0gYXJncy5yZXF1ZXN0VXJscyB8fCBbXTtcblxuICB2YXIgcmVxTWV0YSA9IHtcbiAgICByZXF1ZXN0SWQ6IHJlcUlkLFxuICAgIHVybDogdXJsLFxuICAgIGFyZ3M6IGFyZ3MsXG4gICAgY3R4OiBhcmdzLmN0eCxcbiAgfTtcbiAgaWYgKGFyZ3MuZW1pdHRlcikge1xuICAgIGFyZ3MuZW1pdHRlci5lbWl0KCdyZXF1ZXN0JywgcmVxTWV0YSk7XG4gIH1cblxuICBhcmdzLnRpbWVvdXQgPSBhcmdzLnRpbWVvdXQgfHwgZXhwb3J0cy5USU1FT1VUUztcbiAgYXJncy5tYXhSZWRpcmVjdHMgPSBhcmdzLm1heFJlZGlyZWN0cyB8fCAxMDtcbiAgYXJncy5zdHJlYW1pbmcgPSBhcmdzLnN0cmVhbWluZyB8fCBhcmdzLmN1c3RvbVJlc3BvbnNlO1xuICB2YXIgcmVxdWVzdFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIHZhciBwYXJzZWRVcmw7XG5cbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFQUk9UT19SRS50ZXN0KHVybCkpIHtcbiAgICAgIC8vIFN1cHBvcnQgYHJlcXVlc3QoJ3d3dy5zZXJ2ZXIuY29tJylgXG4gICAgICB1cmwgPSAnaHR0cDovLycgKyB1cmw7XG4gICAgfVxuICAgIHBhcnNlZFVybCA9IHVybHV0aWwucGFyc2UodXJsKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJzZWRVcmwgPSB1cmw7XG4gIH1cblxuICB2YXIgbWV0aG9kID0gKGFyZ3MudHlwZSB8fCBhcmdzLm1ldGhvZCB8fCBwYXJzZWRVcmwubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICB2YXIgcG9ydCA9IHBhcnNlZFVybC5wb3J0IHx8IDgwO1xuICB2YXIgaHR0cGxpYiA9IGh0dHA7XG4gIHZhciBhZ2VudCA9IGdldEFnZW50KGFyZ3MuYWdlbnQsIGV4cG9ydHMuYWdlbnQpO1xuICB2YXIgZml4SlNPTkN0bENoYXJzID0gYXJncy5maXhKU09OQ3RsQ2hhcnM7XG5cbiAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICBodHRwbGliID0gaHR0cHM7XG4gICAgYWdlbnQgPSBnZXRBZ2VudChhcmdzLmh0dHBzQWdlbnQsIGV4cG9ydHMuaHR0cHNBZ2VudCk7XG5cbiAgICBpZiAoIXBhcnNlZFVybC5wb3J0KSB7XG4gICAgICBwb3J0ID0gNDQzO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlcXVlc3QgdGhyb3VnaCBwcm94eSB0dW5uZWxcbiAgLy8gdmFyIHByb3h5VHVubmVsQWdlbnQgPSBkZXRlY3RQcm94eUFnZW50KHBhcnNlZFVybCwgYXJncyk7XG4gIC8vIGlmIChwcm94eVR1bm5lbEFnZW50KSB7XG4gIC8vICAgYWdlbnQgPSBwcm94eVR1bm5lbEFnZW50O1xuICAvLyB9XG5cbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgaG9zdDogcGFyc2VkVXJsLmhvc3RuYW1lIHx8IHBhcnNlZFVybC5ob3N0IHx8ICdsb2NhbGhvc3QnLFxuICAgIHBhdGg6IHBhcnNlZFVybC5wYXRoIHx8ICcvJyxcbiAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICBwb3J0OiBwb3J0LFxuICAgIGFnZW50OiBhZ2VudCxcbiAgICBoZWFkZXJzOiBhcmdzLmhlYWRlcnMgfHwge30sXG4gICAgLy8gZGVmYXVsdCBpcyBkbnMubG9va3VwXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9uZXQuanMjTDk4NlxuICAgIC8vIGN1c3RvbSBkbnNsb29rdXAgcmVxdWlyZSBub2RlID49IDQuMC4wXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYXJjaGl2ZWQtaW8uanMtdjAuMTIvbGliL25ldC5qcyNMOTUyXG4gICAgbG9va3VwOiBhcmdzLmxvb2t1cCxcbiAgfTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnRpbWVvdXQpKSB7XG4gICAgb3B0aW9ucy5yZXF1ZXN0VGltZW91dCA9IGFyZ3MudGltZW91dFthcmdzLnRpbWVvdXQubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3MudGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zLnJlcXVlc3RUaW1lb3V0ID0gYXJncy50aW1lb3V0O1xuICB9XG5cbiAgdmFyIHNzbE5hbWVzID0gW1xuICAgICdwZngnLFxuICAgICdrZXknLFxuICAgICdwYXNzcGhyYXNlJyxcbiAgICAnY2VydCcsXG4gICAgJ2NhJyxcbiAgICAnY2lwaGVycycsXG4gICAgJ3JlamVjdFVuYXV0aG9yaXplZCcsXG4gICAgJ3NlY3VyZVByb3RvY29sJyxcbiAgICAnc2VjdXJlT3B0aW9ucycsXG4gIF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3NsTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbmFtZSA9IHNzbE5hbWVzW2ldO1xuICAgIGlmIChhcmdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBvcHRpb25zW25hbWVdID0gYXJnc1tuYW1lXTtcbiAgICB9XG4gIH1cblxuICAvLyBkb24ndCBjaGVjayBzc2xcbiAgaWYgKG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZSAmJiAhb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2VjdXJlT3B0aW9ucycpKSB7XG4gICAgb3B0aW9ucy5zZWN1cmVPcHRpb25zID0gcmVxdWlyZSgnY29uc3RhbnRzJykuU1NMX09QX05PX1RMU3YxXzI7XG4gIH1cblxuICB2YXIgYXV0aCA9IGFyZ3MuYXV0aCB8fCBwYXJzZWRVcmwuYXV0aDtcbiAgaWYgKGF1dGgpIHtcbiAgICBvcHRpb25zLmF1dGggPSBhdXRoO1xuICB9XG5cbiAgdmFyIGJvZHkgPSBhcmdzLmNvbnRlbnQgfHwgYXJncy5kYXRhO1xuICB2YXIgZGF0YUFzUXVlcnlTdHJpbmcgPSBtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IGFyZ3MuZGF0YUFzUXVlcnlTdHJpbmc7XG4gIGlmICghYXJncy5jb250ZW50KSB7XG4gICAgaWYgKGJvZHkgJiYgISh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHwgQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSkge1xuICAgICAgaWYgKGRhdGFBc1F1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIC8vIHJlYWQ6IEdFVCwgSEVBRCwgdXNlIHF1ZXJ5IHN0cmluZ1xuICAgICAgICBib2R5ID0gYXJncy5uZXN0ZWRRdWVyeXN0cmluZyA/IHFzLnN0cmluZ2lmeShib2R5KSA6IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShib2R5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjb250ZW50VHlwZSA9IG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICAgICAgLy8gYXV0byBhZGQgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIHdoZW4gdXNpbmcgdXJsZW5jb2RlIGZvcm0gcmVxdWVzdFxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgaWYgKGFyZ3MuY29udGVudFR5cGUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50VHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKS50eXBlID09PSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICAgICAgICBib2R5ID0gYXJncy5uZXN0ZWRRdWVyeXN0cmluZyA/IHFzLnN0cmluZ2lmeShib2R5KSA6IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShib2R5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIGl0J3MgYSBHRVQgb3IgSEVBRCByZXF1ZXN0LCBkYXRhIHNob3VsZCBiZSBzZW50IGFzIHF1ZXJ5IHN0cmluZ1xuICBpZiAoZGF0YUFzUXVlcnlTdHJpbmcgJiYgYm9keSkge1xuICAgIG9wdGlvbnMucGF0aCArPSAocGFyc2VkVXJsLnF1ZXJ5ID8gJyYnIDogJz8nKSArIGJvZHk7XG4gICAgYm9keSA9IG51bGw7XG4gIH1cblxuICB2YXIgcmVxdWVzdFNpemUgPSAwO1xuICBpZiAoYm9keSkge1xuICAgIHZhciBsZW5ndGggPSBib2R5Lmxlbmd0aDtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSk7XG4gICAgfVxuICAgIHJlcXVlc3RTaXplID0gb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGFyZ3MuZGF0YVR5cGUgPT09ICdqc29uJykge1xuICAgIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gIH1cblxuICBpZiAodHlwZW9mIGFyZ3MuYmVmb3JlUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHlvdSBjYW4gdXNlIHRoaXMgaG9vayB0byBjaGFuZ2UgZXZlcnkgdGhpbmcuXG4gICAgYXJncy5iZWZvcmVSZXF1ZXN0KG9wdGlvbnMpO1xuICB9XG4gIHZhciBjb25uZWN0VGltZXIgPSBudWxsO1xuICB2YXIgcmVzcG9uc2VUaW1lciA9IG51bGw7XG4gIHZhciBfX2VyciA9IG51bGw7XG4gIHZhciBjb25uZWN0ZWQgPSBmYWxzZTsgLy8gc29ja2V0IGNvbm5lY3RlZCBvciBub3RcbiAgdmFyIGtlZXBBbGl2ZVNvY2tldCA9IGZhbHNlOyAvLyByZXF1ZXN0IHdpdGgga2VlcGFsaXZlIHNvY2tldFxuICB2YXIgcmVzcG9uc2VTaXplID0gMDtcbiAgdmFyIHN0YXR1c0NvZGUgPSAtMTtcbiAgdmFyIHJlc3BvbnNlQWJvcnRlZCA9IGZhbHNlO1xuICB2YXIgcmVtb3RlQWRkcmVzcyA9ICcnO1xuICB2YXIgcmVtb3RlUG9ydCA9ICcnO1xuICB2YXIgdGltaW5nID0gbnVsbDtcbiAgaWYgKGFyZ3MudGltaW5nKSB7XG4gICAgdGltaW5nID0ge1xuICAgICAgLy8gc29ja2V0IGFzc2lnbmVkXG4gICAgICBxdWV1aW5nOiAwLFxuICAgICAgLy8gZG5zIGxvb2t1cCB0aW1lXG4gICAgICBkbnNsb29rdXA6IDAsXG4gICAgICAvLyBzb2NrZXQgY29ubmVjdGVkXG4gICAgICBjb25uZWN0ZWQ6IDAsXG4gICAgICAvLyByZXF1ZXN0IHNlbnRcbiAgICAgIHJlcXVlc3RTZW50OiAwLFxuICAgICAgLy8gVGltZSB0byBmaXJzdCBieXRlIChUVEZCKVxuICAgICAgd2FpdGluZzogMCxcbiAgICAgIGNvbnRlbnREb3dubG9hZDogMCxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsQ29ubmVjdFRpbWVyKCkge1xuICAgIGlmIChjb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChjb25uZWN0VGltZXIpO1xuICAgICAgY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2FuY2VsUmVzcG9uc2VUaW1lcigpIHtcbiAgICBpZiAocmVzcG9uc2VUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3BvbnNlVGltZXIpO1xuICAgICAgcmVzcG9uc2VUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEsIHJlcykge1xuICAgIGNhbmNlbFJlc3BvbnNlVGltZXIoKTtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t1cmxsaWI6d2Fybl0gWyVzXSBbJXNdIFt3b3JrZXI6JXNdICVzICVzIGNhbGxiYWNrIHR3aWNlISEhJyxcbiAgICAgICAgRGF0ZSgpLCByZXFJZCwgcHJvY2Vzcy5waWQsIG9wdGlvbnMubWV0aG9kLCB1cmwpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtbW9kdWxlcy91cmxsaWIvcHVsbC8zMFxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t1cmxsaWI6d2Fybl0gWyVzXSBbJXNdIFt3b3JrZXI6JXNdICVzOiAlc1xcbnN0YWNrOiAlcycsXG4gICAgICAgICAgRGF0ZSgpLCByZXFJZCwgcHJvY2Vzcy5waWQsIGVyci5uYW1lLCBlcnIubWVzc2FnZSwgZXJyLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNiID0gY2FsbGJhY2s7XG4gICAgY2FsbGJhY2sgPSBudWxsO1xuICAgIHZhciBoZWFkZXJzID0ge307XG4gICAgaWYgKHJlcykge1xuICAgICAgc3RhdHVzQ29kZSA9IHJlcy5zdGF0dXNDb2RlO1xuICAgICAgaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBkaWdlc3QgYXV0aFxuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDEgJiYgaGVhZGVyc1snd3d3LWF1dGhlbnRpY2F0ZSddXG4gICAgICAmJiAoIWFyZ3MuaGVhZGVycyB8fCAhYXJncy5oZWFkZXJzLkF1dGhvcml6YXRpb24pICYmIGFyZ3MuZGlnZXN0QXV0aCkge1xuICAgICAgdmFyIGF1dGhlbnRpY2F0ZSA9IGhlYWRlcnNbJ3d3dy1hdXRoZW50aWNhdGUnXTtcbiAgICAgIGlmIChhdXRoZW50aWNhdGUuaW5kZXhPZignRGlnZXN0ICcpID49IDApIHtcbiAgICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IGdvdCBkaWdlc3QgYXV0aCBoZWFkZXIgV1dXLUF1dGhlbnRpY2F0ZTogJXMnLCByZXFJZCwgdXJsLCBhdXRoZW50aWNhdGUpO1xuICAgICAgICBhcmdzLmhlYWRlcnMgPSBhcmdzLmhlYWRlcnMgfHwge307XG4gICAgICAgIGFyZ3MuaGVhZGVycy5BdXRob3JpemF0aW9uID0gZGlnZXN0QXV0aEhlYWRlcihvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy5wYXRoLCBhdXRoZW50aWNhdGUsIGFyZ3MuZGlnZXN0QXV0aCk7XG4gICAgICAgIGRlYnVnKCdSZXF1ZXN0IyVkICVzOiBhdXRoIHdpdGggZGlnZXN0IGhlYWRlcjogJXMnLCByZXFJZCwgdXJsLCBhcmdzLmhlYWRlcnMuQXV0aG9yaXphdGlvbik7XG4gICAgICAgIGlmIChyZXMuaGVhZGVyc1snc2V0LWNvb2tpZSddKSB7XG4gICAgICAgICAgYXJncy5oZWFkZXJzLkNvb2tpZSA9IHJlcy5oZWFkZXJzWydzZXQtY29va2llJ10uam9pbignOycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBvcnRzLnJlcXVlc3RXaXRoQ2FsbGJhY2sodXJsLCBhcmdzLCBjYik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3RVc2VUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWU7XG4gICAgaWYgKHRpbWluZykge1xuICAgICAgdGltaW5nLmNvbnRlbnREb3dubG9hZCA9IHJlcXVlc3RVc2VUaW1lO1xuICAgIH1cblxuICAgIGRlYnVnKCdbJXNtc10gZG9uZSwgJXMgYnl0ZXMgSFRUUCAlcyAlcyAlcyAlcywga2VlcEFsaXZlU29ja2V0OiAlcywgdGltaW5nOiAlaicsXG4gICAgICByZXF1ZXN0VXNlVGltZSwgcmVzcG9uc2VTaXplLCBzdGF0dXNDb2RlLCBvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy5ob3N0LCBvcHRpb25zLnBhdGgsXG4gICAgICBrZWVwQWxpdmVTb2NrZXQsIHRpbWluZyk7XG5cbiAgICB2YXIgcmVzcG9uc2UgPSB7XG4gICAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIHNpemU6IHJlc3BvbnNlU2l6ZSxcbiAgICAgIGFib3J0ZWQ6IHJlc3BvbnNlQWJvcnRlZCxcbiAgICAgIHJ0OiByZXF1ZXN0VXNlVGltZSxcbiAgICAgIGtlZXBBbGl2ZVNvY2tldDoga2VlcEFsaXZlU29ja2V0LFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHJlcXVlc3RVcmxzOiBhcmdzLnJlcXVlc3RVcmxzLFxuICAgICAgdGltaW5nOiB0aW1pbmcsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZW1vdGVBZGRyZXNzLFxuICAgICAgcmVtb3RlUG9ydDogcmVtb3RlUG9ydCxcbiAgICB9O1xuXG4gICAgaWYgKGVycikge1xuICAgICAgdmFyIGFnZW50U3RhdHVzID0gJyc7XG4gICAgICBpZiAoYWdlbnQgJiYgdHlwZW9mIGFnZW50LmdldEN1cnJlbnRTdGF0dXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gYWRkIGN1cnJlbnQgYWdlbnQgc3RhdHVzIHRvIGVycm9yIG1lc3NhZ2UgZm9yIGxvZ2dpbmcgYW5kIGRlYnVnXG4gICAgICAgIGFnZW50U3RhdHVzID0gJywgYWdlbnQgc3RhdHVzOiAnICsgSlNPTi5zdHJpbmdpZnkoYWdlbnQuZ2V0Q3VycmVudFN0YXR1cygpKTtcbiAgICAgIH1cbiAgICAgIGVyci5tZXNzYWdlICs9ICcsICcgKyBvcHRpb25zLm1ldGhvZCArICcgJyArIHVybCArICcgJyArIHN0YXR1c0NvZGVcbiAgICAgICAgKyAnIChjb25uZWN0ZWQ6ICcgKyBjb25uZWN0ZWQgKyAnLCBrZWVwYWxpdmUgc29ja2V0OiAnICsga2VlcEFsaXZlU29ja2V0ICsgYWdlbnRTdGF0dXMgKyAnKSdcbiAgICAgICAgKyAnXFxuaGVhZGVyczogJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpO1xuICAgICAgZXJyLmRhdGEgPSBkYXRhO1xuICAgICAgZXJyLnBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzQ29kZTtcbiAgICAgIGVyci5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIGVyci5yZXMgPSByZXNwb25zZTtcbiAgICB9XG5cbiAgICBjYihlcnIsIGRhdGEsIGFyZ3Muc3RyZWFtaW5nID8gcmVzIDogcmVzcG9uc2UpO1xuXG4gICAgaWYgKGFyZ3MuZW1pdHRlcikge1xuICAgICAgLy8ga2VlcCB0byB1c2UgdGhlIHNhbWUgcmVxTWV0YSBvYmplY3Qgb24gcmVxdWVzdCBldmVudCBiZWZvcmVcbiAgICAgIHJlcU1ldGEudXJsID0gdXJsO1xuICAgICAgcmVxTWV0YS5zb2NrZXQgPSByZXEgJiYgcmVxLmNvbm5lY3Rpb247XG4gICAgICByZXFNZXRhLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgcmVxTWV0YS5zaXplID0gcmVxdWVzdFNpemU7XG5cbiAgICAgIGFyZ3MuZW1pdHRlci5lbWl0KCdyZXNwb25zZScsIHtcbiAgICAgICAgcmVxdWVzdElkOiByZXFJZCxcbiAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgY3R4OiBhcmdzLmN0eCxcbiAgICAgICAgcmVxOiByZXFNZXRhLFxuICAgICAgICByZXM6IHJlc3BvbnNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QocmVzKSB7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgaWYgKGFyZ3MuZm9sbG93UmVkaXJlY3QgJiYgc3RhdHVzZXMucmVkaXJlY3RbcmVzLnN0YXR1c0NvZGVdKSB7ICAvLyBoYW5kbGUgcmVkaXJlY3RcbiAgICAgIGFyZ3MuX2ZvbGxvd1JlZGlyZWN0Q291bnQgPSAoYXJncy5fZm9sbG93UmVkaXJlY3RDb3VudCB8fCAwKSArIDE7XG4gICAgICB2YXIgbG9jYXRpb24gPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcbiAgICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgZXJyID0gbmV3IEVycm9yKCdHb3Qgc3RhdHVzQ29kZSAnICsgcmVzLnN0YXR1c0NvZGUgKyAnIGJ1dCBjYW5ub3QgcmVzb2x2ZSBuZXh0IGxvY2F0aW9uIGZyb20gaGVhZGVycycpO1xuICAgICAgICBlcnIubmFtZSA9ICdGb2xsb3dSZWRpcmVjdEVycm9yJztcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5fZm9sbG93UmVkaXJlY3RDb3VudCA+IGFyZ3MubWF4UmVkaXJlY3RzKSB7XG4gICAgICAgIGVyciA9IG5ldyBFcnJvcignRXhjZWVkZWQgbWF4UmVkaXJlY3RzLiBQcm9iYWJseSBzdHVjayBpbiBhIHJlZGlyZWN0IGxvb3AgJyArIHVybCk7XG4gICAgICAgIGVyci5uYW1lID0gJ01heFJlZGlyZWN0RXJyb3InO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5ld1VybCA9IGFyZ3MuZm9ybWF0UmVkaXJlY3RVcmwgPyBhcmdzLmZvcm1hdFJlZGlyZWN0VXJsKHVybCwgbG9jYXRpb24pIDogdXJsdXRpbC5yZXNvbHZlKHVybCwgbG9jYXRpb24pO1xuICAgICAgICBkZWJ1ZygnUmVxdWVzdCMlZCAlczogYHJlZGlyZWN0ZWRgIGZyb20gJXMgdG8gJXMnLCByZXFJZCwgb3B0aW9ucy5wYXRoLCB1cmwsIG5ld1VybCk7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aW1lciBzdG9wXG4gICAgICAgIGNhbmNlbFJlc3BvbnNlVGltZXIoKTtcbiAgICAgICAgLy8gc2hvdWxkIGNsZWFuIHVwIGhlYWRlcnMuSG9zdCBvbiBgbG9jYXRpb246IGh0dHA6Ly9vdGhlci1kb21haW4vdXJsYFxuICAgICAgICBpZiAoYXJncy5oZWFkZXJzICYmIGFyZ3MuaGVhZGVycy5Ib3N0ICYmIFBST1RPX1JFLnRlc3QobG9jYXRpb24pKSB7XG4gICAgICAgICAgYXJncy5oZWFkZXJzLkhvc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF2b2lkIGRvbmUgd2lsbCBiZSBleGVjdXRlIGluIHRoZSBmdXR1cmUgY2hhbmdlLlxuICAgICAgICB2YXIgY2IgPSBjYWxsYmFjaztcbiAgICAgICAgY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBleHBvcnRzLnJlcXVlc3RXaXRoQ2FsbGJhY2sobmV3VXJsLCBhcmdzLCBjYik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVkaXJlY3Q6IHRydWUsXG4gICAgICAgICAgZXJyb3I6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGlyZWN0OiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJcbiAgICB9O1xuICB9XG5cbiAgLy8gc2V0IHVzZXItYWdlbnRcbiAgaWYgKCFvcHRpb25zLmhlYWRlcnNbJ1VzZXItQWdlbnQnXSAmJiAhb3B0aW9ucy5oZWFkZXJzWyd1c2VyLWFnZW50J10pIHtcbiAgICBvcHRpb25zLmhlYWRlcnNbJ1VzZXItQWdlbnQnXSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIH1cblxuICBpZiAoYXJncy5nemlwKSB7XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnNbJ0FjY2VwdC1FbmNvZGluZyddICYmICFvcHRpb25zLmhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnNbJ0FjY2VwdC1FbmNvZGluZyddID0gJ2d6aXAnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUNvbnRlbnQocmVzLCBib2R5LCBjYikge1xuICAgIHZhciBlbmNvZGluZyA9IHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ107XG4gICAgLy8gaWYgKGJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gICByZXR1cm4gY2IobnVsbCwgYm9keSwgZW5jb2RpbmcpO1xuICAgIC8vIH1cblxuICAgIC8vIGlmICghZW5jb2RpbmcgfHwgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSAhPT0gJ2d6aXAnKSB7XG4gICAgICByZXR1cm4gY2IobnVsbCwgYm9keSwgZW5jb2RpbmcpO1xuICAgIC8vIH1cblxuICAgIC8vIGRlYnVnKCdndW56aXAgJWQgbGVuZ3RoIGJvZHknLCBib2R5Lmxlbmd0aCk7XG4gICAgLy8gemxpYi5ndW56aXAoYm9keSwgY2IpO1xuICB9XG5cbiAgdmFyIHdyaXRlU3RyZWFtID0gYXJncy53cml0ZVN0cmVhbTtcblxuICBkZWJ1ZygnUmVxdWVzdCMlZCAlcyAlcyB3aXRoIGhlYWRlcnMgJWosIG9wdGlvbnMucGF0aDogJXMnLFxuICAgIHJlcUlkLCBtZXRob2QsIHVybCwgb3B0aW9ucy5oZWFkZXJzLCBvcHRpb25zLnBhdGgpO1xuXG4gIGFyZ3MucmVxdWVzdFVybHMucHVzaCh1cmwpO1xuXG4gIGZ1bmN0aW9uIG9uUmVzcG9uc2UocmVzKSB7XG4gICAgaWYgKHRpbWluZykge1xuICAgICAgdGltaW5nLndhaXRpbmcgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFN0YXJ0VGltZTtcbiAgICB9XG4gICAgZGVidWcoJ1JlcXVlc3QjJWQgJXMgYHJlcSByZXNwb25zZWAgZXZlbnQgZW1pdDogc3RhdHVzICVkLCBoZWFkZXJzOiAlaicsXG4gICAgICByZXFJZCwgdXJsLCByZXMuc3RhdHVzQ29kZSwgcmVzLmhlYWRlcnMpO1xuXG4gICAgaWYgKGFyZ3Muc3RyZWFtaW5nKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gaGFuZGxlUmVkaXJlY3QocmVzKTtcbiAgICAgIGlmIChyZXN1bHQucmVkaXJlY3QpIHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUocmVzdWx0LmVycm9yLCBudWxsLCByZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZG9uZShudWxsLCBudWxsLCByZXMpO1xuICAgIH1cblxuICAgIHJlcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWJ1ZygnUmVxdWVzdCMlZCAlczogYHJlcyBjbG9zZWAgZXZlbnQgZW1pdCwgdG90YWwgc2l6ZSAlZCcsXG4gICAgICAgIHJlcUlkLCB1cmwsIHJlc3BvbnNlU2l6ZSk7XG4gICAgfSk7XG5cbiAgICByZXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IGByZXMgZXJyb3JgIGV2ZW50IGVtaXQsIHRvdGFsIHNpemUgJWQnLFxuICAgICAgICByZXFJZCwgdXJsLCByZXNwb25zZVNpemUpO1xuICAgIH0pO1xuXG4gICAgcmVzLm9uKCdhYm9ydGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVzcG9uc2VBYm9ydGVkID0gdHJ1ZTtcbiAgICAgIGRlYnVnKCdSZXF1ZXN0IyVkICVzOiBgcmVzIGFib3J0ZWRgIGV2ZW50IGVtaXQsIHRvdGFsIHNpemUgJWQnLFxuICAgICAgICByZXFJZCwgdXJsLCByZXNwb25zZVNpemUpO1xuICAgIH0pO1xuXG4gICAgaWYgKHdyaXRlU3RyZWFtKSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGEgd3JpdGFibGUgc3RyZWFtIHRvIHJlY2lldmUgdGhlIHJlc3BvbnNlIGRhdGEsIGp1c3QgcGlwZSB0aGVcbiAgICAgIC8vIHJlc3BvbnNlIHN0cmVhbSB0byB0aGF0IHdyaXRhYmxlIHN0cmVhbSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBpdCBoYXNcbiAgICAgIC8vIGZpbmlzaGVkIHdyaXRpbmcuXG4gICAgICAvL1xuICAgICAgLy8gTk9URSB0aGF0IHdoZW4gdGhlIHJlc3BvbnNlIHN0cmVhbSBgcmVzYCBlbWl0cyBhbiAnZW5kJyBldmVudCBpdCBqdXN0XG4gICAgICAvLyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCBwaXBpbmcgZGF0YSB0byBhbm90aGVyIHN0cmVhbS4gSW4gdGhlXG4gICAgICAvLyBtZWFud2hpbGUgdGhhdCB3cml0YWJsZSBzdHJlYW0gbWF5IHN0aWxsIHdyaXRpbmcgZGF0YSB0byB0aGUgZGlzayB1bnRpbFxuICAgICAgLy8gaXQgZW1pdHMgYSAnY2xvc2UnIGV2ZW50LlxuICAgICAgLy9cbiAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGFwcGx5IGNhbGxiYWNrIHVudGlsIHRoZSAnY2xvc2UnIG9mIHRoZVxuICAgICAgLy8gd3JpdGFibGUgc3RyZWFtIGlzIGVtaXRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWUgYWxzbzpcbiAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL1RCRURQL3VybGxpYi9jb21taXQvOTU5YWMzMzY1ODIxZTBlMDI4YzIzMWE1ZThlZmNhNmFmNDEwZWFiYlxuICAgICAgLy8gLSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2V2ZW50X2VuZFxuICAgICAgLy8gLSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2V2ZW50X2Nsb3NlXzFcbiAgICAgIHZhciByZXN1bHQgPSBoYW5kbGVSZWRpcmVjdChyZXMpO1xuICAgICAgaWYgKHJlc3VsdC5yZWRpcmVjdCkge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICAvLyBlbmQgdGhzIHN0cmVhbSBmaXJzdFxuICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUocmVzdWx0LmVycm9yLCBudWxsLCByZXMpO1xuICAgICAgfVxuICAgICAgLy8geW91IGNhbiBzZXQgY29uc3VtZVdyaXRlU3RyZWFtIGZhbHNlIHRoYXQgb25seSB3YWl0IHJlc3BvbnNlIGVuZFxuICAgICAgaWYgKGFyZ3MuY29uc3VtZVdyaXRlU3RyZWFtID09PSBmYWxzZSkge1xuICAgICAgICByZXMub24oJ2VuZCcsIGRvbmUuYmluZChudWxsLCBudWxsLCBudWxsLCByZXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vZGUgMC4xMCwgMC4xMjogb25seSBlbWl0IHJlcyBhYm9ydGVkLCB3cml0ZVN0cmVhbSBjbG9zZSBub3QgZmlyZWRcbiAgICAgICAgaWYgKGlzTm9kZTAxMCB8fCBpc05vZGUwMTIpIHtcbiAgICAgICAgICBmaXJzdChbXG4gICAgICAgICAgICBbIHdyaXRlU3RyZWFtLCAnY2xvc2UnIF0sXG4gICAgICAgICAgICBbIHJlcywgJ2Fib3J0ZWQnIF0sXG4gICAgICAgICAgXSwgZnVuY3Rpb24oXywgc3RyZWFtLCBldmVudCkge1xuICAgICAgICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IHdyaXRlU3RyZWFtIG9yIHJlcyAlcyBldmVudCBlbWl0dGVkJywgcmVxSWQsIHVybCwgZXZlbnQpO1xuICAgICAgICAgICAgZG9uZShfX2VyciB8fCBudWxsLCBudWxsLCByZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdjbG9zZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IHdyaXRlU3RyZWFtIGNsb3NlIGV2ZW50IGVtaXR0ZWQnLCByZXFJZCwgdXJsKTtcbiAgICAgICAgICAgIGRvbmUoX19lcnIgfHwgbnVsbCwgbnVsbCwgcmVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcy5waXBlKHdyaXRlU3RyZWFtKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGp1c3QgY29uY2F0IHRob3NlIGJ1ZmZlcnMuXG4gICAgLy9cbiAgICAvLyBOT1RFIHRoYXQgdGhlIGBjaHVua2AgaXMgbm90IGEgU3RyaW5nIGJ1dCBhIEJ1ZmZlci4gSXQgbWVhbnMgdGhhdCBpZlxuICAgIC8vIHlvdSBzaW1wbHkgY29uY2F0IHR3byBjaHVuayB3aXRoIGArYCB5b3UncmUgYWN0dWFsbHkgY29udmVydGluZyBib3RoXG4gICAgLy8gQnVmZmVycyBpbnRvIFN0cmluZ3MgYmVmb3JlIGNvbmNhdGluZyB0aGVtLiBJdCdsbCBjYXVzZSBwcm9ibGVtcyB3aGVuXG4gICAgLy8gZGVhbGluZyB3aXRoIG11bHRpLWJ5dGUgY2hhcmFjdGVycy5cbiAgICAvL1xuICAgIC8vIFRoZSBzb2x1dGlvbiBpcyB0byBzdG9yZSBlYWNoIGNodW5rIGluIGFuIGFycmF5IGFuZCBjb25jYXQgdGhlbSB3aXRoXG4gICAgLy8gJ2J1ZmZlci1jb25jYXQnIHdoZW4gYWxsIGNodW5rcyBpcyByZWNpZXZlZC5cbiAgICAvL1xuICAgIC8vIFNlZSBhbHNvOlxuICAgIC8vIGh0dHA6Ly9jbm9kZWpzLm9yZy90b3BpYy80ZmFmNjU4NTJlOGZiNWJjNjUxMTM0MDNcblxuICAgIHZhciBjaHVua3MgPSBbXTtcblxuICAgIHJlcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IGByZXMgZGF0YWAgZXZlbnQgZW1pdCwgc2l6ZSAlZCcsIHJlcUlkLCB1cmwsIGNodW5rLmxlbmd0aCk7XG4gICAgICByZXNwb25zZVNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH0pO1xuXG4gICAgcmVzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYm9keSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCByZXNwb25zZVNpemUpO1xuICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IGByZXMgZW5kYCBldmVudCBlbWl0LCB0b3RhbCBzaXplICVkLCBfZHVtcGVkOiAlcycsXG4gICAgICAgIHJlcUlkLCB1cmwsIHJlc3BvbnNlU2l6ZSwgcmVzLl9kdW1wZWQpO1xuXG4gICAgICBpZiAoX19lcnIpIHtcbiAgICAgICAgLy8gcmVxLmFib3J0KCkgYWZ0ZXIgYHJlcyBkYXRhYCBldmVudCBlbWl0LlxuICAgICAgICByZXR1cm4gZG9uZShfX2VyciwgYm9keSwgcmVzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IGhhbmRsZVJlZGlyZWN0KHJlcyk7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBkb25lKHJlc3VsdC5lcnJvciwgYm9keSwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQucmVkaXJlY3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNvZGVDb250ZW50KHJlcywgYm9keSwgZnVuY3Rpb24gKGVyciwgZGF0YSwgZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBkb25lKGVyciwgYm9keSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBib2R5IG5vdCBkZWNvZGUsIGRvbnQgdG91Y2ggaXRcbiAgICAgICAgaWYgKCFlbmNvZGluZyAmJiBURVhUX0RBVEFfVFlQRVMuaW5kZXhPZihhcmdzLmRhdGFUeXBlKSA+PSAwKSB7XG4gICAgICAgICAgLy8gdHJ5IHRvIGRlY29kZSBjaGFyc2V0XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRhdGEgPSBkZWNvZGVCb2R5QnlDaGFyc2V0KGRhdGEsIHJlcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ2RlY29kZUJvZHlCeUNoYXJzZXQgZXJyb3I6ICVzJywgZSk7XG4gICAgICAgICAgICAvLyBpZiBlcnJvciwgZG9udCB0b3VjaCBpdFxuICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwgZGF0YSwgcmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXJncy5kYXRhVHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHIgPSBwYXJzZUpTT04oZGF0YSwgZml4SlNPTkN0bENoYXJzKTtcbiAgICAgICAgICAgICAgaWYgKHIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSByLmVycm9yO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSByLmRhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2VBYm9ydGVkKSB7XG4gICAgICAgICAgLy8gZXJyID0gbmV3IEVycm9yKCdSZW1vdGUgc29ja2V0IHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBgcmVzcG9uc2UuZW5kKClgIHdhcyBjYWxsZWQnKTtcbiAgICAgICAgICAvLyBlcnIubmFtZSA9ICdSZW1vdGVTb2NrZXRDbG9zZWRFcnJvcic7XG4gICAgICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXM6IFJlbW90ZSBzb2NrZXQgd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGByZXNwb25zZS5lbmQoKWAgd2FzIGNhbGxlZCcsIHJlcUlkLCB1cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9uZShlcnIsIGRhdGEsIHJlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBjb25uZWN0VGltZW91dCwgcmVzcG9uc2VUaW1lb3V0O1xuICBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnRpbWVvdXQpKSB7XG4gICAgY29ubmVjdFRpbWVvdXQgPSBtcyhhcmdzLnRpbWVvdXRbMF0pO1xuICAgIHJlc3BvbnNlVGltZW91dCA9IG1zKGFyZ3MudGltZW91dFsxXSk7XG4gIH0gZWxzZSB7ICAvLyBzZXQgYm90aCB0aW1lb3V0IGVxdWFsXG4gICAgY29ubmVjdFRpbWVvdXQgPSByZXNwb25zZVRpbWVvdXQgPSBtcyhhcmdzLnRpbWVvdXQpO1xuICB9XG4gIGRlYnVnKCdDb25uZWN0VGltZW91dDogJWQsIFJlc3BvbnNlVGltZW91dDogJWQnLCBjb25uZWN0VGltZW91dCwgcmVzcG9uc2VUaW1lb3V0KTtcblxuICBmdW5jdGlvbiBzdGFydENvbm5lY3RUaW1lcigpIHtcbiAgICBkZWJ1ZygnQ29ubmVjdCB0aW1lciB0aWNraW5nLCB0aW1lb3V0OiAlZCcsIGNvbm5lY3RUaW1lb3V0KTtcbiAgICBjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gLTEpIHtcbiAgICAgICAgc3RhdHVzQ29kZSA9IC0yO1xuICAgICAgfVxuICAgICAgdmFyIG1zZyA9ICdDb25uZWN0IHRpbWVvdXQgZm9yICcgKyBjb25uZWN0VGltZW91dCArICdtcyc7XG4gICAgICB2YXIgZXJyb3JOYW1lID0gJ0Nvbm5lY3Rpb25UaW1lb3V0RXJyb3InO1xuICAgICAgaWYgKCFyZXEuc29ja2V0KSB7XG4gICAgICAgIGVycm9yTmFtZSA9ICdTb2NrZXRBc3NpZ25UaW1lb3V0RXJyb3InO1xuICAgICAgICBtc2cgKz0gJywgd29ya2luZyBzb2NrZXRzIGlzIGZ1bGwnO1xuICAgICAgfVxuICAgICAgX19lcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgICAgIF9fZXJyLm5hbWUgPSBlcnJvck5hbWU7XG4gICAgICBfX2Vyci5yZXF1ZXN0SWQgPSByZXFJZDtcbiAgICAgIGRlYnVnKCdDb25uZWN0VGltZW91dDogUmVxdWVzdCMlZCAlcyAlczogJXMsIGNvbm5lY3RlZDogJXMnLCByZXFJZCwgdXJsLCBfX2Vyci5uYW1lLCBtc2csIGNvbm5lY3RlZCk7XG4gICAgICBhYm9ydFJlcXVlc3QoKTtcbiAgICB9LCBjb25uZWN0VGltZW91dCk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydFJlc3Bvc25lVGltZXIoKSB7XG4gICAgZGVidWcoJ1Jlc3BvbnNlIHRpbWVyIHRpY2tpbmcsIHRpbWVvdXQ6ICVkJywgcmVzcG9uc2VUaW1lb3V0KTtcbiAgICByZXNwb25zZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXNwb25zZVRpbWVyID0gbnVsbDtcbiAgICAgIHZhciBtc2cgPSAnUmVzcG9uc2UgdGltZW91dCBmb3IgJyArIHJlc3BvbnNlVGltZW91dCArICdtcyc7XG4gICAgICB2YXIgZXJyb3JOYW1lID0gJ1Jlc3BvbnNlVGltZW91dEVycm9yJztcbiAgICAgIF9fZXJyID0gbmV3IEVycm9yKG1zZyk7XG4gICAgICBfX2Vyci5uYW1lID0gZXJyb3JOYW1lO1xuICAgICAgX19lcnIucmVxdWVzdElkID0gcmVxSWQ7XG4gICAgICBkZWJ1ZygnUmVzcG9uc2VUaW1lb3V0OiBSZXF1ZXN0IyVkICVzICVzOiAlcywgY29ubmVjdGVkOiAlcycsIHJlcUlkLCB1cmwsIF9fZXJyLm5hbWUsIG1zZywgY29ubmVjdGVkKTtcbiAgICAgIGFib3J0UmVxdWVzdCgpO1xuICAgIH0sIHJlc3BvbnNlVGltZW91dCk7XG4gIH1cblxuICB2YXIgcmVxO1xuICAvLyByZXF1ZXN0IGhlYWRlcnMgY2hlY2tlciB3aWxsIHRocm93IGVycm9yXG4gIG9wdGlvbnMubW9kZSA9IGFyZ3MubW9kZSA/IGFyZ3MubW9kZSA6ICcnO1xuICB0cnkge1xuICAgIHJlcSA9IGh0dHBsaWIucmVxdWVzdChvcHRpb25zLCBvblJlc3BvbnNlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgfVxuXG4gIC8vIGVudmlyb25tZW50IGRldGVjdGlvbjogYnJvd3NlciBvciBub2RlanNcbiAgaWYgKHR5cGVvZih3aW5kb3cpID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIHN0YXJ0IGNvbm5lY3QgdGltZXIganVzdCBhZnRlciBgcmVxdWVzdGAgcmV0dXJuLCBhbmQganVzdCBpbiBub2RlanMgZW52aXJvbm1lbnRcbiAgICBzdGFydENvbm5lY3RUaW1lcigpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5vbigncmVxdWVzdFRpbWVvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gLTEpIHtcbiAgICAgICAgc3RhdHVzQ29kZSA9IC0yO1xuICAgICAgfVxuICAgICAgdmFyIG1zZyA9ICdDb25uZWN0IHRpbWVvdXQgZm9yICcgKyBjb25uZWN0VGltZW91dCArICdtcyc7XG4gICAgICB2YXIgZXJyb3JOYW1lID0gJ0Nvbm5lY3Rpb25UaW1lb3V0RXJyb3InO1xuICAgICAgX19lcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgICAgIF9fZXJyLm5hbWUgPSBlcnJvck5hbWU7XG4gICAgICBfX2Vyci5yZXF1ZXN0SWQgPSByZXFJZDtcbiAgICAgIGFib3J0UmVxdWVzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWJvcnRSZXF1ZXN0KCkge1xuICAgIGRlYnVnKCdSZXF1ZXN0IyVkICVzIGFib3J0LCBjb25uZWN0ZWQ6ICVzJywgcmVxSWQsIHVybCwgY29ubmVjdGVkKTtcbiAgICAvLyBpdCB3b250IGNhc2UgZXJyb3IgZXZlbnQgd2hlbiByZXEgaGF2ZW4ndCBiZWVuIGFzc2lnbmVkIGEgc29ja2V0IHlldC5cbiAgICBpZiAoIXJlcS5zb2NrZXQpIHtcbiAgICAgIF9fZXJyLm5vU29ja2V0ID0gdHJ1ZTtcbiAgICAgIGRvbmUoX19lcnIpO1xuICAgIH1cbiAgICByZXEuYWJvcnQoKTtcbiAgfVxuXG4gIGlmICh0aW1pbmcpIHtcbiAgICAvLyByZXF1ZXN0IHNlbnRcbiAgICByZXEub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uKCkge1xuICAgICAgdGltaW5nLnJlcXVlc3RTZW50ID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWU7XG4gICAgfSk7XG4gIH1cblxuICByZXEub25jZSgnc29ja2V0JywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIGlmICh0aW1pbmcpIHtcbiAgICAgIC8vIHNvY2tldCBxdWV1aW5nIHRpbWVcbiAgICAgIHRpbWluZy5xdWV1aW5nID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWU7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9uZXQuanMjTDM3N1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3YwLjEwLjQwLXJlbGVhc2UvbGliL25ldC5qcyNMMzUyXG4gICAgLy8gc2hvdWxkIHVzZSBzb2NrZXQuc29ja2V0IG9uIDAuMTAueFxuICAgIGlmIChpc05vZGUwMTAgJiYgc29ja2V0LnNvY2tldCkge1xuICAgICAgc29ja2V0ID0gc29ja2V0LnNvY2tldDtcbiAgICB9XG5cbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHNvY2tldC5yZWFkeVN0YXRlO1xuICAgIGlmIChyZWFkeVN0YXRlID09PSAnb3BlbmluZycpIHtcbiAgICAgIHNvY2tldC5vbmNlKCdsb29rdXAnLCBmdW5jdGlvbihlcnIsIGlwLCBhZGRyZXNzVHlwZSkge1xuICAgICAgICBkZWJ1ZygnUmVxdWVzdCMlZCAlcyBsb29rdXA6ICVzLCAlcywgJXMnLCByZXFJZCwgdXJsLCBlcnIsIGlwLCBhZGRyZXNzVHlwZSk7XG4gICAgICAgIGlmICh0aW1pbmcpIHtcbiAgICAgICAgICB0aW1pbmcuZG5zbG9va3VwID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlwKSB7XG4gICAgICAgICAgcmVtb3RlQWRkcmVzcyA9IGlwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNvY2tldC5vbmNlKCdjb25uZWN0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aW1pbmcpIHtcbiAgICAgICAgICAvLyBzb2NrZXQgY29ubmVjdGVkXG4gICAgICAgICAgdGltaW5nLmNvbm5lY3RlZCA9IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FuY2VsIHNvY2tldCB0aW1lciBhdCBmaXJzdCBhbmQgc3RhcnQgdGljayBmb3IgVFRGQlxuICAgICAgICBjYW5jZWxDb25uZWN0VGltZXIoKTtcbiAgICAgICAgc3RhcnRSZXNwb3NuZVRpbWVyKCk7XG5cbiAgICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXMgbmV3IHNvY2tldCBjb25uZWN0ZWQnLCByZXFJZCwgdXJsKTtcbiAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFyZW1vdGVBZGRyZXNzKSB7XG4gICAgICAgICAgcmVtb3RlQWRkcmVzcyA9IHNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIHJlbW90ZVBvcnQgPSBzb2NrZXQucmVtb3RlUG9ydDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRlYnVnKCdSZXF1ZXN0IyVkICVzIHJldXNlIHNvY2tldCBjb25uZWN0ZWQsIHJlYWR5U3RhdGU6ICVzJywgcmVxSWQsIHVybCwgcmVhZHlTdGF0ZSk7XG4gICAgY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBrZWVwQWxpdmVTb2NrZXQgPSB0cnVlO1xuICAgIGlmICghcmVtb3RlQWRkcmVzcykge1xuICAgICAgcmVtb3RlQWRkcmVzcyA9IHNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgIH1cbiAgICByZW1vdGVQb3J0ID0gc29ja2V0LnJlbW90ZVBvcnQ7XG5cbiAgICAvLyByZXVzZSBzb2NrZXQsIHRpbWVyIHNob3VsZCBiZSBjYW5jZWxlZC5cbiAgICBjYW5jZWxDb25uZWN0VGltZXIoKTtcbiAgICBzdGFydFJlc3Bvc25lVGltZXIoKTtcbiAgfSk7XG5cbiAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAvL1R5cGVFcnJvciBmb3IgYnJvd3NlciBmZXRjaCBhcGksIEVycm9yIGZvciBicm93c2VyIHhtbGh0dHByZXF1ZXN0IGFwaVxuICAgIGlmIChlcnIubmFtZSA9PT0gJ0Vycm9yJyB8fCBlcnIubmFtZSA9PT0gJ1R5cGVFcnJvcicpIHtcbiAgICAgIGVyci5uYW1lID0gY29ubmVjdGVkID8gJ1Jlc3BvbnNlRXJyb3InIDogJ1JlcXVlc3RFcnJvcic7XG4gICAgfVxuICAgIGVyci5tZXNzYWdlICs9ICcgKHJlcSBcImVycm9yXCIpJztcbiAgICBkZWJ1ZygnUmVxdWVzdCMlZCAlcyBgcmVxIGVycm9yYCBldmVudCBlbWl0LCAlczogJXMnLCByZXFJZCwgdXJsLCBlcnIubmFtZSwgZXJyLm1lc3NhZ2UpO1xuICAgIGRvbmUoX19lcnIgfHwgZXJyKTtcbiAgfSk7XG5cbiAgaWYgKHdyaXRlU3RyZWFtKSB7XG4gICAgd3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSArPSAnICh3cml0ZVN0cmVhbSBcImVycm9yXCIpJztcbiAgICAgIF9fZXJyID0gZXJyO1xuICAgICAgZGVidWcoJ1JlcXVlc3QjJWQgJXMgYHdyaXRlU3RyZWFtIGVycm9yYCBldmVudCBlbWl0LCAlczogJXMnLCByZXFJZCwgdXJsLCBlcnIubmFtZSwgZXJyLm1lc3NhZ2UpO1xuICAgICAgYWJvcnRSZXF1ZXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXJncy5zdHJlYW0pIHtcbiAgICBhcmdzLnN0cmVhbS5waXBlKHJlcSk7XG4gICAgYXJncy5zdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSArPSAnIChzdHJlYW0gXCJlcnJvclwiKSc7XG4gICAgICBfX2VyciA9IGVycjtcbiAgICAgIGRlYnVnKCdSZXF1ZXN0IyVkICVzIGByZWFkU3RyZWFtIGVycm9yYCBldmVudCBlbWl0LCAlczogJXMnLCByZXFJZCwgdXJsLCBlcnIubmFtZSwgZXJyLm1lc3NhZ2UpO1xuICAgICAgYWJvcnRSZXF1ZXN0KCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVxLmVuZChib2R5KTtcbiAgfVxuXG4gIHJlcS5yZXF1ZXN0SWQgPSByZXFJZDtcbiAgcmV0dXJuIHJlcTtcbn07Il19 - diff --git a/dist/aliyun-oss-sdk.min.js b/dist/aliyun-oss-sdk.min.js index 934306d4c..cf02c670a 100644 --- a/dist/aliyun-oss-sdk.min.js +++ b/dist/aliyun-oss-sdk.min.js @@ -1,17 +1,18 @@ // Aliyun OSS SDK for JavaScript v6.5.0 // Copyright Aliyun.com, Inc. or its affiliates. All Rights Reserved. // License at https://github.com/ali-sdk/ali-oss/blob/master/LICENSE -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.OSS=t()}}(function(){var t;return function(){function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=r[s]={exports:{}};e[s][0].call(l.exports,function(t){return i(e[s][1][t]||t)},l,l.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;s0?e["Content-Type"]=t.mime:e["Content-Type"]=v.getType(t.mime||b.extname(t.object||""))||"application/octet-stream"),t.content&&(e["Content-Md5"]=y.createHash("md5").update(n.from(t.content,"utf8")).digest("base64"),e["Content-Length"]||(e["Content-Length"]=t.content.length));var r=this._getResource(t);e.authorization=this.authorization(t.method,r,t.subres,e);var i=this._getReqUrl(t);this.debug("request %s %s, with headers %j, !!stream: %s",t.method,i,e,!!t.stream,"info");var s=t.timeout||this.options.timeout;return{url:i,params:{agent:this.agent,method:t.method,content:t.content,stream:t.stream,headers:e,timeout:s,writeStream:t.writeStream,customResponse:t.customResponse,ctx:t.ctx||this.ctx}}},L.request=function(t){var e,r,n,i,o,s;return f.default.async(function(a){for(;;)switch(a.prev=a.next){case 0:return e=this.createRequest(t),this.options.useFetch||(e.params.mode="disable-fetch"),r=void 0,n=void 0,i=!!t.stream,a.prev=5,a.next=8,f.default.awrap(this.urllib.request(e.url,e.params));case 8:r=a.sent,this.debug("response %s %s, got %s, headers: %j",t.method,e.url,r.status,r.headers,"info"),a.next=15;break;case 12:a.prev=12,a.t0=a.catch(5),n=a.t0;case 15:if(o=void 0,!r||!t.successStatuses||-1!==t.successStatuses.indexOf(r.status)){a.next=28;break}return a.next=19,f.default.awrap(this.requestError(r));case 19:if(o=a.sent,"RequestTimeTooSkewed"!==o.code||i){a.next=25;break}return this.options.amendTimeSkewed=+new Date(o.serverTime)-new Date,a.next=24,f.default.awrap(this.request(t));case 24:return a.abrupt("return",a.sent);case 25:o.params=t,a.next=32;break;case 28:if(!n){a.next=32;break}return a.next=31,f.default.awrap(this.requestError(n));case 31:o=a.sent;case 32:if(!o){a.next=34;break}throw o;case 34:if(!t.xmlResponse){a.next=39;break}return a.next=37,f.default.awrap(this.parseXML(r.data));case 37:s=a.sent,r.data=s;case 39:return a.abrupt("return",r);case 40:case"end":return a.stop()}},null,this,[[5,12]])},L._getResource=function(t){var e="/";return t.bucket&&(e+=t.bucket+"/"),t.object&&(e+=t.object),e},L._isIP=k,L._escape=function(t){return O.encodeURIComponent(t).replace(/%2F/g,"/")},L._getReqUrl=function(t){var e={};g(this.options.endpoint).to(e);var r=this._isIP(e.hostname),n=this.options.cname;!t.bucket||n||r||(e.host=t.bucket+"."+e.host);var i="/";t.bucket&&r&&(i+=t.bucket+"/"),t.object&&(i+=this._escape(t.object).replace(/\+/g,"%2B")),e.pathname=i;var o={};if(t.query&&x(o,t.query),t.subres){var s={};E.string(t.subres)?s[t.subres]="":E.array(t.subres)?t.subres.forEach(function(t){s[t]=""}):s=t.subres,x(o,s)}return e.query=o,T.format(e)},L._getUserAgent=function(){var t=r&&r.browser?"js":"nodejs",e="aliyun-sdk-"+t+"/"+P.version,n=S.description;return!n&&r&&(n="Node.js "+r.version.slice(1)+" on "+r.platform+" "+r.arch),this._checkUserAgent(e+" "+n)},L._checkUserAgent=function(t){return t.replace(/\u03b1/,"alpha").replace(/\u03b2/,"beta")},L.checkBrowserAndVersion=function(t,e){return I.name===t&&I.version.split(".")[0]===e},L.parseXML=function(t){return new l.default(function(e,r){n.isBuffer(t)&&(t=t.toString()),w.parseString(t,{explicitRoot:!1,explicitArray:!1},function(t,n){t?r(t):e(n)})})},L.requestError=function(t){var e,r,n,i;return f.default.async(function(o){for(;;)switch(o.prev=o.next){case 0:if(e=null,t.data&&t.data.length){o.next=5;break}-1===t.status||-2===t.status?(e=new Error(t.message),e.name=t.name,e.status=t.status,e.code=t.name):(404===t.status?(e=new Error("Object not exists"),e.name="NoSuchKeyError",e.status=404,e.code="NoSuchKey"):412===t.status?(e=new Error("Pre condition failed"),e.name="PreconditionFailedError",e.status=412,e.code="PreconditionFailed"):(e=new Error("Unknow error, status: "+t.status),e.name="UnknowError",e.status=t.status),e.requestId=t.headers["x-oss-request-id"],e.host=""),o.next=33;break;case 5:return r=String(t.data),this.debug("request response error data: %s",r,"error"),n=void 0,o.prev=8,o.next=11,f.default.awrap(this.parseXML(r));case 11:if(o.t0=o.sent,o.t0){o.next=14;break}o.t0={};case 14:n=o.t0,o.next=24;break;case 17:return o.prev=17,o.t1=o.catch(8),this.debug(r,"error"),o.t1.message+="\nraw xml: "+r,o.t1.status=t.status,o.t1.requestId=t.headers["x-oss-request-id"],o.abrupt("return",o.t1);case 24:i=n.Message||"unknow request error, status: "+t.status,n.Condition&&(i+=" (condition: "+n.Condition+")"),e=new Error(i),e.name=n.Code?n.Code+"Error":"UnknowError",e.status=t.status,e.code=n.Code,e.requestId=n.RequestId,e.hostId=n.HostId,e.serverTime=n.ServerTime;case 33:return this.debug("generate error %j",e,"error"),o.abrupt("return",e);case 35:case"end":return o.stop()}},null,this,[[8,17]])}}).call(this,t("_process"),t("buffer").Buffer)},{"../common/client/initOptions":7,"../common/multipart":8,"../common/parallel":13,"../common/signUtils":14,"../common/utils/checkBucketName":15,"../common/utils/isIP":19,"./../../shims/crypto/crypto.js":306,"./managed-upload":3,"./object":4,"./version":5,_process:227,agentkeepalive:22,"babel-runtime/core-js/object/assign":28,"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44,bowser:46,buffer:49,"copy-to":52,dateformat:166,debug:167,"is-type-of":212,"merge-descriptors":215,mime:311,path:224,platform:225,url:257,urllib:313,utility:312,xml2js:271}],3:[function(t,e,r){(function(e){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(this instanceof i))return new i(t,e);g.call(this,e),this.file=t,this.reader=new FileReader,this.start=0,this.finish=!1,this.fileBuffer=null}var o=t("babel-runtime/core-js/array/from"),s=n(o),a=t("babel-runtime/core-js/promise"),c=n(a),u=t("babel-runtime/regenerator"),l=n(u),p=t("is-type-of"),f=t("util"),d=t("path"),h=t("mime"),m=t("copy-to"),y=r;y.multipartUpload=function(t,e,r){var n,i,o,s,a,c,u,f,m;return l.default.async(function(y){for(;;)switch(y.prev=y.next){case 0:if(this.resetCancelFlag(),r=r||{},!r.checkpoint||!r.checkpoint.uploadId){y.next=6;break}return y.next=5,l.default.awrap(this._resumeMultipart(r.checkpoint,r));case 5:return y.abrupt("return",y.sent);case 6:return n=102400,r.mime||(p.file(e)?r.mime=h.getType(d.extname(e.name)):p.blob(e)?r.mime=e.type:r.mime=h.getType(d.extname(e))),r.headers=r.headers||{},this._convertMetaToHeaders(r.meta,r.headers),y.next=12,l.default.awrap(this._getFileSize(e));case 12:if(!((i=y.sent)0&&m(u).to(f),d=this._divideParts(i,o),h=d.length,y=!1,b=function(r,i){var o=this;return new c.default(function(s,c){var f,b,g,v;return l.default.async(function(o){for(;;)switch(o.prev=o.next){case 0:if(o.prev=0,r.isCancel()){o.next=18;break}return f=d[i-1],b={stream:r._createStream(n,f.start,f.end),size:f.end-f.start},o.next=6,l.default.awrap(r._uploadPart(p,a,i,b));case 6:if(g=o.sent,r.isCancel()||y){o.next=15;break}if(t.doneParts.push({number:i,etag:g.res.headers.etag}),!e.progress){o.next=12;break}return o.next=12,l.default.awrap(e.progress(u.length/h,t,g.res));case 12:s({number:i,etag:g.res.headers.etag}),o.next=16;break;case 15:s();case 16:o.next=19;break;case 18:s();case 19:o.next=30;break;case 21:o.prev=21,o.t0=o.catch(0),v=new Error,v.name=o.t0.name,v.message=o.t0.message,v.stack=o.t0.stack,v.partNum=i,m(o.t0).to(v),c(v);case 30:case"end":return o.stop()}},null,o,[[0,21]])})},g=(0,s.default)(new Array(h),function(t,e){return e+1}),v=f.map(function(t){return t.number}),w=g.filter(function(t){return v.indexOf(t)<0}),_=5,x=e.parallel||_,E.next=17,l.default.awrap(this._parallel(w,x,function(t){return new c.default(function(e,n){b(r,t).then(function(t){t&&f.push(t),e()}).catch(function(t){n(t)})})}));case 17:if(T=E.sent,y=!0,!this.isCancel()){E.next=22;break}throw b=null,this._makeCancelEvent();case 22:if(!(T&&T.length>0)){E.next=25;break}throw T[0].message="Failed to upload some parts with error: "+T[0].toString()+" part_num: "+T[0].partNum,T[0];case 25:return E.next=27,l.default.awrap(this.completeMultipartUpload(p,a,f,e));case 27:return E.abrupt("return",E.sent);case 28:case"end":return E.stop()}},null,this)},p.file=function(t){return"undefined"!=typeof File&&t instanceof File},p.blob=function(t){return"undefined"!=typeof Blob&&t instanceof Blob},y._getFileSize=function(t){var e;return l.default.async(function(r){for(;;)switch(r.prev=r.next){case 0:if(!p.buffer(t)){r.next=4;break}return r.abrupt("return",t.length);case 4:if(!p.blob(t)&&!p.file(t)){r.next=6;break}return r.abrupt("return",t.size);case 6:if(!p.string(t)){r.next=11;break}return r.next=9,l.default.awrap(this._statFile(t));case 9:return e=r.sent,r.abrupt("return",e.size);case 11:throw new Error("_getFileSize requires Buffer/File/String.");case 12:case"end":return r.stop()}},null,this)};var b=t("stream"),g=b.Readable;f.inherits(i,g),i.prototype.readFileAndPush=function(t){if(this.fileBuffer)for(var e=!0;e&&this.fileBuffer&&this.startthis.fileBuffer.length?this.fileBuffer.length:n,this.start=n,e=this.push(this.fileBuffer.slice(r,n))}},i.prototype._read=function(t){if(this.file&&this.start>=this.file.size||this.fileBuffer&&this.start>=this.fileBuffer.length||this.finish||0===this.start&&!this.file)return this.finish||(this.fileBuffer=null,this.finish=!0),void this.push(null);t=t||16384;var r=this;this.reader.onload=function(n){r.fileBuffer=e.from(new Uint8Array(n.target.result)),r.file=null,r.readFileAndPush(t)},0===this.start?this.reader.readAsArrayBuffer(this.file):this.readFileAndPush(t)},y._createStream=function(t,e,r){if(p.blob(t)||p.file(t))return new i(t.slice(e,r));throw new Error("_createStream requires File/String.")},y._getPartSize=function(t,e){return e?Math.max(Math.ceil(t/1e4),e):1048576},y._divideParts=function(t,e){for(var r=Math.ceil(t/e),n=[],i=0;i\n\n',e.quiet?r+=" true\n":r+=" false\n",n=0;n"+l.escape(this._objectName(t[n]))+"\n";return r+="",this.debug("delete multi objects: %s",r,"info"),e.subres="delete",i=this._objectRequestParams("POST","",e),i.mime="xml",i.content=r,i.xmlResponse=!0,i.successStatuses=[200],c.next=14,u.default.awrap(this.request(i));case 14:return o=c.sent,s=o.data,a=s&&s.Deleted||null,a&&(Array.isArray(a)||(a=[a]),a=a.map(function(t){return t.Key})),c.abrupt("return",{res:o.res,deleted:a});case 19:case"end":return c.stop()}},null,this)},v(w,t("../common/object/copyObject")),v(w,t("../common/object/getObjectTagging")),v(w,t("../common/object/putObjectTagging")),v(w,t("../common/object/deleteObjectTagging")),w.putMeta=function(t,e,r){var n;return u.default.async(function(i){for(;;)switch(i.prev=i.next){case 0:return i.next=2,u.default.awrap(this.copy(t,t,{meta:e||{},timeout:r&&r.timeout,ctx:r&&r.ctx}));case 2:return n=i.sent,i.abrupt("return",n);case 4:case"end":return i.stop()}},null,this)},w.list=function(t,e){var r,n,i,o,s;return u.default.async(function(a){for(;;)switch(a.prev=a.next){case 0:return r=this._objectRequestParams("GET","",e),r.query=t,r.xmlResponse=!0,r.successStatuses=[200],a.next=6,u.default.awrap(this.request(r));case 6:return n=a.sent,i=n.data.Contents,o=this,i&&(Array.isArray(i)||(i=[i]),i=i.map(function(t){return{name:t.Key,url:o._objectUrl(t.Key),lastModified:t.LastModified,etag:t.ETag,type:t.Type,size:Number(t.Size),storageClass:t.StorageClass,owner:{id:t.Owner.ID,displayName:t.Owner.DisplayName}}})),s=n.data.CommonPrefixes||null,s&&(Array.isArray(s)||(s=[s]),s=s.map(function(t){return t.Prefix})),a.abrupt("return",{res:n.res,objects:i,prefixes:s,nextMarker:n.data.NextMarker||null,isTruncated:"true"===n.data.IsTruncated});case 13:case"end":return a.stop()}},null,this)},w.putACL=function(t,e,r){var n,i;return u.default.async(function(o){for(;;)switch(o.prev=o.next){case 0:return r=r||{},r.subres="acl",r.headers=r.headers||{},r.headers["x-oss-object-acl"]=e,t=this._objectName(t),n=this._objectRequestParams("PUT",t,r),n.successStatuses=[200],o.next=9,u.default.awrap(this.request(n));case 9:return i=o.sent,o.abrupt("return",{res:i.res});case 11:case"end":return o.stop()}},null,this)},w.getACL=function(t,e){var r,n;return u.default.async(function(i){for(;;)switch(i.prev=i.next){case 0:return e=e||{},e.subres="acl",t=this._objectName(t),r=this._objectRequestParams("GET",t,e),r.successStatuses=[200],r.xmlResponse=!0,i.next=8,u.default.awrap(this.request(r));case 8:return n=i.sent,i.abrupt("return",{acl:n.data.AccessControlList.Grant,owner:{id:n.data.Owner.ID,displayName:n.data.Owner.DisplayName},res:n.res});case 10:case"end":return i.stop()}},null,this)},w.restore=function(t,e){var r,n;return u.default.async(function(i){for(;;)switch(i.prev=i.next){case 0:return e=e||{},e.subres="restore",r=this._objectRequestParams("POST",t,e),r.successStatuses=[202],i.next=6,u.default.awrap(this.request(r));case 6:return n=i.sent,i.abrupt("return",{res:n.res});case 8:case"end":return i.stop()}},null,this)},w.signatureUrl=function(t,e){e=e||{},t=this._objectName(t),e.method=e.method||"GET";var r=l.timestamp()+(e.expires||1800),n={bucket:this.options.bucket,object:t},i=this._getResource(n);this.options.stsToken&&(e["security-token"]=this.options.stsToken);var o=g._signatureForURL(this.options.accessKeySecret,e,i,r),s=d.parse(this._getReqUrl(n));return s.query={OSSAccessKeyId:this.options.accessKeyId,Expires:r,Signature:o.Signature},h(o.subResource).to(s.query),s.format()},w.getObjectUrl=function(t,e){return e?"/"!==e[e.length-1]&&(e+="/"):e=this.options.endpoint.format(),e+this._escape(this._objectName(t))},w._objectUrl=function(t){return this._getReqUrl({bucket:this.options.bucket,object:t})},w.generateObjectUrl=function(t,e){if(e)"/"!==e[e.length-1]&&(e+="/");else{e=this.options.endpoint.format();var r=d.parse(e),n=this.options.bucket;r.hostname=n+"."+r.hostname,r.host=n+"."+r.host,e=r.format()}return e+this._escape(this._objectName(t))},w._objectRequestParams=function(t,e,r){if(!this.options.bucket)throw new Error("Please create a bucket first");r=r||{},e=this._objectName(e);var n={object:e,bucket:this.options.bucket,method:t,subres:r&&r.subres,timeout:r&&r.timeout,ctx:r&&r.ctx};return r.headers&&(n.headers={},h(r.headers).to(n.headers)),n},w._objectName=function(t){return t.replace(/^\/+/,"")},w._statFile=function(t){return new o.default(function(e,r){p.stat(t,function(t,n){t?r(t):e(n)})})},w._convertMetaToHeaders=function(t,e){t&&(0,a.default)(t).forEach(function(r){e["x-oss-meta-"+r]=t[r]})},w._deleteFileSafe=function(t){var e=this;return new o.default(function(r){p.exists(t,function(n){n?p.unlink(t,function(n){n&&e.debug("unlink %j error: %s",t,n,"error"),r()}):r()})})}},{"../common/callback":6,"../common/object/copyObject":9,"../common/object/deleteObjectTagging":10,"../common/object/getObjectTagging":11,"../common/object/putObjectTagging":12,"../common/signUtils":14,"babel-runtime/core-js/object/keys":34,"babel-runtime/core-js/promise":35,"babel-runtime/regenerator":44,"copy-to":52,fs:47,"is-type-of":212,"merge-descriptors":215,mime:311,path:224,url:257,utility:312}],5:[function(t,e,r){"use strict";r.version="6.5.0"},{}],6:[function(t,e,r){(function(e){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var i=t("babel-runtime/core-js/object/keys"),o=n(i),s=t("babel-runtime/core-js/json/stringify"),a=n(s);r.encodeCallback=function(t,r){if(t.headers=t.headers||{},!Object.prototype.hasOwnProperty.call(t.headers,"x-oss-callback")&&r.callback){var n={callbackUrl:encodeURI(r.callback.url),callbackBody:r.callback.body};r.callback.host&&(n.callbackHost=r.callback.host),r.callback.contentType&&(n.callbackBodyType=r.callback.contentType);var i=e.from((0,a.default)(n)).toString("base64");if(t.headers["x-oss-callback"]=i,r.callback.customValue){var s={};(0,o.default)(r.callback.customValue).forEach(function(t){s["x:"+t]=r.callback.customValue[t]}),t.headers["x-oss-callback-var"]=e.from((0,a.default)(s)).toString("base64")}}}}).call(this,t("buffer").Buffer)},{"babel-runtime/core-js/json/stringify":27,"babel-runtime/core-js/object/keys":34,buffer:49}],7:[function(t,e,r){"use strict";function n(t,e){var r=c.parse(t);if(r.protocol||(r=c.parse("http"+(e?"s":"")+"://"+t)),"http:"!==r.protocol&&"https:"!==r.protocol)throw new Error("Endpoint protocol must be http or https.");return r}function i(t,e,r){var n=r?"https://":"http://",i=e?"-internal.aliyuncs.com":".aliyuncs.com";return"vpc100-oss-cn-"===t.substr(0,"vpc100-oss-cn-".length)&&(i=".aliyuncs.com"),c.parse(n+t+i)}var o=t("babel-runtime/core-js/object/assign"),s=function(t){return t&&t.__esModule?t:{default:t}}(o),a=t("humanize-ms"),c=t("url"),u=t("../utils/checkBucketName");e.exports=function(t){if(!t||!t.accessKeyId||!t.accessKeySecret)throw new Error("require accessKeyId, accessKeySecret");if(t.bucket&&!u(t.bucket))throw new Error("The bucket must be conform to the specifications");var e=(0,s.default)({region:"oss-cn-hangzhou",internal:!1,secure:!1,timeout:6e4,bucket:null,endpoint:null,cname:!1,isRequestPay:!1,sldEnable:!1},t);if(e.accessKeyId=e.accessKeyId.trim(),e.accessKeySecret=e.accessKeySecret.trim(),e.timeout&&(e.timeout=a(e.timeout)),e.endpoint)e.endpoint=n(e.endpoint,e.secure);else{if(!e.region)throw new Error("require options.endpoint or options.region");e.endpoint=i(e.region,e.internal,e.secure)}return e.inited=!0,e}},{"../utils/checkBucketName":15,"babel-runtime/core-js/object/assign":28,"humanize-ms":203,url:257}],8:[function(t,e,r){"use strict";var n=t("babel-runtime/regenerator"),i=function(t){return t&&t.__esModule?t:{default:t}}(n),o=t("copy-to"),s=t("./callback"),a=t("./utils/deepCopy"),c=r;c.listUploads=function(t,e){var r,n,s,a;return i.default.async(function(c){for(;;)switch(c.prev=c.next){case 0:return e=e||{},r={},o(e).to(r),r.subres="uploads",n=this._objectRequestParams("GET","",r),n.query=t,n.xmlResponse=!0,n.successStatuses=[200],c.next=10,i.default.awrap(this.request(n));case 10:return s=c.sent,a=s.data.Upload||[],Array.isArray(a)||(a=[a]),a=a.map(function(t){return{name:t.Key,uploadId:t.UploadId,initiated:t.Initiated}}),c.abrupt("return",{res:s.res,uploads:a,bucket:s.data.Bucket,nextKeyMarker:s.data.NextKeyMarker,nextUploadIdMarker:s.data.NextUploadIdMarker,isTruncated:"true"===s.data.IsTruncated});case 15:case"end":return c.stop()}},null,this)},c.listParts=function(t,e,r,n){var s,a,c;return i.default.async(function(u){for(;;)switch(u.prev=u.next){case 0:return n=n||{},s={},o(n).to(s),s.subres={uploadId:e},a=this._objectRequestParams("GET",t,s),a.query=r,a.xmlResponse=!0,a.successStatuses=[200],u.next=10,i.default.awrap(this.request(a));case 10:return c=u.sent,u.abrupt("return",{res:c.res,uploadId:c.data.UploadId,bucket:c.data.Bucket,name:c.data.Key,partNumberMarker:c.data.PartNumberMarker,nextPartNumberMarker:c.data.NextPartNumberMarker,maxParts:c.data.MaxParts,isTruncated:c.data.IsTruncated,parts:c.data.Part||[]});case 12:case"end":return u.stop()}},null,this)},c.abortMultipartUpload=function(t,e,r){var n,s,a;return i.default.async(function(c){for(;;)switch(c.prev=c.next){case 0:return this._stop(),r=r||{},n={},o(r).to(n),n.subres={uploadId:e},s=this._objectRequestParams("DELETE",t,n),s.successStatuses=[204],c.next=9,i.default.awrap(this.request(s));case 9:return a=c.sent,c.abrupt("return",{res:a.res});case 11:case"end":return c.stop()}},null,this)},c.initMultipartUpload=function(t,e){var r,n,s;return i.default.async(function(a){for(;;)switch(a.prev=a.next){case 0:return e=e||{},r={},o(e).to(r),r.headers=r.headers||{},this._convertMetaToHeaders(e.meta,r.headers),r.subres="uploads",n=this._objectRequestParams("POST",t,r),n.mime=e.mime,n.xmlResponse=!0,n.successStatuses=[200],a.next=12,i.default.awrap(this.request(n));case 12:return s=a.sent,a.abrupt("return",{res:s.res,bucket:s.data.Bucket,name:s.data.Key,uploadId:s.data.UploadId});case 14:case"end":return a.stop()}},null,this)},c.uploadPart=function(t,e,r,n,o,s,a){var c;return i.default.async(function(u){for(;;)switch(u.prev=u.next){case 0:return c={stream:this._createStream(n,o,s),size:s-o},u.next=3,i.default.awrap(this._uploadPart(t,e,r,c,a));case 3:return u.abrupt("return",u.sent);case 4:case"end":return u.stop()}},null,this)},c.completeMultipartUpload=function(t,e,r,n){var o,c,u,l,p,f,d,h;return i.default.async(function(m){for(;;)switch(m.prev=m.next){case 0:for(o=r.concat().sort(function(t,e){return t.number-e.number}).filter(function(t,e,r){return!e||t.number!==r[e-1].number}),c='\n\n',u=0;u\n",c+=""+l.number+"\n",c+=""+l.etag+"\n",c+="\n";return c+="",n=n||{},p={},p=a(n),p.headers&&delete p.headers["x-oss-server-side-encryption"],p.subres={uploadId:e},f=this._objectRequestParams("POST",t,p),s.encodeCallback(f,p),f.mime="xml",f.content=c,f.headers&&f.headers["x-oss-callback"]||(f.xmlResponse=!0),f.successStatuses=[200],m.next=17,i.default.awrap(this.request(f));case 17:return d=m.sent,h={res:d.res,bucket:f.bucket,name:t,etag:d.res.headers.etag},f.headers&&f.headers["x-oss-callback"]&&(h.data=JSON.parse(d.data.toString())),m.abrupt("return",h);case 21:case"end":return m.stop()}},null,this)},c._uploadPart=function(t,e,r,n,s){var a,c,u;return i.default.async(function(l){for(;;)switch(l.prev=l.next){case 0:return s=s||{},a={},o(s).to(a),a.headers={"Content-Length":n.size},a.subres={partNumber:r,uploadId:e},c=this._objectRequestParams("PUT",t,a),c.mime=a.mime,c.stream=n.stream,c.successStatuses=[200],l.next=11,i.default.awrap(this.request(c));case 11:if(u=l.sent,u.res.headers.etag){l.next=14;break}throw new Error("Please set the etag of expose-headers in OSS \n https://help.aliyun.com/document_detail/32069.html");case 14:return n.stream=null,c.stream=null,l.abrupt("return",{name:t,etag:u.res.headers.etag,res:u.res});case 17:case"end":return l.stop()}},null,this)}},{"./callback":6,"./utils/deepCopy":18,"babel-runtime/regenerator":44,"copy-to":52}],9:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var i=t("babel-runtime/regenerator"),o=n(i),s=t("babel-runtime/core-js/object/keys"),a=n(s),c=t("babel-runtime/helpers/typeof"),u=n(c),l=r;l.copy=function(t,e,r,n){var i,s,c;return o.default.async(function(l){for(;;)switch(l.prev=l.next){case 0:return"object"===(void 0===r?"undefined":(0, -u.default)(r))&&(n=r),n=n||{},n.headers=n.headers||{},(0,a.default)(n.headers).forEach(function(t){n.headers["x-oss-copy-source-"+t.toLowerCase()]=n.headers[t]}),n.meta&&(n.headers["x-oss-metadata-directive"]="REPLACE"),this._convertMetaToHeaders(n.meta,n.headers),e=this._getSourceName(e,r),n.headers["x-oss-copy-source"]=e,i=this._objectRequestParams("PUT",t,n),i.xmlResponse=!0,i.successStatuses=[200,304],l.next=13,o.default.awrap(this.request(i));case 13:return s=l.sent,c=s.data,c&&(c={etag:c.ETag,lastModified:c.LastModified}),l.abrupt("return",{data:c,res:s.res});case 17:case"end":return l.stop()}},null,this)},l._getSourceName=function(t,e){return"string"==typeof e?t=this._objectName(t):"/"!==t[0]?e=this.options.bucket:(e=t.replace(/\/(.+?)(\/.*)/,"$1"),t=t.replace(/(\/.+?\/)(.*)/,"$2")),this._checkBucketName(e),t="/"+e+"/"+encodeURIComponent(t)}},{"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43,"babel-runtime/regenerator":44}],10:[function(t,e,r){"use strict";var n=t("babel-runtime/regenerator"),i=function(t){return t&&t.__esModule?t:{default:t}}(n);r.deleteObjectTagging=function(t){var e,r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return i.default.async(function(o){for(;;)switch(o.prev=o.next){case 0:return n.subres="tagging",t=this._objectName(t),e=this._objectRequestParams("DELETE",t,n),e.successStatuses=[204],o.next=6,i.default.awrap(this.request(e));case 6:return r=o.sent,o.abrupt("return",{status:r.status,res:r.res});case 8:case"end":return o.stop()}},null,this)}},{"babel-runtime/regenerator":44}],11:[function(t,e,r){"use strict";var n=t("babel-runtime/regenerator"),i=function(t){return t&&t.__esModule?t:{default:t}}(n),o=r,s=t("../utils/isObject");o.getObjectTagging=function(t){var e,r,n,o,a,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return i.default.async(function(u){for(;;)switch(u.prev=u.next){case 0:return c.subres="tagging",t=this._objectName(t),e=this._objectRequestParams("GET",t,c),e.successStatuses=[200],u.next=6,i.default.awrap(this.request(e));case 6:return r=u.sent,u.next=9,i.default.awrap(this.parseXML(r.data));case 9:return n=u.sent,o=n.TagSet.Tag,o=o&&s(o)?[o]:o||[],a={},o.forEach(function(t){a[t.Key]=t.Value}),u.abrupt("return",{status:r.status,res:r.res,tag:a});case 15:case"end":return u.stop()}},null,this)}},{"../utils/isObject":20,"babel-runtime/regenerator":44}],12:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var i=t("babel-runtime/regenerator"),o=n(i),s=t("babel-runtime/core-js/object/keys"),a=n(s),c=t("../utils/obj2xml"),u=t("../utils/checkObjectTag");r.putObjectTagging=function(t,e){var r,n,i,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return o.default.async(function(l){for(;;)switch(l.prev=l.next){case 0:return u(e),s.subres="tagging",t=this._objectName(t),r=this._objectRequestParams("PUT",t,s),r.successStatuses=[200],e=(0,a.default)(e).map(function(t){return{Key:t,Value:e[t]}}),n={Tagging:{TagSet:{Tag:e}}},r.mime="xml",r.content=c(n),l.next=11,o.default.awrap(this.request(r));case 11:return i=l.sent,l.abrupt("return",{res:i.res,status:i.status});case 13:case"end":return l.stop()}},null,this)}},{"../utils/checkObjectTag":16,"../utils/obj2xml":21,"babel-runtime/core-js/object/keys":34,"babel-runtime/regenerator":44}],13:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var i=t("babel-runtime/regenerator"),o=n(i),s=t("babel-runtime/core-js/promise"),a=n(s),c=r;c._parallelNode=function(t,e,r,n){var i,s,c,u,l,p,f,d;return o.default.async(function(h){for(;;)switch(h.prev=h.next){case 0:i=this,s=[],c=[],u=t.length/e,l=t.length%e,p=0===l?u:(t.length-l)/e+1,f=1,d=0;case 8:if(!(d0)return p=!0,void(f<=0&&i(u));f+=1,a(t.value,o(s))}d=!1}var u=[];if(e<=0||!t)return void i(u);var l=function(t){var e=-1,r=t.length;return function(){return++ee[0]?1:t[0]10)throw new Error("maximum of 10 tags for a object");var r=["key","value"];e.forEach(function(t){t.forEach(function(t,e){o(t,c[r[e]])})})}},{"./checkValid":17,"./isObject":20,"babel-runtime/core-js/object/entries":31}],17:[function(t,e,r){"use strict";e.exports=function(t,e){e.forEach(function(e){if(e.validator)e.validator(t);else if(e.pattern&&!e.pattern.test(t))throw new Error(e.msg)})}},{}],18:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}var i=t("babel-runtime/core-js/object/keys"),o=n(i),s=t("babel-runtime/helpers/typeof"),a=n(s);e.exports=function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(null===e||"object"!==(void 0===e?"undefined":(0,a.default)(e)))return e;var n=r.filter(function(t){return t.original===e})[0];if(n)return n.copy;var i=Array.isArray(e)?[]:{};return r.push({original:e,copy:i}),(0,o.default)(e).forEach(function(n){i[n]=t(e[n],r)}),i}},{"babel-runtime/core-js/object/keys":34,"babel-runtime/helpers/typeof":43}],19:[function(t,e,r){"use strict";e.exports=function(t){var e=/^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/,r=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;return e.test(t)||r.test(t)}},{}],20:[function(t,e,r){"use strict";e.exports=function(t){return"[object Object]"===Object.prototype.toString.call(t)}},{}],21:[function(t,e,r){"use strict";function n(t){return Object.prototype.toString.call(t).replace(/(.*? |])/g,"").toLowerCase()}function i(t,e){var r="";return e&&e.headers&&(r='\n'),"object"===n(t)?(0,s.default)(t).forEach(function(e){"string"===n(t[e])||"number"===n(t[e])?r+="<"+e+">"+t[e]+"":"object"===n(t[e])?r+="<"+e+">"+i(t[e])+"":"array"===n(t[e])?r+=t[e].map(function(t){return"<"+e+">"+i(t)+""}).join(""):r+="<"+e+">"+t[e].toString()+""}):r+=t.toString(),r}var o=t("babel-runtime/core-js/object/keys"),s=function(t){return t&&t.__esModule?t:{default:t}}(o);e.exports=i},{"babel-runtime/core-js/object/keys":34}],22:[function(t,e,r){function n(){}e.exports=n,e.exports.HttpsAgent=n},{}],23:[function(t,e,r){e.exports=t("./register")().Promise},{"./register":25}],24:[function(t,e,r){"use strict";var n=null;e.exports=function(t,e){return function(r,i){r=r||null,i=i||{};var o=!1!==i.global;if(null===n&&o&&(n=t["@@any-promise/REGISTRATION"]||null),null!==n&&null!==r&&n.implementation!==r)throw new Error('any-promise already defined as "'+n.implementation+'". You can only register an implementation before the first call to require("any-promise") and an implementation cannot be changed');return null===n&&(n=null!==r&&void 0!==i.Promise?{Promise:i.Promise,implementation:r}:e(r),o&&(t["@@any-promise/REGISTRATION"]=n)),n}}},{}],25:[function(t,e,r){"use strict";function n(){if(void 0===window.Promise)throw new Error("any-promise browser requires a polyfill or explicit registration e.g: require('any-promise/register/bluebird')");return{Promise:window.Promise,implementation:"window.Promise"}}e.exports=t("./loader")(window,n)},{"./loader":24}],26:[function(t,e,r){e.exports={default:t("core-js/library/fn/array/from"),__esModule:!0}},{"core-js/library/fn/array/from":53}],27:[function(t,e,r){e.exports={default:t("core-js/library/fn/json/stringify"),__esModule:!0}},{"core-js/library/fn/json/stringify":54}],28:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/assign"),__esModule:!0}},{"core-js/library/fn/object/assign":55}],29:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/create"),__esModule:!0}},{"core-js/library/fn/object/create":56}],30:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/define-property"),__esModule:!0}},{"core-js/library/fn/object/define-property":57}],31:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/entries"),__esModule:!0}},{"core-js/library/fn/object/entries":58}],32:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/get-own-property-names"),__esModule:!0}},{"core-js/library/fn/object/get-own-property-names":59}],33:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/get-prototype-of"),__esModule:!0}},{"core-js/library/fn/object/get-prototype-of":60}],34:[function(t,e,r){e.exports={default:t("core-js/library/fn/object/keys"),__esModule:!0}},{"core-js/library/fn/object/keys":61}],35:[function(t,e,r){e.exports={default:t("core-js/library/fn/promise"),__esModule:!0}},{"core-js/library/fn/promise":62}],36:[function(t,e,r){e.exports={default:t("core-js/library/fn/set-immediate"),__esModule:!0}},{"core-js/library/fn/set-immediate":63}],37:[function(t,e,r){e.exports={default:t("core-js/library/fn/string/from-code-point"),__esModule:!0}},{"core-js/library/fn/string/from-code-point":64}],38:[function(t,e,r){e.exports={default:t("core-js/library/fn/symbol"),__esModule:!0}},{"core-js/library/fn/symbol":66}],39:[function(t,e,r){e.exports={default:t("core-js/library/fn/symbol/has-instance"),__esModule:!0}},{"core-js/library/fn/symbol/has-instance":65}],40:[function(t,e,r){e.exports={default:t("core-js/library/fn/symbol/iterator"),__esModule:!0}},{"core-js/library/fn/symbol/iterator":67}],41:[function(t,e,r){"use strict";r.__esModule=!0,r.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},{}],42:[function(t,e,r){"use strict";r.__esModule=!0;var n=t("../core-js/object/define-property"),i=function(t){return t&&t.__esModule?t:{default:t}}(n);r.default=function(){function t(t,e){for(var r=0;r0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function i(t){var e=n(t),r=e[0],i=e[1];return 3*(r+i)/4-i}function o(t,e,r){return 3*(e+r)/4-r}function s(t){for(var e,r=n(t),i=r[0],s=r[1],a=new f(o(t,i,s)),c=0,u=s>0?i-4:i,l=0;l>16&255,a[c++]=e>>8&255,a[c++]=255&e;return 2===s&&(e=p[t.charCodeAt(l)]<<2|p[t.charCodeAt(l+1)]>>4,a[c++]=255&e),1===s&&(e=p[t.charCodeAt(l)]<<10|p[t.charCodeAt(l+1)]<<4|p[t.charCodeAt(l+2)]>>2,a[c++]=e>>8&255,a[c++]=255&e),a}function a(t){return l[t>>18&63]+l[t>>12&63]+l[t>>6&63]+l[63&t]}function c(t,e,r){for(var n,i=[],o=e;os?s:o+16383));return 1===n?(e=t[r-1],i.push(l[e>>2]+l[e<<4&63]+"==")):2===n&&(e=(t[r-2]<<8)+t[r-1],i.push(l[e>>10]+l[e>>4&63]+l[e<<2&63]+"=")),i.join("")}r.byteLength=i,r.toByteArray=s,r.fromByteArray=u;for(var l=[],p=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h=0,m=d.length;h1&&r[1]||""}function r(e){var r=t.match(e);return r&&r.length>1&&r[2]||""}var i,o=e(/(ipod|iphone|ipad)/i).toLowerCase(),a=/like android/i.test(t),c=!a&&/android/i.test(t),u=/nexus\s*[0-6]\s*/i.test(t),l=!u&&/nexus\s*[0-9]+/i.test(t),p=/CrOS/.test(t),f=/silk/i.test(t),d=/sailfish/i.test(t),h=/tizen/i.test(t),m=/(web|hpw)(o|0)s/i.test(t),y=/windows phone/i.test(t),b=(/SamsungBrowser/i.test(t),!y&&/windows/i.test(t)),g=!o&&!f&&/macintosh/i.test(t),v=!c&&!d&&!h&&!m&&/linux/i.test(t),w=r(/edg([ea]|ios)\/(\d+(\.\d+)?)/i),_=e(/version\/(\d+(\.\d+)?)/i),x=/tablet/i.test(t)&&!/tablet pc/i.test(t),T=!x&&/[^-]mobi/i.test(t),E=/xbox/i.test(t);/opera/i.test(t)?i={name:"Opera",opera:s,version:_||e(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)}:/opr\/|opios/i.test(t)?i={name:"Opera",opera:s,version:e(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i)||_}:/SamsungBrowser/i.test(t)?i={name:"Samsung Internet for Android",samsungBrowser:s,version:_||e(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)}:/Whale/i.test(t)?i={name:"NAVER Whale browser",whale:s,version:e(/(?:whale)[\s\/](\d+(?:\.\d+)+)/i)}:/MZBrowser/i.test(t)?i={name:"MZ Browser",mzbrowser:s,version:e(/(?:MZBrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/coast/i.test(t)?i={name:"Opera Coast",coast:s,version:_||e(/(?:coast)[\s\/](\d+(\.\d+)?)/i)}:/focus/i.test(t)?i={name:"Focus",focus:s,version:e(/(?:focus)[\s\/](\d+(?:\.\d+)+)/i)}:/yabrowser/i.test(t)?i={name:"Yandex Browser",yandexbrowser:s,version:_||e(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/ucbrowser/i.test(t)?i={name:"UC Browser",ucbrowser:s,version:e(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/mxios/i.test(t)?i={name:"Maxthon",maxthon:s,version:e(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)}:/epiphany/i.test(t)?i={name:"Epiphany",epiphany:s,version:e(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)}:/puffin/i.test(t)?i={name:"Puffin",puffin:s,version:e(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)}:/sleipnir/i.test(t)?i={name:"Sleipnir",sleipnir:s,version:e(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)}:/k-meleon/i.test(t)?i={name:"K-Meleon",kMeleon:s,version:e(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)}:y?(i={name:"Windows Phone",osname:"Windows Phone",windowsphone:s},w?(i.msedge=s,i.version=w):(i.msie=s,i.version=e(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?i={name:"Internet Explorer",msie:s,version:e(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:p?i={name:"Chrome",osname:"Chrome OS",chromeos:s,chromeBook:s,chrome:s,version:e(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/edg([ea]|ios)/i.test(t)?i={name:"Microsoft Edge",msedge:s,version:w}:/vivaldi/i.test(t)?i={name:"Vivaldi",vivaldi:s,version:e(/vivaldi\/(\d+(\.\d+)?)/i)||_}:d?i={name:"Sailfish",osname:"Sailfish OS",sailfish:s,version:e(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?i={name:"SeaMonkey",seamonkey:s,version:e(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel|fxios/i.test(t)?(i={name:"Firefox",firefox:s,version:e(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(i.firefoxos=s,i.osname="Firefox OS")):f?i={name:"Amazon Silk",silk:s,version:e(/silk\/(\d+(\.\d+)?)/i)}:/phantom/i.test(t)?i={name:"PhantomJS",phantom:s,version:e(/phantomjs\/(\d+(\.\d+)?)/i)}:/slimerjs/i.test(t)?i={name:"SlimerJS",slimer:s,version:e(/slimerjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?i={name:"BlackBerry",osname:"BlackBerry OS",blackberry:s,version:_||e(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:m?(i={name:"WebOS",osname:"WebOS",webos:s,version:_||e(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(i.touchpad=s)):/bada/i.test(t)?i={name:"Bada",osname:"Bada",bada:s,version:e(/dolfin\/(\d+(\.\d+)?)/i)}:h?i={name:"Tizen",osname:"Tizen",tizen:s,version:e(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||_}:/qupzilla/i.test(t)?i={name:"QupZilla",qupzilla:s,version:e(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i)||_}:/chromium/i.test(t)?i={name:"Chromium",chromium:s,version:e(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i)||_}:/chrome|crios|crmo/i.test(t)?i={name:"Chrome",chrome:s,version:e(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:c?i={name:"Android",version:_}:/safari|applewebkit/i.test(t)?(i={name:"Safari",safari:s},_&&(i.version=_)):o?(i={name:"iphone"==o?"iPhone":"ipad"==o?"iPad":"iPod"},_&&(i.version=_)):i=/googlebot/i.test(t)?{name:"Googlebot",googlebot:s,version:e(/googlebot\/(\d+(\.\d+))/i)||_}:{name:e(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!i.msedge&&/(apple)?webkit/i.test(t)?(/(apple)?webkit\/537\.36/i.test(t)?(i.name=i.name||"Blink",i.blink=s):(i.name=i.name||"Webkit",i.webkit=s),!i.version&&_&&(i.version=_)):!i.opera&&/gecko\//i.test(t)&&(i.name=i.name||"Gecko",i.gecko=s,i.version=i.version||e(/gecko\/(\d+(\.\d+)?)/i)),i.windowsphone||!c&&!i.silk?!i.windowsphone&&o?(i[o]=s,i.ios=s,i.osname="iOS"):g?(i.mac=s,i.osname="macOS"):E?(i.xbox=s,i.osname="Xbox"):b?(i.windows=s,i.osname="Windows"):v&&(i.linux=s,i.osname="Linux"):(i.android=s,i.osname="Android");var S="";i.windows?S=function(t){switch(t){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}(e(/Windows ((NT|XP)( \d\d?.\d)?)/i)):i.windowsphone?S=e(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i.mac?(S=e(/Mac OS X (\d+([_\.\s]\d+)*)/i),S=S.replace(/[_\s]/g,".")):o?(S=e(/os (\d+([_\s]\d+)*) like mac os x/i),S=S.replace(/[_\s]/g,".")):c?S=e(/android[ \/-](\d+(\.\d+)*)/i):i.webos?S=e(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):i.blackberry?S=e(/rim\stablet\sos\s(\d+(\.\d+)*)/i):i.bada?S=e(/bada\/(\d+(\.\d+)*)/i):i.tizen&&(S=e(/tizen[\/\s](\d+(\.\d+)*)/i)),S&&(i.osversion=S);var O=!i.windows&&S.split(".")[0];return x||l||"ipad"==o||c&&(3==O||O>=4&&!T)||i.silk?i.tablet=s:(T||"iphone"==o||"ipod"==o||c||u||i.blackberry||i.webos||i.bada)&&(i.mobile=s),i.msedge||i.msie&&i.version>=10||i.yandexbrowser&&i.version>=15||i.vivaldi&&i.version>=1||i.chrome&&i.version>=20||i.samsungBrowser&&i.version>=4||i.whale&&1===n([i.version,"1.0"])||i.mzbrowser&&1===n([i.version,"6.0"])||i.focus&&1===n([i.version,"1.0"])||i.firefox&&i.version>=20||i.safari&&i.version>=6||i.opera&&i.version>=10||i.ios&&i.osversion&&i.osversion.split(".")[0]>=6||i.blackberry&&i.version>=10.1||i.chromium&&i.version>=20?i.a=s:i.msie&&i.version<10||i.chrome&&i.version<20||i.firefox&&i.version<20||i.safari&&i.version<6||i.opera&&i.version<10||i.ios&&i.osversion&&i.osversion.split(".")[0]<6||i.chromium&&i.version<20?i.c=s:i.x=s,i}function e(t){return t.split(".").length}function r(t,e){var r,n=[];if(Array.prototype.map)return Array.prototype.map.call(t,e);for(r=0;r=0;){if(i[0][n]>i[1][n])return 1;if(i[0][n]!==i[1][n])return-1;if(0===n)return 0}}function i(e,r,i){var o=a;"string"==typeof r&&(i=r,r=void 0),void 0===r&&(r=!1),i&&(o=t(i));var s=""+o.version;for(var c in e)if(e.hasOwnProperty(c)&&o[c]){if("string"!=typeof e[c])throw new Error("Browser version in the minVersion map should be a string: "+c+": "+String(e));return n([s,e[c]])<0}return r}function o(t,e,r){return!i(t,e,r)}var s=!0,a=t("undefined"!=typeof navigator?navigator.userAgent||"":"");return a.test=function(t){for(var e=0;e=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&n<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var i=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,i),i-=this.charReceived),e+=t.toString(this.encoding,0,i);var i=e.length-1,n=e.charCodeAt(i);if(n>=55296&&n<=56319){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),t.copy(this.charBuffer,0,0,o),e.substring(0,i)}return e},u.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},u.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;e+=n.slice(0,r).toString(i)}return e}},{buffer:49}],49:[function(t,e,r){(function(e){"use strict";function n(){return o.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function i(t,e){if(n()=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|t}function m(t){return+t!=t&&(t=0),o.alloc(+t)}function y(t,e){if(o.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return X(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return W(t).length;default:if(n)return X(t).length;e=(""+e).toLowerCase(),n=!0}}function b(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,e>>>=0,r<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return k(this,e,r);case"utf8":case"utf-8":return P(this,e,r);case"ascii":return I(this,e,r);case"latin1":case"binary":return N(this,e,r);case"base64":return j(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return D(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function v(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=o.from(e,n)),o.isBuffer(e))return 0===e.length?-1:w(t,e,r,n,i);if("number"==typeof e)return e&=255, -o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):w(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function w(t,e,r,n,i){function o(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}var s=1,a=t.length,c=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,c/=2,r/=2}var u;if(i){var l=-1;for(u=r;ua&&(r=a-c),u=r;u>=0;u--){for(var p=!0,f=0;fi&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s239?4:o>223?3:o>191?2:1;if(i+a<=r){var c,u,l,p;switch(a){case 1:o<128&&(s=o);break;case 2:c=t[i+1],128==(192&c)&&(p=(31&o)<<6|63&c)>127&&(s=p);break;case 3:c=t[i+1],u=t[i+2],128==(192&c)&&128==(192&u)&&(p=(15&o)<<12|(63&c)<<6|63&u)>2047&&(p<55296||p>57343)&&(s=p);break;case 4:c=t[i+1],u=t[i+2],l=t[i+3],128==(192&c)&&128==(192&u)&&128==(192&l)&&(p=(15&o)<<18|(63&c)<<12|(63&u)<<6|63&l)>65535&&p<1114112&&(s=p)}}null===s?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|1023&s),n.push(s),i+=a}return A(n)}function A(t){var e=t.length;if(e<=Z)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function M(t,e,r,n,i,s){if(!o.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function L(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function R(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function F(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(t,e,r,n,i){return i||F(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),J.write(t,e,r,n,23,4),r+4}function U(t,e,r,n,i){return i||F(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),J.write(t,e,r,n,52,8),r+8}function q(t){if(t=G(t).replace(tt,""),t.length<2)return"";for(;t.length%4!=0;)t+="=";return t}function G(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function z(t){return t<16?"0"+t.toString(16):t.toString(16)}function X(t,e){e=e||1/0;for(var r,n=t.length,i=null,o=[],s=0;s55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function $(t){for(var e=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function W(t){return Y.toByteArray(q(t))}function H(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function K(t){return t!==t}var Y=t("base64-js"),J=t("ieee754"),Q=t("isarray");r.Buffer=o,r.SlowBuffer=m,r.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}(),r.kMaxLength=n(),o.poolSize=8192,o._augment=function(t){return t.__proto__=o.prototype,t},o.from=function(t,e,r){return s(null,t,e,r)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(t,e,r){return c(null,t,e,r)},o.allocUnsafe=function(t){return u(null,t)},o.allocUnsafeSlow=function(t){return u(null,t)},o.isBuffer=function(t){return!(null==t||!t._isBuffer)},o.compare=function(t,e){if(!o.isBuffer(t)||!o.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,i=0,s=Math.min(r,n);i0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),""},o.prototype.compare=function(t,e,r,n,i){if(!o.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var s=i-n,a=r-e,c=Math.min(s,a),u=this.slice(n,i),l=t.slice(e,r),p=0;pi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return _(this,t,e,r);case"utf8":case"utf-8":return x(this,t,e,r);case"ascii":return T(this,t,e,r);case"latin1":case"binary":return E(this,t,e,r);case"base64":return S(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Z=4096;o.prototype.slice=function(t,e){var r=this.length;t=~~t,e=void 0===e?r:~~e,t<0?(t+=r)<0&&(t=0):t>r&&(t=r),e<0?(e+=r)<0&&(e=0):e>r&&(e=r),e0&&(i*=256);)n+=this[t+--e]*i;return n},o.prototype.readUInt8=function(t,e){return e||C(t,1,this.length),this[t]},o.prototype.readUInt16LE=function(t,e){return e||C(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUInt16BE=function(t,e){return e||C(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUInt32LE=function(t,e){return e||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},o.prototype.readUInt32BE=function(t,e){return e||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=this[t],i=1,o=0;++o=i&&(n-=Math.pow(2,8*e)),n},o.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||C(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},o.prototype.readInt8=function(t,e){return e||C(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},o.prototype.readInt16LE=function(t,e){e||C(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt16BE=function(t,e){e||C(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},o.prototype.readInt32LE=function(t,e){return e||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,e){return e||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readFloatLE=function(t,e){return e||C(t,4,this.length),J.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,e){return e||C(t,4,this.length),J.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,e){return e||C(t,8,this.length),J.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,e){return e||C(t,8,this.length),J.read(this,t,!1,52,8)},o.prototype.writeUIntLE=function(t,e,r,n){if(t=+t,e|=0,r|=0,!n){M(this,t,e,r,Math.pow(2,8*r)-1,0)}var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},o.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,1,255,0),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},o.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},o.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},o.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):R(this,t,e,!0),e+4},o.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):R(this,t,e,!1),e+4},o.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);M(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},o.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);M(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},o.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,1,127,-128),o.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},o.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},o.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},o.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):R(this,t,e,!0),e+4},o.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||M(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),o.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):R(this,t,e,!1),e+4},o.prototype.writeFloatLE=function(t,e,r){return B(this,t,e,!0,r)},o.prototype.writeFloatBE=function(t,e,r){return B(this,t,e,!1,r)},o.prototype.writeDoubleLE=function(t,e,r){return U(this,t,e,!0,r)},o.prototype.writeDoubleBE=function(t,e,r){return U(this,t,e,!1,r)},o.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(s<1e3||!o.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0);var s;if("number"==typeof t)for(s=e;sl;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===r)return t||l||0;return!t&&-1}}},{"./_to-absolute-index":132,"./_to-iobject":134,"./_to-length":135}],73:[function(t,e,r){var n=t("./_cof"),i=t("./_wks")("toStringTag"),o="Arguments"==n(function(){return arguments}()),s=function(t,e){try{return t[e]}catch(t){}};e.exports=function(t){var e,r,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=s(e=Object(t),i))?r:o?n(e):"Object"==(a=n(e))&&"function"==typeof e.callee?"Arguments":a}},{"./_cof":74,"./_wks":142}],74:[function(t,e,r){var n={}.toString;e.exports=function(t){return n.call(t).slice(8,-1)}},{}],75:[function(t,e,r){var n=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},{}],76:[function(t,e,r){"use strict";var n=t("./_object-dp"),i=t("./_property-desc");e.exports=function(t,e,r){e in t?n.f(t,e,i(0,r)):t[e]=r}},{"./_object-dp":108,"./_property-desc":122}],77:[function(t,e,r){var n=t("./_a-function");e.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},{"./_a-function":68}],78:[function(t,e,r){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],79:[function(t,e,r){e.exports=!t("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":84}],80:[function(t,e,r){var n=t("./_is-object"),i=t("./_global").document,o=n(i)&&n(i.createElement);e.exports=function(t){return o?i.createElement(t):{}}},{"./_global":86,"./_is-object":95}],81:[function(t,e,r){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],82:[function(t,e,r){var n=t("./_object-keys"),i=t("./_object-gops"),o=t("./_object-pie");e.exports=function(t){var e=n(t),r=i.f;if(r)for(var s,a=r(t),c=o.f,u=0;a.length>u;)c.call(t,s=a[u++])&&e.push(s);return e}},{"./_object-gops":113,"./_object-keys":116,"./_object-pie":117}],83:[function(t,e,r){var n=t("./_global"),i=t("./_core"),o=t("./_ctx"),s=t("./_hide"),a=t("./_has"),c=function(t,e,r){var u,l,p,f=t&c.F,d=t&c.G,h=t&c.S,m=t&c.P,y=t&c.B,b=t&c.W,g=d?i:i[e]||(i[e]={}),v=g.prototype,w=d?n:h?n[e]:(n[e]||{}).prototype;d&&(r=e);for(u in r)(l=!f&&w&&void 0!==w[u])&&a(g,u)||(p=l?w[u]:r[u],g[u]=d&&"function"!=typeof w[u]?r[u]:y&&l?o(p,n):b&&w[u]==p?function(t){var e=function(e,r,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(p):m&&"function"==typeof p?o(Function.call,p):p,m&&((g.virtual||(g.virtual={}))[u]=p,t&c.R&&v&&!v[u]&&s(v,u,p)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},{"./_core":75,"./_ctx":77,"./_global":86,"./_has":87,"./_hide":88}],84:[function(t,e,r){e.exports=function(t){try{return!!t()}catch(t){return!0}}},{}],85:[function(t,e,r){var n=t("./_ctx"),i=t("./_iter-call"),o=t("./_is-array-iter"),s=t("./_an-object"),a=t("./_to-length"),c=t("./core.get-iterator-method"),u={},l={},r=e.exports=function(t,e,r,p,f){var d,h,m,y,b=f?function(){return t}:c(t),g=n(r,p,e?2:1),v=0;if("function"!=typeof b)throw TypeError(t+" is not iterable!");if(o(b)){for(d=a(t.length);d>v;v++)if((y=e?g(s(h=t[v])[0],h[1]):g(t[v]))===u||y===l)return y}else for(m=b.call(t);!(h=m.next()).done;)if((y=i(m,g,h.value,e))===u||y===l)return y};r.BREAK=u,r.RETURN=l},{"./_an-object":71,"./_ctx":77,"./_is-array-iter":93,"./_iter-call":96,"./_to-length":135,"./core.get-iterator-method":143}],86:[function(t,e,r){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},{}],87:[function(t,e,r){var n={}.hasOwnProperty;e.exports=function(t,e){return n.call(t,e)}},{}],88:[function(t,e,r){var n=t("./_object-dp"),i=t("./_property-desc");e.exports=t("./_descriptors")?function(t,e,r){return n.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},{"./_descriptors":79,"./_object-dp":108,"./_property-desc":122}],89:[function(t,e,r){var n=t("./_global").document;e.exports=n&&n.documentElement},{"./_global":86}],90:[function(t,e,r){e.exports=!t("./_descriptors")&&!t("./_fails")(function(){return 7!=Object.defineProperty(t("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":79,"./_dom-create":80,"./_fails":84}],91:[function(t,e,r){e.exports=function(t,e,r){var n=void 0===r;switch(e.length){case 0:return n?t():t.call(r);case 1:return n?t(e[0]):t.call(r,e[0]);case 2:return n?t(e[0],e[1]):t.call(r,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(r,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(r,e[0],e[1],e[2],e[3])}return t.apply(r,e)}},{}],92:[function(t,e,r){var n=t("./_cof");e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==n(t)?t.split(""):Object(t)}},{"./_cof":74}],93:[function(t,e,r){var n=t("./_iterators"),i=t("./_wks")("iterator"),o=Array.prototype;e.exports=function(t){return void 0!==t&&(n.Array===t||o[i]===t)}},{"./_iterators":101,"./_wks":142}],94:[function(t,e,r){var n=t("./_cof");e.exports=Array.isArray||function(t){return"Array"==n(t)}},{"./_cof":74}],95:[function(t,e,r){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],96:[function(t,e,r){var n=t("./_an-object");e.exports=function(t,e,r,i){try{return i?e(n(r)[0],r[1]):e(r)}catch(e){ -var o=t.return;throw void 0!==o&&n(o.call(t)),e}}},{"./_an-object":71}],97:[function(t,e,r){"use strict";var n=t("./_object-create"),i=t("./_property-desc"),o=t("./_set-to-string-tag"),s={};t("./_hide")(s,t("./_wks")("iterator"),function(){return this}),e.exports=function(t,e,r){t.prototype=n(s,{next:i(1,r)}),o(t,e+" Iterator")}},{"./_hide":88,"./_object-create":107,"./_property-desc":122,"./_set-to-string-tag":126,"./_wks":142}],98:[function(t,e,r){"use strict";var n=t("./_library"),i=t("./_export"),o=t("./_redefine"),s=t("./_hide"),a=t("./_iterators"),c=t("./_iter-create"),u=t("./_set-to-string-tag"),l=t("./_object-gpo"),p=t("./_wks")("iterator"),f=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(t,e,r,h,m,y,b){c(r,e,h);var g,v,w,_=function(t){if(!f&&t in S)return S[t];switch(t){case"keys":case"values":return function(){return new r(this,t)}}return function(){return new r(this,t)}},x=e+" Iterator",T="values"==m,E=!1,S=t.prototype,O=S[p]||S["@@iterator"]||m&&S[m],j=O||_(m),P=m?T?_("entries"):j:void 0,A="Array"==e?S.entries||O:O;if(A&&(w=l(A.call(new t)))!==Object.prototype&&w.next&&(u(w,x,!0),n||"function"==typeof w[p]||s(w,p,d)),T&&O&&"values"!==O.name&&(E=!0,j=function(){return O.call(this)}),n&&!b||!f&&!E&&S[p]||s(S,p,j),a[e]=j,a[x]=d,m)if(g={values:T?j:_("values"),keys:y?j:_("keys"),entries:P},b)for(v in g)v in S||o(S,v,g[v]);else i(i.P+i.F*(f||E),e,g);return g}},{"./_export":83,"./_hide":88,"./_iter-create":97,"./_iterators":101,"./_library":102,"./_object-gpo":114,"./_redefine":124,"./_set-to-string-tag":126,"./_wks":142}],99:[function(t,e,r){var n=t("./_wks")("iterator"),i=!1;try{var o=[7][n]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}e.exports=function(t,e){if(!e&&!i)return!1;var r=!1;try{var o=[7],s=o[n]();s.next=function(){return{done:r=!0}},o[n]=function(){return s},t(o)}catch(t){}return r}},{"./_wks":142}],100:[function(t,e,r){e.exports=function(t,e){return{value:e,done:!!t}}},{}],101:[function(t,e,r){e.exports={}},{}],102:[function(t,e,r){e.exports=!0},{}],103:[function(t,e,r){var n=t("./_uid")("meta"),i=t("./_is-object"),o=t("./_has"),s=t("./_object-dp").f,a=0,c=Object.isExtensible||function(){return!0},u=!t("./_fails")(function(){return c(Object.preventExtensions({}))}),l=function(t){s(t,n,{value:{i:"O"+ ++a,w:{}}})},p=function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,n)){if(!c(t))return"F";if(!e)return"E";l(t)}return t[n].i},f=function(t,e){if(!o(t,n)){if(!c(t))return!0;if(!e)return!1;l(t)}return t[n].w},d=function(t){return u&&h.NEED&&c(t)&&!o(t,n)&&l(t),t},h=e.exports={KEY:n,NEED:!1,fastKey:p,getWeak:f,onFreeze:d}},{"./_fails":84,"./_has":87,"./_is-object":95,"./_object-dp":108,"./_uid":138}],104:[function(t,e,r){var n=t("./_global"),i=t("./_task").set,o=n.MutationObserver||n.WebKitMutationObserver,s=n.process,a=n.Promise,c="process"==t("./_cof")(s);e.exports=function(){var t,e,r,u=function(){var n,i;for(c&&(n=s.domain)&&n.exit();t;){i=t.fn,t=t.next;try{i()}catch(n){throw t?r():e=void 0,n}}e=void 0,n&&n.enter()};if(c)r=function(){s.nextTick(u)};else if(!o||n.navigator&&n.navigator.standalone)if(a&&a.resolve){var l=a.resolve(void 0);r=function(){l.then(u)}}else r=function(){i.call(n,u)};else{var p=!0,f=document.createTextNode("");new o(u).observe(f,{characterData:!0}),r=function(){f.data=p=!p}}return function(n){var i={fn:n,next:void 0};e&&(e.next=i),t||(t=i,r()),e=i}}},{"./_cof":74,"./_global":86,"./_task":131}],105:[function(t,e,r){"use strict";function n(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw TypeError("Bad Promise constructor");e=t,r=n}),this.resolve=i(e),this.reject=i(r)}var i=t("./_a-function");e.exports.f=function(t){return new n(t)}},{"./_a-function":68}],106:[function(t,e,r){"use strict";var n=t("./_object-keys"),i=t("./_object-gops"),o=t("./_object-pie"),s=t("./_to-object"),a=t("./_iobject"),c=Object.assign;e.exports=!c||t("./_fails")(function(){var t={},e={},r=Symbol(),n="abcdefghijklmnopqrst";return t[r]=7,n.split("").forEach(function(t){e[t]=t}),7!=c({},t)[r]||Object.keys(c({},e)).join("")!=n})?function(t,e){for(var r=s(t),c=arguments.length,u=1,l=i.f,p=o.f;c>u;)for(var f,d=a(arguments[u++]),h=l?n(d).concat(l(d)):n(d),m=h.length,y=0;m>y;)p.call(d,f=h[y++])&&(r[f]=d[f]);return r}:c},{"./_fails":84,"./_iobject":92,"./_object-gops":113,"./_object-keys":116,"./_object-pie":117,"./_to-object":136}],107:[function(t,e,r){var n=t("./_an-object"),i=t("./_object-dps"),o=t("./_enum-bug-keys"),s=t("./_shared-key")("IE_PROTO"),a=function(){},c=function(){var e,r=t("./_dom-create")("iframe"),n=o.length;for(r.style.display="none",t("./_html").appendChild(r),r.src="javascript:",e=r.contentWindow.document,e.open(),e.write("