velocious 1.0.590 → 1.0.592
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/README.md +5 -1
- package/build/background-jobs/pooled-runner-broker-identity.js +76 -0
- package/build/background-jobs/pooled-runner-child.js +15 -5
- package/build/background-jobs/store.js +11 -14
- package/build/background-jobs/worker.js +17 -2
- package/build/database/pool/base.js +18 -1
- package/build/environment-handlers/base.js +8 -0
- package/build/environment-handlers/node.js +12 -0
- package/build/src/background-jobs/pooled-runner-broker-identity.d.ts +44 -0
- package/build/src/background-jobs/pooled-runner-broker-identity.d.ts.map +1 -0
- package/build/src/background-jobs/pooled-runner-broker-identity.js +76 -0
- package/build/src/background-jobs/pooled-runner-child.js +16 -6
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +12 -14
- package/build/src/background-jobs/worker.d.ts +6 -0
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +17 -3
- package/build/src/database/pool/base.d.ts +6 -0
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +18 -2
- package/build/src/environment-handlers/base.d.ts +12 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +8 -1
- package/build/src/environment-handlers/node.d.ts +11 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +13 -1
- package/build/src/sync/conflict-strategy.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.js +7 -1
- package/build/src/sync/local-mutation-log.d.ts +10 -0
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +21 -1
- package/build/src/sync/sync-api-client-types.d.ts +15 -0
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-api-client-types.js +4 -1
- package/build/src/sync/sync-api-client.d.ts +91 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +184 -1
- package/build/src/sync/sync-client-types.d.ts +57 -0
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +16 -1
- package/build/src/sync/sync-client.d.ts +56 -7
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +180 -15
- package/build/src/sync/sync-envelope-replay-service.d.ts +31 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +98 -16
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
- package/build/src/sync/sync-model-change-feed-service.js +3 -4
- package/build/src/sync/sync-replay-persisted-data.d.ts +26 -0
- package/build/src/sync/sync-replay-persisted-data.d.ts.map +1 -0
- package/build/src/sync/sync-replay-persisted-data.js +43 -0
- package/build/src/testing/shared-transaction-broker-client.d.ts +53 -0
- package/build/src/testing/shared-transaction-broker-client.d.ts.map +1 -0
- package/build/src/testing/shared-transaction-broker-client.js +105 -0
- package/build/src/testing/shared-transaction-broker.d.ts +153 -0
- package/build/src/testing/shared-transaction-broker.d.ts.map +1 -0
- package/build/src/testing/shared-transaction-broker.js +414 -0
- package/build/src/testing/shared-transaction-codec.d.ts +21 -0
- package/build/src/testing/shared-transaction-codec.d.ts.map +1 -0
- package/build/src/testing/shared-transaction-codec.js +114 -0
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts +23 -0
- package/build/src/testing/shared-transaction-connection-coordinator.d.ts.map +1 -0
- package/build/src/testing/shared-transaction-connection-coordinator.js +36 -0
- package/build/src/testing/shared-transaction-proxy-driver.d.ts +42 -0
- package/build/src/testing/shared-transaction-proxy-driver.d.ts.map +1 -0
- package/build/src/testing/shared-transaction-proxy-driver.js +195 -0
- package/build/src/testing/test-runner.d.ts +20 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +64 -3
- package/build/sync/conflict-strategy.js +3 -0
- package/build/sync/local-mutation-log.js +24 -0
- package/build/sync/sync-api-client-types.js +3 -0
- package/build/sync/sync-api-client.js +203 -0
- package/build/sync/sync-client-types.js +16 -0
- package/build/sync/sync-client.js +198 -14
- package/build/sync/sync-envelope-replay-service.js +109 -12
- package/build/sync/sync-model-change-feed-service.js +2 -4
- package/build/sync/sync-replay-persisted-data.js +50 -0
- package/build/testing/shared-transaction-broker-client.js +107 -0
- package/build/testing/shared-transaction-broker.js +401 -0
- package/build/testing/shared-transaction-codec.js +110 -0
- package/build/testing/shared-transaction-connection-coordinator.js +38 -0
- package/build/testing/shared-transaction-proxy-driver.js +205 -0
- package/build/testing/test-runner.js +65 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -2
- package/src/background-jobs/pooled-runner-broker-identity.js +76 -0
- package/src/background-jobs/pooled-runner-child.js +15 -5
- package/src/background-jobs/store.js +11 -14
- package/src/background-jobs/worker.js +17 -2
- package/src/database/pool/base.js +18 -1
- package/src/environment-handlers/base.js +8 -0
- package/src/environment-handlers/node.js +12 -0
- package/src/sync/conflict-strategy.js +3 -0
- package/src/sync/local-mutation-log.js +24 -0
- package/src/sync/sync-api-client-types.js +3 -0
- package/src/sync/sync-api-client.js +203 -0
- package/src/sync/sync-client-types.js +16 -0
- package/src/sync/sync-client.js +198 -14
- package/src/sync/sync-envelope-replay-service.js +109 -12
- package/src/sync/sync-model-change-feed-service.js +2 -4
- package/src/sync/sync-replay-persisted-data.js +50 -0
- package/src/testing/shared-transaction-broker-client.js +107 -0
- package/src/testing/shared-transaction-broker.js +401 -0
- package/src/testing/shared-transaction-codec.js +110 -0
- package/src/testing/shared-transaction-connection-coordinator.js +38 -0
- package/src/testing/shared-transaction-proxy-driver.js +205 -0
- package/src/testing/test-runner.js +65 -2
|
@@ -35,6 +35,7 @@ import InitializerFromRequireContext from "../database/initializer-from-require-
|
|
|
35
35
|
import toImportSpecifier from "../utils/to-import-specifier.js";
|
|
36
36
|
import { validateTimeZone } from "../time-zone.js";
|
|
37
37
|
import AttachmentPathSource from "./node/attachment-path-source.js";
|
|
38
|
+
import { createSharedTransactionProxyDriver, sharedTransactionBrokerConfig } from "../testing/shared-transaction-proxy-driver.js";
|
|
38
39
|
/**
|
|
39
40
|
* Defines this typedef.
|
|
40
41
|
* @typedef {{ability?: import("../authorization/ability.js").default, offsetMinutes: number, requestTiming?: import("../http-server/client/request-timing.js").default, tenant?: ReturnType<typeof JSON.parse>, timeZone?: string}} TimezoneStore */
|
|
@@ -59,6 +60,17 @@ function pathWithinAllowedPrefixes(filePath, allowedPathPrefixes) {
|
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
export default class VelociousEnvironmentHandlerNode extends Base {
|
|
63
|
+
/**
|
|
64
|
+
* Creates a test-only child proxy when TestRunner supplied an active broker.
|
|
65
|
+
* @param {{DriverClass: typeof import("../database/drivers/base.js").default, config: import("../configuration-types.js").DatabaseConfigurationType, configuration: import("../configuration.js").default, databaseIdentifier: string}} args - Connection details.
|
|
66
|
+
* @returns {Promise<import("../database/drivers/base.js").default | undefined>} - Optional proxy.
|
|
67
|
+
*/
|
|
68
|
+
async createTestSharedTransactionConnection({ DriverClass, config, configuration, databaseIdentifier }) {
|
|
69
|
+
const brokerConfig = sharedTransactionBrokerConfig(databaseIdentifier);
|
|
70
|
+
if (!brokerConfig)
|
|
71
|
+
return undefined;
|
|
72
|
+
return createSharedTransactionProxyDriver(DriverClass, config, configuration, databaseIdentifier, brokerConfig);
|
|
73
|
+
}
|
|
62
74
|
/**
|
|
63
75
|
* Timezone async local storage.
|
|
64
76
|
* @type {import("node:async_hooks").AsyncLocalStorage<TimezoneStore> | undefined} */
|
|
@@ -1006,4 +1018,4 @@ export default class VelociousEnvironmentHandlerNode extends Base {
|
|
|
1006
1018
|
await ensureFrontendModelWebsocketPublishersRegistered(configuration);
|
|
1007
1019
|
}
|
|
1008
1020
|
}
|
|
1009
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHdDQUF3QyxDQUFBO0FBQy9DLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLDJCQUEyQixNQUFNLDBDQUEwQyxDQUFBO0FBQ2xGLE9BQU8sZUFBZSxNQUFNLDZCQUE2QixDQUFBO0FBQ3pELE9BQU8sNkJBQTZCLE1BQU0sNkNBQTZDLENBQUE7QUFDdkYsT0FBTyxpQ0FBaUMsTUFBTSxpREFBaUQsQ0FBQTtBQUMvRixPQUFPLDRCQUE0QixNQUFNLDJDQUEyQyxDQUFBO0FBQ3BGLE9BQU8sd0JBQXdCLE1BQU0sdUNBQXVDLENBQUE7QUFDNUUsT0FBTyw0QkFBNEIsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNwRixPQUFPLGlCQUFpQixNQUFNLCtCQUErQixDQUFBO0FBQzdELE9BQU8saUJBQWlCLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxlQUFlLE1BQU0sNkJBQTZCLENBQUE7QUFDekQsT0FBTyw2QkFBNkIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUN2RixPQUFPLCtCQUErQixNQUFNLCtDQUErQyxDQUFBO0FBQzNGLE9BQU8sK0JBQStCLE1BQU0sK0NBQStDLENBQUE7QUFDM0YsT0FBTyxpQkFBaUIsTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLGtCQUFrQixNQUFNLGdDQUFnQyxDQUFBO0FBQy9ELE9BQU8sdUJBQXVCLE1BQU0sdUNBQXVDLENBQUE7QUFDM0UsT0FBTyx1QkFBdUIsTUFBTSx1Q0FBdUMsQ0FBQTtBQUMzRSxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFBO0FBQzlELE9BQU8saUJBQWlCLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDZCQUE2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QywwQ0FBMEMsQ0FBQyxhQUFhO1FBQzVELDhGQUE4RjtRQUM5RixpR0FBaUc7UUFDakcsK0ZBQStGO1FBQy9GLGtHQUFrRztRQUNsRyw2RkFBNkY7UUFDN0YsMEZBQTBGO1FBQzFGLDhGQUE4RjtRQUM5RixpRkFBaUY7UUFDakYsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFL0MsTUFBTSxFQUFDLGdEQUFnRCxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUVySCxNQUFNLGdEQUFnRCxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3ZFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXCIuLi9kYXRhYmFzZS9hbm5vdGF0aW9ucy1hc3luYy1ob29rcy5qc1wiXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi9iYXNlLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0Rlc3Ryb3lNaWdyYXRpb24gZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvZGVzdHJveS9taWdyYXRpb24uanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzSW5pdCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9pbml0LmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0dlbmVyYXRlQmFzZU1vZGVscyBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9nZW5lcmF0ZS9iYXNlLW1vZGVscy5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNHZW5lcmF0ZUZyb250ZW5kTW9kZWxzIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNHZW5lcmF0ZU1pZ3JhdGlvbiBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9nZW5lcmF0ZS9taWdyYXRpb24uanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzR2VuZXJhdGVNb2RlbCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9nZW5lcmF0ZS9tb2RlbC5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNMaW50UmVsYXRpb25zaGlwcyBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9saW50L3JlbGF0aW9uc2hpcHMuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzUm91dGVzIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL3JvdXRlcy5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNTZXJ2ZXIgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvc2VydmVyLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc1Rlc3QgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvdGVzdC5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic01haW4gZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvYmFja2dyb3VuZC1qb2JzLW1haW4uanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzQmFja2dyb3VuZEpvYnNXb3JrZXIgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvYmFja2dyb3VuZC1qb2JzLXdvcmtlci5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1J1bm5lciBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtcnVubmVyLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0JlYWNvbiBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9iZWFjb24uanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzQ29uc29sZSBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9jb25zb2xlLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0RiU2NoZW1hRHVtcCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9kYi9zY2hlbWEvZHVtcC5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNEYlNjaGVtYUxvYWQgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvZGIvc2NoZW1hL2xvYWQuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzRGJTZWVkIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2RiL3NlZWQuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzUnVubmVyIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL3J1bm5lci5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNSdW5TY3JpcHQgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvcnVuLXNjcmlwdC5qc1wiXG5pbXBvcnQgZnJvbnRlbmRNb2RlbENvbW1hbmRSb3V0ZUhvb2sgZnJvbSBcIi4uL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanNcIlxuaW1wb3J0IHtGUkFNRVdPUktfU09VUkNFX0RJUkVDVE9SWX0gZnJvbSBcIi4uL3V0aWxzL2JhY2t0cmFjZS1jbGVhbmVyLW5vZGUuanNcIlxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7QXN5bmNMb2NhbFN0b3JhZ2UgYXMgTm9kZUFzeW5jTG9jYWxTdG9yYWdlfSBmcm9tIFwibm9kZTphc3luY19ob29rc1wiXG5pbXBvcnQge3RpbWluZ1NhZmVFcXVhbH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCByZXF1aXJlQ29udGV4dCBmcm9tIFwicmVxdWlyZS1jb250ZXh0XCJcbmltcG9ydCBJbml0aWFsaXplckZyb21SZXF1aXJlQ29udGV4dCBmcm9tIFwiLi4vZGF0YWJhc2UvaW5pdGlhbGl6ZXItZnJvbS1yZXF1aXJlLWNvbnRleHQuanNcIlxuaW1wb3J0IHRvSW1wb3J0U3BlY2lmaWVyIGZyb20gXCIuLi91dGlscy90by1pbXBvcnQtc3BlY2lmaWVyLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVUaW1lWm9uZX0gZnJvbSBcIi4uL3RpbWUtem9uZS5qc1wiXG5pbXBvcnQgQXR0YWNobWVudFBhdGhTb3VyY2UgZnJvbSBcIi4vbm9kZS9hdHRhY2htZW50LXBhdGgtc291cmNlLmpzXCJcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7YWJpbGl0eT86IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0LCBvZmZzZXRNaW51dGVzOiBudW1iZXIsIHJlcXVlc3RUaW1pbmc/OiBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCwgdGVuYW50PzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHRpbWVab25lPzogc3RyaW5nfX0gVGltZXpvbmVTdG9yZSAqL1xuXG4vKipcbiAqIFJ1bnMgcGF0aCB3aXRoaW4gYWxsb3dlZCBwcmVmaXhlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIElucHV0IGZpbGUgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGFsbG93ZWRQYXRoUHJlZml4ZXMgLSBBbGxvd2VkIHBhdGggcHJlZml4ZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGlucHV0IHBhdGggaXMgaW5zaWRlIGFuIGFsbG93ZWQgcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXRoV2l0aGluQWxsb3dlZFByZWZpeGVzKGZpbGVQYXRoLCBhbGxvd2VkUGF0aFByZWZpeGVzKSB7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aClcblxuICByZXR1cm4gYWxsb3dlZFBhdGhQcmVmaXhlcy5zb21lKChhbGxvd2VkUHJlZml4KSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRQcmVmaXggPSBwYXRoLnJlc29sdmUoYWxsb3dlZFByZWZpeClcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlc29sdmVkUHJlZml4LCByZXNvbHZlZFBhdGgpXG5cbiAgICBpZiAoIXJlbGF0aXZlUGF0aCkgcmV0dXJuIHRydWVcbiAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiB0cnVlXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0Vudmlyb25tZW50SGFuZGxlck5vZGUgZXh0ZW5kcyBCYXNle1xuICAvKipcbiAgICogVGltZXpvbmUgYXN5bmMgbG9jYWwgc3RvcmFnZS5cbiAgICogQHR5cGUge2ltcG9ydChcIm5vZGU6YXN5bmNfaG9va3NcIikuQXN5bmNMb2NhbFN0b3JhZ2U8VGltZXpvbmVTdG9yZT4gfCB1bmRlZmluZWR9ICovXG4gIF90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlID0gTm9kZUFzeW5jTG9jYWxTdG9yYWdlID8gbmV3IE5vZGVBc3luY0xvY2FsU3RvcmFnZSgpIDogdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEZpbmQgY29tbWFuZHMgcmVzdWx0LlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbW1hbmRGaWxlT2JqZWN0VHlwZVtdIHwgdW5kZWZpbmVkfSAqL1xuICBfZmluZENvbW1hbmRzUmVzdWx0ID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgZW5kcG9pbnQgdG9rZW4gbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVkVG9rZW4gLSBUb2tlbiBmcm9tIHRoZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUb2tlbiAtIENvbmZpZ3VyZWQgdG9rZW4uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYm90aCB0b2tlbnMgbWF0Y2guXG4gICAqL1xuICBkZWJ1Z0VuZHBvaW50VG9rZW5NYXRjaGVzKHByb3ZpZGVkVG9rZW4sIGV4cGVjdGVkVG9rZW4pIHtcbiAgICBjb25zdCBwcm92aWRlZCA9IEJ1ZmZlci5mcm9tKHByb3ZpZGVkVG9rZW4pXG4gICAgY29uc3QgZXhwZWN0ZWQgPSBCdWZmZXIuZnJvbShleHBlY3RlZFRva2VuKVxuXG4gICAgcmV0dXJuIHByb3ZpZGVkLmxlbmd0aCA9PT0gZXhwZWN0ZWQubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChwcm92aWRlZCwgZXhwZWN0ZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZnJhbWV3b3JrIHNvdXJjZSBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVmVsb2Npb3VzIHNvdXJjZSBkaXJlY3RvcnkgdXNlZCB0byBmaWx0ZXIgZnJhbWV3b3JrIHN0YWNrIGZyYW1lcy5cbiAgICovXG4gIGdldEZyYW1ld29ya1NvdXJjZURpcmVjdG9yeSgpIHtcbiAgICByZXR1cm4gRlJBTUVXT1JLX1NPVVJDRV9ESVJFQ1RPUllcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvLWRpc2NvdmVycyByZXNvdXJjZSBjbGFzc2VzIGZyb20gc3JjL3Jlc291cmNlcy8gaW4gZWFjaCBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhdXRvRGlzY292ZXJSZXNvdXJjZXMoY29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uSXNDbGFzc30gPSBhd2FpdCBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiKVxuICAgIGNvbnN0IHtkZWZhdWx0OiBBdXRob3JpemF0aW9uQmFzZVJlc291cmNlfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYmFzZS1yZXNvdXJjZS5qc1wiKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBpZiAoYmFja2VuZFByb2plY3QuYWJpbGl0eVJlc291cmNlcykgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VzRGlyID0gYmFja2VuZFByb2plY3QucmVzb3VyY2VzUGF0aCB8fCBwYXRoLmpvaW4oYmFja2VuZFByb2plY3QucGF0aCwgXCJzcmNcIiwgXCJyZXNvdXJjZXNcIilcbiAgICAgIGxldCBmaWxlc1xuXG4gICAgICB0cnkge1xuICAgICAgICBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIocmVzb3VyY2VzRGlyKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzY292ZXJlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgICBjb25zdCBkaXNjb3ZlcmVkID0ge31cbiAgICAgIC8qKlxuICAgICAgICogRXZlcnkgZGlzY292ZXJlZCBhYmlsaXR5IHJlc291cmNlIGNsYXNzIChmcm9udGVuZC1tb2RlbCBhbmQgYXV0aG9yaXphdGlvbikuXG4gICAgICAgKiBAdHlwZSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgICAgY29uc3QgYWJpbGl0eVJlc291cmNlQ2xhc3NlcyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoXCIuanNcIikgJiYgIWZpbGUuZW5kc1dpdGgoXCIubWpzXCIpKSBjb250aW51ZVxuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKFwiZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2VzXCIpKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHJlc291cmNlc0RpciwgZmlsZSlcbiAgICAgICAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoZmlsZVBhdGgpXG4gICAgICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSBpbXBvcnRlZC5kZWZhdWx0XG5cbiAgICAgICAgLy8gQW55IGF1dGhvcml6YXRpb24gcmVzb3VyY2UgKGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbHNvIGV4dGVuZCBpdCkgdGhhdFxuICAgICAgICAvLyBkZWNsYXJlcyBhIGBNb2RlbENsYXNzYDsgc2tpcCBhYnN0cmFjdC9jb21tb24gYmFzZSByZXNvdXJjZXMgd2l0aG91dCBvbmUuXG4gICAgICAgIGNvbnN0IGlzQWJpbGl0eVJlc291cmNlID0gdHlwZW9mIFJlc291cmNlQ2xhc3MgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICYmIChSZXNvdXJjZUNsYXNzID09PSBBdXRob3JpemF0aW9uQmFzZVJlc291cmNlIHx8IFJlc291cmNlQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQXV0aG9yaXphdGlvbkJhc2VSZXNvdXJjZSlcblxuICAgICAgICBpZiAoIWlzQWJpbGl0eVJlc291cmNlIHx8ICFSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgICAgYWJpbGl0eVJlc291cmNlQ2xhc3Nlcy5wdXNoKFJlc291cmNlQ2xhc3MpXG5cbiAgICAgICAgLy8gT25seSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZHJpdmUgcm91dGluZy9nZW5lcmF0aW9uL3B1Ymxpc2hlciBkaXNjb3ZlcnkuXG4gICAgICAgIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MoUmVzb3VyY2VDbGFzcykpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBmaWxlLnJlcGxhY2UoL1xcLihqc3xtanMpJC8sIFwiXCIpXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGJhc2VOYW1lLnJlcGxhY2UoLy1yZXNvdXJjZSQvLCBcIlwiKVxuICAgICAgICAgIC5zcGxpdChcIi1cIilcbiAgICAgICAgICAubWFwKCgvKiogQHR5cGUge3N0cmluZ30gKi8gcGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkpXG4gICAgICAgICAgLmpvaW4oXCJcIilcblxuICAgICAgICBkaXNjb3ZlcmVkW21vZGVsTmFtZV0gPSBSZXNvdXJjZUNsYXNzXG4gICAgICB9XG5cbiAgICAgIGlmICghYmFja2VuZFByb2plY3QuZnJvbnRlbmRNb2RlbHMgJiYgT2JqZWN0LmtleXMoZGlzY292ZXJlZCkubGVuZ3RoID4gMCkge1xuICAgICAgICBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVscyA9IGRpc2NvdmVyZWRcbiAgICAgIH1cblxuICAgICAgaWYgKGFiaWxpdHlSZXNvdXJjZUNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBiYWNrZW5kUHJvamVjdC5hYmlsaXR5UmVzb3VyY2VzID0gYWJpbGl0eVJlc291cmNlQ2xhc3Nlc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBtb2RlbHMgY29udHJpYnV0ZWQgYnkgcmVnaXN0ZXJlZCBwYWNrYWdlcyBpbnRvIHRoZSBtb2RlbCByZWdpc3RyeSxcbiAgICogYWZ0ZXIgdGhlIGFwcCdzIG93biBgaW5pdGlhbGl6ZU1vZGVsc2AgaG9vay4gQSBwYWNrYWdlIHdob3NlIG1vZGVscyBkaXJlY3RvcnlcbiAgICogaXMgYWJzZW50IGlzIHNraXBwZWQ7IGEgcGFja2FnZSBtb2RlbCB3aG9zZSBuYW1lIGNvbGxpZGVzIHdpdGggYW5cbiAgICogYWxyZWFkeS1yZWdpc3RlcmVkIGRpZmZlcmVudCBjbGFzcyB0aHJvd3MuIE5vZGUtb25seSAodXNlcyB0aGUgZmlsZXN5c3RlbSksIHNvXG4gICAqIGl0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGJyb3dzZXItYnVuZGxlZCBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplUGFja2FnZU1vZGVscyhjb25maWd1cmF0aW9uKSB7XG4gICAgZm9yIChjb25zdCB2ZWxvY2lvdXNQYWNrYWdlIG9mIGNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZXMoKSkge1xuICAgICAgY29uc3QgbW9kZWxzUGF0aCA9IHZlbG9jaW91c1BhY2thZ2UuZ2V0TW9kZWxzUGF0aCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyhtb2RlbHNQYXRoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VSZXF1aXJlQ29udGV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvaW5pdGlhbGl6ZXItZnJvbS1yZXF1aXJlLWNvbnRleHQuanNcIikuTW9kZWxDbGFzc1JlcXVpcmVDb250ZXh0VHlwZX0gKi8gKHJlcXVpcmVDb250ZXh0KG1vZGVsc1BhdGgsIHRydWUsIC9eKC4rKVxcLmpzJC8pKVxuICAgICAgY29uc3QgbW9kZWxDbGFzc2VzID0gY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIHBhY2thZ2VSZXF1aXJlQ29udGV4dC5rZXlzKCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHBhY2thZ2VSZXF1aXJlQ29udGV4dChmaWxlTmFtZSk/LmRlZmF1bHRcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBtb2RlbENsYXNzICYmIG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXVxuXG4gICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZyAhPT0gbW9kZWxDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBcIiR7dmVsb2Npb3VzUGFja2FnZS5nZXROYW1lKCl9XCIgbW9kZWwgXCIke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9XCIgY29sbGlkZXMgd2l0aCBhbiBhbHJlYWR5LXJlZ2lzdGVyZWQgbW9kZWwuYClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgSW5pdGlhbGl6ZSAke3ZlbG9jaW91c1BhY2thZ2UuZ2V0TmFtZSgpfSBwYWNrYWdlIG1vZGVsc2B9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG5ldyBJbml0aWFsaXplckZyb21SZXF1aXJlQ29udGV4dCh7cmVxdWlyZUNvbnRleHQ6IHBhY2thZ2VSZXF1aXJlQ29udGV4dH0pLmluaXRpYWxpemUoe2NvbmZpZ3VyYXRpb259KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IG5ld0NvbmZpZ3VyYXRpb24gLSBOZXcgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q29uZmlndXJhdGlvbihuZXdDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIuc2V0Q29uZmlndXJhdGlvbihuZXdDb25maWd1cmF0aW9uKVxuXG4gICAgaWYgKCFuZXdDb25maWd1cmF0aW9uLmdldFJvdXRlUmVzb2x2ZXJIb29rcygpLmluY2x1ZGVzKGZyb250ZW5kTW9kZWxDb21tYW5kUm91dGVIb29rKSkge1xuICAgICAgbmV3Q29uZmlndXJhdGlvbi5hZGRSb3V0ZVJlc29sdmVySG9vayhmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vaylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWFkIGF0dGFjaG1lbnQgaW5wdXQgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIEZpbGUgYnl0ZXMuXG4gICAqL1xuICBhc3luYyByZWFkQXR0YWNobWVudElucHV0RmlsZShmaWxlUGF0aCkge1xuICAgIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgYXR0YWNobWVudCBpbnB1dCBwYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MuYWxsb3dlZFBhdGhQcmVmaXhlcyAtIEFsbG93ZWQgcGF0aCBwcmVmaXhlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW5wdXRQYXRoIC0gSW5wdXQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXR0YWNobWVudFBhdGhTb3VyY2U+fSAtIE9wZW5lZCByZWd1bGFyLWZpbGUgcGF0aCBzb3VyY2UuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQXR0YWNobWVudElucHV0UGF0aCh7YWxsb3dlZFBhdGhQcmVmaXhlcywgaW5wdXRQYXRofSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0UGF0aClcbiAgICBjb25zdCBwcmVmaXhlcyA9IEFycmF5LmlzQXJyYXkoYWxsb3dlZFBhdGhQcmVmaXhlcylcbiAgICAgID8gYWxsb3dlZFBhdGhQcmVmaXhlcy5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgJiYgZW50cnkubGVuZ3RoID4gMClcbiAgICAgIDogW11cblxuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAwICYmICFwYXRoV2l0aGluQWxsb3dlZFByZWZpeGVzKGZpbGVQYXRoLCBwcmVmaXhlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgcGF0aCBpcyBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgXCJyXCIpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgZmlsZUhhbmRsZS5zdGF0KClcblxuICAgICAgaWYgKCFmaWxlU3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCBwYXRoIG11c3QgcmVmZXJlbmNlIGEgcmVndWxhciBmaWxlXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXR0YWNobWVudFBhdGhTb3VyY2Uoe1xuICAgICAgICBieXRlU2l6ZTogZmlsZVN0YXRzLnNpemUsXG4gICAgICAgIGZpbGVIYW5kbGUsXG4gICAgICAgIGZpbGVQYXRoXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKClcbiAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgIFtlcnJvciwgY2xvc2VFcnJvcl0sXG4gICAgICAgICAgYEF0dGFjaG1lbnQgcGF0aCB2YWxpZGF0aW9uIGFuZCBzb3VyY2UgY2xvc2UgYm90aCBmYWlsZWQgZm9yICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB7Y2F1c2U6IGNsb3NlRXJyb3J9XG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIGNvbW1hbmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBhc3luYyBmaW5kQ29tbWFuZHMoKSB7XG4gICAgdGhpcy5fZmluZENvbW1hbmRzUmVzdWx0IHx8PSBhd2FpdCB0aGlzLl9hY3R1YWxGaW5kQ29tbWFuZHMoKVxuXG4gICAgaWYgKCF0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY29tbWFuZHNcIilcblxuICAgIHJldHVybiB0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIHRpbWV6b25lIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldE1pbnV0ZXMgLSBPZmZzZXQgaW4gbWludXRlcyAoRGF0ZSNnZXRUaW1lem9uZU9mZnNldCkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IG9mIHRoZSBjYWxsYmFjay5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhUaW1lem9uZU9mZnNldChvZmZzZXRNaW51dGVzLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1N0b3JlID0gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5ydW4oe1xuICAgICAgYWJpbGl0eTogZXhpc3RpbmdTdG9yZT8uYWJpbGl0eSxcbiAgICAgIG9mZnNldE1pbnV0ZXMsXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICB9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVpvbmUgLSBJQU5BIHRpbWV6b25lIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IG9mIHRoZSBjYWxsYmFjay5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhUaW1lem9uZSh0aW1lWm9uZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBhd2FpdCBzdXBlci5ydW5XaXRoVGltZXpvbmUodGltZVpvbmUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5OiBleGlzdGluZ1N0b3JlPy5hYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogdmFsaWRhdGVUaW1lWm9uZSh0aW1lWm9uZSwgXCJ0aW1lWm9uZVwiKVxuICAgIH0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHRpbWV6b25lIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldE1pbnV0ZXMgLSBPZmZzZXQgaW4gbWludXRlcyAoRGF0ZSNnZXRUaW1lem9uZU9mZnNldCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFRpbWV6b25lT2Zmc2V0KG9mZnNldE1pbnV0ZXMpIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHJldHVyblxuXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChzdG9yZSkge1xuICAgICAgc3RvcmUub2Zmc2V0TWludXRlcyA9IG9mZnNldE1pbnV0ZXNcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdTdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgICB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmVudGVyV2l0aCh7XG4gICAgICAgIGFiaWxpdHk6IGV4aXN0aW5nU3RvcmU/LmFiaWxpdHksXG4gICAgICAgIG9mZnNldE1pbnV0ZXMsXG4gICAgICAgIHJlcXVlc3RUaW1pbmc6IGV4aXN0aW5nU3RvcmU/LnJlcXVlc3RUaW1pbmcsXG4gICAgICAgIHRlbmFudDogZXhpc3RpbmdTdG9yZT8udGVuYW50LFxuICAgICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVpvbmUgLSBJQU5BIHRpbWV6b25lIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFRpbWV6b25lKHRpbWVab25lKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBzdXBlci5zZXRUaW1lem9uZSh0aW1lWm9uZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUaW1lWm9uZSA9IHZhbGlkYXRlVGltZVpvbmUodGltZVpvbmUsIFwidGltZVpvbmVcIilcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgaWYgKHN0b3JlKSB7XG4gICAgICBzdG9yZS50aW1lWm9uZSA9IG5vcm1hbGl6ZWRUaW1lWm9uZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleGlzdGluZ1N0b3JlID0gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICAgIHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZW50ZXJXaXRoKHtcbiAgICAgICAgYWJpbGl0eTogZXhpc3RpbmdTdG9yZT8uYWJpbGl0eSxcbiAgICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICAgIHJlcXVlc3RUaW1pbmc6IGV4aXN0aW5nU3RvcmU/LnJlcXVlc3RUaW1pbmcsXG4gICAgICAgIHRlbmFudDogZXhpc3RpbmdTdG9yZT8udGVuYW50LFxuICAgICAgICB0aW1lWm9uZTogbm9ybWFsaXplZFRpbWVab25lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0aW1lem9uZSBvZmZzZXQgbWludXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE9mZnNldCBpbiBtaW51dGVzLlxuICAgKi9cbiAgZ2V0VGltZXpvbmVPZmZzZXRNaW51dGVzKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAodGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgICAgaWYgKHN0b3JlICYmIHR5cGVvZiBzdG9yZS5vZmZzZXRNaW51dGVzID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBzdG9yZS5vZmZzZXRNaW51dGVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyhjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGltZXpvbmUgaWRlbnRpZmllci5cbiAgICovXG4gIGdldFRpbWVab25lKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAodGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgICAgaWYgKHN0b3JlICYmIHR5cGVvZiBzdG9yZS50aW1lWm9uZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gc3RvcmUudGltZVpvbmVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0VGltZVpvbmUoY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5IHRvIHNldCBmb3IgY2FsbGJhY2sgc2NvcGUuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICB9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBjdXJyZW50IGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5IHRvIHNldC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q3VycmVudEFiaWxpdHkoYWJpbGl0eSkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgc3VwZXIuc2V0Q3VycmVudEFiaWxpdHkoYWJpbGl0eSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChleGlzdGluZ1N0b3JlKSB7XG4gICAgICBleGlzdGluZ1N0b3JlLmFiaWxpdHkgPSBhYmlsaXR5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZW50ZXJXaXRoKHtcbiAgICAgICAgYWJpbGl0eSxcbiAgICAgICAgb2Zmc2V0TWludXRlczogdGhpcy5nZXRUaW1lem9uZU9mZnNldE1pbnV0ZXModGhpcy5nZXRDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICByZXF1ZXN0VGltaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHRlbmFudDogdW5kZWZpbmVkLFxuICAgICAgICB0aW1lWm9uZTogdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgYWJpbGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgYWJpbGl0eS5cbiAgICovXG4gIGdldEN1cnJlbnRBYmlsaXR5KCkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRBYmlsaXR5KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy5hYmlsaXR5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gd2l0aCByZXF1ZXN0IHRpbWluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gcmVxdWVzdFRpbWluZyAtIFJlcXVlc3QgdGltaW5nIGNvbGxlY3Rvci5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhSZXF1ZXN0VGltaW5nKHJlcXVlc3RUaW1pbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VwZXIucnVuV2l0aFJlcXVlc3RUaW1pbmcocmVxdWVzdFRpbWluZywgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdTdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UucnVuKHtcbiAgICAgIGFiaWxpdHk6IGV4aXN0aW5nU3RvcmU/LmFiaWxpdHksXG4gICAgICBvZmZzZXRNaW51dGVzOiBleGlzdGluZ1N0b3JlPy5vZmZzZXRNaW51dGVzID8/IHRoaXMuZ2V0VGltZXpvbmVPZmZzZXRNaW51dGVzKHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKSxcbiAgICAgIHJlcXVlc3RUaW1pbmcsXG4gICAgICB0ZW5hbnQ6IGV4aXN0aW5nU3RvcmU/LnRlbmFudCxcbiAgICAgIHRpbWVab25lOiBleGlzdGluZ1N0b3JlPy50aW1lWm9uZSA/PyB0aGlzLmdldFRpbWVab25lKHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKVxuICAgIH0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgcmVxdWVzdCB0aW1pbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IHJlcXVlc3QgdGltaW5nIGNvbGxlY3Rvci5cbiAgICovXG4gIGdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKCkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy5yZXF1ZXN0VGltaW5nXG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gd2l0aCB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHRlbmFudCAtIFRlbmFudCB0byBzZXQgZm9yIGNhbGxiYWNrIHNjb3BlLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuV2l0aFRlbmFudCh0ZW5hbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VwZXIucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5OiBleGlzdGluZ1N0b3JlPy5hYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50LFxuICAgICAgdGltZVpvbmU6IGV4aXN0aW5nU3RvcmU/LnRpbWVab25lID8/IHRoaXMuZ2V0VGltZVpvbmUodGhpcy5nZXRDb25maWd1cmF0aW9uKCkpXG4gICAgfSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY3VycmVudCB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHRlbmFudCAtIFRlbmFudCB0byBzZXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEN1cnJlbnRUZW5hbnQodGVuYW50KSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBzdXBlci5zZXRDdXJyZW50VGVuYW50KHRlbmFudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChleGlzdGluZ1N0b3JlKSB7XG4gICAgICBleGlzdGluZ1N0b3JlLnRlbmFudCA9IHRlbmFudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmVudGVyV2l0aCh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgb2Zmc2V0TWludXRlczogdGhpcy5nZXRUaW1lem9uZU9mZnNldE1pbnV0ZXModGhpcy5nZXRDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICByZXF1ZXN0VGltaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgdGltZVpvbmU6IHRoaXMuZ2V0VGltZVpvbmUodGhpcy5nZXRDb25maWd1cmF0aW9uKCkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjdXJyZW50IHRlbmFudC5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEN1cnJlbnQgdGVuYW50LlxuICAgKi9cbiAgZ2V0Q3VycmVudFRlbmFudCgpIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdXBlci5nZXRDdXJyZW50VGVuYW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy50ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFjdHVhbCBmaW5kIGNvbW1hbmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCBkaXNjb3ZlcmVkIGNvbW1hbmQgZmlsZXMuXG4gICAqL1xuICBhc3luYyBfYWN0dWFsRmluZENvbW1hbmRzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5nZXRCYXNlUGF0aCgpXG4gICAgY29uc3QgY29tbWFuZEZpbGVzID0gZnMuZ2xvYihgJHtiYXNlUGF0aH0vc3JjL2NsaS9jb21tYW5kcy8qKi8qLmpzYClcbiAgICBjb25zdCBjb21tYW5kcyA9IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGFGaWxlUGF0aCBvZiBjb21tYW5kRmlsZXMpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5jb21tYW5kTmFtZUZyb21GaWxlUGF0aChhRmlsZVBhdGgpXG5cbiAgICAgIGNvbW1hbmRzLnB1c2goe25hbWU6IGNvbW1hbmROYW1lLCBmaWxlOiBhRmlsZVBhdGh9KVxuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29tbWFuZCBuYW1lIGZyb20gZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIGNvbW1hbmQgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBhcnNlZCBjb21tYW5kIG5hbWUuXG4gICAqL1xuICBjb21tYW5kTmFtZUZyb21GaWxlUGF0aChmaWxlUGF0aCkge1xuICAgIGNvbnN0IGFGaWxlUGF0aFBhcnRzID0gZmlsZVBhdGguc3BsaXQoL1tcXFxcL10vKVxuICAgIGNvbnN0IGNvbW1hbmRQYXRoTG9jYXRpb24gPSBhRmlsZVBhdGhQYXJ0cy5pbmRleE9mKFwiY29tbWFuZHNcIilcblxuICAgIGlmIChjb21tYW5kUGF0aExvY2F0aW9uID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgY29tbWFuZCBmaWxlIHBhdGg6ICR7ZmlsZVBhdGh9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kUGFydHMgPSBhRmlsZVBhdGhQYXJ0cy5zbGljZShjb21tYW5kUGF0aExvY2F0aW9uICsgMSlcbiAgICBjb25zdCBsYXN0UGFydCA9IGNvbW1hbmRQYXJ0c1tjb21tYW5kUGFydHMubGVuZ3RoIC0gMV1cbiAgICBsZXQgbmFtZSwgcGF0aHNcblxuICAgIGlmIChsYXN0UGFydCA9PSBcImluZGV4LmpzXCIpIHtcbiAgICAgIG5hbWUgPSBjb21tYW5kUGFydHNbY29tbWFuZFBhcnRzLmxlbmd0aCAtIDJdXG4gICAgICBwYXRocyA9IGNvbW1hbmRQYXJ0cy5zbGljZSgwLCAtMilcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IGxhc3RQYXJ0LnJlcGxhY2UoXCIuanNcIiwgXCJcIilcbiAgICAgIHBhdGhzID0gY29tbWFuZFBhcnRzLnNsaWNlKDAsIC0xKVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXRocy5qb2luKFwiOlwiKX0ke3BhdGhzLmxlbmd0aCA+IDAgPyBcIjpcIiA6IFwiXCJ9JHtuYW1lfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBpbml0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzSW5pdChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNJbml0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIG1pZ3JhdGlvbiBnZW5lcmF0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc01pZ3JhdGlvbkdlbmVyYXRlKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlTWlncmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIG1pZ3JhdGlvbiBkZXN0cm95LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzTWlncmF0aW9uRGVzdHJveShjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEZXN0cm95TWlncmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGdlbmVyYXRlIGJhc2UgbW9kZWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzR2VuZXJhdGVCYXNlTW9kZWxzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlQmFzZU1vZGVscylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBnZW5lcmF0ZSBmcm9udGVuZCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNHZW5lcmF0ZUZyb250ZW5kTW9kZWxzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlRnJvbnRlbmRNb2RlbHMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgZ2VuZXJhdGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNHZW5lcmF0ZU1vZGVsKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlTW9kZWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgbGludCByZWxhdGlvbnNoaXBzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzTGludFJlbGF0aW9uc2hpcHMoY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzTGludFJlbGF0aW9uc2hpcHMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgcm91dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUm91dGVzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1JvdXRlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBjb25zb2xlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzQ29uc29sZShjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNDb25zb2xlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIHNlcnZlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc1NlcnZlcihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNTZXJ2ZXIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgdGVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc1Rlc3QoY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzVGVzdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBiYWNrZ3JvdW5kIGpvYnMgbWFpbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0JhY2tncm91bmRKb2JzTWFpbihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic01haW4pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgYmFja2dyb3VuZCBqb2JzIHdvcmtlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0JhY2tncm91bmRKb2JzV29ya2VyKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0JhY2tncm91bmRKb2JzV29ya2VyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGJhY2tncm91bmQgam9icyBydW5uZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1J1bm5lcihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1J1bm5lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBiZWFjb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNCZWFjb24oY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzQmVhY29uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9hZCBiZWFjb24gY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vYmVhY29uL2NsaWVudC5qc1wiKS5kZWZhdWx0Pn0gLSBCZWFjb24gY2xpZW50IGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgbG9hZEJlYWNvbkNsaWVudCgpIHtcbiAgICBjb25zdCB7ZGVmYXVsdDogQmVhY29uQ2xpZW50fSA9IGF3YWl0IGltcG9ydChcIi4uL2JlYWNvbi9jbGllbnQuanNcIilcblxuICAgIHJldHVybiBCZWFjb25DbGllbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvYWQgaW4gcHJvY2VzcyBiZWFjb24gY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vYmVhY29uL2luLXByb2Nlc3MtY2xpZW50LmpzXCIpLmRlZmF1bHQ+fSAtIEluLXByb2Nlc3MgY2xpZW50IGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluUHJvY2Vzc0JlYWNvbkNsaWVudCgpIHtcbiAgICBjb25zdCB7ZGVmYXVsdDogSW5Qcm9jZXNzQmVhY29uQ2xpZW50fSA9IGF3YWl0IGltcG9ydChcIi4uL2JlYWNvbi9pbi1wcm9jZXNzLWNsaWVudC5qc1wiKVxuXG4gICAgcmV0dXJuIEluUHJvY2Vzc0JlYWNvbkNsaWVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGRiIHNjaGVtYSBkdW1wLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzRGJTY2hlbWFEdW1wKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0RiU2NoZW1hRHVtcClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBkYiBzY2hlbWEgbG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0RiU2NoZW1hTG9hZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEYlNjaGVtYUxvYWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgZGIgc2VlZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0RiU2VlZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEYlNlZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgcnVubmVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUnVubmVyKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1J1bm5lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBydW4gc2NyaXB0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUnVuU2NyaXB0KGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1J1blNjcmlwdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcXVpcmUgY29tbWFuZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5jb21tYW5kUGFydHMgLSBDb21tYW5kIHBhcnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0IChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgcmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0c30pIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IGF3YWl0IHRoaXMuZmluZENvbW1hbmRzKClcbiAgICBjb25zdCBjb21tYW5kTmFtZSA9IGNvbW1hbmRQYXJ0cy5qb2luKFwiOlwiKVxuICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kcy5maW5kKChhQ29tbWFuZCkgPT4gYUNvbW1hbmQubmFtZSA9PT0gY29tbWFuZE5hbWUpXG5cbiAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlQ29tbWFuZHMgPSBjb21tYW5kcy5tYXAoYUNvbW1hbmQgPT4gYUNvbW1hbmQubmFtZSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZFBhcnRzLmpvaW4oXCI6XCIpfSB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIG9uZSBvZjogJHtwb3NzaWJsZUNvbW1hbmRzLnNvcnQoKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kQ2xhc3NJbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoY29tbWFuZC5maWxlKSlcbiAgICBjb25zdCBDb21tYW5kQ2xhc3MgPSBjb21tYW5kQ2xhc3NJbXBvcnQuZGVmYXVsdFxuXG4gICAgcmV0dXJuIENvbW1hbmRDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBtaWdyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMuXG4gICAqL1xuICBhc3luYyBmaW5kTWlncmF0aW9ucygpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBtaWdyYXRpb25EaXJlY3RvcmllcyA9IFtgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2BdXG5cbiAgICBmb3IgKGNvbnN0IHZlbG9jaW91c1BhY2thZ2Ugb2YgY29uZmlndXJhdGlvbi5nZXRQYWNrYWdlcygpKSB7XG4gICAgICBtaWdyYXRpb25EaXJlY3Rvcmllcy5wdXNoKHZlbG9jaW91c1BhY2thZ2UuZ2V0TWlncmF0aW9uc1BhdGgoKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlPn0gKi9cbiAgICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbnNQYXRoIG9mIG1pZ3JhdGlvbkRpcmVjdG9yaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9jb2xsZWN0TWlncmF0aW9uc0Zyb21EaXJlY3RvcnkobWlncmF0aW9uc1BhdGgsIGZpbGVzKVxuICAgIH1cblxuICAgIHRoaXMuX2Vuc3VyZU5vTWlncmF0aW9uVGltZXN0YW1wQ29sbGlzaW9ucyhmaWxlcylcblxuICAgIHJldHVybiBmaWxlcy5zb3J0KChtaWdyYXRpb24xLCBtaWdyYXRpb24yKSA9PiBtaWdyYXRpb24xLmRhdGUgLSBtaWdyYXRpb24yLmRhdGUpXG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgbWlncmF0aW9uIGZpbGVzIGZyb20gb25lIGRpcmVjdG9yeSBpbnRvIGBmaWxlc2AsIHByZXNlcnZpbmcgZWFjaFxuICAgKiBmaWxlJ3MgcmVhbCBhYnNvbHV0ZSBwYXRoIChzbyBhcHAgYW5kIHBhY2thZ2UgbWlncmF0aW9ucyBrZWVwIHRoZWlyIG93blxuICAgKiBzb3VyY2UgbG9jYXRpb24pLiBBIG1pc3NpbmcgZGlyZWN0b3J5IGlzIHNraXBwZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtaWdyYXRpb25zUGF0aCAtIERpcmVjdG9yeSB0byBzY2FuLlxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlPn0gZmlsZXMgLSBBY2N1bXVsYXRvciB0byBwdXNoIGludG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfY29sbGVjdE1pZ3JhdGlvbnNGcm9tRGlyZWN0b3J5KG1pZ3JhdGlvbnNQYXRoLCBmaWxlcykge1xuICAgIGNvbnN0IGdsb2IgPSBhd2FpdCBmcy5nbG9iKGAke21pZ3JhdGlvbnNQYXRofS8qKi8qLmpzYClcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZ1bGxQYXRoIG9mIGdsb2IpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHBhdGguYmFzZW5hbWUoZnVsbFBhdGgpXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZmlsZS5tYXRjaCgvXihcXGR7MTR9KS0oLispXFwuanMkLylcblxuICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZUludChtYXRjaFsxXSlcbiAgICAgICAgY29uc3QgbWlncmF0aW9uTmFtZSA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobWlncmF0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgZmlsZXMucHVzaCh7ZmlsZSwgZnVsbFBhdGgsIGRhdGUsIG1pZ3JhdGlvbkNsYXNzTmFtZX0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpPy5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0d28gbWlncmF0aW9ucyBmcm9tIGRpZmZlcmVudCBmaWxlcyBzaGFyZSB0aGUgc2FtZSAxNC1kaWdpdFxuICAgKiB0aW1lc3RhbXAuIFRoZSBgc2NoZW1hX21pZ3JhdGlvbnNgIGxlZGdlciBrZXlzIG9uIHRoZSB0aW1lc3RhbXAsIHNvIGEgc2lsZW50XG4gICAqIGNvbGxpc2lvbiAoZS5nLiBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgcGFja2FnZSwgb3IgdHdvIHBhY2thZ2VzKSB3b3VsZCBsZWF2ZVxuICAgKiB0aGUgc2Vjb25kIG1pZ3JhdGlvbiB1bi1ydW4g4oCUIGEgZGF0YSBidWcuIEZhaWwgbG91ZGx5IGluc3RlYWQuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGU+fSBmaWxlcyAtIENvbGxlY3RlZCBtaWdyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfZW5zdXJlTm9NaWdyYXRpb25UaW1lc3RhbXBDb2xsaXNpb25zKGZpbGVzKSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHBhdGhzQnlEYXRlID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBmaWxlcykge1xuICAgICAgaWYgKCFtaWdyYXRpb24uZnVsbFBhdGgpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGF0aHNCeURhdGUuZ2V0KG1pZ3JhdGlvbi5kYXRlKVxuXG4gICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcgIT09IG1pZ3JhdGlvbi5mdWxsUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR3byBtaWdyYXRpb25zIHNoYXJlIHRoZSB0aW1lc3RhbXAgJHttaWdyYXRpb24uZGF0ZX06ICR7ZXhpc3Rpbmd9IGFuZCAke21pZ3JhdGlvbi5mdWxsUGF0aH0uIE1pZ3JhdGlvbiB0aW1lc3RhbXBzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyB0aGUgYXBwIGFuZCBhbGwgcGFja2FnZXMuYClcbiAgICAgIH1cblxuICAgICAgcGF0aHNCeURhdGUuc2V0KG1pZ3JhdGlvbi5kYXRlLCBtaWdyYXRpb24uZnVsbFBhdGgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IGFwcGxpY2F0aW9uIHJvdXRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vcm91dGVzL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGltcG9ydCBhcHBsaWNhdGlvbiByb3V0ZXMuXG4gICAqL1xuICBhc3luYyBpbXBvcnRBcHBsaWNhdGlvblJvdXRlcygpIHtcbiAgICBjb25zdCByb3V0ZXNJbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoYCR7dGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGlyZWN0b3J5KCl9L3NyYy9jb25maWcvcm91dGVzLmpzYCkpXG5cbiAgICByZXR1cm4gcm91dGVzSW1wb3J0LmRlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB2ZWxvY2lvdXMgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB2ZWxvY2lvdXMgcGF0aC5cbiAgICovXG4gIGFzeW5jIGdldFZlbG9jaW91c1BhdGgoKSB7XG4gICAgaWYgKCF0aGlzLl92ZWxvY2lvdXNQYXRoKSB7XG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpXG5cbiAgICAgIHRoaXMuX3ZlbG9jaW91c1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9Ly4uLy4uYClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmVsb2Npb3VzUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IHRlc3QgZmlsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRlc3RGaWxlcyAtIFRlc3QgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbXBvcnRUZXN0RmlsZXModGVzdEZpbGVzKSB7XG4gICAgZm9yIChjb25zdCB0ZXN0RmlsZSBvZiB0ZXN0RmlsZXMpIHtcbiAgICAgIGF3YWl0IGltcG9ydCh0b0ltcG9ydFNwZWNpZmllcih0ZXN0RmlsZSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlZmF1bHQgbG9nIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGRlZmF1bHQgbG9nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldERlZmF1bHRMb2dEaXJlY3Rvcnkoe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpLCBcImxvZ1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGxvZyBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5kaXJlY3RvcnkgLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZW52aXJvbm1lbnQgLSBFbnZpcm9ubWVudC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUgbG9nIGZpbGUgcGF0aC5cbiAgICovXG4gIGdldExvZ0ZpbGVQYXRoKHtjb25maWd1cmF0aW9uLCBkaXJlY3RvcnksIGVudmlyb25tZW50fSkge1xuICAgIGNvbnN0IGFjdHVhbERpcmVjdG9yeSA9IGRpcmVjdG9yeSB8fCBjb25maWd1cmF0aW9uPy5nZXREaXJlY3Rvcnk/LigpXG5cbiAgICBpZiAoIWFjdHVhbERpcmVjdG9yeSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhY3R1YWxEaXJlY3RvcnksIGAke2Vudmlyb25tZW50fS5sb2dgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUgbG9nIHRvIGZpbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVMb2dUb0ZpbGUoe2ZpbGVQYXRoLCBtZXNzYWdlfSkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGAke21lc3NhZ2V9XFxuYCwgXCJ1dGY4XCIpXG4gIH1cblxuICBhc3luYyBpbXBvcnRUZXN0aW5nQ29uZmlnUGF0aCgpIHtcbiAgICBjb25zdCB0ZXN0aW5nQ29uZmlnUGF0aCA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRlc3RpbmcoKVxuXG4gICAgaWYgKCF0ZXN0aW5nQ29uZmlnUGF0aCkgcmV0dXJuXG5cbiAgICBjb25zdCB0ZXN0aW5nSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKHRlc3RpbmdDb25maWdQYXRoKSlcbiAgICBjb25zdCB0ZXN0aW5nRGVmYXVsdCA9IHRlc3RpbmdJbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCF0ZXN0aW5nRGVmYXVsdCkgdGhyb3cgbmV3IEVycm9yKFwiVGVzdGluZyBjb25maWcgbXVzdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uXCIpXG4gICAgaWYgKHR5cGVvZiB0ZXN0aW5nRGVmYXVsdCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUZXN0aW5nIGNvbmZpZyBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXN0aW5nRGVmYXVsdCgpXG5cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCByZXN1bHQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcXVpcmUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdGlvbi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1aXJlIG1pZ3JhdGlvbi5cbiAgICovXG4gIGFzeW5jIHJlcXVpcmVNaWdyYXRpb24oZmlsZVBhdGgpIHtcbiAgICBjb25zdCBtaWdyYXRpb25JbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoZmlsZVBhdGgpKVxuICAgIGNvbnN0IG1pZ3JhdGlvbkltcG9ydERlZmF1bHQgPSBtaWdyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnREZWZhdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaWdyYXRpb24gZmlsZSBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgbWlncmF0aW9uIGNsYXNzXCIpXG4gICAgaWYgKHR5cGVvZiBtaWdyYXRpb25JbXBvcnREZWZhdWx0ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uIChzaG91bGQgYmUgYSBjbGFzcyB3aGljaCBpcyBhIGZ1bmN0aW9uIGluIEpTKVwiKVxuXG4gICAgcmV0dXJuIG1pZ3JhdGlvbkltcG9ydERlZmF1bHRcbiAgfVxuXG4gIGFzeW5jIGdldEJhc2VQYXRoKCkge1xuICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IGZzLnJlYWxwYXRoKGAke2Rpcm5hbWUoX19maWxlbmFtZSl9Ly4uLy4uYClcblxuICAgIHJldHVybiBiYXNlUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdmVsb2Npb3VzJyBiYWNrZ3JvdW5kLWpvYnMgc2NoZW1hIGV4aXN0cyBvbiBpdHMgY29uZmlndXJlZCBkYXRhYmFzZVxuICAgKiBhcyBwYXJ0IG9mIGBkYjptaWdyYXRlYCwgc28gdGhlIGZyYW1ld29yaydzIG93biB0YWJsZXMgKGJhY2tncm91bmRfam9icyArXG4gICAqIGJhY2tncm91bmRfam9iX2NvbmN1cnJlbmN5LCBleGVjdXRpb25fbW9kZSBldGMuKSBhcmUgY3JlYXRlZCBkZXRlcm1pbmlzdGljYWxseVxuICAgKiBhbG9uZ3NpZGUgYXBwIG1pZ3JhdGlvbnMgYW5kIGNhcHR1cmVkIGluIHRoZSBkdW1wZWQgc3RydWN0dXJlIFNRTCDigJQgcmF0aGVyIHRoYW5cbiAgICogb25seSBhcHBlYXJpbmcgb25jZSBhIHJ1bnRpbWUgc3RvcmUgYm9vdHMuIFJldXNlcyB0aGUgc3RvcmUncyBpZGVtcG90ZW50XG4gICAqIGBfZW5zdXJlU2NoZW1hYCwgc28gaXQncyBzYWZlIHRvIHJlLXJ1biBhZ2FpbnN0IERCcyB0aGF0IGFscmVhZHkgaGF2ZSBpdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzIGJlaW5nIG1pZ3JhdGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRnJhbWV3b3JrU2NoZW1hKHtkYnN9KSB7XG4gICAgY29uc3Qge2RlZmF1bHQ6IEJhY2tncm91bmRKb2JzU3RvcmV9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYmFja2dyb3VuZC1qb2JzL3N0b3JlLmpzXCIpXG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgQmFja2dyb3VuZEpvYnNTdG9yZSh7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCl9KVxuICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IHN0b3JlLmdldERhdGFiYXNlSWRlbnRpZmllcigpID8/IFwiZGVmYXVsdFwiXG4gICAgY29uc3QgZnJhbWV3b3JrRGIgPSBkYnNbZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgLy8gT25seSBlbnN1cmUgdGhlIGZyYW1ld29yayBzY2hlbWEgd2hlbiB0aGUgYmFja2dyb3VuZC1qb2JzIGRhdGFiYXNlIGlzIGFjdHVhbGx5XG4gICAgLy8gcGFydCBvZiB0aGlzIG1pZ3JhdGUgb3BlcmF0aW9uLiBXaGVuIGl0IGlzbid0IGFtb25nIHRoZSBtaWdyYXRlZCBzZXQg4oCUIGUuZy5cbiAgICAvLyBgZGI6dGVuYW50czptaWdyYXRlIDx0ZW5hbnQ+YCwgd2hpY2ggbWlncmF0ZXMgb25seSB0ZW5hbnQgZGF0YWJhc2VzIOKAlCB0aGVcbiAgICAvLyBmcmFtZXdvcmsgc3RvcmUgbGl2ZXMgZWxzZXdoZXJlICh0eXBpY2FsbHkgdGhlIGRlZmF1bHQgREIpIGFuZCB3YXMgYWxyZWFkeVxuICAgIC8vIGVuc3VyZWQgYnkgdGhlIHBsYWluIGBkYjptaWdyYXRlYCB0aGF0IHByZWNlZGVzIGl0LiBSZWFjaGluZyBpbnRvIGl0IGhlcmUgd291bGRcbiAgICAvLyBvcGVuIGEgZnJlc2ggY29ubmVjdGlvbiB0byB0aGF0IHNoYXJlZCBkYXRhYmFzZSBvbmNlIHBlciB0ZW5hbnQgd29ya2VyIGZvclxuICAgIC8vIHNjaGVtYSB3b3JrIHRoYXQgaXMgYWxyZWFkeSBhcHBsaWVkLiBTbyBza2lwIHdoZW4gdGhlIGZyYW1ld29yayBEQiBpc24ndCBpblxuICAgIC8vIHRoaXMgc2V0OyB0aGUgcnVudGltZSBzdG9yZSBzdGlsbCBjcmVhdGVzIGl0IGxhemlseSBpZiBhIHBsYWluIG1pZ3JhdGUgbmV2ZXJcbiAgICAvLyByYW4uIFF1ZXVlLWNhcCByZWNvbmNpbGlhdGlvbiBuZXZlciBydW5zIG9uIHRoaXMgcGF0aCBhdCBhbGwg4oCUIGl0IGJlbG9uZ3MgdG9cbiAgICAvLyBtYWluLXByb2Nlc3Mgc3RhcnR1cCAoYEJhY2tncm91bmRKb2JzU3RvcmUjcmVjb25jaWxlUXVldWVDb25jdXJyZW5jeWApLlxuICAgIGlmICghZnJhbWV3b3JrRGIpIHJldHVyblxuXG4gICAgLy8gUmV1c2UgdGhlIGNvbm5lY3Rpb24gZGI6bWlncmF0ZSBhbHJlYWR5IGhvbGRzIGZvciB0aGlzIGRhdGFiYXNlOyBvcGVuaW5nIGFcbiAgICAvLyBuZXN0ZWQgY2hlY2tvdXQgd291bGQgZGVhZGxvY2sgYSBkYXRhYmFzZSB3aG9zZSBwb29sIGlzIGNhcHBlZCBhdCBvbmUgY29ubmVjdGlvbi5cbiAgICBhd2FpdCBzdG9yZS5lbnN1cmVTY2hlbWEoZnJhbWV3b3JrRGIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZnRlciBtaWdyYXRpb25zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gYXJncy5kYnMgLSBEYnMuXG4gICAqIEBwYXJhbSB7XCJtaWdyYXRpb25cIiB8IFwic2NoZW1hRHVtcFwifSBbYXJncy5yZWFzb25dIC0gV2h5IHRoZSBzdHJ1Y3R1cmUgd3JpdGUgaXMgYmVpbmcgdHJpZ2dlcmVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWZ0ZXJNaWdyYXRpb25zKHtkYnMsIHJlYXNvbiA9IFwibWlncmF0aW9uXCJ9KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc2hvdWxkV3JpdGVTdHJ1Y3R1cmVTcWwoe3JlYXNvbn0pKSByZXR1cm5cblxuICAgIGNvbnN0IGRiRGlyID0gcGF0aC5qb2luKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCksIFwiZGJcIilcbiAgICBjb25zdCBzdHJ1Y3R1cmVTcWxCeUlkZW50aWZpZXIgPSBhd2FpdCB0aGlzLl9zdHJ1Y3R1cmVTcWxCeUlkZW50aWZpZXIoe2Ric30pXG5cbiAgICBhd2FpdCBmcy5ta2RpcihkYkRpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyKSkge1xuICAgICAgY29uc3Qgc3RydWN0dXJlU3FsID0gc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyW2lkZW50aWZpZXJdXG5cbiAgICAgIGlmICghc3RydWN0dXJlU3FsKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkYkRpciwgYHN0cnVjdHVyZS0ke2lkZW50aWZpZXJ9LnNxbGApXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgc3RydWN0dXJlU3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0cnVjdHVyZSBzcWwgYnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBfc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyKHtkYnN9KSB7XG4gICAgY29uc3Qgc3FsQnlJZGVudGlmaWVyID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoe30pXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoZGJzKSkge1xuICAgICAgY29uc3QgZGIgPSBkYnNbaWRlbnRpZmllcl1cblxuICAgICAgaWYgKHR5cGVvZiBkYi5zdHJ1Y3R1cmVTcWwgIT09IFwiZnVuY3Rpb25cIikgY29udGludWVcblxuICAgICAgY29uc3Qgc3RydWN0dXJlU3FsID0gYXdhaXQgZGIuc3RydWN0dXJlU3FsKClcblxuICAgICAgaWYgKHN0cnVjdHVyZVNxbCkge1xuICAgICAgICBjb25zdCBtaWdyYXRpb25JbnNlcnRzID0gYXdhaXQgdGhpcy5fc2NoZW1hTWlncmF0aW9uc0luc2VydFNxbCh7ZGJ9KVxuXG4gICAgICAgIHNxbEJ5SWRlbnRpZmllcltpZGVudGlmaWVyXSA9IHN0cnVjdHVyZVNxbCArIG1pZ3JhdGlvbkluc2VydHNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3FsQnlJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIElOU0VSVCBzdGF0ZW1lbnRzIGZvciBldmVyeSByb3cgaW4gYHNjaGVtYV9taWdyYXRpb25zYCBzbyB0aGVcbiAgICogc3RydWN0dXJlIHNuYXBzaG90IGNhcnJpZXMgdGhlIG1pZ3JhdGlvbiBsZWRnZXIgYWxvbmcgd2l0aCB0aGUgRERMLiAgV2l0aG91dFxuICAgKiB0aGVzZSByb3dzIGEgZnJlc2ggREIgbG9hZGVkIGZyb20gdGhlIHNuYXBzaG90IHdpbGwgcmUtcnVuIGV2ZXJ5IG1pZ3JhdGlvbixcbiAgICogd2hpY2ggZmFpbHMgd2hlbiB0aGUgc25hcHNob3QgYWxyZWFkeSBjb250YWlucyB0aGUgcG9zdC1taWdyYXRpb24gc2NoZW1hLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBJTlNFUlQgc3RhdGVtZW50cyAoZW1wdHkgc3RyaW5nIHdoZW4gbm9uZSkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hTWlncmF0aW9uc0luc2VydFNxbCh7ZGJ9KSB7XG4gICAgY29uc3Qge2RlZmF1bHQ6IE1pZ3JhdGlvbnNMZWRnZXJ9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9ucy1sZWRnZXIuanNcIilcblxuICAgIGlmICghYXdhaXQgTWlncmF0aW9uc0xlZGdlci50YWJsZUV4aXN0cyhkYikpIHJldHVybiBcIlwiXG5cbiAgICBjb25zdCB2ZXJzaW9ucyA9IGF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIuYXBwbGllZFZlcnNpb25zKGRiKVxuXG4gICAgaWYgKHZlcnNpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gXCJcIlxuXG4gICAgcmV0dXJuIHZlcnNpb25zLm1hcCgodmVyc2lvbikgPT4gYElOU0VSVCBJTlRPIHNjaGVtYV9taWdyYXRpb25zICh2ZXJzaW9uKSBWQUxVRVMgKCR7ZGIucXVvdGUodmVyc2lvbil9KTtgKS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2hhbm5lbCBwdWJsaXNoZXJzIHNvIGxpZmVjeWNsZVxuICAgKiBldmVudCBob29rcyBicm9hZGNhc3Qgb3ZlciB0aGUgc2hhcmVkIFwiZnJvbnRlbmQtbW9kZWxzXCIgY2hhbm5lbC5cbiAgICogVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGJ5IHRoZSBOb2RlIGhhbmRsZXIgYmVjYXVzZSB0aGUgcmVxdWlyZWRcbiAgICogbW9kdWxlcyAoYGZyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXJgLCBgcm91dGVzL3Jlc29sdmVyYCkgcHVsbCBpblxuICAgKiBzZXJ2ZXItb25seSBOb2RlIEFQSXMgdGhhdCBicmVhayBicm93c2VyIGJ1bmRsZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplRnJvbnRlbmRNb2RlbFdlYnNvY2tldFB1Ymxpc2hlcnMoY29uZmlndXJhdGlvbikge1xuICAgIC8vIERpc2NvdmVyIGVhY2ggYmFja2VuZCBwcm9qZWN0J3MgcmVzb3VyY2VzIGJlZm9yZSByZWdpc3RlcmluZyBwdWJsaXNoZXJzLiBUaGUgcHVibGlzaGVycyBhcmVcbiAgICAvLyBkZXJpdmVkIGZyb20gYGJhY2tlbmRQcm9qZWN0LmZyb250ZW5kTW9kZWxzYCwgd2hpY2ggYGF1dG9EaXNjb3ZlclJlc291cmNlc2AgcG9wdWxhdGVzLiBXaXRob3V0XG4gICAgLy8gdGhpcywgcmVnaXN0cmF0aW9uIHJ1bnMgYWdhaW5zdCBhbiBlbXB0eS9wYXJ0aWFsIHJlc291cmNlIHNldCAob25seSBidWlsdC1pbnMpLCBzbyBhcHBzIHRoYXRcbiAgICAvLyByZXNvbHZlIHJlc291cmNlcyB0aHJvdWdoIGFuIGBhYmlsaXR5UmVzb2x2ZXJgIHJhdGhlciB0aGFuIGEgc3RhdGljIGFiaWxpdHktcmVzb3VyY2UgbGlzdCBuZXZlclxuICAgIC8vIHJlZ2lzdGVyIGxpZmVjeWNsZSBwdWJsaXNoZXJzIGFuZCB0aGVpciByZWFsdGltZSBmcm9udGVuZC1tb2RlbCB1cGRhdGVzIHNpbGVudGx5IHN0b3AuIFRoZVxuICAgIC8vIGxpZmVjeWNsZSBob29rcyBhcmUgZGVkdXBlZCBwZXIgbW9kZWwgY2xhc3MgdmlhIGEgcHJvY2Vzcy1nbG9iYWwgc2V0LCBzbyBhIGxhdGVyLCBmdWxseVxuICAgIC8vIGRpc2NvdmVyZWQgcGFzcyBjYW5ub3QgcmV0cm9hY3RpdmVseSBhZGQgdGhlIG1pc3NpbmcgcHVibGlzaGVycy4gYGF1dG9EaXNjb3ZlclJlc291cmNlc2AgaXNcbiAgICAvLyBpZGVtcG90ZW50IChpdCBza2lwcyBiYWNrZW5kIHByb2plY3RzIHdob3NlIGBmcm9udGVuZE1vZGVsc2AgYXJlIGFscmVhZHkgc2V0KS5cbiAgICBhd2FpdCB0aGlzLmF1dG9EaXNjb3ZlclJlc291cmNlcyhjb25maWd1cmF0aW9uKVxuXG4gICAgY29uc3Qge2Vuc3VyZUZyb250ZW5kTW9kZWxXZWJzb2NrZXRQdWJsaXNoZXJzUmVnaXN0ZXJlZH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvd2Vic29ja2V0LXB1Ymxpc2hlcnMuanNcIilcblxuICAgIGF3YWl0IGVuc3VyZUZyb250ZW5kTW9kZWxXZWJzb2NrZXRQdWJsaXNoZXJzUmVnaXN0ZXJlZChjb25maWd1cmF0aW9uKVxuICB9XG59XG4iXX0=
|
|
1021
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHdDQUF3QyxDQUFBO0FBQy9DLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLDJCQUEyQixNQUFNLDBDQUEwQyxDQUFBO0FBQ2xGLE9BQU8sZUFBZSxNQUFNLDZCQUE2QixDQUFBO0FBQ3pELE9BQU8sNkJBQTZCLE1BQU0sNkNBQTZDLENBQUE7QUFDdkYsT0FBTyxpQ0FBaUMsTUFBTSxpREFBaUQsQ0FBQTtBQUMvRixPQUFPLDRCQUE0QixNQUFNLDJDQUEyQyxDQUFBO0FBQ3BGLE9BQU8sd0JBQXdCLE1BQU0sdUNBQXVDLENBQUE7QUFDNUUsT0FBTyw0QkFBNEIsTUFBTSwyQ0FBMkMsQ0FBQTtBQUNwRixPQUFPLGlCQUFpQixNQUFNLCtCQUErQixDQUFBO0FBQzdELE9BQU8saUJBQWlCLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxlQUFlLE1BQU0sNkJBQTZCLENBQUE7QUFDekQsT0FBTyw2QkFBNkIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUN2RixPQUFPLCtCQUErQixNQUFNLCtDQUErQyxDQUFBO0FBQzNGLE9BQU8sK0JBQStCLE1BQU0sK0NBQStDLENBQUE7QUFDM0YsT0FBTyxpQkFBaUIsTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLGtCQUFrQixNQUFNLGdDQUFnQyxDQUFBO0FBQy9ELE9BQU8sdUJBQXVCLE1BQU0sdUNBQXVDLENBQUE7QUFDM0UsT0FBTyx1QkFBdUIsTUFBTSx1Q0FBdUMsQ0FBQTtBQUMzRSxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFBO0FBQzlELE9BQU8saUJBQWlCLE1BQU0sK0JBQStCLENBQUE7QUFDN0QsT0FBTyxvQkFBb0IsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLDZCQUE2QixNQUFNLHNEQUFzRCxDQUFBO0FBQ2hHLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFBO0FBQzdFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLEtBQUssQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQzNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyw2QkFBNkIsTUFBTSxpREFBaUQsQ0FBQTtBQUMzRixPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBQy9ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ2hELE9BQU8sb0JBQW9CLE1BQU0sa0NBQWtDLENBQUE7QUFDbkUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFFakk7O3FQQUVxUDtBQUVyUDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCLENBQUMsUUFBUSxFQUFFLG1CQUFtQjtJQUM5RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTNDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7UUFDaEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUVoRSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzlCLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUMvQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFL0MsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLCtCQUFnQyxTQUFRLElBQUk7SUFDL0Q7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFDO1FBQ2xHLE1BQU0sWUFBWSxHQUFHLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDdEUsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUNuQyxPQUFPLGtDQUFrQyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ2pILENBQUM7SUFFRDs7eUZBRXFGO0lBQ3JGLDBCQUEwQixHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUU1Rjs7eUVBRXFFO0lBQ3JFLG1CQUFtQixHQUFHLFNBQVMsQ0FBQTtJQUUvQjs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFDLGFBQWEsRUFBRSxhQUFhO1FBQ3BELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUUzQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ25GLENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBMkI7UUFDekIsT0FBTywwQkFBMEIsQ0FBQTtJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhO1FBQ3ZDLE1BQU0sRUFBQyxzQ0FBc0MsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7UUFDMUcsTUFBTSxFQUFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFDOUYsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFFMUQsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM3QyxJQUFJLGNBQWMsQ0FBQyxnQkFBZ0I7Z0JBQUUsU0FBUTtZQUU3QyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDdkcsSUFBSSxLQUFLLENBQUE7WUFFVCxJQUFJLENBQUM7Z0JBQ0gsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN4QyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFNBQVE7WUFDVixDQUFDO1lBRUQ7O3VFQUUyRDtZQUMzRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7WUFDckI7OzhEQUVrRDtZQUNsRCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQTtZQUVqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUFFLFNBQVE7Z0JBQzdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQztvQkFBRSxTQUFRO2dCQUV6RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3ZDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUE7Z0JBRXRDLDRFQUE0RTtnQkFDNUUsNEVBQTRFO2dCQUM1RSxNQUFNLGlCQUFpQixHQUFHLE9BQU8sYUFBYSxLQUFLLFVBQVU7dUJBQ3hELENBQUMsYUFBYSxLQUFLLHlCQUF5QixJQUFJLGFBQWEsQ0FBQyxTQUFTLFlBQVkseUJBQXlCLENBQUMsQ0FBQTtnQkFFbEgsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVU7b0JBQUUsU0FBUTtnQkFFN0Qsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUUxQyw4RUFBOEU7Z0JBQzlFLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxhQUFhLENBQUM7b0JBQUUsU0FBUTtnQkFFcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUE7Z0JBQ2hELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztxQkFDakQsS0FBSyxDQUFDLEdBQUcsQ0FBQztxQkFDVixHQUFHLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDakYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUVYLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxhQUFhLENBQUE7WUFDdkMsQ0FBQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxjQUFjLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQTtZQUM1QyxDQUFDO1lBRUQsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLGNBQWMsQ0FBQyxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQTtZQUMxRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhO1FBQ3pDLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUVuRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzdCLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsU0FBUTtZQUNWLENBQUM7WUFFRCxNQUFNLHFCQUFxQixHQUFHLHFHQUFxRyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUNwTCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUE7WUFFcEQsS0FBSyxNQUFNLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUE7Z0JBQzNELE1BQU0sUUFBUSxHQUFHLFVBQVUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7Z0JBRXRFLElBQUksUUFBUSxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLFVBQVUsQ0FBQyxZQUFZLEVBQUUsOENBQThDLENBQUMsQ0FBQTtnQkFDNUksQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxjQUFjLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNsSCxNQUFNLElBQUksNkJBQTZCLENBQUMsRUFBQyxjQUFjLEVBQUUscUJBQXFCLEVBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7WUFDOUcsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxnQkFBZ0I7UUFDL0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUN0RixnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRO1FBQ3BDLE9BQU8sTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1lBQ2pELENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUN0RixDQUFDLENBQUMsRUFBRSxDQUFBO1FBRU4sSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtRQUNuRSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUUvQyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUV6QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQTtZQUNsRSxDQUFDO1lBRUQsT0FBTyxJQUFJLG9CQUFvQixDQUFDO2dCQUM5QixRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3hCLFVBQVU7Z0JBQ1YsUUFBUTthQUNULENBQUMsQ0FBQTtRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQzFCLENBQUM7WUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksY0FBYyxDQUN0QixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFDbkIsK0RBQStELFFBQVEsRUFBRSxFQUN6RSxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsQ0FDcEIsQ0FBQTtZQUNILENBQUM7WUFFRCxNQUFNLEtBQUssQ0FBQTtRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFlBQVk7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixLQUFLLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFeEUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUE7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxRQUFRO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUE7UUFDekIsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQztZQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU87WUFDL0IsYUFBYTtZQUNiLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYTtZQUMzQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU07WUFDN0IsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMvRSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckMsT0FBTyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFaEUsT0FBTyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUM7WUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPO1lBQy9CLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyRyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWE7WUFDM0MsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNO1lBQzdCLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1NBQ2pELEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLGFBQWE7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEI7WUFBRSxPQUFNO1FBRTVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUV4RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLENBQUE7WUFFaEUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQztnQkFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPO2dCQUMvQixhQUFhO2dCQUNiLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYTtnQkFDM0MsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNO2dCQUM3QixRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQy9FLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDakUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXhELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsUUFBUSxHQUFHLGtCQUFrQixDQUFBO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFBO1lBRWhFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUM7Z0JBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTztnQkFDL0IsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyRyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWE7Z0JBQzNDLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTTtnQkFDN0IsUUFBUSxFQUFFLGtCQUFrQjthQUM3QixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBd0IsQ0FBQyxhQUFhO1FBQ3BDLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFBO1lBRXhELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDckQsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFBO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsYUFBYTtRQUN2QixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtZQUV4RCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQTtZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQztZQUMvQyxPQUFPO1lBQ1AsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JHLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYTtZQUMzQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU07WUFDN0IsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMvRSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEMsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFaEUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixhQUFhLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLENBQUM7Z0JBQ3hDLE9BQU87Z0JBQ1AsYUFBYSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckUsYUFBYSxFQUFFLFNBQVM7Z0JBQ3hCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUNwRCxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ2xDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUE7SUFDNUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxRQUFRO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRWhFLE9BQU8sTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDO1lBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTztZQUMvQixhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckcsYUFBYTtZQUNiLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTTtZQUM3QixRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQy9FLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQ3hDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUE7SUFDbEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUTtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckMsT0FBTyxNQUFNLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BELENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFaEUsT0FBTyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUM7WUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPO1lBQy9CLGFBQWEsRUFBRSxhQUFhLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyRyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWE7WUFDM0MsTUFBTTtZQUNOLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDL0UsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsTUFBTTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzlCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRWhFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsYUFBYSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDO2dCQUN4QyxPQUFPLEVBQUUsU0FBUztnQkFDbEIsYUFBYSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckUsYUFBYSxFQUFFLFNBQVM7Z0JBQ3hCLE1BQU07Z0JBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDcEQsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckMsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFBO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLDJCQUEyQixDQUFDLENBQUE7UUFDcEUsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFBO1FBRW5CLElBQUksS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUUzRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUNyRCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx1QkFBdUIsQ0FBQyxRQUFRO1FBQzlCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUMsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTlELElBQUksbUJBQW1CLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ25FLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3RELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQTtRQUVmLElBQUksUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzNCLElBQUksR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUM1QyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNsQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNuQyxDQUFDO1FBRUQsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQU87UUFDdkMsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLDJCQUEyQixDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsNkJBQTZCLENBQUMsT0FBTztRQUN6QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxPQUFPO1FBQzdDLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQ0FBaUMsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQU87UUFDcEMsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsNEJBQTRCLENBQUMsT0FBTztRQUN4QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsNEJBQTRCLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPO1FBQzdCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU87UUFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTztRQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTztRQUMzQixPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsNkJBQTZCLENBQUMsT0FBTztRQUN6QyxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxPQUFPO1FBQzNDLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSwrQkFBK0IsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLCtCQUErQixDQUFDLE9BQU87UUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLCtCQUErQixDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTztRQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixNQUFNLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFFbkUsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx5QkFBeUI7UUFDN0IsTUFBTSxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFFdkYsT0FBTyxxQkFBcUIsQ0FBQTtJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPO1FBQ25DLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE9BQU87UUFDbkMsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTztRQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPO1FBQzdCLE9BQU8sTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQU87UUFDaEMsT0FBTyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFDLFlBQVksRUFBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUMxQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUE7UUFFMUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRWhFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3BJLENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQTtRQUUvQyxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDN0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSwwQkFBMEIsQ0FBQyxDQUFBO1FBRXhGLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFFRCw2REFBNkQ7UUFDN0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO1FBRWhCLEtBQUssTUFBTSxjQUFjLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsQ0FBQztRQUVELElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVqRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxjQUFjLEVBQUUsS0FBSztRQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLFVBQVUsQ0FBQyxDQUFBO1FBRXZELElBQUksQ0FBQztZQUNILElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtnQkFFL0MsSUFBSSxDQUFDLEtBQUs7b0JBQUUsU0FBUTtnQkFFcEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUMvQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzlCLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO2dCQUVsRixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFBO1lBQ3hELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUksc0NBQXVDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLEtBQUssQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxxQ0FBcUMsQ0FBQyxLQUFLO1FBQ3pDLGtDQUFrQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTdCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO2dCQUFFLFNBQVE7WUFFakMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFaEQsSUFBSSxRQUFRLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsU0FBUyxDQUFDLElBQUksS0FBSyxRQUFRLFFBQVEsU0FBUyxDQUFDLFFBQVEsd0VBQXdFLENBQUMsQ0FBQTtZQUN0TCxDQUFDO1lBRUQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx1QkFBdUI7UUFDM0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFBO1FBRXRILE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQTtJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNqRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLFFBQVEsQ0FBQyxDQUFBO1FBQy9ELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVM7UUFDN0IsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQkFBc0IsQ0FBQyxFQUFDLGFBQWEsRUFBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsY0FBYyxDQUFDLEVBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUM7UUFDcEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFBO1FBRXBFLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFdEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLFdBQVcsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDO1FBQ3RDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDekQsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsVUFBVSxFQUFFLENBQUE7UUFFOUQsSUFBSSxDQUFDLGlCQUFpQjtZQUFFLE9BQU07UUFFOUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUE7UUFFNUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUE7UUFDckYsSUFBSSxPQUFPLGNBQWMsS0FBSyxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO1FBRTNHLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUE7UUFFckMsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE1BQU0sRUFBRSxDQUFBO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRO1FBQzdCLE1BQU0sZUFBZSxHQUFHLE1BQU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDakUsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFBO1FBRXRELElBQUksQ0FBQyxzQkFBc0I7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUE7UUFDcEcsSUFBSSxPQUFPLHNCQUFzQixLQUFLLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUE7UUFFNUosT0FBTyxzQkFBc0IsQ0FBQTtJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVsRSxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUFDLEdBQUcsRUFBQztRQUMvQixNQUFNLEVBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUNsRixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFtQixDQUFDLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLENBQUMsQ0FBQTtRQUMvRSxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLFNBQVMsQ0FBQTtRQUNyRSxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUUzQyxpRkFBaUY7UUFDakYsOEVBQThFO1FBQzlFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0Usa0ZBQWtGO1FBQ2xGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLCtFQUErRTtRQUMvRSwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFNO1FBRXhCLDZFQUE2RTtRQUM3RSxvRkFBb0Y7UUFDcEYsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxXQUFXLEVBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDO1lBQUUsT0FBTTtRQUU1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMzRCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQTtRQUU1RSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFFeEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUV6RCxJQUFJLENBQUMsWUFBWTtnQkFBRSxTQUFRO1lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsVUFBVSxNQUFNLENBQUMsQ0FBQTtZQUVoRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsRUFBQyxHQUFHLEVBQUM7UUFDbkMsTUFBTSxlQUFlLEdBQUcscUNBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUVsRSxLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFMUIsSUFBSSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEtBQUssVUFBVTtnQkFBRSxTQUFRO1lBRW5ELE1BQU0sWUFBWSxHQUFHLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFBO1lBRTVDLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxDQUFBO2dCQUVwRSxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHLGdCQUFnQixDQUFBO1lBQy9ELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQUMsRUFBRSxFQUFDO1FBQ25DLE1BQU0sRUFBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxNQUFNLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUV0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUUzRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBRW5DLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsbURBQW1ELEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDOUgsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLGFBQWE7UUFDNUQsOEZBQThGO1FBQzlGLGlHQUFpRztRQUNqRywrRkFBK0Y7UUFDL0Ysa0dBQWtHO1FBQ2xHLDZGQUE2RjtRQUM3RiwwRkFBMEY7UUFDMUYsOEZBQThGO1FBQzlGLGlGQUFpRjtRQUNqRixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUUvQyxNQUFNLEVBQUMsZ0RBQWdELEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO1FBRXJILE1BQU0sZ0RBQWdELENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBcIi4uL2RhdGFiYXNlL2Fubm90YXRpb25zLWFzeW5jLWhvb2tzLmpzXCJcbmltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzRGVzdHJveU1pZ3JhdGlvbiBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9kZXN0cm95L21pZ3JhdGlvbi5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNJbml0IGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2luaXQuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzR2VuZXJhdGVCYXNlTW9kZWxzIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Jhc2UtbW9kZWxzLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0dlbmVyYXRlRnJvbnRlbmRNb2RlbHMgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvZnJvbnRlbmQtbW9kZWxzLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0dlbmVyYXRlTWlncmF0aW9uIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL21pZ3JhdGlvbi5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNHZW5lcmF0ZU1vZGVsIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL21vZGVsLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0xpbnRSZWxhdGlvbnNoaXBzIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2xpbnQvcmVsYXRpb25zaGlwcy5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNSb3V0ZXMgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvcm91dGVzLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc1NlcnZlciBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9zZXJ2ZXIuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzVGVzdCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0JhY2tncm91bmRKb2JzTWFpbiBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtbWFpbi5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1dvcmtlciBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9iYWNrZ3JvdW5kLWpvYnMtd29ya2VyLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0JhY2tncm91bmRKb2JzUnVubmVyIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2JhY2tncm91bmQtam9icy1ydW5uZXIuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzQmVhY29uIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2JlYWNvbi5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNDb25zb2xlIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2NvbnNvbGUuanNcIlxuaW1wb3J0IENsaUNvbW1hbmRzRGJTY2hlbWFEdW1wIGZyb20gXCIuL25vZGUvY2xpL2NvbW1hbmRzL2RiL3NjaGVtYS9kdW1wLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc0RiU2NoZW1hTG9hZCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9kYi9zY2hlbWEvbG9hZC5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNEYlNlZWQgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvZGIvc2VlZC5qc1wiXG5pbXBvcnQgQ2xpQ29tbWFuZHNSdW5uZXIgZnJvbSBcIi4vbm9kZS9jbGkvY29tbWFuZHMvcnVubmVyLmpzXCJcbmltcG9ydCBDbGlDb21tYW5kc1J1blNjcmlwdCBmcm9tIFwiLi9ub2RlL2NsaS9jb21tYW5kcy9ydW4tc2NyaXB0LmpzXCJcbmltcG9ydCBmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vayBmcm9tIFwiLi4vcm91dGVzL2hvb2tzL2Zyb250ZW5kLW1vZGVsLWNvbW1hbmQtcm91dGUtaG9vay5qc1wiXG5pbXBvcnQge0ZSQU1FV09SS19TT1VSQ0VfRElSRUNUT1JZfSBmcm9tIFwiLi4vdXRpbHMvYmFja3RyYWNlLWNsZWFuZXItbm9kZS5qc1wiXG5pbXBvcnQge2Rpcm5hbWV9IGZyb20gXCJwYXRoXCJcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSBcInVybFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtBc3luY0xvY2FsU3RvcmFnZSBhcyBOb2RlQXN5bmNMb2NhbFN0b3JhZ2V9IGZyb20gXCJub2RlOmFzeW5jX2hvb2tzXCJcbmltcG9ydCB7dGltaW5nU2FmZUVxdWFsfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHJlcXVpcmVDb250ZXh0IGZyb20gXCJyZXF1aXJlLWNvbnRleHRcIlxuaW1wb3J0IEluaXRpYWxpemVyRnJvbVJlcXVpcmVDb250ZXh0IGZyb20gXCIuLi9kYXRhYmFzZS9pbml0aWFsaXplci1mcm9tLXJlcXVpcmUtY29udGV4dC5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZVRpbWVab25lfSBmcm9tIFwiLi4vdGltZS16b25lLmpzXCJcbmltcG9ydCBBdHRhY2htZW50UGF0aFNvdXJjZSBmcm9tIFwiLi9ub2RlL2F0dGFjaG1lbnQtcGF0aC1zb3VyY2UuanNcIlxuaW1wb3J0IHsgY3JlYXRlU2hhcmVkVHJhbnNhY3Rpb25Qcm94eURyaXZlciwgc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb25maWcgfSBmcm9tIFwiLi4vdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tcHJveHktZHJpdmVyLmpzXCJcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7YWJpbGl0eT86IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0LCBvZmZzZXRNaW51dGVzOiBudW1iZXIsIHJlcXVlc3RUaW1pbmc/OiBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCwgdGVuYW50PzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHRpbWVab25lPzogc3RyaW5nfX0gVGltZXpvbmVTdG9yZSAqL1xuXG4vKipcbiAqIFJ1bnMgcGF0aCB3aXRoaW4gYWxsb3dlZCBwcmVmaXhlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIElucHV0IGZpbGUgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGFsbG93ZWRQYXRoUHJlZml4ZXMgLSBBbGxvd2VkIHBhdGggcHJlZml4ZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGlucHV0IHBhdGggaXMgaW5zaWRlIGFuIGFsbG93ZWQgcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXRoV2l0aGluQWxsb3dlZFByZWZpeGVzKGZpbGVQYXRoLCBhbGxvd2VkUGF0aFByZWZpeGVzKSB7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aClcblxuICByZXR1cm4gYWxsb3dlZFBhdGhQcmVmaXhlcy5zb21lKChhbGxvd2VkUHJlZml4KSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRQcmVmaXggPSBwYXRoLnJlc29sdmUoYWxsb3dlZFByZWZpeClcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlc29sdmVkUHJlZml4LCByZXNvbHZlZFBhdGgpXG5cbiAgICBpZiAoIXJlbGF0aXZlUGF0aCkgcmV0dXJuIHRydWVcbiAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiB0cnVlXG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0Vudmlyb25tZW50SGFuZGxlck5vZGUgZXh0ZW5kcyBCYXNle1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRlc3Qtb25seSBjaGlsZCBwcm94eSB3aGVuIFRlc3RSdW5uZXIgc3VwcGxpZWQgYW4gYWN0aXZlIGJyb2tlci5cbiAgICogQHBhcmFtIHt7RHJpdmVyQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCwgY29uZmlnOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGNvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBhcmdzIC0gQ29ubmVjdGlvbiBkZXRhaWxzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZD59IC0gT3B0aW9uYWwgcHJveHkuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUZXN0U2hhcmVkVHJhbnNhY3Rpb25Db25uZWN0aW9uKHtEcml2ZXJDbGFzcywgY29uZmlnLCBjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXJ9KSB7XG4gICAgY29uc3QgYnJva2VyQ29uZmlnID0gc2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDb25maWcoZGF0YWJhc2VJZGVudGlmaWVyKVxuICAgIGlmICghYnJva2VyQ29uZmlnKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIGNyZWF0ZVNoYXJlZFRyYW5zYWN0aW9uUHJveHlEcml2ZXIoRHJpdmVyQ2xhc3MsIGNvbmZpZywgY29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyLCBicm9rZXJDb25maWcpXG4gIH1cblxuICAvKipcbiAgICogVGltZXpvbmUgYXN5bmMgbG9jYWwgc3RvcmFnZS5cbiAgICogQHR5cGUge2ltcG9ydChcIm5vZGU6YXN5bmNfaG9va3NcIikuQXN5bmNMb2NhbFN0b3JhZ2U8VGltZXpvbmVTdG9yZT4gfCB1bmRlZmluZWR9ICovXG4gIF90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlID0gTm9kZUFzeW5jTG9jYWxTdG9yYWdlID8gbmV3IE5vZGVBc3luY0xvY2FsU3RvcmFnZSgpIDogdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEZpbmQgY29tbWFuZHMgcmVzdWx0LlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9iYXNlLmpzXCIpLkNvbW1hbmRGaWxlT2JqZWN0VHlwZVtdIHwgdW5kZWZpbmVkfSAqL1xuICBfZmluZENvbW1hbmRzUmVzdWx0ID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgZW5kcG9pbnQgdG9rZW4gbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVkVG9rZW4gLSBUb2tlbiBmcm9tIHRoZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUb2tlbiAtIENvbmZpZ3VyZWQgdG9rZW4uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYm90aCB0b2tlbnMgbWF0Y2guXG4gICAqL1xuICBkZWJ1Z0VuZHBvaW50VG9rZW5NYXRjaGVzKHByb3ZpZGVkVG9rZW4sIGV4cGVjdGVkVG9rZW4pIHtcbiAgICBjb25zdCBwcm92aWRlZCA9IEJ1ZmZlci5mcm9tKHByb3ZpZGVkVG9rZW4pXG4gICAgY29uc3QgZXhwZWN0ZWQgPSBCdWZmZXIuZnJvbShleHBlY3RlZFRva2VuKVxuXG4gICAgcmV0dXJuIHByb3ZpZGVkLmxlbmd0aCA9PT0gZXhwZWN0ZWQubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChwcm92aWRlZCwgZXhwZWN0ZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZnJhbWV3b3JrIHNvdXJjZSBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVmVsb2Npb3VzIHNvdXJjZSBkaXJlY3RvcnkgdXNlZCB0byBmaWx0ZXIgZnJhbWV3b3JrIHN0YWNrIGZyYW1lcy5cbiAgICovXG4gIGdldEZyYW1ld29ya1NvdXJjZURpcmVjdG9yeSgpIHtcbiAgICByZXR1cm4gRlJBTUVXT1JLX1NPVVJDRV9ESVJFQ1RPUllcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvLWRpc2NvdmVycyByZXNvdXJjZSBjbGFzc2VzIGZyb20gc3JjL3Jlc291cmNlcy8gaW4gZWFjaCBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhdXRvRGlzY292ZXJSZXNvdXJjZXMoY29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uSXNDbGFzc30gPSBhd2FpdCBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiKVxuICAgIGNvbnN0IHtkZWZhdWx0OiBBdXRob3JpemF0aW9uQmFzZVJlc291cmNlfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYmFzZS1yZXNvdXJjZS5qc1wiKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBpZiAoYmFja2VuZFByb2plY3QuYWJpbGl0eVJlc291cmNlcykgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VzRGlyID0gYmFja2VuZFByb2plY3QucmVzb3VyY2VzUGF0aCB8fCBwYXRoLmpvaW4oYmFja2VuZFByb2plY3QucGF0aCwgXCJzcmNcIiwgXCJyZXNvdXJjZXNcIilcbiAgICAgIGxldCBmaWxlc1xuXG4gICAgICB0cnkge1xuICAgICAgICBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIocmVzb3VyY2VzRGlyKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzY292ZXJlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgICBjb25zdCBkaXNjb3ZlcmVkID0ge31cbiAgICAgIC8qKlxuICAgICAgICogRXZlcnkgZGlzY292ZXJlZCBhYmlsaXR5IHJlc291cmNlIGNsYXNzIChmcm9udGVuZC1tb2RlbCBhbmQgYXV0aG9yaXphdGlvbikuXG4gICAgICAgKiBAdHlwZSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgICAgY29uc3QgYWJpbGl0eVJlc291cmNlQ2xhc3NlcyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoXCIuanNcIikgJiYgIWZpbGUuZW5kc1dpdGgoXCIubWpzXCIpKSBjb250aW51ZVxuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKFwiZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2VzXCIpKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHJlc291cmNlc0RpciwgZmlsZSlcbiAgICAgICAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoZmlsZVBhdGgpXG4gICAgICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSBpbXBvcnRlZC5kZWZhdWx0XG5cbiAgICAgICAgLy8gQW55IGF1dGhvcml6YXRpb24gcmVzb3VyY2UgKGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbHNvIGV4dGVuZCBpdCkgdGhhdFxuICAgICAgICAvLyBkZWNsYXJlcyBhIGBNb2RlbENsYXNzYDsgc2tpcCBhYnN0cmFjdC9jb21tb24gYmFzZSByZXNvdXJjZXMgd2l0aG91dCBvbmUuXG4gICAgICAgIGNvbnN0IGlzQWJpbGl0eVJlc291cmNlID0gdHlwZW9mIFJlc291cmNlQ2xhc3MgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICYmIChSZXNvdXJjZUNsYXNzID09PSBBdXRob3JpemF0aW9uQmFzZVJlc291cmNlIHx8IFJlc291cmNlQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgQXV0aG9yaXphdGlvbkJhc2VSZXNvdXJjZSlcblxuICAgICAgICBpZiAoIWlzQWJpbGl0eVJlc291cmNlIHx8ICFSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgICAgYWJpbGl0eVJlc291cmNlQ2xhc3Nlcy5wdXNoKFJlc291cmNlQ2xhc3MpXG5cbiAgICAgICAgLy8gT25seSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZHJpdmUgcm91dGluZy9nZW5lcmF0aW9uL3B1Ymxpc2hlciBkaXNjb3ZlcnkuXG4gICAgICAgIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MoUmVzb3VyY2VDbGFzcykpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBmaWxlLnJlcGxhY2UoL1xcLihqc3xtanMpJC8sIFwiXCIpXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGJhc2VOYW1lLnJlcGxhY2UoLy1yZXNvdXJjZSQvLCBcIlwiKVxuICAgICAgICAgIC5zcGxpdChcIi1cIilcbiAgICAgICAgICAubWFwKCgvKiogQHR5cGUge3N0cmluZ30gKi8gcGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkpXG4gICAgICAgICAgLmpvaW4oXCJcIilcblxuICAgICAgICBkaXNjb3ZlcmVkW21vZGVsTmFtZV0gPSBSZXNvdXJjZUNsYXNzXG4gICAgICB9XG5cbiAgICAgIGlmICghYmFja2VuZFByb2plY3QuZnJvbnRlbmRNb2RlbHMgJiYgT2JqZWN0LmtleXMoZGlzY292ZXJlZCkubGVuZ3RoID4gMCkge1xuICAgICAgICBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVscyA9IGRpc2NvdmVyZWRcbiAgICAgIH1cblxuICAgICAgaWYgKGFiaWxpdHlSZXNvdXJjZUNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBiYWNrZW5kUHJvamVjdC5hYmlsaXR5UmVzb3VyY2VzID0gYWJpbGl0eVJlc291cmNlQ2xhc3Nlc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBtb2RlbHMgY29udHJpYnV0ZWQgYnkgcmVnaXN0ZXJlZCBwYWNrYWdlcyBpbnRvIHRoZSBtb2RlbCByZWdpc3RyeSxcbiAgICogYWZ0ZXIgdGhlIGFwcCdzIG93biBgaW5pdGlhbGl6ZU1vZGVsc2AgaG9vay4gQSBwYWNrYWdlIHdob3NlIG1vZGVscyBkaXJlY3RvcnlcbiAgICogaXMgYWJzZW50IGlzIHNraXBwZWQ7IGEgcGFja2FnZSBtb2RlbCB3aG9zZSBuYW1lIGNvbGxpZGVzIHdpdGggYW5cbiAgICogYWxyZWFkeS1yZWdpc3RlcmVkIGRpZmZlcmVudCBjbGFzcyB0aHJvd3MuIE5vZGUtb25seSAodXNlcyB0aGUgZmlsZXN5c3RlbSksIHNvXG4gICAqIGl0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGJyb3dzZXItYnVuZGxlZCBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplUGFja2FnZU1vZGVscyhjb25maWd1cmF0aW9uKSB7XG4gICAgZm9yIChjb25zdCB2ZWxvY2lvdXNQYWNrYWdlIG9mIGNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZXMoKSkge1xuICAgICAgY29uc3QgbW9kZWxzUGF0aCA9IHZlbG9jaW91c1BhY2thZ2UuZ2V0TW9kZWxzUGF0aCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyhtb2RlbHNQYXRoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VSZXF1aXJlQ29udGV4dCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvaW5pdGlhbGl6ZXItZnJvbS1yZXF1aXJlLWNvbnRleHQuanNcIikuTW9kZWxDbGFzc1JlcXVpcmVDb250ZXh0VHlwZX0gKi8gKHJlcXVpcmVDb250ZXh0KG1vZGVsc1BhdGgsIHRydWUsIC9eKC4rKVxcLmpzJC8pKVxuICAgICAgY29uc3QgbW9kZWxDbGFzc2VzID0gY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIHBhY2thZ2VSZXF1aXJlQ29udGV4dC5rZXlzKCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHBhY2thZ2VSZXF1aXJlQ29udGV4dChmaWxlTmFtZSk/LmRlZmF1bHRcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBtb2RlbENsYXNzICYmIG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXVxuXG4gICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZyAhPT0gbW9kZWxDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBcIiR7dmVsb2Npb3VzUGFja2FnZS5nZXROYW1lKCl9XCIgbW9kZWwgXCIke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9XCIgY29sbGlkZXMgd2l0aCBhbiBhbHJlYWR5LXJlZ2lzdGVyZWQgbW9kZWwuYClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgSW5pdGlhbGl6ZSAke3ZlbG9jaW91c1BhY2thZ2UuZ2V0TmFtZSgpfSBwYWNrYWdlIG1vZGVsc2B9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG5ldyBJbml0aWFsaXplckZyb21SZXF1aXJlQ29udGV4dCh7cmVxdWlyZUNvbnRleHQ6IHBhY2thZ2VSZXF1aXJlQ29udGV4dH0pLmluaXRpYWxpemUoe2NvbmZpZ3VyYXRpb259KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IG5ld0NvbmZpZ3VyYXRpb24gLSBOZXcgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q29uZmlndXJhdGlvbihuZXdDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIuc2V0Q29uZmlndXJhdGlvbihuZXdDb25maWd1cmF0aW9uKVxuXG4gICAgaWYgKCFuZXdDb25maWd1cmF0aW9uLmdldFJvdXRlUmVzb2x2ZXJIb29rcygpLmluY2x1ZGVzKGZyb250ZW5kTW9kZWxDb21tYW5kUm91dGVIb29rKSkge1xuICAgICAgbmV3Q29uZmlndXJhdGlvbi5hZGRSb3V0ZVJlc29sdmVySG9vayhmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vaylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWFkIGF0dGFjaG1lbnQgaW5wdXQgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIEZpbGUgYnl0ZXMuXG4gICAqL1xuICBhc3luYyByZWFkQXR0YWNobWVudElucHV0RmlsZShmaWxlUGF0aCkge1xuICAgIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgYXR0YWNobWVudCBpbnB1dCBwYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MuYWxsb3dlZFBhdGhQcmVmaXhlcyAtIEFsbG93ZWQgcGF0aCBwcmVmaXhlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW5wdXRQYXRoIC0gSW5wdXQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXR0YWNobWVudFBhdGhTb3VyY2U+fSAtIE9wZW5lZCByZWd1bGFyLWZpbGUgcGF0aCBzb3VyY2UuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQXR0YWNobWVudElucHV0UGF0aCh7YWxsb3dlZFBhdGhQcmVmaXhlcywgaW5wdXRQYXRofSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0UGF0aClcbiAgICBjb25zdCBwcmVmaXhlcyA9IEFycmF5LmlzQXJyYXkoYWxsb3dlZFBhdGhQcmVmaXhlcylcbiAgICAgID8gYWxsb3dlZFBhdGhQcmVmaXhlcy5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgJiYgZW50cnkubGVuZ3RoID4gMClcbiAgICAgIDogW11cblxuICAgIGlmIChwcmVmaXhlcy5sZW5ndGggPiAwICYmICFwYXRoV2l0aGluQWxsb3dlZFByZWZpeGVzKGZpbGVQYXRoLCBwcmVmaXhlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgcGF0aCBpcyBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgXCJyXCIpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgZmlsZUhhbmRsZS5zdGF0KClcblxuICAgICAgaWYgKCFmaWxlU3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCBwYXRoIG11c3QgcmVmZXJlbmNlIGEgcmVndWxhciBmaWxlXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXR0YWNobWVudFBhdGhTb3VyY2Uoe1xuICAgICAgICBieXRlU2l6ZTogZmlsZVN0YXRzLnNpemUsXG4gICAgICAgIGZpbGVIYW5kbGUsXG4gICAgICAgIGZpbGVQYXRoXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKClcbiAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgIFtlcnJvciwgY2xvc2VFcnJvcl0sXG4gICAgICAgICAgYEF0dGFjaG1lbnQgcGF0aCB2YWxpZGF0aW9uIGFuZCBzb3VyY2UgY2xvc2UgYm90aCBmYWlsZWQgZm9yICR7ZmlsZVBhdGh9YCxcbiAgICAgICAgICB7Y2F1c2U6IGNsb3NlRXJyb3J9XG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIGNvbW1hbmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBhc3luYyBmaW5kQ29tbWFuZHMoKSB7XG4gICAgdGhpcy5fZmluZENvbW1hbmRzUmVzdWx0IHx8PSBhd2FpdCB0aGlzLl9hY3R1YWxGaW5kQ29tbWFuZHMoKVxuXG4gICAgaWYgKCF0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY29tbWFuZHNcIilcblxuICAgIHJldHVybiB0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIHRpbWV6b25lIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldE1pbnV0ZXMgLSBPZmZzZXQgaW4gbWludXRlcyAoRGF0ZSNnZXRUaW1lem9uZU9mZnNldCkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IG9mIHRoZSBjYWxsYmFjay5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhUaW1lem9uZU9mZnNldChvZmZzZXRNaW51dGVzLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1N0b3JlID0gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5ydW4oe1xuICAgICAgYWJpbGl0eTogZXhpc3RpbmdTdG9yZT8uYWJpbGl0eSxcbiAgICAgIG9mZnNldE1pbnV0ZXMsXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICB9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVpvbmUgLSBJQU5BIHRpbWV6b25lIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzdWx0IG9mIHRoZSBjYWxsYmFjay5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhUaW1lem9uZSh0aW1lWm9uZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBhd2FpdCBzdXBlci5ydW5XaXRoVGltZXpvbmUodGltZVpvbmUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5OiBleGlzdGluZ1N0b3JlPy5hYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogdmFsaWRhdGVUaW1lWm9uZSh0aW1lWm9uZSwgXCJ0aW1lWm9uZVwiKVxuICAgIH0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHRpbWV6b25lIG9mZnNldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldE1pbnV0ZXMgLSBPZmZzZXQgaW4gbWludXRlcyAoRGF0ZSNnZXRUaW1lem9uZU9mZnNldCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFRpbWV6b25lT2Zmc2V0KG9mZnNldE1pbnV0ZXMpIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHJldHVyblxuXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChzdG9yZSkge1xuICAgICAgc3RvcmUub2Zmc2V0TWludXRlcyA9IG9mZnNldE1pbnV0ZXNcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdTdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgICB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmVudGVyV2l0aCh7XG4gICAgICAgIGFiaWxpdHk6IGV4aXN0aW5nU3RvcmU/LmFiaWxpdHksXG4gICAgICAgIG9mZnNldE1pbnV0ZXMsXG4gICAgICAgIHJlcXVlc3RUaW1pbmc6IGV4aXN0aW5nU3RvcmU/LnJlcXVlc3RUaW1pbmcsXG4gICAgICAgIHRlbmFudDogZXhpc3RpbmdTdG9yZT8udGVuYW50LFxuICAgICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVpvbmUgLSBJQU5BIHRpbWV6b25lIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFRpbWV6b25lKHRpbWVab25lKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBzdXBlci5zZXRUaW1lem9uZSh0aW1lWm9uZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUaW1lWm9uZSA9IHZhbGlkYXRlVGltZVpvbmUodGltZVpvbmUsIFwidGltZVpvbmVcIilcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgaWYgKHN0b3JlKSB7XG4gICAgICBzdG9yZS50aW1lWm9uZSA9IG5vcm1hbGl6ZWRUaW1lWm9uZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleGlzdGluZ1N0b3JlID0gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpXG5cbiAgICAgIHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZW50ZXJXaXRoKHtcbiAgICAgICAgYWJpbGl0eTogZXhpc3RpbmdTdG9yZT8uYWJpbGl0eSxcbiAgICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICAgIHJlcXVlc3RUaW1pbmc6IGV4aXN0aW5nU3RvcmU/LnJlcXVlc3RUaW1pbmcsXG4gICAgICAgIHRlbmFudDogZXhpc3RpbmdTdG9yZT8udGVuYW50LFxuICAgICAgICB0aW1lWm9uZTogbm9ybWFsaXplZFRpbWVab25lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0aW1lem9uZSBvZmZzZXQgbWludXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE9mZnNldCBpbiBtaW51dGVzLlxuICAgKi9cbiAgZ2V0VGltZXpvbmVPZmZzZXRNaW51dGVzKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAodGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgICAgaWYgKHN0b3JlICYmIHR5cGVvZiBzdG9yZS5vZmZzZXRNaW51dGVzID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBzdG9yZS5vZmZzZXRNaW51dGVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyhjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRpbWV6b25lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGltZXpvbmUgaWRlbnRpZmllci5cbiAgICovXG4gIGdldFRpbWVab25lKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAodGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgICAgaWYgKHN0b3JlICYmIHR5cGVvZiBzdG9yZS50aW1lWm9uZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gc3RvcmUudGltZVpvbmVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0VGltZVpvbmUoY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biB3aXRoIGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5IHRvIHNldCBmb3IgY2FsbGJhY2sgc2NvcGUuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHN1cGVyLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50OiBleGlzdGluZ1N0b3JlPy50ZW5hbnQsXG4gICAgICB0aW1lWm9uZTogZXhpc3RpbmdTdG9yZT8udGltZVpvbmUgPz8gdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICB9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBjdXJyZW50IGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFiaWxpdHkgLSBBYmlsaXR5IHRvIHNldC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Q3VycmVudEFiaWxpdHkoYWJpbGl0eSkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgc3VwZXIuc2V0Q3VycmVudEFiaWxpdHkoYWJpbGl0eSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChleGlzdGluZ1N0b3JlKSB7XG4gICAgICBleGlzdGluZ1N0b3JlLmFiaWxpdHkgPSBhYmlsaXR5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZW50ZXJXaXRoKHtcbiAgICAgICAgYWJpbGl0eSxcbiAgICAgICAgb2Zmc2V0TWludXRlczogdGhpcy5nZXRUaW1lem9uZU9mZnNldE1pbnV0ZXModGhpcy5nZXRDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICByZXF1ZXN0VGltaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHRlbmFudDogdW5kZWZpbmVkLFxuICAgICAgICB0aW1lWm9uZTogdGhpcy5nZXRUaW1lWm9uZSh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgYWJpbGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgYWJpbGl0eS5cbiAgICovXG4gIGdldEN1cnJlbnRBYmlsaXR5KCkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRBYmlsaXR5KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy5hYmlsaXR5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gd2l0aCByZXF1ZXN0IHRpbWluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gcmVxdWVzdFRpbWluZyAtIFJlcXVlc3QgdGltaW5nIGNvbGxlY3Rvci5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJ1bldpdGhSZXF1ZXN0VGltaW5nKHJlcXVlc3RUaW1pbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VwZXIucnVuV2l0aFJlcXVlc3RUaW1pbmcocmVxdWVzdFRpbWluZywgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdTdG9yZSA9IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UucnVuKHtcbiAgICAgIGFiaWxpdHk6IGV4aXN0aW5nU3RvcmU/LmFiaWxpdHksXG4gICAgICBvZmZzZXRNaW51dGVzOiBleGlzdGluZ1N0b3JlPy5vZmZzZXRNaW51dGVzID8/IHRoaXMuZ2V0VGltZXpvbmVPZmZzZXRNaW51dGVzKHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKSxcbiAgICAgIHJlcXVlc3RUaW1pbmcsXG4gICAgICB0ZW5hbnQ6IGV4aXN0aW5nU3RvcmU/LnRlbmFudCxcbiAgICAgIHRpbWVab25lOiBleGlzdGluZ1N0b3JlPy50aW1lWm9uZSA/PyB0aGlzLmdldFRpbWVab25lKHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpKVxuICAgIH0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGN1cnJlbnQgcmVxdWVzdCB0aW1pbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC10aW1pbmcuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IHJlcXVlc3QgdGltaW5nIGNvbGxlY3Rvci5cbiAgICovXG4gIGdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKCkge1xuICAgIGlmICghdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy5yZXF1ZXN0VGltaW5nXG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gd2l0aCB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHRlbmFudCAtIFRlbmFudCB0byBzZXQgZm9yIGNhbGxiYWNrIHNjb3BlLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuV2l0aFRlbmFudCh0ZW5hbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3VwZXIucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7XG4gICAgICBhYmlsaXR5OiBleGlzdGluZ1N0b3JlPy5hYmlsaXR5LFxuICAgICAgb2Zmc2V0TWludXRlczogZXhpc3RpbmdTdG9yZT8ub2Zmc2V0TWludXRlcyA/PyB0aGlzLmdldFRpbWV6b25lT2Zmc2V0TWludXRlcyh0aGlzLmdldENvbmZpZ3VyYXRpb24oKSksXG4gICAgICByZXF1ZXN0VGltaW5nOiBleGlzdGluZ1N0b3JlPy5yZXF1ZXN0VGltaW5nLFxuICAgICAgdGVuYW50LFxuICAgICAgdGltZVpvbmU6IGV4aXN0aW5nU3RvcmU/LnRpbWVab25lID8/IHRoaXMuZ2V0VGltZVpvbmUodGhpcy5nZXRDb25maWd1cmF0aW9uKCkpXG4gICAgfSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY3VycmVudCB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHRlbmFudCAtIFRlbmFudCB0byBzZXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEN1cnJlbnRUZW5hbnQodGVuYW50KSB7XG4gICAgaWYgKCF0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICBzdXBlci5zZXRDdXJyZW50VGVuYW50KHRlbmFudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nU3RvcmUgPSB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKClcblxuICAgIGlmIChleGlzdGluZ1N0b3JlKSB7XG4gICAgICBleGlzdGluZ1N0b3JlLnRlbmFudCA9IHRlbmFudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lem9uZUFzeW5jTG9jYWxTdG9yYWdlLmVudGVyV2l0aCh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgb2Zmc2V0TWludXRlczogdGhpcy5nZXRUaW1lem9uZU9mZnNldE1pbnV0ZXModGhpcy5nZXRDb25maWd1cmF0aW9uKCkpLFxuICAgICAgICByZXF1ZXN0VGltaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHRlbmFudCxcbiAgICAgICAgdGltZVpvbmU6IHRoaXMuZ2V0VGltZVpvbmUodGhpcy5nZXRDb25maWd1cmF0aW9uKCkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjdXJyZW50IHRlbmFudC5cbiAgICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEN1cnJlbnQgdGVuYW50LlxuICAgKi9cbiAgZ2V0Q3VycmVudFRlbmFudCgpIHtcbiAgICBpZiAoIXRoaXMuX3RpbWV6b25lQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdXBlci5nZXRDdXJyZW50VGVuYW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXpvbmVBc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpPy50ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFjdHVhbCBmaW5kIGNvbW1hbmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCBkaXNjb3ZlcmVkIGNvbW1hbmQgZmlsZXMuXG4gICAqL1xuICBhc3luYyBfYWN0dWFsRmluZENvbW1hbmRzKCkge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5nZXRCYXNlUGF0aCgpXG4gICAgY29uc3QgY29tbWFuZEZpbGVzID0gZnMuZ2xvYihgJHtiYXNlUGF0aH0vc3JjL2NsaS9jb21tYW5kcy8qKi8qLmpzYClcbiAgICBjb25zdCBjb21tYW5kcyA9IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGFGaWxlUGF0aCBvZiBjb21tYW5kRmlsZXMpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5jb21tYW5kTmFtZUZyb21GaWxlUGF0aChhRmlsZVBhdGgpXG5cbiAgICAgIGNvbW1hbmRzLnB1c2goe25hbWU6IGNvbW1hbmROYW1lLCBmaWxlOiBhRmlsZVBhdGh9KVxuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29tbWFuZCBuYW1lIGZyb20gZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIGNvbW1hbmQgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBhcnNlZCBjb21tYW5kIG5hbWUuXG4gICAqL1xuICBjb21tYW5kTmFtZUZyb21GaWxlUGF0aChmaWxlUGF0aCkge1xuICAgIGNvbnN0IGFGaWxlUGF0aFBhcnRzID0gZmlsZVBhdGguc3BsaXQoL1tcXFxcL10vKVxuICAgIGNvbnN0IGNvbW1hbmRQYXRoTG9jYXRpb24gPSBhRmlsZVBhdGhQYXJ0cy5pbmRleE9mKFwiY29tbWFuZHNcIilcblxuICAgIGlmIChjb21tYW5kUGF0aExvY2F0aW9uID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgY29tbWFuZCBmaWxlIHBhdGg6ICR7ZmlsZVBhdGh9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kUGFydHMgPSBhRmlsZVBhdGhQYXJ0cy5zbGljZShjb21tYW5kUGF0aExvY2F0aW9uICsgMSlcbiAgICBjb25zdCBsYXN0UGFydCA9IGNvbW1hbmRQYXJ0c1tjb21tYW5kUGFydHMubGVuZ3RoIC0gMV1cbiAgICBsZXQgbmFtZSwgcGF0aHNcblxuICAgIGlmIChsYXN0UGFydCA9PSBcImluZGV4LmpzXCIpIHtcbiAgICAgIG5hbWUgPSBjb21tYW5kUGFydHNbY29tbWFuZFBhcnRzLmxlbmd0aCAtIDJdXG4gICAgICBwYXRocyA9IGNvbW1hbmRQYXJ0cy5zbGljZSgwLCAtMilcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IGxhc3RQYXJ0LnJlcGxhY2UoXCIuanNcIiwgXCJcIilcbiAgICAgIHBhdGhzID0gY29tbWFuZFBhcnRzLnNsaWNlKDAsIC0xKVxuICAgIH1cblxuICAgIHJldHVybiBgJHtwYXRocy5qb2luKFwiOlwiKX0ke3BhdGhzLmxlbmd0aCA+IDAgPyBcIjpcIiA6IFwiXCJ9JHtuYW1lfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBpbml0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzSW5pdChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNJbml0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIG1pZ3JhdGlvbiBnZW5lcmF0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc01pZ3JhdGlvbkdlbmVyYXRlKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlTWlncmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIG1pZ3JhdGlvbiBkZXN0cm95LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzTWlncmF0aW9uRGVzdHJveShjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEZXN0cm95TWlncmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGdlbmVyYXRlIGJhc2UgbW9kZWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzR2VuZXJhdGVCYXNlTW9kZWxzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlQmFzZU1vZGVscylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBnZW5lcmF0ZSBmcm9udGVuZCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNHZW5lcmF0ZUZyb250ZW5kTW9kZWxzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlRnJvbnRlbmRNb2RlbHMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgZ2VuZXJhdGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNHZW5lcmF0ZU1vZGVsKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0dlbmVyYXRlTW9kZWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgbGludCByZWxhdGlvbnNoaXBzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzTGludFJlbGF0aW9uc2hpcHMoY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzTGludFJlbGF0aW9uc2hpcHMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgcm91dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUm91dGVzKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1JvdXRlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBjb25zb2xlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzQ29uc29sZShjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNDb25zb2xlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIHNlcnZlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc1NlcnZlcihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNTZXJ2ZXIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgdGVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc1Rlc3QoY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzVGVzdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBiYWNrZ3JvdW5kIGpvYnMgbWFpbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0JhY2tncm91bmRKb2JzTWFpbihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic01haW4pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgYmFja2dyb3VuZCBqb2JzIHdvcmtlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0JhY2tncm91bmRKb2JzV29ya2VyKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0JhY2tncm91bmRKb2JzV29ya2VyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGJhY2tncm91bmQgam9icyBydW5uZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1J1bm5lcihjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNCYWNrZ3JvdW5kSm9ic1J1bm5lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBiZWFjb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fSBjb21tYW5kIC0gQ29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2xpQ29tbWFuZHNCZWFjb24oY29tbWFuZCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZvcndhcmRDb21tYW5kKGNvbW1hbmQsIENsaUNvbW1hbmRzQmVhY29uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9hZCBiZWFjb24gY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vYmVhY29uL2NsaWVudC5qc1wiKS5kZWZhdWx0Pn0gLSBCZWFjb24gY2xpZW50IGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgbG9hZEJlYWNvbkNsaWVudCgpIHtcbiAgICBjb25zdCB7ZGVmYXVsdDogQmVhY29uQ2xpZW50fSA9IGF3YWl0IGltcG9ydChcIi4uL2JlYWNvbi9jbGllbnQuanNcIilcblxuICAgIHJldHVybiBCZWFjb25DbGllbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvYWQgaW4gcHJvY2VzcyBiZWFjb24gY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vYmVhY29uL2luLXByb2Nlc3MtY2xpZW50LmpzXCIpLmRlZmF1bHQ+fSAtIEluLXByb2Nlc3MgY2xpZW50IGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluUHJvY2Vzc0JlYWNvbkNsaWVudCgpIHtcbiAgICBjb25zdCB7ZGVmYXVsdDogSW5Qcm9jZXNzQmVhY29uQ2xpZW50fSA9IGF3YWl0IGltcG9ydChcIi4uL2JlYWNvbi9pbi1wcm9jZXNzLWNsaWVudC5qc1wiKVxuXG4gICAgcmV0dXJuIEluUHJvY2Vzc0JlYWNvbkNsaWVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpIGNvbW1hbmRzIGRiIHNjaGVtYSBkdW1wLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzRGJTY2hlbWFEdW1wKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc0RiU2NoZW1hRHVtcClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBkYiBzY2hlbWEgbG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0RiU2NoZW1hTG9hZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEYlNjaGVtYUxvYWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgZGIgc2VlZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jbGkvYmFzZS1jb21tYW5kLmpzXCIpLmRlZmF1bHR9IGNvbW1hbmQgLSBDb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjbGlDb21tYW5kc0RiU2VlZChjb21tYW5kKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZm9yd2FyZENvbW1hbmQoY29tbWFuZCwgQ2xpQ29tbWFuZHNEYlNlZWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbGkgY29tbWFuZHMgcnVubmVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUnVubmVyKGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1J1bm5lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsaSBjb21tYW5kcyBydW4gc2NyaXB0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH0gY29tbWFuZCAtIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNsaUNvbW1hbmRzUnVuU2NyaXB0KGNvbW1hbmQpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3J3YXJkQ29tbWFuZChjb21tYW5kLCBDbGlDb21tYW5kc1J1blNjcmlwdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcXVpcmUgY29tbWFuZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5jb21tYW5kUGFydHMgLSBDb21tYW5kIHBhcnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0IChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgcmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0c30pIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IGF3YWl0IHRoaXMuZmluZENvbW1hbmRzKClcbiAgICBjb25zdCBjb21tYW5kTmFtZSA9IGNvbW1hbmRQYXJ0cy5qb2luKFwiOlwiKVxuICAgIGNvbnN0IGNvbW1hbmQgPSBjb21tYW5kcy5maW5kKChhQ29tbWFuZCkgPT4gYUNvbW1hbmQubmFtZSA9PT0gY29tbWFuZE5hbWUpXG5cbiAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlQ29tbWFuZHMgPSBjb21tYW5kcy5tYXAoYUNvbW1hbmQgPT4gYUNvbW1hbmQubmFtZSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZFBhcnRzLmpvaW4oXCI6XCIpfSB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIG9uZSBvZjogJHtwb3NzaWJsZUNvbW1hbmRzLnNvcnQoKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kQ2xhc3NJbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoY29tbWFuZC5maWxlKSlcbiAgICBjb25zdCBDb21tYW5kQ2xhc3MgPSBjb21tYW5kQ2xhc3NJbXBvcnQuZGVmYXVsdFxuXG4gICAgcmV0dXJuIENvbW1hbmRDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCBtaWdyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMuXG4gICAqL1xuICBhc3luYyBmaW5kTWlncmF0aW9ucygpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBtaWdyYXRpb25EaXJlY3RvcmllcyA9IFtgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2BdXG5cbiAgICBmb3IgKGNvbnN0IHZlbG9jaW91c1BhY2thZ2Ugb2YgY29uZmlndXJhdGlvbi5nZXRQYWNrYWdlcygpKSB7XG4gICAgICBtaWdyYXRpb25EaXJlY3Rvcmllcy5wdXNoKHZlbG9jaW91c1BhY2thZ2UuZ2V0TWlncmF0aW9uc1BhdGgoKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlPn0gKi9cbiAgICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbnNQYXRoIG9mIG1pZ3JhdGlvbkRpcmVjdG9yaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9jb2xsZWN0TWlncmF0aW9uc0Zyb21EaXJlY3RvcnkobWlncmF0aW9uc1BhdGgsIGZpbGVzKVxuICAgIH1cblxuICAgIHRoaXMuX2Vuc3VyZU5vTWlncmF0aW9uVGltZXN0YW1wQ29sbGlzaW9ucyhmaWxlcylcblxuICAgIHJldHVybiBmaWxlcy5zb3J0KChtaWdyYXRpb24xLCBtaWdyYXRpb24yKSA9PiBtaWdyYXRpb24xLmRhdGUgLSBtaWdyYXRpb24yLmRhdGUpXG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgbWlncmF0aW9uIGZpbGVzIGZyb20gb25lIGRpcmVjdG9yeSBpbnRvIGBmaWxlc2AsIHByZXNlcnZpbmcgZWFjaFxuICAgKiBmaWxlJ3MgcmVhbCBhYnNvbHV0ZSBwYXRoIChzbyBhcHAgYW5kIHBhY2thZ2UgbWlncmF0aW9ucyBrZWVwIHRoZWlyIG93blxuICAgKiBzb3VyY2UgbG9jYXRpb24pLiBBIG1pc3NpbmcgZGlyZWN0b3J5IGlzIHNraXBwZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtaWdyYXRpb25zUGF0aCAtIERpcmVjdG9yeSB0byBzY2FuLlxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4vYmFzZS5qc1wiKS5NaWdyYXRpb25PYmplY3RUeXBlPn0gZmlsZXMgLSBBY2N1bXVsYXRvciB0byBwdXNoIGludG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfY29sbGVjdE1pZ3JhdGlvbnNGcm9tRGlyZWN0b3J5KG1pZ3JhdGlvbnNQYXRoLCBmaWxlcykge1xuICAgIGNvbnN0IGdsb2IgPSBhd2FpdCBmcy5nbG9iKGAke21pZ3JhdGlvbnNQYXRofS8qKi8qLmpzYClcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZ1bGxQYXRoIG9mIGdsb2IpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHBhdGguYmFzZW5hbWUoZnVsbFBhdGgpXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZmlsZS5tYXRjaCgvXihcXGR7MTR9KS0oLispXFwuanMkLylcblxuICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZUludChtYXRjaFsxXSlcbiAgICAgICAgY29uc3QgbWlncmF0aW9uTmFtZSA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobWlncmF0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgZmlsZXMucHVzaCh7ZmlsZSwgZnVsbFBhdGgsIGRhdGUsIG1pZ3JhdGlvbkNsYXNzTmFtZX0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgvKiogQHR5cGUge0Vycm9yICYge2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyb3IpPy5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0d28gbWlncmF0aW9ucyBmcm9tIGRpZmZlcmVudCBmaWxlcyBzaGFyZSB0aGUgc2FtZSAxNC1kaWdpdFxuICAgKiB0aW1lc3RhbXAuIFRoZSBgc2NoZW1hX21pZ3JhdGlvbnNgIGxlZGdlciBrZXlzIG9uIHRoZSB0aW1lc3RhbXAsIHNvIGEgc2lsZW50XG4gICAqIGNvbGxpc2lvbiAoZS5nLiBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgcGFja2FnZSwgb3IgdHdvIHBhY2thZ2VzKSB3b3VsZCBsZWF2ZVxuICAgKiB0aGUgc2Vjb25kIG1pZ3JhdGlvbiB1bi1ydW4g4oCUIGEgZGF0YSBidWcuIEZhaWwgbG91ZGx5IGluc3RlYWQuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9iYXNlLmpzXCIpLk1pZ3JhdGlvbk9iamVjdFR5cGU+fSBmaWxlcyAtIENvbGxlY3RlZCBtaWdyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfZW5zdXJlTm9NaWdyYXRpb25UaW1lc3RhbXBDb2xsaXNpb25zKGZpbGVzKSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHBhdGhzQnlEYXRlID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBmaWxlcykge1xuICAgICAgaWYgKCFtaWdyYXRpb24uZnVsbFBhdGgpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGF0aHNCeURhdGUuZ2V0KG1pZ3JhdGlvbi5kYXRlKVxuXG4gICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcgIT09IG1pZ3JhdGlvbi5mdWxsUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR3byBtaWdyYXRpb25zIHNoYXJlIHRoZSB0aW1lc3RhbXAgJHttaWdyYXRpb24uZGF0ZX06ICR7ZXhpc3Rpbmd9IGFuZCAke21pZ3JhdGlvbi5mdWxsUGF0aH0uIE1pZ3JhdGlvbiB0aW1lc3RhbXBzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyB0aGUgYXBwIGFuZCBhbGwgcGFja2FnZXMuYClcbiAgICAgIH1cblxuICAgICAgcGF0aHNCeURhdGUuc2V0KG1pZ3JhdGlvbi5kYXRlLCBtaWdyYXRpb24uZnVsbFBhdGgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IGFwcGxpY2F0aW9uIHJvdXRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vcm91dGVzL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGltcG9ydCBhcHBsaWNhdGlvbiByb3V0ZXMuXG4gICAqL1xuICBhc3luYyBpbXBvcnRBcHBsaWNhdGlvblJvdXRlcygpIHtcbiAgICBjb25zdCByb3V0ZXNJbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoYCR7dGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGlyZWN0b3J5KCl9L3NyYy9jb25maWcvcm91dGVzLmpzYCkpXG5cbiAgICByZXR1cm4gcm91dGVzSW1wb3J0LmRlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB2ZWxvY2lvdXMgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB2ZWxvY2lvdXMgcGF0aC5cbiAgICovXG4gIGFzeW5jIGdldFZlbG9jaW91c1BhdGgoKSB7XG4gICAgaWYgKCF0aGlzLl92ZWxvY2lvdXNQYXRoKSB7XG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpXG5cbiAgICAgIHRoaXMuX3ZlbG9jaW91c1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9Ly4uLy4uYClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmVsb2Npb3VzUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IHRlc3QgZmlsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRlc3RGaWxlcyAtIFRlc3QgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbXBvcnRUZXN0RmlsZXModGVzdEZpbGVzKSB7XG4gICAgZm9yIChjb25zdCB0ZXN0RmlsZSBvZiB0ZXN0RmlsZXMpIHtcbiAgICAgIGF3YWl0IGltcG9ydCh0b0ltcG9ydFNwZWNpZmllcih0ZXN0RmlsZSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlZmF1bHQgbG9nIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGRlZmF1bHQgbG9nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldERlZmF1bHRMb2dEaXJlY3Rvcnkoe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpLCBcImxvZ1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGxvZyBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5kaXJlY3RvcnkgLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZW52aXJvbm1lbnQgLSBFbnZpcm9ubWVudC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUgbG9nIGZpbGUgcGF0aC5cbiAgICovXG4gIGdldExvZ0ZpbGVQYXRoKHtjb25maWd1cmF0aW9uLCBkaXJlY3RvcnksIGVudmlyb25tZW50fSkge1xuICAgIGNvbnN0IGFjdHVhbERpcmVjdG9yeSA9IGRpcmVjdG9yeSB8fCBjb25maWd1cmF0aW9uPy5nZXREaXJlY3Rvcnk/LigpXG5cbiAgICBpZiAoIWFjdHVhbERpcmVjdG9yeSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhY3R1YWxEaXJlY3RvcnksIGAke2Vudmlyb25tZW50fS5sb2dgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUgbG9nIHRvIGZpbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVMb2dUb0ZpbGUoe2ZpbGVQYXRoLCBtZXNzYWdlfSkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIGF3YWl0IGZzLmFwcGVuZEZpbGUoZmlsZVBhdGgsIGAke21lc3NhZ2V9XFxuYCwgXCJ1dGY4XCIpXG4gIH1cblxuICBhc3luYyBpbXBvcnRUZXN0aW5nQ29uZmlnUGF0aCgpIHtcbiAgICBjb25zdCB0ZXN0aW5nQ29uZmlnUGF0aCA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRlc3RpbmcoKVxuXG4gICAgaWYgKCF0ZXN0aW5nQ29uZmlnUGF0aCkgcmV0dXJuXG5cbiAgICBjb25zdCB0ZXN0aW5nSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKHRlc3RpbmdDb25maWdQYXRoKSlcbiAgICBjb25zdCB0ZXN0aW5nRGVmYXVsdCA9IHRlc3RpbmdJbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCF0ZXN0aW5nRGVmYXVsdCkgdGhyb3cgbmV3IEVycm9yKFwiVGVzdGluZyBjb25maWcgbXVzdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uXCIpXG4gICAgaWYgKHR5cGVvZiB0ZXN0aW5nRGVmYXVsdCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUZXN0aW5nIGNvbmZpZyBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXN0aW5nRGVmYXVsdCgpXG5cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCByZXN1bHQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcXVpcmUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdGlvbi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1aXJlIG1pZ3JhdGlvbi5cbiAgICovXG4gIGFzeW5jIHJlcXVpcmVNaWdyYXRpb24oZmlsZVBhdGgpIHtcbiAgICBjb25zdCBtaWdyYXRpb25JbXBvcnQgPSBhd2FpdCBpbXBvcnQodG9JbXBvcnRTcGVjaWZpZXIoZmlsZVBhdGgpKVxuICAgIGNvbnN0IG1pZ3JhdGlvbkltcG9ydERlZmF1bHQgPSBtaWdyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnREZWZhdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaWdyYXRpb24gZmlsZSBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgbWlncmF0aW9uIGNsYXNzXCIpXG4gICAgaWYgKHR5cGVvZiBtaWdyYXRpb25JbXBvcnREZWZhdWx0ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uIChzaG91bGQgYmUgYSBjbGFzcyB3aGljaCBpcyBhIGZ1bmN0aW9uIGluIEpTKVwiKVxuXG4gICAgcmV0dXJuIG1pZ3JhdGlvbkltcG9ydERlZmF1bHRcbiAgfVxuXG4gIGFzeW5jIGdldEJhc2VQYXRoKCkge1xuICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IGZzLnJlYWxwYXRoKGAke2Rpcm5hbWUoX19maWxlbmFtZSl9Ly4uLy4uYClcblxuICAgIHJldHVybiBiYXNlUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdmVsb2Npb3VzJyBiYWNrZ3JvdW5kLWpvYnMgc2NoZW1hIGV4aXN0cyBvbiBpdHMgY29uZmlndXJlZCBkYXRhYmFzZVxuICAgKiBhcyBwYXJ0IG9mIGBkYjptaWdyYXRlYCwgc28gdGhlIGZyYW1ld29yaydzIG93biB0YWJsZXMgKGJhY2tncm91bmRfam9icyArXG4gICAqIGJhY2tncm91bmRfam9iX2NvbmN1cnJlbmN5LCBleGVjdXRpb25fbW9kZSBldGMuKSBhcmUgY3JlYXRlZCBkZXRlcm1pbmlzdGljYWxseVxuICAgKiBhbG9uZ3NpZGUgYXBwIG1pZ3JhdGlvbnMgYW5kIGNhcHR1cmVkIGluIHRoZSBkdW1wZWQgc3RydWN0dXJlIFNRTCDigJQgcmF0aGVyIHRoYW5cbiAgICogb25seSBhcHBlYXJpbmcgb25jZSBhIHJ1bnRpbWUgc3RvcmUgYm9vdHMuIFJldXNlcyB0aGUgc3RvcmUncyBpZGVtcG90ZW50XG4gICAqIGBfZW5zdXJlU2NoZW1hYCwgc28gaXQncyBzYWZlIHRvIHJlLXJ1biBhZ2FpbnN0IERCcyB0aGF0IGFscmVhZHkgaGF2ZSBpdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzIGJlaW5nIG1pZ3JhdGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRnJhbWV3b3JrU2NoZW1hKHtkYnN9KSB7XG4gICAgY29uc3Qge2RlZmF1bHQ6IEJhY2tncm91bmRKb2JzU3RvcmV9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYmFja2dyb3VuZC1qb2JzL3N0b3JlLmpzXCIpXG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgQmFja2dyb3VuZEpvYnNTdG9yZSh7Y29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCl9KVxuICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IHN0b3JlLmdldERhdGFiYXNlSWRlbnRpZmllcigpID8/IFwiZGVmYXVsdFwiXG4gICAgY29uc3QgZnJhbWV3b3JrRGIgPSBkYnNbZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgLy8gT25seSBlbnN1cmUgdGhlIGZyYW1ld29yayBzY2hlbWEgd2hlbiB0aGUgYmFja2dyb3VuZC1qb2JzIGRhdGFiYXNlIGlzIGFjdHVhbGx5XG4gICAgLy8gcGFydCBvZiB0aGlzIG1pZ3JhdGUgb3BlcmF0aW9uLiBXaGVuIGl0IGlzbid0IGFtb25nIHRoZSBtaWdyYXRlZCBzZXQg4oCUIGUuZy5cbiAgICAvLyBgZGI6dGVuYW50czptaWdyYXRlIDx0ZW5hbnQ+YCwgd2hpY2ggbWlncmF0ZXMgb25seSB0ZW5hbnQgZGF0YWJhc2VzIOKAlCB0aGVcbiAgICAvLyBmcmFtZXdvcmsgc3RvcmUgbGl2ZXMgZWxzZXdoZXJlICh0eXBpY2FsbHkgdGhlIGRlZmF1bHQgREIpIGFuZCB3YXMgYWxyZWFkeVxuICAgIC8vIGVuc3VyZWQgYnkgdGhlIHBsYWluIGBkYjptaWdyYXRlYCB0aGF0IHByZWNlZGVzIGl0LiBSZWFjaGluZyBpbnRvIGl0IGhlcmUgd291bGRcbiAgICAvLyBvcGVuIGEgZnJlc2ggY29ubmVjdGlvbiB0byB0aGF0IHNoYXJlZCBkYXRhYmFzZSBvbmNlIHBlciB0ZW5hbnQgd29ya2VyIGZvclxuICAgIC8vIHNjaGVtYSB3b3JrIHRoYXQgaXMgYWxyZWFkeSBhcHBsaWVkLiBTbyBza2lwIHdoZW4gdGhlIGZyYW1ld29yayBEQiBpc24ndCBpblxuICAgIC8vIHRoaXMgc2V0OyB0aGUgcnVudGltZSBzdG9yZSBzdGlsbCBjcmVhdGVzIGl0IGxhemlseSBpZiBhIHBsYWluIG1pZ3JhdGUgbmV2ZXJcbiAgICAvLyByYW4uIFF1ZXVlLWNhcCByZWNvbmNpbGlhdGlvbiBuZXZlciBydW5zIG9uIHRoaXMgcGF0aCBhdCBhbGwg4oCUIGl0IGJlbG9uZ3MgdG9cbiAgICAvLyBtYWluLXByb2Nlc3Mgc3RhcnR1cCAoYEJhY2tncm91bmRKb2JzU3RvcmUjcmVjb25jaWxlUXVldWVDb25jdXJyZW5jeWApLlxuICAgIGlmICghZnJhbWV3b3JrRGIpIHJldHVyblxuXG4gICAgLy8gUmV1c2UgdGhlIGNvbm5lY3Rpb24gZGI6bWlncmF0ZSBhbHJlYWR5IGhvbGRzIGZvciB0aGlzIGRhdGFiYXNlOyBvcGVuaW5nIGFcbiAgICAvLyBuZXN0ZWQgY2hlY2tvdXQgd291bGQgZGVhZGxvY2sgYSBkYXRhYmFzZSB3aG9zZSBwb29sIGlzIGNhcHBlZCBhdCBvbmUgY29ubmVjdGlvbi5cbiAgICBhd2FpdCBzdG9yZS5lbnN1cmVTY2hlbWEoZnJhbWV3b3JrRGIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZnRlciBtaWdyYXRpb25zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gYXJncy5kYnMgLSBEYnMuXG4gICAqIEBwYXJhbSB7XCJtaWdyYXRpb25cIiB8IFwic2NoZW1hRHVtcFwifSBbYXJncy5yZWFzb25dIC0gV2h5IHRoZSBzdHJ1Y3R1cmUgd3JpdGUgaXMgYmVpbmcgdHJpZ2dlcmVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWZ0ZXJNaWdyYXRpb25zKHtkYnMsIHJlYXNvbiA9IFwibWlncmF0aW9uXCJ9KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc2hvdWxkV3JpdGVTdHJ1Y3R1cmVTcWwoe3JlYXNvbn0pKSByZXR1cm5cblxuICAgIGNvbnN0IGRiRGlyID0gcGF0aC5qb2luKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCksIFwiZGJcIilcbiAgICBjb25zdCBzdHJ1Y3R1cmVTcWxCeUlkZW50aWZpZXIgPSBhd2FpdCB0aGlzLl9zdHJ1Y3R1cmVTcWxCeUlkZW50aWZpZXIoe2Ric30pXG5cbiAgICBhd2FpdCBmcy5ta2RpcihkYkRpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyKSkge1xuICAgICAgY29uc3Qgc3RydWN0dXJlU3FsID0gc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyW2lkZW50aWZpZXJdXG5cbiAgICAgIGlmICghc3RydWN0dXJlU3FsKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkYkRpciwgYHN0cnVjdHVyZS0ke2lkZW50aWZpZXJ9LnNxbGApXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgc3RydWN0dXJlU3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0cnVjdHVyZSBzcWwgYnkgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBfc3RydWN0dXJlU3FsQnlJZGVudGlmaWVyKHtkYnN9KSB7XG4gICAgY29uc3Qgc3FsQnlJZGVudGlmaWVyID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoe30pXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoZGJzKSkge1xuICAgICAgY29uc3QgZGIgPSBkYnNbaWRlbnRpZmllcl1cblxuICAgICAgaWYgKHR5cGVvZiBkYi5zdHJ1Y3R1cmVTcWwgIT09IFwiZnVuY3Rpb25cIikgY29udGludWVcblxuICAgICAgY29uc3Qgc3RydWN0dXJlU3FsID0gYXdhaXQgZGIuc3RydWN0dXJlU3FsKClcblxuICAgICAgaWYgKHN0cnVjdHVyZVNxbCkge1xuICAgICAgICBjb25zdCBtaWdyYXRpb25JbnNlcnRzID0gYXdhaXQgdGhpcy5fc2NoZW1hTWlncmF0aW9uc0luc2VydFNxbCh7ZGJ9KVxuXG4gICAgICAgIHNxbEJ5SWRlbnRpZmllcltpZGVudGlmaWVyXSA9IHN0cnVjdHVyZVNxbCArIG1pZ3JhdGlvbkluc2VydHNcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3FsQnlJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIElOU0VSVCBzdGF0ZW1lbnRzIGZvciBldmVyeSByb3cgaW4gYHNjaGVtYV9taWdyYXRpb25zYCBzbyB0aGVcbiAgICogc3RydWN0dXJlIHNuYXBzaG90IGNhcnJpZXMgdGhlIG1pZ3JhdGlvbiBsZWRnZXIgYWxvbmcgd2l0aCB0aGUgRERMLiAgV2l0aG91dFxuICAgKiB0aGVzZSByb3dzIGEgZnJlc2ggREIgbG9hZGVkIGZyb20gdGhlIHNuYXBzaG90IHdpbGwgcmUtcnVuIGV2ZXJ5IG1pZ3JhdGlvbixcbiAgICogd2hpY2ggZmFpbHMgd2hlbiB0aGUgc25hcHNob3QgYWxyZWFkeSBjb250YWlucyB0aGUgcG9zdC1taWdyYXRpb24gc2NoZW1hLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBJTlNFUlQgc3RhdGVtZW50cyAoZW1wdHkgc3RyaW5nIHdoZW4gbm9uZSkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hTWlncmF0aW9uc0luc2VydFNxbCh7ZGJ9KSB7XG4gICAgY29uc3Qge2RlZmF1bHQ6IE1pZ3JhdGlvbnNMZWRnZXJ9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9ucy1sZWRnZXIuanNcIilcblxuICAgIGlmICghYXdhaXQgTWlncmF0aW9uc0xlZGdlci50YWJsZUV4aXN0cyhkYikpIHJldHVybiBcIlwiXG5cbiAgICBjb25zdCB2ZXJzaW9ucyA9IGF3YWl0IE1pZ3JhdGlvbnNMZWRnZXIuYXBwbGllZFZlcnNpb25zKGRiKVxuXG4gICAgaWYgKHZlcnNpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gXCJcIlxuXG4gICAgcmV0dXJuIHZlcnNpb25zLm1hcCgodmVyc2lvbikgPT4gYElOU0VSVCBJTlRPIHNjaGVtYV9taWdyYXRpb25zICh2ZXJzaW9uKSBWQUxVRVMgKCR7ZGIucXVvdGUodmVyc2lvbil9KTtgKS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2hhbm5lbCBwdWJsaXNoZXJzIHNvIGxpZmVjeWNsZVxuICAgKiBldmVudCBob29rcyBicm9hZGNhc3Qgb3ZlciB0aGUgc2hhcmVkIFwiZnJvbnRlbmQtbW9kZWxzXCIgY2hhbm5lbC5cbiAgICogVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGJ5IHRoZSBOb2RlIGhhbmRsZXIgYmVjYXVzZSB0aGUgcmVxdWlyZWRcbiAgICogbW9kdWxlcyAoYGZyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXJgLCBgcm91dGVzL3Jlc29sdmVyYCkgcHVsbCBpblxuICAgKiBzZXJ2ZXItb25seSBOb2RlIEFQSXMgdGhhdCBicmVhayBicm93c2VyIGJ1bmRsZXJzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplRnJvbnRlbmRNb2RlbFdlYnNvY2tldFB1Ymxpc2hlcnMoY29uZmlndXJhdGlvbikge1xuICAgIC8vIERpc2NvdmVyIGVhY2ggYmFja2VuZCBwcm9qZWN0J3MgcmVzb3VyY2VzIGJlZm9yZSByZWdpc3RlcmluZyBwdWJsaXNoZXJzLiBUaGUgcHVibGlzaGVycyBhcmVcbiAgICAvLyBkZXJpdmVkIGZyb20gYGJhY2tlbmRQcm9qZWN0LmZyb250ZW5kTW9kZWxzYCwgd2hpY2ggYGF1dG9EaXNjb3ZlclJlc291cmNlc2AgcG9wdWxhdGVzLiBXaXRob3V0XG4gICAgLy8gdGhpcywgcmVnaXN0cmF0aW9uIHJ1bnMgYWdhaW5zdCBhbiBlbXB0eS9wYXJ0aWFsIHJlc291cmNlIHNldCAob25seSBidWlsdC1pbnMpLCBzbyBhcHBzIHRoYXRcbiAgICAvLyByZXNvbHZlIHJlc291cmNlcyB0aHJvdWdoIGFuIGBhYmlsaXR5UmVzb2x2ZXJgIHJhdGhlciB0aGFuIGEgc3RhdGljIGFiaWxpdHktcmVzb3VyY2UgbGlzdCBuZXZlclxuICAgIC8vIHJlZ2lzdGVyIGxpZmVjeWNsZSBwdWJsaXNoZXJzIGFuZCB0aGVpciByZWFsdGltZSBmcm9udGVuZC1tb2RlbCB1cGRhdGVzIHNpbGVudGx5IHN0b3AuIFRoZVxuICAgIC8vIGxpZmVjeWNsZSBob29rcyBhcmUgZGVkdXBlZCBwZXIgbW9kZWwgY2xhc3MgdmlhIGEgcHJvY2Vzcy1nbG9iYWwgc2V0LCBzbyBhIGxhdGVyLCBmdWxseVxuICAgIC8vIGRpc2NvdmVyZWQgcGFzcyBjYW5ub3QgcmV0cm9hY3RpdmVseSBhZGQgdGhlIG1pc3NpbmcgcHVibGlzaGVycy4gYGF1dG9EaXNjb3ZlclJlc291cmNlc2AgaXNcbiAgICAvLyBpZGVtcG90ZW50IChpdCBza2lwcyBiYWNrZW5kIHByb2plY3RzIHdob3NlIGBmcm9udGVuZE1vZGVsc2AgYXJlIGFscmVhZHkgc2V0KS5cbiAgICBhd2FpdCB0aGlzLmF1dG9EaXNjb3ZlclJlc291cmNlcyhjb25maWd1cmF0aW9uKVxuXG4gICAgY29uc3Qge2Vuc3VyZUZyb250ZW5kTW9kZWxXZWJzb2NrZXRQdWJsaXNoZXJzUmVnaXN0ZXJlZH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbHMvd2Vic29ja2V0LXB1Ymxpc2hlcnMuanNcIilcblxuICAgIGF3YWl0IGVuc3VyZUZyb250ZW5kTW9kZWxXZWJzb2NrZXRQdWJsaXNoZXJzUmVnaXN0ZXJlZChjb25maWd1cmF0aW9uKVxuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-strategy.d.ts","sourceRoot":"","sources":["../../../src/sync/conflict-strategy.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH;;;;;;GAMG;AAbA,YAAkF,aAAa,GAArF,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAe;AAG/F,YAAkB,kBAAkB,GACpC;;;;IAA0C,UAAU,EAAzC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAA8C,OAAO,AAArD,CACF,EADa,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAC7C;CAAA,CAAA;AAEE,YAAkB,kBAAkB,GACpC;;;;IAA2C,UAAU,AAArD,CACA,EADW,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAA2C,QAAQ,AAAnD,CACA,EADW,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAAgD,MAAM,EAA3C,SAAS,GAAG,UAAU,GAAG,UAAU,CAC9C;;;;IAAmB,QAAQ,EAAhB,MAAM,CACnB;CAAA,CAAA;AAKD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,EAAC,UAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAmB,EAAE,QAA8B,EAAE,gBAA8B,EAAC,EARxK;IAAyC,UAAU,AAAnD,CACA,EADQ,kBAAkB,GAAG,IAAI,CACjC;IAAmF,aAAa,AAAhG,CACA,EADQ,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAC3E;IAA0D,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY,CACnD;IAAyC,YAAY,AAArD,CACA,EADQ,kBAAkB,GAAG,IAAI,CACjC;IAAsB,QAAQ,AAA9B,CACA,EADQ,MAAM,CACd;IAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;CAEwK,GAF9J,OAAO,CAAC,kBAAkB,CAAC,CAavC;AAED;;;;;;;GAOG;AACH,wBAAsB,uCAAuC,CAAC,EAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAC,EALxF;IAAwD,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO,CACjD;IAAuE,MAAM,EAArE,OAAO,yBAAyB,EAAE,sBAAsB,CAChE;IAA4C,MAAM,EAA1C,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACrC;CAEwF,GAF9E,OAAO,CAAC,OAAO,yBAAyB,EAAE,sBAAsB,CAAC,CAQ7E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAHnC,MAAM,CAAC,MAAM,EAAE,aAAa,CAGO,GAFjC,OAAO,yBAAyB,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"conflict-strategy.d.ts","sourceRoot":"","sources":["../../../src/sync/conflict-strategy.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH;;;;;;GAMG;AAbA,YAAkF,aAAa,GAArF,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAe;AAG/F,YAAkB,kBAAkB,GACpC;;;;IAA0C,UAAU,EAAzC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAA8C,OAAO,AAArD,CACF,EADa,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAC7C;CAAA,CAAA;AAEE,YAAkB,kBAAkB,GACpC;;;;IAA2C,UAAU,AAArD,CACA,EADW,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAA2C,QAAQ,AAAnD,CACA,EADW,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACxC;;;;IAAgD,MAAM,EAA3C,SAAS,GAAG,UAAU,GAAG,UAAU,CAC9C;;;;IAAmB,QAAQ,EAAhB,MAAM,CACnB;CAAA,CAAA;AAKD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,EAAC,UAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAmB,EAAE,QAA8B,EAAE,gBAA8B,EAAC,EARxK;IAAyC,UAAU,AAAnD,CACA,EADQ,kBAAkB,GAAG,IAAI,CACjC;IAAmF,aAAa,AAAhG,CACA,EADQ,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAC3E;IAA0D,QAAQ,EAA1D,OAAO,sBAAsB,EAAE,YAAY,CACnD;IAAyC,YAAY,AAArD,CACA,EADQ,kBAAkB,GAAG,IAAI,CACjC;IAAsB,QAAQ,AAA9B,CACA,EADQ,MAAM,CACd;IAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;CAEwK,GAF9J,OAAO,CAAC,kBAAkB,CAAC,CAavC;AAED;;;;;;;GAOG;AACH,wBAAsB,uCAAuC,CAAC,EAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAC,EALxF;IAAwD,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO,CACjD;IAAuE,MAAM,EAArE,OAAO,yBAAyB,EAAE,sBAAsB,CAChE;IAA4C,MAAM,EAA1C,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CACrC;CAEwF,GAF9E,OAAO,CAAC,OAAO,yBAAyB,EAAE,sBAAsB,CAAC,CAQ7E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAHnC,MAAM,CAAC,MAAM,EAAE,aAAa,CAGO,GAFjC,OAAO,yBAAyB,EAAE,mBAAmB,CAYjE"}
|
|
@@ -61,6 +61,12 @@ export async function applySyncReplayResultToLocalMutationLog({ mutationLog, rec
|
|
|
61
61
|
* @returns {import("./local-mutation-log.js").LocalMutationStatus} - Local mutation-log status.
|
|
62
62
|
*/
|
|
63
63
|
export function replayResultLocalStatus(result) {
|
|
64
|
+
if (result.syncState === "conflict")
|
|
65
|
+
return "conflict";
|
|
66
|
+
if (result.syncState === "failed" || result.syncState === "rejected")
|
|
67
|
+
return "rejected";
|
|
68
|
+
if (result.syncState === "successful" || result.syncState === "duplicate")
|
|
69
|
+
return "synced";
|
|
64
70
|
if (result.status === "conflict")
|
|
65
71
|
return "conflict";
|
|
66
72
|
if (result.status === "error" || result.status === "rejected")
|
|
@@ -212,4 +218,4 @@ function stableJsonStringify(value) {
|
|
|
212
218
|
}
|
|
213
219
|
return JSON.stringify(value);
|
|
214
220
|
}
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3Qtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9jb25mbGljdC1zdHJhdGVneS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNIOzs7O0dBSUc7QUFDSDs7Ozs7O0dBTUc7QUFDSCxZQUFZO0FBRVosTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV6SDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEVBQUM7SUFDekssSUFBSSxhQUFhO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEosSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRXZHLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUQsSUFBSSxRQUFRLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0I7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDcEksSUFBSSxRQUFRLEtBQUssZUFBZTtRQUFFLE9BQU8sbUJB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QTtBQUNqRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEcsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0SyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEB0eXBlZGVmIHtudWxsIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVua25vd25bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jSnNvblZhbHVlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY0NvbmZsaWN0UmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhdHRyaWJ1dGVzIC0gUmVjb3JkIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsfSBbdmVyc2lvbl0gLSBSZWNvcmQgdmVyc2lvbiB2YWx1ZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ29uZmxpY3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IFthdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gYXBwbHkgd2hlbiByZXBsYXkgbWF5IGNvbnRpbnVlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gW2NvbmZsaWN0XSAtIFN0cnVjdHVyZWQgY29uZmxpY3QgcGF5bG9hZCBmb3IgdGhlIGNsaWVudC9sb2NhbCBsb2cuXG4gKiBAcHJvcGVydHkge1wiYXBwbGllZFwiIHwgXCJjb25mbGljdFwiIHwgXCJyZWplY3RlZFwifSBzdGF0dXMgLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJhdGVneSAtIFN0cmF0ZWd5IHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uLlxuICovXG4vLyBAdHMtY2hlY2tcblxuY29uc3QgQ09ORkxJQ1RfU1RSQVRFR0lFUyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXSlcblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSByZXBsYXkgbXV0YXRpb24gYWdhaW5zdCBzZXJ2ZXIvYmFzZSBzdGF0ZSB1c2luZyBhIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gW2FyZ3MuYmFzZVJlY29yZF0gLSBSZWNvcmQgc3RhdGUgb2JzZXJ2ZWQgd2hlbiB0aGUgbXV0YXRpb24gd2FzIG1hZGUuXG4gKiBAcGFyYW0geyhhcmc6IG9iamVjdCkgPT4gKFN5bmNDb25mbGljdFJlc3VsdCB8IFByb21pc2U8U3luY0NvbmZsaWN0UmVzdWx0Pil9IFthcmdzLmN1c3RvbUhhbmRsZXJdIC0gUmVzb3VyY2Utc3BlY2lmaWMgY29uZmxpY3QgaG9vay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gUmVwbGF5ZWQgbXV0YXRpb24uXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IFthcmdzLnNlcnZlclJlY29yZF0gLSBDdXJyZW50IGF1dGhvcml0YXRpdmUgc2VydmVyIHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zdHJhdGVneV0gLSBDb25mbGljdCBzdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy52ZXJzaW9uQXR0cmlidXRlXSAtIEF0dHJpYnV0ZSB1c2VkIGZvciBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzLlxuICogQHJldHVybnMge1Byb21pc2U8U3luY0NvbmZsaWN0UmVzdWx0Pn0gLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTeW5jQ29uZmxpY3Qoe2Jhc2VSZWNvcmQgPSBudWxsLCBjdXN0b21IYW5kbGVyLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkID0gbnVsbCwgc3RyYXRlZ3kgPSBcIm9wdGltaXN0aWNWZXJzaW9uXCIsIHZlcnNpb25BdHRyaWJ1dGUgPSBcInVwZGF0ZWRBdFwifSkge1xuICBpZiAoY3VzdG9tSGFuZGxlcikgcmV0dXJuIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KGF3YWl0IGN1c3RvbUhhbmRsZXIoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSksIHN0cmF0ZWd5KVxuICBpZiAoIUNPTkZMSUNUX1NUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kgJyR7c3RyYXRlZ3l9J2ApXG5cbiAgY29uc3QgbXV0YXRpb25BdHRyaWJ1dGVzID0gbXV0YXRpb25BdHRyaWJ1dGVzRm9yKG11dGF0aW9uKVxuXG4gIGlmIChzdHJhdGVneSA9PT0gXCJhcHBlbmRPbmx5XCIgfHwgc3RyYXRlZ3kgPT09IFwibGFzdFdyaXRlcldpbnNcIikgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxuICBpZiAoc3RyYXRlZ3kgPT09IFwiZmllbGRUaHJlZVdheVwiKSByZXR1cm4gZmllbGRUaHJlZVdheVJlc3VsdCh7YmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KVxuICBpZiAoaGFzVmVyc2lvbkNvbmZsaWN0KHttdXRhdGlvbiwgc2VydmVyUmVjb3JkLCB2ZXJzaW9uQXR0cmlidXRlfSkpIHJldHVybiBjb25mbGljdFJlc3VsdCh7YmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KVxuXG4gIHJldHVybiB7YXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2VydmVyIHJlcGxheSByZXN1bHQgdG8gYSBsb2NhbCBtdXRhdGlvbi1sb2cgcmVjb3JkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLmRlZmF1bHR9IGFyZ3MubXV0YXRpb25Mb2cgLSBMb2NhbCBtdXRhdGlvbiBsb2cuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IGFyZ3MucmVjb3JkIC0gTG9jYWwgbXV0YXRpb24tbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IGFyZ3MucmVzdWx0IC0gU2VydmVyIHJlcGxheSByZXN1bHQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIFVwZGF0ZWQgbG9jYWwgcmVjb3JkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTeW5jUmVwbGF5UmVzdWx0VG9Mb2NhbE11dGF0aW9uTG9nKHttdXRhdGlvbkxvZywgcmVjb3JkLCByZXN1bHR9KSB7XG4gIHJldHVybiBhd2FpdCBtdXRhdGlvbkxvZy51cGRhdGVTdGF0dXMoe1xuICAgIGlkOiByZWNvcmQuaWQsXG4gICAgc3RhdHVzOiByZXBsYXlSZXN1bHRMb2NhbFN0YXR1cyhyZXN1bHQpLFxuICAgIHN5bmNSZXN1bHQ6IHJlc3VsdFxuICB9KVxufVxuXG4vKipcbiAqIE1hcHMgYSBzZXJ2ZXIgcmVwbGF5IHJlc3VsdCB0byBhIGxvY2FsIG11dGF0aW9uLWxvZyBzdGF0dXMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSByZXN1bHQgLSBSZXBsYXkgcmVzdWx0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXN9IC0gTG9jYWwgbXV0YXRpb24tbG9nIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVJlc3VsdExvY2FsU3RhdHVzKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJjb25mbGljdFwiKSByZXR1cm4gXCJjb25mbGljdFwiXG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSByZXR1cm4gXCJyZWplY3RlZFwiXG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIiAmJiByZXBsYXlSZXN1bHRIYXNGYWlsZWRBcHBsaWNhdGlvbihyZXN1bHQpKSByZXR1cm4gXCJyZWplY3RlZFwiXG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInN1Y2Nlc3NcIiB8fCByZXN1bHQuc3RhdHVzID09PSBcImFwcGxpZWRcIiB8fCByZXN1bHQuc3RhdHVzID09PSBcImR1cGxpY2F0ZVwiKSByZXR1cm4gXCJzeW5jZWRcIlxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzeW5jIHJlcGxheSByZXN1bHQgc3RhdHVzICcke1N0cmluZyhyZXN1bHQuc3RhdHVzKX0nYClcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvdGhlcndpc2Ugc3VjY2Vzc2Z1bCByZXBsYXkgcmVzdWx0IGNvbnRhaW5zIGEgZmFpbGVkXG4gKiBmcm9udGVuZC1tb2RlbCBjb21tYW5kIG9yIGNoYW5nZS1mZWVkIHdyaXRlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gcmVzdWx0IC0gUmVwbGF5IHJlc3VsdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGxvY2FsIG11dGF0aW9uIG11c3Qgc3RheSB1bnN5bmNlZC5cbiAqL1xuZnVuY3Rpb24gcmVwbGF5UmVzdWx0SGFzRmFpbGVkQXBwbGljYXRpb24ocmVzdWx0KSB7XG4gIGlmIChyZXN1bHQuc2VydmVyU2VxdWVuY2UgPT09IG51bGwgfHwgcmVzdWx0LnNlcnZlckNoYW5nZUZlZWRTdGF0dXMgPT09IFwiZXJyb3JcIikgcmV0dXJuIHRydWVcbiAgaWYgKCFyZXN1bHQucmVzcG9uc2UgfHwgdHlwZW9mIHJlc3VsdC5yZXNwb25zZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlc3VsdC5yZXNwb25zZSkpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqLyAocmVzdWx0LnJlc3BvbnNlKS5zdGF0dXMgPT09IFwiZXJyb3JcIlxufVxuXG4vKipcbiAqIFJ1bnMgYSBmaWVsZC1sZXZlbCB0aHJlZS13YXkgbWVyZ2UuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5iYXNlUmVjb3JkIC0gQmFzZSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJhdGVneSAtIFN0cmF0ZWd5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmVyc2lvbkF0dHJpYnV0ZSAtIFZlcnNpb24gYXR0cmlidXRlLlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqL1xuZnVuY3Rpb24gZmllbGRUaHJlZVdheVJlc3VsdCh7YmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGlmICghYmFzZVJlY29yZCB8fCAhc2VydmVyUmVjb3JkKSByZXR1cm4ge2F0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbiksIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxuXG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgYWZmZWN0ZWRGaWVsZHMgPSBbXVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqL1xuICBjb25zdCBtZXJnZWRBdHRyaWJ1dGVzID0ge31cblxuICBmb3IgKGNvbnN0IFtmaWVsZCwgbG9jYWxWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobXV0YXRpb25BdHRyaWJ1dGVzKSkge1xuICAgIGNvbnN0IGJhc2VWYWx1ZSA9IGJhc2VSZWNvcmQuYXR0cmlidXRlc1tmaWVsZF1cbiAgICBjb25zdCBzZXJ2ZXJWYWx1ZSA9IHNlcnZlclJlY29yZC5hdHRyaWJ1dGVzW2ZpZWxkXVxuXG4gICAgaWYgKGpzb25WYWx1ZXNFcXVhbChzZXJ2ZXJWYWx1ZSwgYmFzZVZhbHVlKSB8fCBqc29uVmFsdWVzRXF1YWwoc2VydmVyVmFsdWUsIGxvY2FsVmFsdWUpKSB7XG4gICAgICBtZXJnZWRBdHRyaWJ1dGVzW2ZpZWxkXSA9IGxvY2FsVmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgYWZmZWN0ZWRGaWVsZHMucHVzaChmaWVsZClcbiAgICB9XG4gIH1cblxuICBpZiAoYWZmZWN0ZWRGaWVsZHMubGVuZ3RoID4gMCkgcmV0dXJuIGNvbmZsaWN0UmVzdWx0KHthZmZlY3RlZEZpZWxkcywgYmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KVxuXG4gIHJldHVybiB7YXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlcywgc3RhdHVzOiBcImFwcGxpZWRcIiwgc3RyYXRlZ3l9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgY3VycmVudCBzZXJ2ZXIgc3RhdGUgY29uZmxpY3RzIHdpdGggYSBtdXRhdGlvbiBiYXNlIHZlcnNpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24uXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3Muc2VydmVyUmVjb3JkIC0gU2VydmVyIHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb25BdHRyaWJ1dGUgLSBWZXJzaW9uIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmVyc2lvbnMgY29uZmxpY3QuXG4gKi9cbmZ1bmN0aW9uIGhhc1ZlcnNpb25Db25mbGljdCh7bXV0YXRpb24sIHNlcnZlclJlY29yZCwgdmVyc2lvbkF0dHJpYnV0ZX0pIHtcbiAgaWYgKCFzZXJ2ZXJSZWNvcmQpIHJldHVybiBmYWxzZVxuICBpZiAobXV0YXRpb24uYmFzZVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBtdXRhdGlvbi5iYXNlVmVyc2lvbiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgc2VydmVyVmVyc2lvbiA9IHNlcnZlclJlY29yZC52ZXJzaW9uID8/IHNlcnZlclJlY29yZC5hdHRyaWJ1dGVzW3ZlcnNpb25BdHRyaWJ1dGVdID8/IG51bGxcblxuICByZXR1cm4gIWpzb25WYWx1ZXNFcXVhbChzZXJ2ZXJWZXJzaW9uLCBtdXRhdGlvbi5iYXNlVmVyc2lvbilcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzdHJ1Y3R1cmVkIGNvbmZsaWN0IHJlc3VsdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MuYWZmZWN0ZWRGaWVsZHNdIC0gRXhwbGljaXQgYWZmZWN0ZWQgZmllbGRzLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLmJhc2VSZWNvcmQgLSBCYXNlIHJlY29yZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gTXV0YXRpb24uXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3Muc2VydmVyUmVjb3JkIC0gU2VydmVyIHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0cmF0ZWd5IC0gU3RyYXRlZ3kuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uQXR0cmlidXRlIC0gVmVyc2lvbiBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyB7U3luY0NvbmZsaWN0UmVzdWx0fSAtIENvbmZsaWN0IHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY29uZmxpY3RSZXN1bHQoe2FmZmVjdGVkRmllbGRzLCBiYXNlUmVjb3JkLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkLCBzdHJhdGVneSwgdmVyc2lvbkF0dHJpYnV0ZX0pIHtcbiAgY29uc3QgbXV0YXRpb25BdHRyaWJ1dGVzID0gbXV0YXRpb25BdHRyaWJ1dGVzRm9yKG11dGF0aW9uKVxuXG4gIHJldHVybiB7XG4gICAgY29uZmxpY3Q6IHtcbiAgICAgIGFmZmVjdGVkRmllbGRzOiBhZmZlY3RlZEZpZWxkcyB8fCBPYmplY3Qua2V5cyhtdXRhdGlvbkF0dHJpYnV0ZXMpLFxuICAgICAgYmFzZVJlY29yZDogYmFzZVJlY29yZCA/IGJhc2VSZWNvcmQuYXR0cmlidXRlcyA6IG51bGwsXG4gICAgICBiYXNlVmVyc2lvbjogLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAobXV0YXRpb24uYmFzZVZlcnNpb24gPz8gbnVsbCksXG4gICAgICBsb2NhbE11dGF0aW9uOiB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlcyxcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZDogbXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgbW9kZWw6IG11dGF0aW9uLm1vZGVsLFxuICAgICAgICBvcGVyYXRpb246IG11dGF0aW9uLm9wZXJhdGlvbixcbiAgICAgICAgcGF5bG9hZDogLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAobXV0YXRpb24ucGF5bG9hZCB8fCBudWxsKVxuICAgICAgfSxcbiAgICAgIHNlcnZlck1vZGVsOiBzZXJ2ZXJSZWNvcmQgPyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlcyA6IG51bGwsXG4gICAgICBzZXJ2ZXJWZXJzaW9uOiBzZXJ2ZXJSZWNvcmQgPyAvKiogQHR5cGUge1N5bmNKc29uVmFsdWV9ICovIChzZXJ2ZXJSZWNvcmQudmVyc2lvbiA/PyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXSA/PyBudWxsKSA6IG51bGwsXG4gICAgICBzdWdnZXN0ZWRSZXNvbHV0aW9uOiBzdHJhdGVneSA9PT0gXCJzZXJ2ZXJXaW5zXCIgPyBcImtlZXBfc2VydmVyXCIgOiBcIm1hbnVhbFwiLFxuICAgICAgdmVyc2lvbkF0dHJpYnV0ZVxuICAgIH0sXG4gICAgc3RhdHVzOiBcImNvbmZsaWN0XCIsXG4gICAgc3RyYXRlZ3lcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBjdXN0b20gcmVzb3VyY2UgY29uZmxpY3QgcmVzdWx0LlxuICogQHBhcmFtIHt1bmtub3dufSByZXN1bHQgLSBSYXcgcmVzdWx0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmF0ZWd5IC0gUmVxdWVzdGVkIHN0cmF0ZWd5LlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBOb3JtYWxpemVkIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQ29uZmxpY3RSZXN1bHQocmVzdWx0LCBzdHJhdGVneSkge1xuICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVzdWx0KSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjb25mbGljdCBoYW5kbGVyIG11c3QgcmV0dXJuIGFuIG9iamVjdFwiKVxuICBjb25zdCByZXN1bHRSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAocmVzdWx0KVxuICBpZiAoIVtcImFwcGxpZWRcIiwgXCJjb25mbGljdFwiLCBcInJlamVjdGVkXCJdLmluY2x1ZGVzKFN0cmluZyhyZXN1bHRSZWNvcmQuc3RhdHVzKSkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY29uZmxpY3QgaGFuZGxlciByZXR1cm5lZCBhbiB1bmtub3duIHN0YXR1c1wiKVxuXG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDb25mbGljdFJlc3VsdH0gKi8gKHtzdHJhdGVneSwgLi4ucmVzdWx0UmVjb3JkfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG11dGF0aW9uIGF0dHJpYnV0ZXMgYXMgYSBKU09OIG9iamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBtdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAtIEF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbikge1xuICBpZiAoIW11dGF0aW9uLmF0dHJpYnV0ZXMgfHwgdHlwZW9mIG11dGF0aW9uLmF0dHJpYnV0ZXMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtdXRhdGlvbi5hdHRyaWJ1dGVzKSkgcmV0dXJuIHt9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59ICovIChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG11dGF0aW9uLmF0dHJpYnV0ZXMpKSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBKU09OIHZhbHVlcyBieSBzdGFibGUgc2VyaWFsaXphdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIExlZnQgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHJpZ2h0IC0gUmlnaHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24ganNvblZhbHVlc0VxdWFsKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KGxlZnQpID09PSBzdGFibGVKc29uU3RyaW5naWZ5KHJpZ2h0KVxufVxuXG4vKipcbiAqIFN0YWJsZSBKU09OIHN0cmluZ2lmeSBoZWxwZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBKU09OLlxuICovXG5mdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGBbJHt2YWx1ZS5tYXAoKGVudHJ5KSA9PiBzdGFibGVKc29uU3RyaW5naWZ5KGVudHJ5KSkuam9pbihcIixcIil9XWBcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBgeyR7T2JqZWN0LmtleXModmFsdWUpLnNvcnQoKS5tYXAoKGtleSkgPT4gYCR7SlNPTi5zdHJpbmdpZnkoa2V5KX06JHtzdGFibGVKc29uU3RyaW5naWZ5KC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlba2V5XSl9YCkuam9pbihcIixcIil9fWBcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbn1cbiJdfQ==
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3Qtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9jb25mbGljdC1zdHJhdGVneS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNIOzs7O0dBSUc7QUFDSDs7Ozs7O0dBTUc7QUFDSCxZQUFZO0FBRVosTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtBQUV6SDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxFQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEVBQUM7SUFDekssSUFBSSxhQUFhO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDbEosSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRXZHLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUQsSUFBSSxRQUFRLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxnQkFBZ0I7UUFBRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLENBQUE7SUFDcEksSUFBSSxRQUFRLEtBQUssZUFBZTtRQUFFLE9BQU8sbUJB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QTtJQUVwSCxPQUFPLDRDQUE0QyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDdkcsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDbEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNqRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUE7SUFDbEcsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksbUJBQW1CLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQTtJQUN0SyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEB0eXBlZGVmIHtudWxsIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVua25vd25bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jSnNvblZhbHVlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY0NvbmZsaWN0UmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSBhdHRyaWJ1dGVzIC0gUmVjb3JkIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsfSBbdmVyc2lvbl0gLSBSZWNvcmQgdmVyc2lvbiB2YWx1ZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ29uZmxpY3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IFthdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gYXBwbHkgd2hlbiByZXBsYXkgbWF5IGNvbnRpbnVlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gW2NvbmZsaWN0XSAtIFN0cnVjdHVyZWQgY29uZmxpY3QgcGF5bG9hZCBmb3IgdGhlIGNsaWVudC9sb2NhbCBsb2cuXG4gKiBAcHJvcGVydHkge1wiYXBwbGllZFwiIHwgXCJjb25mbGljdFwiIHwgXCJyZWplY3RlZFwifSBzdGF0dXMgLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdHJhdGVneSAtIFN0cmF0ZWd5IHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uLlxuICovXG4vLyBAdHMtY2hlY2tcblxuY29uc3QgQ09ORkxJQ1RfU1RSQVRFR0lFUyA9IG5ldyBTZXQoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXSlcblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSByZXBsYXkgbXV0YXRpb24gYWdhaW5zdCBzZXJ2ZXIvYmFzZSBzdGF0ZSB1c2luZyBhIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gW2FyZ3MuYmFzZVJlY29yZF0gLSBSZWNvcmQgc3RhdGUgb2JzZXJ2ZWQgd2hlbiB0aGUgbXV0YXRpb24gd2FzIG1hZGUuXG4gKiBAcGFyYW0geyhhcmc6IG9iamVjdCkgPT4gKFN5bmNDb25mbGljdFJlc3VsdCB8IFByb21pc2U8U3luY0NvbmZsaWN0UmVzdWx0Pil9IFthcmdzLmN1c3RvbUhhbmRsZXJdIC0gUmVzb3VyY2Utc3BlY2lmaWMgY29uZmxpY3QgaG9vay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9ufSBhcmdzLm11dGF0aW9uIC0gUmVwbGF5ZWQgbXV0YXRpb24uXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IFthcmdzLnNlcnZlclJlY29yZF0gLSBDdXJyZW50IGF1dGhvcml0YXRpdmUgc2VydmVyIHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zdHJhdGVneV0gLSBDb25mbGljdCBzdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy52ZXJzaW9uQXR0cmlidXRlXSAtIEF0dHJpYnV0ZSB1c2VkIGZvciBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzLlxuICogQHJldHVybnMge1Byb21pc2U8U3luY0NvbmZsaWN0UmVzdWx0Pn0gLSBDb25mbGljdCBkZWNpc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTeW5jQ29uZmxpY3Qoe2Jhc2VSZWNvcmQgPSBudWxsLCBjdXN0b21IYW5kbGVyLCBtdXRhdGlvbiwgc2VydmVyUmVjb3JkID0gbnVsbCwgc3RyYXRlZ3kgPSBcIm9wdGltaXN0aWNWZXJzaW9uXCIsIHZlcnNpb25BdHRyaWJ1dGUgPSBcInVwZGF0ZWRBdFwifSkge1xuICBpZiAoY3VzdG9tSGFuZGxlcikgcmV0dXJuIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KGF3YWl0IGN1c3RvbUhhbmRsZXIoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSksIHN0cmF0ZWd5KVxuICBpZiAoIUNPTkZMSUNUX1NUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN5bmMgY29uZmxpY3Qgc3RyYXRlZ3kgJyR7c3RyYXRlZ3l9J2ApXG5cbiAgY29uc3QgbXV0YXRpb25BdHRyaWJ1dGVzID0gbXV0YXRpb25BdHRyaWJ1dGVzRm9yKG11dGF0aW9uKVxuXG4gIGlmIChzdHJhdGVneSA9PT0gXCJhcHBlbmRPbmx5XCIgfHwgc3RyYXRlZ3kgPT09IFwibGFzdFdyaXRlcldpbnNcIikgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxuICBpZiAoc3RyYXRlZ3kgPT09IFwiZmllbGRUaHJlZVdheVwiKSByZXR1cm4gZmllbGRUaHJlZVdheVJlc3VsdCh7YmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KVxuICBpZiAoaGFzVmVyc2lvbkNvbmZsaWN0KHttdXRhdGlvbiwgc2VydmVyUmVjb3JkLCB2ZXJzaW9uQXR0cmlidXRlfSkpIHJldHVybiBjb25mbGljdFJlc3VsdCh7YmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KVxuXG4gIHJldHVybiB7YXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2VydmVyIHJlcGxheSByZXN1bHQgdG8gYSBsb2NhbCBtdXRhdGlvbi1sb2cgcmVjb3JkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLmRlZmF1bHR9IGFyZ3MubXV0YXRpb25Mb2cgLSBMb2NhbCBtdXRhdGlvbiBsb2cuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IGFyZ3MucmVjb3JkIC0gTG9jYWwgbXV0YXRpb24tbG9nIHJlY29yZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IGFyZ3MucmVzdWx0IC0gU2VydmVyIHJlcGxheSByZXN1bHQgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSAtIFVwZGF0ZWQgbG9jYWwgcmVjb3JkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTeW5jUmVwbGF5UmVzdWx0VG9Mb2NhbE11dGF0aW9uTG9nKHttdXRhdGlvbkxvZywgcmVjb3JkLCByZXN1bHR9KSB7XG4gIHJldHVybiBhd2FpdCBtdXRhdGlvbkxvZy51cGRhdGVTdGF0dXMoe1xuICAgIGlkOiByZWNvcmQuaWQsXG4gICAgc3RhdHVzOiByZXBsYXlSZXN1bHRMb2NhbFN0YXR1cyhyZXN1bHQpLFxuICAgIHN5bmNSZXN1bHQ6IHJlc3VsdFxuICB9KVxufVxuXG4vKipcbiAqIE1hcHMgYSBzZXJ2ZXIgcmVwbGF5IHJlc3VsdCB0byBhIGxvY2FsIG11dGF0aW9uLWxvZyBzdGF0dXMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSByZXN1bHQgLSBSZXBsYXkgcmVzdWx0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXN9IC0gTG9jYWwgbXV0YXRpb24tbG9nIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVJlc3VsdExvY2FsU3RhdHVzKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnN5bmNTdGF0ZSA9PT0gXCJjb25mbGljdFwiKSByZXR1cm4gXCJjb25mbGljdFwiXG4gIGlmIChyZXN1bHQuc3luY1N0YXRlID09PSBcImZhaWxlZFwiIHx8IHJlc3VsdC5zeW5jU3RhdGUgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN5bmNTdGF0ZSA9PT0gXCJzdWNjZXNzZnVsXCIgfHwgcmVzdWx0LnN5bmNTdGF0ZSA9PT0gXCJkdXBsaWNhdGVcIikgcmV0dXJuIFwic3luY2VkXCJcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiY29uZmxpY3RcIikgcmV0dXJuIFwiY29uZmxpY3RcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiIHx8IHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgcmVwbGF5UmVzdWx0SGFzRmFpbGVkQXBwbGljYXRpb24ocmVzdWx0KSkgcmV0dXJuIFwicmVqZWN0ZWRcIlxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJhcHBsaWVkXCIgfHwgcmVzdWx0LnN0YXR1cyA9PT0gXCJkdXBsaWNhdGVcIikgcmV0dXJuIFwic3luY2VkXCJcblxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3luYyByZXBsYXkgcmVzdWx0IHN0YXR1cyAnJHtTdHJpbmcocmVzdWx0LnN0YXR1cyl9J2ApXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb3RoZXJ3aXNlIHN1Y2Nlc3NmdWwgcmVwbGF5IHJlc3VsdCBjb250YWlucyBhIGZhaWxlZFxuICogZnJvbnRlbmQtbW9kZWwgY29tbWFuZCBvciBjaGFuZ2UtZmVlZCB3cml0ZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY0pzb25WYWx1ZT59IHJlc3VsdCAtIFJlcGxheSByZXN1bHQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBsb2NhbCBtdXRhdGlvbiBtdXN0IHN0YXkgdW5zeW5jZWQuXG4gKi9cbmZ1bmN0aW9uIHJlcGxheVJlc3VsdEhhc0ZhaWxlZEFwcGxpY2F0aW9uKHJlc3VsdCkge1xuICBpZiAocmVzdWx0LnNlcnZlclNlcXVlbmNlID09PSBudWxsIHx8IHJlc3VsdC5zZXJ2ZXJDaGFuZ2VGZWVkU3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiB0cnVlXG4gIGlmICghcmVzdWx0LnJlc3BvbnNlIHx8IHR5cGVvZiByZXN1bHQucmVzcG9uc2UgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZXN1bHQucmVzcG9uc2UpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi8gKHJlc3VsdC5yZXNwb25zZSkuc3RhdHVzID09PSBcImVycm9yXCJcbn1cblxuLyoqXG4gKiBSdW5zIGEgZmllbGQtbGV2ZWwgdGhyZWUtd2F5IG1lcmdlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1N5bmNDb25mbGljdFJlY29yZCB8IG51bGx9IGFyZ3MuYmFzZVJlY29yZCAtIEJhc2UgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jTXV0YXRpb259IGFyZ3MubXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5zZXJ2ZXJSZWNvcmQgLSBTZXJ2ZXIgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZlcnNpb25BdHRyaWJ1dGUgLSBWZXJzaW9uIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gQ29uZmxpY3QgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGZpZWxkVGhyZWVXYXlSZXN1bHQoe2Jhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSkge1xuICBpZiAoIWJhc2VSZWNvcmQgfHwgIXNlcnZlclJlY29yZCkgcmV0dXJuIHthdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pLCBzdGF0dXM6IFwiYXBwbGllZFwiLCBzdHJhdGVneX1cblxuICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGFmZmVjdGVkRmllbGRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gKi9cbiAgY29uc3QgbWVyZ2VkQXR0cmlidXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBbZmllbGQsIGxvY2FsVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG11dGF0aW9uQXR0cmlidXRlcykpIHtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSBiYXNlUmVjb3JkLmF0dHJpYnV0ZXNbZmllbGRdXG4gICAgY29uc3Qgc2VydmVyVmFsdWUgPSBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1tmaWVsZF1cblxuICAgIGlmIChqc29uVmFsdWVzRXF1YWwoc2VydmVyVmFsdWUsIGJhc2VWYWx1ZSkgfHwganNvblZhbHVlc0VxdWFsKHNlcnZlclZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgbWVyZ2VkQXR0cmlidXRlc1tmaWVsZF0gPSBsb2NhbFZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmZmVjdGVkRmllbGRzLnB1c2goZmllbGQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFmZmVjdGVkRmllbGRzLmxlbmd0aCA+IDApIHJldHVybiBjb25mbGljdFJlc3VsdCh7YWZmZWN0ZWRGaWVsZHMsIGJhc2VSZWNvcmQsIG11dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHN0cmF0ZWd5LCB2ZXJzaW9uQXR0cmlidXRlfSlcblxuICByZXR1cm4ge2F0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZXMsIHN0YXR1czogXCJhcHBsaWVkXCIsIHN0cmF0ZWd5fVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGN1cnJlbnQgc2VydmVyIHN0YXRlIGNvbmZsaWN0cyB3aXRoIGEgbXV0YXRpb24gYmFzZSB2ZXJzaW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52ZXJzaW9uQXR0cmlidXRlIC0gVmVyc2lvbiBhdHRyaWJ1dGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZlcnNpb25zIGNvbmZsaWN0LlxuICovXG5mdW5jdGlvbiBoYXNWZXJzaW9uQ29uZmxpY3Qoe211dGF0aW9uLCBzZXJ2ZXJSZWNvcmQsIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGlmICghc2VydmVyUmVjb3JkKSByZXR1cm4gZmFsc2VcbiAgaWYgKG11dGF0aW9uLmJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbXV0YXRpb24uYmFzZVZlcnNpb24gPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHNlcnZlclZlcnNpb24gPSBzZXJ2ZXJSZWNvcmQudmVyc2lvbiA/PyBzZXJ2ZXJSZWNvcmQuYXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXSA/PyBudWxsXG5cbiAgcmV0dXJuICFqc29uVmFsdWVzRXF1YWwoc2VydmVyVmVyc2lvbiwgbXV0YXRpb24uYmFzZVZlcnNpb24pXG59XG5cbi8qKlxuICogQnVpbGRzIGEgc3RydWN0dXJlZCBjb25mbGljdCByZXN1bHQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmFmZmVjdGVkRmllbGRzXSAtIEV4cGxpY2l0IGFmZmVjdGVkIGZpZWxkcy5cbiAqIEBwYXJhbSB7U3luY0NvbmZsaWN0UmVjb3JkIHwgbnVsbH0gYXJncy5iYXNlUmVjb3JkIC0gQmFzZSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gYXJncy5tdXRhdGlvbiAtIE11dGF0aW9uLlxuICogQHBhcmFtIHtTeW5jQ29uZmxpY3RSZWNvcmQgfCBudWxsfSBhcmdzLnNlcnZlclJlY29yZCAtIFNlcnZlciByZWNvcmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJhdGVneSAtIFN0cmF0ZWd5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmVyc2lvbkF0dHJpYnV0ZSAtIFZlcnNpb24gYXR0cmlidXRlLlxuICogQHJldHVybnMge1N5bmNDb25mbGljdFJlc3VsdH0gLSBDb25mbGljdCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNvbmZsaWN0UmVzdWx0KHthZmZlY3RlZEZpZWxkcywgYmFzZVJlY29yZCwgbXV0YXRpb24sIHNlcnZlclJlY29yZCwgc3RyYXRlZ3ksIHZlcnNpb25BdHRyaWJ1dGV9KSB7XG4gIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IG11dGF0aW9uQXR0cmlidXRlc0ZvcihtdXRhdGlvbilcblxuICByZXR1cm4ge1xuICAgIGNvbmZsaWN0OiB7XG4gICAgICBhZmZlY3RlZEZpZWxkczogYWZmZWN0ZWRGaWVsZHMgfHwgT2JqZWN0LmtleXMobXV0YXRpb25BdHRyaWJ1dGVzKSxcbiAgICAgIGJhc2VSZWNvcmQ6IGJhc2VSZWNvcmQgPyBiYXNlUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgYmFzZVZlcnNpb246IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLmJhc2VWZXJzaW9uID8/IG51bGwpLFxuICAgICAgbG9jYWxNdXRhdGlvbjoge1xuICAgICAgICBhdHRyaWJ1dGVzOiBtdXRhdGlvbkF0dHJpYnV0ZXMsXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiBtdXRhdGlvbi5tb2RlbCxcbiAgICAgICAgb3BlcmF0aW9uOiBtdXRhdGlvbi5vcGVyYXRpb24sXG4gICAgICAgIHBheWxvYWQ6IC8qKiBAdHlwZSB7U3luY0pzb25WYWx1ZX0gKi8gKG11dGF0aW9uLnBheWxvYWQgfHwgbnVsbClcbiAgICAgIH0sXG4gICAgICBzZXJ2ZXJNb2RlbDogc2VydmVyUmVjb3JkID8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXMgOiBudWxsLFxuICAgICAgc2VydmVyVmVyc2lvbjogc2VydmVyUmVjb3JkID8gLyoqIEB0eXBlIHtTeW5jSnNvblZhbHVlfSAqLyAoc2VydmVyUmVjb3JkLnZlcnNpb24gPz8gc2VydmVyUmVjb3JkLmF0dHJpYnV0ZXNbdmVyc2lvbkF0dHJpYnV0ZV0gPz8gbnVsbCkgOiBudWxsLFxuICAgICAgc3VnZ2VzdGVkUmVzb2x1dGlvbjogc3RyYXRlZ3kgPT09IFwic2VydmVyV2luc1wiID8gXCJrZWVwX3NlcnZlclwiIDogXCJtYW51YWxcIixcbiAgICAgIHZlcnNpb25BdHRyaWJ1dGVcbiAgICB9LFxuICAgIHN0YXR1czogXCJjb25mbGljdFwiLFxuICAgIHN0cmF0ZWd5XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY3VzdG9tIHJlc291cmNlIGNvbmZsaWN0IHJlc3VsdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVzdWx0IC0gUmF3IHJlc3VsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJhdGVneSAtIFJlcXVlc3RlZCBzdHJhdGVneS5cbiAqIEByZXR1cm5zIHtTeW5jQ29uZmxpY3RSZXN1bHR9IC0gTm9ybWFsaXplZCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZsaWN0UmVzdWx0KHJlc3VsdCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY29uZmxpY3QgaGFuZGxlciBtdXN0IHJldHVybiBhbiBvYmplY3RcIilcbiAgY29uc3QgcmVzdWx0UmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHJlc3VsdClcbiAgaWYgKCFbXCJhcHBsaWVkXCIsIFwiY29uZmxpY3RcIiwgXCJyZWplY3RlZFwiXS5pbmNsdWRlcyhTdHJpbmcocmVzdWx0UmVjb3JkLnN0YXR1cykpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNvbmZsaWN0IGhhbmRsZXIgcmV0dXJuZWQgYW4gdW5rbm93biBzdGF0dXNcIilcblxuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ29uZmxpY3RSZXN1bHR9ICovICh7c3RyYXRlZ3ksIC4uLnJlc3VsdFJlY29yZH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBtdXRhdGlvbiBhdHRyaWJ1dGVzIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbn0gbXV0YXRpb24gLSBNdXRhdGlvbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBTeW5jSnNvblZhbHVlPn0gLSBBdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBtdXRhdGlvbkF0dHJpYnV0ZXNGb3IobXV0YXRpb24pIHtcbiAgaWYgKCFtdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHR5cGVvZiBtdXRhdGlvbi5hdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobXV0YXRpb24uYXR0cmlidXRlcykpIHJldHVybiB7fVxuXG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFN5bmNKc29uVmFsdWU+fSAqLyAoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtdXRhdGlvbi5hdHRyaWJ1dGVzKSkpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgSlNPTiB2YWx1ZXMgYnkgc3RhYmxlIHNlcmlhbGl6YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBMZWZ0IHZhbHVlLlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFJpZ2h0IHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGpzb25WYWx1ZXNFcXVhbChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gc3RhYmxlSnNvblN0cmluZ2lmeShsZWZ0KSA9PT0gc3RhYmxlSnNvblN0cmluZ2lmeShyaWdodClcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZnkgaGVscGVyLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgSlNPTi5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBgWyR7dmFsdWUubWFwKChlbnRyeSkgPT4gc3RhYmxlSnNvblN0cmluZ2lmeShlbnRyeSkpLmpvaW4oXCIsXCIpfV1gXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gYHske09iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkubWFwKChrZXkpID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlSnNvblN0cmluZ2lmeSgvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV0pfWApLmpvaW4oXCIsXCIpfX1gXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG4iXX0=
|