oxygen-cli 1.37.8 → 1.37.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1687 -1687
- package/LICENSE +672 -672
- package/README.md +37 -37
- package/build/core/OxygenCore.js +8 -2
- package/build/core/OxygenEvents.js +4 -2
- package/build/core/OxygenModule.js +1 -1
- package/build/core/OxygenService.js +1 -1
- package/build/core/OxygenSubModule.js +1 -1
- package/build/core/WebDriverModule.js +1 -1
- package/build/core/utils.js +1 -1
- package/build/errors/HookError.js +1 -1
- package/build/errors/ModuleError.js +1 -1
- package/build/errors/ModuleUnavailableError.js +1 -1
- package/build/errors/OxygenError.js +1 -1
- package/build/errors/ScriptNotFound.js +1 -1
- package/build/errors/helper.js +1 -1
- package/build/index.js +1 -1
- package/build/lib/cli-util.js +25 -6
- package/build/lib/cli.js +2 -2
- package/build/lib/debugger.js +1 -1
- package/build/lib/img-merge.js +1 -1
- package/build/lib/launcher.js +1 -1
- package/build/lib/logger.js +43 -43
- package/build/lib/moduleRequire.js +1 -1
- package/build/lib/parallel-launcher.js +1 -1
- package/build/lib/param-manager.js +1 -1
- package/build/lib/param-reader-csv.js +1 -1
- package/build/lib/param-reader-excel.js +1 -1
- package/build/lib/param-reader-json.js +1 -1
- package/build/lib/text-to-image.js +1 -1
- package/build/lib/util.js +2 -2
- package/build/model/case-result.js +1 -1
- package/build/model/failure.js +1 -1
- package/build/model/status.js +1 -1
- package/build/model/step-result.js +1 -1
- package/build/model/suite-result.js +2 -1
- package/build/model/test-result.js +1 -1
- package/build/model/testcase.js +1 -1
- package/build/model/testsuite.js +1 -1
- package/build/ox_modules/index.js +1 -1
- package/build/ox_modules/module-assert.js +37 -37
- package/build/ox_modules/module-date.js +24 -24
- package/build/ox_modules/module-db.js +52 -52
- package/build/ox_modules/module-email.js +59 -59
- package/build/ox_modules/module-eyes.js +34 -34
- package/build/ox_modules/module-http/ntlm-util.js +10 -10
- package/build/ox_modules/module-http/ntlm.js +15 -15
- package/build/ox_modules/module-http.js +132 -132
- package/build/ox_modules/module-log.js +27 -27
- package/build/ox_modules/module-mailinator.js +87 -87
- package/build/ox_modules/module-mob/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-mob/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-mob/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-mob/commands/assertText.js +21 -21
- package/build/ox_modules/module-mob/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-mob/commands/assertValue.js +18 -18
- package/build/ox_modules/module-mob/commands/back.js +16 -16
- package/build/ox_modules/module-mob/commands/clear.js +19 -19
- package/build/ox_modules/module-mob/commands/click.js +17 -17
- package/build/ox_modules/module-mob/commands/clickHidden.js +17 -17
- package/build/ox_modules/module-mob/commands/clickLong.js +18 -18
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +18 -18
- package/build/ox_modules/module-mob/commands/closeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/debug.js +16 -16
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +19 -19
- package/build/ox_modules/module-mob/commands/enableNetwork.js +27 -27
- package/build/ox_modules/module-mob/commands/execute.js +21 -21
- package/build/ox_modules/module-mob/commands/findElement.js +20 -20
- package/build/ox_modules/module-mob/commands/findElements.js +23 -23
- package/build/ox_modules/module-mob/commands/getAlertText.js +17 -17
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +15 -15
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +15 -15
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +16 -16
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +16 -16
- package/build/ox_modules/module-mob/commands/getLocation.js +20 -20
- package/build/ox_modules/module-mob/commands/getSource.js +16 -16
- package/build/ox_modules/module-mob/commands/getText.js +18 -18
- package/build/ox_modules/module-mob/commands/getTitle.js +13 -13
- package/build/ox_modules/module-mob/commands/getUrl.js +17 -17
- package/build/ox_modules/module-mob/commands/getValue.js +18 -18
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +17 -17
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +21 -21
- package/build/ox_modules/module-mob/commands/index.js +1 -1
- package/build/ox_modules/module-mob/commands/installApp.js +16 -16
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +16 -16
- package/build/ox_modules/module-mob/commands/isCheckable.js +18 -18
- package/build/ox_modules/module-mob/commands/isChecked.js +18 -18
- package/build/ox_modules/module-mob/commands/isClickable.js +18 -18
- package/build/ox_modules/module-mob/commands/isExist.js +19 -19
- package/build/ox_modules/module-mob/commands/isSelected.js +23 -23
- package/build/ox_modules/module-mob/commands/isVisible.js +19 -19
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/launchApp.js +15 -15
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +18 -18
- package/build/ox_modules/module-mob/commands/open.js +17 -17
- package/build/ox_modules/module-mob/commands/pause.js +16 -16
- package/build/ox_modules/module-mob/commands/removeApp.js +16 -16
- package/build/ox_modules/module-mob/commands/resetApp.js +15 -15
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +22 -22
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +27 -27
- package/build/ox_modules/module-mob/commands/select.js +24 -24
- package/build/ox_modules/module-mob/commands/selectFrame.js +23 -23
- package/build/ox_modules/module-mob/commands/selectWindow.js +28 -28
- package/build/ox_modules/module-mob/commands/sendKeys.js +29 -29
- package/build/ox_modules/module-mob/commands/setContext.js +16 -16
- package/build/ox_modules/module-mob/commands/setNativeContext.js +15 -15
- package/build/ox_modules/module-mob/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +16 -16
- package/build/ox_modules/module-mob/commands/shake.js +16 -16
- package/build/ox_modules/module-mob/commands/smsClickLink.js +19 -19
- package/build/ox_modules/module-mob/commands/smsGetText.js +20 -20
- package/build/ox_modules/module-mob/commands/swipe.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeElement.js +20 -20
- package/build/ox_modules/module-mob/commands/swipeScreen.js +20 -20
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-mob/commands/tap.js +17 -17
- package/build/ox_modules/module-mob/commands/type.js +20 -20
- package/build/ox_modules/module-mob/commands/unlockPattern.js +22 -22
- package/build/ox_modules/module-mob/commands/waitForExist.js +18 -18
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-mob/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-mob.js +74 -74
- package/build/ox_modules/module-pdf.js +35 -35
- package/build/ox_modules/module-proxy.js +77 -77
- package/build/ox_modules/module-serial.js +55 -55
- package/build/ox_modules/module-shell.js +25 -25
- package/build/ox_modules/module-soap.js +72 -72
- package/build/ox_modules/module-twilio.js +41 -41
- package/build/ox_modules/module-utils.js +91 -91
- package/build/ox_modules/module-web/commands/alertAccept.js +17 -17
- package/build/ox_modules/module-web/commands/alertDismiss.js +17 -17
- package/build/ox_modules/module-web/commands/assertAlert.js +20 -20
- package/build/ox_modules/module-web/commands/assertExist.js +17 -17
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/assertText.js +21 -21
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/assertTitle.js +19 -19
- package/build/ox_modules/module-web/commands/assertValue.js +20 -20
- package/build/ox_modules/module-web/commands/back.js +16 -16
- package/build/ox_modules/module-web/commands/clear.js +18 -18
- package/build/ox_modules/module-web/commands/click.js +25 -25
- package/build/ox_modules/module-web/commands/clickHidden.js +23 -23
- package/build/ox_modules/module-web/commands/closeWindow.js +15 -15
- package/build/ox_modules/module-web/commands/debug.js +15 -15
- package/build/ox_modules/module-web/commands/deleteCookies.js +12 -12
- package/build/ox_modules/module-web/commands/deselect.js +22 -22
- package/build/ox_modules/module-web/commands/doubleClick.js +17 -17
- package/build/ox_modules/module-web/commands/dragAndDrop.js +20 -20
- package/build/ox_modules/module-web/commands/execute.js +24 -24
- package/build/ox_modules/module-web/commands/fileBrowse.js +18 -18
- package/build/ox_modules/module-web/commands/findElement.js +19 -19
- package/build/ox_modules/module-web/commands/findElements.js +22 -22
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +14 -14
- package/build/ox_modules/module-web/commands/getAlertText.js +16 -16
- package/build/ox_modules/module-web/commands/getAttribute.js +19 -19
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +17 -17
- package/build/ox_modules/module-web/commands/getCookies.js +13 -13
- package/build/ox_modules/module-web/commands/getCssValue.js +19 -19
- package/build/ox_modules/module-web/commands/getElementCount.js +17 -17
- package/build/ox_modules/module-web/commands/getHTML.js +17 -17
- package/build/ox_modules/module-web/commands/getSource.js +16 -16
- package/build/ox_modules/module-web/commands/getText.js +18 -18
- package/build/ox_modules/module-web/commands/getTitle.js +12 -12
- package/build/ox_modules/module-web/commands/getUrl.js +16 -16
- package/build/ox_modules/module-web/commands/getValue.js +18 -18
- package/build/ox_modules/module-web/commands/getWindowHandles.js +16 -16
- package/build/ox_modules/module-web/commands/getWindowSize.js +16 -16
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +16 -16
- package/build/ox_modules/module-web/commands/index.js +1 -1
- package/build/ox_modules/module-web/commands/isAlertPresent.js +16 -16
- package/build/ox_modules/module-web/commands/isChecked.js +18 -18
- package/build/ox_modules/module-web/commands/isExist.js +19 -19
- package/build/ox_modules/module-web/commands/isInteractable.js +22 -22
- package/build/ox_modules/module-web/commands/isSelected.js +23 -23
- package/build/ox_modules/module-web/commands/isVisible.js +19 -19
- package/build/ox_modules/module-web/commands/makeVisible.js +25 -25
- package/build/ox_modules/module-web/commands/maximizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/minimizeWindow.js +14 -14
- package/build/ox_modules/module-web/commands/mock.js +20 -20
- package/build/ox_modules/module-web/commands/mockClearAll.js +12 -12
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +12 -12
- package/build/ox_modules/module-web/commands/newWindow.js +16 -16
- package/build/ox_modules/module-web/commands/open.js +16 -16
- package/build/ox_modules/module-web/commands/pause.js +15 -15
- package/build/ox_modules/module-web/commands/point.js +21 -21
- package/build/ox_modules/module-web/commands/pointJS.js +15 -15
- package/build/ox_modules/module-web/commands/refresh.js +15 -15
- package/build/ox_modules/module-web/commands/rightClick.js +17 -17
- package/build/ox_modules/module-web/commands/rightClickActions.js +19 -19
- package/build/ox_modules/module-web/commands/scrollToElement.js +21 -21
- package/build/ox_modules/module-web/commands/select.js +23 -23
- package/build/ox_modules/module-web/commands/selectFrame.js +24 -24
- package/build/ox_modules/module-web/commands/selectWindow.js +27 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +20 -20
- package/build/ox_modules/module-web/commands/setTimeout.js +21 -21
- package/build/ox_modules/module-web/commands/setWindowSize.js +17 -17
- package/build/ox_modules/module-web/commands/takeScreenshot.js +17 -17
- package/build/ox_modules/module-web/commands/type.js +20 -20
- package/build/ox_modules/module-web/commands/verifyAlert.js +20 -20
- package/build/ox_modules/module-web/commands/verifyExist.js +17 -17
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +21 -21
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +21 -21
- package/build/ox_modules/module-web/commands/verifyText.js +21 -21
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +18 -18
- package/build/ox_modules/module-web/commands/verifyTitle.js +19 -19
- package/build/ox_modules/module-web/commands/verifyValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForAngular.js +19 -19
- package/build/ox_modules/module-web/commands/waitForExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForInteractable.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotExist.js +17 -17
- package/build/ox_modules/module-web/commands/waitForNotText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForNotValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForText.js +20 -20
- package/build/ox_modules/module-web/commands/waitForValue.js +20 -20
- package/build/ox_modules/module-web/commands/waitForVisible.js +17 -17
- package/build/ox_modules/module-web/commands/waitForWindow.js +22 -22
- package/build/ox_modules/module-web.js +105 -100
- package/build/ox_modules/module-win/commands/assertText.js +17 -17
- package/build/ox_modules/module-win/commands/assertTitle.js +15 -15
- package/build/ox_modules/module-win/commands/assertValue.js +14 -14
- package/build/ox_modules/module-win/commands/back.js +11 -11
- package/build/ox_modules/module-win/commands/clear.js +13 -13
- package/build/ox_modules/module-win/commands/click.js +13 -13
- package/build/ox_modules/module-win/commands/clickLong.js +14 -14
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +14 -14
- package/build/ox_modules/module-win/commands/findElement.js +15 -15
- package/build/ox_modules/module-win/commands/findElements.js +15 -15
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +12 -12
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +15 -15
- package/build/ox_modules/module-win/commands/getLocation.js +14 -14
- package/build/ox_modules/module-win/commands/getSource.js +12 -12
- package/build/ox_modules/module-win/commands/getText.js +14 -14
- package/build/ox_modules/module-win/commands/getValue.js +14 -14
- package/build/ox_modules/module-win/commands/getWindowHandles.js +15 -15
- package/build/ox_modules/module-win/commands/index.js +1 -1
- package/build/ox_modules/module-win/commands/isCheckable.js +14 -14
- package/build/ox_modules/module-win/commands/isChecked.js +14 -14
- package/build/ox_modules/module-win/commands/isClickable.js +14 -14
- package/build/ox_modules/module-win/commands/isExist.js +15 -15
- package/build/ox_modules/module-win/commands/isSelected.js +14 -14
- package/build/ox_modules/module-win/commands/isVisible.js +15 -15
- package/build/ox_modules/module-win/commands/open.js +13 -13
- package/build/ox_modules/module-win/commands/pause.js +12 -12
- package/build/ox_modules/module-win/commands/rightClick.js +13 -13
- package/build/ox_modules/module-win/commands/selectWindow.js +23 -23
- package/build/ox_modules/module-win/commands/sendKeys.js +22 -22
- package/build/ox_modules/module-win/commands/setTimeout.js +17 -17
- package/build/ox_modules/module-win/commands/takeScreenshot.js +16 -16
- package/build/ox_modules/module-win/commands/tap.js +13 -13
- package/build/ox_modules/module-win/commands/type.js +16 -16
- package/build/ox_modules/module-win/commands/waitForExist.js +14 -14
- package/build/ox_modules/module-win/commands/waitForInteractable.js +16 -16
- package/build/ox_modules/module-win/commands/waitForVisible.js +13 -13
- package/build/ox_modules/module-win.js +47 -47
- package/build/ox_modules/utils.js +8 -8
- package/build/ox_reporters/excel/template.json +48 -48
- package/build/ox_reporters/html/index.ejs +163 -163
- package/build/ox_reporters/html/summary.ejs +77 -77
- package/build/ox_reporters/html/tests-details.ejs +134 -134
- package/build/ox_reporters/html/tests-devices-browsers.ejs +83 -83
- package/build/ox_reporters/reporter-excel.js +1 -1
- package/build/ox_reporters/reporter-html.js +1 -1
- package/build/ox_reporters/reporter-json.js +1 -1
- package/build/ox_reporters/reporter-junit.js +1 -1
- package/build/ox_reporters/reporter-pdf.js +1 -1
- package/build/ox_reporters/reporter-rp.js +376 -0
- package/build/ox_reporters/reporter-xml.js +1 -1
- package/build/ox_services/service-devtools/submodule-network.js +1 -1
- package/build/ox_services/service-devtools.js +1 -1
- package/build/reporter/FileReporterBase.js +1 -1
- package/build/reporter/ReportAggregator.js +110 -43
- package/build/reporter/ReporterBase.js +2 -2
- package/build/runners/WorkerProcess.js +1 -1
- package/build/runners/cucumber/CucumberEventListener.js +1 -1
- package/build/runners/cucumber/CucumberReporter.js +1 -1
- package/build/runners/cucumber/CucumberWorker.js +1 -1
- package/build/runners/cucumber/index.js +1 -1
- package/build/runners/cucumber/worker.js +1 -1
- package/build/runners/index.js +1 -1
- package/build/runners/oxygen/OxygenWorker.js +1 -1
- package/build/runners/oxygen/index.js +37 -22
- package/build/runners/oxygen/worker.js +1 -1
- package/config/default.json +6 -6
- package/log.txt +1614 -0
- package/package.json +136 -135
- package/types/index.d.ts +70 -70
- package/types/module-eyes.d.ts +39 -39
- package/types/module-http.d.ts +163 -163
- package/types/module-log.d.ts +34 -34
- package/types/module-mob.d.ts +966 -966
- package/types/module-pdf.d.ts +40 -40
- package/types/module-proxy.d.ts +100 -100
- package/types/module-shell.d.ts +24 -24
- package/types/module-utils.d.ts +99 -99
- package/types/module-web.d.ts +1053 -1053
- package/types/module-win.d.ts +352 -352
- package/types/oxygen.d.ts +53 -53
|
@@ -47,6 +47,10 @@ const log = (0, _logger.default)('OxygenRunner');
|
|
|
47
47
|
const DEFAULT_ISSUER = 'user';
|
|
48
48
|
const MAX_RERUNS = 2;
|
|
49
49
|
|
|
50
|
+
const {
|
|
51
|
+
v1
|
|
52
|
+
} = require('uuid');
|
|
53
|
+
|
|
50
54
|
const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
51
55
|
|
|
52
56
|
const getSuitesBreakpoints = suites => {
|
|
@@ -113,6 +117,9 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
113
117
|
this._localTime = false;
|
|
114
118
|
this._testKilled = false;
|
|
115
119
|
this._scriptContentLineOffset = 3;
|
|
120
|
+
this._currentCaseResultId = undefined;
|
|
121
|
+
this._currentSuiteResultId = undefined;
|
|
122
|
+
this._currentStepResultId = undefined;
|
|
116
123
|
this._whenDisposed = (0, _when.defer)();
|
|
117
124
|
}
|
|
118
125
|
|
|
@@ -379,18 +386,18 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
379
386
|
|
|
380
387
|
for (let suiteIteration = 1; suiteIteration <= suite.iterationCount; suiteIteration++) {
|
|
381
388
|
if (showSuiteIterationsMessages) {
|
|
382
|
-
this._reporter.onIterationStart(this._id, suiteIteration, 'Suite');
|
|
389
|
+
await this._reporter.onIterationStart(this._id, suiteIteration, 'Suite');
|
|
383
390
|
}
|
|
384
391
|
|
|
385
392
|
const suiteResult = new _suiteResult.default();
|
|
386
393
|
suiteIterations.push(suiteResult);
|
|
394
|
+
suiteResult.id = this._currentSuiteResultId = v1();
|
|
387
395
|
suiteResult.name = suite.name || _util.default.getFileNameWithoutExt(suite.path);
|
|
388
396
|
suiteResult.startTime = _util.default.getTimeStamp();
|
|
389
397
|
suiteResult.iterationNum = suiteIteration;
|
|
390
398
|
suiteResult.status = _status.default.PASSED;
|
|
391
399
|
await this._worker_callBeforeSuiteHook(suite);
|
|
392
|
-
|
|
393
|
-
this._reporter.onSuiteStart(this._id, suite.uri, suiteResult);
|
|
400
|
+
await this._reporter.onSuiteStart(this._id, suiteResult.id, suiteResult);
|
|
394
401
|
|
|
395
402
|
for (let caze of suite.cases) {
|
|
396
403
|
if (!caze.path) {
|
|
@@ -413,10 +420,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
413
420
|
}
|
|
414
421
|
|
|
415
422
|
if (showCaseIterationsMessages) {
|
|
416
|
-
this._reporter.onIterationStart(this._id, caseIteration, 'Case');
|
|
423
|
+
await this._reporter.onIterationStart(this._id, caseIteration, 'Case');
|
|
417
424
|
}
|
|
418
425
|
|
|
419
|
-
|
|
426
|
+
const caseResultId = this._currentCaseResultId = v1();
|
|
427
|
+
await this._reporter.onCaseStart(this._id, suiteResult.id, caseResultId, caze);
|
|
420
428
|
let caseResult;
|
|
421
429
|
|
|
422
430
|
for (let reRunCount = 0; reRunCount < maxReruns; reRunCount++) {
|
|
@@ -433,10 +441,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
433
441
|
}
|
|
434
442
|
}
|
|
435
443
|
|
|
436
|
-
|
|
444
|
+
caseResult.id = caseResultId;
|
|
445
|
+
await this._reporter.onCaseEnd(this._id, suiteResult.id, caseResultId, caseResult);
|
|
437
446
|
|
|
438
447
|
if (showCaseIterationsMessages) {
|
|
439
|
-
this._reporter.onIterationEnd(this._id, caseResult, 'Case');
|
|
448
|
+
await this._reporter.onIterationEnd(this._id, caseResult, 'Case');
|
|
440
449
|
}
|
|
441
450
|
|
|
442
451
|
suiteResult.cases.push(caseResult);
|
|
@@ -453,12 +462,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
453
462
|
suiteResult.duration = suiteResult.endTime - suiteResult.startTime;
|
|
454
463
|
|
|
455
464
|
if (showSuiteIterationsMessages) {
|
|
456
|
-
this._reporter.onIterationEnd(this._id, suiteResult, 'Suite');
|
|
465
|
+
await this._reporter.onIterationEnd(this._id, suiteResult, 'Suite');
|
|
457
466
|
}
|
|
458
467
|
|
|
459
468
|
await this._worker_callAfterSuiteHook(suite, suiteResult);
|
|
460
|
-
|
|
461
|
-
this._reporter.onSuiteEnd(this._id, suite.uri, suiteResult);
|
|
469
|
+
await this._reporter.onSuiteEnd(this._id, suiteResult.id, suiteResult);
|
|
462
470
|
}
|
|
463
471
|
|
|
464
472
|
return suiteIterations;
|
|
@@ -647,7 +655,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
647
655
|
}
|
|
648
656
|
} catch (e) {
|
|
649
657
|
log.error('"beforeTest" hook failed:', e);
|
|
650
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeTest" hook failed:' + e, DEFAULT_ISSUER);
|
|
658
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"beforeTest" hook failed:' + e, DEFAULT_ISSUER));
|
|
651
659
|
}
|
|
652
660
|
}
|
|
653
661
|
|
|
@@ -658,7 +666,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
658
666
|
}
|
|
659
667
|
} catch (e) {
|
|
660
668
|
log.error('"beforeSuite" hook failed:', e);
|
|
661
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeSuite" hook failed:' + e, DEFAULT_ISSUER);
|
|
669
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"beforeSuite" hook failed:' + e, DEFAULT_ISSUER));
|
|
662
670
|
}
|
|
663
671
|
}
|
|
664
672
|
|
|
@@ -667,7 +675,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
667
675
|
await (this._worker && this._worker.invokeTestHook('beforeCase', [caze]));
|
|
668
676
|
} catch (e) {
|
|
669
677
|
log.error('"beforeCase" hook failed:', e);
|
|
670
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeCase" hook failed:' + e, DEFAULT_ISSUER);
|
|
678
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"beforeCase" hook failed:' + e, DEFAULT_ISSUER));
|
|
671
679
|
}
|
|
672
680
|
}
|
|
673
681
|
|
|
@@ -676,7 +684,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
676
684
|
await (this._worker && this._worker.invokeTestHook('afterTest', [this._id, result]));
|
|
677
685
|
} catch (e) {
|
|
678
686
|
log.error('"afterTest" hook failed:', e);
|
|
679
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterTest" hook failed:' + e, DEFAULT_ISSUER);
|
|
687
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"afterTest" hook failed:' + e, DEFAULT_ISSUER));
|
|
680
688
|
}
|
|
681
689
|
}
|
|
682
690
|
|
|
@@ -685,7 +693,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
685
693
|
await (this._worker && this._worker.invokeTestHook('afterSuite', [suite, result]));
|
|
686
694
|
} catch (e) {
|
|
687
695
|
log.error('"afterSuite" hook failed:', e);
|
|
688
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterSuite" hook failed:' + e, DEFAULT_ISSUER);
|
|
696
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"afterSuite" hook failed:' + e, DEFAULT_ISSUER));
|
|
689
697
|
}
|
|
690
698
|
}
|
|
691
699
|
|
|
@@ -694,7 +702,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
694
702
|
await (this._worker && this._worker.invokeTestHook('afterCase', [caze, result]));
|
|
695
703
|
} catch (e) {
|
|
696
704
|
log.error('"afterCase" hook failed:', e);
|
|
697
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterCase" hook failed:' + e, DEFAULT_ISSUER);
|
|
705
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"afterCase" hook failed:' + e, DEFAULT_ISSUER));
|
|
698
706
|
}
|
|
699
707
|
}
|
|
700
708
|
|
|
@@ -774,7 +782,11 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
774
782
|
|
|
775
783
|
_this.emit('log', msg.time, msg.level, msg.msg, msg.src || DEFAULT_ISSUER);
|
|
776
784
|
|
|
777
|
-
_this._reporter && _this._reporter.onLogEntry(msg.time, msg.level, msg.msg, msg.src || DEFAULT_ISSUER
|
|
785
|
+
_this._reporter && (await _this._reporter.onLogEntry(msg.time, msg.level, msg.msg, msg.src || DEFAULT_ISSUER, {
|
|
786
|
+
suiteId: this._currentSuiteResultId,
|
|
787
|
+
caseId: this._currentCaseResultId,
|
|
788
|
+
stepId: this._currentStepResultId
|
|
789
|
+
}));
|
|
778
790
|
} else if (msg.event && msg.event === 'line-update') {
|
|
779
791
|
_this.emit('line-update', msg.line, msg.stack, msg.time);
|
|
780
792
|
} else if (msg.event && msg.event === 'result-update') {
|
|
@@ -805,7 +817,8 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
805
817
|
}
|
|
806
818
|
|
|
807
819
|
async _handleBeforeCommand(e) {
|
|
808
|
-
this.
|
|
820
|
+
this._currentStepResultId = e.id;
|
|
821
|
+
this._reporter && (await this._reporter.onStepStart(this._id, this._currentSuiteResultId, this._currentCaseResultId, e));
|
|
809
822
|
|
|
810
823
|
try {
|
|
811
824
|
if (e && e.module && e.module === 'log') {} else {
|
|
@@ -813,12 +826,12 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
813
826
|
}
|
|
814
827
|
} catch (e) {
|
|
815
828
|
log.error('"beforeCommand" hook failed:', e);
|
|
816
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"beforeCommand" hook failed:' + e, DEFAULT_ISSUER);
|
|
829
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"beforeCommand" hook failed:' + e, DEFAULT_ISSUER));
|
|
817
830
|
}
|
|
818
831
|
}
|
|
819
832
|
|
|
820
833
|
async _handleAfterCommand(e) {
|
|
821
|
-
this._reporter && this._reporter.onStepEnd(this._id, e.result);
|
|
834
|
+
this._reporter && (await this._reporter.onStepEnd(this._id, this._currentSuiteResultId, this._currentCaseResultId, e.result));
|
|
822
835
|
|
|
823
836
|
try {
|
|
824
837
|
if (e && e.module && e.module === 'log') {} else {
|
|
@@ -826,8 +839,10 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
826
839
|
}
|
|
827
840
|
} catch (e) {
|
|
828
841
|
log.error('"afterCommand" hook failed:', e);
|
|
829
|
-
this._reporter && this._reporter.onLogEntry(null, 'WARN', '"afterCommand" hook failed:' + e, DEFAULT_ISSUER);
|
|
842
|
+
this._reporter && (await this._reporter.onLogEntry(null, 'WARN', '"afterCommand" hook failed:' + e, DEFAULT_ISSUER));
|
|
830
843
|
}
|
|
844
|
+
|
|
845
|
+
this._currentStepResultId = undefined;
|
|
831
846
|
}
|
|
832
847
|
|
|
833
848
|
_resetGlobalVariables() {
|
|
@@ -889,4 +904,4 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
889
904
|
}
|
|
890
905
|
|
|
891
906
|
exports.default = OxygenRunner;
|
|
892
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsIk1BWF9SRVJVTlMiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImdldFN1aXRlc0JyZWFrcG9pbnRzIiwic3VpdGVzIiwicmV0dmFsIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwibWFwIiwic3VpdGUiLCJjYXNlcyIsImNhemUiLCJicmVha3BvaW50cyIsImJyZWFrcG9pbnQiLCJwdXNoIiwicmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMiLCJyZW1vdmVCcmVha3BvaW50IiwiaWR4IiwiZmlsZSIsImxpbmUiLCJzcGxpY2UiLCJPeHlnZW5SdW5uZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfaWQiLCJveHV0aWwiLCJnZW5lcmF0ZVVuaXF1ZUlkIiwiX2lzUnVubmluZyIsIl9pc0luaXRpYWxpemluZyIsIl9pc0Rpc3Bvc2luZyIsIl93b3JrZXIiLCJfZGVidWdNb2RlIiwiX3dvcmtlclByb2NMYXN0RXJyb3IiLCJfbnBtR1Jvb3RFeGVjdXRpb24iLCJucG1HUm9vdEV4ZWN1dGlvbiIsIl9zdWl0ZSIsIl9lbnZWYXJzIiwiX3ZhcnMiLCJfY2FwcyIsIl9tb2RDYXBzIiwiX2F0dHJpYnV0ZXMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJnZXRJZCIsImluaXQiLCJjYXBzIiwicmVwb3J0ZXIiLCJFcnJvciIsIl9jd2QiLCJjd2QiLCJwcm9jZXNzIiwiX3JlcG9ydGVyIiwiX2lzSW5pdGlhbGl6ZWQiLCJvcHRFbnYiLCJlbnYiLCJlbnZzIiwiT2JqZWN0Iiwia2V5cyIsImVudlZhcnMiLCJfZW52IiwidGVzdEF0dHJpYnV0ZXMiLCJfc3VpdGVzIiwiZGVidWdQb3J0SWRlIiwiZGVidWdQb3J0IiwiX2RlYnVnUG9ydCIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0IiwibG9jYWxUaW1lIiwiX3N0YXJ0V29ya2VyUHJvY2VzcyIsIl93b3JrZXJfSW5pdE94eWdlbiIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdG9wRGVidWdnZXIiLCJpc1J1bm5pbmciLCJzdG9wIiwiZSIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jlc2V0R2xvYmFsVmFyaWFibGVzIiwicnVuIiwib25SdW5uZXJTdGFydCIsImVycm9yIiwicmVzdWx0IiwiX3J1blRlc3QiLCJmYWlsdXJlIiwib25SdW5uZXJFbmQiLCJraWxsIiwiZGVidWdDb250aW51ZSIsImRlYnVnZ2VyIiwiY29udGludWUiLCJ1cGRhdGVCcmVha3BvaW50cyIsImZpbGVQYXRoIiwic2V0QnJlYWtwb2ludHNBY3RpdmUiLCJwcm9taXNlcyIsInRzQnJlYWtwb2ludHMiLCJnZXRCcmVha3BvaW50cyIsInN1aXRlc0JyZWFrcG9pbnRzIiwic3VpdGVCcCIsImluY2x1ZGVzIiwiYWN0dWFsQ3VycmVudEJwIiwicmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUiLCJ1c2VyU2V0QnAiLCJzZXRCcmVha3BvaW50IiwicHJvbWlzZUFsbFByb21pc2UiLCJhbGwiLCJ0aGVuIiwidmFsdWUiLCJkZWJ1ZyIsImJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMiLCJyZXBsQ2xvc2UiLCJfc2VuZCIsImV2ZW50IiwibmFtZSIsInJlcGxTZW5kIiwiY21kIiwiY29udGVudCIsInJlcGxTdGFydCIsImludm9rZSIsImNsZWFyQnJlYWtwb2ludCIsIlRlc3RSZXN1bHQiLCJzdGFydFRpbWUiLCJnZXRUaW1lU3RhbXAiLCJTdGF0dXMiLCJQQVNTRUQiLCJfd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vayIsInN1aXRlUmVzdWx0IiwiX3J1blN1aXRlIiwiZW5kVGltZSIsImR1cmF0aW9uIiwiaGFzRmFpbGVkU3VpdGVzIiwic29tZSIsInN1aXRlSXRlcmF0aW9ucyIsIngiLCJGQUlMRUQiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl93b3JrZXJfY2FsbEFmdGVyVGVzdEhvb2siLCJwYXRoIiwiaXRlcmF0aW9uQ291bnQiLCJzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMiLCJyZVJ1bk9uRmFpbHVyZSIsInJlUnVuT25GYWlsZWQiLCJtYXhSZXJ1bnMiLCJyZVJ1bkNvdW50IiwicmVSdW5EZWxheSIsInN1aXRlSXRlcmF0aW9uIiwib25JdGVyYXRpb25TdGFydCIsIlRlc3RTdWl0ZVJlc3VsdCIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsIml0ZXJhdGlvbk51bSIsIl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayIsIm9uU3VpdGVTdGFydCIsInVyaSIsImNhc2VJdGVyYXRpb24iLCJzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyIsIm9uQ2FzZVN0YXJ0IiwiaWQiLCJjYXNlUmVzdWx0IiwiX3J1bkNhc2UiLCJzbGVlcCIsIm9uQ2FzZUVuZCIsIm9uSXRlcmF0aW9uRW5kIiwiV0FSTklORyIsIl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rIiwib25TdWl0ZUVuZCIsInBhcmFtcyIsInJlUnVuIiwicGFyYW1NYW5hZ2VyIiwicmVhZFByZXYiLCJfIiwiZXh0ZW5kIiwiZ2V0VmFsdWVzIiwiaSIsIl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rIiwiVGVzdENhc2VSZXN1bHQiLCJsb2NhdGlvbiIsInJlYWROZXh0IiwiX3dvcmtlcl9zdGFydFNlc3Npb24iLCJyZXN1bHRTdG9yZSIsImNvbnRleHQiLCJtb2R1bGVDYXBzIiwiX3dvcmtlcl9SdW4iLCJfcHJvY2Vzc1Rlc3RSZXN1bHRzIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiYXR0cmlidXRlcyIsImF0dGFjaG1lbnRzIiwiZmFpbGVkU3RlcHMiLCJmaW5kIiwid2FybmluZ1N0ZXBzIiwiaXNFbXB0eSIsIm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZCIsIl93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2siLCJkaXNwb3NlT3h5Z2VuTW9kdWxlcyIsImF1dG9EaXNwb3NlIiwiX3dvcmtlcl9lbmRTZXNzaW9uIiwiX3doZW5UZXN0Q2FzZUZpbmlzaGVkIiwicmVqZWN0Iiwic2NyaXB0TmFtZSIsInNjcmlwdFBhdGgiLCJ2YXJzIiwidGVzdCIsImNhc2UiLCJpdGVyYXRpb24iLCJwb0ZpbGUiLCJwbyIsImluaXRPeHlnZW4iLCJzdGFydFNlc3Npb24iLCJkaXNwb3NlTW9kdWxlcyIsImVuZFNlc3Npb24iLCJpbnZva2VUZXN0SG9vayIsIm9uTG9nRW50cnkiLCJ3b3JrZXJQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIldvcmtlclByb2Nlc3MiLCJzdGFydCIsIl9ob29rV29ya2VyRXZlbnRzIiwic3RhcnREZWJ1Z2dlciIsIl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMiLCJfdGhpcyIsInN1YnNjcmliZSIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJvbiIsInBheWxvYWQiLCJleGl0RG9uZSIsImVtaXQiLCJleGl0Q29kZSIsInByb21pc2UiLCJPeHlnZW5FcnJvciIsImVycm9yQ29kZSIsIlNDUklQVF9FUlJPUiIsIm1zZyIsImxldmVsIiwiaW5mbyIsImVyciIsInRpbWUiLCJzcmMiLCJzdGFjayIsIm1ldGhvZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsIm9uU3RlcFN0YXJ0IiwibW9kdWxlIiwib25TdGVwRW5kIiwiX2VtaXRJdGVyYXRpb25FbmQiLCJ0cyIsInRjIiwic3VpdGVJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uTnVtIiwiY2FzZUl0ZXJhdGlvblJlc3VsdCIsIl9zdGF0dXMiLCJfZW1pdFRlc3RFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNB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QUM3RixFQUFILElBQVMsSUFEVjtBQUVIOUMsUUFBQUEsSUFBSSxFQUFFMkksRUFBRSxDQUFDM0ksSUFGTjtBQUdIOEYsUUFBQUEsU0FBUyxFQUFFK0MsaUJBSFI7QUFJSGpILFFBQUFBLGNBQWMsRUFBRStHLEVBQUUsQ0FBQy9HO0FBSmhCO0FBVGdCLEtBQTNCO0FBZ0JIOztBQUVEcUgsRUFBQUEsWUFBWSxDQUFDL0ssTUFBRCxFQUFTO0FBQ2pCLFNBQUtxSixJQUFMLENBQVUsVUFBVixFQUFzQnJKLE1BQXRCO0FBQ0g7O0FBbnlCa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi9saWIvbG9nZ2VyJztcclxuY29uc3QgbG9nID0gbG9nZ2VyKCdPeHlnZW5SdW5uZXInKTtcclxuY29uc3QgREVGQVVMVF9JU1NVRVIgPSAndXNlcic7XHJcbmNvbnN0IE1BWF9SRVJVTlMgPSAyO1xyXG5cclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuaW1wb3J0IF8gIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuaW1wb3J0IFRlc3RTdWl0ZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9zdWl0ZS1yZXN1bHQnO1xyXG5pbXBvcnQgVGVzdENhc2VSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvY2FzZS1yZXN1bHQnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vLi4vbW9kZWwvc3RhdHVzJztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi8uLi9saWIvdXRpbCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94eWdlbkVycm9yIGZyb20gJy4uLy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBQYXJhbWV0ZXJNYW5hZ2VyIGZyb20gJy4uLy4uL2xpYi9wYXJhbS1tYW5hZ2VyLmpzJztcclxuaW1wb3J0IFdvcmtlclByb2Nlc3MgZnJvbSAnLi4vV29ya2VyUHJvY2Vzcyc7XHJcblxyXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXHJcbmNvbnN0IHNub296ZSA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG5cclxuY29uc3QgZ2V0U3VpdGVzQnJlYWtwb2ludHMgPSAoc3VpdGVzKSA9PiB7XHJcbiAgICBjb25zdCByZXR2YWwgPSBbXTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3VpdGVzICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZXMpICYmXHJcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICAgIHN1aXRlcy5tYXAoKHN1aXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHN1aXRlICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhemUuYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLm1hcCgoYnJlYWtwb2ludCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnB1c2goYnJlYWtwb2ludCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldHZhbDtcclxufTtcclxuXHJcbmNvbnN0IHJlbW92ZUJyZWFrcG9pbnRGcm9tU3VpdGVzID0gKHN1aXRlcywgcmVtb3ZlQnJlYWtwb2ludCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICAgIHN1aXRlcyAmJlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGVzKSAmJlxyXG4gICAgICAgIHN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgICBzdWl0ZXMubWFwKChzdWl0ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGUuY2FzZXMpICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubWFwKChjYXplKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQsIGlkeCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQuZmlsZSA9PT0gcmVtb3ZlQnJlYWtwb2ludC5maWxlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5saW5lID09PSByZW1vdmVCcmVha3BvaW50LmxpbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW5SdW5uZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgLy8gY2xhc3MgdmFyaWFibGVzXHJcbiAgICAgICAgdGhpcy5faWQgPSBveHV0aWwuZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNEaXNwb3NpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubnBtR1Jvb3RFeGVjdXRpb24gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25wbUdSb290RXhlY3V0aW9uID0gb3B0aW9ucy5ucG1HUm9vdEV4ZWN1dGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRlZmluZSB2YXJpYWJsZXMgdG8gaXRlcmF0ZSB0aHJvdWdoIHRlc3QgY2FzZXMgYW5kIHRlc3Qgc3VpdGUgaXRlcmF0aW9uc1xyXG4gICAgICAgIHRoaXMuX3N1aXRlO1xyXG4gICAgICAgIHRoaXMuX2VudlZhcnMgPSB7fTsgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlcyBwYXNzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdFxyXG4gICAgICAgIHRoaXMuX3ZhcnMgPSB7fTsgICAgIC8vIHVzZXItZGVmaW5lZCB2YXJpYWJsZXMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHNjcmlwdHNcclxuICAgICAgICB0aGlzLl9jYXBzID0ge307IC8vIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIHBhc3NlZCB0byBlYWNoIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX21vZENhcHMgPSB7fTtcclxuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzID0ge307XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gMztcclxuICAgICAgICAvLyBwcm9taXNlc1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQdWJsaWMgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIGdldElkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICghb3B0aW9ucy5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9jd2QgPSB0aGlzLl9vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gbWVyZ2UgY3VycmVudCBhbmQgdGVzdCBjb25maWd1cmF0aW9uIGJhc2VkIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBsZXQgb3B0RW52ID0ge307XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudikge1xyXG4gICAgICAgICAgICAgICAgLy8gJ2Vudicgb3B0aW9uIG1pZ2h0IGJlIGRlZmluZWQgZWl0aGVyIGFzIGEgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgb3IgYXMgYW4gb2JqZWN0IHRoYXQgbGlzdHMgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgJ2VudicgaXMgYSBzdHJpbmcsIHRoZW4gcmVzb2x2ZSB0aGUgYWN0dWFsIHZhcmlhYmxlcyBmcm9tICdlbnZzJyBvYmplY3RcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lbnYgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRpb25zLmVudnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuZW52c1tvcHRpb25zLmVudl0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGFuIG9iamVjdCwgdXNlIHRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiBpdFxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudikpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW52VmFycyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudlZhcnMpKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRFbnYgPSB7IC4uLm9wdEVudiwgLi4ub3B0aW9ucy5lbnZWYXJzIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZVxyXG4gICAgICAgICAgICB0aGlzLl9lbnYgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICAuLi5vcHRFbnZcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlcyA9IG9wdGlvbnMudGVzdEF0dHJpYnV0ZXMgfHwge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYXBzID0geyAuLi5jYXBzIH07IC8vIGFzc2lnbiBjYXBzIGZvciBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XHJcbiAgICAgICAgLy8gc2V0IHVwIGRlYnVnZ2luZyBvcHRpb25zXHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gZGVidWdnaW5nIChpbml0aWFsaXplRGVidWdnZXIpIHNob3VsZCBiZSByZW1vdmVkIGZyb20gT3h5Z2VuXHJcbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG9wdGlvbnMuZGVidWdQb3J0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IG9wdGlvbnMuZGVidWdQb3J0IHx8IG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9ICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubG9jYWxUaW1lKSB8fCB0aGlzLl9sb2NhbFRpbWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRXb3JrZXJQcm9jZXNzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyICYmIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wRGVidWdnZXIoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RvcChzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyJywgZSk7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHRoZSBkaXNwb3NlXHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdFcnJvciB3aGVuIGRpc3Bvc2luZyBSdW5uZXI6JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdHVzICE9PSAnQ0FOQ0VMRUQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXppbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5pdGlhbGl6YXRpb24gaGFzbid0IGJlZW4gY29tcGxldGVkIHlldCwgd2FpdCBmb3IgJ2luaXRpYWxpemVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcmV2aW91cyB0ZXN0IGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yICd0ZXN0LWVuZGVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJTdGFydCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwcyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuVGVzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IHJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJFbmQodGhpcy5faWQsIHJlc3VsdCwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBraWxsKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5raWxsKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnQ29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0c0JyZWFrcG9pbnRzID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlc0JyZWFrcG9pbnRzID0gZ2V0U3VpdGVzQnJlYWtwb2ludHModGhpcy5fc3VpdGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYnJlYWtwb2ludHMgZnJvbSBzdWl0ZXMvY2FzZXMgdHJlZVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc3VpdGVCcCBvZiBzdWl0ZXNCcmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtwb2ludHMuaW5jbHVkZXMoc3VpdGVCcC5saW5lKSAmJiAgZmlsZVBhdGggPT09IHN1aXRlQnAuZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyh0aGlzLl9zdWl0ZXMsIHN1aXRlQnApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVsZXRlZCBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYWN0dWFsQ3VycmVudEJwIG9mIHRzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKGFjdHVhbEN1cnJlbnRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGFjdHVhbEN1cnJlbnRCcCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGJyZWFrcG9pbnRzXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1c2VyU2V0QnAgb2YgYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRzQnJlYWtwb2ludHMuaW5jbHVkZXModXNlclNldEJwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGVQYXRoLCB1c2VyU2V0QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygndXBkYXRlQnJlYWtwb2ludHMoKSBkb25lLicpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb21pc2VBbGxQcm9taXNlIDogcHJvbWlzZUFsbFByb21pc2UsIGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgOiBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsQ2xvc2UoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfc3RvcCdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU2VuZChjbWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuX3NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ3JlcGwnLFxyXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9ldmFsJyxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY21kOiBjbWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlKCdyZXBsU3RhcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3N1aXRlICYmIHRoaXMuX3N1aXRlLnRlc3RjYXNlcykge1xyXG4gICAgICAgICAgICBjb25zdCB0YyA9IHRoaXMuX3N1aXRlLnRlc3RjYXNlc1t0Y2luZGV4XTtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKCdveHlnZW4uc2V0QnJlYWtwb2ludDogJyArIChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQpKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQodGMubmFtZSwgbGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckJyZWFrcG9pbnQobGluZSkge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNsZWFyQnJlYWtwb2ludChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQsIG51bGwpO1xyXG4gICAgICAgIH0qL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBhc3luYyBfcnVuVGVzdCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgcmVzdWx0LnN1aXRlcyA9IFtdO1xyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgLy8gY2FsbCBiZWZvcmVUZXN0IGhvb2tcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHN1aXRlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWl0ZSBvZiB0aGlzLl9zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuU3VpdGUoc3VpdGUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5wdXNoKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5kdXJhdGlvbiA9IHJlc3VsdC5lbmRUaW1lIC0gcmVzdWx0LnN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gcmVzdWx0LnN1aXRlcy5zb21lKHN1aXRlSXRlcmF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZUl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShzdWl0ZUl0ZXJhdGlvbnMpICYmIHN1aXRlSXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IGhhc0ZhaWxlZFN1aXRlcyA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5lbnZpcm9ubWVudCA9IHsgLi4udGhpcy5fZW52IH07XHJcbiAgICAgICAgLy8gY29tYmluZSB0ZXN0IGRlZmluZWQgY2FwcyBhbmQgcGVyIG1vZHVsZSBjYXBhYmlsaXRpZXMsIHRoYXQgd2VyZSBwYXNzZWQgYnkgdXNlciBpbiBlYWNoIG1vZHVsZSdzIGluaXQgZnVuY3Rpb25cclxuICAgICAgICByZXN1bHQuY2FwYWJpbGl0aWVzID0geyAuLi50aGlzLl9jYXBzLCAuLi50aGlzLl9tb2RDYXBzIH07ICAgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX2NhcHMgb2JqZWN0XHJcbiAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSB7IC4uLnRoaXMuX29wdGlvbnMgfTsgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX29wdGlvbnMgb2JqZWN0XHJcblxyXG4gICAgICAgIC8vIGlmIGVycm9yIG9jY3VyZWQsIGFkZCBpdCB0byB0aGUgc3VtbWFyeVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuU3VpdGUoc3VpdGUpIHtcclxuICAgICAgICBpZiAoIXN1aXRlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignc3VpdGUgaXMgbnVsbCBpbiBfcnVuU3VpdGUoKSEhIScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgc3VpdGUgd2l0aCBtaXNzaW5nIG1hbmRhdG9yeSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgaWYgKCFzdWl0ZS5uYW1lICYmICFzdWl0ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBzcGVjaWZ5IHN1aXRlLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgaWYgKCFzdWl0ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICBzdWl0ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc3VpdGUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZVJ1bk9uRmFpbHVyZSA9IHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCB8fCBmYWxzZTtcclxuICAgICAgICBjb25zdCBtYXhSZXJ1bnMgPSB0aGlzLl9vcHRpb25zLnJlUnVuQ291bnQgfHwgTUFYX1JFUlVOUztcclxuICAgICAgICBjb25zdCByZVJ1bkRlbGF5ID0gdGhpcy5fb3B0aW9ucy5yZVJ1bkRlbGF5O1xyXG4gICAgICAgIC8vIHNpbmdsZSBzdWl0ZSBtaWdodCBwcm9kdWNlIG11bHRpcGxlIHJlc3VsdHMsIGJhc2VkIG9uIGFtb3VudCBvZiBkZWZpbmVkIGl0ZXJhdGlvbnNcclxuICAgICAgICBjb25zdCBzdWl0ZUl0ZXJhdGlvbnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBzdWl0ZUl0ZXJhdGlvbj0xOyBzdWl0ZUl0ZXJhdGlvbiA8PSBzdWl0ZS5pdGVyYXRpb25Db3VudDsgc3VpdGVJdGVyYXRpb24rKykge1xyXG4gICAgICAgICAgICBpZiAoc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvblN0YXJ0KHRoaXMuX2lkLCBzdWl0ZUl0ZXJhdGlvbiwgJ1N1aXRlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSBuZXcgVGVzdFN1aXRlUmVzdWx0KCk7XHJcbiAgICAgICAgICAgIHN1aXRlSXRlcmF0aW9ucy5wdXNoKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQubmFtZSA9IHN1aXRlLm5hbWUgfHwgb3h1dGlsLmdldEZpbGVOYW1lV2l0aG91dEV4dChzdWl0ZS5wYXRoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBzdWl0ZUl0ZXJhdGlvbjtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVTdWl0ZUhvb2soc3VpdGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vblN1aXRlU3RhcnQodGhpcy5faWQsIHN1aXRlLnVyaSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjYXplIG9mIHN1aXRlLmNhc2VzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2FzZXMgd2l0aCBtaXNzaW5nIG1hbmRhdG9yeSAncGF0aCcgcHJvcGVydHkgXHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjYXplLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXplLm5hbWUgPSBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KGNhemUucGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUuaXRlcmF0aW9uQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXplLml0ZXJhdGlvbkNvdW50ID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNhc2VJdGVyYXRpb249MTsgY2FzZUl0ZXJhdGlvbiA8PSBjYXplLml0ZXJhdGlvbkNvdW50OyBjYXNlSXRlcmF0aW9uKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhemUgJiYgY2F6ZS5pdGVyYXRpb25Db3VudCAmJiBjYXplLml0ZXJhdGlvbkNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvblN0YXJ0KHRoaXMuX2lkLCBjYXNlSXRlcmF0aW9uLCAnQ2FzZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgY2FzZSBzdGFydCBldmVudFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uQ2FzZVN0YXJ0KHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQgfHwgY2F6ZS5wYXRoLCBjYXplKTtcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCByZVJ1bkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FzZVJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBydW4gb3IgcmUtcnVuIHRoZSBjdXJyZW50IHRlc3QgY2FzZVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJlUnVuQ291bnQgPSAwOyByZVJ1bkNvdW50IDwgbWF4UmVydW5zOyByZVJ1bkNvdW50KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCByZVJ1bkNvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghY2FzZVJlc3VsdCB8fCBjYXNlUmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkgJiYgIXJlUnVuT25GYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYXNlUmVzdWx0ICYmIGNhc2VSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVSdW5EZWxheSAmJiByZVJ1bkNvdW50IDwgbWF4UmVydW5zIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3h1dGlsLnNsZWVwKHJlUnVuRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBjYXNlIGVuZCBldmVudFxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25FbmQodGhpcy5faWQsIGNhc2VSZXN1bHQsICdDYXNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjYXNlIHJlc3VsdCB0byB0aGUgc3VpdGUgcmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgc3VpdGVSZXN1bHQuY2FzZXMucHVzaChjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0ZXN0IGNhc2UgaXRlcmF0aW9uIGhhcyBmYWlsZWQsIHRoZW4gbWFyayB0aGUgZW50aXJlIHRlc3QgY2FzZSBhcyBmYWlsZWQsIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgaXRlcmF0aW5nIG92ZXIgaXQgYW5kIG1vdmUgdG8gdGhlIG5leHQgdGVzdCBjYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhc2VSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZHVyYXRpb24gPSBzdWl0ZVJlc3VsdC5lbmRUaW1lIC0gc3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25FbmQodGhpcy5faWQsIHN1aXRlUmVzdWx0LCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vblN1aXRlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHJlUnVuQ291bnQgPSAwKSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XHJcbiAgICAgICAgY29uc3QgcmVSdW4gPSByZVJ1bkNvdW50ID4gMDtcclxuICAgICAgICAvLyBnZXQgdGVzdCBzdWl0ZSdzIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIC8vIGdldCB0aGVtIGZpcnN0IGFuZCB0aGVuIG92ZXJyaWRlIHdpdGggdGVzdCBjYXNlIGxldmVsIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5wYXJhbU1hbmFnZXIucmVhZFByZXYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIHN1aXRlLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlYWQgdGVzdCBjYXNlJ3MgbmV4dCBsaW5lcyBvZiBwYXJhbWV0ZXJzIGlmIHBhcmFtZXRlciBtYW5hZ2VyIGlzIGRlZmluZWRcclxuICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF8uZXh0ZW5kKHBhcmFtcywgY2F6ZS5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRkIGJyZWFrcG9pbnRzIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHQgaWYgaW4gZGVidWcgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiBjYXplLmJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTwgY2F6ZS5icmVha3BvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gZWRpdG9yIGluZGV4IHN0YXJ0cyBmcm9tIDEsIGJ1dCB3ZSBuZWVkIHplcm8gYmFzZWQgaW5kZXhcclxuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2F6ZS5icmVha3BvaW50c1tpXS5saW5lO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBjYXplLmJyZWFrcG9pbnRzW2ldLmZpbGU7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQoZmlsZSwgbGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKTtcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5uYW1lID0gY2F6ZS5uYW1lO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXplLnBhdGg7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBjYXNlSXRlcmF0aW9uO1xyXG4gICAgICAgIGNhc2VSZXN1bHQucmVSdW5Db3VudCA9IHJlUnVuQ291bnQ7XHJcblxyXG4gICAgICAgIC8vIHRyeSB0byBpbml0aWFsaXplIE94eWdlbiBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICghKHRoaXMuX3dvcmtlcikgJiYgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKSk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9Jbml0T3h5Z2VuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIGNhemUucGFyYW1NYW5hZ2VyLnJlYWROZXh0KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdGFydCBuZXcgdGVzdCBzZXNzaW9uXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX3N0YXJ0U2Vzc2lvbigpO1xyXG4gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBpbiB0aGUgd29ya2VyIHByb2Nlc3MgYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgY29uc3QgeyByZXN1bHRTdG9yZSwgY29udGV4dCwgbW9kdWxlQ2FwcywgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgY29udGV4dCwgZXJyb3IsIG1vZHVsZUNhcHMgfSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IGNhc2VSZXN1bHQuZW5kVGltZSAtIGNhc2VSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0ZXBzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuc3RlcHMgPyByZXN1bHRTdG9yZS5zdGVwcyA6IFtdO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5sb2dzID8gcmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmhhciA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmhhciA/IHJlc3VsdFN0b3JlLmhhciA6IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQudGVzdEF0dHJpYnV0ZXMgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5hdHRyaWJ1dGVzID8gcmVzdWx0U3RvcmUuYXR0cmlidXRlcyA6IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuYXR0YWNobWVudHMgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5hdHRhY2htZW50cyA/IHJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IGNhc2UgaXRlcmF0aW9uIHN0YXR1cyAtIG1hcmsgaXQgYXMgZmFpbGVkIGlmIGFueSBzdGVwIGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgdmFyIGZhaWxlZFN0ZXBzID0gXy5maW5kKGNhc2VSZXN1bHQuc3RlcHMsIHtzdGF0dXM6IFN0YXR1cy5GQUlMRUR9KTtcclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzdGVwcyB3aXRoIFdhcm5pbmcgc3RhdHVzXHJcbiAgICAgICAgICAgIHZhciB3YXJuaW5nU3RlcHMgPSBfLmZpbmQoY2FzZVJlc3VsdC5zdGVwcywge3N0YXR1czogU3RhdHVzLldBUk5JTkd9KTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBfLmlzRW1wdHkoZmFpbGVkU3RlcHMpICYmICFlcnJvciA/IFN0YXR1cy5QQVNTRUQgOiBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9yO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IG94dXRpbC5tYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQoY2FzZVJlc3VsdC5zdGVwcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3RlcHMpKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayhjYXplLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9SdW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VPeHlnZW5Nb2R1bGVzID0gdHlwZW9mIHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgIT09ICdib29sZWFuJyB8fCB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlID09PSB0cnVlO1xyXG4gICAgICAgIC8vIGVuZCBzZXNzaW9uIGFuZCBkaXNwb3NlIE94eWdlbiBtb2R1bGVzIGlmIHJlcXVpcmVkXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2VuZFNlc3Npb24oY2FzZVJlc3VsdC5zdGF0dXMsIGRpc3Bvc2VPeHlnZW5Nb2R1bGVzKTtcclxuXHJcbiAgICAgICAgaWYgKHN1aXRlLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICBzdWl0ZS5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYXplLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3dvcmtlcikge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXIgaXMgbnVsbCBidXQgbm90IHN1cHBvc2UgdG8hJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkLnJlamVjdChuZXcgRXJyb3IoJ193b3JrZXIgaXMgbnVsbCcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0YXJ0IHJ1bm5pbmcgdGhlIHRlc3RcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fd29ya2VyLnJ1bih7XHJcbiAgICAgICAgICAgIHNjcmlwdE5hbWU6IGNhemUubmFtZSxcclxuICAgICAgICAgICAgc2NyaXB0UGF0aDogY2F6ZS5wYXRoLFxyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5fY2FwcyxcclxuICAgICAgICAgICAgICAgIHZhcnM6IHRoaXMuX3ZhcnMsXHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxyXG4gICAgICAgICAgICAgICAgdGVzdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN1aXRlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBvRmlsZTogdGhpcy5fb3B0aW9ucy5wbyB8fCBudWxsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfSW5pdE94eWdlbigpIHtcclxuICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbml0T3h5Z2VuKHRoaXMuX2lkLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9jYXBzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9zdGFydFNlc3Npb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuc3RhcnRTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydFNlc3Npb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9lbmRTZXNzaW9uKHN0YXR1cyA9IG51bGwsIGRpc3Bvc2VNb2R1bGVzID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmVuZFNlc3Npb24pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmVuZFNlc3Npb24oc3RhdHVzLCBkaXNwb3NlTW9kdWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlVGVzdCcsIFt0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwc10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlU3VpdGUnLCBbc3VpdGVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rKGNhemUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlQ2FzZScsIFtjYXplXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlclRlc3QnLCBbdGhpcy5faWQsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJTdWl0ZScsIFtzdWl0ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNhc2UnLCBbY2F6ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3N0YXJ0V29ya2VyUHJvY2VzcygpIHtcclxuICAgICAgICBjb25zdCB3b3JrZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3dvcmtlci5qcycpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBXb3JrZXJQcm9jZXNzKHRoaXMuX2lkLCB3b3JrZXJQYXRoLCB0aGlzLl9kZWJ1Z01vZGUsIHRoaXMuX2RlYnVnUG9ydCwgJ094eWdlbicsIHRoaXMuX25wbUdSb290RXhlY3V0aW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnQoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRXZlbnRzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0RGVidWdnZXIoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckV2ZW50cygpIHtcclxuICAgICAgICAvLyBwcmVzZXJ2ZSB0aGlzIG9iamVjdFxyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl93b3JrZXIuc3Vic2NyaWJlKCdjb21tYW5kOmJlZm9yZScsIHRoaXMuX2hhbmRsZUJlZm9yZUNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2Vycm9yJywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdXb3JrZXIgcHJvY2VzcyBlcnJvcjogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdERvbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2V4aXQnLCAocGF5bG9hZCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgeyBleGl0Q29kZSB9ID0gcGF5bG9hZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSAmJiBleGl0Q29kZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRlc3QgaXMgcnVubmluZyBvciBpcyBiZWluZyBkaXNwb3NlZCBhbmQgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGRpZWQsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGVuZCB0aGUgdGVzdCBvciBkaXNwb3NhbCB3aXRoIGZhdGFsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAvLyAoY2hpbGQgcHJvY2VzcyBub3Qgc3VwcG9zZSB0byBkaWUgd2l0aCBjb2RlID4gMClcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5faXNEaXNwb3NpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5EaXNwb3NlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3RoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAxMzQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnT3V0IG9mIG1lbW9yeSBlcnJvci4gTWFrZSBzdXJlIHRoYXQgeW91IGRvblxcJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzIGluIHRoZSB0ZXN0IHNjcmlwdC4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IE94eWdlbkVycm9yKGBXb3JrZXIgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlOiAke2V4aXRDb2RlfS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlICYmIHByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0lORk8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0VSUk9SJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cubXNnLCBtc2cuZXJyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmxldmVsID09PSAnV0FSTicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cubXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsb2cnLCBtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRlciAmJiBfdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnbGluZS11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsaW5lLXVwZGF0ZScsIG1zZy5saW5lLCBtc2cuc3RhY2ssIG1zZy50aW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAncmVzdWx0LXVwZGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubWV0aG9kID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdpbml0LWRvbmUnLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICd3b3JrZXJFcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3b3JrZXJFcnJvcjonLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMua2lsbCgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3JlcGwnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdyZXBsJywgbXNnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLm9uKCdkZWJ1Z2dlcjpicmVhaycsIChicmVha3BvaW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrcG9pbnQnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIub24oJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCAoYnJlYWtFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrcG9pbnRFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vblN0ZXBTdGFydCh0aGlzLl9pZCwgZSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubW9kdWxlICYmIGUubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlQ29tbWFuZCcsIFtlXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVDb21tYW5kXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVBZnRlckNvbW1hbmQoZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uU3RlcEVuZCh0aGlzLl9pZCwgZS5yZXN1bHQpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubW9kdWxlICYmIGUubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDb21tYW5kJywgW2UucmVzdWx0XSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXRHbG9iYWxWYXJpYWJsZXMoKSB7XHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNEaXNwb3NpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RLaWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIF9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgbW9kdWxlQ2FwcywgY29udGV4dCA9IHt9LCBlcnJvciA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGlmIHRlc3Qgd2FzIGtpbGxlZCBiZWZvcmUgYW55IHJlc3VsdHMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4ganVzdCBmaW5hbGl6ZSB0aGUgdGVzdCB3aXRob3V0IHByb2Nlc3NpbmcgcmVzdWx0c1xyXG4gICAgICAgIGlmICh0aGlzLl90ZXN0S2lsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdG9yZSAndmFycycgcGFydCBvZiB0aGUgY29udGV4dCBmb3IgYSBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl92YXJzID0gY29udGV4dC52YXJzIHx8IHRoaXMuX3ZhcnM7XHJcbiAgICAgICAgLy8gc3RvcmUgJ21vZENhcHMnIHBhcnQgb2YgdGhlIGNvbnRleHQgZm9yIGEgbGF0ZXIgdXNlXHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHsgLi4udGhpcy5fbW9kQ2FwcywgLi4ubW9kdWxlQ2FwcyB8fCB7fSB9O1xyXG4gICAgICAgIC8vIGNsZWFuIHVwIGNvbnRleHQgZnJvbSBpbnRlcm5hbCBlbGVtZW50cywgbm90IG5lZWQgaW4gdGhlIHJlcG9ydDpcclxuICAgICAgICAvLyByZW1vdmUgY2FwcyBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC5jYXBzKVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5jYXBzO1xyXG4gICAgICAgIC8vIHJlbW92ZSBlbnYgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQuZW52KVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5lbnY7XHJcbiAgICAgICAgLy8gcmVtb3ZlIHRlc3QgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQudGVzdClcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQudGVzdDtcclxuICAgIH1cclxuXHJcbiAgICBfZW1pdEl0ZXJhdGlvbkVuZCh0cywgdGMsIHN1aXRlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uUmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpdGVyYXRpb24tZW5kJywge1xyXG4gICAgICAgICAgICBzdGF0dXM6IGNhc2VJdGVyYXRpb25SZXN1bHQuX3N0YXR1cyxcclxuICAgICAgICAgICAgZmFpbHVyZTogY2FzZUl0ZXJhdGlvblJlc3VsdC5mYWlsdXJlIHx8IG51bGwsXHJcbiAgICAgICAgICAgIGNhc2U6IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0Yy5pZCB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogdGMubmFtZSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogY2FzZUl0ZXJhdGlvbk51bSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50OiB0Yy5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdWl0ZToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRzLmlkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0cy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBzdWl0ZUl0ZXJhdGlvbk51bSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50OiB0cy5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2VtaXRUZXN0RW5kKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGVzdC1lbmQnLCByZXN1bHQpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGFyYW1ldGVyTWFuYWdlciB9OyJdfQ==
|
|
907
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsIk1BWF9SRVJVTlMiLCJ2MSIsInJlcXVpcmUiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImdldFN1aXRlc0JyZWFrcG9pbnRzIiwic3VpdGVzIiwicmV0dmFsIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwibWFwIiwic3VpdGUiLCJjYXNlcyIsImNhemUiLCJicmVha3BvaW50cyIsImJyZWFrcG9pbnQiLCJwdXNoIiwicmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMiLCJyZW1vdmVCcmVha3BvaW50IiwiaWR4IiwiZmlsZSIsImxpbmUiLCJzcGxpY2UiLCJPeHlnZW5SdW5uZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfaWQiLCJveHV0aWwiLCJnZW5lcmF0ZVVuaXF1ZUlkIiwiX2lzUnVubmluZyIsIl9pc0luaXRpYWxpemluZyIsIl9pc0Rpc3Bvc2luZyIsIl93b3JrZXIiLCJfZGVidWdNb2RlIiwiX3dvcmtlclByb2NMYXN0RXJyb3IiLCJfbnBtR1Jvb3RFeGVjdXRpb24iLCJucG1HUm9vdEV4ZWN1dGlvbiIsIl9zdWl0ZSIsIl9lbnZWYXJzIiwiX3ZhcnMiLCJfY2FwcyIsIl9tb2RDYXBzIiwiX2F0dHJpYnV0ZXMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl9jdXJyZW50Q2FzZVJlc3VsdElkIiwidW5kZWZpbmVkIiwiX2N1cnJlbnRTdWl0ZVJlc3VsdElkIiwiX2N1cnJlbnRTdGVwUmVzdWx0SWQiLCJfd2hlbkRpc3Bvc2VkIiwiZ2V0SWQiLCJpbml0IiwiY2FwcyIsInJlcG9ydGVyIiwiRXJyb3IiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIl9yZXBvcnRlciIsIl9pc0luaXRpYWxpemVkIiwib3B0RW52IiwiZW52IiwiZW52cyIsIk9iamVjdCIsImtleXMiLCJlbnZWYXJzIiwiX2VudiIsInRlc3RBdHRyaWJ1dGVzIiwiX3N1aXRlcyIsImRlYnVnUG9ydElkZSIsImRlYnVnUG9ydCIsIl9kZWJ1Z1BvcnQiLCJzY3JpcHRDb250ZW50TGluZU9mZnNldCIsImxvY2FsVGltZSIsIl9zdGFydFdvcmtlclByb2Nlc3MiLCJfd29ya2VyX0luaXRPeHlnZW4iLCJkaXNwb3NlIiwic3RhdHVzIiwic3RvcERlYnVnZ2VyIiwiaXNSdW5uaW5nIiwic3RvcCIsImUiLCJjb25zb2xlIiwid2FybiIsIl9yZXNldEdsb2JhbFZhcmlhYmxlcyIsInJ1biIsIm9uUnVubmVyU3RhcnQiLCJlcnJvciIsInJlc3VsdCIsIl9ydW5UZXN0IiwiZmFpbHVyZSIsIm9uUnVubmVyRW5kIiwia2lsbCIsImRlYnVnQ29udGludWUiLCJkZWJ1Z2dlciIsImNvbnRpbnVlIiwidXBkYXRlQnJlYWtwb2ludHMiLCJmaWxlUGF0aCIsInNldEJyZWFrcG9pbnRzQWN0aXZlIiwicHJvbWlzZXMiLCJ0c0JyZWFrcG9pbnRzIiwiZ2V0QnJlYWtwb2ludHMiLCJzdWl0ZXNCcmVha3BvaW50cyIsInN1aXRlQnAiLCJpbmNsdWRlcyIsImFjdHVhbEN1cnJlbnRCcCIsInJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlIiwidXNlclNldEJwIiwic2V0QnJlYWtwb2ludCIsInByb21pc2VBbGxQcm9taXNlIiwiYWxsIiwidGhlbiIsInZhbHVlIiwiZGVidWciLCJicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIiwicmVwbENsb3NlIiwiX3NlbmQiLCJldmVudCIsIm5hbWUiLCJyZXBsU2VuZCIsImNtZCIsImNvbnRlbnQiLCJyZXBsU3RhcnQiLCJpbnZva2UiLCJjbGVhckJyZWFrcG9pbnQiLCJUZXN0UmVzdWx0Iiwic3RhcnRUaW1lIiwiZ2V0VGltZVN0YW1wIiwiU3RhdHVzIiwiUEFTU0VEIiwiX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2siLCJzdWl0ZVJlc3VsdCIsIl9ydW5TdWl0ZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImhhc0ZhaWxlZFN1aXRlcyIsInNvbWUiLCJzdWl0ZUl0ZXJhdGlvbnMiLCJ4IiwiRkFJTEVEIiwiZW52aXJvbm1lbnQiLCJjYXBhYmlsaXRpZXMiLCJlcnJvckhlbHBlciIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rIiwicGF0aCIsIml0ZXJhdGlvbkNvdW50Iiwic2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzIiwicmVSdW5PbkZhaWx1cmUiLCJyZVJ1bk9uRmFpbGVkIiwibWF4UmVydW5zIiwicmVSdW5Db3VudCIsInJlUnVuRGVsYXkiLCJzdWl0ZUl0ZXJhdGlvbiIsIm9uSXRlcmF0aW9uU3RhcnQiLCJUZXN0U3VpdGVSZXN1bHQiLCJpZCIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsIml0ZXJhdGlvbk51bSIsIl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayIsIm9uU3VpdGVTdGFydCIsImNhc2VJdGVyYXRpb24iLCJzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyIsImNhc2VSZXN1bHRJZCIsIm9uQ2FzZVN0YXJ0IiwiY2FzZVJlc3VsdCIsIl9ydW5DYXNlIiwic2xlZXAiLCJvbkNhc2VFbmQiLCJvbkl0ZXJhdGlvbkVuZCIsIldBUk5JTkciLCJfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayIsIm9uU3VpdGVFbmQiLCJwYXJhbXMiLCJyZVJ1biIsInBhcmFtTWFuYWdlciIsInJlYWRQcmV2IiwiXyIsImV4dGVuZCIsImdldFZhbHVlcyIsImkiLCJfd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayIsIlRlc3RDYXNlUmVzdWx0IiwibG9jYXRpb24iLCJyZWFkTmV4dCIsIl93b3JrZXJfc3RhcnRTZXNzaW9uIiwicmVzdWx0U3RvcmUiLCJjb250ZXh0IiwibW9kdWxlQ2FwcyIsIl93b3JrZXJfUnVuIiwiX3Byb2Nlc3NUZXN0UmVzdWx0cyIsInN0ZXBzIiwibG9ncyIsImhhciIsImF0dHJpYnV0ZXMiLCJhdHRhY2htZW50cyIsImZhaWxlZFN0ZXBzIiwiZmluZCIsIndhcm5pbmdTdGVwcyIsImlzRW1wdHkiLCJtYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQiLCJfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rIiwiZGlzcG9zZU94eWdlbk1vZHVsZXMiLCJhdXRvRGlzcG9zZSIsIl93b3JrZXJfZW5kU2Vzc2lvbiIsIl93aGVuVGVzdENhc2VGaW5pc2hlZCIsInJlamVjdCIsInNjcmlwdE5hbWUiLCJzY3JpcHRQYXRoIiwidmFycyIsInRlc3QiLCJjYXNlIiwiaXRlcmF0aW9uIiwicG9GaWxlIiwicG8iLCJpbml0T3h5Z2VuIiwic3RhcnRTZXNzaW9uIiwiZGlzcG9zZU1vZHVsZXMiLCJlbmRTZXNzaW9uIiwiaW52b2tlVGVzdEhvb2siLCJvbkxvZ0VudHJ5Iiwid29ya2VyUGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJXb3JrZXJQcm9jZXNzIiwic3RhcnQiLCJfaG9va1dvcmtlckV2ZW50cyIsInN0YXJ0RGVidWdnZXIiLCJfaG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzIiwiX3RoaXMiLCJzdWJzY3JpYmUiLCJfaGFuZGxlQmVmb3JlQ29tbWFuZCIsImJpbmQiLCJfaGFuZGxlQWZ0ZXJDb21tYW5kIiwib24iLCJwYXlsb2FkIiwiZXhpdERvbmUiLCJlbWl0IiwiZXhpdENvZGUiLCJwcm9taXNlIiwiT3h5Z2VuRXJyb3IiLCJlcnJvckNvZGUiLCJTQ1JJUFRfRVJST1IiLCJtc2ciLCJsZXZlbCIsImluZm8iLCJlcnIiLCJ0aW1lIiwic3JjIiwic3VpdGVJZCIsImNhc2VJZCIsInN0ZXBJZCIsInN0YWNrIiwibWV0aG9kIiwiYnJlYWtwb2ludERhdGEiLCJicmVha0Vycm9yIiwib25TdGVwU3RhcnQiLCJtb2R1bGUiLCJvblN0ZXBFbmQiLCJfZW1pdEl0ZXJhdGlvbkVuZCIsInRzIiwidGMiLCJzdWl0ZUl0ZXJhdGlvbk51bSIsImNhc2VJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uUmVzdWx0IiwiX3N0YXR1cyIsIl9lbWl0VGVzdEVuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUE7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFuQkEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLGNBQVAsQ0FBWjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxNQUF2QjtBQUNBLE1BQU1DLFVBQVUsR0FBRyxDQUFuQjs7QUFFQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBU0MsT0FBTyxDQUFDLE1BQUQsQ0FBdEI7O0FBa0JBLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQUosQ0FBWUMsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQUQsRUFBVUYsRUFBVixDQUFqQyxDQUFyQjs7QUFFQSxNQUFNSSxvQkFBb0IsR0FBSUMsTUFBRCxJQUFZO0FBQ3JDLFFBQU1DLE1BQU0sR0FBRyxFQUFmOztBQUVBLE1BQ0lELE1BQU0sSUFDTkUsS0FBSyxDQUFDQyxPQUFOLENBQWNILE1BQWQsQ0FEQSxJQUVBQSxNQUFNLENBQUNJLE1BQVAsR0FBZ0IsQ0FIcEIsRUFJRTtBQUNFSixJQUFBQSxNQUFNLENBQUNLLEdBQVAsQ0FBWUMsS0FBRCxJQUFXO0FBQ2xCLFVBQ0lBLEtBQUssSUFDTEEsS0FBSyxDQUFDQyxLQUROLElBRUFMLEtBQUssQ0FBQ0MsT0FBTixDQUFjRyxLQUFLLENBQUNDLEtBQXBCLENBRkEsSUFHQUQsS0FBSyxDQUFDQyxLQUFOLENBQVlILE1BQVosR0FBcUIsQ0FKekIsRUFLRTtBQUNFRSxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUYsR0FBWixDQUFpQkcsSUFBRCxJQUFVO0FBQ3RCLGNBQ0lBLElBQUksSUFDSkEsSUFBSSxDQUFDQyxXQURMLElBRUFQLEtBQUssQ0FBQ0MsT0FBTixDQUFjSyxJQUFJLENBQUNDLFdBQW5CLENBRkEsSUFHQUQsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxNQUFqQixHQUEwQixDQUo5QixFQUtFO0FBQ0VJLFlBQUFBLElBQUksQ0FBQ0MsV0FBTCxDQUFpQkosR0FBakIsQ0FBc0JLLFVBQUQsSUFBZ0I7QUFDakNULGNBQUFBLE1BQU0sQ0FBQ1UsSUFBUCxDQUFZRCxVQUFaO0FBQ0gsYUFGRDtBQUdIO0FBQ0osU0FYRDtBQVlIO0FBQ0osS0FwQkQ7QUFxQkg7O0FBRUQsU0FBT1QsTUFBUDtBQUNILENBaENEOztBQWtDQSxNQUFNVywwQkFBMEIsR0FBRyxDQUFDWixNQUFELEVBQVNhLGdCQUFULEtBQThCO0FBQzdELE1BQ0liLE1BQU0sSUFDTkUsS0FBSyxDQUFDQyxPQUFOLENBQWNILE1BQWQsQ0FEQSxJQUVBQSxNQUFNLENBQUNJLE1BQVAsR0FBZ0IsQ0FIcEIsRUFJRTtBQUNFSixJQUFBQSxNQUFNLENBQUNLLEdBQVAsQ0FBWUMsS0FBRCxJQUFXO0FBQ2xCLFVBQ0lBLEtBQUssSUFDTEEsS0FBSyxDQUFDQyxLQUROLElBRUFMLEtBQUssQ0FBQ0MsT0FBTixDQUFjRyxLQUFLLENBQUNDLEtBQXBCLENBRkEsSUFHQUQsS0FBSyxDQUFDQyxLQUFOLENBQVlILE1BQVosR0FBcUIsQ0FKekIsRUFLRTtBQUNFRSxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUYsR0FBWixDQUFpQkcsSUFBRCxJQUFVO0FBQ3RCLGNBQ0lBLElBQUksSUFDSkEsSUFBSSxDQUFDQyxXQURMLElBRUFQLEtBQUssQ0FBQ0MsT0FBTixDQUFjSyxJQUFJLENBQUNDLFdBQW5CLENBRkEsSUFHQUQsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxNQUFqQixHQUEwQixDQUo5QixFQUtFO0FBQ0VJLFlBQUFBLElBQUksQ0FBQ0MsV0FBTCxDQUFpQkosR0FBakIsQ0FBcUIsQ0FBQ0ssVUFBRCxFQUFhSSxHQUFiLEtBQXFCO0FBQ3RDLGtCQUNJSixVQUFVLENBQUNLLElBQVgsS0FBb0JGLGdCQUFnQixDQUFDRSxJQUFyQyxJQUNBTCxVQUFVLENBQUNNLElBQVgsS0FBb0JILGdCQUFnQixDQUFDRyxJQUZ6QyxFQUdFO0FBQ0VSLGdCQUFBQSxJQUFJLENBQUNDLFdBQUwsQ0FBaUJRLE1BQWpCLENBQXdCSCxHQUF4QixFQUE2QixDQUE3QjtBQUNIO0FBQ0osYUFQRDtBQVFIO0FBQ0osU0FoQkQ7QUFpQkg7QUFDSixLQXpCRDtBQTBCSDtBQUNKLENBakNEOztBQW1DZSxNQUFNSSxZQUFOLFNBQTJCQyxvQkFBM0IsQ0FBd0M7QUFDbkRDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2pCO0FBRUEsU0FBS0MsR0FBTCxHQUFXQyxjQUFPQyxnQkFBUCxFQUFYO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixLQUFsQjtBQUNBLFNBQUtDLGVBQUwsR0FBdUIsS0FBdkI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEIsSUFBNUI7QUFFQSxTQUFLQyxrQkFBTCxHQUEwQixJQUExQjs7QUFDQSxRQUFJVixPQUFPLElBQUksT0FBT0EsT0FBTyxDQUFDVyxpQkFBZixLQUFxQyxXQUFwRCxFQUFpRTtBQUM3RCxXQUFLRCxrQkFBTCxHQUEwQlYsT0FBTyxDQUFDVyxpQkFBbEM7QUFDSDs7QUFHRCxTQUFLQyxNQUFMO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixFQUFuQjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixLQUFuQjtBQUNBLFNBQUtDLHdCQUFMLEdBQWdDLENBQWhDO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEJDLFNBQTVCO0FBQ0EsU0FBS0MscUJBQUwsR0FBNkJELFNBQTdCO0FBQ0EsU0FBS0Usb0JBQUwsR0FBNEJGLFNBQTVCO0FBRUEsU0FBS0csYUFBTCxHQUFxQixrQkFBckI7QUFDSDs7QUFJREMsRUFBQUEsS0FBSyxHQUFHO0FBQ0osV0FBTyxLQUFLMUIsR0FBWjtBQUNIOztBQUVTLFFBQUoyQixJQUFJLENBQUM1QixPQUFELEVBQVU2QixJQUFJLEdBQUcsRUFBakIsRUFBcUJDLFFBQXJCLEVBQStCO0FBRXJDLFFBQUksQ0FBQzlCLE9BQU8sQ0FBQ3JCLE1BQWIsRUFBcUI7QUFDakIsWUFBTSxJQUFJb0QsS0FBSixDQUFVLDBHQUFWLENBQU47QUFDSDs7QUFFRCxTQUFLYixRQUFMLEdBQWdCbEIsT0FBaEI7QUFDQSxTQUFLZ0MsSUFBTCxHQUFZLEtBQUtkLFFBQUwsQ0FBY2UsR0FBZCxJQUFxQkMsT0FBTyxDQUFDRCxHQUFSLEVBQWpDO0FBQ0EsU0FBS0UsU0FBTCxHQUFpQkwsUUFBakI7QUFDQSxTQUFLTSxjQUFMLEdBQXNCLElBQXRCOztBQUNBLFFBQUlwQyxPQUFKLEVBQWE7QUFFVCxVQUFJcUMsTUFBTSxHQUFHLEVBQWI7O0FBQ0EsVUFBSXJDLE9BQU8sQ0FBQ3NDLEdBQVosRUFBaUI7QUFHYixZQUFJLE9BQU90QyxPQUFPLENBQUNzQyxHQUFmLEtBQXVCLFFBQXZCLElBQW1DLE9BQU90QyxPQUFPLENBQUN1QyxJQUFmLEtBQXdCLFFBQTNELElBQXVFdkMsT0FBTyxDQUFDdUMsSUFBUixDQUFhdkMsT0FBTyxDQUFDc0MsR0FBckIsQ0FBM0UsRUFBc0c7QUFDbEdELFVBQUFBLE1BQU0sR0FBR3JDLE9BQU8sQ0FBQ3VDLElBQVIsQ0FBYXZDLE9BQU8sQ0FBQ3NDLEdBQXJCLENBQVQ7QUFFSCxTQUhELE1BS0ssSUFBSSxPQUFPdEMsT0FBTyxDQUFDc0MsR0FBZixLQUF1QixRQUF2QixJQUFtQ0UsTUFBTSxDQUFDQyxJQUFQLENBQVl6QyxPQUFPLENBQUNzQyxHQUFwQixDQUF2QyxFQUFpRTtBQUNsRUQsWUFBQUEsTUFBTSxHQUFHckMsT0FBTyxDQUFDc0MsR0FBakI7QUFDSDtBQUNKOztBQUVELFVBQUl0QyxPQUFPLENBQUMwQyxPQUFSLElBQW1CRixNQUFNLENBQUNDLElBQVAsQ0FBWXpDLE9BQU8sQ0FBQzBDLE9BQXBCLENBQXZCLEVBQXFEO0FBQ2pETCxRQUFBQSxNQUFNLEdBQUcsRUFBRSxHQUFHQSxNQUFMO0FBQWEsYUFBR3JDLE9BQU8sQ0FBQzBDO0FBQXhCLFNBQVQ7QUFDSDs7QUFHRCxXQUFLQyxJQUFMLEdBQVksRUFDUixHQUFHLEtBQUtBLElBREE7QUFFUixXQUFHTjtBQUZLLE9BQVo7QUFJQSxXQUFLcEIsV0FBTCxHQUFtQmpCLE9BQU8sQ0FBQzRDLGNBQVIsSUFBMEIsRUFBN0M7QUFDSDs7QUFFRCxTQUFLN0IsS0FBTCxHQUFhLEVBQUUsR0FBR2M7QUFBTCxLQUFiO0FBQ0EsU0FBS2dCLE9BQUwsR0FBZSxDQUFFLEdBQUc3QyxPQUFPLENBQUNyQixNQUFiLENBQWY7QUFJQSxTQUFLNkIsVUFBTCxHQUFtQlIsT0FBTyxDQUFDOEMsWUFBUixJQUF3QjlDLE9BQU8sQ0FBQytDLFNBQWhDLEdBQTRDLElBQTVDLEdBQW1ELEtBQXRFO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQmhELE9BQU8sQ0FBQytDLFNBQVIsSUFBcUIvQyxPQUFPLENBQUM4QyxZQUE3QixJQUE2QyxJQUEvRDtBQUNBOUMsSUFBQUEsT0FBTyxDQUFDaUQsdUJBQVIsR0FBa0MsS0FBSzVCLHdCQUF2QztBQUNBLFNBQUtGLFVBQUwsR0FBbUIsS0FBS0QsUUFBTCxJQUFpQixLQUFLQSxRQUFMLENBQWNnQyxTQUFoQyxJQUE4QyxLQUFLL0IsVUFBckU7QUFDQSxVQUFNLEtBQUtnQyxtQkFBTCxFQUFOO0FBQ0EsVUFBTSxLQUFLQyxrQkFBTCxFQUFOO0FBQ0g7O0FBRVksUUFBUEMsT0FBTyxDQUFDQyxNQUFNLEdBQUcsSUFBVixFQUFnQjtBQUN6QixTQUFLaEQsWUFBTCxHQUFvQixJQUFwQjs7QUFDQSxRQUFJO0FBQ0EsV0FBS0MsT0FBTCxLQUFnQixNQUFNLEtBQUtBLE9BQUwsQ0FBYWdELFlBQWIsRUFBdEI7O0FBQ0EsVUFBSSxLQUFLaEQsT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWFpRCxTQUFqQyxFQUE0QztBQUN4QyxjQUFNLEtBQUtqRCxPQUFMLENBQWFrRCxJQUFiLENBQWtCSCxNQUFsQixDQUFOO0FBQ0g7QUFDSixLQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1JDLE1BQUFBLE9BQU8sQ0FBQzNGLEdBQVIsQ0FBWSw2QkFBWixFQUEyQzBGLENBQTNDO0FBRUExRixNQUFBQSxHQUFHLENBQUM0RixJQUFKLENBQVMsOEJBQVQsRUFBeUNGLENBQXpDO0FBQ0g7O0FBRUQsUUFBSUosTUFBTSxLQUFLLFVBQWYsRUFBMkI7QUFDdkIsV0FBS08scUJBQUw7QUFDSDtBQUNKOztBQUVRLFFBQUhDLEdBQUcsR0FBRztBQUNSLFFBQUksS0FBS3pELGVBQVQsRUFBMEI7QUFDdEIsWUFBTSxJQUFJMEIsS0FBSixDQUFVLHdFQUFWLENBQU47QUFDSDs7QUFDRCxRQUFJLEtBQUszQixVQUFULEVBQXFCO0FBQ2pCLFlBQU0sSUFBSTJCLEtBQUosQ0FBVSw2REFBVixDQUFOO0FBQ0g7O0FBQ0QsU0FBSzNCLFVBQUwsR0FBa0IsSUFBbEI7QUFFQSxVQUFNLEtBQUsrQixTQUFMLENBQWU0QixhQUFmLENBQTZCLEtBQUs5RCxHQUFsQyxFQUF1QyxLQUFLaUIsUUFBNUMsRUFBc0QsS0FBS0gsS0FBM0QsQ0FBTjtBQUVBLFFBQUlpRCxLQUFLLEdBQUcsSUFBWjtBQUNBLFFBQUlDLE1BQU0sR0FBRyxJQUFiOztBQUNBLFFBQUk7QUFDQUEsTUFBQUEsTUFBTSxHQUFHLE1BQU0sS0FBS0MsUUFBTCxFQUFmO0FBQ0gsS0FGRCxDQUdBLE9BQU9SLENBQVAsRUFBVTtBQUNOTSxNQUFBQSxLQUFLLEdBQUdOLENBQVI7QUFDSDs7QUFFRCxRQUFJLENBQUNNLEtBQUQsSUFBVUMsTUFBVixJQUFvQkEsTUFBTSxDQUFDRSxPQUEvQixFQUF3QztBQUNwQ0gsTUFBQUEsS0FBSyxHQUFHQyxNQUFNLENBQUNFLE9BQWY7QUFDSDs7QUFFRCxVQUFNLEtBQUtoQyxTQUFMLENBQWVpQyxXQUFmLENBQTJCLEtBQUtuRSxHQUFoQyxFQUFxQ2dFLE1BQXJDLEVBQTZDRCxLQUE3QyxDQUFOO0FBQ0EsU0FBSzVELFVBQUwsR0FBa0IsS0FBbEI7O0FBQ0EsUUFBSTRELEtBQUosRUFBVztBQUNQLFlBQU1BLEtBQU47QUFDSDs7QUFDRCxXQUFPQyxNQUFQO0FBQ0g7O0FBRVMsUUFBSkksSUFBSSxDQUFDZixNQUFNLEdBQUcsSUFBVixFQUFnQjtBQUN0QixTQUFLbEMsV0FBTCxHQUFtQixJQUFuQjs7QUFFQSxRQUFJLEtBQUtiLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhaUQsU0FBakMsRUFBNEM7QUFDeEMsWUFBTSxLQUFLakQsT0FBTCxDQUFhOEQsSUFBYixDQUFrQmYsTUFBbEIsQ0FBTjtBQUNIO0FBQ0o7O0FBRURnQixFQUFBQSxhQUFhLEdBQUc7QUFDWixRQUFJLEtBQUs5RCxVQUFMLElBQW1CLEtBQUtELE9BQTVCLEVBQXFDO0FBQ2pDLFdBQUtBLE9BQUwsQ0FBYWdFLFFBQWIsQ0FBc0JDLFFBQXRCO0FBQ0g7QUFDSjs7QUFFc0IsUUFBakJDLGlCQUFpQixDQUFDckYsV0FBRCxFQUFjc0YsUUFBZCxFQUF3QjtBQUMzQyxRQUFJO0FBRUEsVUFBSSxLQUFLbkUsT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWFnRSxRQUE3QixJQUF5QyxLQUFLaEUsT0FBTCxDQUFhZ0UsUUFBYixDQUFzQkksb0JBQW5FLEVBQXlGO0FBQ3JGLGNBQU0sS0FBS3BFLE9BQUwsQ0FBYWdFLFFBQWIsQ0FBc0JJLG9CQUF0QixDQUEyQyxLQUEzQyxDQUFOO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsY0FBTXRHLE1BQU0sQ0FBQyxHQUFELENBQVo7QUFDQSxlQUFPLE1BQU0sS0FBS29HLGlCQUFMLENBQXVCckYsV0FBdkIsRUFBb0NzRixRQUFwQyxDQUFiO0FBQ0g7O0FBRUQsVUFBSSxLQUFLbEUsVUFBTCxJQUFtQixLQUFLRCxPQUFMLENBQWFnRSxRQUFwQyxFQUE4QztBQUMxQyxZQUFJSyxRQUFRLEdBQUcsRUFBZjs7QUFFQSxjQUFNQyxhQUFhLEdBQUcsS0FBS3RFLE9BQUwsQ0FBYWdFLFFBQWIsQ0FBc0JPLGNBQXRCLENBQXFDSixRQUFyQyxDQUF0Qjs7QUFDQSxjQUFNSyxpQkFBaUIsR0FBR3JHLG9CQUFvQixDQUFDLEtBQUttRSxPQUFOLENBQTlDOztBQUdBLGFBQUssSUFBSW1DLE9BQVQsSUFBb0JELGlCQUFwQixFQUF1QztBQUNuQyxjQUFJLENBQUMzRixXQUFXLENBQUM2RixRQUFaLENBQXFCRCxPQUFPLENBQUNyRixJQUE3QixDQUFELElBQXdDK0UsUUFBUSxLQUFLTSxPQUFPLENBQUN0RixJQUFqRSxFQUF1RTtBQUNuRUgsWUFBQUEsMEJBQTBCLENBQUMsS0FBS3NELE9BQU4sRUFBZW1DLE9BQWYsQ0FBMUI7QUFDSDtBQUNKOztBQUdELGFBQUssSUFBSUUsZUFBVCxJQUE0QkwsYUFBNUIsRUFBMkM7QUFDdkMsY0FBSSxDQUFDekYsV0FBVyxDQUFDNkYsUUFBWixDQUFxQkMsZUFBckIsQ0FBTCxFQUE0QztBQUN4Q04sWUFBQUEsUUFBUSxDQUFDdEYsSUFBVCxDQUFjLEtBQUtpQixPQUFMLENBQWFnRSxRQUFiLENBQXNCWSx1QkFBdEIsQ0FBOENULFFBQTlDLEVBQXdEUSxlQUF4RCxDQUFkO0FBQ0g7QUFDSjs7QUFHRCxhQUFLLElBQUlFLFNBQVQsSUFBc0JoRyxXQUF0QixFQUFtQztBQUMvQixjQUFJLENBQUN5RixhQUFhLENBQUNJLFFBQWQsQ0FBdUJHLFNBQXZCLENBQUwsRUFBd0M7QUFDcENSLFlBQUFBLFFBQVEsQ0FBQ3RGLElBQVQsQ0FBYyxLQUFLaUIsT0FBTCxDQUFhZ0UsUUFBYixDQUFzQmMsYUFBdEIsQ0FBb0NYLFFBQXBDLEVBQThDVSxTQUE5QyxDQUFkO0FBQ0g7QUFDSjs7QUFFRCxZQUFJRSxpQkFBaUIsR0FBRyxNQUFNL0csT0FBTyxDQUFDZ0gsR0FBUixDQUFZWCxRQUFaLEVBQXNCWSxJQUF0QixDQUE0QkMsS0FBRCxJQUFXO0FBQ2hFLGlCQUFPQSxLQUFQO0FBQ0gsU0FGNkIsQ0FBOUI7QUFJQSxjQUFNLEtBQUtsRixPQUFMLENBQWFnRSxRQUFiLENBQXNCSSxvQkFBdEIsQ0FBMkMsSUFBM0MsQ0FBTjtBQUVBLGNBQU10RyxNQUFNLENBQUMsR0FBRCxDQUFaO0FBRUFMLFFBQUFBLEdBQUcsQ0FBQzBILEtBQUosQ0FBVSwyQkFBVjs7QUFFQSxjQUFNQyw0QkFBNEIsR0FBRyxLQUFLcEYsT0FBTCxDQUFhZ0UsUUFBYixDQUFzQk8sY0FBdEIsQ0FBcUNKLFFBQXJDLENBQXJDOztBQUVBLGVBQU87QUFBRVksVUFBQUEsaUJBQWlCLEVBQUdBLGlCQUF0QjtBQUF5Q0ssVUFBQUEsNEJBQTRCLEVBQUdBO0FBQXhFLFNBQVA7QUFDSCxPQXhDRCxNQXdDTztBQUNILGVBQU8sSUFBUDtBQUNIO0FBQ0osS0FwREQsQ0FvREUsT0FBT2pDLENBQVAsRUFBVTtBQUNSMUYsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLGdCQUFWLEVBQTRCTixDQUE1QjtBQUNIO0FBQ0o7O0FBRWMsUUFBVGtDLFNBQVMsR0FBRztBQUNkLFVBQU0sS0FBS3JGLE9BQUwsQ0FBYXNGLEtBQWIsQ0FBbUI7QUFDckJDLE1BQUFBLEtBQUssRUFBRSxNQURjO0FBRXJCQyxNQUFBQSxJQUFJLEVBQUU7QUFGZSxLQUFuQixDQUFOO0FBSUg7O0FBRWEsUUFBUkMsUUFBUSxDQUFDQyxHQUFELEVBQU07QUFDaEIsVUFBTSxLQUFLMUYsT0FBTCxDQUFhc0YsS0FBYixDQUFtQjtBQUNyQkMsTUFBQUEsS0FBSyxFQUFFLE1BRGM7QUFFckJDLE1BQUFBLElBQUksRUFBRSxXQUZlO0FBR3JCRyxNQUFBQSxPQUFPLEVBQUU7QUFDTEQsUUFBQUEsR0FBRyxFQUFFQTtBQURBO0FBSFksS0FBbkIsQ0FBTjtBQU9IOztBQUVjLFFBQVRFLFNBQVMsR0FBRztBQUNkLFVBQU0sS0FBSzVGLE9BQUwsQ0FBYTZGLE1BQWIsQ0FBb0IsV0FBcEIsQ0FBTjtBQUNIOztBQUVEZixFQUFBQSxhQUFhLENBQUMxRixJQUFELEVBQU8sQ0FPbkI7O0FBRUQwRyxFQUFBQSxlQUFlLENBQUMxRyxJQUFELEVBQU8sQ0FLckI7O0FBTWEsUUFBUnVFLFFBQVEsR0FBRztBQUNiLFVBQU1ELE1BQU0sR0FBRyxJQUFJcUMsbUJBQUosRUFBZjtBQUNBckMsSUFBQUEsTUFBTSxDQUFDc0MsU0FBUCxHQUFtQnJHLGNBQU9zRyxZQUFQLEVBQW5CO0FBQ0F2QyxJQUFBQSxNQUFNLENBQUNYLE1BQVAsR0FBZ0JtRCxnQkFBT0MsTUFBdkI7QUFDQXpDLElBQUFBLE1BQU0sQ0FBQ3RGLE1BQVAsR0FBZ0IsRUFBaEI7QUFDQSxRQUFJcUYsS0FBSyxHQUFHLElBQVo7QUFFQSxVQUFNLEtBQUsyQywwQkFBTCxFQUFOOztBQUNBLFFBQUk7QUFFQSxXQUFLLElBQUkxSCxLQUFULElBQWtCLEtBQUs0RCxPQUF2QixFQUFnQztBQUM1QixjQUFNK0QsV0FBVyxHQUFHLE1BQU0sS0FBS0MsU0FBTCxDQUFlNUgsS0FBZixDQUExQjtBQUNBZ0YsUUFBQUEsTUFBTSxDQUFDdEYsTUFBUCxDQUFjVyxJQUFkLENBQW1Cc0gsV0FBbkI7QUFDSDtBQUNKLEtBTkQsQ0FPQSxPQUFPbEQsQ0FBUCxFQUFVO0FBQ05NLE1BQUFBLEtBQUssR0FBR04sQ0FBUjtBQUNIOztBQUNETyxJQUFBQSxNQUFNLENBQUM2QyxPQUFQLEdBQWlCNUcsY0FBT3NHLFlBQVAsRUFBakI7QUFDQXZDLElBQUFBLE1BQU0sQ0FBQzhDLFFBQVAsR0FBa0I5QyxNQUFNLENBQUM2QyxPQUFQLEdBQWlCN0MsTUFBTSxDQUFDc0MsU0FBMUM7QUFFQSxVQUFNUyxlQUFlLEdBQUcvQyxNQUFNLENBQUN0RixNQUFQLENBQWNzSSxJQUFkLENBQW1CQyxlQUFlLElBQUk7QUFDMUQsVUFBSUEsZUFBZSxJQUFJckksS0FBSyxDQUFDQyxPQUFOLENBQWNvSSxlQUFkLENBQW5CLElBQXFEQSxlQUFlLENBQUNuSSxNQUFoQixHQUF5QixDQUFsRixFQUFxRjtBQUNqRixlQUFPbUksZUFBZSxDQUFDRCxJQUFoQixDQUFxQkUsQ0FBQyxJQUFJQSxDQUFDLENBQUM3RCxNQUFGLEtBQWFtRCxnQkFBT1csTUFBOUMsQ0FBUDtBQUNIO0FBQ0osS0FKdUIsQ0FBeEI7QUFNQW5ELElBQUFBLE1BQU0sQ0FBQ1gsTUFBUCxHQUFnQjBELGVBQWUsR0FBR1AsZ0JBQU9XLE1BQVYsR0FBbUJYLGdCQUFPQyxNQUF6RDtBQUNBekMsSUFBQUEsTUFBTSxDQUFDb0QsV0FBUCxHQUFxQixFQUFFLEdBQUcsS0FBSzFFO0FBQVYsS0FBckI7QUFFQXNCLElBQUFBLE1BQU0sQ0FBQ3FELFlBQVAsR0FBc0IsRUFBRSxHQUFHLEtBQUt2RyxLQUFWO0FBQWlCLFNBQUcsS0FBS0M7QUFBekIsS0FBdEI7QUFDQWlELElBQUFBLE1BQU0sQ0FBQ2pFLE9BQVAsR0FBaUIsRUFBRSxHQUFHLEtBQUtrQjtBQUFWLEtBQWpCOztBQUdBLFFBQUk4QyxLQUFKLEVBQVc7QUFDUEMsTUFBQUEsTUFBTSxDQUFDRSxPQUFQLEdBQWlCb0QsZ0JBQVlDLG1CQUFaLENBQWdDeEQsS0FBaEMsQ0FBakI7QUFDQUMsTUFBQUEsTUFBTSxDQUFDWCxNQUFQLEdBQWdCbUQsZ0JBQU9XLE1BQXZCO0FBQ0g7O0FBQ0QsVUFBTSxLQUFLSyx5QkFBTCxDQUErQnhELE1BQS9CLENBQU47QUFDQSxXQUFPQSxNQUFQO0FBQ0g7O0FBRWMsUUFBVDRDLFNBQVMsQ0FBQzVILEtBQUQsRUFBUTtBQUNuQixRQUFJLENBQUNBLEtBQUwsRUFBWTtBQUNSakIsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLGlDQUFWO0FBQ0g7O0FBRUQsUUFBSSxDQUFDL0UsS0FBSyxDQUFDOEcsSUFBUCxJQUFlLENBQUM5RyxLQUFLLENBQUN5SSxJQUExQixFQUFnQztBQUM1QixhQUFPLEVBQVA7QUFDSDs7QUFFRCxRQUFJLENBQUN6SSxLQUFLLENBQUMwSSxjQUFYLEVBQTJCO0FBQ3ZCMUksTUFBQUEsS0FBSyxDQUFDMEksY0FBTixHQUF1QixDQUF2QjtBQUNIOztBQUNELFFBQUlDLDJCQUEyQixHQUFHLEtBQWxDOztBQUNBLFFBQUkzSSxLQUFLLENBQUMwSSxjQUFOLEdBQXVCLENBQTNCLEVBQThCO0FBQzFCQyxNQUFBQSwyQkFBMkIsR0FBRyxJQUE5QjtBQUNIOztBQUVELFVBQU1DLGNBQWMsR0FBRyxLQUFLM0csUUFBTCxDQUFjNEcsYUFBZCxJQUErQixLQUF0RDtBQUNBLFVBQU1DLFNBQVMsR0FBRyxLQUFLN0csUUFBTCxDQUFjOEcsVUFBZCxJQUE0QjlKLFVBQTlDO0FBQ0EsVUFBTStKLFVBQVUsR0FBRyxLQUFLL0csUUFBTCxDQUFjK0csVUFBakM7QUFFQSxVQUFNZixlQUFlLEdBQUcsRUFBeEI7O0FBQ0EsU0FBSyxJQUFJZ0IsY0FBYyxHQUFDLENBQXhCLEVBQTJCQSxjQUFjLElBQUlqSixLQUFLLENBQUMwSSxjQUFuRCxFQUFtRU8sY0FBYyxFQUFqRixFQUFxRjtBQUNqRixVQUFJTiwyQkFBSixFQUFpQztBQUM3QixjQUFNLEtBQUt6RixTQUFMLENBQWVnRyxnQkFBZixDQUFnQyxLQUFLbEksR0FBckMsRUFBMENpSSxjQUExQyxFQUEwRCxPQUExRCxDQUFOO0FBQ0g7O0FBQ0QsWUFBTXRCLFdBQVcsR0FBRyxJQUFJd0Isb0JBQUosRUFBcEI7QUFDQWxCLE1BQUFBLGVBQWUsQ0FBQzVILElBQWhCLENBQXFCc0gsV0FBckI7QUFDQUEsTUFBQUEsV0FBVyxDQUFDeUIsRUFBWixHQUFpQixLQUFLN0cscUJBQUwsR0FBNkJyRCxFQUFFLEVBQWhEO0FBQ0F5SSxNQUFBQSxXQUFXLENBQUNiLElBQVosR0FBbUI5RyxLQUFLLENBQUM4RyxJQUFOLElBQWM3RixjQUFPb0kscUJBQVAsQ0FBNkJySixLQUFLLENBQUN5SSxJQUFuQyxDQUFqQztBQUNBZCxNQUFBQSxXQUFXLENBQUNMLFNBQVosR0FBd0JyRyxjQUFPc0csWUFBUCxFQUF4QjtBQUNBSSxNQUFBQSxXQUFXLENBQUMyQixZQUFaLEdBQTJCTCxjQUEzQjtBQUNBdEIsTUFBQUEsV0FBVyxDQUFDdEQsTUFBWixHQUFxQm1ELGdCQUFPQyxNQUE1QjtBQUNBLFlBQU0sS0FBSzhCLDJCQUFMLENBQWlDdkosS0FBakMsQ0FBTjtBQUNBLFlBQU0sS0FBS2tELFNBQUwsQ0FBZXNHLFlBQWYsQ0FBNEIsS0FBS3hJLEdBQWpDLEVBQXNDMkcsV0FBVyxDQUFDeUIsRUFBbEQsRUFBc0R6QixXQUF0RCxDQUFOOztBQUNBLFdBQUssSUFBSXpILElBQVQsSUFBaUJGLEtBQUssQ0FBQ0MsS0FBdkIsRUFBOEI7QUFFMUIsWUFBSSxDQUFDQyxJQUFJLENBQUN1SSxJQUFWLEVBQWdCO0FBQ1o7QUFDSDs7QUFDRCxZQUFJLENBQUN2SSxJQUFJLENBQUM0RyxJQUFWLEVBQWdCO0FBQ1o1RyxVQUFBQSxJQUFJLENBQUM0RyxJQUFMLEdBQVk3RixjQUFPb0kscUJBQVAsQ0FBNkJuSixJQUFJLENBQUN1SSxJQUFsQyxDQUFaO0FBQ0g7O0FBQ0QsWUFBSSxDQUFDdkksSUFBSSxDQUFDd0ksY0FBVixFQUEwQjtBQUN0QnhJLFVBQUFBLElBQUksQ0FBQ3dJLGNBQUwsR0FBc0IsQ0FBdEI7QUFDSDs7QUFDRCxhQUFLLElBQUllLGFBQWEsR0FBQyxDQUF2QixFQUEwQkEsYUFBYSxJQUFJdkosSUFBSSxDQUFDd0ksY0FBaEQsRUFBZ0VlLGFBQWEsRUFBN0UsRUFBaUY7QUFFN0UsY0FBSUMsMEJBQTBCLEdBQUcsS0FBakM7O0FBQ0EsY0FBSXhKLElBQUksSUFBSUEsSUFBSSxDQUFDd0ksY0FBYixJQUErQnhJLElBQUksQ0FBQ3dJLGNBQUwsR0FBc0IsQ0FBekQsRUFBNEQ7QUFDeERnQixZQUFBQSwwQkFBMEIsR0FBRyxJQUE3QjtBQUNIOztBQUNELGNBQUlBLDBCQUFKLEVBQWdDO0FBQzVCLGtCQUFNLEtBQUt4RyxTQUFMLENBQWVnRyxnQkFBZixDQUFnQyxLQUFLbEksR0FBckMsRUFBMEN5SSxhQUExQyxFQUF5RCxNQUF6RCxDQUFOO0FBQ0g7O0FBRUQsZ0JBQU1FLFlBQVksR0FBRyxLQUFLdEgsb0JBQUwsR0FBNEJuRCxFQUFFLEVBQW5EO0FBRUEsZ0JBQU0sS0FBS2dFLFNBQUwsQ0FBZTBHLFdBQWYsQ0FBMkIsS0FBSzVJLEdBQWhDLEVBQXFDMkcsV0FBVyxDQUFDeUIsRUFBakQsRUFBK0VPLFlBQS9FLEVBQWtJekosSUFBbEksQ0FBTjtBQUVBLGNBQUkySixVQUFKOztBQUVBLGVBQUssSUFBSWQsVUFBVSxHQUFHLENBQXRCLEVBQXlCQSxVQUFVLEdBQUdELFNBQXRDLEVBQWlEQyxVQUFVLEVBQTNELEVBQStEO0FBQzNEYyxZQUFBQSxVQUFVLEdBQUcsTUFBTSxLQUFLQyxRQUFMLENBQWM5SixLQUFkLEVBQXFCRSxJQUFyQixFQUEyQitJLGNBQTNCLEVBQTJDUSxhQUEzQyxFQUEwRFYsVUFBMUQsQ0FBbkI7O0FBQ0EsZ0JBQUksQ0FBQyxDQUFDYyxVQUFELElBQWVBLFVBQVUsQ0FBQ3hGLE1BQVgsS0FBc0JtRCxnQkFBT1csTUFBN0MsS0FBd0QsQ0FBQ1MsY0FBN0QsRUFBNkU7QUFDekU7QUFDSCxhQUZELE1BR0ssSUFBSWlCLFVBQVUsSUFBSUEsVUFBVSxDQUFDeEYsTUFBWCxLQUFzQm1ELGdCQUFPVyxNQUEvQyxFQUF1RDtBQUN4RDtBQUNIOztBQUNELGdCQUFJYSxVQUFVLElBQUlELFVBQVUsR0FBR0QsU0FBUyxHQUFHLENBQTNDLEVBQThDO0FBQzFDLG9CQUFNN0gsY0FBTzhJLEtBQVAsQ0FBYWYsVUFBYixDQUFOO0FBQ0g7QUFDSjs7QUFDRGEsVUFBQUEsVUFBVSxDQUFDVCxFQUFYLEdBQWdCTyxZQUFoQjtBQUVBLGdCQUFNLEtBQUt6RyxTQUFMLENBQWU4RyxTQUFmLENBQXlCLEtBQUtoSixHQUE5QixFQUFtQzJHLFdBQVcsQ0FBQ3lCLEVBQS9DLEVBQTZFTyxZQUE3RSxFQUFtSEUsVUFBbkgsQ0FBTjs7QUFDQSxjQUFJSCwwQkFBSixFQUFnQztBQUM1QixrQkFBTSxLQUFLeEcsU0FBTCxDQUFlK0csY0FBZixDQUE4QixLQUFLakosR0FBbkMsRUFBd0M2SSxVQUF4QyxFQUFvRCxNQUFwRCxDQUFOO0FBQ0g7O0FBRURsQyxVQUFBQSxXQUFXLENBQUMxSCxLQUFaLENBQWtCSSxJQUFsQixDQUF1QndKLFVBQXZCOztBQUdBLGNBQUlBLFVBQVUsQ0FBQ3hGLE1BQVgsS0FBc0JtRCxnQkFBT1csTUFBakMsRUFBeUM7QUFDckNSLFlBQUFBLFdBQVcsQ0FBQ3RELE1BQVosR0FBcUJtRCxnQkFBT1csTUFBNUI7QUFDSCxXQUZELE1BR0ssSUFBSTBCLFVBQVUsQ0FBQ3hGLE1BQVgsS0FBc0JtRCxnQkFBTzBDLE9BQWpDLEVBQTBDO0FBQzNDdkMsWUFBQUEsV0FBVyxDQUFDdEQsTUFBWixHQUFxQm1ELGdCQUFPMEMsT0FBNUI7QUFDSDtBQUNKO0FBQ0o7O0FBQ0R2QyxNQUFBQSxXQUFXLENBQUNFLE9BQVosR0FBc0I1RyxjQUFPc0csWUFBUCxFQUF0QjtBQUNBSSxNQUFBQSxXQUFXLENBQUNHLFFBQVosR0FBdUJILFdBQVcsQ0FBQ0UsT0FBWixHQUFzQkYsV0FBVyxDQUFDTCxTQUF6RDs7QUFFQSxVQUFJcUIsMkJBQUosRUFBaUM7QUFDN0IsY0FBTSxLQUFLekYsU0FBTCxDQUFlK0csY0FBZixDQUE4QixLQUFLakosR0FBbkMsRUFBd0MyRyxXQUF4QyxFQUFxRCxPQUFyRCxDQUFOO0FBQ0g7O0FBRUQsWUFBTSxLQUFLd0MsMEJBQUwsQ0FBZ0NuSyxLQUFoQyxFQUF1QzJILFdBQXZDLENBQU47QUFDQSxZQUFNLEtBQUt6RSxTQUFMLENBQWVrSCxVQUFmLENBQTBCLEtBQUtwSixHQUEvQixFQUFvQzJHLFdBQVcsQ0FBQ3lCLEVBQWhELEVBQW9EekIsV0FBcEQsQ0FBTjtBQUNIOztBQUNELFdBQU9NLGVBQVA7QUFDSDs7QUFFYSxRQUFSNkIsUUFBUSxDQUFDOUosS0FBRCxFQUFRRSxJQUFSLEVBQWMrSSxjQUFkLEVBQThCUSxhQUE5QixFQUE2Q1YsVUFBVSxHQUFHLENBQTFELEVBQTZEO0FBQ3ZFLFVBQU1zQixNQUFNLEdBQUcsRUFBZjtBQUNBLFVBQU1DLEtBQUssR0FBR3ZCLFVBQVUsR0FBRyxDQUEzQjs7QUFHQSxRQUFJL0ksS0FBSyxDQUFDdUssWUFBVixFQUF3QjtBQUNwQixVQUFJRCxLQUFKLEVBQVc7QUFDUHRLLFFBQUFBLEtBQUssQ0FBQ3VLLFlBQU4sQ0FBbUJDLFFBQW5CO0FBQ0g7O0FBQ0RDLHNCQUFFQyxNQUFGLENBQVNMLE1BQVQsRUFBaUJySyxLQUFLLENBQUN1SyxZQUFOLENBQW1CSSxTQUFuQixFQUFqQjtBQUNIOztBQUVELFFBQUl6SyxJQUFJLENBQUNxSyxZQUFULEVBQXVCO0FBQ25CLFVBQUlELEtBQUosRUFBVztBQUNQcEssUUFBQUEsSUFBSSxDQUFDcUssWUFBTCxDQUFrQkMsUUFBbEI7QUFDSDs7QUFDREMsc0JBQUVDLE1BQUYsQ0FBU0wsTUFBVCxFQUFpQm5LLElBQUksQ0FBQ3FLLFlBQUwsQ0FBa0JJLFNBQWxCLEVBQWpCO0FBQ0g7O0FBR0QsUUFBSSxLQUFLcEosVUFBTCxJQUFtQixLQUFLRCxPQUF4QixJQUFtQyxLQUFLQSxPQUFMLENBQWFnRSxRQUFoRCxJQUE0RHBGLElBQUksQ0FBQ0MsV0FBckUsRUFBa0Y7QUFDOUUsV0FBSyxJQUFJeUssQ0FBQyxHQUFDLENBQVgsRUFBY0EsQ0FBQyxHQUFFMUssSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxNQUFsQyxFQUEwQzhLLENBQUMsRUFBM0MsRUFBK0M7QUFFM0MsWUFBSWxLLElBQUksR0FBR1IsSUFBSSxDQUFDQyxXQUFMLENBQWlCeUssQ0FBakIsRUFBb0JsSyxJQUEvQjtBQUNBLFlBQUlELElBQUksR0FBR1AsSUFBSSxDQUFDQyxXQUFMLENBQWlCeUssQ0FBakIsRUFBb0JuSyxJQUEvQjtBQUVBLGNBQU0sS0FBS2EsT0FBTCxDQUFhZ0UsUUFBYixDQUFzQmMsYUFBdEIsQ0FBb0MzRixJQUFwQyxFQUEwQ0MsSUFBMUMsQ0FBTjtBQUNIO0FBQ0o7O0FBQ0QsVUFBTSxLQUFLbUssMEJBQUwsQ0FBZ0MzSyxJQUFoQyxDQUFOO0FBQ0EsVUFBTTJKLFVBQVUsR0FBRyxJQUFJaUIsbUJBQUosRUFBbkI7QUFDQWpCLElBQUFBLFVBQVUsQ0FBQy9DLElBQVgsR0FBa0I1RyxJQUFJLENBQUM0RyxJQUF2QjtBQUNBK0MsSUFBQUEsVUFBVSxDQUFDa0IsUUFBWCxHQUFzQjdLLElBQUksQ0FBQ3VJLElBQTNCO0FBQ0FvQixJQUFBQSxVQUFVLENBQUNQLFlBQVgsR0FBMEJHLGFBQTFCO0FBQ0FJLElBQUFBLFVBQVUsQ0FBQ2QsVUFBWCxHQUF3QkEsVUFBeEI7O0FBR0EsUUFBSTtBQUNBLGFBQU8sQ0FBRSxLQUFLekgsT0FBUCxJQUFtQixLQUFLNkMsa0JBQUwsRUFBMUI7O0FBQ0EsVUFBSSxDQUFDLEtBQUs3QyxPQUFWLEVBQW1CO0FBQ2Y7QUFDSDtBQUNKLEtBTEQsQ0FLRSxPQUFPbUQsQ0FBUCxFQUFVO0FBQ1IxRixNQUFBQSxHQUFHLENBQUNnRyxLQUFKLENBQVUsdUNBQVYsRUFBbUROLENBQW5EO0FBQ0FvRixNQUFBQSxVQUFVLENBQUN2QyxTQUFYLEdBQXVCdUMsVUFBVSxDQUFDaEMsT0FBWCxHQUFxQjVHLGNBQU9zRyxZQUFQLEVBQTVDO0FBQ0FzQyxNQUFBQSxVQUFVLENBQUMvQixRQUFYLEdBQXNCLENBQXRCO0FBQ0ErQixNQUFBQSxVQUFVLENBQUMzRSxPQUFYLEdBQXFCb0QsZ0JBQVlDLG1CQUFaLENBQWdDOUQsQ0FBaEMsQ0FBckI7QUFDQW9GLE1BQUFBLFVBQVUsQ0FBQ3hGLE1BQVgsR0FBb0JtRCxnQkFBT1csTUFBM0I7O0FBRUEsVUFBSW5JLEtBQUssQ0FBQ3VLLFlBQVYsRUFBd0I7QUFDcEJ2SyxRQUFBQSxLQUFLLENBQUN1SyxZQUFOLENBQW1CUyxRQUFuQjtBQUNIOztBQUVELFVBQUk5SyxJQUFJLENBQUNxSyxZQUFULEVBQXVCO0FBQ25CckssUUFBQUEsSUFBSSxDQUFDcUssWUFBTCxDQUFrQlMsUUFBbEI7QUFDSDs7QUFFRCxhQUFPbkIsVUFBUDtBQUNIOztBQUVELFVBQU0sS0FBS29CLG9CQUFMLEVBQU47O0FBRUEsUUFBSTtBQUNBcEIsTUFBQUEsVUFBVSxDQUFDdkMsU0FBWCxHQUF1QnJHLGNBQU9zRyxZQUFQLEVBQXZCO0FBQ0EsWUFBTTtBQUFFMkQsUUFBQUEsV0FBRjtBQUFlQyxRQUFBQSxPQUFmO0FBQXdCQyxRQUFBQSxVQUF4QjtBQUFvQ3JHLFFBQUFBO0FBQXBDLFVBQThDLE1BQU0sS0FBS3NHLFdBQUwsQ0FBaUJyTCxLQUFqQixFQUF3QkUsSUFBeEIsRUFBOEIrSSxjQUE5QixFQUE4Q1EsYUFBOUMsRUFBNkRZLE1BQTdELENBQTFEOztBQUNBLFdBQUtpQixtQkFBTCxDQUF5QjtBQUFFSixRQUFBQSxXQUFGO0FBQWVDLFFBQUFBLE9BQWY7QUFBd0JwRyxRQUFBQSxLQUF4QjtBQUErQnFHLFFBQUFBO0FBQS9CLE9BQXpCOztBQUNBdkIsTUFBQUEsVUFBVSxDQUFDaEMsT0FBWCxHQUFxQjVHLGNBQU9zRyxZQUFQLEVBQXJCO0FBQ0FzQyxNQUFBQSxVQUFVLENBQUMvQixRQUFYLEdBQXNCK0IsVUFBVSxDQUFDaEMsT0FBWCxHQUFxQmdDLFVBQVUsQ0FBQ3ZDLFNBQXREO0FBQ0F1QyxNQUFBQSxVQUFVLENBQUNzQixPQUFYLEdBQXFCQSxPQUFyQjtBQUNBdEIsTUFBQUEsVUFBVSxDQUFDMEIsS0FBWCxHQUFtQkwsV0FBVyxJQUFJQSxXQUFXLENBQUNLLEtBQTNCLEdBQW1DTCxXQUFXLENBQUNLLEtBQS9DLEdBQXVELEVBQTFFO0FBQ0ExQixNQUFBQSxVQUFVLENBQUMyQixJQUFYLEdBQWtCTixXQUFXLElBQUlBLFdBQVcsQ0FBQ00sSUFBM0IsR0FBa0NOLFdBQVcsQ0FBQ00sSUFBOUMsR0FBcUQsRUFBdkU7QUFDQTNCLE1BQUFBLFVBQVUsQ0FBQzRCLEdBQVgsR0FBaUJQLFdBQVcsSUFBSUEsV0FBVyxDQUFDTyxHQUEzQixHQUFpQ1AsV0FBVyxDQUFDTyxHQUE3QyxHQUFtRCxJQUFwRTtBQUNBNUIsTUFBQUEsVUFBVSxDQUFDbEcsY0FBWCxHQUE0QnVILFdBQVcsSUFBSUEsV0FBVyxDQUFDUSxVQUEzQixHQUF3Q1IsV0FBVyxDQUFDUSxVQUFwRCxHQUFpRSxJQUE3RjtBQUNBN0IsTUFBQUEsVUFBVSxDQUFDOEIsV0FBWCxHQUF5QlQsV0FBVyxJQUFJQSxXQUFXLENBQUNTLFdBQTNCLEdBQXlDVCxXQUFXLENBQUNTLFdBQXJELEdBQW1FLElBQTVGOztBQUdBLFVBQUlDLFdBQVcsR0FBR25CLGdCQUFFb0IsSUFBRixDQUFPaEMsVUFBVSxDQUFDMEIsS0FBbEIsRUFBeUI7QUFBQ2xILFFBQUFBLE1BQU0sRUFBRW1ELGdCQUFPVztBQUFoQixPQUF6QixDQUFsQjs7QUFFQSxVQUFJMkQsWUFBWSxHQUFHckIsZ0JBQUVvQixJQUFGLENBQU9oQyxVQUFVLENBQUMwQixLQUFsQixFQUF5QjtBQUFDbEgsUUFBQUEsTUFBTSxFQUFFbUQsZ0JBQU8wQztBQUFoQixPQUF6QixDQUFuQjs7QUFDQUwsTUFBQUEsVUFBVSxDQUFDeEYsTUFBWCxHQUFvQm9HLGdCQUFFc0IsT0FBRixDQUFVSCxXQUFWLEtBQTBCLENBQUM3RyxLQUEzQixHQUFtQ3lDLGdCQUFPQyxNQUExQyxHQUFtREQsZ0JBQU9XLE1BQTlFOztBQUNBLFVBQUlwRCxLQUFKLEVBQVc7QUFDUDhFLFFBQUFBLFVBQVUsQ0FBQzNFLE9BQVgsR0FBcUJILEtBQXJCO0FBQ0E4RSxRQUFBQSxVQUFVLENBQUN4RixNQUFYLEdBQW9CbUQsZ0JBQU9XLE1BQTNCO0FBQ0EwQixRQUFBQSxVQUFVLENBQUMwQixLQUFYLEdBQW1CdEssY0FBTytLLGlDQUFQLENBQXlDbkMsVUFBVSxDQUFDMEIsS0FBcEQsQ0FBbkI7QUFDSCxPQUpELE1BS0ssSUFBSSxDQUFDZCxnQkFBRXNCLE9BQUYsQ0FBVUQsWUFBVixDQUFMLEVBQThCO0FBQy9CakMsUUFBQUEsVUFBVSxDQUFDeEYsTUFBWCxHQUFvQm1ELGdCQUFPMEMsT0FBM0I7QUFDSDs7QUFDRCxZQUFNLEtBQUsrQix5QkFBTCxDQUErQi9MLElBQS9CLEVBQXFDMkosVUFBckMsQ0FBTjtBQUNILEtBM0JELENBMkJFLE9BQU9wRixDQUFQLEVBQVU7QUFDUjFGLE1BQUFBLEdBQUcsQ0FBQ2dHLEtBQUosQ0FBVSxnQ0FBVixFQUE0Q04sQ0FBNUM7QUFDQW9GLE1BQUFBLFVBQVUsQ0FBQzNFLE9BQVgsR0FBcUJvRCxnQkFBWUMsbUJBQVosQ0FBZ0M5RCxDQUFoQyxDQUFyQjtBQUNBb0YsTUFBQUEsVUFBVSxDQUFDeEYsTUFBWCxHQUFvQm1ELGdCQUFPVyxNQUEzQjtBQUVIOztBQUNELFVBQU0rRCxvQkFBb0IsR0FBRyxPQUFPLEtBQUtqSyxRQUFMLENBQWNrSyxXQUFyQixLQUFxQyxTQUFyQyxJQUFrRCxLQUFLbEssUUFBTCxDQUFja0ssV0FBZCxLQUE4QixJQUE3RztBQUVBLFVBQU0sS0FBS0Msa0JBQUwsQ0FBd0J2QyxVQUFVLENBQUN4RixNQUFuQyxFQUEyQzZILG9CQUEzQyxDQUFOOztBQUVBLFFBQUlsTSxLQUFLLENBQUN1SyxZQUFWLEVBQXdCO0FBQ3BCdkssTUFBQUEsS0FBSyxDQUFDdUssWUFBTixDQUFtQlMsUUFBbkI7QUFDSDs7QUFFRCxRQUFJOUssSUFBSSxDQUFDcUssWUFBVCxFQUF1QjtBQUNuQnJLLE1BQUFBLElBQUksQ0FBQ3FLLFlBQUwsQ0FBa0JTLFFBQWxCO0FBQ0g7O0FBRUQsV0FBT25CLFVBQVA7QUFDSDs7QUFFZ0IsUUFBWHdCLFdBQVcsQ0FBQ3JMLEtBQUQsRUFBUUUsSUFBUixFQUFjK0ksY0FBZCxFQUE4QlEsYUFBOUIsRUFBNkNZLE1BQTdDLEVBQXFEO0FBQ2xFLFFBQUksQ0FBQyxLQUFLL0ksT0FBVixFQUFtQjtBQUNmdkMsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLHFDQUFWOztBQUVBLFVBQUksS0FBS3NILHFCQUFULEVBQWdDO0FBQzVCLGFBQUtBLHFCQUFMLENBQTJCQyxNQUEzQixDQUFrQyxJQUFJeEosS0FBSixDQUFVLGlCQUFWLENBQWxDO0FBQ0g7O0FBQ0Q7QUFDSDs7QUFFRCxXQUFPLE1BQU0sS0FBS3hCLE9BQUwsQ0FBYXVELEdBQWIsQ0FBaUI7QUFDMUIwSCxNQUFBQSxVQUFVLEVBQUVyTSxJQUFJLENBQUM0RyxJQURTO0FBRTFCMEYsTUFBQUEsVUFBVSxFQUFFdE0sSUFBSSxDQUFDdUksSUFGUztBQUcxQjBDLE1BQUFBLE9BQU8sRUFBRTtBQUNMZCxRQUFBQSxNQUFNLEVBQUVBLE1BREg7QUFFTGhILFFBQUFBLEdBQUcsRUFBRSxLQUFLSyxJQUZMO0FBR0xkLFFBQUFBLElBQUksRUFBRSxLQUFLZCxLQUhOO0FBSUwySyxRQUFBQSxJQUFJLEVBQUUsS0FBSzVLLEtBSk47QUFLTDZKLFFBQUFBLFVBQVUsRUFBRSxLQUFLMUosV0FMWjtBQU1MMEssUUFBQUEsSUFBSSxFQUFFO0FBQ0ZDLFVBQUFBLElBQUksRUFBRTtBQUNGN0YsWUFBQUEsSUFBSSxFQUFFNUcsSUFBSSxDQUFDNEcsSUFEVDtBQUVGOEYsWUFBQUEsU0FBUyxFQUFFbkQ7QUFGVCxXQURKO0FBS0Z6SixVQUFBQSxLQUFLLEVBQUU7QUFDSDhHLFlBQUFBLElBQUksRUFBRTlHLEtBQUssQ0FBQzhHLElBRFQ7QUFFSDhGLFlBQUFBLFNBQVMsRUFBRTNEO0FBRlI7QUFMTDtBQU5ELE9BSGlCO0FBb0IxQjRELE1BQUFBLE1BQU0sRUFBRSxLQUFLNUssUUFBTCxDQUFjNkssRUFBZCxJQUFvQjtBQXBCRixLQUFqQixDQUFiO0FBc0JIOztBQUV1QixRQUFsQjNJLGtCQUFrQixHQUFHO0FBQ3ZCLFdBQU8sS0FBSzdDLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFheUwsVUFBYixDQUF3QixLQUFLL0wsR0FBN0IsRUFBa0MsS0FBS2lCLFFBQXZDLEVBQWlELEtBQUtILEtBQXRELENBQXZCO0FBQ0g7O0FBRXlCLFFBQXBCbUosb0JBQW9CLEdBQUc7QUFDekIsUUFBSSxLQUFLM0osT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWEwTCxZQUFqQyxFQUErQztBQUMzQyxZQUFNLEtBQUsxTCxPQUFMLENBQWEwTCxZQUFiLEVBQU47QUFDSDtBQUNKOztBQUV1QixRQUFsQlosa0JBQWtCLENBQUMvSCxNQUFNLEdBQUcsSUFBVixFQUFnQjRJLGNBQWMsR0FBRyxJQUFqQyxFQUF1QztBQUMzRCxRQUFJLEtBQUszTCxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYTRMLFVBQWpDLEVBQTZDO0FBQ3pDLFlBQU0sS0FBSzVMLE9BQUwsQ0FBYTRMLFVBQWIsQ0FBd0I3SSxNQUF4QixFQUFnQzRJLGNBQWhDLENBQU47QUFDSDtBQUNKOztBQUUrQixRQUExQnZGLDBCQUEwQixHQUFHO0FBQy9CLFFBQUk7QUFDQSxVQUFJLFFBQVEsS0FBS3BHLE9BQWIsSUFBd0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBekMsRUFBeUQ7QUFDckQsY0FBTSxLQUFLN0wsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixZQUE1QixFQUEwQyxDQUFDLEtBQUtuTSxHQUFOLEVBQVcsS0FBS2lCLFFBQWhCLEVBQTBCLEtBQUtILEtBQS9CLENBQTFDLENBQU47QUFDSDtBQUNKLEtBSkQsQ0FLQSxPQUFPMkMsQ0FBUCxFQUFVO0FBQ04xRixNQUFBQSxHQUFHLENBQUNnRyxLQUFKLENBQVUsMkJBQVYsRUFBdUNOLENBQXZDO0FBQ0EsV0FBS3ZCLFNBQUwsS0FBa0IsTUFBTSxLQUFLQSxTQUFMLENBQWVrSyxVQUFmLENBQTBCLElBQTFCLEVBQWdDLE1BQWhDLEVBQXdDLDhCQUE0QjNJLENBQXBFLEVBQXVFekYsY0FBdkUsQ0FBeEI7QUFDSDtBQUNKOztBQUVnQyxRQUEzQnVLLDJCQUEyQixDQUFDdkosS0FBRCxFQUFRO0FBQ3JDLFFBQUk7QUFDQSxVQUFJLFFBQVEsS0FBS3NCLE9BQWIsSUFBd0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBekMsRUFBeUQ7QUFDckQsY0FBTSxLQUFLN0wsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixhQUE1QixFQUEyQyxDQUFDbk4sS0FBRCxDQUEzQyxDQUFOO0FBQ0g7QUFDSixLQUpELENBS0EsT0FBT3lFLENBQVAsRUFBVTtBQUNOMUYsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLDRCQUFWLEVBQXdDTixDQUF4QztBQUNBLFdBQUt2QixTQUFMLEtBQWtCLE1BQU0sS0FBS0EsU0FBTCxDQUFla0ssVUFBZixDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3QywrQkFBNkIzSSxDQUFyRSxFQUF3RXpGLGNBQXhFLENBQXhCO0FBQ0g7QUFDSjs7QUFFK0IsUUFBMUI2TCwwQkFBMEIsQ0FBQzNLLElBQUQsRUFBTztBQUNuQyxRQUFJO0FBQ0EsYUFBTyxLQUFLb0IsT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWE2TCxjQUFiLENBQTRCLFlBQTVCLEVBQTBDLENBQUNqTixJQUFELENBQTFDLENBQXZCO0FBQ0gsS0FGRCxDQUdBLE9BQU91RSxDQUFQLEVBQVU7QUFDTjFGLE1BQUFBLEdBQUcsQ0FBQ2dHLEtBQUosQ0FBVSwyQkFBVixFQUF1Q04sQ0FBdkM7QUFDQSxXQUFLdkIsU0FBTCxLQUFrQixNQUFNLEtBQUtBLFNBQUwsQ0FBZWtLLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsOEJBQTRCM0ksQ0FBcEUsRUFBdUV6RixjQUF2RSxDQUF4QjtBQUNIO0FBQ0o7O0FBRThCLFFBQXpCd0oseUJBQXlCLENBQUN4RCxNQUFELEVBQVM7QUFDcEMsUUFBSTtBQUNBLGFBQU8sS0FBSzFELE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixXQUE1QixFQUF5QyxDQUFDLEtBQUtuTSxHQUFOLEVBQVdnRSxNQUFYLENBQXpDLENBQXZCO0FBQ0gsS0FGRCxDQUdBLE9BQU9QLENBQVAsRUFBVTtBQUNOMUYsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLDBCQUFWLEVBQXNDTixDQUF0QztBQUNBLFdBQUt2QixTQUFMLEtBQWtCLE1BQU0sS0FBS0EsU0FBTCxDQUFla0ssVUFBZixDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3Qyw2QkFBMkIzSSxDQUFuRSxFQUFzRXpGLGNBQXRFLENBQXhCO0FBQ0g7QUFDSjs7QUFFK0IsUUFBMUJtTCwwQkFBMEIsQ0FBQ25LLEtBQUQsRUFBUWdGLE1BQVIsRUFBZ0I7QUFDNUMsUUFBSTtBQUNBLGFBQU8sS0FBSzFELE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixZQUE1QixFQUEwQyxDQUFDbk4sS0FBRCxFQUFRZ0YsTUFBUixDQUExQyxDQUF2QjtBQUNILEtBRkQsQ0FHQSxPQUFPUCxDQUFQLEVBQVU7QUFDTjFGLE1BQUFBLEdBQUcsQ0FBQ2dHLEtBQUosQ0FBVSwyQkFBVixFQUF1Q04sQ0FBdkM7QUFDQSxXQUFLdkIsU0FBTCxLQUFrQixNQUFNLEtBQUtBLFNBQUwsQ0FBZWtLLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsOEJBQTRCM0ksQ0FBcEUsRUFBdUV6RixjQUF2RSxDQUF4QjtBQUNIO0FBQ0o7O0FBRThCLFFBQXpCaU4seUJBQXlCLENBQUMvTCxJQUFELEVBQU84RSxNQUFQLEVBQWU7QUFDMUMsUUFBSTtBQUNBLGFBQU8sS0FBSzFELE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixXQUE1QixFQUF5QyxDQUFDak4sSUFBRCxFQUFPOEUsTUFBUCxDQUF6QyxDQUF2QjtBQUNILEtBRkQsQ0FHQSxPQUFPUCxDQUFQLEVBQVU7QUFDTjFGLE1BQUFBLEdBQUcsQ0FBQ2dHLEtBQUosQ0FBVSwwQkFBVixFQUFzQ04sQ0FBdEM7QUFDQSxXQUFLdkIsU0FBTCxLQUFrQixNQUFNLEtBQUtBLFNBQUwsQ0FBZWtLLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsNkJBQTJCM0ksQ0FBbkUsRUFBc0V6RixjQUF0RSxDQUF4QjtBQUNIO0FBQ0o7O0FBRXdCLFFBQW5Ca0YsbUJBQW1CLEdBQUc7QUFDeEIsVUFBTW1KLFVBQVUsR0FBRzVFLGNBQUs2RSxJQUFMLENBQVVDLFNBQVYsRUFBcUIsV0FBckIsQ0FBbkI7O0FBQ0EsU0FBS2pNLE9BQUwsR0FBZSxJQUFJa00sc0JBQUosQ0FBa0IsS0FBS3hNLEdBQXZCLEVBQTRCcU0sVUFBNUIsRUFBd0MsS0FBSzlMLFVBQTdDLEVBQXlELEtBQUt3QyxVQUE5RCxFQUEwRSxRQUExRSxFQUFvRixLQUFLdEMsa0JBQXpGLENBQWY7QUFDQSxVQUFNLEtBQUtILE9BQUwsQ0FBYW1NLEtBQWIsRUFBTjs7QUFDQSxTQUFLQyxpQkFBTDs7QUFDQSxVQUFNLEtBQUtwTSxPQUFMLENBQWFxTSxhQUFiLEVBQU47O0FBQ0EsU0FBS0MseUJBQUw7QUFDSDs7QUFFREYsRUFBQUEsaUJBQWlCLEdBQUc7QUFFaEIsVUFBTUcsS0FBSyxHQUFHLElBQWQ7O0FBQ0EsU0FBS3ZNLE9BQUwsQ0FBYXdNLFNBQWIsQ0FBdUIsZ0JBQXZCLEVBQXlDLEtBQUtDLG9CQUFMLENBQTBCQyxJQUExQixDQUErQixJQUEvQixDQUF6Qzs7QUFDQSxTQUFLMU0sT0FBTCxDQUFhd00sU0FBYixDQUF1QixlQUF2QixFQUF3QyxLQUFLRyxtQkFBTCxDQUF5QkQsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBeEM7O0FBQ0EsU0FBSzFNLE9BQUwsQ0FBYTRNLEVBQWIsQ0FBZ0IsT0FBaEIsRUFBMEJDLE9BQUQsSUFBYTtBQUNsQyxZQUFNO0FBQUVwSixRQUFBQTtBQUFGLFVBQVlvSixPQUFsQjtBQUNBcFAsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLHdCQUFWLEVBQW9DQSxLQUFwQzs7QUFFQSxVQUFJLEtBQUtxSixRQUFULEVBQW1CO0FBQ2YsYUFBS0MsSUFBTCxDQUFVLFlBQVYsRUFBd0J0SixLQUF4QjtBQUNILE9BRkQsTUFFTztBQUNIOEksUUFBQUEsS0FBSyxDQUFDck0sb0JBQU4sR0FBNkJ1RCxLQUE3QjtBQUNIO0FBQ0osS0FURDs7QUFVQSxTQUFLekQsT0FBTCxDQUFhNE0sRUFBYixDQUFnQixNQUFoQixFQUF5QkMsT0FBRCxJQUFhO0FBQ2pDLFdBQUtDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxZQUFNO0FBQUVFLFFBQUFBO0FBQUYsVUFBZUgsT0FBckI7O0FBRUEsVUFBSUcsUUFBUSxJQUFJQSxRQUFRLEtBQUssQ0FBN0IsRUFBZ0M7QUFJNUIsWUFBSUMsT0FBTyxHQUFHLElBQWQ7O0FBQ0EsWUFBSVYsS0FBSyxDQUFDeE0sWUFBVixFQUF3QjtBQUNwQmtOLFVBQUFBLE9BQU8sR0FBR1YsS0FBSyxDQUFDcEwsYUFBaEI7QUFDSCxTQUZELE1BR0ssSUFBSW9MLEtBQUssQ0FBQzFNLFVBQVYsRUFBc0I7QUFDdkJvTixVQUFBQSxPQUFPLEdBQUdWLEtBQUssQ0FBQ3hCLHFCQUFoQjtBQUNIOztBQUNELFlBQUl0SCxLQUFLLEdBQUc4SSxLQUFLLENBQUNyTSxvQkFBTixJQUE4QixJQUExQzs7QUFDQSxZQUFJOE0sUUFBUSxJQUFJLEdBQWhCLEVBQXFCO0FBQ2pCdkosVUFBQUEsS0FBSyxHQUFHLElBQUl5SixvQkFBSixDQUFnQmxHLGdCQUFZbUcsU0FBWixDQUFzQkMsWUFBdEMsRUFBb0QsMEZBQXBELENBQVI7QUFDSCxTQUZELE1BR0ssSUFBSSxDQUFDM0osS0FBTCxFQUFZO0FBQ2JBLFVBQUFBLEtBQUssR0FBRyxJQUFJeUosb0JBQUosQ0FBaUIsb0NBQW1DRixRQUFTLEdBQTdELENBQVI7QUFDSDs7QUFFREMsUUFBQUEsT0FBTyxJQUFJQSxPQUFPLENBQUNqQyxNQUFSLENBQWV2SCxLQUFmLENBQVg7O0FBQ0E4SSxRQUFBQSxLQUFLLENBQUNqSixxQkFBTjtBQUNIO0FBQ0osS0ExQkQ7O0FBMkJBLFNBQUt0RCxPQUFMLENBQWE0TSxFQUFiLENBQWdCLFNBQWhCLEVBQTJCLE1BQU9TLEdBQVAsSUFBZTtBQUN0QyxVQUFJQSxHQUFHLENBQUM5SCxLQUFKLElBQWE4SCxHQUFHLENBQUM5SCxLQUFKLEtBQWMsS0FBL0IsRUFBc0M7QUFDbEMsWUFBSThILEdBQUcsQ0FBQ0MsS0FBSixLQUFjLE9BQWxCLEVBQTJCO0FBQ3ZCN1AsVUFBQUEsR0FBRyxDQUFDMEgsS0FBSixDQUFVa0ksR0FBRyxDQUFDQSxHQUFkO0FBQ0gsU0FGRCxNQUVPLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSixLQUFjLE1BQWxCLEVBQTBCO0FBQzdCN1AsVUFBQUEsR0FBRyxDQUFDOFAsSUFBSixDQUFTRixHQUFHLENBQUNBLEdBQWI7QUFDSCxTQUZNLE1BRUEsSUFBSUEsR0FBRyxDQUFDQyxLQUFKLEtBQWMsT0FBbEIsRUFBMkI7QUFDOUI3UCxVQUFBQSxHQUFHLENBQUNnRyxLQUFKLENBQVU0SixHQUFHLENBQUNBLEdBQWQsRUFBbUJBLEdBQUcsQ0FBQ0csR0FBdkI7QUFDSCxTQUZNLE1BRUEsSUFBSUgsR0FBRyxDQUFDQyxLQUFKLEtBQWMsTUFBbEIsRUFBMEI7QUFDN0I3UCxVQUFBQSxHQUFHLENBQUM0RixJQUFKLENBQVNnSyxHQUFHLENBQUNBLEdBQWI7QUFDSDs7QUFFRGQsUUFBQUEsS0FBSyxDQUFDUSxJQUFOLENBQVcsS0FBWCxFQUFrQk0sR0FBRyxDQUFDSSxJQUF0QixFQUE0QkosR0FBRyxDQUFDQyxLQUFoQyxFQUF1Q0QsR0FBRyxDQUFDQSxHQUEzQyxFQUFnREEsR0FBRyxDQUFDSyxHQUFKLElBQVdoUSxjQUEzRDs7QUFDQTZPLFFBQUFBLEtBQUssQ0FBQzNLLFNBQU4sS0FBbUIsTUFBTTJLLEtBQUssQ0FBQzNLLFNBQU4sQ0FBZ0JrSyxVQUFoQixDQUNyQnVCLEdBQUcsQ0FBQ0ksSUFEaUIsRUFDWEosR0FBRyxDQUFDQyxLQURPLEVBQ0FELEdBQUcsQ0FBQ0EsR0FESixFQUNTQSxHQUFHLENBQUNLLEdBQUosSUFBV2hRLGNBRHBCLEVBQ29DO0FBQ3JEaVEsVUFBQUEsT0FBTyxFQUFFLEtBQUsxTSxxQkFEdUM7QUFFckQyTSxVQUFBQSxNQUFNLEVBQUUsS0FBSzdNLG9CQUZ3QztBQUdyRDhNLFVBQUFBLE1BQU0sRUFBRSxLQUFLM007QUFId0MsU0FEcEMsQ0FBekI7QUFNSCxPQWxCRCxNQW1CSyxJQUFJbU0sR0FBRyxDQUFDOUgsS0FBSixJQUFhOEgsR0FBRyxDQUFDOUgsS0FBSixLQUFjLGFBQS9CLEVBQThDO0FBQy9DZ0gsUUFBQUEsS0FBSyxDQUFDUSxJQUFOLENBQVcsYUFBWCxFQUEwQk0sR0FBRyxDQUFDak8sSUFBOUIsRUFBb0NpTyxHQUFHLENBQUNTLEtBQXhDLEVBQStDVCxHQUFHLENBQUNJLElBQW5EO0FBQ0gsT0FGSSxNQUdBLElBQUlKLEdBQUcsQ0FBQzlILEtBQUosSUFBYThILEdBQUcsQ0FBQzlILEtBQUosS0FBYyxlQUEvQixFQUFnRDtBQUNqRCxZQUFJOEgsR0FBRyxDQUFDVSxNQUFKLEtBQWUsTUFBbkIsRUFBMkI7QUFDdkJ4QixVQUFBQSxLQUFLLENBQUNRLElBQU4sQ0FBVyxXQUFYLEVBQXdCTSxHQUF4QjtBQUNIO0FBQ0osT0FKSSxNQUtBLElBQUlBLEdBQUcsQ0FBQzlILEtBQUosSUFBYThILEdBQUcsQ0FBQzlILEtBQUosS0FBYyxhQUEvQixFQUE4QztBQUMvQ25DLFFBQUFBLE9BQU8sQ0FBQzNGLEdBQVIsQ0FBWSxjQUFaLEVBQTRCNFAsR0FBNUI7QUFDQSxjQUFNLEtBQUt2SyxPQUFMLENBQWEsUUFBYixDQUFOO0FBQ0EsY0FBTSxLQUFLZ0IsSUFBTCxDQUFVLFFBQVYsQ0FBTjtBQUNILE9BSkksTUFLQSxJQUFJdUosR0FBRyxDQUFDOUgsS0FBSixJQUFhOEgsR0FBRyxDQUFDOUgsS0FBSixLQUFjLE1BQS9CLEVBQXVDO0FBQ3hDZ0gsUUFBQUEsS0FBSyxDQUFDUSxJQUFOLENBQVcsTUFBWCxFQUFtQk0sR0FBbkI7QUFDSDtBQUNKLEtBcENEO0FBcUNIOztBQUVEZixFQUFBQSx5QkFBeUIsR0FBRztBQUN4QixRQUFJLENBQUMsS0FBS3RNLE9BQVYsRUFBbUI7QUFDZjtBQUNIOztBQUNELFNBQUtBLE9BQUwsQ0FBYWdFLFFBQWIsSUFBeUIsS0FBS2hFLE9BQUwsQ0FBYWdFLFFBQWIsQ0FBc0I0SSxFQUF0QixDQUF5QixnQkFBekIsRUFBNENvQixjQUFELElBQW9CO0FBQ3BGLFdBQUtqQixJQUFMLENBQVUsWUFBVixFQUF3QmlCLGNBQXhCO0FBQ0gsS0FGd0IsQ0FBekI7QUFJQSxTQUFLaE8sT0FBTCxDQUFhZ0UsUUFBYixJQUF5QixLQUFLaEUsT0FBTCxDQUFhZ0UsUUFBYixDQUFzQjRJLEVBQXRCLENBQXlCLHFCQUF6QixFQUFpRHFCLFVBQUQsSUFBZ0I7QUFDckYsV0FBS2xCLElBQUwsQ0FBVSxpQkFBVixFQUE2QmtCLFVBQTdCO0FBQ0gsS0FGd0IsQ0FBekI7QUFHSDs7QUFFeUIsUUFBcEJ4QixvQkFBb0IsQ0FBQ3RKLENBQUQsRUFBSTtBQUMxQixTQUFLakMsb0JBQUwsR0FBNEJpQyxDQUFDLENBQUMyRSxFQUE5QjtBQUNBLFNBQUtsRyxTQUFMLEtBQWtCLE1BQU0sS0FBS0EsU0FBTCxDQUFlc00sV0FBZixDQUEyQixLQUFLeE8sR0FBaEMsRUFBcUMsS0FBS3VCLHFCQUExQyxFQUFpRSxLQUFLRixvQkFBdEUsRUFBNEZvQyxDQUE1RixDQUF4Qjs7QUFFQSxRQUFJO0FBQ0EsVUFBSUEsQ0FBQyxJQUFJQSxDQUFDLENBQUNnTCxNQUFQLElBQWlCaEwsQ0FBQyxDQUFDZ0wsTUFBRixLQUFhLEtBQWxDLEVBQXlDLENBRXhDLENBRkQsTUFFTztBQUNILGVBQU8sS0FBS25PLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixlQUE1QixFQUE2QyxDQUFDMUksQ0FBRCxDQUE3QyxDQUF2QjtBQUNIO0FBQ0osS0FORCxDQU9BLE9BQU9BLENBQVAsRUFBVTtBQUNOMUYsTUFBQUEsR0FBRyxDQUFDZ0csS0FBSixDQUFVLDhCQUFWLEVBQTBDTixDQUExQztBQUNBLFdBQUt2QixTQUFMLEtBQWtCLE1BQU0sS0FBS0EsU0FBTCxDQUFla0ssVUFBZixDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3QyxpQ0FBK0IzSSxDQUF2RSxFQUEwRXpGLGNBQTFFLENBQXhCO0FBQ0g7QUFDSjs7QUFFd0IsUUFBbkJpUCxtQkFBbUIsQ0FBQ3hKLENBQUQsRUFBSTtBQUN6QixTQUFLdkIsU0FBTCxLQUFrQixNQUFNLEtBQUtBLFNBQUwsQ0FBZXdNLFNBQWYsQ0FBeUIsS0FBSzFPLEdBQTlCLEVBQW1DLEtBQUt1QixxQkFBeEMsRUFBK0QsS0FBS0Ysb0JBQXBFLEVBQTBGb0MsQ0FBQyxDQUFDTyxNQUE1RixDQUF4Qjs7QUFDQSxRQUFJO0FBQ0EsVUFBSVAsQ0FBQyxJQUFJQSxDQUFDLENBQUNnTCxNQUFQLElBQWlCaEwsQ0FBQyxDQUFDZ0wsTUFBRixLQUFhLEtBQWxDLEVBQXlDLENBRXhDLENBRkQsTUFFTztBQUNILGVBQU8sS0FBS25PLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNkwsY0FBYixDQUE0QixjQUE1QixFQUE0QyxDQUFDMUksQ0FBQyxDQUFDTyxNQUFILENBQTVDLENBQXZCO0FBQ0g7QUFDSixLQU5ELENBT0EsT0FBT1AsQ0FBUCxFQUFVO0FBQ04xRixNQUFBQSxHQUFHLENBQUNnRyxLQUFKLENBQVUsNkJBQVYsRUFBeUNOLENBQXpDO0FBQ0EsV0FBS3ZCLFNBQUwsS0FBa0IsTUFBTSxLQUFLQSxTQUFMLENBQWVrSyxVQUFmLENBQTBCLElBQTFCLEVBQWdDLE1BQWhDLEVBQXdDLGdDQUE4QjNJLENBQXRFLEVBQXlFekYsY0FBekUsQ0FBeEI7QUFDSDs7QUFDRCxTQUFLd0Qsb0JBQUwsR0FBNEJGLFNBQTVCO0FBQ0g7O0FBRURzQyxFQUFBQSxxQkFBcUIsR0FBRztBQUNwQixTQUFLN0MsUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtULE9BQUwsR0FBZSxJQUFmO0FBQ0EsU0FBS0gsVUFBTCxHQUFrQixLQUFsQjtBQUNBLFNBQUtFLFlBQUwsR0FBb0IsS0FBcEI7QUFDQSxTQUFLRCxlQUFMLEdBQXVCLEtBQXZCO0FBQ0EsU0FBS2UsV0FBTCxHQUFtQixLQUFuQjtBQUNBLFNBQUtNLGFBQUwsR0FBcUIsa0JBQXJCO0FBQ0g7O0FBRUQ2SSxFQUFBQSxtQkFBbUIsQ0FBQztBQUFFSixJQUFBQSxXQUFGO0FBQWVFLElBQUFBLFVBQWY7QUFBMkJELElBQUFBLE9BQU8sR0FBRyxFQUFyQztBQUF5Q3BHLElBQUFBLEtBQUssR0FBRztBQUFqRCxHQUFELEVBQTBEO0FBRXpFLFFBQUksS0FBSzVDLFdBQVQsRUFBc0I7QUFDbEIsYUFBTyxJQUFQO0FBQ0g7O0FBQ0QsUUFBSTRDLEtBQUosRUFBVztBQUNQLFdBQUtzSixJQUFMLENBQVUsWUFBVixFQUF3QnRKLEtBQXhCO0FBQ0g7O0FBRUQsU0FBS2xELEtBQUwsR0FBYXNKLE9BQU8sQ0FBQ3NCLElBQVIsSUFBZ0IsS0FBSzVLLEtBQWxDO0FBRUEsU0FBS0UsUUFBTCxHQUFnQixFQUFFLEdBQUcsS0FBS0EsUUFBVjtBQUFvQixVQUFHcUosVUFBVSxJQUFJLEVBQWpCO0FBQXBCLEtBQWhCO0FBR0EsUUFBSUQsT0FBTyxDQUFDdkksSUFBWixFQUNJLE9BQU91SSxPQUFPLENBQUN2SSxJQUFmO0FBRUosUUFBSXVJLE9BQU8sQ0FBQzlILEdBQVosRUFDSSxPQUFPOEgsT0FBTyxDQUFDOUgsR0FBZjtBQUVKLFFBQUk4SCxPQUFPLENBQUN1QixJQUFaLEVBQ0ksT0FBT3ZCLE9BQU8sQ0FBQ3VCLElBQWY7QUFDUDs7QUFFRGlELEVBQUFBLGlCQUFpQixDQUFDQyxFQUFELEVBQUtDLEVBQUwsRUFBU0MsaUJBQVQsRUFBNEJDLGdCQUE1QixFQUE4Q0MsbUJBQTlDLEVBQW1FO0FBQ2hGLFNBQUszQixJQUFMLENBQVUsZUFBVixFQUEyQjtBQUN2QmhLLE1BQUFBLE1BQU0sRUFBRTJMLG1CQUFtQixDQUFDQyxPQURMO0FBRXZCL0ssTUFBQUEsT0FBTyxFQUFFOEssbUJBQW1CLENBQUM5SyxPQUFwQixJQUErQixJQUZqQjtBQUd2QnlILE1BQUFBLElBQUksRUFBRTtBQUNGdkQsUUFBQUEsRUFBRSxFQUFFeUcsRUFBRSxDQUFDekcsRUFBSCxJQUFTLElBRFg7QUFFRnRDLFFBQUFBLElBQUksRUFBRStJLEVBQUUsQ0FBQy9JLElBRlA7QUFHRjhGLFFBQUFBLFNBQVMsRUFBRW1ELGdCQUhUO0FBSUZySCxRQUFBQSxjQUFjLEVBQUVtSCxFQUFFLENBQUNuSDtBQUpqQixPQUhpQjtBQVN2QjFJLE1BQUFBLEtBQUssRUFBRTtBQUNIb0osUUFBQUEsRUFBRSxFQUFFd0csRUFBRSxDQUFDeEcsRUFBSCxJQUFTLElBRFY7QUFFSHRDLFFBQUFBLElBQUksRUFBRThJLEVBQUUsQ0FBQzlJLElBRk47QUFHSDhGLFFBQUFBLFNBQVMsRUFBRWtELGlCQUhSO0FBSUhwSCxRQUFBQSxjQUFjLEVBQUVrSCxFQUFFLENBQUNsSDtBQUpoQjtBQVRnQixLQUEzQjtBQWdCSDs7QUFFRHdILEVBQUFBLFlBQVksQ0FBQ2xMLE1BQUQsRUFBUztBQUNqQixTQUFLcUosSUFBTCxDQUFVLFVBQVYsRUFBc0JySixNQUF0QjtBQUNIOztBQWp6QmtEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvciAqL1xuLypcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqL1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9sb2dnZXInO1xuY29uc3QgbG9nID0gbG9nZ2VyKCdPeHlnZW5SdW5uZXInKTtcbmNvbnN0IERFRkFVTFRfSVNTVUVSID0gJ3VzZXInO1xuY29uc3QgTUFYX1JFUlVOUyA9IDI7XG5cbmNvbnN0IHsgdjEgfSA9IHJlcXVpcmUoJ3V1aWQnKTtcblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBfICBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XG5pbXBvcnQgVGVzdENhc2VSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvY2FzZS1yZXN1bHQnO1xuaW1wb3J0IFRlc3RSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvdGVzdC1yZXN1bHQnO1xuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi8uLi9tb2RlbC9zdGF0dXMnO1xuaW1wb3J0IG94dXRpbCBmcm9tICcuLi8uLi9saWIvdXRpbCc7XG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vLi4vZXJyb3JzL2hlbHBlcic7XG5pbXBvcnQgT3h5Z2VuRXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcbmltcG9ydCBQYXJhbWV0ZXJNYW5hZ2VyIGZyb20gJy4uLy4uL2xpYi9wYXJhbS1tYW5hZ2VyLmpzJztcbmltcG9ydCBXb3JrZXJQcm9jZXNzIGZyb20gJy4uL1dvcmtlclByb2Nlc3MnO1xuXG4vLyBzbm9vemUgZnVuY3Rpb24gLSBhc3luYyB3cmFwcGVyIGFyb3VuZCBzZXRUaW1lb3V0IGZ1bmN0aW9uXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuY29uc3QgZ2V0U3VpdGVzQnJlYWtwb2ludHMgPSAoc3VpdGVzKSA9PiB7XG4gICAgY29uc3QgcmV0dmFsID0gW107XG5cbiAgICBpZiAoXG4gICAgICAgIHN1aXRlcyAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwucHVzaChicmVha3BvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXR2YWw7XG59O1xuXG5jb25zdCByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyA9IChzdWl0ZXMsIHJlbW92ZUJyZWFrcG9pbnQpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIHN1aXRlcyAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5maWxlID09PSByZW1vdmVCcmVha3BvaW50LmZpbGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5saW5lID09PSByZW1vdmVCcmVha3BvaW50LmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPeHlnZW5SdW5uZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gY2xhc3MgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuX2lkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVmaW5lIHZhcmlhYmxlcyB0byBpdGVyYXRlIHRocm91Z2ggdGVzdCBjYXNlcyBhbmQgdGVzdCBzdWl0ZSBpdGVyYXRpb25zXG4gICAgICAgIHRoaXMuX3N1aXRlO1xuICAgICAgICB0aGlzLl9lbnZWYXJzID0ge307ICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3RcbiAgICAgICAgdGhpcy5fdmFycyA9IHt9OyAgICAgLy8gdXNlci1kZWZpbmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgc2NyaXB0c1xuICAgICAgICB0aGlzLl9jYXBzID0ge307IC8vIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIHBhc3NlZCB0byBlYWNoIG1vZHVsZVxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gMztcbiAgICAgICAgdGhpcy5fY3VycmVudENhc2VSZXN1bHRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY3VycmVudFN1aXRlUmVzdWx0SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTdGVwUmVzdWx0SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHByb21pc2VzXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XG4gICAgfVxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kc1xuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGF0IGxlYXN0IG9uZSB0ZXN0IHN1aXRlIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKCFvcHRpb25zLnN1aXRlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5fY3dkID0gdGhpcy5fb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBtZXJnZSBjdXJyZW50IGFuZCB0ZXN0IGNvbmZpZ3VyYXRpb24gYmFzZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICAgICAgICBsZXQgb3B0RW52ID0ge307XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnYpIHtcbiAgICAgICAgICAgICAgICAvLyAnZW52JyBvcHRpb24gbWlnaHQgYmUgZGVmaW5lZCBlaXRoZXIgYXMgYSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBvciBhcyBhbiBvYmplY3QgdGhhdCBsaXN0cyBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgLy8gaWYgJ2VudicgaXMgYSBzdHJpbmcsIHRoZW4gcmVzb2x2ZSB0aGUgYWN0dWFsIHZhcmlhYmxlcyBmcm9tICdlbnZzJyBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3B0aW9ucy5lbnZzID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdEVudiA9IG9wdGlvbnMuZW52c1tvcHRpb25zLmVudl07XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgJ2VudicgaXMgYW4gb2JqZWN0LCB1c2UgdGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIGl0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudikpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnZWYXJzICYmIE9iamVjdC5rZXlzKG9wdGlvbnMuZW52VmFycykpIHtcbiAgICAgICAgICAgICAgICBvcHRFbnYgPSB7IC4uLm9wdEVudiwgLi4ub3B0aW9ucy5lbnZWYXJzIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZVxuICAgICAgICAgICAgdGhpcy5fZW52ID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2VudixcbiAgICAgICAgICAgICAgICAuLi5vcHRFbnZcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVzID0gb3B0aW9ucy50ZXN0QXR0cmlidXRlcyB8fCB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7IC4uLmNhcHMgfTsgLy8gYXNzaWduIGNhcHMgZm9yIGxhdGVyIHVzZVxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XG4gICAgICAgIC8vIHNldCB1cCBkZWJ1Z2dpbmcgb3B0aW9uc1xuICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIHJlaW1wbGVtZW50ZWQuIEV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBkZWJ1Z2dpbmcgKGluaXRpYWxpemVEZWJ1Z2dlcikgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBPeHlnZW5cbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9ICBvcHRpb25zLmRlYnVnUG9ydElkZSB8fCBvcHRpb25zLmRlYnVnUG9ydCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gb3B0aW9ucy5kZWJ1Z1BvcnQgfHwgb3B0aW9ucy5kZWJ1Z1BvcnRJZGUgfHwgbnVsbDtcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xuICAgICAgICB0aGlzLl9sb2NhbFRpbWUgPSAodGhpcy5fb3B0aW9ucyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVGltZSkgfHwgdGhpcy5fbG9jYWxUaW1lO1xuICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFdvcmtlclByb2Nlc3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcbiAgICB9XG5cbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyICYmIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wRGVidWdnZXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmlzUnVubmluZykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wKHN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIGRpc3Bvc2luZyBSdW5uZXInLCBlKTtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHRoZSBkaXNwb3NlXG4gICAgICAgICAgICBsb2cud2FybignRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyOicsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gJ0NBTkNFTEVEJykge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRHbG9iYWxWYXJpYWJsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbml0aWFsaXphdGlvbiBoYXNuJ3QgYmVlbiBjb21wbGV0ZWQgeWV0LCB3YWl0IGZvciAnaW5pdGlhbGl6ZWQnIGV2ZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc1J1bm5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByZXZpb3VzIHRlc3QgaXMgc3RpbGwgcnVubmluZywgd2FpdCBmb3IgJ3Rlc3QtZW5kZWQnIGV2ZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJTdGFydCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwcyk7XG5cbiAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9ydW5UZXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXJyb3IgJiYgcmVzdWx0ICYmIHJlc3VsdC5mYWlsdXJlKSB7XG4gICAgICAgICAgICBlcnJvciA9IHJlc3VsdC5mYWlsdXJlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJFbmQodGhpcy5faWQsIHJlc3VsdCwgZXJyb3IpO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGtpbGwoc3RhdHVzID0gbnVsbCkge1xuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pc1J1bm5pbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5raWxsKHN0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1Z0NvbnRpbnVlKCkge1xuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNvbnRpbnVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpIHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXBkYXRlQnJlYWtwb2ludHMoYnJlYWtwb2ludHMsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRzQnJlYWtwb2ludHMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlc0JyZWFrcG9pbnRzID0gZ2V0U3VpdGVzQnJlYWtwb2ludHModGhpcy5fc3VpdGVzKTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBicmVha3BvaW50cyBmcm9tIHN1aXRlcy9jYXNlcyB0cmVlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc3VpdGVCcCBvZiBzdWl0ZXNCcmVha3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKHN1aXRlQnAubGluZSkgJiYgIGZpbGVQYXRoID09PSBzdWl0ZUJwLmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUJyZWFrcG9pbnRGcm9tU3VpdGVzKHRoaXMuX3N1aXRlcywgc3VpdGVCcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVsZXRlZCBicmVha3BvaW50c1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGFjdHVhbEN1cnJlbnRCcCBvZiB0c0JyZWFrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtwb2ludHMuaW5jbHVkZXMoYWN0dWFsQ3VycmVudEJwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGFjdHVhbEN1cnJlbnRCcCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBicmVha3BvaW50c1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHVzZXJTZXRCcCBvZiBicmVha3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRzQnJlYWtwb2ludHMuaW5jbHVkZXModXNlclNldEJwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludChmaWxlUGF0aCwgdXNlclNldEJwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZUFsbFByb21pc2UgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHRydWUpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XG5cbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoJ3VwZGF0ZUJyZWFrcG9pbnRzKCkgZG9uZS4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvbWlzZUFsbFByb21pc2UgOiBwcm9taXNlQWxsUHJvbWlzZSwgYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyA6IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3InLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJlcGxDbG9zZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncmVwbCcsXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9zdG9wJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyByZXBsU2VuZChjbWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncmVwbCcsXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9ldmFsJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICBjbWQ6IGNtZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2UoJ3JlcGxTdGFydCcpO1xuICAgIH1cblxuICAgIHNldEJyZWFrcG9pbnQobGluZSkge1xuICAgICAgICAvKlxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl9zdWl0ZSAmJiB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRjID0gdGhpcy5fc3VpdGUudGVzdGNhc2VzW3RjaW5kZXhdO1xuICAgICAgICAgICAgbG9nLmRlYnVnKCdveHlnZW4uc2V0QnJlYWtwb2ludDogJyArIChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQpKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KHRjLm5hbWUsIGxpbmUgKyB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCk7XG4gICAgICAgIH0qL1xuICAgIH1cblxuICAgIGNsZWFyQnJlYWtwb2ludChsaW5lKSB7XG4gICAgICAgIC8qXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIuZGVidWdnZXIuY2xlYXJCcmVha3BvaW50KGxpbmUgKyB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCwgbnVsbCk7XG4gICAgICAgIH0qL1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKiBQcml2YXRlIG1ldGhvZHNcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgYXN5bmMgX3J1blRlc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUZXN0UmVzdWx0KCk7XG4gICAgICAgIHJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xuICAgICAgICByZXN1bHQuc3VpdGVzID0gW107XG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgIC8vIGNhbGwgYmVmb3JlVGVzdCBob29rXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2soKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBzdWl0ZXNcbiAgICAgICAgICAgIGZvciAobGV0IHN1aXRlIG9mIHRoaXMuX3N1aXRlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuU3VpdGUoc3VpdGUpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcbiAgICAgICAgcmVzdWx0LmR1cmF0aW9uID0gcmVzdWx0LmVuZFRpbWUgLSByZXN1bHQuc3RhcnRUaW1lO1xuXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHJlc3VsdC5zdWl0ZXMuc29tZShzdWl0ZUl0ZXJhdGlvbnMgPT4ge1xuICAgICAgICAgICAgaWYgKHN1aXRlSXRlcmF0aW9ucyAmJiBBcnJheS5pc0FycmF5KHN1aXRlSXRlcmF0aW9ucykgJiYgc3VpdGVJdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBoYXNGYWlsZWRTdWl0ZXMgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcbiAgICAgICAgcmVzdWx0LmVudmlyb25tZW50ID0geyAuLi50aGlzLl9lbnYgfTtcbiAgICAgICAgLy8gY29tYmluZSB0ZXN0IGRlZmluZWQgY2FwcyBhbmQgcGVyIG1vZHVsZSBjYXBhYmlsaXRpZXMsIHRoYXQgd2VyZSBwYXNzZWQgYnkgdXNlciBpbiBlYWNoIG1vZHVsZSdzIGluaXQgZnVuY3Rpb25cbiAgICAgICAgcmVzdWx0LmNhcGFiaWxpdGllcyA9IHsgLi4udGhpcy5fY2FwcywgLi4udGhpcy5fbW9kQ2FwcyB9OyAgICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9jYXBzIG9iamVjdFxuICAgICAgICByZXN1bHQub3B0aW9ucyA9IHsgLi4udGhpcy5fb3B0aW9ucyB9OyAgLy8gYXNzaWduIGEgY29weSBvZiBfb3B0aW9ucyBvYmplY3RcblxuICAgICAgICAvLyBpZiBlcnJvciBvY2N1cmVkLCBhZGQgaXQgdG8gdGhlIHN1bW1hcnlcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgX3J1blN1aXRlKHN1aXRlKSB7XG4gICAgICAgIGlmICghc3VpdGUpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignc3VpdGUgaXMgbnVsbCBpbiBfcnVuU3VpdGUoKSEhIScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlnbm9yZSBzdWl0ZSB3aXRoIG1pc3NpbmcgbWFuZGF0b3J5IHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFzdWl0ZS5uYW1lICYmICFzdWl0ZS5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBzcGVjaWZ5IHN1aXRlLml0ZXJhdGlvbkNvdW50XG4gICAgICAgIGlmICghc3VpdGUuaXRlcmF0aW9uQ291bnQpIHtcbiAgICAgICAgICAgIHN1aXRlLml0ZXJhdGlvbkNvdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICAgIGlmIChzdWl0ZS5pdGVyYXRpb25Db3VudCA+IDEpIHtcbiAgICAgICAgICAgIHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZVJ1bk9uRmFpbHVyZSA9IHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCB8fCBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4UmVydW5zID0gdGhpcy5fb3B0aW9ucy5yZVJ1bkNvdW50IHx8IE1BWF9SRVJVTlM7XG4gICAgICAgIGNvbnN0IHJlUnVuRGVsYXkgPSB0aGlzLl9vcHRpb25zLnJlUnVuRGVsYXk7XG4gICAgICAgIC8vIHNpbmdsZSBzdWl0ZSBtaWdodCBwcm9kdWNlIG11bHRpcGxlIHJlc3VsdHMsIGJhc2VkIG9uIGFtb3VudCBvZiBkZWZpbmVkIGl0ZXJhdGlvbnNcbiAgICAgICAgY29uc3Qgc3VpdGVJdGVyYXRpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IHN1aXRlSXRlcmF0aW9uPTE7IHN1aXRlSXRlcmF0aW9uIDw9IHN1aXRlLml0ZXJhdGlvbkNvdW50OyBzdWl0ZUl0ZXJhdGlvbisrKSB7XG4gICAgICAgICAgICBpZiAoc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25TdGFydCh0aGlzLl9pZCwgc3VpdGVJdGVyYXRpb24sICdTdWl0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3VpdGVSZXN1bHQgPSBuZXcgVGVzdFN1aXRlUmVzdWx0KCk7XG4gICAgICAgICAgICBzdWl0ZUl0ZXJhdGlvbnMucHVzaChzdWl0ZVJlc3VsdCk7XG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5pZCA9IHRoaXMuX2N1cnJlbnRTdWl0ZVJlc3VsdElkID0gdjEoKTtcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lm5hbWUgPSBzdWl0ZS5uYW1lIHx8IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoc3VpdGUucGF0aCk7XG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBzdWl0ZUl0ZXJhdGlvbjtcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vblN1aXRlU3RhcnQodGhpcy5faWQsIHN1aXRlUmVzdWx0LmlkLCBzdWl0ZVJlc3VsdCk7XG4gICAgICAgICAgICBmb3IgKGxldCBjYXplIG9mIHN1aXRlLmNhc2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhc2VzIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgJ3BhdGgnIHByb3BlcnR5IFxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhemUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXplLm5hbWUgPSBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KGNhemUucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5pdGVyYXRpb25Db3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjYXplLml0ZXJhdGlvbkNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZUl0ZXJhdGlvbj0xOyBjYXNlSXRlcmF0aW9uIDw9IGNhemUuaXRlcmF0aW9uQ291bnQ7IGNhc2VJdGVyYXRpb24rKykge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F6ZSAmJiBjYXplLml0ZXJhdGlvbkNvdW50ICYmIGNhemUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvblN0YXJ0KHRoaXMuX2lkLCBjYXNlSXRlcmF0aW9uLCAnQ2FzZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGNhc2UgcmVzdWx0IGlkXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhc2VSZXN1bHRJZCA9IHRoaXMuX2N1cnJlbnRDYXNlUmVzdWx0SWQgPSB2MSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgY2FzZSBzdGFydCBldmVudFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkNhc2VTdGFydCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQuaWQgLypzdWl0ZS51cmkgfHwgc3VpdGUuaWQqLywgY2FzZVJlc3VsdElkIC8qY2F6ZS51cmkgfHwgY2F6ZS5pZCB8fCBjYXplLnBhdGgqLywgY2F6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHJlUnVuQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FzZVJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG9yIHJlLXJ1biB0aGUgY3VycmVudCB0ZXN0IGNhc2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcmVSdW5Db3VudCA9IDA7IHJlUnVuQ291bnQgPCBtYXhSZXJ1bnM7IHJlUnVuQ291bnQrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCByZVJ1bkNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWNhc2VSZXN1bHQgfHwgY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpICYmICFyZVJ1bk9uRmFpbHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FzZVJlc3VsdCAmJiBjYXNlUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlUnVuRGVsYXkgJiYgcmVSdW5Db3VudCA8IG1heFJlcnVucyAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBveHV0aWwuc2xlZXAocmVSdW5EZWxheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5pZCA9IGNhc2VSZXN1bHRJZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGNhc2UgZW5kIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQuaWQgLypzdWl0ZS51cmkgfHwgc3VpdGUuaWQqLywgY2FzZVJlc3VsdElkIC8qY2F6ZS51cmkgfHwgY2F6ZS5pZCovLCBjYXNlUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgY2FzZVJlc3VsdCwgJ0Nhc2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY2FzZSByZXN1bHQgdG8gdGhlIHN1aXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5jYXNlcy5wdXNoKGNhc2VSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0ZXN0IGNhc2UgaXRlcmF0aW9uIGhhcyBmYWlsZWQsIHRoZW4gbWFyayB0aGUgZW50aXJlIHRlc3QgY2FzZSBhcyBmYWlsZWQsIFxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGl0ZXJhdGluZyBvdmVyIGl0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgY2FzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XG5cbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQsICdTdWl0ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCBzdWl0ZVJlc3VsdCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXBvcnRlci5vblN1aXRlRW5kKHRoaXMuX2lkLCBzdWl0ZVJlc3VsdC5pZCwgc3VpdGVSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWl0ZUl0ZXJhdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCByZVJ1bkNvdW50ID0gMCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICAgICAgY29uc3QgcmVSdW4gPSByZVJ1bkNvdW50ID4gMDtcbiAgICAgICAgLy8gZ2V0IHRlc3Qgc3VpdGUncyBwYXJhbWV0ZXJzIGlmIGRlZmluZWRcbiAgICAgICAgLy8gZ2V0IHRoZW0gZmlyc3QgYW5kIHRoZW4gb3ZlcnJpZGUgd2l0aCB0ZXN0IGNhc2UgbGV2ZWwgcGFyYW1ldGVycyBpZiBkZWZpbmVkXG4gICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcbiAgICAgICAgICAgIGlmIChyZVJ1bikge1xuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXy5leHRlbmQocGFyYW1zLCBzdWl0ZS5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWQgdGVzdCBjYXNlJ3MgbmV4dCBsaW5lcyBvZiBwYXJhbWV0ZXJzIGlmIHBhcmFtZXRlciBtYW5hZ2VyIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKGNhemUucGFyYW1NYW5hZ2VyKSB7XG4gICAgICAgICAgICBpZiAocmVSdW4pIHtcbiAgICAgICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXy5leHRlbmQocGFyYW1zLCBjYXplLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgYnJlYWtwb2ludHMgYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCBpZiBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiBjYXplLmJyZWFrcG9pbnRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8IGNhemUuYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBlZGl0b3IgaW5kZXggc3RhcnRzIGZyb20gMSwgYnV0IHdlIG5lZWQgemVybyBiYXNlZCBpbmRleFxuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2F6ZS5icmVha3BvaW50c1tpXS5saW5lO1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gY2F6ZS5icmVha3BvaW50c1tpXS5maWxlO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQoZmlsZSwgbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKTtcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IG5ldyBUZXN0Q2FzZVJlc3VsdCgpO1xuICAgICAgICBjYXNlUmVzdWx0Lm5hbWUgPSBjYXplLm5hbWU7XG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXplLnBhdGg7XG4gICAgICAgIGNhc2VSZXN1bHQuaXRlcmF0aW9uTnVtID0gY2FzZUl0ZXJhdGlvbjtcbiAgICAgICAgY2FzZVJlc3VsdC5yZVJ1bkNvdW50ID0gcmVSdW5Db3VudDtcblxuICAgICAgICAvLyB0cnkgdG8gaW5pdGlhbGl6ZSBPeHlnZW4gYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0ICghKHRoaXMuX3dvcmtlcikgJiYgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyX0luaXRPeHlnZW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSAwO1xuICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlKTtcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcblxuICAgICAgICAgICAgaWYgKHN1aXRlLnBhcmFtTWFuYWdlcikge1xuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcbiAgICAgICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGFydCBuZXcgdGVzdCBzZXNzaW9uXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9zdGFydFNlc3Npb24oKTtcbiAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGluIHRoZSB3b3JrZXIgcHJvY2VzcyBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VsdFN0b3JlLCBjb250ZXh0LCBtb2R1bGVDYXBzLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcyk7XG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgY29udGV4dCwgZXJyb3IsIG1vZHVsZUNhcHMgfSk7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LmR1cmF0aW9uID0gY2FzZVJlc3VsdC5lbmRUaW1lIC0gY2FzZVJlc3VsdC5zdGFydFRpbWU7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLnN0ZXBzID8gcmVzdWx0U3RvcmUuc3RlcHMgOiBbXTtcbiAgICAgICAgICAgIGNhc2VSZXN1bHQubG9ncyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmxvZ3MgPyByZXN1bHRTdG9yZS5sb2dzIDogW107XG4gICAgICAgICAgICBjYXNlUmVzdWx0LmhhciA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmhhciA/IHJlc3VsdFN0b3JlLmhhciA6IG51bGw7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LnRlc3RBdHRyaWJ1dGVzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuYXR0cmlidXRlcyA/IHJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMgOiBudWxsO1xuICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmF0dGFjaG1lbnRzID8gcmVzdWx0U3RvcmUuYXR0YWNobWVudHMgOiBudWxsO1xuXG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGVzdCBjYXNlIGl0ZXJhdGlvbiBzdGF0dXMgLSBtYXJrIGl0IGFzIGZhaWxlZCBpZiBhbnkgc3RlcCBoYXMgZmFpbGVkXG4gICAgICAgICAgICB2YXIgZmFpbGVkU3RlcHMgPSBfLmZpbmQoY2FzZVJlc3VsdC5zdGVwcywge3N0YXR1czogU3RhdHVzLkZBSUxFRH0pO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzdGVwcyB3aXRoIFdhcm5pbmcgc3RhdHVzXG4gICAgICAgICAgICB2YXIgd2FybmluZ1N0ZXBzID0gXy5maW5kKGNhc2VSZXN1bHQuc3RlcHMsIHtzdGF0dXM6IFN0YXR1cy5XQVJOSU5HfSk7XG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IF8uaXNFbXB0eShmYWlsZWRTdGVwcykgJiYgIWVycm9yID8gU3RhdHVzLlBBU1NFRCA6IFN0YXR1cy5GQUlMRUQ7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IG94dXRpbC5tYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQoY2FzZVJlc3VsdC5zdGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghXy5pc0VtcHR5KHdhcm5pbmdTdGVwcykpIHtcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIGNhc2VSZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXJfUnVuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xuICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlKTtcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3Bvc2VPeHlnZW5Nb2R1bGVzID0gdHlwZW9mIHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgIT09ICdib29sZWFuJyB8fCB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlID09PSB0cnVlO1xuICAgICAgICAvLyBlbmQgc2Vzc2lvbiBhbmQgZGlzcG9zZSBPeHlnZW4gbW9kdWxlcyBpZiByZXF1aXJlZFxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfZW5kU2Vzc2lvbihjYXNlUmVzdWx0LnN0YXR1cywgZGlzcG9zZU94eWdlbk1vZHVsZXMpO1xuXG4gICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcbiAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhemUucGFyYW1NYW5hZ2VyKSB7XG4gICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlciBpcyBudWxsIGJ1dCBub3Qgc3VwcG9zZSB0byEnKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQucmVqZWN0KG5ldyBFcnJvcignX3dvcmtlciBpcyBudWxsJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0YXJ0IHJ1bm5pbmcgdGhlIHRlc3RcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dvcmtlci5ydW4oe1xuICAgICAgICAgICAgc2NyaXB0TmFtZTogY2F6ZS5uYW1lLFxuICAgICAgICAgICAgc2NyaXB0UGF0aDogY2F6ZS5wYXRoLFxuICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5fZW52LFxuICAgICAgICAgICAgICAgIGNhcHM6IHRoaXMuX2NhcHMsXG4gICAgICAgICAgICAgICAgdmFyczogdGhpcy5fdmFycyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIHRlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2F6ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzdWl0ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBzdWl0ZUl0ZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvRmlsZTogdGhpcy5fb3B0aW9ucy5wbyB8fCBudWxsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBfd29ya2VyX0luaXRPeHlnZW4oKSB7XG4gICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmluaXRPeHlnZW4odGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHMpKTtcbiAgICB9XG5cbiAgICBhc3luYyBfd29ya2VyX3N0YXJ0U2Vzc2lvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuc3RhcnRTZXNzaW9uKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnRTZXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfd29ya2VyX2VuZFNlc3Npb24oc3RhdHVzID0gbnVsbCwgZGlzcG9zZU1vZHVsZXMgPSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmVuZFNlc3Npb24pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5lbmRTZXNzaW9uKHN0YXR1cywgZGlzcG9zZU1vZHVsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2soKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVUZXN0JywgW3RoaXMuX2lkLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9jYXBzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rKHN1aXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVTdWl0ZScsIFtzdWl0ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2soY2F6ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNhc2UnLCBbY2F6ZV0pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVDYXNlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyVGVzdCcsIFt0aGlzLl9pZCwgcmVzdWx0XSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiBhd2FpdCB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgcmVzdWx0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJTdWl0ZScsIFtzdWl0ZSwgcmVzdWx0XSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2soY2F6ZSwgcmVzdWx0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDYXNlJywgW2NhemUsIHJlc3VsdF0pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgX3N0YXJ0V29ya2VyUHJvY2VzcygpIHtcbiAgICAgICAgY29uc3Qgd29ya2VyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd3b3JrZXIuanMnKTtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbmV3IFdvcmtlclByb2Nlc3ModGhpcy5faWQsIHdvcmtlclBhdGgsIHRoaXMuX2RlYnVnTW9kZSwgdGhpcy5fZGVidWdQb3J0LCAnT3h5Z2VuJywgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnQoKTtcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckV2ZW50cygpO1xuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnREZWJ1Z2dlcigpO1xuICAgICAgICB0aGlzLl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKTtcbiAgICB9XG5cbiAgICBfaG9va1dvcmtlckV2ZW50cygpIHtcbiAgICAgICAgLy8gcHJlc2VydmUgdGhpcyBvYmplY3RcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl93b3JrZXIuc3Vic2NyaWJlKCdjb21tYW5kOmJlZm9yZScsIHRoaXMuX2hhbmRsZUJlZm9yZUNvbW1hbmQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3dvcmtlci5zdWJzY3JpYmUoJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLl9oYW5kbGVBZnRlckNvbW1hbmQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3dvcmtlci5vbignZXJyb3InLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgIGxvZy5lcnJvcignV29ya2VyIHByb2Nlc3MgZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdERvbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2V4aXQnLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5leGl0RG9uZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBwYXlsb2FkO1xuXG4gICAgICAgICAgICBpZiAoZXhpdENvZGUgJiYgZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGVzdCBpcyBydW5uaW5nIG9yIGlzIGJlaW5nIGRpc3Bvc2VkIGFuZCB0aGUgY2hpbGQgcHJvY2VzcyBoYXMgZGllZCxcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGVuZCB0aGUgdGVzdCBvciBkaXNwb3NhbCB3aXRoIGZhdGFsIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gKGNoaWxkIHByb2Nlc3Mgbm90IHN1cHBvc2UgdG8gZGllIHdpdGggY29kZSA+IDApXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5faXNEaXNwb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuRGlzcG9zZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9pc1J1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3RoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZXhpdENvZGUgPT0gMTM0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IE94eWdlbkVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdPdXQgb2YgbWVtb3J5IGVycm9yLiBNYWtlIHN1cmUgdGhhdCB5b3UgZG9uXFwndCBoYXZlIGFueSBtZW1vcnkgbGVha3MgaW4gdGhlIHRlc3Qgc2NyaXB0LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgT3h5Z2VuRXJyb3IoYFdvcmtlciBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGU6ICR7ZXhpdENvZGV9LmApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByb21pc2UgJiYgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1zZykgPT4ge1xuICAgICAgICAgICAgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdsb2cnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1zZy5sZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnLm1zZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdJTkZPJykge1xuICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhtc2cubXNnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLm1zZywgbXNnLmVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdXQVJOJykge1xuICAgICAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cubXNnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsb2cnLCBtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXIgJiYgYXdhaXQgX3RoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgIG1zZy50aW1lLCBtc2cubGV2ZWwsIG1zZy5tc2csIG1zZy5zcmMgfHwgREVGQVVMVF9JU1NVRVIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSWQ6IHRoaXMuX2N1cnJlbnRTdWl0ZVJlc3VsdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZUlkOiB0aGlzLl9jdXJyZW50Q2FzZVJlc3VsdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiB0aGlzLl9jdXJyZW50U3RlcFJlc3VsdElkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdsaW5lLXVwZGF0ZScpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsaW5lLXVwZGF0ZScsIG1zZy5saW5lLCBtc2cuc3RhY2ssIG1zZy50aW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdyZXN1bHQtdXBkYXRlJykge1xuICAgICAgICAgICAgICAgIGlmIChtc2cubWV0aG9kID09PSAnaW5pdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnaW5pdC1kb25lJywgbXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnd29ya2VyRXJyb3InKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3dvcmtlckVycm9yOicsIG1zZyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCdmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmtpbGwoJ2ZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3JlcGwnKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgncmVwbCcsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWsnLCAoYnJlYWtwb2ludERhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludCcsIGJyZWFrcG9pbnREYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWtFcnJvcicsIChicmVha0Vycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrcG9pbnRFcnJvcicsIGJyZWFrRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBfaGFuZGxlQmVmb3JlQ29tbWFuZChlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTdGVwUmVzdWx0SWQgPSBlLmlkO1xuICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiBhd2FpdCB0aGlzLl9yZXBvcnRlci5vblN0ZXBTdGFydCh0aGlzLl9pZCwgdGhpcy5fY3VycmVudFN1aXRlUmVzdWx0SWQsIHRoaXMuX2N1cnJlbnRDYXNlUmVzdWx0SWQsIGUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1vZHVsZSAmJiBlLm1vZHVsZSA9PT0gJ2xvZycpIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNvbW1hbmQnLCBbZV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBfaGFuZGxlQWZ0ZXJDb21tYW5kKGUpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgYXdhaXQgdGhpcy5fcmVwb3J0ZXIub25TdGVwRW5kKHRoaXMuX2lkLCB0aGlzLl9jdXJyZW50U3VpdGVSZXN1bHRJZCwgdGhpcy5fY3VycmVudENhc2VSZXN1bHRJZCwgZS5yZXN1bHQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNvbW1hbmQnLCBbZS5yZXN1bHRdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIGF3YWl0IHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdXJyZW50U3RlcFJlc3VsdElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9yZXNldEdsb2JhbFZhcmlhYmxlcygpIHtcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xuICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEaXNwb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xuICAgIH1cblxuICAgIF9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgbW9kdWxlQ2FwcywgY29udGV4dCA9IHt9LCBlcnJvciA9IG51bGwgfSkge1xuICAgICAgICAvLyBpZiB0ZXN0IHdhcyBraWxsZWQgYmVmb3JlIGFueSByZXN1bHRzIHdlcmUgZ2VuZXJhdGVkLCB0aGVuIGp1c3QgZmluYWxpemUgdGhlIHRlc3Qgd2l0aG91dCBwcm9jZXNzaW5nIHJlc3VsdHNcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLaWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVycm9yJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHN0b3JlICd2YXJzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxuICAgICAgICB0aGlzLl92YXJzID0gY29udGV4dC52YXJzIHx8IHRoaXMuX3ZhcnM7XG4gICAgICAgIC8vIHN0b3JlICdtb2RDYXBzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxuICAgICAgICB0aGlzLl9tb2RDYXBzID0geyAuLi50aGlzLl9tb2RDYXBzLCAuLi5tb2R1bGVDYXBzIHx8IHt9IH07XG4gICAgICAgIC8vIGNsZWFuIHVwIGNvbnRleHQgZnJvbSBpbnRlcm5hbCBlbGVtZW50cywgbm90IG5lZWQgaW4gdGhlIHJlcG9ydDpcbiAgICAgICAgLy8gcmVtb3ZlIGNhcHMgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXG4gICAgICAgIGlmIChjb250ZXh0LmNhcHMpXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5jYXBzO1xuICAgICAgICAvLyByZW1vdmUgZW52IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxuICAgICAgICBpZiAoY29udGV4dC5lbnYpXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5lbnY7XG4gICAgICAgIC8vIHJlbW92ZSB0ZXN0IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxuICAgICAgICBpZiAoY29udGV4dC50ZXN0KVxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQudGVzdDtcbiAgICB9XG5cbiAgICBfZW1pdEl0ZXJhdGlvbkVuZCh0cywgdGMsIHN1aXRlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uUmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnaXRlcmF0aW9uLWVuZCcsIHtcbiAgICAgICAgICAgIHN0YXR1czogY2FzZUl0ZXJhdGlvblJlc3VsdC5fc3RhdHVzLFxuICAgICAgICAgICAgZmFpbHVyZTogY2FzZUl0ZXJhdGlvblJlc3VsdC5mYWlsdXJlIHx8IG51bGwsXG4gICAgICAgICAgICBjYXNlOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRjLmlkIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbmFtZTogdGMubmFtZSxcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25OdW0sXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRjLml0ZXJhdGlvbkNvdW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VpdGU6IHtcbiAgICAgICAgICAgICAgICBpZDogdHMuaWQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBuYW1lOiB0cy5uYW1lLFxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25OdW0sXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRzLml0ZXJhdGlvbkNvdW50XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9lbWl0VGVzdEVuZChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVuZCcsIHJlc3VsdCk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB7IFBhcmFtZXRlck1hbmFnZXIgfTsiXX0=
|