From 39aeaa1c4e1caa9a1b2bd542a871179cf7d99b38 Mon Sep 17 00:00:00 2001 From: Matt Simerson Date: Fri, 24 Jun 2022 11:07:51 -0700 Subject: [PATCH] Release v1.2.0 (#3) - merged in ChunkEmitter, only used here - copied in indexOfLF, removed haraka-utils dependency - LGTM: remove unused variable --- Changes.md | 9 +- README.md | 7 + index.js | 110 +- package.json | 12 +- test/chunk-emitter.js | 64 + test/fixtures/haraka-icon-attach.eml | 86 ++ test/fixtures/haraka-tarball-attach.eml | 1625 +++++++++++++++++++++++ test/{index.js => message-stream.js} | 2 +- 8 files changed, 1888 insertions(+), 27 deletions(-) create mode 100644 test/chunk-emitter.js create mode 100644 test/fixtures/haraka-icon-attach.eml create mode 100644 test/fixtures/haraka-tarball-attach.eml rename test/{index.js => message-stream.js} (94%) diff --git a/Changes.md b/Changes.md index 50741a4..4dc254d 100644 --- a/Changes.md +++ b/Changes.md @@ -2,15 +2,22 @@ ### Unreleased +### [1.2.0] - 2022-06-24 + +- merged in ChunkEmitter, only used here +- copied in indexOfLF, removed haraka-utils dependency + + ### [1.1.0] - 2022-06-23 - fix: boundary marker corruption issue haraka/Haraka#3068 - ## 1.0.0 - 2022-06-23 - Import from Haraka - convert tests to mocha + [1.1.0]: https://github.com/haraka/message-stream/releases/tag/1.1.0 +[1.2.0]: https://github.com/haraka/message-stream/releases/tag/1.2.0 diff --git a/README.md b/README.md index 510ebbb..48f83cf 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,17 @@ # haraka-message-stream +## Used By +- Haraka/transaction.js +- haraka/test-fixtures/transaction ## USAGE +```js +new MessageStream(cfg, uuid, header_list) +``` + [ci-img]: https://github.com/haraka/message-stream/actions/workflows/ci.yml/badge.svg diff --git a/index.js b/index.js index 8963be9..aae235c 100644 --- a/index.js +++ b/index.js @@ -1,23 +1,23 @@ 'use strict'; +const EventEmitter = require('events').EventEmitter; const fs = require('fs'); const Stream = require('stream').Stream; -const utils = require('haraka-utils'); -const ChunkEmitter = require('haraka-chunk-emitter'); - -const STATE_HEADERS = 1; -const STATE_BODY = 2; +const STATE = { + HEADERS: 1, + BODY : 2, +}; class MessageStream extends Stream { - constructor (cfg, id, headers) { + constructor (cfg = {}, id, headers) { super(); if (!id) throw new Error('id required'); this.uuid = id; this.write_ce = null; this.read_ce = null; this.bytes_read = 0; - this.state = STATE_HEADERS; + this.state = STATE.HEADERS; this.idx = {}; this.end_called = false; this.end_callback = null; @@ -67,16 +67,16 @@ class MessageStream extends Stream { this.bytes_read += line.length; // Build up an index of 'interesting' data on the fly - if (this.state === STATE_HEADERS) { + if (this.state === STATE.HEADERS) { // Look for end of headers line if (line.length === 2 && line[0] === 0x0d && line[1] === 0x0a) { this.idx.headers = { start: 0, end: this.bytes_read-line.length }; - this.state = STATE_BODY; + this.state = STATE.BODY; this.idx.body = { start: this.bytes_read }; } } - if (this.state === STATE_BODY) { + if (this.state === STATE.BODY) { // Look for MIME boundaries if (line.length > 4 && line[0] === 0x2d && line[1] == 0x2d) { let boundary = line.slice(2).toString().replace(/\s*$/,''); @@ -197,10 +197,7 @@ class MessageStream extends Stream { } } - /* - ** READABLE STREAM - */ - + // READABLE STREAM _read () { const self = this; if (!this.end_called) { @@ -231,9 +228,8 @@ class MessageStream extends Stream { }); } else { - // Read the message body by line - // If we have queued entries, then we didn't - // create a queue file, so we read from memory. + // Read the message body by line. If we have queued entries, then + // we didn't create a queue file, so read from memory. if (this._queue.length > 0) { // TODO: implement start/end offsets for (let i=0; i this.buffer_size) { + this.buf = Buffer.alloc(this.buffer_size); + const in_new = Buffer.concat(this.bufs, this.bufs_size); + input = in_new; + // Reset + this.bufs = []; + this.bufs_size = 0; + } + else { + return; + } + } + + while (input.length > 0) { + let remaining = this.buffer_size - this.pos; + if (remaining === 0) { + this.emit('data', this.buf); //.slice(0)); + this.buf = Buffer.alloc(this.buffer_size); + this.pos = 0; + remaining = this.buffer_size; + } + const to_write = ((remaining > input.length) ? input.length : remaining); + input.copy(this.buf, this.pos, 0, to_write); + this.pos += to_write; + input = input.slice(to_write); + } + } + + end (cb) { + let emitted = false; + if (this.bufs_size > 0) { + this.emit('data', Buffer.concat(this.bufs, this.bufs_size)); + emitted = true; + } + else if (this.pos > 0) { + this.emit('data', this.buf.slice(0, this.pos)); + emitted = true; + } + // Reset + this.buf = null; + this.pos = 0; + this.bufs = []; + this.bufs_size = 0; + if (cb && typeof cb === 'function') cb(); + return emitted; + } +} + +module.exports.ChunkEmitter = ChunkEmitter \ No newline at end of file diff --git a/package.json b/package.json index 7d1fd89..4550312 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "haraka-message-stream", - "version": "1.1.0", - "description": "Haraka message stream library", + "version": "1.2.0", + "description": "Haraka email message stream", "main": "index.js", "scripts": { - "lint": "npx eslint *.js test/*.js", + "lint": "npx eslint *.js test", "lintfix": "npx eslint --fix *.js test", "versions": "npx dependency-version-checker check", "test": "npx mocha" @@ -15,6 +15,7 @@ }, "keywords": [ "haraka", + "email", "message-stream" ], "author": "Haraka Team ", @@ -29,8 +30,5 @@ "haraka-test-fixtures": "*", "mocha": ">=9" }, - "dependencies": { - "haraka-chunk-emitter": "^1.0.1", - "haraka-utils": "^1.0.3" - } + "dependencies": {} } diff --git a/test/chunk-emitter.js b/test/chunk-emitter.js new file mode 100644 index 0000000..f709e50 --- /dev/null +++ b/test/chunk-emitter.js @@ -0,0 +1,64 @@ + +const assert = require('assert') +const fs = require('fs') +const path = require('path') + +const ChunkEmitter = require('../index').ChunkEmitter + +describe('chunk-emitter', function () { + + beforeEach(function () { + this.ce = new ChunkEmitter() + this._written = 0 + }) + + it('loads', function () { + assert.ok(this.ce) + }) + + it('emits all unbuffered bytes', function (done) { + const msgPath = path.join(__dirname, 'fixtures', 'haraka-icon-attach.eml') + const eml = fs.readFileSync(msgPath, 'utf8'); + + this._write = (data) => { + this._written = (this._written || 0) + data.length + if (eml.length === this._written) { + assert.equal(eml.length, this._written) + done() + } + } + + this.ce.on('data', chunk => { + this._write(chunk); + }) + + this.ce.fill(eml) + this.ce.end() + }) + + it('emits all bigger than buffer bytes', function (done) { + const msgPath = path.join(__dirname, 'fixtures', 'haraka-tarball-attach.eml') + // console.log(`msgPath: ${msgPath}`) + const eml = fs.readFileSync(msgPath, 'utf8'); + // console.log(`length: ${eml.length}`) + + this._write = (data) => { + // console.log(`_write: ${data.length} bytes`) + this._written = this._written + data.length + // console.log(`_written: ${this._written}`) + if (eml.length === this._written) { + assert.equal(eml.length, this._written) + // console.log(this.ce) + done() + } + } + + this.ce.on('data', chunk => { + // console.log(`ce.on.data: ${chunk.length} bytes`) + this._write(chunk); + }) + + this.ce.fill(eml) + this.ce.end() + }) +}) diff --git a/test/fixtures/haraka-icon-attach.eml b/test/fixtures/haraka-icon-attach.eml new file mode 100644 index 0000000..44f406e --- /dev/null +++ b/test/fixtures/haraka-icon-attach.eml @@ -0,0 +1,86 @@ +Delivered-To: haraka.mail@gmail.com +Received: by 2002:ab3:6f8e:0:0:0:0:0 with SMTP id d14csp1994692ltq; + Thu, 16 Jun 2022 22:39:28 -0700 (PDT) +X-Google-Smtp-Source: ABdhPJw16YN9P7Vs8oIiHL7G+DNj0rd/RFuy9/l/Wicmod36VZVTS/puw3+7DlWo8U7IluNFgj44 +X-Received: by 2002:a05:6808:3082:b0:32f:14df:d56 with SMTP id bl2-20020a056808308200b0032f14df0d56mr9453315oib.36.1655444367728; + Thu, 16 Jun 2022 22:39:27 -0700 (PDT) +ARC-Seal: i=1; a=rsa-sha256; t=1655444367; cv=none; + d=google.com; s=arc-20160816; + b=kLGjp2ljdxPlDesfsMC9ePo3qqq6iTFoUk5OnGmOCoJROlsh9ughdJ/zDYEQDloorv + srZUVv8qtkQ6viejNdG4ZAOdQHfPBzVJQnwa5EJOcLv1uHRESDzWEBNVYpkgY6vxASe9 + voQh0bbnCfyJ3t1zS2T8YwAi3CUJjIAxnh74rM4T0ifiExrijJ3CsByYbW2EdicE7OCu + 5PMShKrEej1e14ERnAiQDPt8vPRI6ajDm0fvTUKZ0EeeXsMToOZIOJvwE5mYrWfBY/Lg + WR5eneLbfFFndqnme67Tk0oqXEfR4xqaWaKJmNWwpQp5Oxnfam/h0WHGRedFwA/4Q6tB + Tx/Q== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; + h=dkim-signature:to:date:message-id:subject:mime-version:from; + bh=RYNKaQ8pV1V8ZzGHBBOfhMiozhScoqKiZgquGlE1Jfk=; + b=S2vxlxDMWnM5gzsQ2NC+MwF2QSijWMBjAgMwqGjWJhEOhN3TkmdNE5QMV83mDwJvPG + EybtmIxuSw9fFzBBlR52bq9z0LKXKq+GTmQEk8AqorsC1DiHalPxeSf9zpFCm8Fmtc8c + BR/Lr7cAzTWoxa23bNe+YVc/98ph3uS6FkayA+NAbrDuYscpNfFkajZnVbulzL5XxE/O + UtEAnyXaQAi3v5Kk2WqxewarYCvhUVREhWlOJwV4+4KF1a7XR2Loig4L8hvqgEb6ZXwW + dpnRwIMBWDOns4EH8kMhmTpWIyAJiIjLAzYkIFo+gA3XEWhVXuIfFRsZQ3onDKvohJWy + q56w== +ARC-Authentication-Results: i=1; mx.google.com; + dkim=pass header.i=@tnpi.net header.s=mar2013 header.b=TkkvpKMK; + spf=pass (google.com: domain of matt@tnpi.net designates 66.128.51.165 as permitted sender) smtp.mailfrom=matt@tnpi.net; + dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=tnpi.net +Return-Path: +Received: from mail.theartfarm.com (mail.theartfarm.com. [66.128.51.165]) + by mx.google.com with ESMTPS id i6-20020a9d1706000000b0060c4e96a70fsi3484305ota.173.2022.06.16.22.39.26 + for + (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); + Thu, 16 Jun 2022 22:39:27 -0700 (PDT) +Received-SPF: pass (google.com: domain of matt@tnpi.net designates 66.128.51.165 as permitted sender) client-ip=66.128.51.165; +Authentication-Results: mx.google.com; + dkim=pass header.i=@tnpi.net header.s=mar2013 header.b=TkkvpKMK; + spf=pass (google.com: domain of matt@tnpi.net designates 66.128.51.165 as permitted sender) smtp.mailfrom=matt@tnpi.net; + dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=tnpi.net +Received: (Haraka outbound); Thu, 16 Jun 2022 20:39:25 -0900 +Authentication-Results: mail.theartfarm.com; auth=pass (plain); spf=pass smtp.mailfrom=tnpi.net +Received-SPF: Pass (mail.theartfarm.com: domain of tnpi.net designates 2602:47:d497:1a00:95df:28b7:e166:b8f3 as permitted sender) receiver=mail.theartfarm.com; identity=mailfrom; client-ip=66.128.51.165 helo=smtpclient.apple; envelope-from= +Received-SPF: None (mail.theartfarm.com: domain of smtpclient.apple does not designate 2602:47:d497:1a00:95df:28b7:e166:b8f3 as permitted sender) receiver=mail.theartfarm.com; identity=helo; client-ip=2602:47:d497:1a00:95df:28b7:e166:b8f3 helo=smtpclient.apple; envelope-from= +Received: from smtpclient.apple ([2602:47:d497:1a00:95df:28b7:e166:b8f3]) by mail.theartfarm.com (Haraka/2.8.28) with ESMTPSA id 87C954DA-1B27-441F-9C4B-589EDAF586B1.1 envelope-from tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (authenticated bits=0); Thu, 16 Jun 2022 20:39:25 -0900 +From: Matt Simerson +Content-Type: multipart/alternative; boundary="Apple-Mail=_65C16661-5FA8-4757-B627-13E55C40C8D7" +Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.100.31\)) +Subject: sample email w/attachment +Message-Id: +Date: Thu, 16 Jun 2022 22:39:20 -0700 +To: haraka.mail@gmail.com +X-Mailer: Apple Mail (2.3696.100.31) +X-Spam-Status: No, score=-0.8 required=5.0 autolearn=no autolearn_force=no +X-Spam-DCC: : dcc 1102; Body=1 Fuz1=1 +X-Spam-Checker-Version: SpamAssassin 3.4.5 (2021-03-20) on spamassassin +X-Spam-Tests: ALL_TRUSTED,BAYES_00,HTML_IMAGE_ONLY_04,HTML_MESSAGE, MIME_HTML_MOSTLY,MPART_ALT_DIFF,SPF_HELO_NONE,SPF_PASS,TVD_SPACE_RATIO +X-Haraka-Karma: score: 22, good: 7, connections: 7, history: 7, awards: 162,182, pass:relaying +X-Haraka-ASN: 209 +X-Haraka-ASN-Org: CENTURYLINK-US-LEGACY-QWEST +X-Haraka-GeoIP: NA, US, FL, Ocala, 1428km +X-Haraka-GeoIP-Received: 2602:47:d497:1a00:95df:28b7:e166:b8f3:US +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tnpi.net; s=mar2013; h=from:subject:date:message-id:to:mime-version; bh=o+lGZj+WlxYYl3NX8ghSTkSEvNbeSTpPdNdeEllwQmA=; b=TkkvpKMKj1LdTEUp3K3s/ZdAVzv3ao1EDubkcSkRRdpSCxXIyRJLDEpTuvqHWyKZ0nrkG3pCdf XClyHXvKRRplRpLIKRMC6HXg32awG4c37fMdhrzBEV9P1W0dsdZPrdODWBo/UXuKjHhHxhn8ASzG kr0i/iPSxKkbEHcb+RibaBletQjXh1ULLBMjP0wuOxsxG5hRh61UFvGFlAVkXLYyC0N1dt+emDoO nkl7Y5k4tLsuRSWDWMnwqvggJztjcRXZq8fx4Pt2XOLPRbF60hSI+H8WW0JnMSkg+NE/wy5Fzmy7 ersTykFjVG6JuhGCD8g7CSyF8VY3ffNdUaE/vnAg== + +--Apple-Mail=_65C16661-5FA8-4757-B627-13E55C40C8D7 +Content-Transfer-Encoding: 7bit +Content-Type: text/plain; charset=us-ascii + + + + +--Apple-Mail=_65C16661-5FA8-4757-B627-13E55C40C8D7 +Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_E112021D-E491-4E1D-8526-77623DD2EBE1" + +--Apple-Mail=_E112021D-E491-4E1D-8526-77623DD2EBE1 +Content-Transfer-Encoding: 7bit +Content-Type: text/html; charset=us-ascii + +

+--Apple-Mail=_E112021D-E491-4E1D-8526-77623DD2EBE1 +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename=1111229.png +Content-Type: image/png; x-unix-mode=0644; name="1111229.png" +Content-Id: + + +--Apple-Mail=_E112021D-E491-4E1D-8526-77623DD2EBE1-- +--Apple-Mail=_65C16661-5FA8-4757-B627-13E55C40C8D7-- \ No newline at end of file diff --git a/test/fixtures/haraka-tarball-attach.eml b/test/fixtures/haraka-tarball-attach.eml new file mode 100644 index 0000000..c96fb28 --- /dev/null +++ b/test/fixtures/haraka-tarball-attach.eml @@ -0,0 +1,1625 @@ +Received: (qmail 53509 invoked by uid 89); 24 Jun 2022 03:46:45 -0000 +Received: from unknown (HELO mail.theartfarm.com) (172.16.15.9) + by vpopmail with SMTP; 24 Jun 2022 03:46:45 -0000 +Received: (Haraka outbound); Thu, 23 Jun 2022 18:46:45 -0900 +Authentication-Results: mail.theartfarm.com; + auth=pass (plain); + spf=pass smtp.mailfrom=tnpi.net +Received-SPF: Pass (mail.theartfarm.com: domain of tnpi.net designates 174.21.69.95 as permitted sender) receiver=mail.theartfarm.com; identity=mailfrom; client-ip=66.128.51.165 helo=smtpclient.apple; envelope-from= +Received-SPF: None (mail.theartfarm.com: domain of smtpclient.apple does not designate 174.21.69.95 as permitted sender) receiver=mail.theartfarm.com; identity=helo; client-ip=174.21.69.95 helo=smtpclient.apple; envelope-from= +Received: from smtpclient.apple (174-21-69-95.tukw.qwest.net [174.21.69.95]) + by mail.theartfarm.com (Haraka/2.8.28) with ESMTPSA id 1409745C-0DAD-4DDB-B848-6AF9902763F5.1 + envelope-from + tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (authenticated bits=0); + Thu, 23 Jun 2022 18:46:43 -0900 +From: Matt Simerson +Content-Type: multipart/mixed; + boundary="Apple-Mail=_FC490397-1965-4385-8EC7-55F5295FCC0D" +Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3696.100.31\)) +Subject: Test with attachment > 64kb +Message-Id: <7FBA9F68-FD42-4FD7-B2D1-B5B4F82D4BCE@tnpi.net> +Date: Thu, 23 Jun 2022 20:46:32 -0700 +To: Matt Simerson +X-Mailer: Apple Mail (2.3696.100.31) +X-Spam-Status: No, score=-2.9 required=5.0 autolearn=no autolearn_force=no +X-Spam-DCC: : dcc 1102; Body=1 Fuz1=1 Fuz2=1 +X-Spam-Checker-Version: SpamAssassin 3.4.5 (2021-03-20) on spamassassin +X-Spam-Tests: ALL_TRUSTED,BAYES_00,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE +X-Haraka-Karma: score: 15, good: 11, connections: 11, history: 11, awards: 116,162,003,182, pass:relaying, fail:env_user_match +X-Haraka-ASN: 209 +X-Haraka-ASN-Org: CENTURYLINK-US-LEGACY-QWEST +X-Haraka-GeoIP: NA, US, WA, Seattle, 2730km +X-Haraka-GeoIP-Received: 174.21.69.95:US +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; + d=tnpi.net; s=mar2013; + h=from:subject:date:message-id:to:mime-version; + bh=THDr1ymPWM7gWGslBYgM+ML/3ZmeIz2YHGIPiambuIU=; + b=wtVBdUO87jKAeJPEcD83EQNkxPSPyYmg/PGKNLQ4wVLgZu07sUghhT5PpYUxuqepgAQauouiwc + wjcN8JmDkq5fhrODHbyY3UaJNXef7Wa7Edxj1GyL040d+Hoo0b9OoJ6Y73toAh3th56WxOjPQ6K9 + G6rthXBSechJ9/880JOeRz8GCgpGDcDnU3Rs96qCQ7aUkHqHT7W9V/Z1yj5n1kjupmqkd8cMIKzL + NJa4hlwdVKaNxKRyxMfUv4oUKqgRJXzOlNYK6MFq4moVFOyQ75cxMiEWs78vSJrj1lhCRtXMtwzs + axMTp6qK6yQYURmRp9vjqDph99zLfAN2Sf/Bo/aw== + + +--Apple-Mail=_FC490397-1965-4385-8EC7-55F5295FCC0D +Content-Transfer-Encoding: 7bit +Content-Type: text/plain; + charset=us-ascii + +Haraka test fixtures is attached. + +Matt + + +--Apple-Mail=_FC490397-1965-4385-8EC7-55F5295FCC0D +Content-Disposition: attachment; + filename=haraka-test-fixtures-1.0.35.tar +Content-Type: application/x-tar; + x-unix-mode=0644; + name="haraka-test-fixtures-1.0.35.tar" +Content-Transfer-Encoding: base64 + +cGFja2FnZS8uZ2l0bW9kdWxlcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAA +AAAAAAAAAAAAADAwMDAwMDAxMjUgADM1NjAxMTY2MDQgADAxMTQzMyAAMAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAw +MCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABb +c3VibW9kdWxlICIucmVsZWFzZSJdCglwYXRoID0gLnJlbGVhc2UKCXVybCA9IGdpdEBnaXRodWIu +Y29tOm1zaW1lcnNvbi8ucmVsZWFzZS5naXQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBh +Y2thZ2UvLnJlbGVhc2UvTElDRU5TRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAA +AAAAAAAAAAAwMDAwMDAyNzYxIAAzNTYwMTE2NjA0IAAwMTE3NzEgADAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAg +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQlNE +IDMtQ2xhdXNlIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiwgTWF0dCBTaW1lcnNvbgpBbGwg +cmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp +bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw +cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKMS4gUmVkaXN0 +cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQg +bm90aWNlLCB0aGlzCiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj +bGFpbWVyLgoKMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl +IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh +bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgIGFuZC9v +ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKMy4gTmVp +dGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0 +cwogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1 +Y3RzIGRlcml2ZWQgZnJvbQogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig +d3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q +WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCkFORCBBTlkgRVhQUkVTUyBP +UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK +SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ +QVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBD +T1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKRk9SIEFOWSBESVJFQ1Qs +IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ +QUwKREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G +IFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G +SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKQ0FVU0VEIEFORCBPTiBBTlkg +VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU +WSwKT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO +IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE +IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KAAAAAAAAAAAAAAAAAAAAcGFja2Fn +ZS9MSUNFTlNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAA +AAAAADAwMDAwMDIwNjEgADM1NjAxMTY2MDQgADAxMDI2NCAAMAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUaGUgTUlU +IExpY2Vuc2UgKE1JVCkKCkNvcHlyaWdodCAoYykgMjAxNiBIYXJha2EKClBlcm1pc3Npb24gaXMg +aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh +IGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz +ICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp +Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNv +cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9v +ciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3 +aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZv +bGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg +cGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJz +dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklE +RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBM +SUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNI +QU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJ +TkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERF +UlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBX +SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ +TkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhF +IFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlLy5y +ZWxlYXNlL25wbS9wcmVwZW5kLXNjb3BlLmNqcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAAAAAAAAAAAAAAAAAAAAAA +MDAwMDAwMTA1NCAAMzU2MDExNjYwNCAAMDE1MDIwIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhbm9kZQpjb25z +dCBmcyA9IHJlcXVpcmUoJ2ZzJykKZnVuY3Rpb24gdXNhZ2UgKCkgewogICAgY29uc29sZS5sb2co +YCR7cHJvY2Vzcy5hcmd2WzFdfSA8c2NvcGU+YCkKICAgIHByb2Nlc3MuZXhpdCgxKQp9CmNvbnN0 +IHNjb3BlID0gcHJvY2Vzcy5hcmd2WzJdOyBpZiAoIXNjb3BlKSB1c2FnZSgpCmNvbnN0IHBrZyA9 +IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKCcuL3BhY2thZ2UuanNvbicpKQpjb25zdCBjaGVj +a0V4aXN0c1JlID0gbmV3IFJlZ0V4cChgXiR7c2NvcGV9L2AsICdnJykKY29uc29sZS5sb2coYG5h +bWU6ICR7cGtnLm5hbWV9LCBzY29wZTogJHtzY29wZX0sIHJlOiAke2NoZWNrRXhpc3RzUmV9YCkK +aWYgKGNoZWNrRXhpc3RzUmUudGVzdChwa2cubmFtZSkpIHsKICAgIGNvbnNvbGUuZXJyb3IoYGFs +cmVhZHkgc2NvcGVkIHRvICR7c2NvcGV9YCkKICAgIHByb2Nlc3MuZXhpdCgxKQp9CnBrZy5uYW1l +ID0gYCR7c2NvcGV9LyR7cGtnLm5hbWV9YApmcy53cml0ZUZpbGVTeW5jKCdwYWNrYWdlLmpzb24n +LCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlL2NvbmZp +Zy9zbXRwLmluaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAw +MDAwMzM1NiAAMzU2MDExNjYwNCAAMDEyMjIwIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsgYWRkcmVzcyB0byBs +aXN0ZW4gb24gKGRlZmF1bHQ6IGFsbCBJUHY2IGFuZCBJUHY0IGFkZHJlc3NlcywgcG9ydCAyNSkK +OyB1c2UgIls6OjBdOjI1IiB0byBsaXN0ZW4gb24gSVB2NiBhbmQgSVB2NCAobm90IGFsbCBPU2Vz +KQo7bGlzdGVuPVs6OjBdOjI1Cgo7IE5vdGUgeW91IGNhbiBsaXN0ZW4gb24gbXVsdGlwbGUgSVBz +L3BvcnRzIHVzaW5nIGNvbW1hczoKO2xpc3Rlbj0xMjcuMC4wLjE6MjUyOSwxMjcuMC4wLjI6MjUy +OSwxMjcuMC4wLjM6MjUzMAoKOyBwdWJsaWMgSVAgYWRkcmVzcyAoZGVmYXVsdDogbm9uZSkKOyBJ +ZiB5b3VyIG1hY2hpbmUgaXMgYmVoaW5kIGEgTkFULCBzb21lIHBsdWdpbnMgKFNQRiwgR2VvSVAp +IGdhaW4gZmVhdHVyZXMKOyBpZiB0aGV5IGtub3cgdGhlIHNlcnZlcnMgcHVibGljIElQLiBJZiAn +c3R1bicgaXMgaW5zdGFsbGVkLCBIYXJha2Egd2lsbAo7IHRyeSB0byBmaWd1cmUgaXQgb3V0LiBJ +ZiB0aGF0IGRvZXNuJ3Qgd29yaywgc2V0IGl0IGhlcmUuCjtwdWJsaWNfaXA9Ti5OLk4uTgoKOyBU +aW1lIGluIHNlY29uZHMgdG8gbGV0IHNvY2tldHMgYmUgaWRsZSB3aXRoIG5vIGFjdGl2aXR5Cjtp +bmFjdGl2aXR5X3RpbWVvdXQ9MzAwCgo7IERyb3AgcHJpdmlsZWdlcyB0byB0aGlzIHVzZXIvZ3Jv +dXAKO3VzZXI9c210cAo7Z3JvdXA9c210cAoKOyBEb24ndCBzdG9wIEhhcmFrYSBpZiBwbHVnaW5z +IGZhaWwgdG8gY29tcGlsZQo7aWdub3JlX2JhZF9wbHVnaW5zPTAKCjsgUnVuIHVzaW5nIGNsdXN0 +ZXIgdG8gZm9yayBtdWx0aXBsZSBiYWNrZW5kIHByb2Nlc3Nlcwo7bm9kZXM9Y3B1cwoKOyBEYWVt +b25pemUKO2RhZW1vbml6ZT10cnVlCjtkYWVtb25fbG9nX2ZpbGU9L3Zhci9sb2cvaGFyYWthLmxv +Zwo7ZGFlbW9uX3BpZF9maWxlPS92YXIvcnVuL2hhcmFrYS5waWQKCjsgU3Bvb2xpbmcKOyBTYXZl +IG1lbW9yeSBieSBzcG9vbGluZyBsYXJnZSBtZXNzYWdlcyB0byBkaXNrCjtzcG9vbF9kaXI9L3Zh +ci9zcG9vbC9oYXJha2EKOyBTcGVjaWZ5IC0xIHRvIG5ldmVyIHNwb29sIHRvIGRpc2sKOyBTcGVj +aWZ5IDAgdG8gYWx3YXlzIHNwb29sIHRvIGRpc2sKOyBPdGhlcndpc2Ugc3BlY2lmeSBhIHNpemUg +aW4gYnl0ZXMsIG9uY2UgcmVhY2hlZCB0aGUKOyBtZXNzYWdlIHdpbGwgYmUgc3Bvb2xlZCB0byBk +aXNrIHRvIHNhdmUgbWVtb3J5Lgo7c3Bvb2xfYWZ0ZXI9Cgo7IEZvcmNlIFNodXRkb3duIFRpbWVv +dXQKOyAtIEhhcmFrYSB0cmllcyB0byBjbG9zZSBkb3duIGdyYWNlZnVsbHksIGJ1dCBpZiBldmVy +eXRoaW5nIGlzIHNodXQgZG93bgo7ICAgYWZ0ZXIgdGhpcyB0aW1lIGl0IHdpbGwgaGFyZCBjbG9z +ZS4gMzBzIGlzIHVzdWFsbHkgbG9uZyBlbm91Z2ggdG8KOyAgIHdhaXQgZm9yIG91dGJvdW5kIGNv +bm5lY3Rpb25zIHRvIGZpbmlzaC4KO2ZvcmNlX3NodXRkb3duX3RpbWVvdXQ9MzAKCjsgU01UUCBz +ZXJ2aWNlIGV4dGVuc2lvbnM6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxODY5Cjsg +c3RyaWN0X3JmYzE4NjkgPSBmYWxzZQoKOyBBZHZlcnRpc2Ugc3VwcG9ydCBmb3IgU01UUFRVRjgg +KFJGQy02NTMxKQo7c210cHV0Zjg9dHJ1ZQoKW2hlYWRlcnNdCjthZGRfcmVjZWl2ZWQ9dHJ1ZQo7 +Y2xlYW5fYXV0aF9yZXN1bHRzPXRydWUKCjsgcmVwbGFjZSBoZWFkZXJfaGlkZV92ZXJzaW9uCjtz +aG93X3ZlcnNpb249dHJ1ZQoKOyByZXBsYWNlIG1heF9oZWFkZXJfbGluZXMKbWF4X2xpbmVzPTEw +MDAKCjsgcmVwbGFjZSBtYXhfcmVjZWl2ZWRfY291bnQKbWF4X3JlY2VpdmVkPTEwMAoAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS9saWIvY29ubmVj +dGlvbi5qcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDQx +NTcgADM1NjAxMTY2MDQgADAxMjUzMiAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKY29uc3QgY29uZmlnICAgICAg +PSByZXF1aXJlKCdoYXJha2EtY29uZmlnJykKY29uc3QgTm90ZXMgICAgICAgPSByZXF1aXJlKCdo +YXJha2Etbm90ZXMnKQpjb25zdCBSZXN1bHRTdG9yZSA9IHJlcXVpcmUoJ2hhcmFrYS1yZXN1bHRz +JykKCmNvbnN0IGxvZ2dlciAgICAgID0gcmVxdWlyZSgnLi9sb2dnZXInKQpjb25zdCB0cmFuc2Fj +dGlvbiA9IHJlcXVpcmUoJy4vdHJhbnNhY3Rpb24nKQoKY29uc3QgY2ZnID0gY29uZmlnLmdldCgn +c210cC5pbmknLCB7CiAgICBib29sZWFuczogWwogICAgICAgICcrbWFpbi5zbXRwdXRmOCcsCiAg +ICAgICAgJytoZWFkZXJzLmFkZF9yZWNlaXZlZCcsCiAgICAgICAgJytoZWFkZXJzLmNsZWFuX2F1 +dGhfcmVzdWx0cycKICAgIF0KfSkKCmNsYXNzIENvbm5lY3Rpb24gewogICAgY29uc3RydWN0b3Ig +KGNsaWVudCwgc2VydmVyKSB7CgogICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OwogICAgICAg +IHRoaXMuc2VydmVyID0gc2VydmVyOwogICAgICAgIHRoaXMucmVsYXlpbmcgPSBmYWxzZTsKICAg +ICAgICB0aGlzLmxvY2FsID0ge307CiAgICAgICAgdGhpcy5yZW1vdGUgPSB7CiAgICAgICAgICAg +IGlwOiAnMTI3LjAuMC4xJywKICAgICAgICB9OwogICAgICAgIHRoaXMudGxzID0ge307CiAgICAg +ICAgdGhpcy5oZWxsbyA9IHt9OwogICAgICAgIHRoaXMubm90ZXMgID0gbmV3IE5vdGVzKCk7CiAg +ICAgICAgdGhpcy5yZXN1bHRzID0gbmV3IFJlc3VsdFN0b3JlKHRoaXMpOwogICAgICAgIGxvZ2dl +ci5hZGRfbG9nX21ldGhvZHModGhpcywgJ21vY2stY29ubmVjdGlvbicpOwogICAgfQogICAgYXV0 +aF9yZXN1bHRzIChtZXNzYWdlKSB7fQogICAgcmVzcG9uZCAoY29kZSwgbXNnLCBmdW5jKSB7IHJl +dHVybiBmdW5jKCk7IH0KICAgIGluaXRfdHJhbnNhY3Rpb24gKGRvbmUpIHsKICAgICAgICB0aGlz +LnRyYW5zYWN0aW9uID0gbmV3IHRyYW5zYWN0aW9uLmNyZWF0ZVRyYW5zYWN0aW9uKG51bGwsIGNm +Zyk7CiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5yZXN1bHRzID0gbmV3IFJlc3VsdFN0b3JlKHRo +aXMpOwogICAgICAgIGlmIChkb25lKSBkb25lKCk7CiAgICB9CiAgICByZXNldF90cmFuc2FjdGlv +biAoZG9uZSkgewogICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uICYmIHRoaXMudHJhbnNhY3Rp +b24ucmVzZXR0aW5nID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLnJl +c2V0dGluZyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlz +LnRyYW5zYWN0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRvbmUpIGRvbmUoKTsK +ICAgIH0KICAgIHNldCAocHJvcF9zdHIsIHZhbCkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVu +Z3RoID09PSAzKSB7CiAgICAgICAgICAgIHByb3Bfc3RyID0gYCR7YXJndW1lbnRzWzBdfS4ke2Fy +Z3VtZW50c1sxXX1gOwogICAgICAgICAgICB2YWwgPSBhcmd1bWVudHNbMl07CiAgICAgICAgfQoK +ICAgICAgICBjb25zdCBzZWdtZW50cyA9IHByb3Bfc3RyLnNwbGl0KCcuJyk7CiAgICAgICAgbGV0 +IGRlc3QgPSB0aGlzOwogICAgICAgIHdoaWxlIChzZWdtZW50cy5sZW5ndGggPiAxKSB7CiAgICAg +ICAgICAgIGlmICghZGVzdFtzZWdtZW50c1swXV0pIGRlc3Rbc2VnbWVudHNbMF1dID0ge307CiAg +ICAgICAgICAgIGRlc3QgPSBkZXN0W3NlZ21lbnRzLnNoaWZ0KCldOwogICAgICAgIH0KICAgICAg +ICBkZXN0W3NlZ21lbnRzWzBdXSA9IHZhbDsKICAgIH0KICAgIGdldCAocHJvcF9zdHIpIHsKICAg +ICAgICByZXR1cm4gcHJvcF9zdHIuc3BsaXQoJy4nKS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHsK +ICAgICAgICAgICAgcmV0dXJuIHByZXYgPyBwcmV2W2N1cnJdIDogdW5kZWZpbmVkCiAgICAgICAg +fSwgdGhpcykKICAgIH0KfQoKZXhwb3J0cy5Db25uZWN0aW9uID0gQ29ubmVjdGlvbjsKCmV4cG9y +dHMuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChjbGllbnQsIHNlcnZlcikgewogICAgaWYg +KHR5cGVvZihjbGllbnQpID09PSAndW5kZWZpbmVkJykgY2xpZW50ID0ge307CiAgICBpZiAodHlw +ZW9mKHNlcnZlcikgPT09ICd1bmRlZmluZWQnKSBzZXJ2ZXIgPSB7fTsKCiAgICByZXR1cm4gbmV3 +IENvbm5lY3Rpb24oY2xpZW50LCBzZXJ2ZXIpOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS90ZXN0L2Nvbm5lY3Rpb24u +anMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDI3NjMgADM1 +NjAxMTY2MDQgADAxMjc0NCAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgn +YXNzZXJ0Jyk7Cgpjb25zdCBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi4vbGliL2Nvbm5lY3Rpb24n +KTsKLy8gY29uc29sZS5sb2coY29ubmVjdGlvbik7CgpkZXNjcmliZSgnYmFzaWMnLCBmdW5jdGlv +biAoKSB7CiAgICBpdCgnaXMgYSBmdW5jdGlvbicsIChkb25lKSA9PiB7CiAgICAgICAgYXNzZXJ0 +LmVxdWFsKHR5cGVvZiBjb25uZWN0aW9uLkNvbm5lY3Rpb24sICdmdW5jdGlvbicpOwogICAgICAg +IGRvbmUoKTsKICAgIH0pCiAgICBpdCgnY3JlYXRlQ29ubmVjdGlvbicsIChkb25lKSA9PiB7CiAg +ICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBjb25uZWN0aW9uLmNyZWF0ZUNvbm5lY3Rpb24sICdm +dW5jdGlvbicpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCn0pCgpkZXNjcmliZSgnY29ubmVjdGlv +bicsIGZ1bmN0aW9uICgpIHsKCiAgICBiZWZvcmVFYWNoKGRvbmUgPT4gewogICAgICAgIHRoaXMu +Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbigpCiAgICAgICAgZG9uZSgp +CiAgICB9KQogICAgaXQoJ2NyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbicsIChkb25lKSA9PiB7CiAg +ICAgICAgYXNzZXJ0Lm9rKHRoaXMuY29ubmVjdGlvbik7CiAgICAgICAgZG9uZSgpOwogICAgfSkK +ICAgIGl0KCdjcmVhdGVzIGEgbmV3IHRyYW5zYWN0aW9uJywgKGRvbmUpID0+IHsKICAgICAgICB0 +aGlzLmNvbm5lY3Rpb24uaW5pdF90cmFuc2FjdGlvbigpOwogICAgICAgIGFzc2VydC5vayh0aGlz +LmNvbm5lY3Rpb24udHJhbnNhY3Rpb24pOwogICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBpdCgn +cmVtb3RlLmlwJywgKGRvbmUpID0+IHsKICAgICAgICBhc3NlcnQuZXF1YWwodGhpcy5jb25uZWN0 +aW9uLnJlbW90ZS5pcCwgJzEyNy4wLjAuMScpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBp +dCgnbG9jYWwnLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5kZWVwRXF1YWwodGhpcy5jb25u +ZWN0aW9uLmxvY2FsLCB7fSk7CiAgICAgICAgZG9uZSgpOwogICAgfSkKICAgIGl0KCdoZWxsbycs +IChkb25lKSA9PiB7CiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0aGlzLmNvbm5lY3Rpb24uaGVs +bG8sIHt9KTsKICAgICAgICBkb25lKCk7CiAgICB9KQogICAgaXQoJ3RscycsIChkb25lKSA9PiB7 +CiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0aGlzLmNvbm5lY3Rpb24udGxzLCB7fSk7CiAgICAg +ICAgZG9uZSgpOwogICAgfSkKICAgIGl0KCdub3RlcycsIChkb25lKSA9PiB7CiAgICAgICAgYXNz +ZXJ0LmRlZXBFcXVhbCh0aGlzLmNvbm5lY3Rpb24ubm90ZXMsIHt9KTsKICAgICAgICBkb25lKCk7 +CiAgICB9KQogICAgaXQoJ3NldCcsIChkb25lKSA9PiB7CiAgICAgICAgdGhpcy5jb25uZWN0aW9u +LnNldCgncmVtb3RlJywgJ2lwJywgJzE5Mi4xNjguMS4xJyk7CiAgICAgICAgYXNzZXJ0LmRlZXBF +cXVhbCh0aGlzLmNvbm5lY3Rpb24ucmVtb3RlLmlwLCAnMTkyLjE2OC4xLjEnKTsKICAgICAgICBk +b25lKCk7CiAgICB9KQp9KQAAAAAAAAAAAAAAAABwYWNrYWdlL2luZGV4LmpzAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMTAxMCAAMzU2MDEx +NjYwNCAAMDEwNzE1IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApleHBvcnRzLnJlc3VsdHMgICAgICAgID0gcmVx +dWlyZSgnaGFyYWthLXJlc3VsdHMnKTsKZXhwb3J0cy5yZXN1bHRfc3RvcmUgICA9IGV4cG9ydHMu +cmVzdWx0czsKCmV4cG9ydHMuY29ubmVjdGlvbiAgICAgPSByZXF1aXJlKCcuL2xpYi9jb25uZWN0 +aW9uJyk7CmV4cG9ydHMubGluZV9zb2NrZXQgICAgPSByZXF1aXJlKCcuL2xpYi9saW5lX3NvY2tl +dCcpOwpleHBvcnRzLmxvZ2dlciAgICAgICAgID0gcmVxdWlyZSgnLi9saWIvbG9nZ2VyJyk7CmV4 +cG9ydHMucGx1Z2luICAgICAgICAgPSByZXF1aXJlKCcuL2xpYi9wbHVnaW4nKTsKZXhwb3J0cy5z +dHViICAgICAgICAgICA9IHJlcXVpcmUoJy4vbGliL3N0dWInKTsKZXhwb3J0cy50cmFuc2FjdGlv +biAgICA9IHJlcXVpcmUoJy4vbGliL3RyYW5zYWN0aW9uJyk7CmV4cG9ydHMudXRpbF9obWFpbGl0 +ZW0gPSByZXF1aXJlKCcuL2xpYi91dGlsX2htYWlsaXRlbScpOwpleHBvcnRzLnZtX2hhcm5lc3Mg +ICAgID0gcmVxdWlyZSgnLi9saWIvdm1faGFybmVzcycpOwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlL3Rlc3QvZml4dHVyZXMvbW9jay1wbHVn +aW4tZGlyL2luZGV4LmpzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMDEyMSAAMzU2MDExNjYw +NCAAMDE2NTUwIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVz +dGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApleHBvcnRzLnJlZ2lzdGVyID0gZnVuY3Rpb24gKCkg +ewogICAgLy8gY29uc29sZS5sb2coJ0kgYW0gYSBtb2NrIHBsdWdpbiBkaXInKQp9OwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS90ZXN0L2luZGV4LmpzAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDI2MzEgADM1NjAxMTY2MDQg +ADAxMTcwNiAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3Rh +cgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JykK +Y29uc3QgcGF0aCAgID0gcmVxdWlyZSgncGF0aCcpOwoKY29uc3QgZml4dHVyZXMgPSByZXF1aXJl +KCcuLi9pbmRleCcpOwoKCmRlc2NyaWJlKCd0ZXN0LWZpeHR1cmVzJywgZnVuY3Rpb24gKCkgewoK +ICAgIGl0KCdzdHViJywgKGRvbmUpID0+IHsKICAgICAgICBhc3NlcnQuZXF1YWwoJ2Z1bmN0aW9u +JywgdHlwZW9mIGZpeHR1cmVzLnN0dWIuc3R1Yik7CiAgICAgICAgZG9uZSgpOwogICAgfSkKICAg +IGl0KCdsb2dnZXInLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5lcXVhbCgnZnVuY3Rpb24n +LCB0eXBlb2YgZml4dHVyZXMubG9nZ2VyLmxvZ2luZm8pOwogICAgICAgIGRvbmUoKTsKICAgIH0p +CiAgICBpdCgnY29ubmVjdGlvbicsIChkb25lKSA9PiB7CiAgICAgICAgYXNzZXJ0LmVxdWFsKCdm +dW5jdGlvbicsIHR5cGVvZiBmaXh0dXJlcy5jb25uZWN0aW9uLmNyZWF0ZUNvbm5lY3Rpb24pOwog +ICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBpdCgndHJhbnNhY3Rpb24nLCAoZG9uZSkgPT4gewog +ICAgICAgIGFzc2VydC5lcXVhbCgnZnVuY3Rpb24nLCB0eXBlb2YgZml4dHVyZXMudHJhbnNhY3Rp +b24uY3JlYXRlVHJhbnNhY3Rpb24pOwogICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBpdCgnbGlu +ZV9zb2NrZXQnLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5lcXVhbCgnZnVuY3Rpb24nLCB0 +eXBlb2YgZml4dHVyZXMubGluZV9zb2NrZXQuY29ubmVjdCk7CiAgICAgICAgZG9uZSgpOwogICAg +fSkKICAgIGl0KCdwbHVnaW4nLCAoZG9uZSkgPT4gewogICAgICAgIGNvbnN0IHAgPSBuZXcgZml4 +dHVyZXMucGx1Z2luKHBhdGguam9pbigndGVzdCcsICdmaXh0dXJlcycsICdtb2NrLXBsdWdpbicp +KTsKICAgICAgICBhc3NlcnQuZXF1YWwoJ2Z1bmN0aW9uJywgdHlwZW9mIHAubG9hZF9wbHVnaW4p +OwogICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBpdCgncmVzdWx0X3N0b3JlJywgKGRvbmUpID0+ +IHsKICAgICAgICBjb25zdCBycyA9IG5ldyBmaXh0dXJlcy5yZXN1bHRfc3RvcmUoKTsKICAgICAg +ICAvLyBjb25zb2xlLmxvZyhycyk7CiAgICAgICAgYXNzZXJ0LmVxdWFsKCdmdW5jdGlvbicsIHR5 +cGVvZiBycy5hZGQpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCiAgICBpdCgndXRpbF9obWFpbGl0 +ZW0nLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5lcXVhbCgnZnVuY3Rpb24nLCB0eXBlb2Yg +Zml4dHVyZXMudXRpbF9obWFpbGl0ZW0ubmV3TW9ja0hNYWlsSXRlbSk7CiAgICAgICAgZG9uZSgp +OwogICAgfSkKICAgIGl0KCd2bV9oYXJuZXNzJywgKGRvbmUpID0+IHsKICAgICAgICBhc3NlcnQu +ZXF1YWwoJ2Z1bmN0aW9uJywgdHlwZW9mIGZpeHR1cmVzLnZtX2hhcm5lc3Muc2FuZGJveF9yZXF1 +aXJlKTsKICAgICAgICBkb25lKCk7CiAgICB9KQp9KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlL2xpYi9saW5lX3NvY2tldC5qcwAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMDY0NSAAMzU2MDExNjYwNCAAMDEy +NjcwIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAw +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAApjb25zdCBFdmVudHMgPSByZXF1aXJlKCdldmVudHMnKTsKCmNv +bnN0IHN0dWIgICA9IHJlcXVpcmUoJy4vc3R1YicpOwoKY2xhc3MgU29ja2V0IGV4dGVuZHMgRXZl +bnRzIHsKICAgIGNvbnN0cnVjdG9yIChwb3J0LCBob3N0KSB7CiAgICAgICAgc3VwZXIoKTsKCiAg +ICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICAgICB0aGlzLmhvc3QgPSBob3N0OwogICAgICAg +IHRoaXMuc2V0VGltZW91dCA9IHN0dWIoKTsKICAgICAgICB0aGlzLnNldEtlZXBBbGl2ZSA9IHN0 +dWIoKTsKICAgICAgICB0aGlzLmRlc3Ryb3kgPSBzdHViKCk7CiAgICB9Cn0KCmV4cG9ydHMuU29j +a2V0ID0gU29ja2V0OwoKZXhwb3J0cy5jb25uZWN0ID0gZnVuY3Rpb24gKHBvcnQsIGhvc3QsIGNi +KSB7CiAgICByZXR1cm4gbmV3IFNvY2tldChwb3J0LCBob3N0KTsKfQoAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS9saWIvbG9nZ2VyLmpzAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDMzNTEgADM1NjAxMTY2MDQgADAxMTY0 +NSAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAKY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKCmNvbnN0IGxv +Z2dlciA9IGV4cG9ydHM7Cgpsb2dnZXIubGV2ZWxzID0gewogICAgREFUQTogICAgIDksCiAgICBQ +Uk9UT0NPTDogOCwKICAgIERFQlVHOiAgICA3LAogICAgSU5GTzogICAgIDYsCiAgICBOT1RJQ0U6 +ICAgNSwKICAgIFdBUk46ICAgICA0LAogICAgRVJST1I6ICAgIDMsCiAgICBDUklUOiAgICAgMiwK +ICAgIEFMRVJUOiAgICAxLAogICAgRU1FUkc6ICAgIDAsCn07Cgpsb2dnZXIubG9nID0gZnVuY3Rp +b24gKGxldmVsLCBkYXRhKSB7CiAgICBpZiAobGV2ZWwgPT09ICdQUk9UT0NPTCcpIHsKICAgICAg +ICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cbi9nLCAnXFxuXG4nKTsKICAgIH0KICAgIGlmIChsZXZl +bCA9PT0gJ0RFQlVHJykgcmV0dXJuOwogICAgaWYgKGxldmVsID09PSAnUFJPVE9DT0wnKSByZXR1 +cm47CiAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cci9nLCAnXFxyJykKICAgICAgICAucmVwbGFj +ZSgvXG4kLywgJycpOwoKICAgIGNvbnNvbGUubG9nKGRhdGEpOwogICAgcmV0dXJuIHRydWU7Cn07 +Cgpsb2dnZXIubG9nX2lmX2xldmVsID0gZnVuY3Rpb24gKGxldmVsLCBrZXksIHBsdWdpbikgewog +ICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobG9nZ2VyLmxvZ2xldmVsIDwgbG9n +Z2VyW2tleV0pIHJldHVybjsKICAgICAgICBjb25zdCBsZXZlbHN0ciA9ICdbJyArIGxldmVsICsg +J10nOwogICAgICAgIGxldCBzdHIgPSAnJzsKICAgICAgICBjb25zdCB1dWlkc3RyID0gJ1stXSc7 +CiAgICAgICAgbGV0IHBsdWdpbnN0ciA9ICdbJyArIChwbHVnaW4gfHwgJ2NvcmUnKSArICddJzsK +ICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAg +ICAgICAgY29uc3QgZGF0YSA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBk +YXRhICE9PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgc3RyICs9IGRhdGE7CiAgICAgICAg +ICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRhdGEpIGNv +bnRpbnVlOwogICAgICAgICAgICBpZiAoZGF0YS5uYW1lKSB7CiAgICAgICAgICAgICAgICBwbHVn +aW5zdHIgPSAnWycgKyBkYXRhLm5hbWUgKyAnXSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg +ZWxzZSB7CiAgICAgICAgICAgICAgICBzdHIgKz0gdXRpbC5pbnNwZWN0KGRhdGEpOwogICAgICAg +ICAgICB9CiAgICAgICAgfQogICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIFtsZXZlbHN0ciwgdXVp +ZHN0ciwgcGx1Z2luc3RyLCBzdHJdLmpvaW4oJyAnKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAg +ICB9Owp9OwoKbG9nZ2VyLmFkZF9sb2dfbWV0aG9kcyA9IGZ1bmN0aW9uIChvYmplY3QsIHBsdWdp +bikgewogICAgaWYgKCFvYmplY3QpIHJldHVybjsKICAgIGlmICh0eXBlb2Yob2JqZWN0KSAhPT0g +J29iamVjdCcpIHJldHVybjsKICAgIGZvciAoY29uc3QgbGV2ZWwgaW4gbG9nZ2VyLmxldmVscykg +ewogICAgICAgIGNvbnN0IGZuYW1lID0gJ2xvZycgKyBsZXZlbC50b0xvd2VyQ2FzZSgpOwogICAg +ICAgIGlmIChvYmplY3RbZm5hbWVdKSBjb250aW51ZTsgIC8vIGFscmVhZHkgYWRkZWQKICAgICAg +ICBvYmplY3RbZm5hbWVdID0gbG9nZ2VyLmxvZ19pZl9sZXZlbChsZXZlbCwgJ0xPRycrbGV2ZWws +IHBsdWdpbik7CiAgICB9Cn07Cgpsb2dnZXIuYWRkX2xvZ19tZXRob2RzKGxvZ2dlciwge25hbWU6 +ICd0ZXN0LWZpeHR1cmUnfSk7CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAHBhY2thZ2UvdGVzdC9sb2dnZXIuanMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw +MDA2NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAxMjcxIAAzNTYwMTE2NjA0IAAwMTIwNTUgADAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +MDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAACmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwoKY29uc3QgbG9n +Z2VyID0gcmVxdWlyZSgnLi4vbGliL2xvZ2dlcicpOwoKY29uc3QgcGx1Z2luID0geyBuYW1lOiAn +bW9ja19wbHVnaW4nIH07CgovLyBjb25zb2xlLmxvZyhsb2dnZXIpOwpkZXNjcmliZSgnbG9nZ2Vy +JywgZnVuY3Rpb24gKCkgewoKICAgIGl0KCdleHBvcnRzIGxvZ2dpbmcgZnVuY3Rpb25zJywgKGRv +bmUpID0+IHsKICAgICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGxvZ2dlci5sb2dpbmZvLCAnZnVu +Y3Rpb24nKTsKICAgICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGxvZ2dlci5sb2d3YXJuLCAnZnVu +Y3Rpb24nKTsKICAgICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGxvZ2dlci5sb2dlcnJvciwgJ2Z1 +bmN0aW9uJyk7CiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBsb2dnZXIubG9nLCAnZnVuY3Rp +b24nKTsKICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdsb2cnLCAoZG9uZSkgPT4gewog +ICAgICAgIGFzc2VydC5vayhsb2dnZXIubG9nKCdpbmZvJywgJ190ZXN0IGxvZygpXycpKTsKICAg +ICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdsb2dpbmZvJywgKGRvbmUpID0+IHsKICAgICAg +ICBhc3NlcnQub2sobG9nZ2VyLmxvZ2luZm8ocGx1Z2luLCAnX3Rlc3QgbG9naW5mbygpXycpKTsK +ICAgICAgICBkb25lKCk7CiAgICB9KQp9KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHBhY2thZ2UvdGVzdC9maXh0dXJlcy9tb2NrLXBsdWdpbi5qcwAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2 +NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMTcxIAAzNTYwMTE2NjA0IAAwMTQ2NzIgADAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAw +MDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAACmV4cG9ydHMucmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAvLyBjb25zb2xl +LmxvZygnSSBhbSBhIG1vY2sgcGx1Z2luIGZpbGUnKTsKICAgIHRoaXMuaW5oZXJpdHMoJ21vY2st +cGx1Z2luLWRpcicpOwp9OwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAABwYWNrYWdlL2xpYi9wbHVnaW4uanMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0 +IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAxNTAxMCAAMzU2MDExNjYwNCAAMDExNjU3IAAwAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAw +MCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAovLyBub2RlIGJ1aWx0LWlucwpjb25zdCBmcyAgICAgICAgID0gcmVxdWlyZSgnZnMn +KTsKY29uc3QgcGF0aCAgICAgICA9IHJlcXVpcmUoJ3BhdGgnKTsKY29uc3Qgdm0gICAgICAgICA9 +IHJlcXVpcmUoJ3ZtJyk7CgovLyBucG0gbW9kdWxlcwpjb25zdCBjb25zdGFudHMgID0gcmVxdWly +ZSgnaGFyYWthLWNvbnN0YW50cycpOwpjb25zdCBjb25maWcgICAgID0gcmVxdWlyZSgnaGFyYWth +LWNvbmZpZycpOwoKLy8gbG9jYWwgbW9kdWxlcwpjb25zdCBzdHViICAgICAgID0gcmVxdWlyZSgn +Li9zdHViJykuc3R1YjsKY29uc3Qgdm1faGFybmVzcyA9IHJlcXVpcmUoJy4vdm1faGFybmVzcycp +Owpjb25zdCBsb2dnZXIgICAgID0gcmVxdWlyZSgnLi9sb2dnZXInKTsKCmNsYXNzIFBsdWdpbiB7 +CiAgICBjb25zdHJ1Y3RvciAobmFtZSkgewogICAgICAgIGlmIChmYWxzZSA9PT0gKHRoaXMgaW5z +dGFuY2VvZiBQbHVnaW4pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUGx1Z2luKG5hbWUpOwog +ICAgICAgIH0KCiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLmJhc2UgPSB7 +fTsKICAgICAgICB0aGlzLnJlZ2lzdGVyX2hvb2sgPSBzdHViKCk7CiAgICAgICAgdGhpcy5wbHVn +aW5fcGF0aCA9IHRoaXMuX2dldF9wbHVnaW5fcGF0aChuYW1lKTsKICAgICAgICB0aGlzLmNvbmZp +ZyA9IHRoaXMuX2dldF9jb25maWcoKTsKICAgICAgICB0aGlzLmhvb2tzID0ge307CiAgICAgICAg +dGhpcy5sYXN0X2VyciA9ICcnOwoKICAgICAgICAvLyBTZXQgaW4gc2VydmVyLmpzOyBpbml0aWFs +aXplZCB0byBlbXB0eSBvYmplY3QKICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gYmxvd2lu +ZyB1cCBhbnkgdW5pdCB0ZXN0cy4KICAgICAgICB0aGlzLnNlcnZlciA9IHsgbm90ZXM6IHt9IH07 +CgogICAgICAgIGNvbnN0YW50cy5pbXBvcnQoZ2xvYmFsKTsKCiAgICAgICAgbG9nZ2VyLmFkZF9s +b2dfbWV0aG9kcyh0aGlzLCBuYW1lKTsKCiAgICAgICAgcmV0dXJuIHRoaXMubG9hZF9wbHVnaW4o +bmFtZSk7CiAgICB9CgogICAgX2hhc19wYWNrYWdlX2pzb24gKHBsdWdpbl9wYXRoKSB7CiAgICAg +ICAgaWYgKC9cL3BhY2thZ2VcLmpzb24kLy50ZXN0KHBsdWdpbl9wYXRoKSkgewogICAgICAgICAg +ICB0aGlzLmhhc1BhY2thZ2VKc29uID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAg +IH0KCiAgICAgICAgY29uc3QgZW5jbG9zaW5nX2RpciA9IHBhdGguZGlybmFtZShwbHVnaW5fcGF0 +aCk7CiAgICAgICAgaWYgKGZpbGVFeGlzdHMocGF0aC5qb2luKGVuY2xvc2luZ19kaXIsICdwYWNr +YWdlLmpzb24nKSkpIHsKICAgICAgICAgICAgdGhpcy5oYXNQYWNrYWdlSnNvbiA9IHRydWU7CiAg +ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAg +ICB9CgogICAgX2dldF9wbHVnaW5fcGF0aCAobmFtZSkgewogICAgICAgIGNvbnN0IHBsdWdpbiA9 +IHRoaXM7CgogICAgICAgIHBsdWdpbi5oYXNQYWNrYWdlSnNvbiA9IGZhbHNlOwogICAgICAgIGlm +ICghbmFtZSkgbmFtZSA9IHBsdWdpbi5uYW1lOwoKICAgICAgICBjb25zdCBwYXRocyA9IFtdOwog +ICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKF9fZGlybmFtZSkgPT09ICdsaWInCiAgICAgICAgICAg +ICYmIHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKF9fZGlybmFtZSkpID09PSAnaGFyYWthLXRl +c3QtZml4dHVyZXMnCiAgICAgICAgICAgICYmIHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKHBh +dGguZGlybmFtZShfX2Rpcm5hbWUpKSkgPT09ICdub2RlX21vZHVsZXMnKSB7CiAgICAgICAgICAg +IC8vIF9fZGlybmFtZSBlbmRzIHdpdGggbm9kZV9tb2R1bGVzL2hhcmFrYS10ZXh0LWZpeHR1cmVz +L2xpYgoKICAgICAgICAgICAgLyplc2xpbnQgbm8tZ2xvYmFsLWFzc2lnbjogWyJlcnJvciIsIHsi +ZXhjZXB0aW9ucyI6IFsiX19kaXJuYW1lIl19XSAqLwogICAgICAgICAgICAvKmVzbGludCBuby1u +YXRpdmUtcmVhc3NpZ246IFsiZXJyb3IiLCB7ImV4Y2VwdGlvbnMiOiBbIl9fZGlybmFtZSJdfV0g +Ki8KICAgICAgICAgICAgX19kaXJuYW1lID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywg +Jy4uJywgJy4uJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJ2xpYicgPT09IHBhdGguYmFzZW5h +bWUoX19kaXJuYW1lKSkgewogICAgICAgICAgICAvLyBmb3IgaGFyYWthLXRlc3QtZml4dHVyZSB0 +ZXN0cwogICAgICAgICAgICBwYXRocy5wdXNoKAogICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZl +KF9fZGlybmFtZSwgJy4uJywgbmFtZSArICcuanMnKSwKICAgICAgICAgICAgICAgIHBhdGgucmVz +b2x2ZShfX2Rpcm5hbWUsICcuLicsIG5hbWUsICdwYWNrYWdlLmpzb24nKQogICAgICAgICAgICAp +OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgncGx1Z2lucycgPT0gcGF0aC5iYXNlbmFtZShf +X2Rpcm5hbWUpKSB7CiAgICAgICAgICAgIC8vIGZvciAnaW5oZXJpdHMnIGluIEhhcmFrYS90ZXN0 +cy9wbHVnaW5zLyouanMKICAgICAgICAgICAgcGF0aHMucHVzaCgKICAgICAgICAgICAgICAgIHBh +dGgucmVzb2x2ZShfX2Rpcm5hbWUsIG5hbWUgKyAnLmpzJyksCiAgICAgICAgICAgICAgICBwYXRo +LnJlc29sdmUoX19kaXJuYW1lLCBuYW1lLCAncGFja2FnZS5qc29uJykKICAgICAgICAgICAgKTsK +ICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChkaXJFeGlzdHMocGF0aC5q +b2luKF9fZGlybmFtZSwgJ3BsdWdpbnMnKSkpIHsKICAgICAgICAgICAgICAgIC8vIEhhcmFrYS9w +bHVnaW5zLyouanMgJiYgSGFyYWthL25vZGVfbW9kdWxlcy8qCiAgICAgICAgICAgICAgICBwYXRo +cy5wdXNoKAogICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdwbHVn +aW5zJywgbmFtZSArICcuanMnKSwKICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoX19k +aXJuYW1lLCAncGx1Z2lucycsIG5hbWUsICdwYWNrYWdlLmpzb24nKSwKICAgICAgICAgICAgICAg +ICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnbm9kZV9tb2R1bGVzJywgbmFtZSwgJ3BhY2th +Z2UuanNvbicpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVs +c2UgewogICAgICAgICAgICAgICAgLy8gbnBtIHBhY2thZ2VkIHBsdWdpbnMKICAgICAgICAgICAg +ICAgIHBhdGhzLnB1c2goCiAgICAgICAgICAgICAgICAgICAgLy8gbnBtIHBhY2thZ2VkIHBsdWdp +biBpbmhlcml0aW5nIGFuIG5wbSBwYWNrYWdlZCBwbHVnaW4KICAgICAgICAgICAgICAgICAgICBw +YXRoLnJlc29sdmUoX19kaXJuYW1lLCAnbm9kZV9tb2R1bGVzJywgbmFtZSwgJ3BhY2thZ2UuanNv +bicpLAoKICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBuYW1lICsg +Jy5qcycpLAogICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdwYWNr +YWdlLmpzb24nKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAg +ICAgICAvLyBjb25zb2xlLmxvZyhwYXRocyk7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwg +cGF0aHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZz +LnN0YXRTeW5jKHBhdGhzW2ldKTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc19wYWNrYWdlX2pz +b24ocGF0aHNbaV0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhzW2ldOwogICAgICAgICAg +ICB9CiAgICAgICAgICAgIGNhdGNoIChpZ25vcmUpIHsKICAgICAgICAgICAgICAgIC8vIGNvbnNv +bGUuZXJyb3IoaWdub3JlLm1lc3NhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoK +ICAgIF9nZXRfY29uZmlnICgpIHsKICAgICAgICBpZiAodGhpcy5oYXNQYWNrYWdlSnNvbikgewog +ICAgICAgICAgICAvLyBJdCdzIGEgcGFja2FnZS9mb2xkZXIgcGx1Z2luIC0gbG9vayBpbiBwbHVn +aW4gZm9sZGVyIGZvciBkZWZhdWx0cywKICAgICAgICAgICAgLy8gaGFyYWthL2NvbmZpZyBmb2xk +ZXIgZm9yIG92ZXJyaWRlcwogICAgICAgICAgICByZXR1cm4gY29uZmlnLm1vZHVsZV9jb25maWco +CiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUodGhpcy5wbHVnaW5fcGF0aCksCiAgICAgICAg +ICAgICAgICBwcm9jZXNzLmVudi5IQVJBS0EgfHwgX19kaXJuYW1lCiAgICAgICAgICAgICk7CiAg +ICAgICAgfQoKICAgICAgICAvLyBQbGFpbiAuanMgZmlsZSwgZ2l0IG1vZGUgLSBqdXN0IGxvb2sg +aW4gdGhpcyBmb2xkZXIKICAgICAgICByZXR1cm4gY29uZmlnLm1vZHVsZV9jb25maWcoX19kaXJu +YW1lKTsKICAgIH0KCiAgICBfZ2V0X2NvZGUgKHBpX3BhdGgpIHsKICAgICAgICBjb25zdCBwbHVn +aW4gPSB0aGlzOwoKICAgICAgICBpZiAocGx1Z2luLmhhc1BhY2thZ2VKc29uKSB7CiAgICAgICAg +ICAgIGNvbnN0IHBwZCA9IHBhdGguZGlybmFtZShwaV9wYXRoKTsKCiAgICAgICAgICAgIC8vIHRo +aXMgaXNuJ3Qgd29ya2luZyBmb3IgaGFyYWthLXRlc3QtZml4dHVyZXMgdGVzdHMuIFdoeT8KICAg +ICAgICAgICAgLy8gcmV0dXJuICdleHBvcnRzID0gcmVxdWlyZSgiJyArIHBwZCArICciKTsnOwoK +ICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCAvIHVnbHkgY2hlYXRpbiBoYWNrCiAgICAgICAgICAg +IGNvbnN0IGpzID0gZnMucmVhZEZpbGVTeW5jKHBpX3BhdGgpOwogICAgICAgICAgICByZXR1cm4g +ZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcGQsIChqcy5tYWluIHx8ICdpbmRleC5qcycpKSk7 +CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gJyJ1c2Ugc3RyaWN0 +IjsnICsgZnMucmVhZEZpbGVTeW5jKHBpX3BhdGgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAo +ZXJyKSB7CiAgICAgICAgICAgIHRocm93ICdMb2FkaW5nIHBsdWdpbiAnICsgdGhpcy5uYW1lICsg +JyBmYWlsZWQ6ICcgKyBlcnI7CiAgICAgICAgfQogICAgfQoKICAgIGxvYWRfcGx1Z2luIChuYW1l +LCBwcCkgewoKICAgICAgICBpZiAoIXRoaXMubmFtZSkgewogICAgICAgICAgICAvLyBkb24ndCBj +aGFuZ2UgcGx1Z2luIG5hbWUgd2hlbiBjYWxsZWQgYnkgaW5oZXJpdHMoKTsKICAgICAgICAgICAg +dGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwcCkgcHAgPSB0aGlzLnBs +dWdpbl9wYXRoOwogICAgICAgIGlmICghcHApIHRocm93ICdjb3VsZCBub3QgZmluZCBwYXRoIHRv +IHBsdWdpbic7CiAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuX2dldF9jb2RlKHBwKTsKICAgICAg +ICAvLyBjb25zb2xlLmxvZyhjb2RlKTsKCiAgICAgICAgY29uc3Qgc2FuZGJveCA9IHsKICAgICAg +ICAgICAgcmVxdWlyZTogdm1faGFybmVzcy5zYW5kYm94X3JlcXVpcmUsCiAgICAgICAgICAgIF9f +ZmlsZW5hbWU6IHBwLAogICAgICAgICAgICBfX2Rpcm5hbWU6ICBwYXRoLmRpcm5hbWUocHApLAog +ICAgICAgICAgICBleHBvcnRzOiB0aGlzLAogICAgICAgICAgICBjb25zb2xlLAogICAgICAgICAg +ICBzZXRUaW1lb3V0LAogICAgICAgICAgICBjbGVhclRpbWVvdXQsCiAgICAgICAgICAgIHNldElu +dGVydmFsLAogICAgICAgICAgICBjbGVhckludGVydmFsLAogICAgICAgICAgICBwcm9jZXNzLAog +ICAgICAgICAgICBCdWZmZXIsCiAgICAgICAgICAgIE1hdGgsCiAgICAgICAgICAgIHNlcnZlcjog +dGhpcy5zZXJ2ZXIsCiAgICAgICAgICAgIHNldEltbWVkaWF0ZQogICAgICAgIH07CiAgICAgICAg +Y29uc3RhbnRzLmltcG9ydChzYW5kYm94KTsKICAgICAgICB2bS5ydW5Jbk5ld0NvbnRleHQoY29k +ZSwgc2FuZGJveCwgbmFtZSk7CgogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGluaGVy +aXRzIChwYXJlbnRfbmFtZSkgewogICAgICAgIGNvbnN0IHBhcmVudF9wYXRoID0gdGhpcy5fZ2V0 +X3BsdWdpbl9wYXRoKHBhcmVudF9uYW1lKTsKICAgICAgICBjb25zdCBwYXJlbnRfcGx1Z2luID0g +dGhpcy5sb2FkX3BsdWdpbihwYXJlbnRfbmFtZSwgcGFyZW50X3BhdGgpOwogICAgICAgIGZvciAo +Y29uc3QgbWV0aG9kIGluIHBhcmVudF9wbHVnaW4pIHsKICAgICAgICAgICAgaWYgKCF0aGlzW21l +dGhvZF0pIHsKICAgICAgICAgICAgICAgIHRoaXNbbWV0aG9kXSA9IHBhcmVudF9wbHVnaW5bbWV0 +aG9kXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmJhc2VbcGFyZW50X25h +bWVdID0gcGFyZW50X3BsdWdpbjsKICAgIH0KCiAgICBoYXJha2FfcmVxdWlyZSAobmFtZSkgewog +ICAgICAgIHJldHVybiByZXF1aXJlKCcuLycgKyBuYW1lKTsKICAgIH0KfQoKZnVuY3Rpb24gZGly +RXhpc3RzIChkaXIpIHsKICAgIHRyeSB7CiAgICAgICAgaWYgKGZzLnN0YXRTeW5jKGRpcikuaXNE +aXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjYXRjaCAoaWdub3JlKSB7fQogICAg +cmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBmaWxlRXhpc3RzIChmaWxlUGF0aCkgewogICAgdHJ5 +IHsKICAgICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpKSByZXR1cm4gdHJ1 +ZTsKICAgIH0KICAgIGNhdGNoIChpZ25vcmUpIHsKICAgICAgICAvLyBjb25zb2xlLmVycm9yKGln +bm9yZSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCm1vZHVsZS5leHBvcnRzID0gUGx1Z2lu +OwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdl +L3Rlc3QvcGx1Z2luLmpzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAA +AAAAMDAwMDAwMzU0NyAAMzU2MDExNjYwNCAAMDEyMTA0IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApjb25zdCBh +c3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKCmNvbnN0IHBhdGggICA9IHJlcXVpcmUoJ3BhdGgn +KTsKCmNvbnN0IFBsdWdpbiA9IHJlcXVpcmUoJy4uL2xpYi9wbHVnaW4nKTsKCmRlc2NyaWJlKCdw +bHVnaW4nLCBmdW5jdGlvbiAoKSB7CgogICAgaXQoJ2V4cG9ydHMgYSBQbHVnaW4gZnVuY3Rpb24n +LCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgUGx1Z2luLCAnZnVuY3Rp +b24nKTsKICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdjcmVhdGVzIGEgbmV3IFBsdWdp +biBmcm9tIC5qcycsIChkb25lKSA9PiB7CiAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gbmV3IFBs +dWdpbihwYXRoLmpvaW4oJ3Rlc3QnLCdmaXh0dXJlcycsJ21vY2stcGx1Z2luJykpOwogICAgICAg +IC8vIGNvbnNvbGUubG9nKG5ld1BsdWdpbik7CiAgICAgICAgYXNzZXJ0Lm9rKG5ld1BsdWdpbik7 +CiAgICAgICAgZG9uZSgpOwogICAgfSkKCiAgICBpdCgnY3JlYXRlcyBhIG5ldyBQbHVnaW4gZnJv +bSBkaXInLCAoZG9uZSkgPT4gewogICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG5ldyBQbHVnaW4o +cGF0aC5qb2luKCd0ZXN0JywnZml4dHVyZXMnLCdtb2NrLXBsdWdpbi1kaXInKSk7CiAgICAgICAg +Ly8gY29uc29sZS5sb2cobmV3UGx1Z2luKTsKICAgICAgICBhc3NlcnQub2sobmV3UGx1Z2luKTsK +ICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGRlc2NyaWJlKCdyZWdpc3RlcicsIGZ1bmN0aW9u +ICgpIHsKCiAgICAgICAgYmVmb3JlRWFjaChkb25lID0+IHsKICAgICAgICAgICAgLy8gY29uc29s +ZS5sb2coUGx1Z2luKTsKICAgICAgICAgICAgdGhpcy5wbHVnaW4gPSBuZXcgUGx1Z2luKHBhdGgu +am9pbigndGVzdCcsJ2ZpeHR1cmVzJywnbW9jay1wbHVnaW4tZGlyJykpOwogICAgICAgICAgICBk +b25lKCk7CiAgICAgICAgfSkKCiAgICAgICAgaXQoJ3JlZ2lzdGVyIGV4aXN0cycsIChkb25lKSA9 +PiB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucGx1Z2luKTsKICAgICAgICAgICAg +YXNzZXJ0LmVxdWFsKHR5cGVvZiB0aGlzLnBsdWdpbi5yZWdpc3RlciwgJ2Z1bmN0aW9uJyk7CiAg +ICAgICAgICAgIGRvbmUoKTsKICAgICAgICB9KQoKICAgICAgICBpdCgncmVnaXN0ZXIgcnVucycs +IChkb25lKSA9PiB7CiAgICAgICAgICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyKCk7CiAgICAgICAg +ICAgIGFzc2VydC5vayh0cnVlKTsgLy8gcmVnaXN0ZXIoKSBkaWRuJ3QgdGhyb3cKICAgICAgICAg +ICAgZG9uZSgpOwogICAgICAgIH0pCiAgICB9KQoKICAgIGl0KCdjYW4gcmVnaXN0ZXIgcGx1Z2lu +IHdpdGggaW5lcml0YW5jZScsIChkb25lKSA9PiB7CiAgICAgICAgY29uc3QgcGkgPSBuZXcgUGx1 +Z2luKHBhdGguam9pbigndGVzdCcsJ2ZpeHR1cmVzJywnbW9jay1wbHVnaW4nKSk7CiAgICAgICAg +YXNzZXJ0LmVxdWFsKHR5cGVvZiBwaS5yZWdpc3RlciwgJ2Z1bmN0aW9uJyk7CiAgICAgICAgcGku +cmVnaXN0ZXIoKTsKICAgICAgICBhc3NlcnQub2soT2JqZWN0LmtleXMocGkuYmFzZSkpOwogICAg +ICAgIGRvbmUoKTsKICAgIH0pCgogICAgaXQoJ3BsdWdpbiBuYW1lIHJlbWFpbnMgdGhlIHNhbWUg +YWZ0ZXIgYSBwbHVnaW4gaW5oZXJpdHMnLCAoZG9uZSkgPT4gewogICAgICAgIGNvbnN0IHBpID0g +bmV3IFBsdWdpbihwYXRoLmpvaW4oJ3Rlc3QnLCdmaXh0dXJlcycsJ21vY2stcGx1Z2luJykpOwog +ICAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgcGkucmVnaXN0ZXIsICdmdW5jdGlvbicpOwogICAg +ICAgIHBpLnJlZ2lzdGVyKCk7CiAgICAgICAgYXNzZXJ0LmVxdWFsKHBpLm5hbWUsIHBhdGguam9p +bigndGVzdCcsJ2ZpeHR1cmVzJywnbW9jay1wbHVnaW4nKSk7CiAgICAgICAgZG9uZSgpOwogICAg +fSkKfSkKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS9saWIv +c3R1Yi5qcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAw +MDAwMDA2NjcgADM1NjAxMTY2MDQgADAxMTM1MiAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZXhwb3J0cy5zdHVi +ID0gZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7CiAgICBmdW5jdGlvbiBzdHViICgpIHsKICAgICAg +ICBzdHViLmNhbGxlZCA9IHRydWU7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R1Yi5hcmdz +KSkgewogICAgICAgICAgICBzdHViLmFyZ3MucHVzaChhcmd1bWVudHMpOwogICAgICAgIH0KICAg +ICAgICBlbHNlIGlmIChzdHViLmFyZ3MpIHsKICAgICAgICAgICAgc3R1Yi5hcmdzID0gWyBzdHVi +LmFyZ3MsIGFyZ3VtZW50cyBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAg +c3R1Yi5hcmdzID0gYXJndW1lbnRzOwogICAgICAgIH0KICAgICAgICBzdHViLnRoaXNBcmcgPSB0 +aGlzOwogICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgIH0KCiAgICBzdHViLmNhbGxlZCA9 +IGZhbHNlOwoKICAgIHJldHVybiBzdHViOwp9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBhY2thZ2UvdGVzdC9z +dHViLmpzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAw +MDAxMTQ0IAAzNTYwMTE2NjA0IAAwMTE1NTIgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ3VzZSBzdHJpY3QnOwoK +Y29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JykKCmNvbnN0IGZpeHR1cmVzID0gcmVxdWly +ZSgnLi4vbGliL3N0dWInKTsKCmRlc2NyaWJlKCdzdHViJywgZnVuY3Rpb24gKCkgewoKICAgIGl0 +KCdpcyBhIGZ1bmN0aW9uJywgKGRvbmUpID0+IHsKICAgICAgICBhc3NlcnQuZXF1YWwodHlwZW9m +IGZpeHR1cmVzLnN0dWIsICdmdW5jdGlvbicpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCgogICAg +aXQoJ3JldHVybnMgYSBmdW5jdGlvbicsIChkb25lKSA9PiB7CiAgICAgICAgY29uc3Qgc3R1YiA9 +IG5ldyBmaXh0dXJlcy5zdHViKCk7CiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBzdHViLCAn +ZnVuY3Rpb24nKTsKICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdpbmRpY2F0ZXMgd2hl +biBoYXMgYmVlbiBjYWxsZWQnLCAoZG9uZSkgPT4gewogICAgICAgIGNvbnN0IHN0dWIgPSBuZXcg +Zml4dHVyZXMuc3R1YigpOwogICAgICAgIGFzc2VydC5lcXVhbChzdHViLmNhbGxlZCwgZmFsc2Up +OwogICAgICAgIHN0dWIoKTsKICAgICAgICBhc3NlcnQuZXF1YWwoc3R1Yi5jYWxsZWQsIHRydWUp +OwogICAgICAgIGRvbmUoKTsKICAgIH0pCn0pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBhY2thZ2UvbGliL3RyYW5z +YWN0aW9uLmpzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDIy +MzQzIAAzNTYwMTE2NjA0IAAwMTI3MTUgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8gQSBtb2NrIFNNVFAgVHJh +bnNhY3Rpb24KCmNvbnN0IGV2ZW50cyAgICAgID0gcmVxdWlyZSgnZXZlbnRzJyk7CmNvbnN0IFN0 +cmVhbSAgICAgID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtOwoKCmNvbnN0IE5vdGVzICAgICAg +ID0gcmVxdWlyZSgnaGFyYWthLW5vdGVzJyk7CmNvbnN0IFJlc3VsdFN0b3JlID0gcmVxdWlyZSgn +aGFyYWthLXJlc3VsdHMnKQoKY29uc3QgbG9nZ2VyICAgICAgPSByZXF1aXJlKCcuL2xvZ2dlcicp +CgpjbGFzcyBIZWFkZXIgewogICAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHsKICAgICAgICB0aGlz +LmhlYWRlcnMgPSB7fTsKICAgICAgICB0aGlzLmhlYWRlcnNfZGVjb2RlZCA9IHt9OwogICAgICAg +IHRoaXMuaGVhZGVyX2xpc3QgPSBbXTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwog +ICAgfQogICAgcGFyc2UgKCkgeyByZXR1cm4gdHJ1ZTsgfQogICAgbGluZXMgICAoKSB7IHJldHVy +biB0aGlzLmhlYWRlcl9saXN0OyB9CiAgICBhZGQgKGtleSwgdmFsKSB7CiAgICAgICAgY29uc3Qg +bG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKQogICAgICAgIHRoaXMuaGVhZGVyc1tsb3dlcktl +eV0gPSB0aGlzLmhlYWRlcnNbbG93ZXJLZXldIHx8IFtdOwogICAgICAgIHRoaXMuaGVhZGVyc1ts +b3dlcktleV0ucHVzaCh2YWwpOwogICAgICAgIHRoaXMuaGVhZGVyc19kZWNvZGVkW2xvd2VyS2V5 +XSA9IHRoaXMuaGVhZGVyc19kZWNvZGVkW2xvd2VyS2V5XSB8fCBbXTsKICAgICAgICB0aGlzLmhl +YWRlcnNfZGVjb2RlZFtsb3dlcktleV0ucHVzaCh2YWwpOwogICAgfQogICAgYWRkX2VuZCAoa2V5 +LCB2YWwpIHsgdGhpcy5hZGQoa2V5LCB2YWwpOyB9CiAgICBnZXQgICAgIChrZXkpIHsgcmV0dXJu +ICh0aGlzLmhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldIHx8IFtdKS5qb2luKCdcbicpOyB9CiAg +ICBnZXRfYWxsIChrZXkpIHsgcmV0dXJuIHRoaXMuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0g +fHwgW107IH0KICAgIGdldF9kZWNvZGVkIChrZXkpIHsgcmV0dXJuICh0aGlzLmhlYWRlcnNfZGVj +b2RlZFtrZXkudG9Mb3dlckNhc2UoKV0gfHwgW10pLmpvaW4oJ1xuJyk7IH0KICAgIHJlbW92ZSAg +KGtleSkgeyBkZWxldGUgdGhpcy5oZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXTsgfQp9CgpjbGFz +cyBNZXNzYWdlU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICAgIGNvbnN0cnVjdG9yIChjZmcsIGlk +LCBoZWFkZXJzKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoIWlkKSB0aHJvdyBuZXcg +RXJyb3IoJ2lkIHJlcXVpcmVkJyk7CiAgICAgICAgdGhpcy51dWlkID0gaWQ7CiAgICAgICAgdGhp +cy53cml0ZV9jZSA9IG51bGw7CiAgICAgICAgdGhpcy5yZWFkX2NlID0gbnVsbDsKICAgICAgICB0 +aGlzLmJ5dGVzX3JlYWQgPSAwOwogICAgICAgIHRoaXMuc3RhdGUgPSAxOwogICAgICAgIHRoaXMu +aWR4ID0ge307CiAgICAgICAgdGhpcy5lbmRfY2FsbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5l +bmRfY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHRoaXMuYnVmZmVyZWQgPSAwOwogICAgICAgIHRo +aXMudG90YWxfYnVmZmVyZWQgPSAwOwogICAgICAgIHRoaXMuX3F1ZXVlID0gW107CiAgICAgICAg +dGhpcy5tYXhfZGF0YV9pbmZsaWdodCA9IDA7CiAgICAgICAgdGhpcy5idWZmZXJfbWF4ID0gLTE7 +CiAgICAgICAgdGhpcy5zcG9vbGluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuZmQgPSBudWxsOwog +ICAgICAgIHRoaXMub3Blbl9wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5zcG9vbF9kaXIg +PSAnL3RtcCc7CiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGAke3RoaXMuc3Bvb2xfZGlyfS8ke2lk +fS5lbWxgOwogICAgICAgIHRoaXMud3JpdGVfcGVuZGluZyA9IGZhbHNlOwoKICAgICAgICB0aGlz +LnJlYWRhYmxlID0gdHJ1ZTsKICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlOwogICAgICAgIHRo +aXMuaGVhZGVycyA9IGhlYWRlcnMgfHwgW107CiAgICAgICAgdGhpcy5oZWFkZXJzX2RvbmUgPSBm +YWxzZTsKICAgICAgICB0aGlzLmhlYWRlcnNfZm91bmRfZW9oID0gZmFsc2U7CiAgICAgICAgdGhp +cy5saW5lX2VuZGluZ3MgPSAiXHJcbiI7CiAgICAgICAgdGhpcy5kb3Rfc3R1ZmZpbmcgPSBmYWxz +ZTsKICAgICAgICB0aGlzLmVuZGluZ19kb3QgPSBmYWxzZTsKICAgICAgICB0aGlzLmJ1ZmZlcl9z +aXplID0gKDEwMjQgKiA2NCk7CiAgICAgICAgdGhpcy5zdGFydCA9IDA7CiAgICAgICAgdGhpcy53 +cml0ZV9jb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIHRoaXMud3MgPSBudWxsOwogICAgICAgIHRo +aXMucnMgPSBudWxsOwogICAgICAgIHRoaXMuaW5fcGlwZSA9IGZhbHNlOwogICAgfQoKICAgIGFk +ZF9saW5lIChsaW5lKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgYWRkX2xpbmVf +ZW5kIChjYikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9CgpjbGFzcyBCb2R5IGV4dGVu +ZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7CiAgICBjb25zdHJ1Y3RvciAoaGVhZGVyLCBvcHRpb25z +KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlciB8fCBuZXcg +SGVhZGVyKCk7CiAgICAgICAgdGhpcy5oZWFkZXJfbGluZXMgPSBbXTsKICAgICAgICB0aGlzLmlz +X2h0bWwgPSBmYWxzZTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAg +ICAgIHRoaXMuZmlsdGVycyA9IFtdOwogICAgICAgIHRoaXMuYm9keXRleHQgPSAnJzsKCiAgICAg +ICAgdGhpcy5ib2R5X3RleHRfZW5jb2RlZCA9IEJ1ZmZlci5hbGxvYyg2NTUzNik7CiAgICAgICAg +dGhpcy5ib2R5X3RleHRfZW5jb2RlZF9wb3MgPSAwOwoKICAgICAgICB0aGlzLmJvZHlfZW5jb2Rp +bmcgPSBudWxsOwogICAgICAgIHRoaXMuYm91bmRhcnkgPSBudWxsOwogICAgICAgIHRoaXMuY3Qg +PSBudWxsOwogICAgICAgIHRoaXMuZGVjb2RlX2Z1bmN0aW9uID0gbnVsbDsKICAgICAgICB0aGlz +LmNoaWxkcmVuID0gW107IC8vIGlmIG11bHRpcGFydAogICAgICAgIHRoaXMuc3RhdGUgPSAnc3Rh +cnQnOwogICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmFsbG9jKDY1NTM2KTsKICAgICAgICB0aGlz +LmJ1Zl9maWxsID0gMDsKICAgICAgICB0aGlzLmRlY29kZV9hY2N1bXVsYXRvciA9ICcnOwogICAg +ICAgIC8vIHRoaXMuZGVjb2RlX3FwID0gbGluZSA9PiBsaWJxcC5kZWNvZGUobGluZS50b1N0cmlu +ZygpKTsKICAgICAgICB0aGlzLmRlY29kZV83Yml0ID0gdGhpcy5kZWNvZGVfOGJpdDsKICAgIH0K +Cn0KCmNsYXNzIFRyYW5zYWN0aW9uIHsKICAgIGNvbnN0cnVjdG9yICh1dWlkLCBjZmcpIHsKICAg +ICAgICB0aGlzLnV1aWQgPSB1dWlkIHx8ICcxMTExMTEtMjIyMjIyLTMzMy00NDQ0NDQ0JzsKICAg +ICAgICB0aGlzLmNmZyA9IGNmZzsKICAgICAgICB0aGlzLm1haWxfZnJvbSA9IG51bGw7CiAgICAg +ICAgdGhpcy5yY3B0X3RvID0gW107CiAgICAgICAgdGhpcy5oZWFkZXJfbGluZXMgPSBbXTsKICAg +ICAgICB0aGlzLmRhdGFfbGluZXMgPSBbXTsKICAgICAgICB0aGlzLmF0dGFjaG1lbnRfc3RhcnRf +aG9va3MgPSBbXTsKICAgICAgICB0aGlzLmJhbm5lciA9IG51bGw7CiAgICAgICAgdGhpcy5ib2R5 +X2ZpbHRlcnMgPSBbXTsKICAgICAgICB0aGlzLmRhdGFfYnl0ZXMgPSAwOwogICAgICAgIHRoaXMu +aGVhZGVyX3BvcyA9IDA7CiAgICAgICAgdGhpcy5mb3VuZF9oYl9zZXAgPSBmYWxzZTsKICAgICAg +ICB0aGlzLmJvZHkgPSBudWxsOwogICAgICAgIHRoaXMucGFyc2VfYm9keSA9IGZhbHNlOwogICAg +ICAgIHRoaXMubm90ZXMgPSBuZXcgTm90ZXMoKTsKICAgICAgICB0aGlzLm5vdGVzLnNraXBfcGx1 +Z2lucyA9IFtdOwogICAgICAgIHRoaXMuaGVhZGVyID0gbmV3IEhlYWRlcigpOwogICAgICAgIHRo +aXMubWVzc2FnZV9zdHJlYW0gPSBuZXcgTWVzc2FnZVN0cmVhbSh0aGlzLmNmZywgdGhpcy51dWlk +LCB0aGlzLmhlYWRlci5oZWFkZXJfbGlzdCk7CiAgICAgICAgdGhpcy5kaXNjYXJkX2RhdGEgPSBm +YWxzZTsKICAgICAgICB0aGlzLnJlc2V0dGluZyA9IGZhbHNlOwogICAgICAgIHRoaXMucmNwdF9j +b3VudCA9IHsKICAgICAgICAgICAgYWNjZXB0OiAgIDAsCiAgICAgICAgICAgIHRlbXBmYWlsOiAw +LAogICAgICAgICAgICByZWplY3Q6ICAgMCwKICAgICAgICB9OwogICAgICAgIHRoaXMubXNnX3N0 +YXR1cyA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmRhdGFfcG9zdF9zdGFydCA9IG51bGw7CiAg +ICAgICAgdGhpcy5kYXRhX3Bvc3RfZGVsYXkgPSAwOwogICAgICAgIHRoaXMuZW5jb2RpbmcgPSAn +dXRmOCc7CiAgICAgICAgdGhpcy5taW1lX3BhcnRfY291bnQgPSAwOwogICAgICAgIHRoaXMucmVz +dWx0cyA9IG5ldyBSZXN1bHRTdG9yZSh0aGlzKTsKICAgICAgICBsb2dnZXIuYWRkX2xvZ19tZXRo +b2RzKHRoaXMsICdtb2NrLWNvbm5lY3Rpb24nKTsKICAgIH0KCiAgICBlbnN1cmVfYm9keSAoKSB7 +CiAgICAgICAgaWYgKHRoaXMuYm9keSkgcmV0dXJuOwoKICAgICAgICB0aGlzLmJvZHkgPSBuZXcg +IEJvZHkodGhpcy5oZWFkZXIpOwogICAgICAgIHRoaXMuYXR0YWNobWVudF9zdGFydF9ob29rcy5m +b3JFYWNoKGggPT4gewogICAgICAgICAgICB0aGlzLmJvZHkub24oJ2F0dGFjaG1lbnRfc3RhcnQn +LCBoKTsKICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5iYW5uZXIpIHRoaXMuYm9keS5zZXRf +YmFubmVyKHRoaXMuYmFubmVyKTsKCiAgICAgICAgdGhpcy5ib2R5X2ZpbHRlcnMuZm9yRWFjaChv +ID0+IHsKICAgICAgICAgICAgdGhpcy5ib2R5LmFkZF9maWx0ZXIoKGN0LCBlbmMsIGJ1ZikgPT4g +ewogICAgICAgICAgICAgICAgaWYgKChvLmN0X21hdGNoIGluc3RhbmNlb2YgUmVnRXhwICYmCiAg +ICAgICAgICAgICAgICAgICAgIG8uY3RfbWF0Y2gudGVzdChjdC50b0xvd2VyQ2FzZSgpKSkgfHwK +ICAgICAgICAgICAgICAgICAgICAgICAgY3QudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgLmluZGV4T2YoU3RyaW5nKG8uY3RfbWF0Y2gpCiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCkpID09PSAwKSB7CiAgICAgICAgICAgICAgICAg +ICAgcmV0dXJuIG8uZmlsdGVyKGN0LCBlbmMsIGJ1Zik7CiAgICAgICAgICAgICAgICB9CiAgICAg +ICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGFkZF9kYXRhIChsaW5lKSB7CiAgICAg +ICAgaWYgKHR5cGVvZiBsaW5lID09PSAnc3RyaW5nJykgeyAvLyBUaGlzIHNob3VsZG4ndCBldmVy +IGhhcHBlbi4uLgogICAgICAgICAgICBsaW5lID0gbmV3IEJ1ZmZlcihsaW5lLCAnYmluYXJ5Jyk7 +CiAgICAgICAgfQogICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiBoZWFkZXJz +IGxpbmUKICAgICAgICBpZiAodGhpcy5oZWFkZXJfcG9zID09PSAwICYmCiAgICAgICAgICAgIChs +aW5lWzBdID09PSAweDBBIHx8IChsaW5lWzBdID09PSAweDBEICYmIGxpbmVbMV0gPT09IDB4MEEp +KSApIHsKICAgICAgICAgICAgdGhpcy5oZWFkZXIucGFyc2UodGhpcy5oZWFkZXJfbGluZXMpOwog +ICAgICAgICAgICB0aGlzLmhlYWRlcl9wb3MgPSB0aGlzLmhlYWRlcl9saW5lcy5sZW5ndGg7CiAg +ICAgICAgICAgIHRoaXMuZm91bmRfaGJfc2VwID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMu +cGFyc2VfYm9keSkgewogICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVfYm9keSgpOwogICAgICAg +ICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuaGVhZGVyX3BvcyA9PT0gMCkg +ewogICAgICAgICAgICAvLyBCdWlsZCB1cCBoZWFkZXJzCiAgICAgICAgICAgIGlmICh0aGlzLmhl +YWRlcl9saW5lcy5sZW5ndGggPCB0aGlzLmNmZy5oZWFkZXJzLm1heF9saW5lcykgewogICAgICAg +ICAgICAgICAgaWYgKGxpbmVbMF0gPT09IDB4MkUpIGxpbmUgPSBsaW5lLnNsaWNlKDEpOyAvLyBT +dHJpcCBsZWFkaW5nICIuIgogICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJfbGluZXMucHVzaCgK +ICAgICAgICAgICAgICAgICAgICBsaW5lLnRvU3RyaW5nKCdiaW5hcnknKS5yZXBsYWNlKC9cclxu +JC8sICdcbicpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlz +LmhlYWRlcl9wb3MgJiYgdGhpcy5wYXJzZV9ib2R5KSB7CiAgICAgICAgICAgIGlmIChsaW5lWzBd +ID09PSAweDJFKSBsaW5lID0gbGluZS5zbGljZSgxKTsgLy8gU3RyaXAgbGVhZGluZyAiLiIKICAg +ICAgICAgICAgbGV0IG5ld19saW5lID0gdGhpcy5ib2R5LnBhcnNlX21vcmUoCiAgICAgICAgICAg +ICAgICBsaW5lLnRvU3RyaW5nKCdiaW5hcnknKS5yZXBsYWNlKC9cclxuJC8sICdcbicpKTsKCiAg +ICAgICAgICAgIGlmICghbmV3X2xpbmUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47 +IC8vIGJ1ZmZlcmluZyBmb3IgYmFubmVycwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXdf +bGluZSA9IG5ld19saW5lLnJlcGxhY2UoL15cLi9nbSwgJy4uJykucmVwbGFjZSgvXHI/XG4vZ20s +ICdcclxuJyk7CiAgICAgICAgICAgIGxpbmUgPSBuZXcgQnVmZmVyKG5ld19saW5lLCdiaW5hcnkn +KTsKICAgICAgICB9CgogICAgICAgIGlmICghdGhpcy5kaXNjYXJkX2RhdGEpIHRoaXMubWVzc2Fn +ZV9zdHJlYW0uYWRkX2xpbmUobGluZSk7CiAgICB9CgogICAgZW5kX2RhdGEgKGNiKSB7CiAgICAg +ICAgaWYgKCF0aGlzLmZvdW5kX2hiX3NlcCAmJiB0aGlzLmhlYWRlcl9saW5lcy5sZW5ndGgpIHsK +ICAgICAgICAgICAgLy8gSGVhZGVycyBub3QgcGFyc2VkIHlldCAtIG11c3QgYmUgYSBidXN0ZWQg +ZW1haWwKICAgICAgICAgICAgLy8gU3RyYXRlZ3k6IEZpbmQgdGhlIGZpcnN0IGxpbmUgdGhhdCBk +b2Vzbid0IGxvb2sgbGlrZSBhIGhlYWRlci4KICAgICAgICAgICAgLy8gVHJlYXQgYW55dGhpbmcg +YmVmb3JlIHRoYXQgYXMgaGVhZGVycywgYW55dGhpbmcgYWZ0ZXIgYXMgYm9keS4KICAgICAgICAg +ICAgbGV0IGhlYWRlcl9wb3MgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRo +aXMuaGVhZGVyX2xpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBBbnl0aGlu +ZyB0aGF0IGRvZXNuJ3QgbWF0Y2ggYSBoZWFkZXIgb3IgY29udGludWF0aW9uCiAgICAgICAgICAg +ICAgICBpZiAoIS9eKD86KFteXHM6XSopOlxzKihbXHNcU10qKSR8WyBcdF0pLy50ZXN0KHRoaXMu +aGVhZGVyX2xpbmVzW2ldKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgaGVhZGVyX3BvcyA9IGk7CiAgICAgICAgICAgIH0KICAg +ICAgICAgICAgY29uc3QgYm9keV9saW5lcyA9IHRoaXMuaGVhZGVyX2xpbmVzLnNwbGljZShoZWFk +ZXJfcG9zICsgMSk7CiAgICAgICAgICAgIHRoaXMuaGVhZGVyLnBhcnNlKHRoaXMuaGVhZGVyX2xp +bmVzKTsKICAgICAgICAgICAgdGhpcy5oZWFkZXJfcG9zID0gaGVhZGVyX3BvczsKICAgICAgICAg +ICAgaWYgKHRoaXMucGFyc2VfYm9keSkgewogICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVfYm9k +eSgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBib2R5X2xpbmVzLmxlbmd0 +aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib2R5LnBhcnNlX21vcmUoYm9keV9s +aW5lc1tqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAg +ICAgaWYgKHRoaXMuaGVhZGVyX3BvcyAmJiB0aGlzLnBhcnNlX2JvZHkpIHsKICAgICAgICAgICAg +bGV0IGRhdGEgPSB0aGlzLmJvZHkucGFyc2VfZW5kKCk7CiAgICAgICAgICAgIGlmIChkYXRhLmxl +bmd0aCkgewogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoJ2JpbmFyeScpCiAg +ICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL15cLi9nbSwgJy4uJykKICAgICAgICAgICAgICAg +ICAgICAucmVwbGFjZSgvXHI/XG4vZ20sICdcclxuJyk7CiAgICAgICAgICAgICAgICBjb25zdCBs +aW5lID0gbmV3IEJ1ZmZlcihkYXRhLCAnYmluYXJ5Jyk7CgogICAgICAgICAgICAgICAgaWYgKCF0 +aGlzLmRpc2NhcmRfZGF0YSkgdGhpcy5tZXNzYWdlX3N0cmVhbS5hZGRfbGluZShsaW5lKTsKICAg +ICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLmRpc2NhcmRfZGF0YSkgewog +ICAgICAgICAgICB0aGlzLm1lc3NhZ2Vfc3RyZWFtLmFkZF9saW5lX2VuZChjYik7CiAgICAgICAg +fQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjYigpOwogICAgICAgIH0KICAgIH0KCiAgICBh +ZGRfaGVhZGVyIChrZXksIHZhbHVlKSB7CiAgICAgICAgdGhpcy5oZWFkZXIuYWRkX2VuZChrZXks +IHZhbHVlKTsKICAgICAgICBpZiAodGhpcy5oZWFkZXJfcG9zID4gMCkgdGhpcy5yZXNldF9oZWFk +ZXJzKCk7CiAgICB9CgogICAgYWRkX2xlYWRpbmdfaGVhZGVyIChrZXksIHZhbHVlKSB7CiAgICAg +ICAgdGhpcy5oZWFkZXIuYWRkKGtleSwgdmFsdWUpOwogICAgICAgIGlmICh0aGlzLmhlYWRlcl9w +b3MgPiAwKSB0aGlzLnJlc2V0X2hlYWRlcnMoKTsKICAgIH0KCiAgICByZXNldF9oZWFkZXJzICgp +IHsKICAgICAgICBjb25zdCBoZWFkZXJfbGluZXMgPSB0aGlzLmhlYWRlci5saW5lcygpOwogICAg +ICAgIHRoaXMuaGVhZGVyX3BvcyA9IGhlYWRlcl9saW5lcy5sZW5ndGg7CiAgICB9CgogICAgcmVt +b3ZlX2hlYWRlciAoa2V5KSB7CiAgICAgICAgdGhpcy5oZWFkZXIucmVtb3ZlKGtleSk7CiAgICAg +ICAgaWYgKHRoaXMuaGVhZGVyX3BvcyA+IDApIHRoaXMucmVzZXRfaGVhZGVycygpOwogICAgfQoK +ICAgIGF0dGFjaG1lbnRfaG9va3MgKHN0YXJ0LCBkYXRhLCBlbmQpIHsKICAgICAgICB0aGlzLnBh +cnNlX2JvZHkgPSAxOwogICAgICAgIHRoaXMuYXR0YWNobWVudF9zdGFydF9ob29rcy5wdXNoKHN0 +YXJ0KTsKICAgIH0KCiAgICBzZXRfYmFubmVyICh0ZXh0LCBodG1sKSB7CiAgICAgICAgLy8gdGhy +b3cgInRyYW5zYWN0aW9uLnNldF9iYW5uZXIgaXMgY3VycmVudGx5IG5vbi1mdW5jdGlvbmFsIjsK +ICAgICAgICB0aGlzLnBhcnNlX2JvZHkgPSB0cnVlOwogICAgICAgIGlmICghaHRtbCkgewogICAg +ICAgICAgICBodG1sID0gdGV4dC5yZXBsYWNlKC9cbi9nLCAnPGJyLz5cbicpOwogICAgICAgIH0K +ICAgICAgICB0aGlzLmJhbm5lciA9IFt0ZXh0LCBodG1sXTsKICAgIH0KCiAgICBhZGRfYm9keV9m +aWx0ZXIgKGN0X21hdGNoLCBmaWx0ZXIpIHsKICAgICAgICB0aGlzLnBhcnNlX2JvZHkgPSB0cnVl +OwogICAgICAgIHRoaXMuYm9keV9maWx0ZXJzLnB1c2goe2N0X21hdGNoLCBmaWx0ZXJ9KTsKICAg +IH0KfQoKZXhwb3J0cy5UcmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uOwoKZXhwb3J0cy5jcmVhdGVU +cmFuc2FjdGlvbiA9IGZ1bmN0aW9uICh1dWlkLCBjZmcpIHsKICAgIHJldHVybiBuZXcgVHJhbnNh +Y3Rpb24odXVpZCwgY2ZnKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlL3Rlc3QvdHJhbnNhY3Rpb24uanMAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwNDA2MiAAMzU2MDExNjYwNCAAMDEz +MTI0IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAw +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAApjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKQoKY29u +c3QgdHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuLi9saWIvdHJhbnNhY3Rpb24nKTsKCmRlc2NyaWJl +KCd0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHsKCiAgICBpdCgnZXhwb3J0cyBjcmVhdGVUcmFu +c2FjdGlvbicsIChkb25lKSA9PiB7CiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiB0cmFuc2Fj +dGlvbi5jcmVhdGVUcmFuc2FjdGlvbiwgJ2Z1bmN0aW9uJyk7CiAgICAgICAgZG9uZSgpOwogICAg +fSkKCiAgICBpdCgnY3JlYXRlcyBhIG5ldyB0cmFuc2FjdGlvbicsIChkb25lKSA9PiB7CiAgICAg +ICAgY29uc3QgbmV3VHJhbnMgPSB0cmFuc2FjdGlvbi5jcmVhdGVUcmFuc2FjdGlvbigpOwogICAg +ICAgIC8vIGNvbnNvbGUubG9nKG5ld1RyYW5zKTsKICAgICAgICBhc3NlcnQub2sobmV3VHJhbnMp +OwogICAgICAgIGRvbmUoKTsKICAgIH0pCgogICAgaXQoJ2NhbiBzZXQgYW5kIGdldCBhIGhlYWRl +cicsIChkb25lKSA9PiB7CiAgICAgICAgY29uc3QgbmV3VHJhbnMgPSB0cmFuc2FjdGlvbi5jcmVh +dGVUcmFuc2FjdGlvbigpOwogICAgICAgIG5ld1RyYW5zLmFkZF9oZWFkZXIoJ1gtVGVzdC1IZWFk +ZXInLCAnSGFzIGEgdmFsdWUnKTsKICAgICAgICBhc3NlcnQuZXF1YWwobmV3VHJhbnMuaGVhZGVy +LmdldCgnWC1UZXN0LUhlYWRlcicpLCAnSGFzIGEgdmFsdWUnKTsKICAgICAgICBkb25lKCk7CiAg +ICB9KQoKICAgIGl0KCdjYW4gY2FsbCBtZXNzYWdlX3N0cmVhbS5hZGRfbGluZScsIChkb25lKSA9 +PiB7CiAgICAgICAgY29uc3QgbmV3VHJhbnMgPSB0cmFuc2FjdGlvbi5jcmVhdGVUcmFuc2FjdGlv +bigpOwogICAgICAgIC8vY29uc29sZS5sb2cobmV3VHJhbnMubWVzc2FnZV9zdHJlYW0pOwogICAg +ICAgIGFzc2VydC5vayhuZXdUcmFucy5tZXNzYWdlX3N0cmVhbS5hZGRfbGluZSgnZm9vXHJcbicp +KTsKICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdjYW4gYWRkIGEgbXVsdGlwbGUgdmFs +dWUgaGVhZGVyJywgKGRvbmUpID0+IHsKICAgICAgICBjb25zdCBuZXdUcmFucyA9IHRyYW5zYWN0 +aW9uLmNyZWF0ZVRyYW5zYWN0aW9uKCk7CiAgICAgICAgbmV3VHJhbnMuYWRkX2hlYWRlcignWC1U +ZXN0LUhlYWRlcicsICdIYXMgYSB2YWx1ZScpOwogICAgICAgIG5ld1RyYW5zLmFkZF9oZWFkZXIo +J1gtVGVzdC1IZWFkZXInLCdhbmQgYW5vdGhlcicpOwogICAgICAgIGNvbnN0IHRlc3RIZHJWYWxz +ID0gbmV3VHJhbnMuaGVhZGVyLmdldF9hbGwoJ1gtVGVzdC1IZWFkZXInKTsKICAgICAgICBhc3Nl +cnQuZXF1YWwodGVzdEhkclZhbHNbMF0sICdIYXMgYSB2YWx1ZScpOwogICAgICAgIGFzc2VydC5l +cXVhbCh0ZXN0SGRyVmFsc1sxXSwgJ2FuZCBhbm90aGVyJyk7CiAgICAgICAgZG9uZSgpOwogICAg +fSkKCiAgICBkZXNjcmliZSgnSGVhZGVyJywgZnVuY3Rpb24gKCkgewoKICAgICAgICBiZWZvcmVF +YWNoKChkb25lKSA9PiB7CiAgICAgICAgICAgIHRoaXMudHhuID0gdHJhbnNhY3Rpb24uY3JlYXRl +VHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgZG9uZSgpCiAgICAgICAgfSkKCiAgICAgICAgaXQo +J2FkZC9nZXQnLCAoZG9uZSkgPT4gewogICAgICAgICAgICB0aGlzLnR4bi5oZWFkZXIuYWRkKCdG +cm9tJywgJ1NvbWUgQm9keSA8Ym9keUBleGFtcGxlLmNvbT4nKQogICAgICAgICAgICBhc3NlcnQu +b2sodGhpcy50eG4pCiAgICAgICAgICAgIGFzc2VydC5lcXVhbCh0aGlzLnR4bi5oZWFkZXIuZ2V0 +KCdGcm9tJyksICdTb21lIEJvZHkgPGJvZHlAZXhhbXBsZS5jb20+JykKICAgICAgICAgICAgZG9u +ZSgpOwogICAgICAgIH0pCgogICAgICAgIGl0KCdnZXRfZGVjb2RlZCcsIChkb25lKSA9PiB7CiAg +ICAgICAgICAgIHRoaXMudHhuLmhlYWRlci5hZGQoJ0Zyb20nLCAnU29tZSBCb2R5IDxib2R5QGV4 +YW1wbGUuY29tPicpCiAgICAgICAgICAgIGFzc2VydC5vayh0aGlzLnR4bikKICAgICAgICAgICAg +YXNzZXJ0LmVxdWFsKHRoaXMudHhuLmhlYWRlci5nZXRfZGVjb2RlZCgnRnJvbScpLCAnU29tZSBC +b2R5IDxib2R5QGV4YW1wbGUuY29tPicpCiAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICB9KQog +ICAgfSkKfSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABwYWNrYWdlL2xpYi91dGlsX2htYWlsaXRlbS5qcwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +MDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAxMTY2NSAAMzU2MDExNjYwNCAAMDEzNDAzIAAw +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +ADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAApjb25zdCBBZGRyZXNzICAgICAgICAgPSByZXF1aXJlKCdhZGRyZXNzLXJm +YzI4MjEnKS5BZGRyZXNzOwpjb25zdCBzdHViX2Nvbm5lY3Rpb24gPSByZXF1aXJlKCcuL2Nvbm5l +Y3Rpb24nKTsKY29uc3QgdHJhbnNhY3Rpb24gICAgID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicp +OwoKLyoqCiAqIENyZWF0ZXMgYSBITWFpbEl0ZW0gaW5zdGFuY2UsIHdoaWNoIGlzIHBhc3NlZCB0 +byBjYWxsYmFjay4gUmVwb3J0cyBlcnJvciBvbiB0ZXN0IHBhcmFtIGlmIGNyZWF0aW9uIGZhaWxz +LgogKgogKiBAcGFyYW0gb3V0Ym91bmRfY29udGV4dAogKiBAcGFyYW0gdGVzdAogKiBAcGFyYW0g +b3B0aW9ucwogKiBAcGFyYW0gY2FsbGJhY2sKICovCmV4cG9ydHMubmV3TW9ja0hNYWlsSXRlbSA9 +IGZ1bmN0aW9uIChvdXRib3VuZF9jb250ZXh0LCB0ZXN0LCBvcHRpb25zLCBjYWxsYmFjaykgewog +ICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307CiAgICBleHBvcnRzLmNyZWF0ZUhNYWlsSXRl +bSgKICAgICAgICBvdXRib3VuZF9jb250ZXh0LAogICAgICAgIG9wdHMsCiAgICAgICAgZnVuY3Rp +b24gKGVyciwgaG1haWwpIHsKICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAg +dGVzdC5vayhmYWxzZSwgJ0NvdWxkIG5vdCBjcmVhdGUgSE1haWxJdGVtOiAnICsgZXJyKTsKICAg +ICAgICAgICAgICAgIHRlc3QuZG9uZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAg +ICAgICB9CiAgICAgICAgICAgIGlmICghaG1haWwudG9kbykgewogICAgICAgICAgICAgICAgaG1h +aWwub25jZSgncmVhZHknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vz +cy5uZXh0VGljayhmdW5jdGlvbiAoKXtjYWxsYmFjayhobWFpbCk7fSk7CiAgICAgICAgICAgICAg +ICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNh +bGxiYWNrKGhtYWlsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICk7Cn0KCi8qKgogKiBD +cmVhdGVzIGEgdGVzdCBITWFpbEl0ZW0gaW5zdGFuY2UKICoKICogQHBhcmFtIG91dGJvdW5kX2Nv +bnRleHQ6IFRoZSBjb250ZXh0IG9mIHRoZSBvdXRib3VuZC5qcywgZS5nLiBmcm9tCiAgICAgICAg +ICByZXF1aXJlKCdub2RldW5pdCcpLnV0aWxzLnNhbmRib3goJ291dGJvdW5kLmpzJykKICogQHBh +cmFtIG9wdGlvbnMKICogQHBhcmFtIGNhbGxiYWNrKGVyciwgaG1haWwpCiAqLwpleHBvcnRzLmNy +ZWF0ZUhNYWlsSXRlbSA9IGZ1bmN0aW9uIChvdXRib3VuZF9jb250ZXh0LCBvcHRpb25zLCBjYWxs +YmFjaykgewoKICAgIGNvbnN0IG1haWxfZnJvbSA9IG9wdGlvbnMubWFpbF9mcm9tIHx8ICdzZW5k +ZXJAZG9tYWluJzsKICAgIGNvbnN0IGRlbGl2ZXJ5X2RvbWFpbiA9IG9wdGlvbnMuZGVsaXZlcnlf +ZG9tYWluIHx8ICdkb21haW4nOwogICAgY29uc3QgbWFpbF9yZWNpcGllbnRzID0gb3B0aW9ucy5t +YWlsX3JlY2lwaWVudHMgfHwgW25ldyBBZGRyZXNzKCdyZWNpcGllbnRAZG9tYWluJyldOwoKICAg +IGNvbnN0IGNvbm4gPSBzdHViX2Nvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbigpOwogICAgY29u +bi50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uLmNyZWF0ZVRyYW5zYWN0aW9uKCdzb21ldXVpZCcp +OwogICAgY29ubi50cmFuc2FjdGlvbi5tYWlsX2Zyb20gPSBuZXcgQWRkcmVzcyhtYWlsX2Zyb20p +OwoKICAgIGNvbnN0IHRvZG8gPSBuZXcgb3V0Ym91bmRfY29udGV4dC5UT0RPSXRlbShkZWxpdmVy +eV9kb21haW4sIG1haWxfcmVjaXBpZW50cywgY29ubi50cmFuc2FjdGlvbik7CiAgICB0b2RvLnV1 +aWQgPSB0b2RvLnV1aWQgKyAnLicgKyAxOwoKICAgIGxldCBjb250ZW50cyA9IFsKICAgICAgICAi +RnJvbTogIiArIG1haWxfZnJvbSwKICAgICAgICAiVG86ICIgKyBtYWlsX3JlY2lwaWVudHMuam9p +bigiLCAiKSwKICAgICAgICAiTUlNRS1WZXJzaW9uOiAxLjAiLAogICAgICAgICJDb250ZW50LXR5 +cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkiLAogICAgICAgICJTdWJqZWN0OiBTb21l +IHN1YmplY3QgaGVyZSIsCiAgICAgICAgIiIsCiAgICAgICAgIlNvbWUgZW1haWwgYm9keSBoZXJl +IiwKICAgICAgICAiIl0uam9pbigiXG4iKTsKICAgIGxldCBtYXRjaDsKICAgIGNvbnN0IHJlID0g +L14oW15cbl0qXG4/KS87CiAgICAvKmVzbGludCBuby1jb25kLWFzc2lnbjogIm9mZiIgKi8KICAg +IHdoaWxlIChtYXRjaCA9IHJlLmV4ZWMoY29udGVudHMpKSB7CiAgICAgICAgbGV0IGxpbmUgPSBt +YXRjaFsxXTsKICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9ccj9cbj8kLywgJ1xyXG4nKTsg +Ly8gbWFrZSBzdXJlIGl0IGVuZHMgaW4gXHJcbgogICAgICAgIGNvbm4udHJhbnNhY3Rpb24uYWRk +X2RhdGEobmV3IEJ1ZmZlcihsaW5lKSk7CiAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5zdWJz +dHIobWF0Y2hbMV0ubGVuZ3RoKTsKICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAwKSB7 +CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGNvbm4udHJhbnNhY3Rpb24u +bWVzc2FnZV9zdHJlYW0uYWRkX2xpbmVfZW5kKCk7CgogICAgY29uc3QgaG1haWxzID0gW107CiAg +ICBjb25zdCBva19wYXRocyA9IFtdOwogICAgb3V0Ym91bmRfY29udGV4dC5leHBvcnRzLnByb2Nl +c3NfZGVsaXZlcnkob2tfcGF0aHMsIHRvZG8sIGhtYWlscywgZnVuY3Rpb24gKGVycikgewogICAg +ICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgY2FsbGJhY2soJ3Byb2Nlc3NfZGVsaXZlcnkgZXJy +b3I6ICcgKyBlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICho +bWFpbHMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgY2FsbGJhY2soJ05vIGhtYWlsIHByb2R1 +Y3RlZCcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGo9 +MDsgajxobWFpbHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgY29uc3QgaG1haWwgPSBobWFp +bHNbal07CiAgICAgICAgICAgIGhtYWlsLmhvc3RsaXN0ID0gWyBkZWxpdmVyeV9kb21haW4gXTsK +ICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaG1haWwpOwogICAgICAgIH0KICAgIH0pOwoKfQoK +LyoqCiAqIHJ1bnMgYSBzb2NrZXQud3JpdGUKICogQHBhcmFtIHNvY2tldAogKiBAcGFyYW0gdGVz +dAogKiBAcGFyYW0gcGxheWJvb2sKICovCmV4cG9ydHMucGxheVRlc3RTbXRwQ29udmVyc2F0aW9u +ID0gZnVuY3Rpb24gKGhtYWlsLCBzb2NrZXQsIHRlc3QsIHBsYXlib29rLCBjYWxsYmFjaykgewog +ICAgY29uc3QgdGVzdG14ID0gewogICAgICAgIGJpbmRfaGVsbzogImhhcmFrYS50ZXN0IiwKICAg +ICAgICBleGNoYW5nZTogInJlbW90ZS50ZXN0aG9zdCIsCiAgICB9OwogICAgaG1haWwudHJ5X2Rl +bGl2ZXJfaG9zdF9vbl9zb2NrZXQodGVzdG14LCAndGVzdGhvc3QnLCAndGVzdHBvcnQnLCBzb2Nr +ZXQpOwoKICAgIHNvY2tldC53cml0ZSA9IGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgICAgLy9jb25z +b2xlLmxvZygnTW9ja1NvY2tldC53cml0ZSgnICsgbGluZS5yZXBsYWNlKC9cbi8sICdcXG4nKS5y +ZXBsYWNlKC9cci8sICdcXHInKSArICcpJyk7CiAgICAgICAgaWYgKHBsYXlib29rLmxlbmd0aCA9 +PSAwKSB7CiAgICAgICAgICAgIHRlc3Qub2soZmFsc2UsICdtaXNzaW5nIG5leHQgcGxheWJvb2sg +ZW50cnknKTsKICAgICAgICAgICAgdGVzdC5kb25lKCk7CiAgICAgICAgICAgIHJldHVybjsKICAg +ICAgICB9CiAgICAgICAgbGV0IGV4cGVjdGVkOwogICAgICAgIHdoaWxlIChmYWxzZSAhPSAoZXhw +ZWN0ZWQgPSBnZXROZXh0RW50cnlGcm9tUGxheWJvb2soJ2hhcmFrYScsIHBsYXlib29rKSkpIHsK +ICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBlY3RlZC50ZXN0ID09PSAnZnVuY3Rpb24nKSB7CiAg +ICAgICAgICAgICAgICB0ZXN0Lm9rKGV4cGVjdGVkLnRlc3QobGluZSksIGV4cGVjdGVkLmRlc2Ny +aXB0aW9uIHx8ICdFeHBlY3RlZCB0aGF0IGxpbmUgd29ya3Mgd2l0aCBmdW5jOiAnICsgZXhwZWN0 +ZWQudGVzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAg +ICB0ZXN0LmVxdWFscyhleHBlY3RlZC50ZXN0ICsgJ1xyXG4nLCBsaW5lLCBleHBlY3RlZC5kZXNj +cmlwdGlvbiB8fCAnRXhwZWN0ZWQgdGhhdCBsaW5lIGVxdWFsczogJyArIGV4cGVjdGVkLnRlc3Qp +OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleHBlY3RlZC5lbmRfdGVzdCA9PT0gdHJ1 +ZSkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAg +ICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAg +ICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoZnVu +Y3Rpb24gKCkgewogICAgICAgICAgICBsZXQgbmV4dE1lc3NhZ2VGcm9tU2VydmVyOwogICAgICAg +ICAgICB3aGlsZSAoZmFsc2UgIT0gKG5leHRNZXNzYWdlRnJvbVNlcnZlciA9IGdldE5leHRFbnRy +eUZyb21QbGF5Ym9vaygncmVtb3RlJywgcGxheWJvb2spKSkgewogICAgICAgICAgICAgICAgc29j +a2V0LmVtaXQoJ2xpbmUnLCBuZXh0TWVzc2FnZUZyb21TZXJ2ZXIubGluZSArICdcclxuJyk7CiAg +ICAgICAgICAgIH0KICAgICAgICB9LCAwKTsKICAgIH0KCiAgICBjb25zdCB3ZWxjb21lID0gZ2V0 +TmV4dEVudHJ5RnJvbVBsYXlib29rKCdyZW1vdGUnLCBwbGF5Ym9vayk7CiAgICBzb2NrZXQuZW1p +dCgnbGluZScsIHdlbGNvbWUubGluZSk7Cgp9CgpmdW5jdGlvbiBnZXROZXh0RW50cnlGcm9tUGxh +eWJvb2sgKG9mVHlwZSwgcGxheWJvb2spIHsKICAgIGlmIChwbGF5Ym9vay5sZW5ndGggPT0gMCkg +ewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChwbGF5Ym9va1swXS5mcm9tID09 +IG9mVHlwZSkgewogICAgICAgIGNvbnN0IGVudHJ5ID0gcGxheWJvb2suc2hpZnQoKTsKICAgICAg +ICByZXR1cm4gZW50cnk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAcGFja2FnZS9saWIvdm1faGFybmVzcy5qcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAA +AAAAAAAAAAAAAAAAADAwMDAwMDM2MzYgADM1NjAxMTY2MDQgADAxMjU0MSAAMAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAw +MDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAKY29uc3QgZnMgICA9IHJlcXVpcmUoJ2ZzJyk7CmNvbnN0IHZtICAgPSByZXF1aXJlKCd2bScp +OwoKLyogZXNsaW50IG5vLXBhdGgtY29uY2F0OiAib2ZmIiAqLwpjb25zdCBkaXJfcGF0aHMgPSBb +CiAgICBfX2Rpcm5hbWUgKyAnLy4uLy4uLy4uLycsICAvLyBmb3IgSGFyYWthL3Rlc3RzL3BsdWdp +bnMKICAgIF9fZGlybmFtZSArICcvJywgICAgICAgICAgIC8vIGZvciBoYXJha2EtdGVzdC1maXh0 +dXJlcy90ZXN0Cl07CgpmdW5jdGlvbiBkb3RfZmlsZXMgKGVsZW1lbnQpIHsKICAgIHJldHVybiBl +bGVtZW50Lm1hdGNoKC9eXC4vKSA9PSBudWxsOwp9CgpmdW5jdGlvbiBmaW5kX2hhcmFrYV9saWIg +KGlkKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcl9wYXRocy5sZW5ndGg7IGkrKykgewog +ICAgICAgIGNvbnN0IGRpclBhdGggPSBkaXJfcGF0aHNbaV0gKyBpZCArICcuanMnOwogICAgICAg +IC8vIGNvbnNvbGUubG9nKCdkaXJQYXRoOiAnICsgZGlyUGF0aCk7CiAgICAgICAgdHJ5IHsKICAg +ICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhkaXJQYXRoKTsKICAgICAgICAgICAg +aWYgKHN0YXRzLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGlyUGF0aDsKICAg +ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoaWdub3JlKSB7CiAgICAgICAgICAg +IC8vIGNvbnNvbGUuZXJyb3IoaWdub3JlLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0KfQoKZXhw +b3J0cy5zYW5kYm94X3JlcXVpcmUgPSBmdW5jdGlvbiAoaWQpIHsKICAgIGlmIChpZFswXSAhPT0g +Jy4nKSB7ICAgICAvLyBkb2Vzbid0IHN0YXJ0cyB3aXRoIC4KICAgICAgICByZXR1cm4gcmVxdWly +ZShpZCk7ICAvLyB1c2Ugbm9ybWFsICdyZXF1aXJlJwogICAgfQoKICAgIC8vIGhhcyBsb2NhbCAu +LyBwcmVmaXgsIHNvIGZpbmQgbG9jYWwgZmlsZQogICAgY29uc3QgZm91bmRQYXRoID0gZmluZF9o +YXJha2FfbGliKGlkKTsKICAgIC8vIGNvbnNvbGUubG9nKCdmb3VuZFBhdGg6ICcgKyBmb3VuZFBh +dGgpOwogICAgcmV0dXJuIHJlcXVpcmUoZm91bmRQYXRoKTsKfQoKZnVuY3Rpb24gbWFrZV90ZXN0 +IChtb2R1bGVfcGF0aCwgdGVzdF9wYXRoLCBhZGRpdGlvbmFsX3NhbmRib3gpIHsKICAgIHJldHVy +biBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIGxldCBjb2RlID0gZnMucmVhZEZpbGVTeW5jKG1v +ZHVsZV9wYXRoKTsKICAgICAgICBjb2RlICs9IGZzLnJlYWRGaWxlU3luYyh0ZXN0X3BhdGgpOwog +ICAgICAgIGNvbnN0IHNhbmRib3ggPSB7CiAgICAgICAgICAgIHJlcXVpcmU6IGV4cG9ydHMuc2Fu +ZGJveF9yZXF1aXJlLAogICAgICAgICAgICBjb25zb2xlLAogICAgICAgICAgICBCdWZmZXIsCiAg +ICAgICAgICAgIGV4cG9ydHM6IHt9LAogICAgICAgICAgICB0ZXN0CiAgICAgICAgfTsKICAgICAg +ICBPYmplY3Qua2V5cyhhZGRpdGlvbmFsX3NhbmRib3gpLmZvckVhY2goZnVuY3Rpb24gKGspIHsK +ICAgICAgICAgICAgc2FuZGJveFtrXSA9IGFkZGl0aW9uYWxfc2FuZGJveFtrXTsKICAgICAgICB9 +KTsKICAgICAgICB2bS5ydW5Jbk5ld0NvbnRleHQoY29kZSwgc2FuZGJveCk7CiAgICB9Owp9Cgpl +eHBvcnRzLmFkZF90ZXN0cyA9IGZ1bmN0aW9uIChtb2R1bGVfcGF0aCwgdGVzdHNfcGF0aCwgdGVz +dF9leHBvcnRzLCBhZGRfdG9fc2FuZGJveCkgewogICAgY29uc3QgYWRkaXRpb25hbF9zYW5kYm94 +ID0gYWRkX3RvX3NhbmRib3ggfHwge307CiAgICBjb25zdCB0ZXN0cyA9IGZzLnJlYWRkaXJTeW5j +KHRlc3RzX3BhdGgpLmZpbHRlcihkb3RfZmlsZXMpOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCB0 +ZXN0cy5sZW5ndGg7IHgrKykgewogICAgICAgIHRlc3RfZXhwb3J0c1t0ZXN0c1t4XV0gPSBtYWtl +X3Rlc3QobW9kdWxlX3BhdGgsIHRlc3RzX3BhdGggKyB0ZXN0c1t4XSwgYWRkaXRpb25hbF9zYW5k +Ym94KTsKICAgIH0KfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBh +Y2thZ2UvdGVzdC92bV9oYXJuZXNzLmpzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAA +AAAAAAAAAAAwMDAwMDAxMDAxIAAzNTYwMTE2NjA0IAAwMTI3MzIgADAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAg +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmNv +bnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpCgpjb25zdCB2bSA9IHJlcXVpcmUoJy4uL2xp +Yi92bV9oYXJuZXNzJyk7Ci8vIGNvbnNvbGUubG9nKHZtKTsKCmRlc2NyaWJlKCdzYW5kYm94X3Jl +cXVpcmUnLCBmdW5jdGlvbiAoKSB7CgogICAgaXQoJ2lzIGEgZnVuY3Rpb24nLCAoZG9uZSkgPT4g +ewogICAgICAgIGFzc2VydC5lcXVhbCh0eXBlb2Ygdm0uc2FuZGJveF9yZXF1aXJlLCAnZnVuY3Rp +b24nKTsKICAgICAgICBkb25lKCk7CiAgICB9KQoKICAgIGl0KCdjYW4gbG9hZCBhIC4vIHJlbGF0 +aXZlIHBhdGgnLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5vayh2bS5zYW5kYm94X3JlcXVp +cmUoJy4vbG9nZ2VyJykpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCgogICAgaXQoJ2NhbiBsb2Fk +IGEgLi4vIHJlbGF0aXZlIHBhdGgnLCAoZG9uZSkgPT4gewogICAgICAgIGFzc2VydC5vayh2bS5z +YW5kYm94X3JlcXVpcmUoJy4uL2luZGV4JykpOwogICAgICAgIGRvbmUoKTsKICAgIH0pCn0pAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBhY2th +Z2UvcGFja2FnZS5qc29uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAAAAAA +AAAAAAAwMDAwMDAxNTcxIAAzNTYwMTE2NjA0IAAwMTE1NTIgADAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewogICJh +dXRob3IiOiAiSGFyYWthIFRlYW0gPGhhcmFrYS5tYWlsQGdtYWlsLmNvbT4iLAogICJuYW1lIjog +ImhhcmFrYS10ZXN0LWZpeHR1cmVzIiwKICAibGljZW5zZSI6ICJNSVQiLAogICJkZXNjcmlwdGlv +biI6ICJIYXJha2EgVGVzdCBGaXh0dXJlcyIsCiAgInZlcnNpb24iOiAiMS4wLjM1IiwKICAicmVw +b3NpdG9yeSI6IHsKICAgICJ0eXBlIjogImdpdCIsCiAgICAidXJsIjogImdpdEBnaXRodWIuY29t +OmhhcmFrYS9oYXJha2EtdGVzdC1maXh0dXJlcy5naXQiCiAgfSwKICAibWFpbiI6ICJpbmRleC5q +cyIsCiAgImVuZ2luZXMiOiB7CiAgICAibm9kZSI6ICI+PTEyIgogIH0sCiAgImRlcGVuZGVuY2ll +cyI6IHsKICAgICJhZGRyZXNzLXJmYzI4MjEiOiAiKiIsCiAgICAiaGFyYWthLWNvbmZpZyI6ICIq +IiwKICAgICJoYXJha2EtY29uc3RhbnRzIjogIioiLAogICAgImhhcmFrYS1ub3RlcyI6ICIqIiwK +ICAgICJoYXJha2EtcmVzdWx0cyI6ICI+PTIiCiAgfSwKICAib3B0aW9uYWxEZXBlbmRlbmNpZXMi +OiB7fSwKICAiZGV2RGVwZW5kZW5jaWVzIjogewogICAgImVzbGludCI6ICI+PTgiLAogICAgImVz +bGludC1wbHVnaW4taGFyYWthIjogIioiLAogICAgIm1vY2hhIjogIj49OSIKICB9LAogICJidWdz +IjogewogICAgIm1haWwiOiAiaGFyYWthLm1haWxAZ21haWwuY29tIiwKICAgICJ1cmwiOiAiaHR0 +cHM6Ly9naXRodWIuY29tL2hhcmFrYS9oYXJha2EtdGVzdC1maXh0dXJlcy9pc3N1ZXMiCiAgfSwK +ICAic2NyaXB0cyI6IHsKICAgICJ0ZXN0IjogIm5weCBtb2NoYSIsCiAgICAibGludCI6ICJucHgg +ZXNsaW50IGluZGV4LmpzIGxpYiB0ZXN0IiwKICAgICJsaW50Zml4IjogIm5weCBlc2xpbnQgLS1m +aXggaW5kZXguanMgbGliIHRlc3QiCiAgfQp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBhY2thZ2Uv +dGVzdC9maXh0dXJlcy9tb2NrLXBsdWdpbi1kaXIvcGFja2FnZS5qc29uAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAAAAAAAAAA +AAAwMDAwMDAwMzUzIAAzNTYwMTE2NjA0IAAwMTc0MDAgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewogICJuYW1l +IjogIm1vY2stcGx1Z2luLWRpciIsCiAgInZlcnNpb24iOiAiMS4wLjAiLAogICJkZXNjcmlwdGlv +biI6ICJNb2NrIFBsdWdpbiIsCiAgIm1haW4iOiAiaW5kZXguanMiLAogICJzY3JpcHRzIjogewog +ICAgInRlc3QiOiAiZWNobyBcIkVycm9yOiBubyB0ZXN0IHNwZWNpZmllZFwiICYmIGV4aXQgMSIK +ICB9LAogICJhdXRob3IiOiAiTWF0dCBTaW1lcnNvbiIsCiAgImxpY2Vuc2UiOiAiTUlUIgp9CgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlLy5y +ZWxlYXNlL0NIQU5HRUxPRy5tZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAA +MDAwMDAwMTA1NCAAMzU2MDExNjYwNCAAMDEyNTY3IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgQ2hhbmdlTG9n +CgojIyMgVW5yZWxlYXNlZAoKLSBmZWF0OiBhZGQgbnBtL3ByZXBlbmQtc2NvcGUuanMKCgojIyMg +Mi4wLjAgLSAyMDIyLTA1LTMxCgotIGZlYXQ6IHBlcm1pdCBtYWluIGJyYW5jaCB0byBiZSAnbWFp +bicsIHdhcyAnbWFzdGVyJwotIGZlYXQ6IGF1dG8taW5zZXJ0IGNvbW1pdCBtZXNzYWdlcyBzaW5j +ZSBsYXN0IHRhZyBpbnRvIENIQU5HRUxPRwotIGZlYXQ6IGNyZWF0ZSBQUiBhdXRvbWF0aWNhbGx5 +CiAgICAtIHJlbCBjcmVhdGU6IHRhcmdldCBicmFuY2ggbWFpbgotIGZlYXQ6IGNyZWF0ZSBSZWxl +YXNlIGF1dG9tYXRpY2FsbHkKLSBicmVha2luZzogcmVuYW1lIHNjcmlwdHMKICAgIC0gYmVmb3Jl +OiBkbywgcHVzaCwgY2xlYW4uIGFmdGVyOiBzdGFydCwgc3VibWl0LCBmaW5pc2gKLSBkb2MoQ0hB +TkdFTE9HLm1kKTogYWRkZWQKLSBkb2MoQ0gpOiBvbmx5IGFkZCBiaXRzIHdoZW4gbWlzc2luZwot +IGRvYyhSRUFETUUpOiBmaXgsIGNvZGUgZmVuY2VzIHNob3VsZCBiZSBzaAoKCiMjIyAxLjAuMCAt +IDIwMjItMDUtMjkKCi0gaW5pdGlhbCByZWxlYXNlCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlL0NoYW5n +ZXMubWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAw +MDAwNTYyNSAAMzU2MDExNjYwNCAAMDExMTYyIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMjIyBVbnJlbGVhc2Vk +CgoKIyMjIFsxLjAuMzVdIC0gMjAyMi0wNi0wNQoKLSBjaTogdXBkYXRlIEdIQSB3b3JrZmxvdyB3 +aXRoIHNoYXJlZAotIGRvYyhjaGFuZ2VzKTogYWRkIFVucmVsZWFzZWQgbWFya2VyCi0gY2k6IGFk +ZCBzdWJtb2R1bGUgLnJlbGVhc2UKCgojIyMgMS4wLjM0IC0gMjAyMi0wNS0yMwoKLSBkZXAoZXNs +aW50KTogNiAtPiA4Ci0gY2kobm9kZSk6IGFkZCB2MTggdGVzdGluZwoKCiMjIyAxLjAuMzMgLSAy +MDIwLTEyLTE3CgotIGNvbm46IHBhc3MgY29uZmlnIHRvIG5ldyB0cmFuc2FjdGlvbnMKCgojIyMg +MS4wLjMyIC0gMjAyMC0wNy0yOAoKLSB0cmFuc2FjdGlvbjogYWRkIGxvZ2dpbmcgbWV0aG9kcwoK +CiMjIyAxLjAuMzEgLSAyMDIwLTA3LTI4CgotIHRyYW5zYWN0aW9uOiBsb3dlcmNhc2UgdGhlIGtl +eXMgaW4gY2xhc3MgSGVhZGVyCgoKIyMjIDEuMC4zMCAtIDIwMTktMTAtMTQKCi0gY29kZWNsaW1h +dGU6IHVwZGF0ZSBlc2xpbnQgdG8gdjYKLSBjb252ZXJ0IGVzbGludHJjIGZyb20ganNvbiB0byB5 +YW1sCi0gcmVwbGFjZSBub2RlIDYgd2l0aCBub2RlIDEyIENJIHRlc3RpbmcKLSBsaWIvcGx1Z2lu +OiB1cGRhdGUgd2l0aCBlczYgY2xhc3MKLSBlczY6IG9iamVjdC1zaG9ydGhhbmQKLSBjb3ZlcmFn +ZTogcmVwbGFjZSBkZXByZWNhdGVkIGlzdGFuYnVsIHdpdGggbnljCi0gdGVzdCBydW5uZXI6IHJl +cGxhY2UgZGVwcmVjYXRlZCBub2RldW5pdCB3aXRoIG1vY2hhCgoKIyMjIDEuMC4yOSAtIDIwMTkt +MDQtMTEKCi0gcHV0IHJlc3VsdHMgaW4gdHJhbnNhY3Rpb24uIFRoaXMgdGltZSBmb3IgcmVhbC4K +CgojIyMgMS4wLjI4IC0gMjAxOS0wNC0wMQoKLSB0cmFuc2FjdGlvbjogcG9wdWxhdGUgdGhpcy5y +ZXN1bHRzCgoKIyMjIDEuMC4yNyAtIDIwMTgtMTEtMTUKCi0gdHJhbnNhY3Rpb246IGhhdmUgaGVh +ZGVyLmFkZCgpIHBvcHVsYXRlIGhlYWRlcl9kZWNvZGVkIHRvbwoKCiMjIyAxLjAuMjYgLSAyMDE4 +LTExLTE1CgotIHRyYW5zYWN0aW9uOiBhZGQgaGVhZGVyLmdldF9kZWNvZGVkKCkKCgojIyMgMS4w +LjI1IC0gMjAxOC0wNS0xMAoKLSB0cmFuc2FjdGlvbjogbWFrZSB0LmhlYWRlciBhIGNsYXNzIChh +cyBpdCBpcyBpbiBIYXJha2EpLiBNYWtpbmcgdHJhbnNhY3Rpb24KICBpbnRvIGFuIGVzNiBjbGFz +cyAoaW4gMS4wLjI0KSBjaGFuZ2VkIGhvdyAndGhpcycgcmVzb2x2ZXMuCgoKIyMjIDEuMC4yNCAt +IDIwMTgtMDUtMTAKCi0gY29ubmVjdGlvbjogYWRkIGdldCgpIGFuZCBpbXByb3ZlZCBzZXQoKQot +IGNvbm5lY3Rpb246IGFkZCBpbml0X3RyYW5zYWN0aW9uKCkKLSBjb25uZWN0aW9uOiB1c2UgZXM2 +IGNsYXNzZXMKLSB0cmFuc2FjdGlvbjogdXNlIGVzNiBjbGFzc2VzCgoKIyMjIDEuMC4yMyAtIDIw +MTgtMDQtMDQKCi0gYWRkZWQgYXJyYXkgdmFsdWVzIHRvIHRyYW5zYWN0aW9uLmhlYWRlciBhbmQg +aGVhZGVyLmdldF9hbGwgc3VwcG9ydAoKCiMjIyAxLjAuMjIgLSAyMDE3LTA5LTIyCgotIHBsdWdp +bnM6IHByb3ZpZGUgaGFyYWthX3JlcXVpcmUKCgojIyMgMS4wLjIxIC0gMjAxNy0wOS0xNAoKLSBs +aW50IHVwZGF0ZXMKCgojIyMgMS4wLjIwIC0gMjAxNy0wOS0wNAoKLSB1c2UgW2hhcmFrYS1ub3Rl +c10oaHR0cHM6Ly9naXRodWIuY29tL2hhcmFrYS9oYXJha2Etbm90ZXMpCgoKIyMjIDEuMC4xOSAt +IDIwMTctMDYtMTYKCi0gcmVtb3ZlIHZlcnNpb24gZnJvbSBoYXJha2EtcmVzdWx0cywgZml4ZXMg +IzIxCgojIyMgMS4wLjE4IC0gMjAxNy0wNS0yNQoKLSByZXBsYWNlIGxvY2FsIHJ1bGVzIHdpdGgg +ZXNsaW50LXBsdWdpbi1oYXJha2EKLSBhZGQgc2VydmVyIGFuZCBzZXRJbW1lZGF0ZSB0byB0aGUg +cGx1Z2luIHNhbmRib3gKCiMjIyAxLjAuMTcgLSAyMDE3LTAxLTI2CgotIGFkZCBhbGlhcyBvZiBo +YXJha2EtcmVzdWx0cyBhdCBmaXh0dXJlcy5yZXN1bHRzIChmaW5nZXIgZnJpZW5kbHkpCgojIyMg +MS4wLjE2IC0gSmFuIDI2LCAyMDE3CgotIHJlcGxhY2UgY29waWVkIHJlc3VsdHNfc3RvcmUgd2l0 +aCBmcmVzaGx5IHBhY2thZ2VkIGhhcmFrYS1yZXN1bHRzCgojIyMgMS4wLjE1IC0gSmFuIDI1LCAy +MDE3CgotIHVwZGF0ZSByZXN1bHRfc3RvcmUsIGFkZGluZyBnZXQocGx1Z2luKSBzeW50YXguCgoj +IyMgMS4wLjE0IC0gSmFuIDI0LCAyMDE3CgotIGFkZCBwYXRoIGZvciBucG0gcGFja2FnZWQgcGx1 +Z2luIGluaGVyaXRpbmcgYW4gbnBtIHBhY2thZ2VkIHBsdWdpbgoKIyMjIDEuMC4xMyAtIEphbiAw +MywgMjAxNwoKLSB1c2UgcGF0aC5qb2luIGluIHBsYWNlIG9mIHBhdGgvdG8vc3R1ZmYKLSByZW1v +dmUgZ3J1bnQKLSBhZGQgQXBwdmV5b3IgYmFkZ2UKCiMjIyAxLjAuMTEgLSBKYW4gMDEsIDIwMTcK +Ci0gbGludCBmaXhlcwotIHBhY2thZ2luZyB1cGRhdGVzCgojIyMgMS4wLjggLSBTZXAgMDIsIDIw +MTYKCi0gYWRkIGNvbm5lY3Rpb24uc2V0KCkKCiMjIyAxLjAuNyAtIEp1bCAyMCwgMjAxNgoKLSBu +b3JtYWxpemVkIGNvbm5lY3Rpb24gcHJvcGVydGllcyAoaGFyYWthL0hhcmFrYSMxMDk4KQoKIyMj +IDEuMC42IC0gTWFyIDI2LCAyMDE2CgotIG1vcmUgcmVsaWFibGUgcGFja2FnZS5qc29uIGRldGVj +dGlvbgogICAgKiBlbmNhcHN1bGF0ZSBwYWNrYWdlLmpzb24gZGV0ZWN0aW9uIGluIF9oYXNfcGFj +a2FnZV9qc29uCi0gZG9uJ3QgcmVzZXQgcGx1Z2luLm5hbWUgd2hlbiBhIHBsdWdpbiBpbmhlcml0 +cwoKIyMjIDEuMC41IC0gTWFyIDE5LCAyMDE2CgotIGluaGVyaXRhbmNlIHRlc3RzIGFuZCBwYWNr +YWdlIHN1cHBvcnQKLSBlbmFibGUgbW9yZSBIYXJha2EgdGVzdHMgdG8gZGVwZW5kIG9uIHRoaXMK +LSB1cGRhdGVzIGZvciBjb21wYXQgd2l0aCBIYXJha2EvdGVzdHMvcGx1Z2lucwotIGJldHRlciBw +bHVnaW4gcGF0aCByZXNvbHV0aW9uCgoKWzEuMC4zNV06IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJh +a2EvaGFyYWthLXRlc3QtZml4dHVyZXMvcmVsZWFzZXMvdGFnLzEuMC4zNQoAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBhY2thZ2UvLnJlbGVhc2UvUkVB +RE1FLm1kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAyMTEx +IAAzNTYwMTE2NjA0IAAwMTIyMzAgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyAucmVsZWFzZQoKZ2l0IHJlbGVh +c2Ugc2NyaXB0cwoKCiMjIFVTQUdFCgpJbiB5b3VyIGdpdGh1YiByZXBvOgoKYGBgc2gKZ2l0IHN1 +Ym1vZHVsZSBhZGQgZ2l0QGdpdGh1Yi5jb206bXNpbWVyc29uLy5yZWxlYXNlLmdpdApgYGAKCiMj +IyBTdGFydCBhIHJlbGVhc2UKCmBgYHNoCi5yZWxlYXNlL3N0YXJ0LnNoIFsgbWFqb3IgfCBtaW5v +ciB8IHBhdGNoIF0KYGBgCgpUaGlzIHdpbGw6CgotIGNyZWF0ZSBhIGJyYW5jaCBuYW1lZCByZWxl +YXNlLU4uTi5OCi0gYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgaW4gcGFja2FnZS5qc29uCi0gYWRk +IGEgdmVyc2lvbmVkIGVudHJ5IHRvIENIQU5HRUxPRyB3aXRoIHRvZGF5J3MgZGF0ZQotIG9wZW4g +Q0hBTkdFTE9HIGluIHlvdXIgbWFya2Rvd24gZWRpdG9yCgpOb3RlczoKCi0gWW91ciBDSEFOR0VM +T0cgZmlsZSBuZWVkcyBhbiBlbnRyeSBsaWtlIHRoaXM6ICMjIyBVbnJlbGVhc2VkCiAgICAtIE5l +dyBjaGFuZ2Vsb2cgZW50cmllcyBhcmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhhdCBtYXJrZXIKLSBPcGVu +aW5nIHRoZSBmaWxlIGluIHlvdXIgZWRpdG9yIHJlcXVpcmVzIGBvcGVuYAoKLS0tLQoKIyMjIFN1 +Ym1pdCB5b3VyIHJlbGVhc2UKCkFmdGVyIG1ha2luZyBhbGwgeW91ciBjaGFuZ2VzLCBlZGl0aW5n +IHlvdXIgQ0hBTkdFTE9HLCBhbmQgY29tbWl0dGluZyBhbGwgeW91ciBjaGFuZ2VzOgoKYGBgc2gK +LnJlbGVhc2Uvc3VibWl0LnNoCmBgYAoKVGhpcyB3aWxsOgoKLSBwdXNoIHRoZSBjaGFuZ2VzIHRv +IG9yaWdpbi8kYnJhbmNoCi0gaWYgYGdoYCBpcyBpbnN0YWxsZWQ6CiAgICAtIGNyZWF0ZSBhIGRy +YWZ0IFB1bGwgUmVxdWVzdCAKICAgIC0gY3JlYXRlIGEgZHJhZnQgUmVsZWFzZQoKLS0tLQoKIyMj +IEZpbmlzaAoKQWZ0ZXIgeW91ciBQUiBpcyBtZXJnZWQsIGZpbmlzaCBpdDoKCmBgYHNoCi5yZWxl +YXNlL2ZpbmlzaC5zaApgYGAKClRoaXMgd2lsbDoKCi0gaWYgYGdoYCBpcyBpbnN0YWxsZWQ6CiAg +ICAtIHB1Ymxpc2ggdGhlIHJlbGVhc2UKLSBzd2l0Y2ggdG8gdGhlIG1haW4gYnJhbmNoCi0gZGVs +ZXRlIHRoZSByZWxlYXNlIGJyYW5jaAotIHB1bGwgY2hhbmdlcyBmcm9tIG9yaWdpbgoAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS9SRUFETUUubWQAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDIzMjIgADM1 +NjAxMTY2MDQgADAxMDUzNiAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbIVtCdWlsZCBTdGF0dXNdW2NpLWltZ11d +W2NpLXVybF0KWyFbQ29kZSBDb3ZlcmFnZV1bY292LWltZ11dW2Nvdi11cmxdClshW0NvZGUgQ2xp +bWF0ZV1bY2xpbS1pbWddXVtjbGltLXVybF0KClshW05QTV1bbnBtLWltZ11dW25wbS11cmxdCgoj +IGhhcmFrYS10ZXN0LWZpeHR1cmVzCgpGaXh0dXJlcyBmb3IgdGVzdGluZyBIYXJha2EgYW5kIHBs +dWdpbnMKCiMgVXNhZ2UKCnZhciBmaXh0dXJlcyA9IHJlcXVpcmUoJ2hhcmFrYS10ZXN0LWZpeHR1 +cmVzJyk7CgojIEV4cG9ydHMgdGhlIGZvbGxvd2luZyBmaXh0dXJlIHR5cGVzOgoKKiBjb25uZWN0 +aW9uCiogbGluZV9zb2NrZXQKKiBsb2dnZXIKKiBwbHVnaW4KKiBbcmVzdWx0c10oaHR0cHM6Ly9n +aXRodWIuY29tL2hhcmFrYS9oYXJha2EtcmVzdWx0cykKKiBzdHViCiogdHJhbnNhY3Rpb24KKiB1 +dGlsX2htYWlsaXRlbQoKVGhlc2UgZml4dHVyZXMgYXJlIHJvdWdoIGFuYWxvZ3Mgb2YgdGhlaXIg +bGlrZS1uYW1lZCBzaWJsaW5ncyBpbiBIYXJha2Egd2l0aAp2YXJ5aW5nIGxldmVscyBvZiBjb21w +bGV0ZW5lc3MuIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIGVuaGFuY2UKeW91 +ciBhYmlsaXR5IHRvIHRlc3QsIHBsZWFzZSBkbyBhZGQgdGhlbSBoZXJlLgoKCltjaS1pbWddOiBo +dHRwczovL2dpdGh1Yi5jb20vaGFyYWthL2hhcmFrYS10ZXN0LWZpeHR1cmVzL2FjdGlvbnMvd29y +a2Zsb3dzL2NpLnltbC9iYWRnZS5zdmcKW2NpLXVybF06IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJh +a2EvaGFyYWthLXRlc3QtZml4dHVyZXMvYWN0aW9ucy93b3JrZmxvd3MvY2kueW1sCltjb3YtaW1n +XTogaHR0cHM6Ly9jb2RlY292LmlvL2dpdGh1Yi9oYXJha2EvaGFyYWthLXRlc3QtZml4dHVyZXMv +Y292ZXJhZ2Uuc3ZnCltjb3YtdXJsXTogaHR0cHM6Ly9jb2RlY292LmlvL2dpdGh1Yi9oYXJha2Ev +aGFyYWthLXRlc3QtZml4dHVyZXMKW2NsaW0taW1nXTogaHR0cHM6Ly9jb2RlY2xpbWF0ZS5jb20v +Z2l0aHViL2hhcmFrYS9oYXJha2EtdGVzdC1maXh0dXJlcy9iYWRnZXMvZ3BhLnN2ZwpbY2xpbS11 +cmxdOiBodHRwczovL2NvZGVjbGltYXRlLmNvbS9naXRodWIvaGFyYWthL2hhcmFrYS10ZXN0LWZp +eHR1cmVzCltucG0taW1nXTogaHR0cHM6Ly9ub2RlaS5jby9ucG0vaGFyYWthLXRlc3QtZml4dHVy +ZXMucG5nCltucG0tdXJsXTogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvaGFyYWthLXRl +c3QtZml4dHVyZXMKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlLy5yZWxlYXNlL2Jhc2Uuc2gAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMTM1MSAAMzU2MDEx +NjYwNCAAMDEyMjI0IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhL2Jpbi9zaAoKZ2V0X21haW5fYnJhbmNoKCkK +ewogICAgTUFJTl9CUkFOQ0g9Im1haW4iCgogICAgaWYgWyAteiAiJChnaXQgYnJhbmNoIC1sIG1h +aW4pIiBdOyB0aGVuCiAgICAgICAgTUFJTl9CUkFOQ0g9Im1hc3RlciIKICAgIGZpCgogICAgZXhw +b3J0IE1BSU5fQlJBTkNICn0KCmJyYW5jaF9pc19tYWluKCkKewogICAgZ2V0X21haW5fYnJhbmNo +CgogICAgaWYgWyAiJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSIgPSAiJE1BSU5fQlJBTkNI +IiBdOyB0aGVuCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgcmV0dXJuIDEKfQoKcmVwb19p +c19jbGVhbigpCnsKICAgIGlmIFsgLXogIiQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbikiIF07IHRo +ZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICByZXR1cm4gMQp9Cgphc3N1cmVfcmVwb19p +c19jbGVhbigpCnsKICAgIGlmIHJlcG9faXNfY2xlYW47IHRoZW4gcmV0dXJuIDA7IGZpCgogICAg +ZWNobwogICAgZWNobyAiRVJST1I6IFVuY29tbWl0dGVkIGNoYW5nZXMsIGNvd2FyZGx5IHJlZnVz +aW5nIHRvIGNvbnRpbnVlLi4uIgogICAgZWNobwogICAgc2xlZXAgMgoKICAgIGdpdCBzdGF0dXMK +CiAgICByZXR1cm4gMQp9CgpmaW5kX2NoYW5nZWxvZygpCnsKICAgIENIQU5HRUxPRz0kKGxzIFtD +Y11bSGhdW0FhXSoubWQpCiAgICBleHBvcnQgQ0hBTkdFTE9HCiAgICAjZWNobyAiSSBmb3VuZCB5 +b3VyIENIQU5HRUxPRyBhdDogJENIQU5HRUxPRyIKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlLy5yZWxlYXNlL2ZpbmlzaC5zaAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAMDAwNzU1IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMDYwMiAAMzU2MDExNjYw +NCAAMDEyNTczIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVz +dGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMhL2Jpbi9zaAoKLiAucmVsZWFzZS9iYXNlLnNoIHx8 +IGV4aXQKCkNVUlJFTlRfQlJBTkNIPSQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkKCmdldF9t +YWluX2JyYW5jaAoKaWYgY29tbWFuZCAtdiBnaDsgdGhlbgogICAgUEtHX1ZFUlNJT049JChub2Rl +IC1lICdjb25zb2xlLmxvZyhyZXF1aXJlKCIuL3BhY2thZ2UuanNvbiIpLnZlcnNpb24pJykKICAg +IGdoIHJlbGVhc2UgZWRpdCAiJFBLR19WRVJTSU9OIiAtLWRyYWZ0PWZhbHNlCmZpCgppZiBbICIk +Q1VSUkVOVF9CUkFOQ0giICE9ICIkTUFJTl9CUkFOQ0giIF07CnRoZW4KICAgIGdpdCBjaGVja291 +dCAiJE1BSU5fQlJBTkNIIgogICAgZ2l0IGJyYW5jaCAtZCAiJENVUlJFTlRfQlJBTkNIIgogICAg +Z2l0IHB1bGwKZmkKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcGFja2FnZS8ucmVsZWFzZS9zdGFydC5zaAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAADAwMDc1NSAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDUyNDUgADM1NjAxMTY2MDQg +ADAxMjQ2MCAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3Rh +cgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIS9iaW4vc2gKCnVzYWdlKCkgewogICAgZWNobyAic3Rh +cnQuc2gge21ham9yIHwgbWlub3IgfCBwYXRjaH0iCiAgICBleGl0Cn0KCi4gLnJlbGVhc2UvYmFz +ZS5zaCB8fCBleGl0CgpmaW5kX25ld192ZXJzaW9uKCkgewogICAgaWYgISBnaXQgYnJhbmNoIC0t +c2hvdy1jdXJyZW50IHwgZ3JlcCAtcSBecmVsZWFzZTsKICAgIHRoZW4KICAgICAgICBjYXNlICIk +MSIgaW4KICAgICAgICAgICAgIm1ham9yIiApCiAgICAgICAgICAgIDs7CiAgICAgICAgICAgICJt +aW5vciIgKQogICAgICAgICAgICA7OwogICAgICAgICAgICAicGF0Y2giICkKICAgICAgICAgICAg +OzsKICAgICAgICAgICAgKikKICAgICAgICAgICAgdXNhZ2UKICAgICAgICAgICAgOzsKICAgICAg +ICBlc2FjCgogICAgICAgIE5FV19WRVJTSU9OPSQobnBtIC0tbm8tZ2l0LXRhZy12ZXJzaW9uIHZl +cnNpb24gIiQxIikKICAgICAgICBORVdfVkVSU0lPTj0ke05FV19WRVJTSU9OLy92fQogICAgZWxz +ZQogICAgICAgIGlmIFsgLWYgcGFja2FnZS5qc29uIF07IHRoZW4KICAgICAgICAgICAgTkVXX1ZF +UlNJT049JChub2RlIC1lICdjb25zb2xlLmxvZyhyZXF1aXJlKCIuL3BhY2thZ2UuanNvbiIpLnZl +cnNpb24pJykKICAgICAgICBmaQogICAgZmkKCiAgICBpZiBbIC16ICIkTkVXX1ZFUlNJT04iIF07 +IHRoZW4KICAgICAgICBlY2hvICJVbmFibGUgdG8gZGV0ZXJtaW5lIHZlcnNpb24sIGNvd2FyZGx5 +IGJhaWxpbmcgb3V0ISIKICAgICAgICBleGl0CiAgICBmaQp9Cgp3cml0ZV90ZW1wbGF0ZSgpIHsK +ICAgIGNhdCA8PCBFT19DSEFOR0UgPj4gLnJlbGVhc2UvbmV3LnR4dAoKCiMjIyBbJE5FV19WRVJT +SU9OXSAtICRZTUQKCiMjIyMgQWRkZWQKCi0gCgojIyMjIEZpeGVkCgotIAoKIyMjIyBDaGFuZ2Vk +CgotIApFT19DSEFOR0UKfQoKYWRkX2NvbW1pdF9tZXNzYWdlcygpIHsKCiAgICBMQVNUX1RBRz0k +KGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCkKICAgIGlmIFsgIiRMQVNUX1RBRyIgIT0g +IiIgXTsgdGhlbgogICAgICAgICMgYXBwZW5kIGxvZyBlbnRyaWVzIHNpbmNlIHRoZSBsYXN0IHRh +ZyAocmVsZWFzZSkKICAgICAgICBnaXQgbG9nIC0tcHJldHR5PWZvcm1hdDoiLSAlcyIgIiRMQVNU +X1RBRy4uSEVBRCIgPj4gLnJlbGVhc2UvbmV3LnR4dAogICAgZmkKfQoKYWRkX3JlbGVhc2VfbGlu +aygpIHsKCiAgICBpZiBncmVwIC1xICJeXFskTkVXX1ZFUlNJT05cXToiICIkQ0hBTkdFTE9HIjsg +dGhlbgogICAgICAgIGVjaG8gIkNIQU5HRUxPRyBVUkwgZm9yICRORVdfVkVSU0lPTiBleGlzdHMi +CiAgICBlbHNlCiAgICAgICAgIyB0aGUgVkVSU0lPTiAoYWRkZWQgYWJvdmUpIGlzIGEgbWFya2Rv +d24gW1VSTF0uIEFkZCB0aGUKICAgICAgICAjIHJlbGVhc2UgVVJMIHRvIHRoZSBib3R0b20gb2Yg +dGhlIGZpbGUuCiAgICAgICAgUkVQT19VUkw9JChnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAi +LnVybCIpCiAgICAgICAgZWNobyAiWyRORVdfVkVSU0lPTl06ICRSRVBPX1VSTC9yZWxlYXNlcy90 +YWcvJE5FV19WRVJTSU9OIiA+PiAiJENIQU5HRUxPRyIKICAgIGZpCn0KCnVwZGF0ZV9jaGFuZ2Vz +KCkgewogICAgIyBpbnNlcnQgY29udGVudHMgb2YgbmV3LnR4dCBpbnRvIENIQU5HRUxPRy5tZCBh +ZnRlciBtYXJrZXIKICAgIGlmIGdyZXAgLXFFICJeIyogJE5FV19WRVJTSU9OfF4jKiBcWyRORVdf +VkVSU0lPTlxdIiAiJENIQU5HRUxPRyI7IHRoZW4KICAgICAgICBlY2hvICJDSEFOR0VMT0cgZW50 +cnkgZm9yICRORVdfVkVSU0lPTiBleGlzdHMiCiAgICBlbHNlCgkJd3JpdGVfdGVtcGxhdGUKCQlh +ZGRfY29tbWl0X21lc3NhZ2VzCgkJZWNobyAiIiA+PiAucmVsZWFzZS9uZXcudHh0CgogICAgICAg +IGlmIGhlYWQgIiRDSEFOR0VMT0ciIHwgZ3JlcCAtcSBVbnJlbGVhc2VkOwogICAgICAgICAgICBz +ZWQgLWkgJycgLWUgIi8jIyMgVW5yZWxlYXNlZCQvciAucmVsZWFzZS9uZXcudHh0IiAiJENIQU5H +RUxPRyIKICAgICAgICB0aGVuCiAgICAgICAgICAgIHNlZCAtaSAnJyAtZSAiLyMjIyMgTi5OLk4u +KiQvciAucmVsZWFzZS9uZXcudHh0IiAiJENIQU5HRUxPRyIKICAgICAgICBmaQogICAgICAgIHJt +IC5yZWxlYXNlL25ldy50eHQKICAgIGZpCgogICAgYWRkX3JlbGVhc2VfbGluawogICAgaWYgY29t +bWFuZCAtdiBvcGVuOyB0aGVuIG9wZW4gIiRDSEFOR0VMT0ciOyBmaQoKICAgIGVjaG8KICAgIGVj +aG8gIkFGVEVSIGVkaXRpbmcgJENIQU5HRUxPRywgcnVuOiAucmVsZWFzZS9zdWJtaXQuc2giCn0K +CmZpbmRfbmV3X3ZlcnNpb24gIiRAIgoKWU1EPSQoZGF0ZSAiKyVZLSVtLSVkIikKIyBlY2hvICJQ +cmVwYXJpbmcgJE5FV19WRVJTSU9OIC0gJFlNRCIKCmlmIGJyYW5jaF9pc19tYWluOyB0aGVuCiAg +ICBpZiBbIC16ICIkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4pIiBdOyB0aGVuCiAgICAgICAgIyB3 +b3JraW5nIGRpcmVjdG9yeSBpcyBjbGVhbiwgYnJpbmcgaXQgdXAtdG8tZGF0ZQogICAgICAgIGdp +dCBwdWxsCiAgICBmaQogICAgZ2l0IGNoZWNrb3V0IC1iICJyZWxlYXNlLSR7TkVXX1ZFUlNJT059 +IgpmaQoKZmluZF9jaGFuZ2Vsb2cKdXBkYXRlX2NoYW5nZXMKCmdpdCBhZGQgcGFja2FnZS5qc29u +CmdpdCBhZGQgIiRDSEFOR0VMT0ciCgojIHVwZGF0ZSAucmVsZWFzZSBzdWJtb2R1bGUsIGJ1dCBs +ZWF2ZSBpdCB0byBhdXRob3IgdG8gcmV2aWV3L2NoZWNrIGluCmNkIC5yZWxlYXNlICYmIGdpdCBw +dWxsICYmIGNkIC4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAABwYWNrYWdlLy5yZWxlYXNlL3N1Ym1pdC5zaAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAMDAwNzU1IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMTYwNCAAMzU2MDExNjYwNCAAMDEyNjIx +IAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAACMhL2Jpbi9zaAoKLiAucmVsZWFzZS9iYXNlLnNoIHx8IGV4aXQKCmlm +IGJyYW5jaF9pc19tYWluOyB0aGVuCiAgICBlY2hvICJFUlJPUjogcnVuIHRoZSBwdXNoIHNjcmlw +dCBpbiBhIGZlYXR1cmUgYnJhbmNoISAobm90IG1haW4pIgogICAgZXhpdApmaQoKYXNzdXJlX3Jl +cG9faXNfY2xlYW4gfHwgZXhpdAoKUkVMX0JSQU5DSD0kKGdpdCBicmFuY2ggLS1zaG93LWN1cnJl +bnQpClBLR19WRVJTSU9OPSQobm9kZSAtZSAnY29uc29sZS5sb2cocmVxdWlyZSgiLi9wYWNrYWdl +Lmpzb24iKS52ZXJzaW9uKScpCkxBU1RfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJl +dj0wKQpSRVBPX1VSTD0kKGdoIHJlcG8gdmlldyAtLWpzb24gdXJsIC1xICIudXJsIikKR0lUX05P +VEVTPSQoZ2l0IGxvZyAtLXByZXR0eT1mb3JtYXQ6Ii0gJXMiICIkTEFTVF9UQUcuLkhFQUQiKQpH +SVRfVVJMX05PVEVTPSQoZ2l0IGxvZyAtLXByZXR0eT1mb3JtYXQ6Ii0gWyVoXSgkUkVQT19VUkwv +Y29tbWl0LyVoKSAlcyIgIiRMQVNUX1RBRy4uSEVBRCIpCgpnaXQgcHVzaCAtLXNldC11cHN0cmVh +bSBvcmlnaW4gIiRSRUxfQlJBTkNIIgoKaWYgY29tbWFuZCAtdiBnaDsgdGhlbgogICAgZ2ggcHIg +Y3JlYXRlIC1kIC0tdGl0bGUgIlJlbGVhc2UgdiRQS0dfVkVSU0lPTiIgLS1ib2R5PSIkR0lUX05P +VEVTIgoKICAgIGlmIFsgIiRMQVNUX1RBRyIgIT0gIiIgXTsgdGhlbgogICAgICAgICMgR2l0SHVi +IEFjdGlvbnMgcmVxdWlyZSB0aGUgdiBwcmVmaXggaW4gdGhlIHRpdGxlCiAgICAgICAgZ2ggcmVs +ZWFzZSBjcmVhdGUgIiRQS0dfVkVSU0lPTiIgLS1kcmFmdCAtLXRhcmdldCAiJE1BSU5fQlJBTkNI +IiAtLXRpdGxlICJ2JFBLR19WRVJTSU9OIiAtLW5vdGVzICIkR0lUX1VSTF9OT1RFUyIKICAgIGZp +CmZpCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABwYWNrYWdlLy5lc2xpbnRyYy55YW1sAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +MDAwNjQ0IAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMDI3NiAAMzU2MDExNjYwNCAAMDEyMDUyIAAw +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +ADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAGVudjoKICBlczY6IHRydWUKICBub2RlOiB0cnVlCiAgbW9jaGE6IHRydWUK +ICBlczIwMjA6IHRydWUKCnBsdWdpbnM6CiAgLSBoYXJha2EKCnJvb3Q6IHRydWUKCnJ1bGVzOgog +IHNlbWktc3R5bGU6IFtlcnJvciwgbGFzdF0KCmV4dGVuZHM6IFsiZXNsaW50OnJlY29tbWVuZGVk +IiwgInBsdWdpbjpoYXJha2EvcmVjb21tZW5kZWQiXQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAcGFja2FnZS8uY29kZWNsaW1hdGUueW1sAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAw +MDY0NCAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAyMTQgADM1NjAxMTY2MDQgADAxMjMyNyAAMAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw +MDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAABlbmdpbmVzOgogIGVzbGludDoKICAgIGVuYWJsZWQ6IHRydWUKICAgIGNoYW5u +ZWw6ICJlc2xpbnQtOCIKICAgIGNvbmZpZzoKICAgICAgY29uZmlnOiAiLmVzbGludHJjLnlhbWwi +CgpyYXRpbmdzOgogICBwYXRoczoKICAgLSAibGliLyouanMiCgAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHBhY2thZ2UvLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2 +NDQgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAxNjA0IAAzNTYwMTE2NjA0IAAwMTM3NzQgADAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAw +MDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAbmFtZTogQ0kKCm9uOiBbIHB1c2ggXQoKZW52OgogIENJOiB0cnVlCgpqb2JzOgoK +ICBsaW50OgogICAgdXNlczogaGFyYWthLy5naXRodWIvLmdpdGh1Yi93b3JrZmxvd3MvbGludC55 +bWxAbWFzdGVyCgogIGNvdmVyYWdlOgogICAgdXNlczogaGFyYWthLy5naXRodWIvLmdpdGh1Yi93 +b3JrZmxvd3MvY292ZXJhZ2UueW1sQG1hc3RlcgogICAgc2VjcmV0czogaW5oZXJpdAoKICB0ZXN0 +OgogICAgbmVlZHM6IFsgbGludCwgZ2V0LWx0cyBdCiAgICBydW5zLW9uOiAke3sgbWF0cml4Lm9z +IH19CiAgICBzdHJhdGVneToKICAgICAgbWF0cml4OgogICAgICAgIG9zOiBbIHVidW50dS1sYXRl +c3QsIHdpbmRvd3MtbGF0ZXN0IF0KICAgICAgICBub2RlLXZlcnNpb246ICR7eyBmcm9tSnNvbihu +ZWVkcy5nZXQtbHRzLm91dHB1dHMuYWN0aXZlKSB9fQogICAgICBmYWlsLWZhc3Q6IGZhbHNlCiAg +ICBzdGVwczoKICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MwogICAgLSB1c2VzOiBhY3Rp +b25zL3NldHVwLW5vZGVAdjMKICAgICAgbmFtZTogTm9kZSAke3sgbWF0cml4Lm5vZGUtdmVyc2lv +biB9fSBvbiAke3sgbWF0cml4Lm9zIH19CiAgICAgIHdpdGg6CiAgICAgICAgbm9kZS12ZXJzaW9u +OiAke3sgbWF0cml4Lm5vZGUtdmVyc2lvbiB9fQogICAgLSBydW46IG5wbSBpbnN0YWxsCiAgICAt +IHJ1bjogbnBtIHRlc3QKCiAgZ2V0LWx0czoKICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAg +IHN0ZXBzOgogICAgICAtIGlkOiBnZXQKICAgICAgICB1c2VzOiBtc2ltZXJzb24vbm9kZS1sdHMt +dmVyc2lvbnNAdjEKICAgIG91dHB1dHM6CiAgICAgIGFjdGl2ZTogJHt7IHN0ZXBzLmdldC5vdXRw +dXRzLmFjdGl2ZSB9fQogICAgICBsdHM6ICR7eyBzdGVwcy5nZXQub3V0cHV0cy5sdHMgfX0KAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAHBhY2thZ2UvLmdpdGh1Yi9jb2RlY292LnltbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQg +AAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDMyIAAzNTYwMTE2NjA0IAAwMTI3NjAgADAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAw +IAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAY29kZWNvdjoKICBjb21tZW50OiBmYWxzZQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAABwYWNrYWdlLy5naXRodWIvd29ya2Zsb3dzL2NvZGVxbC55bWwAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAA +AAAAAAAAAAAAAAAAAAAAMDAwMDAwMDMyMSAAMzU2MDExNjYwNCAAMDE0NjQzIAAwAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAA +MDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAG5hbWU6ICJDb2RlUUwiCgpvbjoKICBwdXNoOgogICAgYnJhbmNoZXM6IFsgbWFzdGVyIF0K +ICBwdWxsX3JlcXVlc3Q6CiAgICBicmFuY2hlczogWyBtYXN0ZXIgXQogIHNjaGVkdWxlOgogICAg +LSBjcm9uOiAnMTggNyAqICogNCcKCmpvYnM6CiAgY29kZXFsOgogICAgdXNlczogaGFyYWthLy5n +aXRodWIvLmdpdGh1Yi93b3JrZmxvd3MvY29kZXFsLnltbEBtYXN0ZXIKAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAcGFja2FnZS8uZ2l0aHViL2RlcGVuZGFib3QueW1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDY0NCAAAAAA +AAAAAAAAAAAAAAAAADAwMDAwMDA0MDQgADM1NjAxMTY2MDQgADAxMzQ0NiAAMAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAw +MDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAjIGh0dHBzOi8vaGVscC5naXRodWIuY29tL2dpdGh1Yi9hZG1pbmlzdGVyaW5nLWEtcmVwb3Np +dG9yeS9jb25maWd1cmF0aW9uLW9wdGlvbnMtZm9yLWRlcGVuZGVuY3ktdXBkYXRlcwoKdmVyc2lv +bjogMgp1cGRhdGVzOgogIC0gcGFja2FnZS1lY29zeXN0ZW06ICJucG0iCiAgICBkaXJlY3Rvcnk6 +ICIvIgogICAgc2NoZWR1bGU6CiAgICAgIGludGVydmFsOiAid2Vla2x5IgogICAgYWxsb3c6CiAg +ICAgIC0gZGVwZW5kZW5jeS10eXBlOiBwcm9kdWN0aW9uCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AHBhY2thZ2UvLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWwAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgAAAAAAAA +AAAAAAAAAAAAAAAwMDAwMDAwMjU1IAAzNTYwMTE2NjA0IAAwMTUwNTAgADAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAw +MDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +bmFtZTogcHVibGlzaAoKb246CiAgcHVzaDoKICAgIGJyYW5jaGVzOgogICAgICAtIG1hc3RlcgoK +ZW52OgogIENJOiB0cnVlCgpqb2JzOgogIHB1Ymxpc2g6CiAgICB1c2VzOiBoYXJha2EvLmdpdGh1 +Yi8uZ2l0aHViL3dvcmtmbG93cy9wdWJsaXNoLnltbEBtYXN0ZXIKICAgIHNlY3JldHM6IGluaGVy +aXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +--Apple-Mail=_FC490397-1965-4385-8EC7-55F5295FCC0D-- diff --git a/test/index.js b/test/message-stream.js similarity index 94% rename from test/index.js rename to test/message-stream.js index fb16bf5..1bef4d1 100644 --- a/test/index.js +++ b/test/message-stream.js @@ -8,7 +8,7 @@ function _set_up () { this.ms = new MessageStream({ main: { } }, 'msg', []); } -describe('messagestream', function () { +describe('message-stream', function () { beforeEach(_set_up)