@magic-xpa/engine 4.801.0-dev481.239 → 4.801.0-dev481.243
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/bundles/magic-xpa-engine.umd.js +45 -45
- package/bundles/magic-xpa-engine.umd.js.map +1 -1
- package/bundles/magic-xpa-engine.umd.min.js +2 -2
- package/bundles/magic-xpa-engine.umd.min.js.map +1 -1
- package/esm2015/src/CommandsProcessorBase.js +2 -2
- package/esm2015/src/CurrentClientVersion.js +2 -2
- package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +2 -3
- package/esm2015/src/data/DataView.js +2 -3
- package/esm2015/src/data/Field.js +2 -3
- package/esm2015/src/data/Record.js +2 -3
- package/esm2015/src/env/LanguageData.js +2 -3
- package/esm2015/src/event/EventHandler.js +2 -3
- package/esm2015/src/event/EventHandlerPosition.js +2 -2
- package/esm2015/src/event/EventsManager.js +2 -3
- package/esm2015/src/exp/ExpressionEvaluator.js +2 -3
- package/esm2015/src/gui/MgForm.js +2 -3
- package/esm2015/src/http/client/HttpClientBase.js +2 -3
- package/esm2015/src/remote/RemoteCommandsProcessor.js +2 -3
- package/esm2015/src/remote/ServerError.js +2 -3
- package/esm2015/src/rt/DataviewHeadersSaxHandler.js +2 -3
- package/esm2015/src/tasks/Task.js +2 -3
- package/fesm2015/magic-xpa-engine.js +2 -3
- package/fesm2015/magic-xpa-engine.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { DataModificationTypes, EMPTY_DCREF, ExpVal, ObjectReferenceBase, ObjectReferencesCollection, RecordUtils } from '@magic-xpa/gui';
|
|
2
|
-
import { ApplicationException, Int32, ISO_8859_1_Encoding, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
2
|
+
import { ApplicationException, Int32, ISO_8859_1_Encoding, NNumber, NString, RefParam, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
|
3
3
|
import { Base64, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
4
4
|
import { ExpressionEvaluator, NullValueException } from '../exp/ExpressionEvaluator';
|
|
5
5
|
import { ConstInterface } from '../ConstInterface';
|
|
6
6
|
import { Environment } from '../env/Environment';
|
|
7
7
|
import { DataViewBase } from './DataViewBase';
|
|
8
|
-
import { isNullOrUndefined } from 'util';
|
|
9
8
|
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
|
10
9
|
export class Record {
|
|
11
10
|
constructor(dvOrTableCacheOrCIdOrRecord, dataview) {
|
|
@@ -844,4 +843,4 @@ export class DcValuesReference extends ObjectReferenceBase {
|
|
|
844
843
|
return new DcValuesReference(controlId, dcValuesOwner.getDcValues(dcId));
|
|
845
844
|
}
|
|
846
845
|
}
|
|
847
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9kYXRhL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLFdBQVcsRUFDWCxNQUFNLEVBR04sbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixXQUFXLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLEtBQUssRUFDTCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFNbkYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBTzFFLE1BQU0sT0FBTyxNQUFNO0lBc0VqQixZQUFZLDJCQUFnQyxFQUFFLFFBQXVCO1FBckQzRCxRQUFHLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUM3QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixVQUFLLEdBQTBCLHFCQUFxQixDQUFDLElBQUks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QkFBaUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERjVmFsdWVzLFxyXG4gIEVNUFRZX0RDUkVGLFxyXG4gIEV4cFZhbCxcclxuICBGaWVsZERlZixcclxuICBJUmVjb3JkLFxyXG4gIE9iamVjdFJlZmVyZW5jZUJhc2UsXHJcbiAgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24sXHJcbiAgUmVjb3JkVXRpbHNcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgSUNvbXBhcmFibGUsXHJcbiAgSW50MzIsXHJcbiAgSVNPXzg4NTlfMV9FbmNvZGluZyxcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuXHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQge1RhYmxlQ2FjaGV9IGZyb20gJy4uL3J0L1RhYmxlQ2FjaGUnO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3IsIE51bGxWYWx1ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb25FdmFsdWF0b3InO1xyXG5pbXBvcnQge0tleX0gZnJvbSAnLi9LZXknO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlcnN9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXdCYXNlfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWR9IGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSByZWNvcmQgb2JqZWN0XHJcbi8vLyAgIGl0IHBhcnNlcyB0aGUgPHJlYy4uLj4gdGFnXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBSZWNvcmQgaW1wbGVtZW50cyBJQ29tcGFyYWJsZSwgSVJlY29yZCB7XHJcbiAgLy8gQVRURU5USU9OICEhISB3aGVuIHlvdSBhZGQvbW9kaWZ5L2RlbGV0ZSBhIG1lbWJlciB2YXJpYWJsZSBkb24ndCBmb3JnZXQgdG8gdGFrZSBjYXJlXHJcbiAgLy8gYWJvdXQgdGhlIFwic2V0U2FtZUFzKClcIiBmdW5jdGlvblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ09OU1RBTlRTXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX05VTEw6IG51bWJlciA9ICgweDAxKTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX0lOVkFMSUQ6IG51bWJlciA9ICgweDAyKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRUQ6IG51bWJlciA9ICgweDA0KTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfVVBEQVRFRDogbnVtYmVyID0gKDB4MDgpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19DUlNSX01PRElGSUVEOiBudW1iZXIgPSAoMHgxMCk7XHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX1ZBTFVFX05PVF9QQVNTRUQ6IG51bWJlciA9ICgweDIwKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFOiBudW1iZXIgPSAoMHg0MCk7XHJcblxyXG4gIHByb3RlY3RlZCBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByb3RlY3RlZCBkYlZpZXdSb3dJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJvdGVjdGVkIF9tb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGNSZWZzOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbiA9IG51bGw7XHJcbiAgX2luQ29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9pblJlY29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIF9uZXdSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldCBJbkNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5Db21wdXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBJblJlY29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlY29tcHV0ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdGF0aWMgSU5DUkVBU0U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgREVDUkVBU0U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJvdGVjdGVkIF90YWJsZUNhY2hlOiBUYWJsZUNhY2hlOyAvLyB9XHJcbiAgLy8gfSBmb3IgdXNlIGlmIHRoZSByZWNvcmQgaXMgcGFydCBvZiB0YWJsZSBjYWNoZSAodGhlcmUgaXMgbm8gd2F5IGJvdGggZHYgYW5kIHRhYmxlY2FjaGUgYXJlIG5vdCBudWxsIGF0IHRoZSBzYW1lIHRpbWUgLVxyXG5cclxuICBwcm90ZWN0ZWQgX2luRGVsZXRlUHJvY2VzczogYm9vbGVhbjsgLy8gd2lsbCBiZSBzZXQgdG8gdHJ1ZSBiZWZvcmUgcmVjIHN1ZmZpeCBmcm9tIGRlbGxpbmUuXHJcbiAgcHJvdGVjdGVkIF9hZGRBZnRlcjogbnVtYmVyO1xyXG4gIHByb3RlY3RlZCBfY2F1c2VJbnZhbGlkYXRpb246IGJvb2xlYW47IC8vIEV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiBhbGwgcm93cyBpbiB0YWJsZVxyXG4gIHByb3RlY3RlZCBfZGJQb3NCYXNlNjRWYWw6IHN0cmluZzsgLy8gdXNlZCBvbmx5IGluIHRhYmxlIGNhY2hlIHJlY29yZHMgaG9sZHMgdGhlIHRhYmxlcyBkYl9wb3MgdmFsdWUgaW4gdGhlIGN1cnNvclxyXG4gIC8vIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgYXJlIE11dHVhbGx5IGV4Y2x1c2l2ZSkuXHJcbiAgcHJvdGVjdGVkIF9kYXRhdmlldzogRGF0YVZpZXdCYXNlID0gbnVsbDtcclxuICBwcml2YXRlIF9maWVsZHNEYXRhOiBTdHJpbmdbXTtcclxuICBwcm90ZWN0ZWQgX2ZsYWdzOiBVaW50OEFycmF5O1xyXG4gIHByb3RlY3RlZCBfZmxhZ3NIaXN0b3J5OiBVaW50OEFycmF5OyAvLyBIaXN0b3J5IG9mIGZsYWdzLCB1c2VkIHdoZW4gY29udGFjdGluZyB0aGUgc2VydmVyXHJcbiAgcHJvdGVjdGVkIF9mb3JjZVNhdmVPcmc6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9oYXNoS2V5OiBudW1iZXI7XHJcblxyXG4gIHByb3RlY3RlZCBfY29tcHV0ZWQ6IGJvb2xlYW47XHJcbiAgcHJvdGVjdGVkIF9sYXRlQ29tcHV0ZTogYm9vbGVhbjsgLy8gdGhpcyByZWNvcmQgbXVzdCBiZSBjb21wdXRlZCBuZXh0IHRpbWUgd2UgZW50ZXIgdGhlIHJlY29yZCwgYnV0IG5vdCBiZWZvcmVcclxuXHJcbiAgcHJvdGVjdGVkIF9saW5rc0ZsZHNQb3M6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX21vZGlmaWVkOiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgX25leHQ6IFJlY29yZDsgIC8vIFBvaW50cyB0byB0aGUgbmV4dCByZWNvcmQsIHdoZW4gaXRzIHBhcnQgb2YgYSBsaXN0XHJcbiAgcHJvdGVjdGVkIF9wcmV2OiBSZWNvcmQ7ICAvLyBQb2ludHMgdG8gdGhlIHByZXYgcmVjb3JkLCB3aGVuIGl0cyBwYXJ0IG9mIGEgbGlzdFxyXG4gIHByb3RlY3RlZCBfc2VuZFRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgLy8gSWYgZmFsc2UsIGRvbid0IHNlbmQgdGhpcyByZWNvcmQgdG8gdGhlIHNlcnZlciwgYXMgcGFydCBvZiB0aGUgbW9kaWZpZWQgbGlzdFxyXG4gIHByb3RlY3RlZCBfdXBkYXRlZDogYm9vbGVhbjtcclxuXHJcbiAgcHVibGljIEluRm9yY2VVcGRhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIFN5bmNlZDogYm9vbGVhbjtcclxuICBwdWJsaWMgVmFsdWVJbkJhc2U2NDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGU6IERhdGFWaWV3QmFzZSB8IFRhYmxlQ2FjaGUpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBkYXRhdmlldzogRGF0YVZpZXdCYXNlKTtcclxuICBjb25zdHJ1Y3RvcihSZWNvcmQ6IFJlY29yZCk7XHJcbiAgY29uc3RydWN0b3IoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkOiBhbnksIGRhdGF2aWV3PzogRGF0YVZpZXdCYXNlKVxyXG4gIHtcclxuICAgIGlmKGR2T3JUYWJsZUNhY2hlT3JDSWRPclJlY29yZCBpbnN0YW5jZW9mICBSZWNvcmQpXHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkKTtcclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkLCBkYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29uc3RydWN0cyBhIG5ldyByZWNvcmQgdG8gYmUgdXNlZCBieSB0aGUgdGFibGUgY2FjaGUgb25seSEhIVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKGR2T3JUYWJsZUNhY2hlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChkdk9yVGFibGVDYWNoZSBpbnN0YW5jZW9mIERhdGFWaWV3QmFzZSlcclxuICAgICAgdGhpcy5fZGF0YXZpZXcgPSA8RGF0YVZpZXdCYXNlPmR2T3JUYWJsZUNhY2hlO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl90YWJsZUNhY2hlID0gPFRhYmxlQ2FjaGU+ZHZPclRhYmxlQ2FjaGU7XHJcblxyXG4gICAgdGhpcy5fZmllbGRzRGF0YSA9IG5ldyBBcnJheTxzdHJpbmc+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpKTtcclxuICAgIHRoaXMuX2ZsYWdzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZmxhZ3NIaXN0b3J5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZGNSZWZzID0gbmV3IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkRGVmID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgdGhpcy5fZmxhZ3NbaV0gPSAoKGZpZWxkLmlzTnVsbERlZmF1bHQoKSB8fCBmaWVsZC5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gUmVjb3JkLkZMQUdfTlVMTCA6IDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2RhdGF2aWV3ICE9PSBudWxsICYmICg8RmllbGQ+ZmllbGQpLklzVmlydHVhbCkge1xyXG4gICAgICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKTtcclxuICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgJiYgcmVjb3JkLklzRmxkTW9kaWZpZWRBdExlYXN0T25jZShpKSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGksIFJlY29yZC5GTEFHX01PRElGSUVEX0FUTEVBU1RfT05DRSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TmV3UmVjKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmdFwiPmEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZHMgdGFibGU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoY0lkOiBudW1iZXIsIGRhdGF2aWV3OiBEYXRhVmlld0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMChkYXRhdmlldyk7XHJcbiAgICB0aGlzLnNldElkKGNJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGlmaWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBVcGRhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IFNlbmRUb1NlcnZlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZW5kVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29tcGFyZVRvKG9iajogT2JqZWN0KTogbnVtYmVyIHtcclxuICAgIGxldCByZXM6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY29tcFRvID0gPFJlY29yZD5vYmo7XHJcblxyXG4gICAgLy8gZ2V0IHRoZSBrZXkgYnkgd2hpY2ggd2UgYXJlIGRvaW5nIHRoZSBDb21wYXJpc29uXHJcbiAgICBsZXQga2V5OiBLZXkgPSB0aGlzLl90YWJsZUNhY2hlLkdldEtleUJ5SWQodGhpcy5fdGFibGVDYWNoZS5HZXRDdXJyU29ydEtleSgpKTtcclxuXHJcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBrZXkgdG8gY29tcGFyZSBieSB0aGVuIHRoZSByZWNvcmRzIGFyZSB1bmNvbXBhcmFibGVcclxuICAgIGlmIChrZXkgIT0gbnVsbCkge1xyXG4gICAgICAvLyBhbGwgd2UgbmVlZCBmcm9tIHRoZSBrZXkgaW4gdGhlIG9yZGVyIG9mIGNvbXBhcmluZyB0aGUgdGhlIHJlY29yZCBmaWVsZHNcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGtleS5Db2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGN1cnJGbGQgPSBrZXkuQ29sdW1ucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgY3VyckZsZElkOiBudW1iZXIgPSBjdXJyRmxkLmdldElkKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLklzTnVsbChjdXJyRmxkSWQpICYmIGNvbXBUby5Jc051bGwoY3VyckZsZElkKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuSXNOdWxsKGN1cnJGbGRJZCkgJiYgIWNvbXBUby5Jc051bGwoY3VyckZsZElkKSkge1xyXG4gICAgICAgICAgLy8gbnVsbCBpcyB0aGUgZ3JlYXRlc3QgdmFsdWUgdGhlcmVmb3JlIHdlIGFyZSB0aGUgZ3JlYXRlclxyXG4gICAgICAgICAgcmVzID0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghdGhpcy5Jc051bGwoY3VyckZsZElkKSAmJiBjb21wVG8uSXNOdWxsKGN1cnJGbGRJZCkpIHtcclxuICAgICAgICAgIHJlcyA9IC0xO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGJvdGggYXJlIG5vdCBudWxsXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICB0aGlzLkdldEZpZWxkVmFsdWUoY3VyckZsZElkKSk7XHJcbiAgICAgICAgICAgIGxldCBzZWNvbmQgPSBuZXcgRXhwVmFsKGN1cnJGbGQuZ2V0VHlwZSgpLCBmYWxzZSxcclxuICAgICAgICAgICAgICBjb21wVG8uR2V0RmllbGRWYWx1ZShjdXJyRmxkSWQpKTtcclxuXHJcbiAgICAgICAgICAgIHJlcyA9IEV4cHJlc3Npb25FdmFsdWF0b3IudmFsX2NtcF9hbnkoZmlyc3QsIHNlY29uZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzICE9PSAwKVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGVycilcclxuICAgICAgICAgICAgLy8gb25lIG9mIHRoZSB2YWx1ZXMgd2UgYXJlIGNvbXBhcmluZyB1c2luZyB2bF9jbXBfYW55ICBpcyBudWxsIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTnVsbFZhbHVlRXhjZXB0aW9uKVxyXG4gICAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIiBpbiBSZWNvcmQuQ29tcGFyZVRvIG51bGwgdmFsdWUgd2FzIHJlYWNoZWRcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlcyA9IC0xO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TW9kZSgpOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGU7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcmVjb3JkIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBqdXN0IGNyZWF0ZWQgYW5kIG5vIHJlY29yZCBzdWZmaXggd2FzIHlldFxyXG4gIC8vLyAgIHByb2Nlc3NlZCBvbiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNOZXdSZWMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmV3UmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhlIFhNTCBzdHJpbmcgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+aW5kZXggb2YgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRGaWVsZERhdGFYTUwoZmxkSWR4OiBudW1iZXIsIGdldE9sZFZhbDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgZmxkVmFsOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKCFnZXRPbGRWYWwpXHJcbiAgICAgIGZsZFZhbCA9IHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpO1xyXG4gICAgZWxzZVxyXG4gICAgICBmbGRWYWwgPSAoPEZpZWxkPih0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCkpKS5nZXRPcmlnaW5hbFZhbHVlKCk7XHJcbiAgICBpZiAoZmxkVmFsID09IG51bGwpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFJlY29yZC5idWlsZEZpZWxkc0RhdGEoKSBudWxsIGZpZWxkIHZhbHVlIVxcbkZpZWxkIGlkOiBcIiArIGZsZElkeCk7XHJcblxyXG4gICAgbGV0IHRtcEJ1Zjogc3RyaW5nID0gdGhpcy5nZXRYTUxGb3JWYWx1ZShmbGRJZHgsIGZsZFZhbCk7XHJcbiAgICByZXR1cm4gWG1sUGFyc2VyLmVzY2FwZSh0bXBCdWYudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGZpZWxkIHRhYmxlIGVpdGhlciBvZiBEYXRhVmlld1Jvb3QgKCdkdkhlYWRlcicpIG9yIG9mIFRhYmxlQ2FjaGVcclxuICAvLy8gZHYgYW5kIHRhYmxlQ2FjaGUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBmaWVsZFRhYmxlIDwvcmV0dXJucz5cclxuICBnZXRGaWVsZHNUYWIoKTogRmllbGRzVGFibGUge1xyXG4gICAgaWYgKHRoaXMuX2RhdGF2aWV3ICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gPEZpZWxkc1RhYmxlPnRoaXMuX2RhdGF2aWV3LkdldEZpZWxkc1RhYigpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuX3RhYmxlQ2FjaGUuRmxkc1RhYjtcclxuICB9XHJcblxyXG4gIC8vIFRPRE8gOiBjaGVjayBob3cgdG8gaW1wbGVtZW50IGRlc3RydWN0b3JzXHJcbiAgLy8gflJlY29yZCgpXHJcbiAgLy8ge1xyXG4gIC8vIFx0dGhpcy5yZW1vdmVSZWNGcm9tRGMoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGluaXRpYWwgZmllbGQgdmFsdWVzIGZvciBmaWVsZHMgdGhhdCBoYXMgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtPiAgY2xvYmJlcmVkT25seSBpcyB0cnVlIGlmIHdlIHdhbnQgdG8gaW5pdCBvbmx5IHRoZSB2YWx1ZXMgb2YgdGhlIHZpcnR1YWxzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uIDwvcGFyYW0+XHJcbiAgcHVibGljIHNldEluaXRpYWxGbGRWYWxzKGNsb2JiZXJlZE9ubHk6IGJvb2xlYW4sIGlzTmV3UmVjOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyLCBzaXplO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSBudWxsO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZCh0cnVlKTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XHJcbiAgICAgIC8vIHB1dCBpbml0aWFsIHZhbHVlcyB0byB0aGUgZmllbGRzIHVzaW5nIHRoZSBNYWdpYyBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIGlmICh0aGlzLl9maWVsZHNEYXRhW2ldID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLl9maWVsZHNEYXRhW2ldID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgZmxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgdGhpcy5fZmllbGRzRGF0YVtpXSA9IGZsZC5nZXROZXdSZWNWYWx1ZShjbG9iYmVyZWRPbmx5KTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmV3UmVjICYmIGZsZC5Jc1ZpcnR1YWwgJiYgIWZsZC5pc051bGwoKSlcclxuICAgICAgICAgIHRoaXMuY2xlYXJGbGFnKGZsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19OVUxMKTtcclxuXHJcbiAgICAgICAgaWYgKGZsZC5Jc1ZpcnR1YWwgJiYgZmxkLmdldE1vZGlmaWVkQXRMZWFzdE9uY2UoKSlcclxuICAgICAgICAgIHRoaXMuc2V0RmxhZyhmbGQuZ2V0SWQoKSwgUmVjb3JkLkZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IFwidW5kZWZpbmVkXCIpXHJcbiAgICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gZmxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIGlkIG9mIHRoZSByZWNvcmQgYW5kIGFuIGFwcHJvcHJpYXRlIGhhc2gga2V5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBzZXRJZChjSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5faWQgPSBjSWQ7XHJcbiAgICB0aGlzLl9oYXNoS2V5ID0gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgdGhlIGRiVmlld1Jvd0lkIG9mIHRoZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY0lkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHNldERCVmlld1Jvd0lkeChyb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmRiVmlld1Jvd0lkeCA9IHJvd0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gZGJWaWV3Um93SWQgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgZ2V0REJWaWV3Um93SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYlZpZXdSb3dJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgaW5wdXQgc3RyaW5nIGFuZCBmaWxsIGlubmVyIGRhdGEgLSByZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IFN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19SRUMpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQy5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICBpc0N1cnJSZWMgPSB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLkZpbGxJbm5lckRhdGEoKSBvdXQgb2YgYm91bmRzXCIpO1xyXG4gICAgcmV0dXJuIGlzQ3VyclJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgcmVjb3JkIC0gcmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlY29yZCBpcyB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+dGhlIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlczwvcGFyYW0+XHJcbiAgcHJvdGVjdGVkIGluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogU3RyaW5nLCB2YWx1ZVN0cjtcclxuICAgIGxldCByZWNGaWVsZHNEYXRhOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHJlY0ZsYWdzOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaXNDdXJyUmVjOiBib29sZWFuO1xyXG5cclxuICAgIGlzQ3VyclJlYyA9IHRoaXMucGVla0lzQ3VyclJlYyh0b2tlbnNWZWN0b3IpO1xyXG5cclxuICAgIGZvciAoOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICB2YWx1ZVN0ciA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX01PREU6XHJcbiAgICAgICAgICB0aGlzLl9tb2RlID0gPERhdGFNb2RpZmljYXRpb25UeXBlcz52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQ6XHJcbiAgICAgICAgICB0aGlzLnNldElkKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkJfVklFV19ST1dJRFg6XHJcbiAgICAgICAgICB0aGlzLnNldERCVmlld1Jvd0lkeChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFOlxyXG4gICAgICAgICAgaWYgKHRoaXMuVmFsdWVJbkJhc2U2NCkge1xyXG4gICAgICAgICAgICByZWNGaWVsZHNEYXRhID0gQmFzZTY0LmRlY29kZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVjRmllbGRzRGF0YSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUM6IHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0FERF9BRlRFUjpcclxuICAgICAgICAgIHRoaXMuX2FkZEFmdGVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRkxBR1M6XHJcbiAgICAgICAgICByZWNGbGFncyA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX01PRElGSUVEOlxyXG4gICAgICAgICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RDX1JFRlM6XHJcbiAgICAgICAgICB0aGlzLmZpbGxEQ1JlZih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREJQT1M6XHJcbiAgICAgICAgICB0aGlzLl9kYlBvc0Jhc2U2NFZhbCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFJlY29yZC5pbml0RWxlbWVudHMoKSB1bmtub3duIGF0dHJpYnV0ZTogXCIgKyBhdHRyaWJ1dGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLlZhbHVlSW5CYXNlNjQpIHtcclxuICAgICAgbGV0IGZsZFZhbEluQnl0ZXM6IFVpbnQ4QXJyYXkgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXMocmVjRmllbGRzRGF0YSk7XHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGEoZmxkVmFsSW5CeXRlcywgcmVjRmxhZ3MpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGEocmVjRmllbGRzRGF0YSwgcmVjRmxhZ3MsIGlzQ3VyclJlYyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlZWsgdGhlIGN1cnJfcmVjIHZhbHVlIGZyb20gdGhlIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0aGVcIj50b2tlbnMgb2YgdGhlIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyBpbiB0aGUgdGFnPC9wYXJhbT5cclxuICBwcm90ZWN0ZWQgcGVla0lzQ3VyclJlYyh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICBhdHRyaWJ1dGUgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGopKTtcclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQykge1xyXG4gICAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG4gICAgICAgIHJldHVybiBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZFZhbEluQnl0ZXM6IFVpbnQ4QXJyYXksIHJlY0ZsYWdzOiBzdHJpbmcpOiB2b2lkO1xyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZHNWYWw6IHN0cmluZywgcmVjRmxhZ3M6IHN0cmluZywgaXNDdXJyUmVjOiBib29sZWFuKTogdm9pZDtcclxuICBmaWxsRmllbGRzRGF0YShmbGRWYWxJbkJ5dGVzT3JGbGRzVmFsOiBhbnksIHJlY0ZsYWdzOiBzdHJpbmcsIGlzQ3VyclJlYz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChpc0N1cnJSZWMpKVxyXG4gICAgICB0aGlzLmZpbGxGaWVsZHNEYXRhXzAoKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YV8xKGZsZFZhbEluQnl0ZXNPckZsZHNWYWwsIHJlY0ZsYWdzLCBpc0N1cnJSZWMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsRmllbGRzRGF0YV8wKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbGwgRmllbGRzRGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRzVmFsXCI+LSBzdHJpbmcgZm9yIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+dHJ1ZSBpZiB0aGlzIHJlY29yZCBpcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEZpZWxkc0RhdGFfMShmbGRzVmFsOiBzdHJpbmcsIHJlY0ZsYWdzOiBTdHJpbmcsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHZhbDogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCB0bXA6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcGFyc2VkTGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oMCk7XHJcbiAgICBsZXQgaTogbnVtYmVyLCBqID0gMCwgZnJvbSwgc2l6ZTtcclxuICAgIGxldCBjdXJyVHlwZTogU3RvcmFnZUF0dHJpYnV0ZTtcclxuICAgIGxldCB1c2VIZXg6IGJvb2xlYW47XHJcbiAgICBsZXQgZmxkOiBGaWVsZERlZiA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVOb3RQYXNzZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIGZvciAoaSA9IGZyb207IGogPCBzaXplOyBpKyssIGorKykge1xyXG4gICAgICBmbGQgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICBjdXJyVHlwZSA9IGZsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgICB1c2VIZXggPSAoRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpID4gMSB8fFxyXG4gICAgICAgIGN1cnJUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8XHJcbiAgICAgICAgY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSB8fFxyXG4gICAgICAgIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKGN1cnJUeXBlKSk7XHJcblxyXG4gICAgICAvLyBRY3IgIzk0MDQ0MyA6IE9sZCBmYXNoaW9uIGZsYWdzIGFyZSBzdGlsbCBiZWluZyB1c2VkIGJ5IHJlc2lkZW50IHRhYmxlLiBTbyBjaGVjayB0aGVtIDFzdCBjb3ogd2UgIG1pZ2h0IGdldCBleGNlcHRpb24gb3RoZXJ3aXNlLlxyXG4gICAgICAvLyBUaGUgZmxhZ3MgZm9yIHJlc2lkZW50IGFyZSB2ZXJ5IHNpbXBsZSwgb25seSAyIG9wdGlvbnMuICcuJyA9IGZhbHNlLCAnLycgPSB0cnVlLlxyXG4gICAgICAvLyBXZSBrZWVwIHVzaW5nIGl0IGZvciByZXNpZGVudCwgc2luY2UgaW4gdGhlIHNlcnZlciBzaWRlIHdlIGRvIG5vdCBrbm93IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgeG1sIGZvciByaWNoY2xpZW50IG9yIGZvciBCQyBhdCB0aGUgY3JlYXRpb24gc3RhZ2UuXHJcbiAgICAgIC8vIFNpbmNlIHdlIGNvdWxkbid0IGNyZWF0ZSBkaWZmZXJlbnQgZmxhZ3MgZm9yIHJpY2gsIHdlIHdpbGwgdXNlIHRoZSBvbGQgZmxhZ3MgaGVyZS5cclxuXHJcbiAgICAgIGlmIChyZWNGbGFnc1tqXSA9PT0gJy4nKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gMDtcclxuICAgICAgZWxzZSBpZiAocmVjRmxhZ3Nbal0gPT09ICcvJylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEVhY2ggZmxhZyB3aWxsIGFwcGVhciBpbiB0aGUgeG1sIGluIDIgY2hhcnMgcmVwcmVzZW50aW5nIGhleCB2YWx1ZSAoXCI0MlwiIGZvciAweDQyKS5cclxuICAgICAgICB0bXAgPSByZWNGbGFncy5zdWJzdHIoaiAqIDIsIDIpO1xyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gcGFyc2VJbnQodG1wLCAxNik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNhdmUgdGhlIGluZCB0aGF0IHRoZSB2YWx1ZSB3YXMgbm90IHBhc3NlZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgIHZhbHVlTm90UGFzc2VkID0gUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCk7XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2ldID0gdGhpcy5fZmxhZ3NbaV0gJiB+UmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtpXSA9IHRoaXMuX2ZsYWdzW2ldO1xyXG5cclxuICAgICAgaWYgKFJlY29yZC5GTEFHX1VQREFURUQgPT09ICh0aGlzLl9mbGFnc1tpXSAmIFJlY29yZC5GTEFHX1VQREFURUQpKVxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodmFsdWVOb3RQYXNzZWQpIHtcclxuICAgICAgICBpZiAoUmVjb3JkLkZMQUdfTlVMTCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfTlVMTCkpIHtcclxuICAgICAgICAgIC8vIG51bGwgaW5kIGlzIG9uLCBqdXN0IHB1dCBhbnkgdmFsdWUgaW4gdGhlIGZpZWxkLlxyXG4gICAgICAgICAgdmFsID0gZmxkLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGNvcHkgdGhlIGV4aXN0aW5nIHZhbHVlIGZyb20gdGhlIGV4aXN0aW5nIGN1cnIgcmVjLlxyXG4gICAgICAgICAgdmFsID0gKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkuR2V0RmllbGRWYWx1ZShpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsID0gUmVjb3JkVXRpbHMuZGVTZXJpYWxpemVJdGVtVmFsKGZsZHNWYWwsIGN1cnJUeXBlLCBmbGQuZ2V0U2l6ZSgpLCB1c2VIZXgsIGZsZC5nZXRDZWxsc1R5cGUoKSwgcGFyc2VkTGVuKTtcclxuICAgICAgICBmbGRzVmFsID0gZmxkc1ZhbC5zdWJzdHIocGFyc2VkTGVuLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0SW5pdGlhbEZsZFZhbHMoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5pdCBkY1JlZnMgdmVjdG9yIGFuZCBpbmNyZWFzZSByZWZlcmVuY2UgY291bnRlciB0byBEYXRhVmlld1Jvb3QuY291bnRlckFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+aW4gZm9ybSBcImRpdF9pZHgsZGNfaWQkZGl0X2lkeCxkY19pZCQuLi5cIjwvcGFyYW0+XHJcbiAgZmlsbERDUmVmKHZhbHVlU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlU3RyKSkge1xyXG4gICAgICBsZXQgY291cGxlczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKHZhbHVlU3RyLCBcIiRcIik7XHJcbiAgICAgIGxldCBzaXplOiBudW1iZXIgPSBjb3VwbGVzLmxlbmd0aDtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzaXplOyBpID0gaSArIDEpIHtcclxuICAgICAgICB0aGlzLl9kY1JlZnMuQWRkKERjVmFsdWVzUmVmZXJlbmNlLlBhcnNlKGNvdXBsZXNbaV0sIHRoaXMuX2RhdGF2aWV3KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgZmllbGRzIHZhbHVlIGZvciB0aGUgWE1MIHN0cmluZyBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBidWlsZEZpZWxkc0RhdGEobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBnZXRPbGRWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCB0bXBTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG5cclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSB0aGlzLmdldEZyb21GbGRJZHgoaXNDdXJyUmVjKTtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQoaXNDdXJyUmVjKTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgLy8gRG8gbm90IHNlcmlhbGl6ZSB0aGUgZmllbGQgdmFsdWUgd2hpY2ggaXMgbm90IGV4cG9zZWQgdG8gY2xpZW50LlxyXG4gICAgICBsZXQgZmxkOiBGaWVsZCA9ICA8RmllbGQ+IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmIChmbGQuSXNFeHBvc2VkVG9DbGllbnQgPT09IGZhbHNlKVxyXG4gICAgICAgIHRoaXMuc2V0U2hyaW5rRmxhZyhpKTtcclxuXHJcbiAgICAgIC8vIGRvIG5vdCB3cml0ZSB0aGUgdmFsdWUgaWYgdGhlIHNocmluayBmbGFnIGlzIG9uLlxyXG4gICAgICBpZiAoUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCkpXHJcbiAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICB0bXBTdHIuQXBwZW5kKHRoaXMuZ2V0RmllbGREYXRhWE1MKGksIGdldE9sZFZhbCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGlmIG5vbmUgb2YgdGhlIHZhbHVlcyBoYWQgY2hhbmdlZC4gcGFzcyBcIiBcIiBpbnN0ZWFkIG9mIFwiXCIuXHJcbiAgICBpZiAodG1wU3RyLkxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0bXBTdHIuQXBwZW5kKFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZCh0bXBTdHIuVG9TdHJpbmcoKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0WE1MRm9yVmFsdWUoZmxkSWR4OiBudW1iZXIsIGZsZFZhbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUDsgLy8gY2VsbCdzIGF0dHJpYnV0ZSwgaWYgdGhlIGZpZWxkJ3MgYXR0cmlidXRlIGlzIGEgdmVjdG9yXHJcbiAgICBsZXQgZmxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0VHlwZShmbGRJZHgpOyAvLyBmaWVsZCdzIGF0dHJpYnV0ZVxyXG4gICAgaWYgKGZsZEF0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgIGNlbGxBdHRyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpLmdldENlbGxzVHlwZSgpO1xyXG5cclxuICAgIGxldCB0b0Jhc2U2NDogYm9vbGVhbiA9IEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxO1xyXG4gICAgcmV0dXJuIFJlY29yZC5zZXJpYWxpemVJdGVtVmFsKGZsZFZhbCwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgZmllbGQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5zaG91bGQgYmUgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgcmVjPC9wYXJhbT5cclxuICBnZXRGcm9tRmxkSWR4KGlzQ3VyclJlYzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0Uk1JZHgoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNDdXJyUmVjXCI+c2hvdWxkIGJlIHRydWUgZm9yIHRoZSBjdXJyZW50IHJlYzwvcGFyYW0+XHJcbiAgZ2V0U2l6ZUZsZChpc0N1cnJSZWM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRSTVNpemUoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbik6IHZvaWQ7XHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBmb3JjZUJ1aWxkOiBib29sZWFuKTogdm9pZDtcclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGZvcmNlQnVpbGQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZm9yY2VCdWlsZCkpXHJcbiAgICAgIHRoaXMuYnVpbGRYTUxfMChtZXNzYWdlLCBpc0N1cnJSZWMpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmb3JjZUJ1aWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRYTUxfMChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiAgdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkWE1MXzEobWVzc2FnZSwgaXNDdXJyUmVjLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZXNzYWdlXCI+dGhlIHhtbCBtZXNzYWdlIHRvIGFwcGVuZCB0bzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5pbmRpY2F0ZSB0aGlzIHJlY29yZCBhcyB0aGUgY3VycmVudCByZWNvcmQ8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBidWlsZFhNTF8xKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbiwgZm9yY2VCdWlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJlY0ZsYWdzOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgbGV0IGZyb206IG51bWJlciwgc2l6ZSwgaTtcclxuICAgIGxldCBhRmxhZzogbnVtYmVyO1xyXG4gICAgbGV0IGhleEZsYWc6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQpXHJcbiAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0ICYmIHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUgJiZcclxuICAgICAgICB0aGlzLl9tb2RlICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlICYmICFpc0N1cnJSZWMpXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxuICAgICAgICAgICAgPFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQyk7XHJcbiAgICBpZiAodGhpcy5faWQgPiBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9JRCArIFwiPVxcXCJcIiArIHRoaXMuX2lkICsgXCJcXFwiXCIpO1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PREUgKyBcIj1cXFwiXCIgKyA8c3RyaW5nPnRoaXMuX21vZGUgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fcHJldiAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSICsgXCI9XFxcIlwiICsgdGhpcy5fcHJldi5nZXRJZCgpICsgXCJcXFwiXCIpO1xyXG5cclxuICAgIC8vIGN1cnJlbnQgcmVjb3JkJ3MgbW9kZSBpcyBuZXZlciBjbGVhcmVkLCB0aGUgd2hvbGUgcmVjb3JkIGlzIGNsZWFyZWQgd2hlbiB3ZSBtb3ZlIG9uLlxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmICFpc0N1cnJSZWMpXHJcbiAgICAgIHRoaXMuY2xlYXJNb2RlKCk7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfQVRUUl9WQUxVRSArIFwiPVxcXCJcIik7XHJcblxyXG4gICAgaWYgKCFmb3JjZUJ1aWxkICYmIGlzQ3VyclJlYylcclxuICAgICAgdGhpcy5zZXRTaHJpbmtGbGFncygpO1xyXG5cclxuICAgIGxldCBnZXRPbGRWYWw6IGJvb2xlYW47XHJcbiAgICBpZiAodGhpcy5TeW5jZWQpXHJcbiAgICAgIGdldE9sZFZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB0YXNrOiBUYXNrID0gPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpO1xyXG4gICAgICBnZXRPbGRWYWwgPSAoIWlzQ3VyclJlYyAmJiAodGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgfHxcclxuICAgICAgICB0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX0NPTlRST0wpICYmXHJcbiAgICAgICB0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCkgIT0gbnVsbCAmJiAoKDxSZWNvcmQ+IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSkpLmdldElkKCkgPT09IHRoaXMuX2lkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkRmllbGRzRGF0YShtZXNzYWdlLCBpc0N1cnJSZWMsIGdldE9sZFZhbCk7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIlxcXCJcIik7XHJcbiAgICByZWNGbGFncyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgZnJvbSA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIC8vIFFDUiA0Nzk2ODY6IHNlbmQgRkxBR19DUlNSX01PRCBmcm9tIHRoZSBoaXN0b3J5LCB0aHVzIGxldCB0aGUgc2VydmVyIGtub3cgaWYgYSBmaWVsZFxyXG4gICAgLy8gd2FzIHVwZGF0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzZW50IGl0IHRvIElUIChoZW5jZSwgYSBEQk1TIGFjdGlvbiBpcyBuZWVkZWQpLlxyXG4gICAgZm9yIChpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpKyspIHtcclxuICAgICAgYUZsYWcgPSB0aGlzLl9mbGFnc0hpc3RvcnlbaV07XHJcbiAgICAgIGFGbGFnID0gYUZsYWcgJiBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEO1xyXG4gICAgICBhRmxhZyA9IGFGbGFnIHwgdGhpcy5fZmxhZ3NbaV07XHJcblxyXG4gICAgICAvLyBFYWNoIGZsYWcgd2lsbCBhcHBlYXIgaW4gdGhlIHhtbCBpbiAyIGNoYXJzIHJlcHJlc2VudGluZyBoZXggdmFsdWUgKFwiNDJcIiBmb3IgMHg0MikuXHJcbiAgICAgIGhleEZsYWcgPSBOTnVtYmVyLlRvU3RyaW5nKGFGbGFnLCBcIlgyXCIpO1xyXG4gICAgICByZWNGbGFncy5BcHBlbmQoaGV4RmxhZyk7XHJcblxyXG4gICAgICAvLyBjbGVhciB0aGUgc2hyaW5rIGZsYWdcclxuICAgICAgaWYgKGlzQ3VyclJlYylcclxuICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IDxudW1iZXI+KHRoaXMuX2ZsYWdzW2ldICYgflJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUyArIFwiPVxcXCJcIiArIHJlY0ZsYWdzLlRvU3RyaW5nKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgaWYgKGlzQ3VyclJlYykge1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuTW9kaWZpZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX01PRElGSUVEICsgXCI9XFxcIjFcXFwiXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2xpbmtzRmxkc1BvcyAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfREJQT1MgKyBcIj1cXFwiXCIgKyBYbWxQYXJzZXIuZXNjYXBlKHRoaXMuX2xpbmtzRmxkc1BvcykgKyBcIlxcXCIgXCIpO1xyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNjYW4gdGhlIHJlY29yZCBhbmQgY29tcGFyZSBmaWVsZHMgd2l0aCBwYXJhbGxlbCBzZXJ2ZXIgY3VyciByZWMsXHJcbiAgLy8vICAgc2V0IHNocmluayBmbGFnIG9uIGlmIGZpZWxkcyBhcmUgZXF1YWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHJvdGVjdGVkIHNldFNocmlua0ZsYWdzKCk6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHNlcnZlckN1cnJSZWM6IFJlY29yZCA9IHRoaXMuX2RhdGF2aWV3LmdldFNlcnZlckN1cnJSZWMoKTtcclxuICAgIC8vIGNhbm5vdCBzaHJpbmsgaWYgd2UgZG8gbm90IGtub3cgd2hhdCBjdXJyIHJlYyB0aGUgc2VydmVyIGhvbGRzLlxyXG4gICAgaWYgKHNlcnZlckN1cnJSZWMgPT0gbnVsbClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5mbGRWYWxzRXF1YWwoc2VydmVyQ3VyclJlYywgaSkgfHwgKFJlY29yZC5GTEFHX05VTEwgPT09ICh0aGlzLl9mbGFnc1tpXSAmIFJlY29yZC5GTEFHX05VTEwpKSkge1xyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gdGhpcy5fZmxhZ3NbaV0gfCBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgc2hyaW5rIGZsYWcgZm9yIHNwZWNpZmljIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRJZHhcIj48L3BhcmFtPlxyXG4gIHNldFNocmlua0ZsYWcoZmxkSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZsYWdzW2ZsZElkeF0gfD0gUmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyBmaWVsZCB2YWx1ZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUgZnJvbSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIFNldEZpZWxkVmFsdWUoaWR4OiBudW1iZXIsIGlzTnVsbDogYm9vbGVhbiwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGlkeCk7XHJcbiAgICBmaWVsZC5VcGRhdGVOdWxsKGlzTnVsbCwgdGhpcyk7XHJcblxyXG4gICAgdmFsdWUgPSB0aGlzLkNoZWNrTWdWYWx1ZSh2YWx1ZSwgaXNOdWxsLCBmaWVsZCk7XHJcbiAgICB0aGlzLl9maWVsZHNEYXRhW2lkeF0gPSB2YWx1ZTtcclxuICAgIGZpZWxkLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICB0aGlzLmNsZWFyRmxhZyhmaWVsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19JTlZBTElEKTtcclxuICAgIGZpZWxkLmludmFsaWRhdGUodHJ1ZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmaWVsZCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgZmllbGQgaW5kZXg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmaWVsZC4gbXVzdCBiZSBpbiB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3JtYXQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2V0UmVjb3JkVXBkYXRlZFwiPnRlbGxzIHdoZXRoZXIgdG8gZGVmaW5lIHRoaXMgcmVjb3JkIGFzIHVwZGF0ZWQ8L3BhcmFtPlxyXG4gIHNldEZpZWxkVmFsdWUoZmxkSWR4OiBudW1iZXIsIG1nVmFsOiBzdHJpbmcsIHNldFJlY29yZFVwZGF0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBmbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KTtcclxuXHJcbiAgICAvLyBkb24ndCBjaGFuZ2UgdmFsdWUgd2hlbiByZWZlcmVuY2VzIGFyZSBlcXVhbCBvciBpZiB0aGUgdGFzayBtb2RlIGlzIFF1ZXJ5XHJcbiAgICBpZiAoZmxkLlByZXZJc051bGwoKSA9PT0gZmxkLmlzTnVsbCgpICYmIG1nVmFsID09PSB0aGlzLkdldEZpZWxkVmFsdWUoZmxkSWR4KSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuXHJcbiAgICBtZ1ZhbCA9IHRoaXMuQ2hlY2tNZ1ZhbHVlKG1nVmFsLCBmbGQuaXNOdWxsKCksIGZsZCk7XHJcblxyXG4gICAgaWYgKGZsZElkeCA+PSAwICYmIGZsZElkeCA8IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbZmxkSWR4XSA9IG1nVmFsO1xyXG5cclxuICAgICAgLy8gUUNSICM5ODY3MTU6IFRoZSBmb2xsb3dpbmcgc2V0RmxhZygpIGNhbGwgd2FzIHJlbW92ZWQgdG8gc29sdmUgdGhlIGJ1Zy5cclxuICAgICAgLy8gaXQgY2F1c2VkIG1hcmtpbmcgYSB2YXJpYWJsZSBhcyBtb2RpZmllZCBldmVuIGlmIHRoZSBjaGFuZ2UgaXMgZHVlIHRvIHRoZVxyXG4gICAgICAvLyBjb21wdXRlIG9mIHRoZSByZWNvcmQuIFRoZSBGTEFHX01PRElGSUVEIGZsYWcgaXMgc2V0IGNvcnJlY3RseSBpbiB0aGVcclxuICAgICAgLy8gRmllbGQuc2V0VmFsdWUoKSBtZXRob2QuXHJcbiAgICAgIC8vIHNldEZsYWcoZmxkSWR4LCBGTEFHX01PRElGSUVEKTtcclxuICAgICAgaWYgKHNldFJlY29yZFVwZGF0ZWQpIHtcclxuICAgICAgICAvLyBzZXQgbW9kaWZ5IG9ubHkgaWYgdGhlIGZpZWxkIGlzIHBhcnQgb2YgdGhlIGRhdGF2aWV3LlxyXG4gICAgICAgIGlmIChmbGQuUGFydE9mRGF0YXZpZXcpXHJcbiAgICAgICAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBoZXJlIGR1ZSB0byB0YXNrIGNsb3NpbmcgLCBhbmQgZm91bmQgdGhhdCB0aGUgY3VycmVudCByZWMncyBmbGQgaXMgdXBkYXRlZFxyXG4gICAgICAgIC8vIHRoZW4gc2V0IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2VcclxuXHRcdC8vIFNvIHRoYXQgY29tbWl0IHRyYW5zYWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBzZXBhcmF0ZWx5IGF0IHNlcnZlciBzaWRlLlxyXG4gICAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICg8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RhdGF2aWV3LnNldENoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRNb2RlKERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIFJlY29yZC5zZXRGaWVsZFZhbHVlKCkgaWxsZWdhbCBmaWVsZCBpbmRleDogXCIgKyBmbGRJZHgpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgbWd2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmxkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENoZWNrTWdWYWx1ZShtZ1ZhbDogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4sIGZsZDogRmllbGQpOiBzdHJpbmcge1xyXG4gICAgaWYgKG1nVmFsID09PSBudWxsIHx8IGlzTnVsbCkge1xyXG4gICAgICBtZ1ZhbCA9IGZsZC5nZXROdWxsVmFsdWUoKTtcclxuICAgICAgaWYgKG1nVmFsID09PSBudWxsKVxyXG4gICAgICAgIG1nVmFsID0gZmxkLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcblxyXG4gICAgfVxyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IGZsZC5nZXRTaXplKCk7XHJcblxyXG4gICAgLy8gdHJ1bmNhdGUgdmFsdWVzIHRoYXQgYXJlIGxvbmdlciB0aGFuIHRoZSBzdG9yYWdlIHNpemVcclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIGZsZC5nZXRUeXBlKCkgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBub3QgY2hhcmFjdGVycyAoSlBOOiBEQkNTIHN1cHBvcnQpXHJcbiAgICAgIGlmIChtZ1ZhbCAhPT0gbnVsbCAmJiBVdGlsU3RyQnl0ZU1vZGUubGVuQihtZ1ZhbCkgPiBzaXplKVxyXG4gICAgICAgIG1nVmFsID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKG1nVmFsLCBzaXplKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAobWdWYWwgIT09IG51bGwgJiYgbWdWYWwubGVuZ3RoID4gc2l6ZSlcclxuICAgICAgICBtZ1ZhbCA9IG1nVmFsLnN1YnN0cigwLCBzaXplKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZ1ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIFwibW9kaWZpZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRNb2RpZmllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgXCJtb2RpZmllZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0TW9kaWZpZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RpZmllZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJ1cGRhdGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0VXBkYXRlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcIm1vZGlmaWVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRVcGRhdGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdXBkYXRlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBmaWVsZCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgdGhlIGZpZWxkIHZhbHVlPC9yZXR1cm5zPlxyXG4gIEdldEZpZWxkVmFsdWUoZmxkSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHZhbDogU3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZmxkSWR4ID49IDAgJiYgZmxkSWR4IDwgdGhpcy5fZmllbGRzRGF0YS5sZW5ndGgpXHJcbiAgICAgIHZhbCA9IHRoaXMuX2ZpZWxkc0RhdGFbZmxkSWR4XTtcclxuICAgIHJldHVybiB2YWwudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgY29weSBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVwbGljYXRlKCk6IFJlY29yZCB7XHJcbiAgICBsZXQgcmVjb3JkOiBSZWNvcmQgPSBuZXcgUmVjb3JkKHRoaXMpO1xyXG4gICAgcmVjb3JkLl9maWVsZHNEYXRhID0gdGhpcy5fZmllbGRzRGF0YS5zbGljZSgpO1xyXG4gICAgcmVjb3JkLl9mbGFncyA9IHRoaXMuX2ZsYWdzLnN1YmFycmF5KDApO1xyXG4gICAgcmVjb3JkLl9mbGFnc0hpc3RvcnkgPSB0aGlzLl9mbGFnc0hpc3Rvcnkuc3ViYXJyYXkoMCk7XHJcbiAgICByZWNvcmQuX2RjUmVmcyA9IHRoaXMuX2RjUmVmcy5DbG9uZSgpO1xyXG4gICAgcmV0dXJuIHJlY29yZDtcclxuICB9XHJcblxyXG4gIHNldFNhbWVBcyhyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4sIHJJZDogbnVtYmVyKTogdm9pZDtcclxuICBzZXRTYW1lQXMocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuKTogdm9pZDtcclxuICBzZXRTYW1lQXMocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuLCBySWQ/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICB0aGlzLnNldFNhbWVBc18wKHJlYywgcmVhbE9ubHksIHJJZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2V0U2FtZUFzXzEocmVjLCByZWFsT25seSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGlzIHJlY29yZCB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZVxyXG4gIC8vLyAgIG9mIHRoZSBnaXZlbiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHNvdXJjZSByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicklkXCI+dGhlIG5ldyBJZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIHNldFNhbWVBc18wKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbiwgcklkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U2FtZUFzKHJlYywgcmVhbE9ubHkpO1xyXG4gICAgdGhpcy5zZXRJZChySWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyByZWNvcmQgdG8gYmUgdGhlIHNhbWUgYXMgdGhvc2VcclxuICAvLy8gICBvZiB0aGUgZ2l2ZW4gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBzb3VyY2UgcmVjb3JkPC9wYXJhbT5cclxuICBwcml2YXRlIHNldFNhbWVBc18xKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faWQgPSByZWMuX2lkO1xyXG4gICAgdGhpcy5faGFzaEtleSA9IHJlYy5faGFzaEtleTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2RhdGF2aWV3LmdldFRhc2soKS50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKS8qJ1AnKi8pXHJcbiAgICAgIHRoaXMuc2V0TW9kZShyZWMuX21vZGUpO1xyXG5cclxuICAgIHRoaXMuX2FkZEFmdGVyID0gcmVjLl9hZGRBZnRlcjtcclxuXHJcbiAgICBpZiAocmVhbE9ubHkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgYWZpZWxkOiBGaWVsZCA9IDxGaWVsZD5yZWMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgaWYgKCFhZmllbGQuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gcmVjLl9maWVsZHNEYXRhW2ldO1xyXG4gICAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSByZWMuX2ZsYWdzW2ldO1xyXG4gICAgICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gcmVjLl9mbGFnc0hpc3RvcnlbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fZmllbGRzRGF0YSA9IHJlYy5fZmllbGRzRGF0YTtcclxuICAgICAgdGhpcy5fZmxhZ3MgPSByZWMuX2ZsYWdzO1xyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnkgPSByZWMuX2ZsYWdzSGlzdG9yeTtcclxuICAgIH1cclxuICAgIHRoaXMuX21vZGlmaWVkID0gcmVjLl9tb2RpZmllZDtcclxuICAgIHRoaXMuX2RhdGF2aWV3ID0gcmVjLl9kYXRhdmlldztcclxuICAgIHRoaXMuX2NvbXB1dGVkID0gcmVjLl9jb21wdXRlZDtcclxuICAgIHRoaXMuX3VwZGF0ZWQgPSByZWMuX3VwZGF0ZWQ7XHJcbiAgICB0aGlzLnNldERjUmVmcyhyZWMuX2RjUmVmcyk7XHJcblxyXG4gICAgLy8gUUNSICM0MjM1NTI6IHBhcnRpYWwgZml4IC0gd2UgbmVlZCB0byBnbyBvdmVyIGFsbCB0aGUgcmVjLm5leHQvcHJldiBhbmQgbWFrZSBzdXJlIHRoaXMgcmVjb3JkIGRvZXMgbm90IGFwcGVhclxyXG4gICAgaWYgKHJlYy5fbmV4dCAhPT0gdGhpcykge1xyXG4gICAgICB0aGlzLl9uZXh0ID0gcmVjLl9uZXh0O1xyXG4gICAgfVxyXG4gICAgaWYgKHJlYy5fcHJldiAhPT0gdGhpcykge1xyXG4gICAgICB0aGlzLl9wcmV2ID0gcmVjLl9wcmV2O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgSXNOdWxsKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19OVUxMKSA9PT0gUmVjb3JkLkZMQUdfTlVMTCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIGEgbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0xpbmtJbnZhbGlkKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19JTlZBTElEKSA9PT0gUmVjb3JkLkZMQUdfSU5WQUxJRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzRmxkTW9kaWZpZWQoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX01PRElGSUVEKSA9PT0gUmVjb3JkLkZMQUdfTU9ESUZJRUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBtb2RpZmllZCBhdCBsZWFzdCBvbmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIElzRmxkTW9kaWZpZWRBdExlYXN0T25jZShmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFKSA9PT0gUmVjb3JkLkZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNGbGRVcGRhdGVkKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19VUERBVEVEKSA9PT0gUmVjb3JkLkZMQUdfVVBEQVRFRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgZmllbGQgdG8gaGF2ZSBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgcHVibGljIHNldEZsYWcoZmxkSWR4OiBudW1iZXIsIGFGbGFnOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgdGhpcy5fZmxhZ3NbZmxkSWR4XSA9IHRoaXMuX2ZsYWdzW2ZsZElkeF0gfCBhRmxhZztcclxuICAgIC8vIE5vdGU6IHdlIG9ubHkgc2V0IHRoZSBoaXN0b3J5IGZsYWdzLiBXZSBkb250IGNsZWFyIHRoZW0gaGVyZS4gV2Ugb25seSBjbGVhciB0aGVtIGFmdGVyIFhNTCB3YXMgZHVtcGVkLlxyXG4gICAgaWYgKGFGbGFnID09PSBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEKVxyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbZmxkSWR4XSA9IHRoaXMuX2ZsYWdzSGlzdG9yeVtmbGRJZHhdIHwgYUZsYWc7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGEgZmllbGQgdG8gaGF2ZSBhIG5vbi1udWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIGNsZWFyRmxhZyhmbGRJZHg6IG51bWJlciwgYUZsYWdzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgdGhpcy5fZmxhZ3NbZmxkSWR4XSA9IHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiB+YUZsYWdzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIHRoZSBmbGFncyBoaXN0b3J5LiBUaGlzIHNob3VsZCBvbmx5IGJlIGRvbmUgYWZ0ZXIgYSBjb21taXQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckZsYWdzSGlzdG9yeSgpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSlcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciBmbGFnIGZvciBhbGwgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckZsYWdzKGFGbGFnczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZmxhZ3MubGVuZ3RoOyBpID0gaSArIDEpXHJcbiAgICAgIHRoaXMuY2xlYXJGbGFnKGksIGFGbGFncyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgZmxhZyBmb3IgYWxsIHJlYWwgZmllbGRzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckZsYWdzRm9yUmVhbE9ubHkoYUZsYWdzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmICghZmllbGQuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckZsYWcoaSwgYUZsYWdzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIGEgc3BlY2lmaWMgZmllbGQgZmxhZyBmcm9tIHRoZSBoaXN0b3J5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckhpc3RvcnlGbGFnKGZsZElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmxhZ3NIaXN0b3J5ICE9PSBudWxsICYmIGZsZElkeCA8IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpICYmIGZsZElkeCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtmbGRJZHhdID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBmbGFncyBhbmQgdGhlIHZhbGlkaXR5IG9mIHRoZSBmaWVsZCBpbmRleFxyXG4gIC8vLyAgIHRocm93cyBhbiBlcnJvciBpbiBjYXNlIG9mIGEgZmFpbHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICBjaGVja0ZsYWdzKGZsZElkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmxhZ3MgPT09IG51bGwgfHwgZmxkSWR4ID49IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpIHx8IGZsZElkeCA8IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiQ2Fubm90IGZpbmQgZmxhZ3NcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzdGFydCB0aGUgcmVjb3JkJ3Mgc2V0dGluZ3MuIFRoaXMgbWlnaHQgYmUgbmVlZGVkIGFmdGVyIGEgc2VydmVyJ3Mgcm9sbGJhY2tcclxuICAvLy8gICBvciByZXN0YXJ0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZE1vZGVcIj50aGUgb2xkIHJlY29yZCBtb2RlPC9wYXJhbT5cclxuICByZXN0YXJ0KG9sZE1vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyk6IHZvaWQge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCk7XHJcblxyXG4gICAgaWYgKG9sZE1vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lKSB7XHJcbiAgICAgIGxldCByZWM6IFJlY29yZCA9IHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKTtcclxuICAgICAgbGV0IGlzQ3VyclJlYzogYm9vbGVhbiA9IChyZWMgIT0gbnVsbCAmJiByZWMuZ2V0SWQoKSA9PT0gdGhpcy5faWQpO1xyXG5cclxuICAgICAgaWYgKCh0aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgaWYgKGlzQ3VyclJlYyAmJiAhdGFzay5nZXRBZnRlclJldHJ5KCkgJiYgdGFzay5UcnlpbmdUb0NvbW1pdCAmJiAhdGhpcy5fZGF0YXZpZXcuaW5Sb2xsYmFjaygpKVxyXG4gICAgICAgICAgb2xkTW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGU7XHJcbiAgICAgICAgZWxzZSBvbGRNb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydDtcclxuXHJcbiAgICAgIGVsc2Ugb2xkTW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5VcGRhdGU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldE1vZGUob2xkTW9kZSk7XHJcbiAgICBpZiAob2xkTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydClcclxuICAgICAgdGhpcy5zZXROZXdSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiBsYXRlQ29tcHV0ZSBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldExhdGVDb21wdXRlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fbGF0ZUNvbXB1dGUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXCJsYXRlQ29tcHV0ZVwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGxhdGVDb21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xhdGVDb21wdXRlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBcImluIGRlbGV0ZSBwcm9jZXNzXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICBzZXRJbkRlbGV0ZVByb2Nlc3ModmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbkRlbGV0ZVByb2Nlc3MgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBpbkRlbGV0ZVByb2Nlc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5EZWxldGVQcm9jZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlbW92aW5nIHRoZSByZWNvcmQsIGl0IHdpbGwgZGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudFxyXG4gIC8vLyAgIG9mIGl0cyBkYXRhIGNvbnRyb2xzIHRvIHRoZWlyIGRjVmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWNGcm9tRGMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZGNSZWZzICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RjUmVmcy5EaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcGFyZSB0aGUgZGF0YSBvZiB0aGlzIHJlY29yZCB3aXRoIHRoZSBkYXRhIG9mIGEgZGlmZmVyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgb3RoZXIgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJSZWNcIj5UUlVFIGlmIHdlIGFyZSBjb21wYXJpbmcgdHdvICdjdXJyZW50IHJlY29yZHMnIG90aGVyd2lzZSBzaG91bGQgYmUgZmFsc2UuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrT25seVBhcmV0T2ZEYXRhdmlld1wiPkZBTFNFIGlmIHdlIHdhbnQgdG8gY2hlY2sgYWxsIHRoZSBmaWVsZHMgLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbm90IHBhcnQgb2YgZGF0YSB2aWV3LjwvcGFyYW0+XHJcbiAgaXNTYW1lUmVjRGF0YShyZWM6IFJlY29yZCwgY3VyclJlYzogYm9vbGVhbiwgY2hlY2tPbmx5UGFyZXRPZkRhdGF2aWV3OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gdGhpcy5nZXRTaXplRmxkKGN1cnJSZWMpO1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSB0aGlzLmdldEZyb21GbGRJZHgoY3VyclJlYyk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGZpZWxkOiBGaWVsZDtcclxuXHJcbiAgICAvLyBjb21wYXJlIHJlZmVyZW5jZXNcclxuICAgIGlmICh0aGlzID09PSByZWMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChyZWMuZ2V0U2l6ZUZsZChjdXJyUmVjKSAhPT0gc2l6ZSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBpZiAocmVjLmdldEZyb21GbGRJZHgoY3VyclJlYykgIT09IHN0YXJ0KVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGFydCArIHNpemU7IGkrKykge1xyXG4gICAgICAgIGZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcblxyXG4gICAgICAgIGlmIChjaGVja09ubHlQYXJldE9mRGF0YXZpZXcgJiYgIWZpZWxkLlBhcnRPZkRhdGF2aWV3KVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mbGRWYWxzRXF1YWwocmVjLCBpKSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB0aHJvdyAgZXJyO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXBhcmUgdHdvIGZpZWxkIHZhbHVlcyBiZXR3ZWVuIHRoaXMgcmVjb3JkIGFuZCB0aGUgZ2l2ZW4gcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSByZWNvcmQgdG8gY29tcGFyZSB3aXRoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY29tcGFyZTwvcGFyYW0+XHJcbiAgZmxkVmFsc0VxdWFsKHJlYzogUmVjb3JkLCBmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCkuZ2V0VHlwZSgpO1xyXG4gICAgcmV0dXJuIEV4cHJlc3Npb25FdmFsdWF0b3IubWdWYWxzRXF1YWwodGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCksIHRoaXMuSXNOdWxsKGZsZElkeCksIHR5cGUsIHJlYy5HZXRGaWVsZFZhbHVlKGZsZElkeCksIHJlYy5Jc051bGwoZmxkSWR4KSwgdHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBoYXNoIGtleSBvYmplY3Qgb2YgdGhpcyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEhhc2hLZXkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNoS2V5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVjb3JkcyBhZnRlciB0aGlzIG9uZSwgaW4gYSBsaXN0IG9mIHJlY3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5leHRSZWNcIj5pcyB0aGUgbmV4dCByZWNvcmQgKG9yIG51bGwgZm9yIHRoZSBsYXN0IHJlY29yZCk8L3BhcmFtPlxyXG4gIHNldE5leHRSZWMobmV4dFJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXh0ID0gbmV4dFJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJlY29yZHMgYmVmb3JlIHRoaXMgb25lLCBpbiBhIGxpc3Qgb2YgcmVjcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJldlJlY1wiPmlzIHRoZSBwcmV2aW91cyByZWNvcmQgKG9yIG51bGwgZm9yIHRoZSBmaXJzdCByZWNvcmQpPC9wYXJhbT5cclxuICBzZXRQcmV2UmVjKHByZXZSZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldiA9IHByZXZSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZWNvcmQgd2hvc2UgbG9jYXRpb24gaXMgYmVmb3JlIHRoaXMgb25lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQcmV2UmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJlY29yZCB3aGljaCBmb2xsb3dzIHRoaXMgb25lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXROZXh0UmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmV4dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gRGNSZWZzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREY1JlZnMoKTogT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RjUmVmcy5DbG9uZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBEY1JlZnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldERjUmVmcyhuZXdEY1JlZnM6IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gICAgdGhpcy5fZGNSZWZzID0gbmV3RGNSZWZzLkNsb25lKCk7XHJcbiAgICB0aGlzLlNldERjVmFsdWVJZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIHJlYWwgdmFyaWFibGVzIHdhcyBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVhbE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGJSYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHRhYlNpemU6IG51bWJlciA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0U2l6ZSgpO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGFiU2l6ZTsgaisrKSB7XHJcbiAgICAgIC8vIGZvciBldmVyeSBtb2RpZmllZCBmaWVsZCBjaGVjayBpZiBpdCBpcyBhIHJlYWwgZmllbGRcclxuICAgICAgaWYgKCh0aGlzLl9mbGFnc1tqXSAmIFJlY29yZC5GTEFHX01PRElGSUVEKSA9PT0gUmVjb3JkLkZMQUdfTU9ESUZJRUQpIHtcclxuICAgICAgICBpZiAoISgoPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaikpLklzVmlydHVhbCkpIHtcclxuICAgICAgICAgIGJSYyA9IHRydWU7IC8vIGlmIGEgcmVhbCBtb2RpZmllZCBmaWVsZCB3YXMgZm91bmQsIHJldHVybiB3aXRoIHRydWVcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJSYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB4bWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY29yZCAtIHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgc28gd2VcclxuICAvLy8gICBjYW4gdXNlIHRoZSByZWNvcmQgcmVmZXJlbmNlIGluIGEgc3RyaW5nIGNvbmNhdGVuYXRpb24gb3BlcmF0aW9ucyBhbmQgcHJpbnQgY2FsbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIHRoaXMuYnVpbGRYTUwoc3RyLCAodGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpKS5nZXRJZCgpID09PSB0aGlzLl9pZCwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gc3RyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VuZFRvU2VydmVyIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFNlbmRUb1NlcnZlcih2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlbmRUb1NlcnZlciA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHNpemUgaW4ga2Igb2YgdGhlIHJlY29yZHMgZS5pLiB0aGUgc3VtIG9mIGFsbCBmaWVsZHMgaW4gdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmVjU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHN1bTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIHN1bSA9IHN1bSArIGZpZWxkLmdldFNpemUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29weSB0aGUgbW9kaWZpZWQgY3JzciBmbGFncyBmcm9tIGEgZ2l2ZW4gcmVjLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgc291cmNlIHJlY29yZDwvcGFyYW0+XHJcbiAgY29weUNyc3JNb2RpZmllZEZsYWdzKHJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBsZXQgdGFiU2l6ZTogbnVtYmVyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGZvciAoaiA9IDA7IGogPCB0YWJTaXplOyBqKyspIHtcclxuICAgICAgdGhpcy5fZmxhZ3Nbal0gPSByZWMuX2ZsYWdzW2pdO1xyXG4gICAgICB0aGlzLl9mbGFnc1tqXSA9IHRoaXMuX2ZsYWdzW2pdICYgUmVjb3JkLkZMQUdfQ1JTUl9NT0RJRklFRDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmb3IgYSB0YWJsZSBjYWNoZSByZWNvcmQgcmV0dXJucyB0aGUgcmVjb3JkJ3MgZGJfcG9zIHZhbHVlIGFzIGEgYmFzZTY0IHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGJQb3NWYWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9kYlBvc0Jhc2U2NFZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgc3RyaW5nIHRoYXQgcmVwcmVzZW50IHRoZSBjdXJyZW50IGxpbmtzIGZpZWxkcyBkYl9wb3MgdmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZExpbmtzUG9zU3RyKCk6IHZvaWQge1xyXG4gICAgbGV0IHRibDogRGF0YXZpZXdIZWFkZXJzID0gKDxUYXNrPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKSkuZ2V0RGF0YXZpZXdIZWFkZXJzKCk7XHJcbiAgICBpZiAodGJsICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2xpbmtzRmxkc1BvcyA9IHRibC5idWlsZERiUG9zU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRGb3JjZVNhdmVPcmcodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9mb3JjZVNhdmVPcmcgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgcmVsaW5rZWQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9yY2VTYXZlT3JnKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlU2F2ZU9yZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cnVlLCBpZiBleGl0IGZyb20gdGhpcyByZWNvcmQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgdGhlIHRhYmxlIGR1ZSB0byB2aXRydWFsIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0NhdXNlSW52YWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhdXNlSW52YWxpZGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlmIGNhdXNlSW52YWxpZGF0aW9uIGlzIHRydWUsICBleGl0IGZyb20gdGhpcyByZWNvcmQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgdGhlIHRhYmxlIGR1ZSB0byB2aXRydWFsIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjYXVzZUludmFsaWRhdGlvblwiPjwvcGFyYW0+XHJcbiAgc2V0Q2F1c2VJbnZhbGlkYXRpb24oY2F1c2VJbnZhbGlkYXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhdXNlSW52YWxpZGF0aW9uID0gY2F1c2VJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgXCJjb21wdXRlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQ29tcHV0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcHV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJjb21wdXRlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0Q29tcHV0ZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb21wdXRlZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcImluIGNvbXB1dGVcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldEluQ29tcHV0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghdmFsKVxyXG4gICAgICB0aGlzLnNldENvbXB1dGVkKHRydWUpO1xyXG4gICAgdGhpcy5faW5Db21wdXRlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwiaW4gcmVjb21wdXRlXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRJblJlY29tcHV0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luUmVjb21wdXRlID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdNb2RlXCI+dGhlIG5ldyBtb2RlOiBDcmVhdGVkLCBNb2RpZmllZCwgRGVsZXRlZDwvcGFyYW0+XHJcbiAgc2V0TW9kZShuZXdNb2RlOiBEYXRhTW9kaWZpY2F0aW9uVHlwZXMpOiB2b2lkIHtcclxuICAgIHN3aXRjaCAobmV3TW9kZSkge1xyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lOlxyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQ6XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZTpcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlOlxyXG4gICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZSB8fFxyXG4gICAgICAgICAgdGhpcy5fbW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSAmJiBuZXdNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuRGVsZXRlKVxyXG4gICAgICAgICAgdGhpcy5fbW9kZSA9IG5ld01vZGU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLnNldE1vZGUoKTogaWxsZWdhbCBtb2RlOiBcIiArIG5ld01vZGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmVjb3JkIG1vZGUgdG8gXCJub25lXCJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyTW9kZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuTm9uZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzd2l0Y2ggb2ZmIHRoZSBuZXdSZWMgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0T2xkUmVjKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV3UmVjID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc3dpdGNoIG9uIHRoZSBuZXdSZWMgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0TmV3UmVjKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV3UmVjID0gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNlcmlhbGl6ZSBhbiBpdGVtIChmaWVsZC9nbG9iYWwgcGFyYW0vLi4uKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+aXRlbSdzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIml0ZW1BdHRyXCI+aXRlbSdzIGF0dHJpYnV0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjZWxsQXR0clwiPmNlbGwncyBhdHRyaWJ1dGUgLSByZWxldmFudCBvbmx5IGlmICdpdGVtQXR0cicgaXMgdmVjdG9yPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIlRvQmFzZTY0XCI+PmRlY2lkZSBCYXNlNjQgZW5jb2RpbmcgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnNlcmlhbGl6ZWQgaXRlbVZhbCA8L3JldHVybnM+XHJcbiAgc3RhdGljIHNlcmlhbGl6ZUl0ZW1WYWwoaXRlbVZhbDogc3RyaW5nLCBpdGVtQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgY2VsbEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUsIFRvQmFzZTY0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBSZWNvcmRVdGlscy5zZXJpYWxpemVJdGVtVmFsKGl0ZW1WYWwsIGl0ZW1BdHRyLCBjZWxsQXR0ciwgVG9CYXNlNjQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIERDVmFsIElkIGludG8gTWdDb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgU2V0RGNWYWx1ZUlkKCk6IHZvaWQge1xyXG4gICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpLmdldEZvcm0oKTtcclxuICAgIGxldCBtZ0NvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gICAgLy8gaWYgdGhlIGZvcm0gZG9lc24ndCBoYXZlIGFueSBzZWxlY3Rpb24gY29udHJvbCwgZGNSZWZzIHdvdWxkIGJlIG51bGxcclxuICAgIGlmIChmb3JtICE9IG51bGwgJiYgdGhpcy5fZGNSZWZzICE9IG51bGwpIHtcclxuXHJcbiAgICAgIHRoaXMuX2RjUmVmcy5SZWZzLmZvckVhY2goKGRjUmVmOiBEY1ZhbHVlc1JlZmVyZW5jZSkgPT4ge1xyXG4gICAgICAgIG1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Zm9ybS5nZXRDdHJsKGRjUmVmLmRpdElkeCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgICAgbWdDb250cm9sLnNldERjVmFsSWQoZGNSZWYuRGNWYWx1ZXMuZ2V0SWQoKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXNldCB0aGUgRENWYWwgSWQgaW4gTWdDb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXREY1ZhbHVlSWQoKTogdm9pZCB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkuZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAvLyBpZiB0aGUgZm9ybSBkb2Vzbid0IGhhdmUgYW55IHNlbGVjdGlvbiBjb250cm9sLCBkY1JlZnMgd291bGQgYmUgbnVsbFxyXG4gICAgaWYgKGZvcm0gIT0gbnVsbCAmJiB0aGlzLl9kY1JlZnMgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9kY1JlZnMuUmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChkY1JlZjogRGNWYWx1ZXNSZWZlcmVuY2UpIHtcclxuICAgICAgICBtZ0NvbnRyb2wgPSA8TWdDb250cm9sPmZvcm0uZ2V0Q3RybChkY1JlZi5kaXRJZHgpO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2wgIT0gbnVsbClcclxuICAgICAgICAgIG1nQ29udHJvbC5zZXREY1ZhbElkKEVNUFRZX0RDUkVGKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBBZGREY1ZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQ6IG51bWJlciwgZGNWYWx1ZXNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgZGNWYWx1ZXM6IERjVmFsdWVzID0gdGhpcy5fZGF0YXZpZXcuZ2V0RGNWYWx1ZXMoZGNWYWx1ZXNJZCk7XHJcbiAgICBsZXQgZGNSZWY6IERjVmFsdWVzUmVmZXJlbmNlID0gbmV3IERjVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZCwgZGNWYWx1ZXMpO1xyXG4gICAgaWYgKHRoaXMuX2RjUmVmcyA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9kY1JlZnMgPSBuZXcgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24oKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RjUmVmcy5BZGQoZGNSZWYpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbGluayBiZXR3ZWVuIGEgZGF0YSBjb250cm9sIGFuZCBpdHMgRGNWYWx1ZXMgb2JqZWN0LlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgRGNWYWx1ZXNSZWZlcmVuY2UgZXh0ZW5kcyBPYmplY3RSZWZlcmVuY2VCYXNlIHtcclxuICBkaXRJZHg6IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIHJlZmVyZW5jZWQgRGNWYWx1ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgRGNWYWx1ZXMoKTogRGNWYWx1ZXMge1xyXG4gICAgcmV0dXJuIDxEY1ZhbHVlcz50aGlzLlJlZmVyZW50O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY291cGxlXCI+YSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBkaXRJZHggJiBkY0lkIHNlcGFyYXRlZCBieSBhIGNvbW1hPC9wYXJhbT5cclxuICBjb25zdHJ1Y3Rvcihjb250cm9sSWQ6IG51bWJlciwgcmVmZXJlbmNlZERjVmFsdWVzOiBEY1ZhbHVlcykge1xyXG4gICAgc3VwZXIocmVmZXJlbmNlZERjVmFsdWVzKTtcclxuICAgIHRoaXMuZGl0SWR4ID0gY29udHJvbElkO1xyXG4gIH1cclxuXHJcbiAgQ2xvbmUoKTogT2JqZWN0UmVmZXJlbmNlQmFzZSB7XHJcbiAgICByZXR1cm4gbmV3IERjVmFsdWVzUmVmZXJlbmNlKHRoaXMuZGl0SWR4LCA8RGNWYWx1ZXM+dGhpcy5SZWZlcmVudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgYSBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UgZnJvbSBhIHN0cmluZyBjb250YWluaW5nIHR3byBpbnRlZ2Vycywgd2hlcmUgdGhlXHJcbiAgLy8vIGZpcnN0IGlzIHRoZSBpbmRleCBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybSAoZGl0IGluZGV4KSBhbmQgdGhlIHNlY29uZCBpcyB0aGVcclxuICAvLy8gRGNWYWx1ZXMgb2JqZWN0IGlkZW50aWZpZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb3VwbGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRjVmFsdWVzT3duZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFBhcnNlKGNvdXBsZTogc3RyaW5nLCBkY1ZhbHVlc093bmVyOiBEYXRhVmlld0Jhc2UpOiBEY1ZhbHVlc1JlZmVyZW5jZSB7XHJcbiAgICBsZXQgY29tbWFQb3M6IG51bWJlciA9IGNvdXBsZS5pbmRleE9mKFwiLFwiKTtcclxuXHJcbiAgICBsZXQgY29udHJvbElkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGNvdXBsZS5zdWJzdHIoMCwgY29tbWFQb3MpKTtcclxuICAgIGxldCBkY0lkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGNvdXBsZS5zdWJzdHIoY29tbWFQb3MgKyAxKSk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBEY1ZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQsIGRjVmFsdWVzT3duZXIuZ2V0RGNWYWx1ZXMoZGNJZCkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
846
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9kYXRhL1JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLFdBQVcsRUFDWCxNQUFNLEVBR04sbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixXQUFXLEVBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLEtBQUssRUFDTCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGlCQUFpQixFQUNsQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBSTFCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBTW5GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBTzFFLE1BQU0sT0FBTyxNQUFNO0lBc0VqQixZQUFZLDJCQUFnQyxFQUFFLFFBQXVCO1FBckQzRCxRQUFHLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUM3QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixVQUFLLEdBQTBCLHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUU1RCxZQUFPLEdBQStCLElBQUksQ0FB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LFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERjVmFsdWVzLFxyXG4gIEVNUFRZX0RDUkVGLFxyXG4gIEV4cFZhbCxcclxuICBGaWVsZERlZixcclxuICBJUmVjb3JkLFxyXG4gIE9iamVjdFJlZmVyZW5jZUJhc2UsXHJcbiAgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24sXHJcbiAgUmVjb3JkVXRpbHNcclxufSBmcm9tICdAbWFnaWMteHBhL2d1aSc7XHJcbmltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25FeGNlcHRpb24sXHJcbiAgSUNvbXBhcmFibGUsXHJcbiAgSW50MzIsXHJcbiAgSVNPXzg4NTlfMV9FbmNvZGluZyxcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyLFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuXHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4vRmllbGQnO1xyXG5pbXBvcnQge1RhYmxlQ2FjaGV9IGZyb20gJy4uL3J0L1RhYmxlQ2FjaGUnO1xyXG5pbXBvcnQge0V4cHJlc3Npb25FdmFsdWF0b3IsIE51bGxWYWx1ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vZXhwL0V4cHJlc3Npb25FdmFsdWF0b3InO1xyXG5pbXBvcnQge0tleX0gZnJvbSAnLi9LZXknO1xyXG5pbXBvcnQge0ZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlfSBmcm9tICcuL0ZpZWxkc1RhYmxlJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gJy4uL0NvbnN0SW50ZXJmYWNlJztcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlcnN9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7RW52aXJvbm1lbnR9IGZyb20gJy4uL2Vudi9FbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7RGF0YVZpZXdCYXNlfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7UmVtb3RlQ29tbWFuZHNQcm9jZXNzb3J9IGZyb20gXCIuLi9yZW1vdGUvUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3JcIjtcclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHJlY29yZCBvYmplY3RcclxuLy8vICAgaXQgcGFyc2VzIHRoZSA8cmVjLi4uPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJlY29yZCBpbXBsZW1lbnRzIElDb21wYXJhYmxlLCBJUmVjb3JkIHtcclxuICAvLyBBVFRFTlRJT04gISEhIHdoZW4geW91IGFkZC9tb2RpZnkvZGVsZXRlIGEgbWVtYmVyIHZhcmlhYmxlIGRvbid0IGZvcmdldCB0byB0YWtlIGNhcmVcclxuICAvLyBhYm91dCB0aGUgXCJzZXRTYW1lQXMoKVwiIGZ1bmN0aW9uXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDT05TVEFOVFNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgc3RhdGljIEZMQUdfTlVMTDogbnVtYmVyID0gKDB4MDEpO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIEZMQUdfSU5WQUxJRDogbnVtYmVyID0gKDB4MDIpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19NT0RJRklFRDogbnVtYmVyID0gKDB4MDQpO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19VUERBVEVEOiBudW1iZXIgPSAoMHgwOCk7XHJcbiAgcHVibGljIHN0YXRpYyBGTEFHX0NSU1JfTU9ESUZJRUQ6IG51bWJlciA9ICgweDEwKTtcclxuICBwdWJsaWMgc3RhdGljIEZMQUdfVkFMVUVfTk9UX1BBU1NFRDogbnVtYmVyID0gKDB4MjApO1xyXG4gIHB1YmxpYyBzdGF0aWMgRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0U6IG51bWJlciA9ICgweDQwKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9pZDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJvdGVjdGVkIGRiVmlld1Jvd0lkeDogbnVtYmVyID0gMDtcclxuICBwcm90ZWN0ZWQgX21vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lO1xyXG5cclxuICBwcml2YXRlIF9kY1JlZnM6IE9iamVjdFJlZmVyZW5jZXNDb2xsZWN0aW9uID0gbnVsbDtcclxuICBfaW5Db21wdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX2luUmVjb21wdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX25ld1JlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZ2V0IEluQ29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IEluUmVjb21wdXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb21wdXRlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBJTkNSRUFTRTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJvdGVjdGVkIHN0YXRpYyBERUNSRUFTRTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcm90ZWN0ZWQgX3RhYmxlQ2FjaGU6IFRhYmxlQ2FjaGU7IC8vIH1cclxuICAvLyB9IGZvciB1c2UgaWYgdGhlIHJlY29yZCBpcyBwYXJ0IG9mIHRhYmxlIGNhY2hlICh0aGVyZSBpcyBubyB3YXkgYm90aCBkdiBhbmQgdGFibGVjYWNoZSBhcmUgbm90IG51bGwgYXQgdGhlIHNhbWUgdGltZSAtXHJcblxyXG4gIHByb3RlY3RlZCBfaW5EZWxldGVQcm9jZXNzOiBib29sZWFuOyAvLyB3aWxsIGJlIHNldCB0byB0cnVlIGJlZm9yZSByZWMgc3VmZml4IGZyb20gZGVsbGluZS5cclxuICBwcm90ZWN0ZWQgX2FkZEFmdGVyOiBudW1iZXI7XHJcbiAgcHJvdGVjdGVkIF9jYXVzZUludmFsaWRhdGlvbjogYm9vbGVhbjsgLy8gRXhpdCBmcm9tIHRoaXMgcmVjb3JkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIGFsbCByb3dzIGluIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF9kYlBvc0Jhc2U2NFZhbDogc3RyaW5nOyAvLyB1c2VkIG9ubHkgaW4gdGFibGUgY2FjaGUgcmVjb3JkcyBob2xkcyB0aGUgdGFibGVzIGRiX3BvcyB2YWx1ZSBpbiB0aGUgY3Vyc29yXHJcbiAgLy8gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhleSBhcmUgTXV0dWFsbHkgZXhjbHVzaXZlKS5cclxuICBwcm90ZWN0ZWQgX2RhdGF2aWV3OiBEYXRhVmlld0Jhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpZWxkc0RhdGE6IFN0cmluZ1tdO1xyXG4gIHByb3RlY3RlZCBfZmxhZ3M6IFVpbnQ4QXJyYXk7XHJcbiAgcHJvdGVjdGVkIF9mbGFnc0hpc3Rvcnk6IFVpbnQ4QXJyYXk7IC8vIEhpc3Rvcnkgb2YgZmxhZ3MsIHVzZWQgd2hlbiBjb250YWN0aW5nIHRoZSBzZXJ2ZXJcclxuICBwcm90ZWN0ZWQgX2ZvcmNlU2F2ZU9yZzogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2hhc2hLZXk6IG51bWJlcjtcclxuXHJcbiAgcHJvdGVjdGVkIF9jb21wdXRlZDogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2xhdGVDb21wdXRlOiBib29sZWFuOyAvLyB0aGlzIHJlY29yZCBtdXN0IGJlIGNvbXB1dGVkIG5leHQgdGltZSB3ZSBlbnRlciB0aGUgcmVjb3JkLCBidXQgbm90IGJlZm9yZVxyXG5cclxuICBwcm90ZWN0ZWQgX2xpbmtzRmxkc1Bvczogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfbW9kaWZpZWQ6IGJvb2xlYW47XHJcblxyXG4gIHByb3RlY3RlZCBfbmV4dDogUmVjb3JkOyAgLy8gUG9pbnRzIHRvIHRoZSBuZXh0IHJlY29yZCwgd2hlbiBpdHMgcGFydCBvZiBhIGxpc3RcclxuICBwcm90ZWN0ZWQgX3ByZXY6IFJlY29yZDsgIC8vIFBvaW50cyB0byB0aGUgcHJldiByZWNvcmQsIHdoZW4gaXRzIHBhcnQgb2YgYSBsaXN0XHJcbiAgcHJvdGVjdGVkIF9zZW5kVG9TZXJ2ZXI6IGJvb2xlYW4gPSB0cnVlOyAvLyBJZiBmYWxzZSwgZG9uJ3Qgc2VuZCB0aGlzIHJlY29yZCB0byB0aGUgc2VydmVyLCBhcyBwYXJ0IG9mIHRoZSBtb2RpZmllZCBsaXN0XHJcbiAgcHJvdGVjdGVkIF91cGRhdGVkOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgSW5Gb3JjZVVwZGF0ZTogYm9vbGVhbjtcclxuICBwdWJsaWMgU3luY2VkOiBib29sZWFuO1xyXG4gIHB1YmxpYyBWYWx1ZUluQmFzZTY0OiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihkdk9yVGFibGVDYWNoZTogRGF0YVZpZXdCYXNlIHwgVGFibGVDYWNoZSk7XHJcbiAgY29uc3RydWN0b3IoY0lkOiBudW1iZXIsIGRhdGF2aWV3OiBEYXRhVmlld0Jhc2UpO1xyXG4gIGNvbnN0cnVjdG9yKFJlY29yZDogUmVjb3JkKTtcclxuICBjb25zdHJ1Y3Rvcihkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQ6IGFueSwgZGF0YXZpZXc/OiBEYXRhVmlld0Jhc2UpXHJcbiAge1xyXG4gICAgaWYoZHZPclRhYmxlQ2FjaGVPckNJZE9yUmVjb3JkIGluc3RhbmNlb2YgIFJlY29yZClcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQpO1xyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGR2T3JUYWJsZUNhY2hlT3JDSWRPclJlY29yZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShkdk9yVGFibGVDYWNoZU9yQ0lkT3JSZWNvcmQsIGRhdGF2aWV3KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3RzIGEgbmV3IHJlY29yZCB0byBiZSB1c2VkIGJ5IHRoZSB0YWJsZSBjYWNoZSBvbmx5ISEhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoZHZPclRhYmxlQ2FjaGU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGR2T3JUYWJsZUNhY2hlIGluc3RhbmNlb2YgRGF0YVZpZXdCYXNlKVxyXG4gICAgICB0aGlzLl9kYXRhdmlldyA9IDxEYXRhVmlld0Jhc2U+ZHZPclRhYmxlQ2FjaGU7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3RhYmxlQ2FjaGUgPSA8VGFibGVDYWNoZT5kdk9yVGFibGVDYWNoZTtcclxuXHJcbiAgICB0aGlzLl9maWVsZHNEYXRhID0gbmV3IEFycmF5PHN0cmluZz4odGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpO1xyXG4gICAgdGhpcy5fZmxhZ3MgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSk7XHJcbiAgICB0aGlzLl9mbGFnc0hpc3RvcnkgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKSk7XHJcbiAgICB0aGlzLl9kY1JlZnMgPSBuZXcgT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGREZWYgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGkpO1xyXG4gICAgICB0aGlzLl9mbGFnc1tpXSA9ICgoZmllbGQuaXNOdWxsRGVmYXVsdCgpIHx8IGZpZWxkLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikgPyBSZWNvcmQuRkxBR19OVUxMIDogMCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwgJiYgKDxGaWVsZD5maWVsZCkuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgbGV0IHJlY29yZDogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpO1xyXG4gICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCAmJiByZWNvcmQuSXNGbGRNb2RpZmllZEF0TGVhc3RPbmNlKGkpKSB7XHJcbiAgICAgICAgICB0aGlzLnNldEZsYWcoaSwgUmVjb3JkLkZMQUdfTU9ESUZJRURfQVRMRUFTVF9PTkNFKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gdGhpcy5fZmxhZ3NbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXROZXdSZWMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZ0XCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkcyB0YWJsZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbT4gIGNsb2JiZXJlZE9ubHkgaXMgdHJ1ZSBpZiB3ZSB3YW50IHRvIGluaXQgb25seSB0aGUgdmFsdWVzIG9mIHRoZSB2aXJ0dWFscyB3aXRoIG5vIGluaXQgZXhwcmVzc2lvbiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjSWQ6IG51bWJlciwgZGF0YXZpZXc6IERhdGFWaWV3QmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGRhdGF2aWV3KTtcclxuICAgIHRoaXMuc2V0SWQoY0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kaWZpZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IFVwZGF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgU2VuZFRvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbmRUb1NlcnZlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBDb21wYXJlVG8ob2JqOiBPYmplY3QpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlczogbnVtYmVyID0gMDtcclxuICAgIGxldCBjb21wVG8gPSA8UmVjb3JkPm9iajtcclxuXHJcbiAgICAvLyBnZXQgdGhlIGtleSBieSB3aGljaCB3ZSBhcmUgZG9pbmcgdGhlIENvbXBhcmlzb25cclxuICAgIGxldCBrZXk6IEtleSA9IHRoaXMuX3RhYmxlQ2FjaGUuR2V0S2V5QnlJZCh0aGlzLl90YWJsZUNhY2hlLkdldEN1cnJTb3J0S2V5KCkpO1xyXG5cclxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGtleSB0byBjb21wYXJlIGJ5IHRoZW4gdGhlIHJlY29yZHMgYXJlIHVuY29tcGFyYWJsZVxyXG4gICAgaWYgKGtleSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIGFsbCB3ZSBuZWVkIGZyb20gdGhlIGtleSBpbiB0aGUgb3JkZXIgb2YgY29tcGFyaW5nIHRoZSB0aGUgcmVjb3JkIGZpZWxkc1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwga2V5LkNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgY3VyckZsZCA9IGtleS5Db2x1bW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCBjdXJyRmxkSWQ6IG51bWJlciA9IGN1cnJGbGQuZ2V0SWQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuSXNOdWxsKGN1cnJGbGRJZCkgJiYgY29tcFRvLklzTnVsbChjdXJyRmxkSWQpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5Jc051bGwoY3VyckZsZElkKSAmJiAhY29tcFRvLklzTnVsbChjdXJyRmxkSWQpKSB7XHJcbiAgICAgICAgICAvLyBudWxsIGlzIHRoZSBncmVhdGVzdCB2YWx1ZSB0aGVyZWZvcmUgd2UgYXJlIHRoZSBncmVhdGVyXHJcbiAgICAgICAgICByZXMgPSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLklzTnVsbChjdXJyRmxkSWQpICYmIGNvbXBUby5Jc051bGwoY3VyckZsZElkKSkge1xyXG4gICAgICAgICAgcmVzID0gLTE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYm90aCBhcmUgbm90IG51bGxcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IG5ldyBFeHBWYWwoY3VyckZsZC5nZXRUeXBlKCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIHRoaXMuR2V0RmllbGRWYWx1ZShjdXJyRmxkSWQpKTtcclxuICAgICAgICAgICAgbGV0IHNlY29uZCA9IG5ldyBFeHBWYWwoY3VyckZsZC5nZXRUeXBlKCksIGZhbHNlLFxyXG4gICAgICAgICAgICAgIGNvbXBUby5HZXRGaWVsZFZhbHVlKGN1cnJGbGRJZCkpO1xyXG5cclxuICAgICAgICAgICAgcmVzID0gRXhwcmVzc2lvbkV2YWx1YXRvci52YWxfY21wX2FueShmaXJzdCwgc2Vjb25kKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXMgIT09IDApXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXJyKVxyXG4gICAgICAgICAgICAvLyBvbmUgb2YgdGhlIHZhbHVlcyB3ZSBhcmUgY29tcGFyaW5nIHVzaW5nIHZsX2NtcF9hbnkgIGlzIG51bGwgd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOdWxsVmFsdWVFeGNlcHRpb24pXHJcbiAgICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiIGluIFJlY29yZC5Db21wYXJlVG8gbnVsbCB2YWx1ZSB3YXMgcmVhY2hlZFwiKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzID0gLTE7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNb2RlKCk6IERhdGFNb2RpZmljYXRpb25UeXBlcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZWNvcmQgaWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldElkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGp1c3QgY3JlYXRlZCBhbmQgbm8gcmVjb3JkIHN1ZmZpeCB3YXMgeWV0XHJcbiAgLy8vICAgcHJvY2Vzc2VkIG9uIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc05ld1JlYygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXdSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIGZpZWxkIHZhbHVlIGZvciB0aGUgWE1MIHN0cmluZyBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj5pbmRleCBvZiBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkRGF0YVhNTChmbGRJZHg6IG51bWJlciwgZ2V0T2xkVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBmbGRWYWw6IHN0cmluZztcclxuXHJcbiAgICBpZiAoIWdldE9sZFZhbClcclxuICAgICAgZmxkVmFsID0gdGhpcy5HZXRGaWVsZFZhbHVlKGZsZElkeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGZsZFZhbCA9ICg8RmllbGQ+KHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KSkpLmdldE9yaWdpbmFsVmFsdWUoKTtcclxuICAgIGlmIChmbGRWYWwgPT0gbnVsbClcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUmVjb3JkLmJ1aWxkRmllbGRzRGF0YSgpIG51bGwgZmllbGQgdmFsdWUhXFxuRmllbGQgaWQ6IFwiICsgZmxkSWR4KTtcclxuXHJcbiAgICBsZXQgdG1wQnVmOiBzdHJpbmcgPSB0aGlzLmdldFhNTEZvclZhbHVlKGZsZElkeCwgZmxkVmFsKTtcclxuICAgIHJldHVybiBYbWxQYXJzZXIuZXNjYXBlKHRtcEJ1Zi50b1N0cmluZygpKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgZmllbGQgdGFibGUgZWl0aGVyIG9mIERhdGFWaWV3Um9vdCAoJ2R2SGVhZGVyJykgb3Igb2YgVGFibGVDYWNoZVxyXG4gIC8vLyBkdiBhbmQgdGFibGVDYWNoZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGZpZWxkVGFibGUgPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkc1RhYigpOiBGaWVsZHNUYWJsZSB7XHJcbiAgICBpZiAodGhpcy5fZGF0YXZpZXcgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiA8RmllbGRzVGFibGU+dGhpcy5fZGF0YXZpZXcuR2V0RmllbGRzVGFiKCk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fdGFibGVDYWNoZS5GbGRzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyA6IGNoZWNrIGhvdyB0byBpbXBsZW1lbnQgZGVzdHJ1Y3RvcnNcclxuICAvLyB+UmVjb3JkKClcclxuICAvLyB7XHJcbiAgLy8gXHR0aGlzLnJlbW92ZVJlY0Zyb21EYygpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgaW5pdGlhbCBmaWVsZCB2YWx1ZXMgZm9yIGZpZWxkcyB0aGF0IGhhcyBhIG51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0+ICBjbG9iYmVyZWRPbmx5IGlzIHRydWUgaWYgd2Ugd2FudCB0byBpbml0IG9ubHkgdGhlIHZhbHVlcyBvZiB0aGUgdmlydHVhbHMgd2l0aCBubyBpbml0IGV4cHJlc3Npb24gPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0SW5pdGlhbEZsZFZhbHMoY2xvYmJlcmVkT25seTogYm9vbGVhbiwgaXNOZXdSZWM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBpOiBudW1iZXIsIHNpemU7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IG51bGw7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKHRydWUpO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBmaWVsZHMgdXNpbmcgdGhlIE1hZ2ljIGRlZmF1bHQgdmFsdWVcclxuICAgICAgaWYgKHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBmbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICB0aGlzLl9maWVsZHNEYXRhW2ldID0gZmxkLmdldE5ld1JlY1ZhbHVlKGNsb2JiZXJlZE9ubHkpO1xyXG5cclxuICAgICAgICBpZiAoaXNOZXdSZWMgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxkLmdldElkKCksIFJlY29yZC5GTEFHX05VTEwpO1xyXG5cclxuICAgICAgICBpZiAoZmxkLklzVmlydHVhbCAmJiBmbGQuZ2V0TW9kaWZpZWRBdExlYXN0T25jZSgpKVxyXG4gICAgICAgICAgdGhpcy5zZXRGbGFnKGZsZC5nZXRJZCgpLCBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fZmllbGRzRGF0YVtpXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgaWQgb2YgdGhlIHJlY29yZCBhbmQgYW4gYXBwcm9wcmlhdGUgaGFzaCBrZXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY0lkXCI+dGhlIGlkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHNldElkKGNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IGNJZDtcclxuICAgIHRoaXMuX2hhc2hLZXkgPSB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0cyB0aGUgZGJWaWV3Um93SWQgb2YgdGhlIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjSWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgc2V0REJWaWV3Um93SWR4KHJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZGJWaWV3Um93SWR4ID0gcm93SWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiBkYlZpZXdSb3dJZCBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNJZFwiPnRoZSBpZCBvZiB0aGUgcmVjb3JkPC9wYXJhbT5cclxuICBnZXREQlZpZXdSb3dJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRiVmlld1Jvd0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YSAtIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZWNvcmQgaXMgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ3VyclJlYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1JFQykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlzQ3VyclJlYyA9IHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuRmlsbElubmVyRGF0YSgpIG91dCBvZiBib3VuZHNcIik7XHJcbiAgICByZXR1cm4gaXNDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSByZWNvcmQgLSByZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj50aGUgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzPC9wYXJhbT5cclxuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBTdHJpbmcsIHZhbHVlU3RyO1xyXG4gICAgbGV0IHJlY0ZpZWxkc0RhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgIGxldCBpc0N1cnJSZWM6IGJvb2xlYW47XHJcblxyXG4gICAgaXNDdXJyUmVjID0gdGhpcy5wZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3Rvcik7XHJcblxyXG4gICAgZm9yICg7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIHZhbHVlU3RyID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERTpcclxuICAgICAgICAgIHRoaXMuX21vZGUgPSA8RGF0YU1vZGlmaWNhdGlvblR5cGVzPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICAgIHRoaXMuc2V0SWQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQl9WSUVXX1JPV0lEWDpcclxuICAgICAgICAgIHRoaXMuc2V0REJWaWV3Um93SWR4KFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5WYWx1ZUluQmFzZTY0KSB7XHJcbiAgICAgICAgICAgIHJlY0ZpZWxkc0RhdGEgPSBCYXNlNjQuZGVjb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZWNGaWVsZHNEYXRhID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQzoge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQUREX0FGVEVSOlxyXG4gICAgICAgICAgdGhpcy5fYWRkQWZ0ZXIgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9GTEFHUzpcclxuICAgICAgICAgIHJlY0ZsYWdzID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQ6XHJcbiAgICAgICAgICB0aGlzLl9tb2RpZmllZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRENfUkVGUzpcclxuICAgICAgICAgIHRoaXMuZmlsbERDUmVmKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUzpcclxuICAgICAgICAgIHRoaXMuX2RiUG9zQmFzZTY0VmFsID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLmluaXRFbGVtZW50cygpIHVua25vd24gYXR0cmlidXRlOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuVmFsdWVJbkJhc2U2NCkge1xyXG4gICAgICBsZXQgZmxkVmFsSW5CeXRlczogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyhyZWNGaWVsZHNEYXRhKTtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShmbGRWYWxJbkJ5dGVzLCByZWNGbGFncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5maWxsRmllbGRzRGF0YShyZWNGaWVsZHNEYXRhLCByZWNGbGFncywgaXNDdXJyUmVjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0N1cnJSZWM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGVlayB0aGUgY3Vycl9yZWMgdmFsdWUgZnJvbSB0aGUgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRoZVwiPnRva2VucyBvZiB0aGUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRoZSB0YWc8L3BhcmFtPlxyXG4gIHByb3RlY3RlZCBwZWVrSXNDdXJyUmVjKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmc7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBpZiAoYXR0cmlidXRlID09PSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NVUlJfUkVDKSB7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcbiAgICAgICAgcmV0dXJuIFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkVmFsSW5CeXRlczogVWludDhBcnJheSwgcmVjRmxhZ3M6IHN0cmluZyk6IHZvaWQ7XHJcbiAgZmlsbEZpZWxkc0RhdGEoZmxkc1ZhbDogc3RyaW5nLCByZWNGbGFnczogc3RyaW5nLCBpc0N1cnJSZWM6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGZpbGxGaWVsZHNEYXRhKGZsZFZhbEluQnl0ZXNPckZsZHNWYWw6IGFueSwgcmVjRmxhZ3M6IHN0cmluZywgaXNDdXJyUmVjPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGlzQ3VyclJlYykpXHJcbiAgICAgIHRoaXMuZmlsbEZpZWxkc0RhdGFfMCgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZpbGxGaWVsZHNEYXRhXzEoZmxkVmFsSW5CeXRlc09yRmxkc1ZhbCwgcmVjRmxhZ3MsIGlzQ3VyclJlYyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxGaWVsZHNEYXRhXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBGaWVsZHNEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZHNWYWxcIj4tIHN0cmluZyBmb3IgcGFyc2luZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj50cnVlIGlmIHRoaXMgcmVjb3JkIGlzIHRoZSBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBmaWxsRmllbGRzRGF0YV8xKGZsZHNWYWw6IHN0cmluZywgcmVjRmxhZ3M6IFN0cmluZywgaXNDdXJyUmVjOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsOiBTdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IHRtcDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBwYXJzZWRMZW46IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPigwKTtcclxuICAgIGxldCBpOiBudW1iZXIsIGogPSAwLCBmcm9tLCBzaXplO1xyXG4gICAgbGV0IGN1cnJUeXBlOiBTdG9yYWdlQXR0cmlidXRlO1xyXG4gICAgbGV0IHVzZUhleDogYm9vbGVhbjtcclxuICAgIGxldCBmbGQ6IEZpZWxkRGVmID0gbnVsbDtcclxuICAgIGxldCB2YWx1ZU5vdFBhc3NlZDogYm9vbGVhbjtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGlzQ3VyclJlYyk7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKGlzQ3VyclJlYyk7XHJcblxyXG4gICAgZm9yIChpID0gZnJvbTsgaiA8IHNpemU7IGkrKywgaisrKSB7XHJcbiAgICAgIGZsZCA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGN1cnJUeXBlID0gZmxkLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIHVzZUhleCA9IChFbnZpcm9ubWVudC5JbnN0YW5jZS5HZXREZWJ1Z0xldmVsKCkgPiAxIHx8XHJcbiAgICAgICAgY3VyclR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHxcclxuICAgICAgICBjdXJyVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFIHx8XHJcbiAgICAgICAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwoY3VyclR5cGUpKTtcclxuXHJcbiAgICAgIC8vIFFjciAjOTQwNDQzIDogT2xkIGZhc2hpb24gZmxhZ3MgYXJlIHN0aWxsIGJlaW5nIHVzZWQgYnkgcmVzaWRlbnQgdGFibGUuIFNvIGNoZWNrIHRoZW0gMXN0IGNveiB3ZSAgbWlnaHQgZ2V0IGV4Y2VwdGlvbiBvdGhlcndpc2UuXHJcbiAgICAgIC8vIFRoZSBmbGFncyBmb3IgcmVzaWRlbnQgYXJlIHZlcnkgc2ltcGxlLCBvbmx5IDIgb3B0aW9ucy4gJy4nID0gZmFsc2UsICcvJyA9IHRydWUuXHJcbiAgICAgIC8vIFdlIGtlZXAgdXNpbmcgaXQgZm9yIHJlc2lkZW50LCBzaW5jZSBpbiB0aGUgc2VydmVyIHNpZGUgd2UgZG8gbm90IGtub3cgaWYgd2UgYXJlIGNyZWF0aW5nIHRoZSB4bWwgZm9yIHJpY2hjbGllbnQgb3IgZm9yIEJDIGF0IHRoZSBjcmVhdGlvbiBzdGFnZS5cclxuICAgICAgLy8gU2luY2Ugd2UgY291bGRuJ3QgY3JlYXRlIGRpZmZlcmVudCBmbGFncyBmb3IgcmljaCwgd2Ugd2lsbCB1c2UgdGhlIG9sZCBmbGFncyBoZXJlLlxyXG5cclxuICAgICAgaWYgKHJlY0ZsYWdzW2pdID09PSAnLicpXHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSAwO1xyXG4gICAgICBlbHNlIGlmIChyZWNGbGFnc1tqXSA9PT0gJy8nKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gMTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gRWFjaCBmbGFnIHdpbGwgYXBwZWFyIGluIHRoZSB4bWwgaW4gMiBjaGFycyByZXByZXNlbnRpbmcgaGV4IHZhbHVlIChcIjQyXCIgZm9yIDB4NDIpLlxyXG4gICAgICAgIHRtcCA9IHJlY0ZsYWdzLnN1YnN0cihqICogMiwgMik7XHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSBwYXJzZUludCh0bXAsIDE2KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgaW5kIHRoYXQgdGhlIHZhbHVlIHdhcyBub3QgcGFzc2VkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAgdmFsdWVOb3RQYXNzZWQgPSBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKTtcclxuICAgICAgdGhpcy5fZmxhZ3NbaV0gPSB0aGlzLl9mbGFnc1tpXSAmIH5SZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEO1xyXG5cclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ldID0gdGhpcy5fZmxhZ3NbaV07XHJcblxyXG4gICAgICBpZiAoUmVjb3JkLkZMQUdfVVBEQVRFRCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfVVBEQVRFRCkpXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIGlmICh2YWx1ZU5vdFBhc3NlZCkge1xyXG4gICAgICAgIGlmIChSZWNvcmQuRkxBR19OVUxMID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19OVUxMKSkge1xyXG4gICAgICAgICAgLy8gbnVsbCBpbmQgaXMgb24sIGp1c3QgcHV0IGFueSB2YWx1ZSBpbiB0aGUgZmllbGQuXHJcbiAgICAgICAgICB2YWwgPSBmbGQuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gY29weSB0aGUgZXhpc3RpbmcgdmFsdWUgZnJvbSB0aGUgZXhpc3RpbmcgY3VyciByZWMuXHJcbiAgICAgICAgICB2YWwgPSAoPFJlY29yZD4gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpKS5HZXRGaWVsZFZhbHVlKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB2YWwgPSBSZWNvcmRVdGlscy5kZVNlcmlhbGl6ZUl0ZW1WYWwoZmxkc1ZhbCwgY3VyclR5cGUsIGZsZC5nZXRTaXplKCksIHVzZUhleCwgZmxkLmdldENlbGxzVHlwZSgpLCBwYXJzZWRMZW4pO1xyXG4gICAgICAgIGZsZHNWYWwgPSBmbGRzVmFsLnN1YnN0cihwYXJzZWRMZW4udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRJbml0aWFsRmxkVmFscyhmYWxzZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0IGRjUmVmcyB2ZWN0b3IgYW5kIGluY3JlYXNlIHJlZmVyZW5jZSBjb3VudGVyIHRvIERhdGFWaWV3Um9vdC5jb3VudGVyQXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsdWVTdHJcIj5pbiBmb3JtIFwiZGl0X2lkeCxkY19pZCRkaXRfaWR4LGRjX2lkJC4uLlwiPC9wYXJhbT5cclxuICBmaWxsRENSZWYodmFsdWVTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWVTdHIpKSB7XHJcbiAgICAgIGxldCBjb3VwbGVzOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUodmFsdWVTdHIsIFwiJFwiKTtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IGNvdXBsZXMubGVuZ3RoO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIHRoaXMuX2RjUmVmcy5BZGQoRGNWYWx1ZXNSZWZlcmVuY2UuUGFyc2UoY291cGxlc1tpXSwgdGhpcy5fZGF0YXZpZXcpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBmaWVsZHMgdmFsdWUgZm9yIHRoZSBYTUwgc3RyaW5nIG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkRmllbGRzRGF0YShtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGdldE9sZFZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHRtcFN0cjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgbGV0IGZyb206IG51bWJlciA9IHRoaXMuZ2V0RnJvbUZsZElkeChpc0N1cnJSZWMpO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZChpc0N1cnJSZWMpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IGZyb207IGkgPCBmcm9tICsgc2l6ZTsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAvLyBEbyBub3Qgc2VyaWFsaXplIHRoZSBmaWVsZCB2YWx1ZSB3aGljaCBpcyBub3QgZXhwb3NlZCB0byBjbGllbnQuXHJcbiAgICAgIGxldCBmbGQ6IEZpZWxkID0gIDxGaWVsZD4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKGZsZC5Jc0V4cG9zZWRUb0NsaWVudCA9PT0gZmFsc2UpXHJcbiAgICAgICAgdGhpcy5zZXRTaHJpbmtGbGFnKGkpO1xyXG5cclxuICAgICAgLy8gZG8gbm90IHdyaXRlIHRoZSB2YWx1ZSBpZiB0aGUgc2hyaW5rIGZsYWcgaXMgb24uXHJcbiAgICAgIGlmIChSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEID09PSAodGhpcy5fZmxhZ3NbaV0gJiBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEKSlcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIHRtcFN0ci5BcHBlbmQodGhpcy5nZXRGaWVsZERhdGFYTUwoaSwgZ2V0T2xkVmFsKS50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gaWYgbm9uZSBvZiB0aGUgdmFsdWVzIGhhZCBjaGFuZ2VkLiBwYXNzIFwiIFwiIGluc3RlYWQgb2YgXCJcIi5cclxuICAgIGlmICh0bXBTdHIuTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRtcFN0ci5BcHBlbmQoXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuQXBwZW5kKHRtcFN0ci5Ub1N0cmluZygpKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZFZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRYTUxGb3JWYWx1ZShmbGRJZHg6IG51bWJlciwgZmxkVmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5TS0lQOyAvLyBjZWxsJ3MgYXR0cmlidXRlLCBpZiB0aGUgZmllbGQncyBhdHRyaWJ1dGUgaXMgYSB2ZWN0b3JcclxuICAgIGxldCBmbGRBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRUeXBlKGZsZElkeCk7IC8vIGZpZWxkJ3MgYXR0cmlidXRlXHJcbiAgICBpZiAoZmxkQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgY2VsbEF0dHIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldEZpZWxkKGZsZElkeCkuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgbGV0IHRvQmFzZTY0OiBib29sZWFuID0gRW52aXJvbm1lbnQuSW5zdGFuY2UuR2V0RGVidWdMZXZlbCgpIDw9IDE7XHJcbiAgICByZXR1cm4gUmVjb3JkLnNlcmlhbGl6ZUl0ZW1WYWwoZmxkVmFsLCBmbGRBdHRyLCBjZWxsQXR0ciwgdG9CYXNlNjQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBmaWVsZCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQ3VyclJlY1wiPnNob3VsZCBiZSB0cnVlIGZvciB0aGUgY3VycmVudCByZWM8L3BhcmFtPlxyXG4gIGdldEZyb21GbGRJZHgoaXNDdXJyUmVjOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChpc0N1cnJSZWMpXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRSTUlkeCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0N1cnJSZWNcIj5zaG91bGQgYmUgdHJ1ZSBmb3IgdGhlIGN1cnJlbnQgcmVjPC9wYXJhbT5cclxuICBnZXRTaXplRmxkKGlzQ3VyclJlYzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkc1RhYigpLmdldFJNU2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuKTogdm9pZDtcclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBpc0N1cnJSZWM6IGJvb2xlYW4sIGZvcmNlQnVpbGQ6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbiwgZm9yY2VCdWlsZD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChmb3JjZUJ1aWxkKSlcclxuICAgICAgdGhpcy5idWlsZFhNTF8wKG1lc3NhZ2UsIGlzQ3VyclJlYyk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuYnVpbGRYTUxfMShtZXNzYWdlLCBpc0N1cnJSZWMsIGZvcmNlQnVpbGQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFhNTF8wKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIsIGlzQ3VyclJlYzogYm9vbGVhbik6ICB2b2lkIHtcclxuICAgIHRoaXMuYnVpbGRYTUxfMShtZXNzYWdlLCBpc0N1cnJSZWMsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBvZiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1lc3NhZ2VcIj50aGUgeG1sIG1lc3NhZ2UgdG8gYXBwZW5kIHRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzQ3VyclJlY1wiPmluZGljYXRlIHRoaXMgcmVjb3JkIGFzIHRoZSBjdXJyZW50IHJlY29yZDwvcGFyYW0+XHJcbiAgcHJvdGVjdGVkIGJ1aWxkWE1MXzEobWVzc2FnZTogU3RyaW5nQnVpbGRlciwgaXNDdXJyUmVjOiBib29sZWFuLCBmb3JjZUJ1aWxkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjRmxhZ3M6IFN0cmluZ0J1aWxkZXI7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyLCBzaXplLCBpO1xyXG4gICAgbGV0IGFGbGFnOiBudW1iZXI7XHJcbiAgICBsZXQgaGV4RmxhZzogc3RyaW5nO1xyXG5cclxuICAgIGlmICghZm9yY2VCdWlsZClcclxuICAgICAgaWYgKHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5fbW9kZSAhPT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSAmJlxyXG4gICAgICAgIHRoaXMuX21vZGUgIT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUgJiYgIWlzQ3VyclJlYylcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICAgICAgICAgICA8XCIgKyBDb25zdEludGVyZmFjZS5NR19UQUdfUkVDKTtcclxuICAgIGlmICh0aGlzLl9pZCA+IEludDMyLk1pblZhbHVlKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgXCI9XFxcIlwiICsgdGhpcy5faWQgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ERSArIFwiPVxcXCJcIiArIDxzdHJpbmc+dGhpcy5fbW9kZSArIFwiXFxcIlwiKTtcclxuXHJcbiAgICBpZiAodGhpcy5fbW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCAmJiB0aGlzLl9wcmV2ICE9IG51bGwpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9BRERfQUZURVIgKyBcIj1cXFwiXCIgKyB0aGlzLl9wcmV2LmdldElkKCkgKyBcIlxcXCJcIik7XHJcblxyXG4gICAgLy8gY3VycmVudCByZWNvcmQncyBtb2RlIGlzIG5ldmVyIGNsZWFyZWQsIHRoZSB3aG9sZSByZWNvcmQgaXMgY2xlYXJlZCB3aGVuIHdlIG1vdmUgb24uXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQgJiYgIWlzQ3VyclJlYylcclxuICAgICAgdGhpcy5jbGVhck1vZGUoKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFICsgXCI9XFxcIlwiKTtcclxuXHJcbiAgICBpZiAoIWZvcmNlQnVpbGQgJiYgaXNDdXJyUmVjKVxyXG4gICAgICB0aGlzLnNldFNocmlua0ZsYWdzKCk7XHJcblxyXG4gICAgbGV0IGdldE9sZFZhbDogYm9vbGVhbjtcclxuICAgIGlmICh0aGlzLlN5bmNlZClcclxuICAgICAgZ2V0T2xkVmFsID0gZmFsc2U7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCk7XHJcbiAgICAgIGdldE9sZFZhbCA9ICghaXNDdXJyUmVjICYmICh0YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1JFQ09SRCB8fFxyXG4gICAgICAgIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCkgJiZcclxuICAgICAgIHRoaXMuX2RhdGF2aWV3LmdldEN1cnJSZWMoKSAhPSBudWxsICYmICgoPFJlY29yZD4gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpKSkuZ2V0SWQoKSA9PT0gdGhpcy5faWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGaWVsZHNEYXRhKG1lc3NhZ2UsIGlzQ3VyclJlYywgZ2V0T2xkVmFsKTtcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiXFxcIlwiKTtcclxuICAgIHJlY0ZsYWdzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICBmcm9tID0gdGhpcy5nZXRGcm9tRmxkSWR4KGlzQ3VyclJlYyk7XHJcbiAgICBzaXplID0gdGhpcy5nZXRTaXplRmxkKGlzQ3VyclJlYyk7XHJcblxyXG4gICAgLy8gUUNSIDQ3OTY4Njogc2VuZCBGTEFHX0NSU1JfTU9EIGZyb20gdGhlIGhpc3RvcnksIHRodXMgbGV0IHRoZSBzZXJ2ZXIga25vdyBpZiBhIGZpZWxkXHJcbiAgICAvLyB3YXMgdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNlbnQgaXQgdG8gSVQgKGhlbmNlLCBhIERCTVMgYWN0aW9uIGlzIG5lZWRlZCkuXHJcbiAgICBmb3IgKGkgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkrKykge1xyXG4gICAgICBhRmxhZyA9IHRoaXMuX2ZsYWdzSGlzdG9yeVtpXTtcclxuICAgICAgYUZsYWcgPSBhRmxhZyAmIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQ7XHJcbiAgICAgIGFGbGFnID0gYUZsYWcgfCB0aGlzLl9mbGFnc1tpXTtcclxuXHJcbiAgICAgIC8vIEVhY2ggZmxhZyB3aWxsIGFwcGVhciBpbiB0aGUgeG1sIGluIDIgY2hhcnMgcmVwcmVzZW50aW5nIGhleCB2YWx1ZSAoXCI0MlwiIGZvciAweDQyKS5cclxuICAgICAgaGV4RmxhZyA9IE5OdW1iZXIuVG9TdHJpbmcoYUZsYWcsIFwiWDJcIik7XHJcbiAgICAgIHJlY0ZsYWdzLkFwcGVuZChoZXhGbGFnKTtcclxuXHJcbiAgICAgIC8vIGNsZWFyIHRoZSBzaHJpbmsgZmxhZ1xyXG4gICAgICBpZiAoaXNDdXJyUmVjKVxyXG4gICAgICAgIHRoaXMuX2ZsYWdzW2ldID0gPG51bWJlcj4odGhpcy5fZmxhZ3NbaV0gJiB+UmVjb3JkLkZMQUdfVkFMVUVfTk9UX1BBU1NFRCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0ZMQUdTICsgXCI9XFxcIlwiICsgcmVjRmxhZ3MuVG9TdHJpbmcoKSArIFwiXFxcIlwiKTtcclxuXHJcbiAgICBpZiAoaXNDdXJyUmVjKSB7XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUMgKyBcIj1cXFwiMVxcXCJcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5Nb2RpZmllZClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTU9ESUZJRUQgKyBcIj1cXFwiMVxcXCJcIik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fbGlua3NGbGRzUG9zICE9IG51bGwpXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlBPUyArIFwiPVxcXCJcIiArIFhtbFBhcnNlci5lc2NhcGUodGhpcy5fbGlua3NGbGRzUG9zKSArIFwiXFxcIiBcIik7XHJcblxyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2NhbiB0aGUgcmVjb3JkIGFuZCBjb21wYXJlIGZpZWxkcyB3aXRoIHBhcmFsbGVsIHNlcnZlciBjdXJyIHJlYyxcclxuICAvLy8gICBzZXQgc2hyaW5rIGZsYWcgb24gaWYgZmllbGRzIGFyZSBlcXVhbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwcm90ZWN0ZWQgc2V0U2hyaW5rRmxhZ3MoKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IHRoaXMuZ2V0U2l6ZUZsZCh0cnVlKTtcclxuXHJcbiAgICBsZXQgc2VydmVyQ3VyclJlYzogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0U2VydmVyQ3VyclJlYygpO1xyXG4gICAgLy8gY2Fubm90IHNocmluayBpZiB3ZSBkbyBub3Qga25vdyB3aGF0IGN1cnIgcmVjIHRoZSBzZXJ2ZXIgaG9sZHMuXHJcbiAgICBpZiAoc2VydmVyQ3VyclJlYyA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmZsZFZhbHNFcXVhbChzZXJ2ZXJDdXJyUmVjLCBpKSB8fCAoUmVjb3JkLkZMQUdfTlVMTCA9PT0gKHRoaXMuX2ZsYWdzW2ldICYgUmVjb3JkLkZMQUdfTlVMTCkpKSB7XHJcbiAgICAgICAgdGhpcy5fZmxhZ3NbaV0gPSB0aGlzLl9mbGFnc1tpXSB8IFJlY29yZC5GTEFHX1ZBTFVFX05PVF9QQVNTRUQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCBzaHJpbmsgZmxhZyBmb3Igc3BlY2lmaWMgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZsZElkeFwiPjwvcGFyYW0+XHJcbiAgc2V0U2hyaW5rRmxhZyhmbGRJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZmxhZ3NbZmxkSWR4XSB8PSBSZWNvcmQuRkxBR19WQUxVRV9OT1RfUEFTU0VEO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGZpZWxkIHZhbHVlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBmcm9tIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgU2V0RmllbGRWYWx1ZShpZHg6IG51bWJlciwgaXNOdWxsOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoaWR4KTtcclxuICAgIGZpZWxkLlVwZGF0ZU51bGwoaXNOdWxsLCB0aGlzKTtcclxuXHJcbiAgICB2YWx1ZSA9IHRoaXMuQ2hlY2tNZ1ZhbHVlKHZhbHVlLCBpc051bGwsIGZpZWxkKTtcclxuICAgIHRoaXMuX2ZpZWxkc0RhdGFbaWR4XSA9IHZhbHVlO1xyXG4gICAgZmllbGQudGFrZVZhbEZyb21SZWMoKTtcclxuICAgIHRoaXMuY2xlYXJGbGFnKGZpZWxkLmdldElkKCksIFJlY29yZC5GTEFHX0lOVkFMSUQpO1xyXG4gICAgZmllbGQuaW52YWxpZGF0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGZpZWxkIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBmaWVsZCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZpZWxkLiBtdXN0IGJlIGluIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZXRSZWNvcmRVcGRhdGVkXCI+dGVsbHMgd2hldGhlciB0byBkZWZpbmUgdGhpcyByZWNvcmQgYXMgdXBkYXRlZDwvcGFyYW0+XHJcbiAgc2V0RmllbGRWYWx1ZShmbGRJZHg6IG51bWJlciwgbWdWYWw6IHN0cmluZywgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChmbGRJZHgpO1xyXG5cclxuICAgIC8vIGRvbid0IGNoYW5nZSB2YWx1ZSB3aGVuIHJlZmVyZW5jZXMgYXJlIGVxdWFsIG9yIGlmIHRoZSB0YXNrIG1vZGUgaXMgUXVlcnlcclxuICAgIGlmIChmbGQuUHJldklzTnVsbCgpID09PSBmbGQuaXNOdWxsKCkgJiYgbWdWYWwgPT09IHRoaXMuR2V0RmllbGRWYWx1ZShmbGRJZHgpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG5cclxuICAgIG1nVmFsID0gdGhpcy5DaGVja01nVmFsdWUobWdWYWwsIGZsZC5pc051bGwoKSwgZmxkKTtcclxuXHJcbiAgICBpZiAoZmxkSWR4ID49IDAgJiYgZmxkSWR4IDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkpIHtcclxuICAgICAgdGhpcy5fZmllbGRzRGF0YVtmbGRJZHhdID0gbWdWYWw7XHJcblxyXG4gICAgICAvLyBRQ1IgIzk4NjcxNTogVGhlIGZvbGxvd2luZyBzZXRGbGFnKCkgY2FsbCB3YXMgcmVtb3ZlZCB0byBzb2x2ZSB0aGUgYnVnLlxyXG4gICAgICAvLyBpdCBjYXVzZWQgbWFya2luZyBhIHZhcmlhYmxlIGFzIG1vZGlmaWVkIGV2ZW4gaWYgdGhlIGNoYW5nZSBpcyBkdWUgdG8gdGhlXHJcbiAgICAgIC8vIGNvbXB1dGUgb2YgdGhlIHJlY29yZC4gVGhlIEZMQUdfTU9ESUZJRUQgZmxhZyBpcyBzZXQgY29ycmVjdGx5IGluIHRoZVxyXG4gICAgICAvLyBGaWVsZC5zZXRWYWx1ZSgpIG1ldGhvZC5cclxuICAgICAgLy8gc2V0RmxhZyhmbGRJZHgsIEZMQUdfTU9ESUZJRUQpO1xyXG4gICAgICBpZiAoc2V0UmVjb3JkVXBkYXRlZCkge1xyXG4gICAgICAgIC8vIHNldCBtb2RpZnkgb25seSBpZiB0aGUgZmllbGQgaXMgcGFydCBvZiB0aGUgZGF0YXZpZXcuXHJcbiAgICAgICAgaWYgKGZsZC5QYXJ0T2ZEYXRhdmlldylcclxuICAgICAgICAgIHRoaXMuX21vZGlmaWVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUgZHVlIHRvIHRhc2sgY2xvc2luZyAsIGFuZCBmb3VuZCB0aGF0IHRoZSBjdXJyZW50IHJlYydzIGZsZCBpcyB1cGRhdGVkXHJcbiAgICAgICAgLy8gdGhlbiBzZXQgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24gPSBmYWxzZVxyXG5cdFx0Ly8gU28gdGhhdCBjb21taXQgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIHNlcGFyYXRlbHkgYXQgc2VydmVyIHNpZGUuXHJcbiAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgKDxUYXNrPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKSkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGF0YXZpZXcuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgICB0aGlzLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gUmVjb3JkLnNldEZpZWxkVmFsdWUoKSBpbGxlZ2FsIGZpZWxkIGluZGV4OiBcIiArIGZsZElkeCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjaGVjayBtZ3ZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1ZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2hlY2tNZ1ZhbHVlKG1nVmFsOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbiwgZmxkOiBGaWVsZCk6IHN0cmluZyB7XHJcbiAgICBpZiAobWdWYWwgPT09IG51bGwgfHwgaXNOdWxsKSB7XHJcbiAgICAgIG1nVmFsID0gZmxkLmdldE51bGxWYWx1ZSgpO1xyXG4gICAgICBpZiAobWdWYWwgPT09IG51bGwpXHJcbiAgICAgICAgbWdWYWwgPSBmbGQuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuXHJcbiAgICB9XHJcbiAgICBsZXQgc2l6ZTogbnVtYmVyID0gZmxkLmdldFNpemUoKTtcclxuXHJcbiAgICAvLyB0cnVuY2F0ZSB2YWx1ZXMgdGhhdCBhcmUgbG9uZ2VyIHRoYW4gdGhlIHN0b3JhZ2Ugc2l6ZVxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgZmxkLmdldFR5cGUoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMsIG5vdCBjaGFyYWN0ZXJzIChKUE46IERCQ1Mgc3VwcG9ydClcclxuICAgICAgaWYgKG1nVmFsICE9PSBudWxsICYmIFV0aWxTdHJCeXRlTW9kZS5sZW5CKG1nVmFsKSA+IHNpemUpXHJcbiAgICAgICAgbWdWYWwgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIobWdWYWwsIHNpemUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChtZ1ZhbCAhPT0gbnVsbCAmJiBtZ1ZhbC5sZW5ndGggPiBzaXplKVxyXG4gICAgICAgIG1nVmFsID0gbWdWYWwuc3Vic3RyKDAsIHNpemUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgXCJtb2RpZmllZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldE1vZGlmaWVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcIm1vZGlmaWVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRNb2RpZmllZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGlmaWVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInVwZGF0ZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRVcGRhdGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdXBkYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwibW9kaWZpZWRcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFVwZGF0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgZmllbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGZpZWxkIGluZGV4PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyB0aGUgZmllbGQgdmFsdWU8L3JldHVybnM+XHJcbiAgR2V0RmllbGRWYWx1ZShmbGRJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgdmFsOiBTdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChmbGRJZHggPj0gMCAmJiBmbGRJZHggPCB0aGlzLl9maWVsZHNEYXRhLmxlbmd0aClcclxuICAgICAgdmFsID0gdGhpcy5fZmllbGRzRGF0YVtmbGRJZHhdO1xyXG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXBsaWNhdGUoKTogUmVjb3JkIHtcclxuICAgIGxldCByZWNvcmQ6IFJlY29yZCA9IG5ldyBSZWNvcmQodGhpcyk7XHJcbiAgICByZWNvcmQuX2ZpZWxkc0RhdGEgPSB0aGlzLl9maWVsZHNEYXRhLnNsaWNlKCk7XHJcbiAgICByZWNvcmQuX2ZsYWdzID0gdGhpcy5fZmxhZ3Muc3ViYXJyYXkoMCk7XHJcbiAgICByZWNvcmQuX2ZsYWdzSGlzdG9yeSA9IHRoaXMuX2ZsYWdzSGlzdG9yeS5zdWJhcnJheSgwKTtcclxuICAgIHJlY29yZC5fZGNSZWZzID0gdGhpcy5fZGNSZWZzLkNsb25lKCk7XHJcbiAgICByZXR1cm4gcmVjb3JkO1xyXG4gIH1cclxuXHJcbiAgc2V0U2FtZUFzKHJlYzogUmVjb3JkLCByZWFsT25seTogYm9vbGVhbiwgcklkOiBudW1iZXIpOiB2b2lkO1xyXG4gIHNldFNhbWVBcyhyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHNldFNhbWVBcyhyZWM6IFJlY29yZCwgcmVhbE9ubHk6IGJvb2xlYW4sIHJJZD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHRoaXMuc2V0U2FtZUFzXzAocmVjLCByZWFsT25seSwgcklkKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRTYW1lQXNfMShyZWMsIHJlYWxPbmx5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIHRoaXMgcmVjb3JkIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlXHJcbiAgLy8vICAgb2YgdGhlIGdpdmVuIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNcIj50aGUgc291cmNlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJySWRcIj50aGUgbmV3IElkIG9mIHRoZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0U2FtZUFzXzAocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuLCBySWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRTYW1lQXMocmVjLCByZWFsT25seSk7XHJcbiAgICB0aGlzLnNldElkKHJJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVyIHZhcmlhYmxlcyBvZiB0aGlzIHJlY29yZCB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZVxyXG4gIC8vLyAgIG9mIHRoZSBnaXZlbiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHNvdXJjZSByZWNvcmQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0U2FtZUFzXzEocmVjOiBSZWNvcmQsIHJlYWxPbmx5OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IHJlYy5faWQ7XHJcbiAgICB0aGlzLl9oYXNoS2V5ID0gcmVjLl9oYXNoS2V5O1xyXG5cclxuICAgIGlmICghdGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpLyonUCcqLylcclxuICAgICAgdGhpcy5zZXRNb2RlKHJlYy5fbW9kZSk7XHJcblxyXG4gICAgdGhpcy5fYWRkQWZ0ZXIgPSByZWMuX2FkZEFmdGVyO1xyXG5cclxuICAgIGlmIChyZWFsT25seSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBhZmllbGQ6IEZpZWxkID0gPEZpZWxkPnJlYy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgICBpZiAoIWFmaWVsZC5Jc1ZpcnR1YWwpIHtcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkc0RhdGFbaV0gPSByZWMuX2ZpZWxkc0RhdGFbaV07XHJcbiAgICAgICAgICB0aGlzLl9mbGFnc1tpXSA9IHJlYy5fZmxhZ3NbaV07XHJcbiAgICAgICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbaV0gPSByZWMuX2ZsYWdzSGlzdG9yeVtpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9maWVsZHNEYXRhID0gcmVjLl9maWVsZHNEYXRhO1xyXG4gICAgICB0aGlzLl9mbGFncyA9IHJlYy5fZmxhZ3M7XHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeSA9IHJlYy5fZmxhZ3NIaXN0b3J5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbW9kaWZpZWQgPSByZWMuX21vZGlmaWVkO1xyXG4gICAgdGhpcy5fZGF0YXZpZXcgPSByZWMuX2RhdGF2aWV3O1xyXG4gICAgdGhpcy5fY29tcHV0ZWQgPSByZWMuX2NvbXB1dGVkO1xyXG4gICAgdGhpcy5fdXBkYXRlZCA9IHJlYy5fdXBkYXRlZDtcclxuICAgIHRoaXMuc2V0RGNSZWZzKHJlYy5fZGNSZWZzKTtcclxuXHJcbiAgICAvLyBRQ1IgIzQyMzU1MjogcGFydGlhbCBmaXggLSB3ZSBuZWVkIHRvIGdvIG92ZXIgYWxsIHRoZSByZWMubmV4dC9wcmV2IGFuZCBtYWtlIHN1cmUgdGhpcyByZWNvcmQgZG9lcyBub3QgYXBwZWFyXHJcbiAgICBpZiAocmVjLl9uZXh0ICE9PSB0aGlzKSB7XHJcbiAgICAgIHRoaXMuX25leHQgPSByZWMuX25leHQ7XHJcbiAgICB9XHJcbiAgICBpZiAocmVjLl9wcmV2ICE9PSB0aGlzKSB7XHJcbiAgICAgIHRoaXMuX3ByZXYgPSByZWMuX3ByZXY7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIGEgbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBJc051bGwoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX05VTEwpID09PSBSZWNvcmQuRkxBR19OVUxMKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgYSBudWxsIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIGlzTGlua0ludmFsaWQoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX0lOVkFMSUQpID09PSBSZWNvcmQuRkxBR19JTlZBTElEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSBmaWVsZCBoYXMgbW9kaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNGbGRNb2RpZmllZChmbGRJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9mbGFnc1tmbGRJZHhdICYgUmVjb3JkLkZMQUdfTU9ESUZJRUQpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgZmllbGQgaGFzIG1vZGlmaWVkIGF0IGxlYXN0IG9uY2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjazwvcGFyYW0+XHJcbiAgSXNGbGRNb2RpZmllZEF0TGVhc3RPbmNlKGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLmNoZWNrRmxhZ3MoZmxkSWR4KTtcclxuICAgIHJldHVybiAoKHRoaXMuX2ZsYWdzW2ZsZElkeF0gJiBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBhIGZpZWxkIGhhcyBtb2RpZmllZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrPC9wYXJhbT5cclxuICBpc0ZsZFVwZGF0ZWQoZmxkSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2hlY2tGbGFncyhmbGRJZHgpO1xyXG4gICAgcmV0dXJuICgodGhpcy5fZmxhZ3NbZmxkSWR4XSAmIFJlY29yZC5GTEFHX1VQREFURUQpID09PSBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBmaWVsZCB0byBoYXZlIGEgbnVsbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRJZHhcIj50aGUgaW5kZXggb2YgdGhlIGZpZWxkPC9wYXJhbT5cclxuICBwdWJsaWMgc2V0RmxhZyhmbGRJZHg6IG51bWJlciwgYUZsYWc6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdID0gdGhpcy5fZmxhZ3NbZmxkSWR4XSB8IGFGbGFnO1xyXG4gICAgLy8gTm90ZTogd2Ugb25seSBzZXQgdGhlIGhpc3RvcnkgZmxhZ3MuIFdlIGRvbnQgY2xlYXIgdGhlbSBoZXJlLiBXZSBvbmx5IGNsZWFyIHRoZW0gYWZ0ZXIgWE1MIHdhcyBkdW1wZWQuXHJcbiAgICBpZiAoYUZsYWcgPT09IFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQpXHJcbiAgICAgIHRoaXMuX2ZsYWdzSGlzdG9yeVtmbGRJZHhdID0gdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gfCBhRmxhZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSBmaWVsZCB0byBoYXZlIGEgbm9uLW51bGwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgY2xlYXJGbGFnKGZsZElkeDogbnVtYmVyLCBhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja0ZsYWdzKGZsZElkeCk7XHJcbiAgICB0aGlzLl9mbGFnc1tmbGRJZHhdID0gdGhpcy5fZmxhZ3NbZmxkSWR4XSAmIH5hRmxhZ3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgdGhlIGZsYWdzIGhpc3RvcnkuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBhZnRlciBhIGNvbW1pdC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3NIaXN0b3J5KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKVxyXG4gICAgICB0aGlzLl9mbGFnc0hpc3RvcnlbaV0gPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIGZsYWcgZm9yIGFsbCBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3MoYUZsYWdzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9mbGFncy5sZW5ndGg7IGkgPSBpICsgMSlcclxuICAgICAgdGhpcy5jbGVhckZsYWcoaSwgYUZsYWdzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjbGVhciBmbGFnIGZvciBhbGwgcmVhbCBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyRmxhZ3NGb3JSZWFsT25seShhRmxhZ3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2ZsYWdzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgaWYgKCFmaWVsZC5Jc1ZpcnR1YWwpIHtcclxuICAgICAgICB0aGlzLmNsZWFyRmxhZyhpLCBhRmxhZ3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2xlYXIgYSBzcGVjaWZpYyBmaWVsZCBmbGFnIGZyb20gdGhlIGhpc3RvcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFySGlzdG9yeUZsYWcoZmxkSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9mbGFnc0hpc3RvcnkgIT09IG51bGwgJiYgZmxkSWR4IDwgdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkgJiYgZmxkSWR4ID49IDApIHtcclxuICAgICAgdGhpcy5fZmxhZ3NIaXN0b3J5W2ZsZElkeF0gPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGZsYWdzIGFuZCB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpZWxkIGluZGV4XHJcbiAgLy8vICAgdGhyb3dzIGFuIGVycm9yIGluIGNhc2Ugb2YgYSBmYWlsdXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkeFwiPnRoZSBpbmRleCBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIGNoZWNrRmxhZ3MoZmxkSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9mbGFncyA9PT0gbnVsbCB8fCBmbGRJZHggPj0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCkgfHwgZmxkSWR4IDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJDYW5ub3QgZmluZCBmbGFnc1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0YXJ0IHRoZSByZWNvcmQncyBzZXR0aW5ncy4gVGhpcyBtaWdodCBiZSBuZWVkZWQgYWZ0ZXIgYSBzZXJ2ZXIncyByb2xsYmFja1xyXG4gIC8vLyAgIG9yIHJlc3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib2xkTW9kZVwiPnRoZSBvbGQgcmVjb3JkIG1vZGU8L3BhcmFtPlxyXG4gIHJlc3RhcnQob2xkTW9kZTogRGF0YU1vZGlmaWNhdGlvblR5cGVzKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKTtcclxuXHJcbiAgICBpZiAob2xkTW9kZSA9PT0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmUpIHtcclxuICAgICAgbGV0IHJlYzogUmVjb3JkID0gdGhpcy5fZGF0YXZpZXcuZ2V0Q3VyclJlYygpO1xyXG4gICAgICBsZXQgaXNDdXJyUmVjOiBib29sZWFuID0gKHJlYyAhPSBudWxsICYmIHJlYy5nZXRJZCgpID09PSB0aGlzLl9pZCk7XHJcblxyXG4gICAgICBpZiAoKHRoaXMuX2RhdGF2aWV3LmdldFRhc2soKSkuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICBpZiAoaXNDdXJyUmVjICYmICF0YXNrLmdldEFmdGVyUmV0cnkoKSAmJiB0YXNrLlRyeWluZ1RvQ29tbWl0ICYmICF0aGlzLl9kYXRhdmlldy5pblJvbGxiYWNrKCkpXHJcbiAgICAgICAgICBvbGRNb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZTtcclxuICAgICAgICBlbHNlIG9sZE1vZGUgPSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0O1xyXG5cclxuICAgICAgZWxzZSBvbGRNb2RlID0gRGF0YU1vZGlmaWNhdGlvblR5cGVzLlVwZGF0ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0TW9kZShvbGRNb2RlKTtcclxuICAgIGlmIChvbGRNb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICB0aGlzLnNldE5ld1JlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIGxhdGVDb21wdXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0TGF0ZUNvbXB1dGUodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sYXRlQ29tcHV0ZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcImxhdGVDb21wdXRlXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgbGF0ZUNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGF0ZUNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFwiaW4gZGVsZXRlIHByb2Nlc3NcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIHNldEluRGVsZXRlUHJvY2Vzcyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luRGVsZXRlUHJvY2VzcyA9IHZhbDtcclxuICB9XHJcblxyXG4gIGluRGVsZXRlUHJvY2VzcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbkRlbGV0ZVByb2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVtb3ZpbmcgdGhlIHJlY29yZCwgaXQgd2lsbCBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50XHJcbiAgLy8vICAgb2YgaXRzIGRhdGEgY29udHJvbHMgdG8gdGhlaXIgZGNWYWx1ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlY0Zyb21EYygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9kY1JlZnMgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fZGNSZWZzLkRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wYXJlIHRoZSBkYXRhIG9mIHRoaXMgcmVjb3JkIHdpdGggdGhlIGRhdGEgb2YgYSBkaWZmZXJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBvdGhlciByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyclJlY1wiPlRSVUUgaWYgd2UgYXJlIGNvbXBhcmluZyB0d28gJ2N1cnJlbnQgcmVjb3Jkcycgb3RoZXJ3aXNlIHNob3VsZCBiZSBmYWxzZS48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tPbmx5UGFyZXRPZkRhdGF2aWV3XCI+RkFMU0UgaWYgd2Ugd2FudCB0byBjaGVjayBhbGwgdGhlIGZpZWxkcyAsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBub3QgcGFydCBvZiBkYXRhIHZpZXcuPC9wYXJhbT5cclxuICBpc1NhbWVSZWNEYXRhKHJlYzogUmVjb3JkLCBjdXJyUmVjOiBib29sZWFuLCBjaGVja09ubHlQYXJldE9mRGF0YXZpZXc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSB0aGlzLmdldFNpemVGbGQoY3VyclJlYyk7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciA9IHRoaXMuZ2V0RnJvbUZsZElkeChjdXJyUmVjKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZmllbGQ6IEZpZWxkO1xyXG5cclxuICAgIC8vIGNvbXBhcmUgcmVmZXJlbmNlc1xyXG4gICAgaWYgKHRoaXMgPT09IHJlYylcclxuICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHJlYy5nZXRTaXplRmxkKGN1cnJSZWMpICE9PSBzaXplKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChyZWMuZ2V0RnJvbUZsZElkeChjdXJyUmVjKSAhPT0gc3RhcnQpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgZm9yIChpID0gMDsgaSA8IHN0YXJ0ICsgc2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgZmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrT25seVBhcmV0T2ZEYXRhdmlldyAmJiAhZmllbGQuUGFydE9mRGF0YXZpZXcpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZsZFZhbHNFcXVhbChyZWMsIGkpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbilcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHRocm93ICBlcnI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcGFyZSB0d28gZmllbGQgdmFsdWVzIGJldHdlZW4gdGhpcyByZWNvcmQgYW5kIHRoZSBnaXZlbiByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjXCI+dGhlIHJlY29yZCB0byBjb21wYXJlIHdpdGg8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjb21wYXJlPC9wYXJhbT5cclxuICBmbGRWYWxzRXF1YWwocmVjOiBSZWNvcmQsIGZsZElkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdHlwZTogU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGRzVGFiKCkuZ2V0RmllbGQoZmxkSWR4KS5nZXRUeXBlKCk7XHJcbiAgICByZXR1cm4gRXhwcmVzc2lvbkV2YWx1YXRvci5tZ1ZhbHNFcXVhbCh0aGlzLkdldEZpZWxkVmFsdWUoZmxkSWR4KSwgdGhpcy5Jc051bGwoZmxkSWR4KSwgdHlwZSwgcmVjLkdldEZpZWxkVmFsdWUoZmxkSWR4KSwgcmVjLklzTnVsbChmbGRJZHgpLCB0eXBlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGhhc2gga2V5IG9iamVjdCBvZiB0aGlzIHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SGFzaEtleSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc2hLZXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByZWNvcmRzIGFmdGVyIHRoaXMgb25lLCBpbiBhIGxpc3Qgb2YgcmVjcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV4dFJlY1wiPmlzIHRoZSBuZXh0IHJlY29yZCAob3IgbnVsbCBmb3IgdGhlIGxhc3QgcmVjb3JkKTwvcGFyYW0+XHJcbiAgc2V0TmV4dFJlYyhuZXh0UmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIHRoaXMuX25leHQgPSBuZXh0UmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcmVjb3JkcyBiZWZvcmUgdGhpcyBvbmUsIGluIGEgbGlzdCBvZiByZWNzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcmV2UmVjXCI+aXMgdGhlIHByZXZpb3VzIHJlY29yZCAob3IgbnVsbCBmb3IgdGhlIGZpcnN0IHJlY29yZCk8L3BhcmFtPlxyXG4gIHNldFByZXZSZWMocHJldlJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ID0gcHJldlJlYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJlY29yZCB3aG9zZSBsb2NhdGlvbiBpcyBiZWZvcmUgdGhpcyBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFByZXZSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgcmVjb3JkIHdoaWNoIGZvbGxvd3MgdGhpcyBvbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE5leHRSZWMoKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBEY1JlZnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjUmVmcygpOiBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGNSZWZzLkNsb25lKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IERjUmVmc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0RGNSZWZzKG5ld0RjUmVmczogT2JqZWN0UmVmZXJlbmNlc0NvbGxlY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMucmVtb3ZlUmVjRnJvbURjKCk7XHJcbiAgICB0aGlzLl9kY1JlZnMgPSBuZXdEY1JlZnMuQ2xvbmUoKTtcclxuICAgIHRoaXMuU2V0RGNWYWx1ZUlkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgcmVhbCB2YXJpYWJsZXMgd2FzIG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZWFsTW9kaWZpZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYlJjOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgdGFiU2l6ZTogbnVtYmVyID0gdGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGZvciAoaiA9IDA7IGogPCB0YWJTaXplOyBqKyspIHtcclxuICAgICAgLy8gZm9yIGV2ZXJ5IG1vZGlmaWVkIGZpZWxkIGNoZWNrIGlmIGl0IGlzIGEgcmVhbCBmaWVsZFxyXG4gICAgICBpZiAoKHRoaXMuX2ZsYWdzW2pdICYgUmVjb3JkLkZMQUdfTU9ESUZJRUQpID09PSBSZWNvcmQuRkxBR19NT0RJRklFRCkge1xyXG4gICAgICAgIGlmICghKCg8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChqKSkuSXNWaXJ0dWFsKSkge1xyXG4gICAgICAgICAgYlJjID0gdHJ1ZTsgLy8gaWYgYSByZWFsIG1vZGlmaWVkIGZpZWxkIHdhcyBmb3VuZCwgcmV0dXJuIHdpdGggdHJ1ZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYlJjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHhtbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkIC0gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBzbyB3ZVxyXG4gIC8vLyAgIGNhbiB1c2UgdGhlIHJlY29yZCByZWZlcmVuY2UgaW4gYSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIGFuZCBwcmludCBjYWxsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgVG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5idWlsZFhNTChzdHIsICh0aGlzLl9kYXRhdmlldy5nZXRDdXJyUmVjKCkpLmdldElkKCkgPT09IHRoaXMuX2lkLCB0cnVlKTtcclxuICAgIHJldHVybiBzdHIuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBzZW5kVG9TZXJ2ZXIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0U2VuZFRvU2VydmVyKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VuZFRvU2VydmVyID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgc2l6ZSBpbiBrYiBvZiB0aGUgcmVjb3JkcyBlLmkuIHRoZSBzdW0gb2YgYWxsIGZpZWxkcyBpbiB0aGUgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRSZWNTaXplKCk6IG51bWJlciB7XHJcbiAgICBsZXQgc3VtOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBmaWVsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5nZXRGaWVsZHNUYWIoKS5nZXRGaWVsZChpKTtcclxuICAgICAgc3VtID0gc3VtICsgZmllbGQuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1bTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb3B5IHRoZSBtb2RpZmllZCBjcnNyIGZsYWdzIGZyb20gYSBnaXZlbiByZWMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJlY1wiPnRoZSBzb3VyY2UgcmVjb3JkPC9wYXJhbT5cclxuICBjb3B5Q3Jzck1vZGlmaWVkRmxhZ3MocmVjOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGxldCB0YWJTaXplOiBudW1iZXIgPSB0aGlzLmdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChqID0gMDsgaiA8IHRhYlNpemU7IGorKykge1xyXG4gICAgICB0aGlzLl9mbGFnc1tqXSA9IHJlYy5fZmxhZ3Nbal07XHJcbiAgICAgIHRoaXMuX2ZsYWdzW2pdID0gdGhpcy5fZmxhZ3Nbal0gJiBSZWNvcmQuRkxBR19DUlNSX01PRElGSUVEO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZvciBhIHRhYmxlIGNhY2hlIHJlY29yZCByZXR1cm5zIHRoZSByZWNvcmQncyBkYl9wb3MgdmFsdWUgYXMgYSBiYXNlNjQgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREYlBvc1ZhbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RiUG9zQmFzZTY0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBzdHJpbmcgdGhhdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgbGlua3MgZmllbGRzIGRiX3BvcyB2YWx1ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkTGlua3NQb3NTdHIoKTogdm9pZCB7XHJcbiAgICBsZXQgdGJsOiBEYXRhdmlld0hlYWRlcnMgPSAoPFRhc2s+dGhpcy5fZGF0YXZpZXcuZ2V0VGFzaygpKS5nZXREYXRhdmlld0hlYWRlcnMoKTtcclxuICAgIGlmICh0YmwgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fbGlua3NGbGRzUG9zID0gdGJsLmJ1aWxkRGJQb3NTdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZvcmNlU2F2ZU9yZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlU2F2ZU9yZyA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSByZWxpbmtlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JjZVNhdmVPcmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VTYXZlT3JnO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRydWUsIGlmIGV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiB0aGUgdGFibGUgZHVlIHRvIHZpdHJ1YWwgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ2F1c2VJbnZhbGlkYXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2F1c2VJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaWYgY2F1c2VJbnZhbGlkYXRpb24gaXMgdHJ1ZSwgIGV4aXQgZnJvbSB0aGlzIHJlY29yZCB3aWxsIGNhdXNlIGludmFsaWRhdGlvbiBvZiB0aGUgdGFibGUgZHVlIHRvIHZpdHJ1YWwgcmVjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNhdXNlSW52YWxpZGF0aW9uXCI+PC9wYXJhbT5cclxuICBzZXRDYXVzZUludmFsaWRhdGlvbihjYXVzZUludmFsaWRhdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2F1c2VJbnZhbGlkYXRpb24gPSBjYXVzZUludmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBcImNvbXB1dGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDb21wdXRlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb21wdXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBcImNvbXB1dGVkXCIgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmbGFnPC9wYXJhbT5cclxuICBzZXRDb21wdXRlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbXB1dGVkID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwiaW4gY29tcHV0ZVwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZzwvcGFyYW0+XHJcbiAgc2V0SW5Db21wdXRlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuc2V0Q29tcHV0ZWQodHJ1ZSk7XHJcbiAgICB0aGlzLl9pbkNvbXB1dGUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiByZWNvbXB1dGVcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldEluUmVjb21wdXRlKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5faW5SZWNvbXB1dGUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld01vZGVcIj50aGUgbmV3IG1vZGU6IENyZWF0ZWQsIE1vZGlmaWVkLCBEZWxldGVkPC9wYXJhbT5cclxuICBzZXRNb2RlKG5ld01vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChuZXdNb2RlKSB7XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLk5vbmU6XHJcbiAgICAgIGNhc2UgRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydDpcclxuICAgICAgY2FzZSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlOlxyXG4gICAgICBjYXNlIERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGU6XHJcbiAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lIHx8XHJcbiAgICAgICAgICB0aGlzLl9tb2RlID09PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuVXBkYXRlICYmIG5ld01vZGUgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGUpXHJcbiAgICAgICAgICB0aGlzLl9tb2RlID0gbmV3TW9kZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBSZWNvcmQuc2V0TW9kZSgpOiBpbGxlZ2FsIG1vZGU6IFwiICsgbmV3TW9kZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSByZWNvcmQgbW9kZSB0byBcIm5vbmVcIlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY2xlYXJNb2RlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kZSA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHN3aXRjaCBvZmYgdGhlIG5ld1JlYyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRPbGRSZWMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXdSZWMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzd2l0Y2ggb24gdGhlIG5ld1JlYyBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXROZXdSZWMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uZXdSZWMgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2VyaWFsaXplIGFuIGl0ZW0gKGZpZWxkL2dsb2JhbCBwYXJhbS8uLi4pLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5pdGVtJ3MgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXRlbUF0dHJcIj5pdGVtJ3MgYXR0cmlidXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNlbGxBdHRyXCI+Y2VsbCdzIGF0dHJpYnV0ZSAtIHJlbGV2YW50IG9ubHkgaWYgJ2l0ZW1BdHRyJyBpcyB2ZWN0b3I8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiVG9CYXNlNjRcIj4+ZGVjaWRlIEJhc2U2NCBlbmNvZGluZyBpcyB0byBiZSBkb25lPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+c2VyaWFsaXplZCBpdGVtVmFsIDwvcmV0dXJucz5cclxuICBzdGF0aWMgc2VyaWFsaXplSXRlbVZhbChpdGVtVmFsOiBzdHJpbmcsIGl0ZW1BdHRyOiBTdG9yYWdlQXR0cmlidXRlLCBjZWxsQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSwgVG9CYXNlNjQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFJlY29yZFV0aWxzLnNlcmlhbGl6ZUl0ZW1WYWwoaXRlbVZhbCwgaXRlbUF0dHIsIGNlbGxBdHRyLCBUb0Jhc2U2NCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldHMgRENWYWwgSWQgaW50byBNZ0NvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBTZXREY1ZhbHVlSWQoKTogdm9pZCB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl9kYXRhdmlldy5nZXRUYXNrKCkuZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IG1nQ29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuXHJcbiAgICAvLyBpZiB0aGUgZm9ybSBkb2Vzbid0IGhhdmUgYW55IHNlbGVjdGlvbiBjb250cm9sLCBkY1JlZnMgd291bGQgYmUgbnVsbFxyXG4gICAgaWYgKGZvcm0gIT0gbnVsbCAmJiB0aGlzLl9kY1JlZnMgIT0gbnVsbCkge1xyXG5cclxuICAgICAgdGhpcy5fZGNSZWZzLlJlZnMuZm9yRWFjaCgoZGNSZWY6IERjVmFsdWVzUmVmZXJlbmNlKSA9PiB7XHJcbiAgICAgICAgbWdDb250cm9sID0gPE1nQ29udHJvbD5mb3JtLmdldEN0cmwoZGNSZWYuZGl0SWR4KTtcclxuICAgICAgICBpZiAobWdDb250cm9sICE9IG51bGwpXHJcbiAgICAgICAgICBtZ0NvbnRyb2wuc2V0RGNWYWxJZChkY1JlZi5EY1ZhbHVlcy5nZXRJZCgpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlc2V0IHRoZSBEQ1ZhbCBJZCBpbiBNZ0NvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldERjVmFsdWVJZCgpOiB2b2lkIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX2RhdGF2aWV3LmdldFRhc2soKS5nZXRGb3JtKCk7XHJcbiAgICBsZXQgbWdDb250cm9sOiBNZ0NvbnRyb2wgPSBudWxsO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmb3JtIGRvZXNuJ3QgaGF2ZSBhbnkgc2VsZWN0aW9uIGNvbnRyb2wsIGRjUmVmcyB3b3VsZCBiZSBudWxsXHJcbiAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX2RjUmVmcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RjUmVmcy5SZWZzLmZvckVhY2goZnVuY3Rpb24gKGRjUmVmOiBEY1ZhbHVlc1JlZmVyZW5jZSkge1xyXG4gICAgICAgIG1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+Zm9ybS5nZXRDdHJsKGRjUmVmLmRpdElkeCk7XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICAgICAgbWdDb250cm9sLnNldERjVmFsSWQoRU1QVFlfRENSRUYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEFkZERjVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZDogbnVtYmVyLCBkY1ZhbHVlc0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBkY1ZhbHVlczogRGNWYWx1ZXMgPSB0aGlzLl9kYXRhdmlldy5nZXREY1ZhbHVlcyhkY1ZhbHVlc0lkKTtcclxuICAgIGxldCBkY1JlZjogRGNWYWx1ZXNSZWZlcmVuY2UgPSBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UoY29udHJvbElkLCBkY1ZhbHVlcyk7XHJcbiAgICBpZiAodGhpcy5fZGNSZWZzID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2RjUmVmcyA9IG5ldyBPYmplY3RSZWZlcmVuY2VzQ29sbGVjdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGNSZWZzLkFkZChkY1JlZik7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsaW5rIGJldHdlZW4gYSBkYXRhIGNvbnRyb2wgYW5kIGl0cyBEY1ZhbHVlcyBvYmplY3QuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBEY1ZhbHVlc1JlZmVyZW5jZSBleHRlbmRzIE9iamVjdFJlZmVyZW5jZUJhc2Uge1xyXG4gIGRpdElkeDogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgcmVmZXJlbmNlZCBEY1ZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBEY1ZhbHVlcygpOiBEY1ZhbHVlcyB7XHJcbiAgICByZXR1cm4gPERjVmFsdWVzPnRoaXMuUmVmZXJlbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ1RPUlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb3VwbGVcIj5hIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGRpdElkeCAmIGRjSWQgc2VwYXJhdGVkIGJ5IGEgY29tbWE8L3BhcmFtPlxyXG4gIGNvbnN0cnVjdG9yKGNvbnRyb2xJZDogbnVtYmVyLCByZWZlcmVuY2VkRGNWYWx1ZXM6IERjVmFsdWVzKSB7XHJcbiAgICBzdXBlcihyZWZlcmVuY2VkRGNWYWx1ZXMpO1xyXG4gICAgdGhpcy5kaXRJZHggPSBjb250cm9sSWQ7XHJcbiAgfVxyXG5cclxuICBDbG9uZSgpOiBPYmplY3RSZWZlcmVuY2VCYXNlIHtcclxuICAgIHJldHVybiBuZXcgRGNWYWx1ZXNSZWZlcmVuY2UodGhpcy5kaXRJZHgsIDxEY1ZhbHVlcz50aGlzLlJlZmVyZW50KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBhIG5ldyBEY1ZhbHVlc1JlZmVyZW5jZSBmcm9tIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGludGVnZXJzLCB3aGVyZSB0aGVcclxuICAvLy8gZmlyc3QgaXMgdGhlIGluZGV4IG9mIHRoZSBjb250cm9sIGluIHRoZSBmb3JtIChkaXQgaW5kZXgpIGFuZCB0aGUgc2Vjb25kIGlzIHRoZVxyXG4gIC8vLyBEY1ZhbHVlcyBvYmplY3QgaWRlbnRpZmllci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvdXBsZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGNWYWx1ZXNPd25lclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgUGFyc2UoY291cGxlOiBzdHJpbmcsIGRjVmFsdWVzT3duZXI6IERhdGFWaWV3QmFzZSk6IERjVmFsdWVzUmVmZXJlbmNlIHtcclxuICAgIGxldCBjb21tYVBvczogbnVtYmVyID0gY291cGxlLmluZGV4T2YoXCIsXCIpO1xyXG5cclxuICAgIGxldCBjb250cm9sSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY291cGxlLnN1YnN0cigwLCBjb21tYVBvcykpO1xyXG4gICAgbGV0IGRjSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoY291cGxlLnN1YnN0cihjb21tYVBvcyArIDEpKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IERjVmFsdWVzUmVmZXJlbmNlKGNvbnRyb2xJZCwgZGNWYWx1ZXNPd25lci5nZXREY1ZhbHVlcyhkY0lkKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|