@decaf-ts/fabric-weaver
Version:
template for ts projects
1,042 lines • 183 kB
JavaScript
import { Logging } from "@decaf-ts/logging";
import path from "path";
import fs from "fs";
import { readFileYaml, writeFileYaml } from "../../utils/yaml";
export class FabricPeerConfigBuilder {
constructor(logger) {
this.config = readFileYaml(path.join(__dirname, "../../../config/core.yaml"));
if (!logger)
this.log = Logging.for(FabricPeerConfigBuilder);
else
this.log = logger.for(FabricPeerConfigBuilder.name);
}
setGossip(gossip) {
if (gossip === undefined)
return this;
if (gossip.bootstrap !== undefined) {
this.log.debug(`Setting bootstrap: ${gossip.bootstrap}`);
this.config.peer.gossip.bootstrap = gossip.bootstrap;
}
if (gossip.useLeaderElection !== undefined) {
this.log.debug(`Setting use leader election: ${gossip.useLeaderElection}`);
this.config.peer.gossip.useLeaderElection = gossip.useLeaderElection;
}
if (gossip.orgLeader !== undefined) {
this.log.debug(`Setting org leaders: ${gossip.orgLeader}`);
this.config.peer.gossip.orgLeader = gossip.orgLeader;
}
if (gossip.membershipTrackerInterval !== undefined) {
this.log.debug(`Setting membership tracker interval: ${gossip.membershipTrackerInterval}`);
this.config.peer.gossip.membershipTrackerInterval =
gossip.membershipTrackerInterval;
}
if (gossip.maxBlockCountToStore !== undefined) {
this.log.debug(`Setting max block count to store: ${gossip.maxBlockCountToStore}`);
this.config.peer.gossip.maxBlockCountToStore =
gossip.maxBlockCountToStore;
}
if (gossip.maxPropagationBurstLatency !== undefined) {
this.log.debug(`Setting max propagation burst latency: ${gossip.maxPropagationBurstLatency}`);
this.config.peer.gossip.maxPropagationBurstLatency =
gossip.maxPropagationBurstLatency;
}
if (gossip.maxPropagationBurstSize !== undefined) {
this.log.debug(`Setting max propagation burst size: ${gossip.maxPropagationBurstSize}`);
this.config.peer.gossip.maxPropagationBurstSize =
gossip.maxPropagationBurstSize;
}
if (gossip.propagateIterations !== undefined) {
this.log.debug(`Setting propagate iterations: ${gossip.propagateIterations}`);
this.config.peer.gossip.propagateIterations =
gossip.propagateIterations;
}
if (gossip.propagatePeerNum !== undefined) {
this.log.debug(`Setting propagate peer number: ${gossip.propagatePeerNum}`);
this.config.peer.gossip.propagatePeerNum = gossip.propagatePeerNum;
}
if (gossip.pullInterval !== undefined) {
this.log.debug(`Setting pull interval: ${gossip.pullInterval}`);
this.config.peer.gossip.pullInterval = gossip.pullInterval;
}
if (gossip.pullPeerNum !== undefined) {
this.log.debug(`Setting pull peer number: ${gossip.pullPeerNum}`);
this.config.peer.gossip.pullPeerNum = gossip.pullPeerNum;
}
if (gossip.requestStateInfoInterval !== undefined) {
this.log.debug(`Setting request state info interval: ${gossip.requestStateInfoInterval}`);
this.config.peer.gossip.requestStateInfoInterval =
gossip.requestStateInfoInterval;
}
if (gossip.publishStateInfoInterval !== undefined) {
this.log.debug(`Setting publish state info interval: ${gossip.publishStateInfoInterval}`);
this.config.peer.gossip.publishStateInfoInterval =
gossip.publishStateInfoInterval;
}
if (gossip.stateInfoRetentionInterval !== undefined) {
this.log.debug(`Setting state info retention interval: ${gossip.stateInfoRetentionInterval}`);
this.config.peer.gossip.stateInfoRetentionInterval =
gossip.stateInfoRetentionInterval;
}
if (gossip.publishCertPeriod !== undefined) {
this.log.debug(`Setting publish cert period: ${gossip.publishCertPeriod}`);
this.config.peer.gossip.publishCertPeriod = gossip.publishCertPeriod;
}
if (gossip.skipBlockVerification !== undefined) {
this.log.debug(`Setting skip block verifications: ${gossip.skipBlockVerification}`);
this.config.peer.gossip.skipBlockVerification =
gossip.skipBlockVerification;
}
if (gossip.dialTimeout !== undefined) {
this.log.debug(`Setting dial timeout: ${gossip.dialTimeout}`);
this.config.peer.gossip.dialTimeout = gossip.dialTimeout;
}
if (gossip.connTimeout !== undefined) {
this.log.debug(`Setting connection timeout: ${gossip.connTimeout}`);
this.config.peer.gossip.connTimeout = gossip.connTimeout;
}
if (gossip.recvBuffSize !== undefined) {
this.log.debug(`Setting receive buffer size: ${gossip.recvBuffSize}`);
this.config.peer.gossip.recvBuffSize = gossip.recvBuffSize;
}
if (gossip.sendBuffSize !== undefined) {
this.log.debug(`Setting send buffer size: ${gossip.sendBuffSize}`);
this.config.peer.gossip.sendBuffSize = gossip.sendBuffSize;
}
if (gossip.digestWaitTime !== undefined) {
this.log.debug(`Setting digest wait time: ${gossip.digestWaitTime}`);
this.config.peer.gossip.digestWaitTime = gossip.digestWaitTime;
}
if (gossip.requestWaitTime !== undefined) {
this.log.debug(`Setting request wait time: ${gossip.requestWaitTime}`);
this.config.peer.gossip.requestWaitTime = gossip.requestWaitTime;
}
if (gossip.responseWaitTime !== undefined) {
this.log.debug(`Setting response wait time: ${gossip.responseWaitTime}`);
this.config.peer.gossip.responseWaitTime = gossip.responseWaitTime;
}
if (gossip.aliveTimeInterval !== undefined) {
this.log.debug(`Setting alive time interval: ${gossip.aliveTimeInterval}`);
this.config.peer.gossip.aliveTimeInterval = gossip.aliveTimeInterval;
}
if (gossip.aliveExpirationTimeout !== undefined) {
this.log.debug(`Setting alive expiration timeout: ${gossip.aliveExpirationTimeout}`);
this.config.peer.gossip.aliveExpirationTimeout =
gossip.aliveExpirationTimeout;
}
if (gossip.reconnectInterval !== undefined) {
this.log.debug(`Setting reconnect interval: ${gossip.reconnectInterval}`);
this.config.peer.gossip.reconnectInterval = gossip.reconnectInterval;
}
if (gossip.maxConnectionAttempts !== undefined) {
this.log.debug(`Setting maximum connection attempts: ${gossip.maxConnectionAttempts}`);
this.config.peer.gossip.maxConnectionAttempts =
gossip.maxConnectionAttempts;
}
if (gossip.msgExpirationFactor !== undefined) {
this.log.debug(`Setting message expiration factor: ${gossip.msgExpirationFactor}`);
this.config.peer.gossip.msgExpirationFactor =
gossip.msgExpirationFactor;
}
if (gossip.externalEndpoint !== undefined) {
this.log.debug(`Setting external endpoint: ${gossip.externalEndpoint}`);
this.config.peer.gossip.externalEndpoint = gossip.externalEndpoint;
}
if (gossip.election !== undefined) {
const election = gossip.election;
if (election.startupGracePeriod !== undefined) {
this.log.debug(`Setting startup grace period: ${election.startupGracePeriod}`);
this.config.peer.gossip.election.startupGracePeriod =
election.startupGracePeriod;
}
if (election.membershipSampleInterval !== undefined) {
this.log.debug(`Setting membership sample interval: ${election.membershipSampleInterval}`);
this.config.peer.gossip.election.membershipSampleInterval =
election.membershipSampleInterval;
}
if (election.leaderAliveThreshold !== undefined) {
this.log.debug(`Setting leader alive threshold: ${election.leaderAliveThreshold}`);
this.config.peer.gossip.election.leaderAliveThreshold =
election.leaderAliveThreshold;
}
if (election.leaderElectionDuration !== undefined) {
this.log.debug(`Setting leader election duration: ${election.leaderElectionDuration}`);
this.config.peer.gossip.election.leaderElectionDuration =
election.leaderElectionDuration;
}
}
if (gossip.pvtData !== undefined) {
const pvtData = gossip.pvtData;
if (pvtData.pullRetryThreshold !== undefined) {
this.log.debug(`Setting pull retry threshold: ${pvtData.pullRetryThreshold}`);
this.config.peer.gossip.pvtData.pullRetryThreshold =
pvtData.pullRetryThreshold;
}
if (pvtData.transientstoreMaxBlockRetention !== undefined) {
this.log.debug(`Setting transientstore max block retention: ${pvtData.transientstoreMaxBlockRetention}`);
this.config.peer.gossip.pvtData.transientstoreMaxBlockRetention =
pvtData.transientstoreMaxBlockRetention;
}
if (pvtData.pushAckTimeout !== undefined) {
this.log.debug(`Setting push ack timeout: ${pvtData.pushAckTimeout}`);
this.config.peer.gossip.pvtData.pushAckTimeout =
pvtData.pushAckTimeout;
}
if (pvtData.btlPullMargin !== undefined) {
this.log.debug(`Setting btl pull margin: ${pvtData.btlPullMargin}`);
this.config.peer.gossip.pvtData.btlPullMargin =
pvtData.btlPullMargin;
}
if (pvtData.reconcileBatchSize !== undefined) {
this.log.debug(`Setting reconcile batch size: ${pvtData.reconcileBatchSize}`);
this.config.peer.gossip.pvtData.reconcileBatchSize =
pvtData.reconcileBatchSize;
}
if (pvtData.reconcileSleepInterval !== undefined) {
this.log.debug(`Setting reconcile sleep interval: ${pvtData.reconcileSleepInterval}`);
this.config.peer.gossip.pvtData.reconcileSleepInterval =
pvtData.reconcileSleepInterval;
}
if (pvtData.reconciliationEnabled !== undefined) {
this.log.debug(`Setting reconciliation enabled: ${pvtData.reconciliationEnabled}`);
this.config.peer.gossip.pvtData.reconciliationEnabled =
pvtData.reconciliationEnabled;
}
if (pvtData.skipPullingInvalidTransactionsDuringCommit !== undefined) {
this.log.debug(`Setting skip pulling invalid transactions during commit: ${pvtData.skipPullingInvalidTransactionsDuringCommit}`);
this.config.peer.gossip.pvtData.skipPullingInvalidTransactionsDuringCommit =
pvtData.skipPullingInvalidTransactionsDuringCommit;
}
if (pvtData.implicitCollectionDisseminationPolicy !== undefined) {
if (pvtData.implicitCollectionDisseminationPolicy !== undefined) {
const imp = pvtData.implicitCollectionDisseminationPolicy;
if (imp.maxPeerCount !== undefined) {
this.log.debug(`Setting implicit collection dissemination policy max peer count: ${imp.maxPeerCount}`);
this.config.peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount =
imp.maxPeerCount;
}
if (imp.requiredPeerCount !== undefined) {
this.log.debug(`Setting implicit collection dissemination policy required peer count: ${imp.requiredPeerCount}`);
this.config.peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount =
imp.requiredPeerCount;
}
}
}
}
if (gossip.state !== undefined) {
const st = gossip.state;
if (st.enabled !== undefined) {
this.log.debug(`Setting state enabled: ${st.enabled}`);
this.config.peer.gossip.state.enabled = st.enabled;
}
if (st.checkInterval !== undefined) {
this.log.debug(`Setting state check interval: ${st.checkInterval}`);
this.config.peer.gossip.state.checkInterval = st.checkInterval;
}
if (st.responseTimeout !== undefined) {
this.log.debug(`Setting state response timeout: ${st.responseTimeout}`);
this.config.peer.gossip.state.responseTimeout = st.responseTimeout;
}
if (st.batchSize !== undefined) {
this.log.debug(`Setting state batch size: ${st.batchSize}`);
this.config.peer.gossip.state.batchSize = st.batchSize;
}
if (st.blockBufferSize !== undefined) {
this.log.debug(`Setting state block buffer size: ${st.blockBufferSize}`);
this.config.peer.gossip.state.blockBufferSize = st.blockBufferSize;
}
if (st.maxRetries !== undefined) {
this.log.debug(`Setting state max retries: ${st.maxRetries}`);
this.config.peer.gossip.state.maxRetries = st.maxRetries;
}
}
return this;
}
setTLS(tls) {
if (tls === undefined)
return this;
if (tls.enabled !== undefined) {
this.log.debug(`Setting TLS enabled: ${tls.enabled}`);
this.config.peer.tls.enabled = tls.enabled;
}
if (tls.clientAuthRequired !== undefined) {
this.log.debug(`Setting client authentication required: ${tls.clientAuthRequired}`);
this.config.peer.tls.clientAuthRequired = tls.clientAuthRequired;
}
if (tls.cert !== undefined) {
if (tls.cert.file !== undefined) {
this.log.debug(`Setting TLS cert file: ${tls.cert.file}`);
this.config.peer.tls.cert.file = tls.cert.file;
}
}
if (tls.key !== undefined) {
if (tls.key.file !== undefined) {
this.log.debug(`Setting TLS key file: ${tls.key.file}`);
this.config.peer.tls.key.file = tls.key.file;
}
}
if (tls.rootcert !== undefined) {
if (tls.rootcert.file !== undefined) {
this.log.debug(`Setting TLS rootcert file: ${tls.rootcert.file}`);
this.config.peer.tls.rootcert.file = tls.rootcert.file;
}
}
if (tls.clientRootCAs !== undefined) {
if (tls.clientRootCAs.files !== undefined) {
this.log.debug(`Setting TLS client root CAs files: ${tls.clientRootCAs.files.join(", ")}`);
this.config.peer.tls.clientRootCAs.files = tls.clientRootCAs.files;
}
}
if (tls.clientKey !== undefined) {
if (tls.clientKey.file !== undefined) {
this.log.debug(`Setting TLS client key file: ${tls.clientKey.file}`);
this.config.peer.tls.clientKey.file = tls.clientKey.file;
}
}
if (tls.clientCert !== undefined) {
if (tls.clientCert.file !== undefined) {
this.log.debug(`Setting TLS client cert file: ${tls.clientCert.file}`);
this.config.peer.tls.clientCert.file = tls.clientCert.file;
}
}
return this;
}
setAuthentication(authentication) {
if (authentication === undefined)
return this;
this.log.debug(`Setting authentication time window: ${authentication}`);
this.config.peer.authentication.timewindow = authentication;
return this;
}
setKeepAlice(keepAlice) {
if (keepAlice === undefined)
return this;
if (keepAlice.interval !== undefined) {
this.log.debug(`Setting keep-alive interval: ${keepAlice.interval}`);
this.config.peer.keepalive.interval = keepAlice.interval;
}
if (keepAlice.timeout !== undefined) {
this.log.debug(`Setting keep-alive timeout: ${keepAlice.timeout}`);
this.config.peer.keepalive.timeout = keepAlice.timeout;
}
if (keepAlice.minInterval !== undefined) {
this.log.debug(`Setting minimum keep-alive interval: ${keepAlice.minInterval}`);
this.config.peer.keepalive.minInterval = keepAlice.minInterval;
}
if (keepAlice.client !== undefined) {
if (keepAlice.client.interval !== undefined) {
this.log.debug(`Setting client keep-alive interval: ${keepAlice.client.interval}`);
this.config.peer.keepalive.client.interval =
keepAlice.client.interval;
}
if (keepAlice.client.timeout !== undefined) {
this.log.debug(`Setting client keep-alive timeout: ${keepAlice.client.timeout}`);
this.config.peer.keepalive.client.timeout = keepAlice.client.timeout;
}
}
if (keepAlice.deliveryClient !== undefined) {
if (keepAlice.deliveryClient.interval !== undefined) {
this.log.debug(`Setting delivery client keep-alive interval: ${keepAlice.deliveryClient.interval}`);
this.config.peer.keepalive.deliveryClient.interval =
keepAlice.deliveryClient.interval;
}
if (keepAlice.deliveryClient.timeout !== undefined) {
this.log.debug(`Setting delivery client keep-alive timeout: ${keepAlice.deliveryClient.timeout}`);
this.config.peer.keepalive.deliveryClient.timeout =
keepAlice.deliveryClient.timeout;
}
}
return this;
}
setGateway(gateway) {
if (gateway === undefined)
return this;
if (gateway.enabled !== undefined) {
this.log.debug(`Setting gateway enabled: ${gateway.enabled}`);
this.config.peer.gateway.enabled = gateway.enabled;
}
if (gateway.endorsementTimeout !== undefined) {
this.log.debug(`Setting endorsement timeout: ${gateway.endorsementTimeout}`);
this.config.peer.gateway.endorsementTimeout =
gateway.endorsementTimeout;
}
if (gateway.broadcastTimeout !== undefined) {
this.log.debug(`Setting broadcast timeout: ${gateway.broadcastTimeout}`);
this.config.peer.gateway.broadcastTimeout = gateway.broadcastTimeout;
}
if (gateway.dialTimeout !== undefined) {
this.log.debug(`Setting dial timeout: ${gateway.dialTimeout}`);
this.config.peer.gateway.dialTimeout = gateway.dialTimeout;
}
return this;
}
setGeneral(general) {
if (general === undefined)
return this;
if (general.validatorPoolSize !== undefined) {
this.log.debug(`Setting validator pool size: ${general.validatorPoolSize}`);
this.config.peer.validatorPoolSize = general.validatorPoolSize;
}
if (general.fileSystemPath !== undefined) {
this.log.debug(`Setting file system path: ${general.fileSystemPath}`);
this.config.peer.fileSystemPath = general.fileSystemPath;
}
if (general.id !== undefined) {
this.log.debug(`Setting peer ID: ${general.id}`);
this.config.peer.id = general.id;
}
if (general.networkId !== undefined) {
this.log.debug(`Setting network ID: ${general.networkId}`);
this.config.peer.networkId = general.networkId;
}
if (general.listenAddress !== undefined) {
this.log.debug(`Setting listen address: ${general.listenAddress}`);
this.config.peer.listenAddress = general.listenAddress;
}
if (general.chaincodeListenAddress !== undefined) {
this.log.debug(`Setting chaincode listen address: ${general.chaincodeListenAddress}`);
this.config.peer.chaincodeListenAddress = general.chaincodeListenAddress;
}
if (general.chaincodeAddress !== undefined) {
this.log.debug(`Setting chaincode address: ${general.chaincodeAddress}`);
this.config.peer.chaincodeAddress = general.chaincodeAddress;
}
if (general.address !== undefined) {
this.log.debug(`Setting peer address: ${general.address}`);
this.config.peer.address = general.address;
}
if (general.addressAutoDetect !== undefined) {
this.log.debug(`Setting address auto-detect to ${general.addressAutoDetect}`);
this.config.peer.addressAutoDetect = general.addressAutoDetect;
}
return this;
}
setBCCSP(bccsp) {
if (bccsp !== undefined) {
if (bccsp.Default !== undefined) {
this.log.debug(`Setting BCCSP default to ${bccsp.Default}`);
this.config.peer.BCCSP.Default = bccsp.Default;
}
if (bccsp.SW !== undefined) {
if (bccsp.SW.Hash !== undefined) {
this.log.debug(`Setting BCCSP SW hash to ${bccsp.SW.Hash}`);
this.config.peer.BCCSP.SW.Hash = bccsp.SW.Hash;
}
if (bccsp.SW.Security !== undefined) {
this.log.debug(`Setting BCCSP SW security to ${bccsp.SW.Security}`);
this.config.peer.BCCSP.SW.Security = bccsp.SW.Security;
}
if (bccsp.SW.FileKeyStore !== undefined) {
if (bccsp.SW.FileKeyStore.KeyStore !== undefined) {
this.log.debug(`Setting BCCSP SW FileKeyStore key store to ${bccsp.SW.FileKeyStore.KeyStore}`);
this.config.peer.BCCSP.SW.FileKeyStore.KeyStore =
bccsp.SW.FileKeyStore.KeyStore;
}
}
}
if (bccsp.PKCS11 !== undefined) {
if (bccsp.PKCS11.Library !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 library to ${bccsp.PKCS11.Library}`);
this.config.peer.BCCSP.PKCS11.Library = bccsp.PKCS11.Library;
}
if (bccsp.PKCS11.Label !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 label to ${bccsp.PKCS11.Label}`);
this.config.peer.BCCSP.PKCS11.Label = bccsp.PKCS11.Label;
}
if (bccsp.PKCS11.Pin !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 pin to ${bccsp.PKCS11.Pin}`);
this.config.peer.BCCSP.PKCS11.Pin = bccsp.PKCS11.Pin;
}
if (bccsp.PKCS11.Hash !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 hash to ${bccsp.PKCS11.Hash}`);
this.config.peer.BCCSP.PKCS11.Hash = bccsp.PKCS11.Hash;
}
if (bccsp.PKCS11.Security !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 security to ${bccsp.PKCS11.Security}`);
this.config.peer.BCCSP.PKCS11.Security = bccsp.PKCS11.Security;
}
if (bccsp.PKCS11.SoftwareVerify !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 software verify to ${bccsp.PKCS11.SoftwareVerify}`);
this.config.peer.BCCSP.PKCS11.SoftwareVerify =
bccsp.PKCS11.SoftwareVerify;
}
if (bccsp.PKCS11.Immutable !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 immutable to ${bccsp.PKCS11.Immutable}`);
this.config.peer.BCCSP.PKCS11.Immutable = bccsp.PKCS11.Immutable;
}
if (bccsp.PKCS11.AltID !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 alt ID to ${bccsp.PKCS11.AltID}`);
this.config.peer.BCCSP.PKCS11.AltID = bccsp.PKCS11.AltID;
}
if (bccsp.PKCS11.KeyIds !== undefined) {
this.log.debug(`Setting BCCSP PKCS11 key IDs to ${bccsp.PKCS11.KeyIds}`);
this.config.peer.BCCSP.PKCS11.KeyIds = bccsp.PKCS11.KeyIds;
}
}
}
return this;
}
setMspConfig(mspConfig) {
if (mspConfig === undefined)
return this;
if (mspConfig.localMspType !== undefined) {
this.log.debug(`Setting local MSP type to ${mspConfig.localMspType}`);
this.config.peer.localMspType = mspConfig.localMspType;
}
if (mspConfig.mspConfigPath !== undefined) {
this.log.debug(`Setting MSP config path to ${mspConfig.mspConfigPath}`);
this.config.peer.mspConfigPath = mspConfig.mspConfigPath;
}
if (mspConfig.localMspId !== undefined) {
this.log.debug(`Setting local MSP ID to ${mspConfig.localMspId}`);
this.config.peer.localMspId = mspConfig.localMspId;
}
return this;
}
setConnTimeoutClient(connTimeoutClient) {
if (connTimeoutClient !== undefined) {
this.log.debug(`Setting connection timeout client to ${connTimeoutClient}`);
this.config.peer.client.connTimeout = connTimeoutClient;
}
return this;
}
setDeliveryClient(deliveryClient) {
if (deliveryClient === undefined)
return this;
if (deliveryClient.addressOverrides !== undefined) {
this.log.debug(`Setting address overrides: ${JSON.stringify(deliveryClient.addressOverrides)}`);
this.config.peer.deliveryclient.addressOverrides =
deliveryClient.addressOverrides;
}
if (deliveryClient.blockGossipEnabled !== undefined) {
this.log.debug(`Setting block gossip enabled to ${deliveryClient.blockGossipEnabled}`);
this.config.peer.deliveryclient.blockGossipEnabled =
deliveryClient.blockGossipEnabled;
}
if (deliveryClient.reconnectTotalTimeThreshold !== undefined) {
this.log.debug(`Setting reconnect total time threshold to ${deliveryClient.reconnectTotalTimeThreshold}`);
this.config.peer.deliveryclient.reconnectTotalTimeThreshold =
deliveryClient.reconnectTotalTimeThreshold;
}
if (deliveryClient.connTimeout !== undefined) {
this.log.debug(`Setting connection timeout to ${deliveryClient.connTimeout}`);
this.config.peer.deliveryclient.connTimeout =
deliveryClient.connTimeout;
}
if (deliveryClient.reConnectBackoffThreshold !== undefined) {
this.log.debug(`Setting reconnect backoff threshold to ${deliveryClient.reConnectBackoffThreshold}`);
this.config.peer.deliveryclient.reConnectBackoffThreshold =
deliveryClient.reConnectBackoffThreshold;
}
return this;
}
setProfile(profile) {
if (profile === undefined)
return this;
if (profile.enabled !== undefined) {
this.log.debug(`Setting profile to ${profile.enabled}`);
this.config.peer.profile = profile;
}
if (profile.listenAddress !== undefined) {
this.log.debug(`Setting listen address to ${profile.listenAddress}`);
this.config.peer.profile.listenAddress = profile.listenAddress;
}
return this;
}
setHandlers(handlers) {
if (handlers === undefined)
return this;
if (handlers.authFilters !== undefined) {
this.log.debug(`Setting auth filters: ${JSON.stringify(handlers.authFilters)}`);
this.config.peer.handlers.authFilters = handlers.authFilters;
}
if (handlers.decorators !== undefined) {
this.log.debug(`Setting decorators: ${JSON.stringify(handlers.decorators)}`);
this.config.peer.handlers.decorators = handlers.decorators;
}
if (handlers.endorsers !== undefined) {
const ecss = handlers.endorsers.escc;
if (ecss !== undefined) {
if (ecss.name !== undefined) {
this.log.debug(`Setting ESCC name: ${ecss.name}`);
this.config.peer.handlers.endorsers.escc.name = ecss.name;
}
if (ecss.library !== undefined) {
this.log.debug(`Setting ESCC library: ${ecss.library}`);
this.config.peer.handlers.endorsers.escc.library = ecss.library;
}
}
}
if (handlers.validators !== undefined) {
const vscc = handlers.validators.vscc;
if (vscc !== undefined) {
if (vscc.name !== undefined) {
this.log.debug(`Setting VSCC name: ${vscc.name}`);
this.config.peer.handlers.validators.vscc.name = vscc.name;
}
if (vscc.library !== undefined) {
this.log.debug(`Setting VSCC library: ${vscc.library}`);
this.config.peer.handlers.validators.vscc.library = vscc.library;
}
}
}
return this;
}
setDiscovery(discovery) {
if (discovery === undefined)
return this;
if (discovery.enabled !== undefined) {
this.log.debug(`Setting discovery enabled: ${discovery.enabled}`);
this.config.peer.discovery.enabled = discovery.enabled;
}
if (discovery.authCacheEnabled !== undefined) {
this.log.debug(`Setting auth cache enabled: ${discovery.authCacheEnabled}`);
this.config.peer.discovery.authCacheEnabled =
discovery.authCacheEnabled;
}
if (discovery.authCacheMaxSize !== undefined) {
this.log.debug(`Setting auth cache max size: ${discovery.authCacheMaxSize}`);
this.config.peer.discovery.authCacheMaxSize =
discovery.authCacheMaxSize;
}
if (discovery.authCachePurgeRetentionRatio !== undefined) {
this.log.debug(`Setting auth cache purge retention ratio: ${discovery.authCachePurgeRetentionRatio}`);
this.config.peer.discovery.authCachePurgeRetentionRatio =
discovery.authCachePurgeRetentionRatio;
}
if (discovery.orgMembersAllowedAccess !== undefined) {
this.log.debug(`Setting org members allowed access: ${discovery.orgMembersAllowedAccess}`);
this.config.peer.discovery.orgMembersAllowedAccess =
discovery.orgMembersAllowedAccess;
}
return this;
}
setLimits(limits) {
if (limits === undefined)
return this;
if (limits.concurrency !== undefined) {
const concurrency = limits.concurrency;
if (concurrency.deliverService !== undefined) {
this.log.debug(`Setting deliver service concurrency: ${concurrency.deliverService}`);
this.config.peer.limits.concurrency.deliverService =
concurrency.deliverService;
}
if (concurrency.gatewayService !== undefined) {
this.log.debug(`Setting gateway service concurrency: ${concurrency.gatewayService}`);
this.config.peer.limits.concurrency.gatewayService =
concurrency.gatewayService;
}
if (concurrency.endorserService !== undefined) {
this.log.debug(`Setting endorser service concurrency: ${concurrency.endorserService}`);
this.config.peer.limits.concurrency.endorserService =
concurrency.endorserService;
}
}
return this;
}
setMessageSize(size) {
if (size === undefined)
return this;
if (size.maxRecvMsgSize !== undefined) {
this.log.debug(`Setting max receive message size: ${size.maxRecvMsgSize}`);
this.config.peer.maxRecvMsgSize = size.maxRecvMsgSize;
}
if (size.maxSendMsgSize !== undefined) {
this.log.debug(`Setting max send message size: ${size.maxSendMsgSize}`);
this.config.peer.maxSendMsgSize = size.maxSendMsgSize;
}
return this;
}
setChaincode(chaincode) {
if (chaincode === undefined)
return this;
if (chaincode.id !== undefined) {
if (chaincode.id.path !== undefined) {
this.log.debug(`Setting chaincode path: ${chaincode.id.path}`);
this.config.chaincode.id.path = chaincode.id.path;
}
if (chaincode.id.name !== undefined) {
this.log.debug(`Setting chaincode name: ${chaincode.id.name}`);
this.config.chaincode.id.name = chaincode.id.name;
}
}
if (chaincode.builder !== undefined) {
this.log.debug(`Setting chaincode builder: ${chaincode.builder}`);
this.config.chaincode.builder = chaincode.builder;
}
if (chaincode.pull !== undefined) {
this.log.debug(`Setting chaincode pull: ${chaincode.pull}`);
this.config.chaincode.pull = chaincode.pull;
}
if (chaincode.golang !== undefined) {
const golang = chaincode.golang;
if (golang.runtime !== undefined) {
this.log.debug(`Setting Go runtime: ${golang.runtime}`);
this.config.chaincode.golang.runtime = golang.runtime;
}
if (golang.dynamicLink !== undefined) {
this.log.debug(`Setting Go dynamic link: ${golang.dynamicLink}`);
this.config.chaincode.golang.dynamicLink = golang.dynamicLink;
}
}
if (chaincode.java !== undefined) {
const java = chaincode.java;
if (java.runtime !== undefined) {
this.log.debug(`Setting Java runtime: ${java.runtime}`);
this.config.chaincode.java.runtime = java.runtime;
}
}
if (chaincode.node !== undefined) {
const node = chaincode.node;
if (node.runtime !== undefined) {
this.log.debug(`Setting Node runtime: ${node.runtime}`);
this.config.chaincode.node.runtime = node.runtime;
}
}
if (chaincode.externalBuilders !== undefined) {
this.log.debug(`Setting external builders: ${chaincode.externalBuilders.length}`);
this.config.chaincode.externalBuilders = chaincode.externalBuilders;
}
if (chaincode.installTimeout !== undefined) {
this.log.debug(`Setting install timeout: ${chaincode.installTimeout}`);
this.config.chaincode.installTimeout = chaincode.installTimeout;
}
if (chaincode.startuptimeout !== undefined) {
this.log.debug(`Setting startup timeout: ${chaincode.startuptimeout}`);
this.config.chaincode.startuptimeout = chaincode.startuptimeout;
}
if (chaincode.executetimeout !== undefined) {
this.log.debug(`Setting execute timeout: ${chaincode.executetimeout}`);
this.config.chaincode.executetimeout = chaincode.executetimeout;
}
if (chaincode.mode !== undefined) {
this.log.debug(`Setting chaincode mode: ${chaincode.mode}`);
this.config.chaincode.mode = chaincode.mode;
}
if (chaincode.keepalive !== undefined) {
this.log.debug(`Setting chaincode keepalive: ${chaincode.keepalive}`);
this.config.chaincode.keepalive = chaincode.keepalive;
}
if (chaincode.system !== undefined) {
const system = chaincode.system;
if (system._lifecycle !== undefined) {
this.log.debug(`Setting system lifecycle: ${system._lifecycle}`);
this.config.chaincode.system._lifecycle = system._lifecycle;
}
if (system.cscc !== undefined) {
this.log.debug(`Setting CSCC: ${system.cscc}`);
this.config.chaincode.system._lifecycle = system.cscc;
}
if (system.lscc !== undefined) {
this.log.debug(`Setting LSCC: ${system.lscc}`);
this.config.chaincode.system._lifecycle = system.lscc;
}
if (system.qscc !== undefined) {
this.log.debug(`Setting QSCC: ${system.qscc}`);
this.config.chaincode.system._lifecycle = system.qscc;
}
}
if (chaincode.logging !== undefined) {
const logging = chaincode.logging;
if (logging.level !== undefined) {
this.log.debug(`Setting logging level: ${logging.level}`);
this.config.chaincode.logging.level = logging.level;
}
if (logging.shim !== undefined) {
this.log.debug(`Setting logging shim: ${logging.shim}`);
this.config.chaincode.logging.shim = logging.shim;
}
if (logging.format !== undefined) {
this.log.debug(`Setting logging format: ${logging.format}`);
this.config.chaincode.logging.format = logging.format;
}
}
return this;
}
setVMOptions(options) {
if (options === undefined)
return this;
if (options.endpoint !== undefined) {
this.log.debug(`Setting VM endpoint: ${options.endpoint}`);
this.config.vm.endpoint = options.endpoint;
}
if (options.docker != undefined) {
const docker = options.docker;
if (docker.tls !== undefined) {
if (docker.tls.enabled !== undefined) {
this.log.debug(`Setting TLS enabled: ${docker.tls.enabled}`);
this.config.vm.docker.tls.enabled = docker.tls.enabled;
}
if (docker.tls.ca !== undefined) {
if (docker.tls.ca.file !== undefined) {
this.log.debug(`Setting TLS CA file: ${docker.tls.ca.file}`);
this.config.vm.docker.tls.ca.file = docker.tls.ca.file;
}
}
if (docker.tls.cert !== undefined) {
if (docker.tls.cert.file !== undefined) {
this.log.debug(`Setting TLS cert file: ${docker.tls.cert.file}`);
this.config.vm.docker.tls.cert.file = docker.tls.cert.file;
}
}
}
if (docker.attachStdout !== undefined) {
this.log.debug(`Setting attach stdout: ${docker.attachStdout}`);
this.config.vm.docker.attachStdout = docker.attachStdout;
}
if (docker.hostConfig !== undefined) {
const hostConfig = docker.hostConfig;
if (hostConfig.NetworkMode !== undefined) {
this.log.debug(`Setting NetworkMode: ${hostConfig.NetworkMode}`);
this.config.vm.docker.hostConfig.NetworkMode =
hostConfig.NetworkMode;
}
if (hostConfig.Dns !== undefined) {
this.log.info(`Setting DNS: ${hostConfig.Dns.join(", ")}`);
this.config.vm.docker.hostConfig.Dns = hostConfig.Dns;
}
if (hostConfig.LogConfig !== undefined) {
const logConfig = hostConfig.LogConfig;
if (logConfig.Type !== undefined) {
this.log.info(`Setting LogType: ${logConfig.Type}`);
this.config.vm.docker.hostConfig.LogConfig.Type =
logConfig.Type;
}
if (logConfig.Config !== undefined) {
if (logConfig.Config["max-size"] !== undefined) {
this.log.info(`Setting Log maxSize: ${logConfig.Config["max-size"]}`);
this.config.vm.docker.hostConfig.LogConfig.Config["max-size"] = logConfig.Config["max-size"];
}
if (logConfig.Config["max-file"] !== undefined) {
this.log.info(`Setting Log maxFile: ${logConfig.Config["max-file"]}`);
this.config.vm.docker.hostConfig.LogConfig.Config["max-file"] = logConfig.Config["max-file"];
}
}
}
if (hostConfig.Memory !== undefined) {
this.log.info(`Setting Memory: ${hostConfig.Memory}`);
this.config.vm.docker.hostConfig.Memory = hostConfig.Memory;
}
}
}
return this;
}
setLedgerState(state) {
if (state === undefined)
return this;
if (state.stateDatabase !== undefined) {
this.log.debug(`Setting state database: ${state.stateDatabase}`);
this.config.ledger.state.stateDatabase = state.stateDatabase;
}
if (state.totalQueryLimit !== undefined) {
this.log.debug(`Setting total query limit: ${state.totalQueryLimit}`);
this.config.ledger.state.totalQueryLimit = state.totalQueryLimit;
}
if (state.couchDBConfig !== undefined) {
const couchDB = state.couchDBConfig;
if (couchDB.couchDBAddress !== undefined) {
this.log.debug(`Setting CouchDB address: ${couchDB.couchDBAddress}`);
this.config.ledger.state.couchDBConfig.couchDBAddress =
couchDB.couchDBAddress;
}
if (couchDB.username !== undefined) {
this.log.debug(`Setting CouchDB user: ${couchDB.username}`);
this.config.ledger.state.couchDBConfig.username = couchDB.username;
}
if (couchDB.password !== undefined) {
this.log.debug(`Setting CouchDB password: ${couchDB.password}`);
this.config.ledger.state.couchDBConfig.password = couchDB.password;
}
if (couchDB.maxRetries !== undefined) {
this.log.debug(`Setting CouchDB max retries: ${couchDB.maxRetries}`);
this.config.ledger.state.couchDBConfig.maxRetries =
couchDB.maxRetries;
}
if (couchDB.maxRetriesOnStartup !== undefined) {
this.log.debug(`Setting CouchDB max retries on startup: ${couchDB.maxRetriesOnStartup}`);
this.config.ledger.state.couchDBConfig.maxRetriesOnStartup =
couchDB.maxRetriesOnStartup;
}
if (couchDB.requestTimeout !== undefined) {
this.log.debug(`Setting CouchDB request timeout: ${couchDB.requestTimeout}`);
this.config.ledger.state.couchDBConfig.requestTimeout =
couchDB.requestTimeout;
}
if (couchDB.internalQueryLimit !== undefined) {
this.log.debug(`Setting CouchDB internal query limit: ${couchDB.internalQueryLimit}`);
this.config.ledger.state.couchDBConfig.internalQueryLimit =
couchDB.internalQueryLimit;
}
if (couchDB.maxBatchUpdateSize !== undefined) {
this.log.debug(`Setting CouchDB maximum batch update size: ${couchDB.maxBatchUpdateSize}`);
this.config.ledger.state.couchDBConfig.maxBatchUpdateSize =
couchDB.maxBatchUpdateSize;
}
if (couchDB.createGlobalChangesDB !== undefined) {
this.log.debug(`Setting CouchDB create global changes database: ${couchDB.createGlobalChangesDB}`);
this.config.ledger.state.couchDBConfig.createGlobalChangesDB =
couchDB.createGlobalChangesDB;
}
if (couchDB.cacheSize !== undefined) {
this.log.debug(`Setting CouchDB cache size: ${couchDB.cacheSize}`);
this.config.ledger.state.couchDBConfig.cacheSize = couchDB.cacheSize;
}
}
return this;
}
setLegerBlockchain(blockchain) {
if (blockchain !== undefined) {
this.log.debug(`Setting ledger blockchain: ${JSON.stringify(blockchain)}`);
this.config.ledger.blockchain = blockchain;
}
return this;
}
enableLedgerHistoryDatabase(enable) {
if (enable !== undefined) {
this.log.debug(`Setting ledger history database enabled: ${enable}`);
this.config.ledger.history.enableHistoryDatabase = enable;
}
return this;
}
setLedgerPvtDataStore(pvtData) {
if (pvtData === undefined)
return this;
if (pvtData.collElgProcDbBatchesInterval !== undefined) {
this.log.debug(`Setting private data collection eligibility process database batches interval: ${pvtData.collElgProcDbBatchesInterval}`);
this.config.ledger.pvtdataStore.collElgProcDbBatchesInterval =
pvtData.collElgProcDbBatchesInterval;
}
if (pvtData.collElgProcMaxDbBatchSize !== undefined) {
this.log.debug(`Setting private data collection eligibility process maximum database batch size: ${pvtData.collElgProcMaxDbBatchSize}`);
this.config.ledger.pvtdataStore.collElgProcMaxDbBatchSize =
pvtData.collElgProcMaxDbBatchSize;
}
if (pvtData.deprioritizedDataReconcilerInterval !== undefined) {
this.log.debug(`Setting deprioritized data reconciliation interval: ${pvtData.deprioritizedDataReconcilerInterval}`);
this.config.ledger.pvtdataStore.deprioritizedDataReconcilerInterval =
pvtData.deprioritizedDataReconcilerInterval;
}
if (pvtData.purgeInterval !== undefined) {
this.log.debug(`Setting ledger purge interval: ${pvtData.purgeInterval}`);
this.config.ledger.pvtdataStore.purgeInterval = pvtData.purgeInterval;
}
if (pvtData.purgedKeyAuditLogging !== undefined) {
this.log.debug(`Setting purged key audit logging: ${pvtData.purgedKeyAuditLogging}`);
this.config.ledger.pvtdataStore.purgedKeyAuditLogging =
pvtData.purgedKeyAuditLogging;
}
return this;
}
setLedgerSnapshotsRootDir(rootDir) {
if (rootDir !== undefined) {
this.log.debug(`Setting ledger snapshots root directory: ${rootDir}`);
this.config.ledger.snapshots.rootDir = rootDir;
}
return this;
}
setOperations(operations) {
if (operations === undefined)
return this;
if (operations.listenAddress !== undefined) {
this.log.debug(`Setting operations listen address: ${operations.listenAddress}`);
this.config.operations.listenAddress = operations.listenAddress;
}
if (operations.tls !== undefined) {
if (operations.tls.enabled !== undefined) {
this.log.debug(`Setting operations TLS enabled: ${operations.tls.enabled}`);
this.config.operations.tls.enabled = operations.tls.enabled;
}
if (operations.tls.cert !== undefined) {
if (operations.tls.cert.file !== undefined) {
this.log.debug(`Setting operations TLS cert file: ${operations.tls.cert.file}`);
this.config.operations.tls.cert.file = operations.tls.cert.file;
}
}
if (operations.tls.key !== undefined) {
if (operations.tls.key.file !== undefined) {
this.log.debug(`Setting operations TLS key file: ${operations.tls.key.file}`);
this.config.operations.tls.key.file = operations.tls.key.file;
}
}
if (operations.tls.clientAuthRequired !== undefined) {
this.log.debug(`Setting operations TLS client authentication required: ${operations.tls.clientAuthRequired}`);
this.config.operations.tls.clientAuthRequired =
operations.tls.clientAuthRequired;
}
if (operations.tls.clientRootCAs !== undefined) {
if (operations.tls.clientRootCAs.files !== undefined) {
this.log.debug(`Setting operations TLS client root CAs files: ${operations.tls.clientRootCAs.files.join(", ")}`);
this.config.operations.tls.clientRootCAs.files =
operations.tls.clientRootCAs.files;
}
}
}
return this;
}
setMetrics(metrics) {
if (metrics === undefined)
return this;
if (metrics.provider !== undefined) {
this.log.debug(`Setting metrics provider: ${metrics.provider}`);
this.config.metrics.provider = metrics.provider;
}
if (metrics.statsd !== undefined) {
if (metrics.statsd.network !== undefined) {
this.log.debug(`Setting metrics statsd network: ${metrics.statsd.network}`);
this.config.metrics.statsd.network = metrics.statsd.network;
}
if (metrics.statsd.address !== undefined) {
this.log.debug(`Setting metrics statsd address: ${metrics.statsd.address}`);
this.config.metrics.statsd.address = metrics.statsd.address;
}
if (metrics.statsd.writeInterval !== undefined) {
this.log.debug(`Setting metrics statsd write interval: ${metrics.statsd.writeInterval}`);
this.config.metrics.statsd.writeInterval =
metrics.statsd.writeInterval;
}
if (metrics.statsd.prefix !== undefined) {
this.log.debug(`Setting metrics statsd prefix: ${metrics.statsd.prefix}`);
this.config.metrics.statsd.prefix = metrics.statsd.prefix;
}
}
return this;
}
/**
* @description Saves the current configuration to a file.
* @summary Writes the current Fabric CA Server configuration to a YAML file at the specified path. If the directory doesn't exist, it will be created.
* @param {string} cpath - The path where the configuration file should be saved.
* @return {this} The current instance of the builder for method chaining.
* @example
* const builder = new FabricCAServerCommandBuilder();
* builder.save('/path/to/config/fabric-ca-server.yaml');
*
* @mermaid
* sequenceDiagram
* participant Client
* participant Builder as FabricCAServerCommandBuilder
* participant FileSystem as File System
* Client->>Builder: saveConfig('/path/to/config/fabric-ca-server.yaml')
* Builder->>Builder: Check if cpath is defined
* alt cpath is defined
* Builder->>FileSystem: Check if directory exists
* alt Directory doesn't exist
* Builder->>FileSystem: Create directory
* end
* Builder->>Builder: Log debug message
* Builder->>FileSystem: Write YAML configuration to file
* end
* Builder-->>Client: Return this
*/
save(cpath) {
if (cpath === undefined)
return this;
if (!fs.existsSync(path.join(cpath)))
fs.mkdirSync(path.join(cpath), { recursive: true });
if (!cpath.endsWith(".yaml"))
cpath = path.join(cpath, "core.yaml");
this.log.debug(`Writing configuration to ${cpath}`);
this.log.debug(`Config file: ${JSON.stringify(this.config, null, 2)}`);
writeFileYaml(cpath, this.config);
return this;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItY29uZmlnLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItY29uZmlnLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQTBCL0QsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUFZLE1BQWU7UUFKbkIsV0FBTSxHQUFlLFlBQVksQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsMkJBQTJCLENBQUMsQ0FDcEMsQ0FBQztRQUdkLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7O1lBQ3hELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQXFCO1FBQzdCLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV0QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSyxDQUFDLE1BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMs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QyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXBFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlWWFtbCwgd3JpdGVGaWxlWWFtbCB9IGZyb20gXCIuLi8uLi91dGlscy95YW1sXCI7XG5pbXBvcnQge1xuICBCQ0NTUENvbmZpZyxcbiAgQ2hhaW5jb2RlQ29uZmlnLFxuICBEZWxpdmVyeUNsaWVudENvbmZpZyxcbiAgRGlzY292ZXJ5Q29uZmlnLFxuICBHYXRld2F5Q29uZmlnLFxuICBHZW5lcmFsQ29uZmlnLFxuICBHb3NzaXBDb25maWcsXG4gIEhhbmRsZXJzQ29uZmlnLFxuICBLZWVwQWxpdmVDb25maWcsXG4gIExlZGdlclN0YXRlQ29uZmlnLFxuICBMaW1pdHNDb25maWcsXG4gIE1TR1NpemVDb25maWcsXG4gIE1TUENvbmZpZyxcbiAgUGVlckNvbmZpZyxcbiAgUHJpdmF0ZURhdGFTdG9yZUNvbmZpZyxcbiAgUHJvZmlsZUNvbmZpZyxcbiAgVExTQ29uZmlnLFxuICBWTUNvbmZpZyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvZmFicmljL3BlZXItY29uZmlnXCI7XG5pbXBvcnQge1xuICBNZXRyaWNzQ29uZmlnLFxuICBPcGVyYXRpb25zQ29uZmlnLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9mYWJyaWMvZ2VuZXJhbC1jb25maWdzXCI7XG5cbmV4cG9ydCBjbGFzcyBGYWJyaWNQZWVyQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgbG9nOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBjb25maWc6IFBlZXJDb25maWcgPSByZWFkRmlsZVlhbWwoXG4gICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi8uLi8uLi9jb25maWcvY29yZS55YW1sXCIpXG4gICkgYXMgUGVlckNvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcikgdGhpcy5sb2cgPSBMb2dnaW5nLmZvcihGYWJyaWNQZWVyQ29uZmlnQnVpbGRlcik7XG4gICAgZWxzZSB0aGlzLmxvZyA9IGxvZ2dlci5mb3IoRmFicmljUGVlckNvbmZpZ0J1aWxkZXIubmFtZSk7XG4gIH1cblxuICBzZXRHb3NzaXAoZ29zc2lwPzogR29zc2lwQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGdvc3NpcCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChnb3NzaXAuYm9vdHN0cmFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGJvb3RzdHJhcDogJHtnb3NzaXAuYm9vdHN0cmFwfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5ib290c3RyYXAgPSBnb3NzaXAuYm9vdHN0cmFwO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAudXNlTGVhZGVyRWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHVzZSBsZWFkZXIgZWxlY3Rpb246ICR7Z29zc2lwLnVzZUxlYWRlckVsZWN0aW9ufWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnVzZUxlYWRlckVsZWN0aW9uID0gZ29zc2lwLnVzZUxlYWRlckVsZWN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAub3JnTGVhZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG9yZyBsZWFkZXJzOiAke2dvc3NpcC5vcmdMZWFkZXJ9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm9yZ0xlYWRlciA9IGdvc3NpcC5vcmdMZWFkZXI7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5tZW1iZXJzaGlwVHJhY2tlckludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtZW1iZXJzaGlwIHRyYWNrZXIgaW50ZXJ2YWw6ICR7Z29zc2lwLm1lbWJlcnNoaXBUcmFja2VySW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEubWVtYmVyc2hpcFRyYWNrZXJJbnRlcnZhbCA9XG4gICAgICAgIGdvc3NpcC5tZW1iZXJzaGlwVHJhY2tlckludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubWF4QmxvY2tDb3VudFRvU3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG1heCBibG9jayBjb3VudCB0byBzdG9yZTogJHtnb3NzaXAubWF4QmxvY2tDb3VudFRvU3RvcmV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEubWF4QmxvY2tDb3VudFRvU3RvcmUgPVxuICAgICAgICBnb3NzaXAubWF4QmxvY2tDb3VudFRvU3RvcmU7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5tYXhQcm9wYWdhdGlvbkJ1cnN0TGF0ZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbWF4IHByb3BhZ2F0aW9uIGJ1cnN0IGxhdGVuY3k6ICR7Z29zc2lwLm1heFByb3BhZ2F0aW9uQnVyc3RMYXRlbmN5fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm1heFByb3BhZ2F0aW9uQnVyc3RMYXRlbmN5ID1cbiAgICAgICAgZ29zc2lwLm1heFByb3BhZ2F0aW9uQnVyc3RMYXRlbmN5O1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAubWF4UHJvcGFnYXRpb25CdXJzdFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG1heCBwcm9wYWdhdGlvbiBidXJzdCBzaXplOiAke2dvc3NpcC5tYXhQcm9wYWdhdGlvbkJ1cnN0U2l6ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5tYXhQcm9wYWdhdGlvbkJ1cnN0U2l6ZSA9XG4gICAgICAgIGdvc3NpcC5tYXhQcm9wYWdhdGlvbkJ1cnN0U2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnByb3BhZ2F0ZUl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHByb3BhZ2F0ZSBpdGVyYXRpb25zOiAke2dvc3NpcC5wcm9wYWdhdGVJdGVyYXRpb25zfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnByb3BhZ2F0ZUl0ZXJhdGlvbnMgPVxuICAgICAgICBnb3NzaXAucHJvcGFnYXRlSXRlcmF0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnByb3BhZ2F0ZVBlZXJOdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHByb3BhZ2F0ZSBwZWVyIG51bWJlcjogJHtnb3NzaXAucHJvcGFnYXRlUGVlck51bX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wcm9wYWdhdGVQZWVyTnVtID0gZ29zc2lwLnByb3BhZ2F0ZVBlZXJOdW07XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5wdWxsSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcHVsbCBpbnRlcnZhbDogJHtnb3NzaXAucHVsbEludGVydmFsfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdWxsSW50ZXJ2YWwgPSBnb3NzaXAucHVsbEludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucHVsbFBlZXJOdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcHVsbCBwZWVyIG51bWJlcjogJHtnb3NzaXAucHVsbFBlZXJOdW19YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB1bGxQZWVyTnVtID0gZ29zc2lwLnB1bGxQZWVyTnVtO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucmVxdWVzdFN0YXRlSW5mb0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyByZXF1ZXN0IHN0YXRlIGluZm8gaW50ZXJ2YWw6ICR7Z29zc2lwLnJlcXVlc3RTdGF0ZUluZm9JbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5yZXF1ZXN0U3RhdGVJbmZvSW50ZXJ2YWwgPVxuICAgICAgICBnb3NzaXAucmVxdWVzdFN0YXRlSW5mb0ludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucHVibGlzaFN0YXRlSW5mb0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwdWJsaXNoIHN0YXRlIGluZm8gaW50ZXJ2YWw6ICR7Z29zc2lwLnB1Ymxpc2hTdGF0ZUluZm9JbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdWJsaXNoU3RhdGVJbmZvSW50ZXJ2YWwgPVxuICAgICAgICBnb3NzaXAucHVibGlzaFN0YXRlSW5mb0ludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAuc3RhdGVJbmZvUmV0ZW50aW9uSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHN0YXRlIGluZm8gcmV0ZW50aW9uIGludGVydmFsOiAke2dvc3NpcC5zdGF0ZUluZm9SZXRlbnRpb25JbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5zdGF0ZUluZm9SZXRlbnRpb25JbnRlcnZhbCA9XG4gICAgICAgIGdvc3NpcC5zdGF0ZUluZm9SZXRlbnRpb25JbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnB1Ymxpc2hDZXJ0UGVyaW9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBwdWJsaXNoIGNlcnQgcGVyaW9kOiAke2dvc3NpcC5wdWJsaXNoQ2VydFBlcmlvZH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdWJsaXNoQ2VydFBlcmlvZCA9IGdvc3NpcC5wdWJsaXNoQ2VydFBlcmlvZDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnNraXBCbG9ja1ZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgc2tpcCBibG9jayB2ZXJpZmljYXRpb25zOiAke2dvc3NpcC5za2lwQmxvY2tWZXJpZmljYXRpb259YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc2tpcEJsb2NrVmVyaWZpY2F0aW9uID1cbiAgICAgICAgZ29zc2lwLnNraXBCbG9ja1ZlcmlmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLmRpYWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRpYWwgdGltZW91dDogJHtnb3NzaXAuZGlhbFRpbWVvdXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmRpYWxUaW1lb3V0ID0gZ29zc2lwLmRpYWxUaW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAuY29ublRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29ubmVjdGlvbiB0aW1lb3V0OiAke2dvc3NpcC5jb25uVGltZW91dH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuY29ublRpbWVvdXQgPSBnb3NzaXAuY29ublRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5yZWN2QnVmZlNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcmVjZWl2ZSBidWZmZXIgc2l6ZTogJHtnb3NzaXAucmVjdkJ1ZmZTaXplfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5yZWN2QnVmZlNpemUgPSBnb3NzaXAucmVjdkJ1ZmZTaXplO1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAuc2VuZEJ1ZmZTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHNlbmQgYnVmZmVyIHNpemU6ICR7Z29zc2lwLnNlbmRCdWZmU2l6ZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc2VuZEJ1ZmZTaXplID0gZ29zc2lwLnNlbmRCdWZmU2l6ZTtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLmRpZ2VzdFdhaXRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRpZ2VzdCB3YWl0IHRpbWU6ICR7Z29zc2lwLmRpZ2VzdFdhaXRUaW1lfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5kaWdlc3RXYWl0VGltZSA9IGdvc3NpcC5kaWdlc3RXYWl0VGltZTtcbiAgICB9XG4gICAgaWYgKGdvc3NpcC5yZXF1ZXN0V2FpdFRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcmVxdWVzdCB3YWl0IHRpbWU6ICR7Z29zc2lwLnJlcXVlc3RXYWl0VGltZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucmVxdWVzdFdhaXRUaW1lID0gZ29zc2lwLnJlcXVlc3RXYWl0VGltZTtcbiAgICB9XG4gICAgaWYgKGdvc3NpcC5yZXNwb25zZVdhaXRUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHJlc3BvbnNlIHdhaXQgdGltZTogJHtnb3NzaXAucmVzcG9uc2VXYWl0VGltZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucmVzcG9uc2VXYWl0VGltZSA9IGdvc3NpcC5yZXNwb25zZVdhaXRUaW1lO1xuICAgIH1cbiAgICBpZiAoZ29zc2lwLmFsaXZlVGltZUludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBhbGl2ZSB0aW1lIGludGVydmFsOiAke2dvc3NpcC5hbGl2ZVRpbWVJbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5hbGl2ZVRpbWVJbnRlcnZhbCA9IGdvc3NpcC5hbGl2ZVRpbWVJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKGdvc3NpcC5hbGl2ZUV4cGlyYXRpb25UaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBhbGl2ZSBleHBpcmF0aW9uIHRpbWVvdXQ6ICR7Z29zc2lwLmFsaXZlRXhwaXJhdGlvblRpbWVvdXR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuYWxpdmVFeHBpcmF0aW9uVGltZW91dCA9XG4gICAgICAgIGdvc3NpcC5hbGl2ZUV4cGlyYXRpb25UaW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChnb3NzaXAucmVjb25uZWN0SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcmVjb25uZWN0IGludGVydmFsOiAke2dvc3NpcC5yZWNvbm5lY3RJbnRlcnZhbH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucmVjb25uZWN0SW50ZXJ2YWwgPSBnb3NzaXAucmVjb25uZWN0SW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5tYXhDb25uZWN0aW9uQXR0ZW1wdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG1heGltdW0gY29ubmVjdGlvbiBhdHRlbXB0czogJHtnb3NzaXAubWF4Q29ubmVjdGlvbkF0dGVtcHRzfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm1heENvbm5lY3Rpb25BdHRlbXB0cyA9XG4gICAgICAgIGdvc3NpcC5tYXhDb25uZWN0aW9uQXR0ZW1wdHM7XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5tc2dFeHBpcmF0aW9uRmFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtZXNzYWdlIGV4cGlyYXRpb24gZmFjdG9yOiAke2dvc3NpcC5tc2dFeHBpcmF0aW9uRmFjdG9yfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLm1zZ0V4cGlyYXRpb25GYWN0b3IgPVxuICAgICAgICBnb3NzaXAubXNnRXhwaXJhdGlvbkZhY3RvcjtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLmV4dGVybmFsRW5kcG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgZXh0ZXJuYWwgZW5kcG9pbnQ6ICR7Z29zc2lwLmV4dGVybmFsRW5kcG9pbnR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmV4dGVybmFsRW5kcG9pbnQgPSBnb3NzaXAuZXh0ZXJuYWxFbmRwb2ludDtcbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLmVsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVsZWN0aW9uID0gZ29zc2lwLmVsZWN0aW9uO1xuXG4gICAgICBpZiAoZWxlY3Rpb24uc3RhcnR1cEdyYWNlUGVyaW9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgc3RhcnR1cCBncmFjZSBwZXJpb2Q6ICR7ZWxlY3Rpb24uc3RhcnR1cEdyYWNlUGVyaW9kfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5lbGVjdGlvbiEuc3RhcnR1cEdyYWNlUGVyaW9kID1cbiAgICAgICAgICBlbGVjdGlvbi5zdGFydHVwR3JhY2VQZXJpb2Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVjdGlvbi5tZW1iZXJzaGlwU2FtcGxlSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtZW1iZXJzaGlwIHNhbXBsZSBpbnRlcnZhbDogJHtlbGVjdGlvbi5tZW1iZXJzaGlwU2FtcGxlSW50ZXJ2YWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLmVsZWN0aW9uIS5tZW1iZXJzaGlwU2FtcGxlSW50ZXJ2YWwgPVxuICAgICAgICAgIGVsZWN0aW9uLm1lbWJlcnNoaXBTYW1wbGVJbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZWN0aW9uLmxlYWRlckFsaXZlVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbGVhZGVyIGFsaXZlIHRocmVzaG9sZDogJHtlbGVjdGlvbi5sZWFkZXJBbGl2ZVRocmVzaG9sZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuZWxlY3Rpb24hLmxlYWRlckFsaXZlVGhyZXNob2xkID1cbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJBbGl2ZVRocmVzaG9sZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZWN0aW9uLmxlYWRlckVsZWN0aW9uRHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBsZWFkZXIgZWxlY3Rpb24gZHVyYXRpb246ICR7ZWxlY3Rpb24ubGVhZGVyRWxlY3Rpb25EdXJhdGlvbn1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuZWxlY3Rpb24hLmxlYWRlckVsZWN0aW9uRHVyYXRpb24gPVxuICAgICAgICAgIGVsZWN0aW9uLmxlYWRlckVsZWN0aW9uRHVyYXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdvc3NpcC5wdnREYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHB2dERhdGEgPSBnb3NzaXAucHZ0RGF0YTtcblxuICAgICAgaWYgKHB2dERhdGEucHVsbFJldHJ5VGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgcHVsbCByZXRyeSB0aHJlc2hvbGQ6ICR7cHZ0RGF0YS5wdWxsUmV0cnlUaHJlc2hvbGR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnB1bGxSZXRyeVRocmVzaG9sZCA9XG4gICAgICAgICAgcHZ0RGF0YS5wdWxsUmV0cnlUaHJlc2hvbGQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLnRyYW5zaWVudHN0b3JlTWF4QmxvY2tSZXRlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyB0cmFuc2llbnRzdG9yZSBtYXggYmxvY2sgcmV0ZW50aW9uOiAke3B2dERhdGEudHJhbnNpZW50c3RvcmVNYXhCbG9ja1JldGVudGlvbn1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEudHJhbnNpZW50c3RvcmVNYXhCbG9ja1JldGVudGlvbiA9XG4gICAgICAgICAgcHZ0RGF0YS50cmFuc2llbnRzdG9yZU1heEJsb2NrUmV0ZW50aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocHZ0RGF0YS5wdXNoQWNrVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHB1c2ggYWNrIHRpbWVvdXQ6ICR7cHZ0RGF0YS5wdXNoQWNrVGltZW91dH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5wdXNoQWNrVGltZW91dCA9XG4gICAgICAgICAgcHZ0RGF0YS5wdXNoQWNrVGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEuYnRsUHVsbE1hcmdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGJ0bCBwdWxsIG1hcmdpbjogJHtwdnREYXRhLmJ0bFB1bGxNYXJnaW59YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEuYnRsUHVsbE1hcmdpbiA9XG4gICAgICAgICAgcHZ0RGF0YS5idGxQdWxsTWFyZ2luO1xuICAgICAgfVxuXG4gICAgICBpZiAocHZ0RGF0YS5yZWNvbmNpbGVCYXRjaFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyByZWNvbmNpbGUgYmF0Y2ggc2l6ZTogJHtwdnREYXRhLnJlY29uY2lsZUJhdGNoU2l6ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEucmVjb25jaWxlQmF0Y2hTaXplID1cbiAgICAgICAgICBwdnREYXRhLnJlY29uY2lsZUJhdGNoU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEucmVjb25jaWxlU2xlZXBJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHJlY29uY2lsZSBzbGVlcCBpbnRlcnZhbDogJHtwdnREYXRhLnJlY29uY2lsZVNsZWVwSW50ZXJ2YWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnJlY29uY2lsZVNsZWVwSW50ZXJ2YWwgPVxuICAgICAgICAgIHB2dERhdGEucmVjb25jaWxlU2xlZXBJbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEucmVjb25jaWxpYXRpb25FbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgcmVjb25jaWxpYXRpb24gZW5hYmxlZDogJHtwdnREYXRhLnJlY29uY2lsaWF0aW9uRW5hYmxlZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEucHZ0RGF0YSEucmVjb25jaWxpYXRpb25FbmFibGVkID1cbiAgICAgICAgICBwdnREYXRhLnJlY29uY2lsaWF0aW9uRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHB2dERhdGEuc2tpcFB1bGxpbmdJbnZhbGlkVHJhbnNhY3Rpb25zRHVyaW5nQ29tbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgc2tpcCBwdWxsaW5nIGludmFsaWQgdHJhbnNhY3Rpb25zIGR1cmluZyBjb21taXQ6ICR7cHZ0RGF0YS5za2lwUHVsbGluZ0ludmFsaWRUcmFuc2FjdGlvbnNEdXJpbmdDb21taXR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLnNraXBQdWxsaW5nSW52YWxpZFRyYW5zYWN0aW9uc0R1cmluZ0NvbW1pdCA9XG4gICAgICAgICAgcHZ0RGF0YS5za2lwUHVsbGluZ0ludmFsaWRUcmFuc2FjdGlvbnNEdXJpbmdDb21taXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdnREYXRhLmltcGxpY2l0Q29sbGVjdGlvbkRpc3NlbWluYXRpb25Qb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocHZ0RGF0YS5pbXBsaWNpdENvbGxlY3Rpb25EaXNzZW1pbmF0aW9uUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBpbXAgPSBwdnREYXRhLmltcGxpY2l0Q29sbGVjdGlvbkRpc3NlbWluYXRpb25Qb2xpY3k7XG5cbiAgICAgICAgICBpZiAoaW1wLm1heFBlZXJDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgaW1wbGljaXQgY29sbGVjdGlvbiBkaXNzZW1pbmF0aW9uIHBvbGljeSBtYXggcGVlciBjb3VudDogJHtpbXAubWF4UGVlckNvdW50fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnB2dERhdGEhLmltcGxpY2l0Q29sbGVjdGlvbkRpc3NlbWluYXRpb25Qb2xpY3khLm1heFBlZXJDb3VudCA9XG4gICAgICAgICAgICAgIGltcC5tYXhQZWVyQ291bnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGltcC5yZXF1aXJlZFBlZXJDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgaW1wbGljaXQgY29sbGVjdGlvbiBkaXNzZW1pbmF0aW9uIHBvbGljeSByZXF1aXJlZCBwZWVyIGNvdW50OiAke2ltcC5yZXF1aXJlZFBlZXJDb3VudH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5wdnREYXRhIS5pbXBsaWNpdENvbGxlY3Rpb25EaXNzZW1pbmF0aW9uUG9saWN5IS5yZXF1aXJlZFBlZXJDb3VudCA9XG4gICAgICAgICAgICAgIGltcC5yZXF1aXJlZFBlZXJDb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ29zc2lwLnN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0ID0gZ29zc2lwLnN0YXRlO1xuXG4gICAgICBpZiAoc3QuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHN0YXRlIGVuYWJsZWQ6ICR7c3QuZW5hYmxlZH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5zdGF0ZSEuZW5hYmxlZCA9IHN0LmVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdC5jaGVja0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhdGUgY2hlY2sgaW50ZXJ2YWw6ICR7c3QuY2hlY2tJbnRlcnZhbH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5zdGF0ZSEuY2hlY2tJbnRlcnZhbCA9IHN0LmNoZWNrSW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdC5yZXNwb25zZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGF0ZSByZXNwb25zZSB0aW1lb3V0OiAke3N0LnJlc3BvbnNlVGltZW91dH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEuZ29zc2lwIS5zdGF0ZSEucmVzcG9uc2VUaW1lb3V0ID0gc3QucmVzcG9uc2VUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3QuYmF0Y2hTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgc3RhdGUgYmF0Y2ggc2l6ZTogJHtzdC5iYXRjaFNpemV9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGUhLmJhdGNoU2l6ZSA9IHN0LmJhdGNoU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0LmJsb2NrQnVmZmVyU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIHN0YXRlIGJsb2NrIGJ1ZmZlciBzaXplOiAke3N0LmJsb2NrQnVmZmVyU2l6ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdvc3NpcCEuc3RhdGUhLmJsb2NrQnVmZmVyU2l6ZSA9IHN0LmJsb2NrQnVmZmVyU2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0Lm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGF0ZSBtYXggcmV0cmllczogJHtzdC5tYXhSZXRyaWVzfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nb3NzaXAhLnN0YXRlIS5tYXhSZXRyaWVzID0gc3QubWF4UmV0cmllcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRMUyh0bHM/OiBUTFNDb25maWcpOiB0aGlzIHtcbiAgICBpZiAodGxzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHRscy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBlbmFibGVkOiAke3Rscy5lbmFibGVkfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5lbmFibGVkID0gdGxzLmVuYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRscy5jbGllbnRBdXRoUmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGNsaWVudCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZDogJHt0bHMuY2xpZW50QXV0aFJlcXVpcmVkfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS50bHMhLmNsaWVudEF1dGhSZXF1aXJlZCA9IHRscy5jbGllbnRBdXRoUmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRscy5jZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMuY2VydC5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGNlcnQgZmlsZTogJHt0bHMuY2VydC5maWxlfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS50bHMhLmNlcnQhLmZpbGUgPSB0bHMuY2VydC5maWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0bHMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMua2V5LmZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMga2V5IGZpbGU6ICR7dGxzLmtleS5maWxlfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS50bHMhLmtleSEuZmlsZSA9IHRscy5rZXkuZmlsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGxzLnJvb3RjZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMucm9vdGNlcnQuZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyByb290Y2VydCBmaWxlOiAke3Rscy5yb290Y2VydC5maWxlfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS50bHMhLnJvb3RjZXJ0IS5maWxlID0gdGxzLnJvb3RjZXJ0LmZpbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRscy5jbGllbnRSb290Q0FzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMuY2xpZW50Um9vdENBcy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIFRMUyBjbGllbnQgcm9vdCBDQXMgZmlsZXM6ICR7dGxzLmNsaWVudFJvb3RDQXMuZmlsZXMuam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5jbGllbnRSb290Q0FzIS5maWxlcyA9IHRscy5jbGllbnRSb290Q0FzLmZpbGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0bHMuY2xpZW50S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMuY2xpZW50S2V5LmZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgY2xpZW50IGtleSBmaWxlOiAke3Rscy5jbGllbnRLZXkuZmlsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5jbGllbnRLZXkhLmZpbGUgPSB0bHMuY2xpZW50S2V5LmZpbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRscy5jbGllbnRDZXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMuY2xpZW50Q2VydC5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGNsaWVudCBjZXJ0IGZpbGU6ICR7dGxzLmNsaWVudENlcnQuZmlsZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEudGxzIS5jbGllbnRDZXJ0IS5maWxlID0gdGxzLmNsaWVudENlcnQuZmlsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGF1dGhlbnRpY2F0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYXV0aGVudGljYXRpb24gdGltZSB3aW5kb3c6ICR7YXV0aGVudGljYXRpb259YCk7XG4gICAgdGhpcy5jb25maWcucGVlciEuYXV0aGVudGljYXRpb24hLnRpbWV3aW5kb3cgPSBhdXRoZW50aWNhdGlvbjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0S2VlcEFsaWNlKGtlZXBBbGljZT86IEtlZXBBbGl2ZUNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChrZWVwQWxpY2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoa2VlcEFsaWNlLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGtlZXAtYWxpdmUgaW50ZXJ2YWw6ICR7a2VlcEFsaWNlLmludGVydmFsfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS5pbnRlcnZhbCA9IGtlZXBBbGljZS5pbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpZiAoa2VlcEFsaWNlLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcga2VlcC1hbGl2ZSB0aW1lb3V0OiAke2tlZXBBbGljZS50aW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS50aW1lb3V0ID0ga2VlcEFsaWNlLnRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGljZS5taW5JbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgbWluaW11bSBrZWVwLWFsaXZlIGludGVydmFsOiAke2tlZXBBbGljZS5taW5JbnRlcnZhbH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS5taW5JbnRlcnZhbCA9IGtlZXBBbGljZS5taW5JbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKGtlZXBBbGljZS5jbGllbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGtlZXBBbGljZS5jbGllbnQuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBjbGllbnQga2VlcC1hbGl2ZSBpbnRlcnZhbDogJHtrZWVwQWxpY2UuY2xpZW50LmludGVydmFsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS5jbGllbnQhLmludGVydmFsID1cbiAgICAgICAgICBrZWVwQWxpY2UuY2xpZW50LmludGVydmFsO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2VlcEFsaWNlLmNsaWVudC50aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgY2xpZW50IGtlZXAtYWxpdmUgdGltZW91dDogJHtrZWVwQWxpY2UuY2xpZW50LnRpbWVvdXR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5rZWVwYWxpdmUhLmNsaWVudCEudGltZW91dCA9IGtlZXBBbGljZS5jbGllbnQudGltZW91dDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtlZXBBbGljZS5kZWxpdmVyeUNsaWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoa2VlcEFsaWNlLmRlbGl2ZXJ5Q2xpZW50LmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgZGVsaXZlcnkgY2xpZW50IGtlZXAtYWxpdmUgaW50ZXJ2YWw6ICR7a2VlcEFsaWNlLmRlbGl2ZXJ5Q2xpZW50LmludGVydmFsfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcucGVlciEua2VlcGFsaXZlIS5kZWxpdmVyeUNsaWVudCEuaW50ZXJ2YWwgPVxuICAgICAgICAgIGtlZXBBbGljZS5kZWxpdmVyeUNsaWVudC5pbnRlcnZhbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGtlZXBBbGljZS5kZWxpdmVyeUNsaWVudC50aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgZGVsaXZlcnkgY2xpZW50IGtlZXAtYWxpdmUgdGltZW91dDogJHtrZWVwQWxpY2UuZGVsaXZlcnlDbGllbnQudGltZW91dH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmtlZXBhbGl2ZSEuZGVsaXZlcnlDbGllbnQhLnRpbWVvdXQgPVxuICAgICAgICAgIGtlZXBBbGljZS5kZWxpdmVyeUNsaWVudC50aW1lb3V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0R2F0ZXdheShnYXRld2F5PzogR2F0ZXdheUNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChnYXRld2F5ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGdhdGV3YXkuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBnYXRld2F5IGVuYWJsZWQ6ICR7Z2F0ZXdheS5lbmFibGVkfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ2F0ZXdheSEuZW5hYmxlZCA9IGdhdGV3YXkuZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpZiAoZ2F0ZXdheS5lbmRvcnNlbWVudFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGVuZG9yc2VtZW50IHRpbWVvdXQ6ICR7Z2F0ZXdheS5lbmRvcnNlbWVudFRpbWVvdXR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmdhdGV3YXkhLmVuZG9yc2VtZW50VGltZW91dCA9XG4gICAgICAgIGdhdGV3YXkuZW5kb3JzZW1lbnRUaW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChnYXRld2F5LmJyb2FkY2FzdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYnJvYWRjYXN0IHRpbWVvdXQ6ICR7Z2F0ZXdheS5icm9hZGNhc3RUaW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZ2F0ZXdheSEuYnJvYWRjYXN0VGltZW91dCA9IGdhdGV3YXkuYnJvYWRjYXN0VGltZW91dDtcbiAgICB9XG4gICAgaWYgKGdhdGV3YXkuZGlhbFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgZGlhbCB0aW1lb3V0OiAke2dhdGV3YXkuZGlhbFRpbWVvdXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5nYXRld2F5IS5kaWFsVGltZW91dCA9IGdhdGV3YXkuZGlhbFRpbWVvdXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0R2VuZXJhbChnZW5lcmFsPzogR2VuZXJhbENvbmZpZyk6IHRoaXMge1xuICAgIGlmIChnZW5lcmFsID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGdlbmVyYWwudmFsaWRhdG9yUG9vbFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHZhbGlkYXRvciBwb29sIHNpemU6ICR7Z2VuZXJhbC52YWxpZGF0b3JQb29sU2l6ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEudmFsaWRhdG9yUG9vbFNpemUgPSBnZW5lcmFsLnZhbGlkYXRvclBvb2xTaXplO1xuICAgIH1cblxuICAgIGlmIChnZW5lcmFsLmZpbGVTeXN0ZW1QYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGZpbGUgc3lzdGVtIHBhdGg6ICR7Z2VuZXJhbC5maWxlU3lzdGVtUGF0aH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmZpbGVTeXN0ZW1QYXRoID0gZ2VuZXJhbC5maWxlU3lzdGVtUGF0aDtcbiAgICB9XG4gICAgaWYgKGdlbmVyYWwuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcGVlciBJRDogJHtnZW5lcmFsLmlkfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuaWQgPSBnZW5lcmFsLmlkO1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhbC5uZXR3b3JrSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbmV0d29yayBJRDogJHtnZW5lcmFsLm5ldHdvcmtJZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLm5ldHdvcmtJZCA9IGdlbmVyYWwubmV0d29ya0lkO1xuICAgIH1cbiAgICBpZiAoZ2VuZXJhbC5saXN0ZW5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxpc3RlbiBhZGRyZXNzOiAke2dlbmVyYWwubGlzdGVuQWRkcmVzc31gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmxpc3RlbkFkZHJlc3MgPSBnZW5lcmFsLmxpc3RlbkFkZHJlc3M7XG4gICAgfVxuICAgIGlmIChnZW5lcmFsLmNoYWluY29kZUxpc3RlbkFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGNoYWluY29kZSBsaXN0ZW4gYWRkcmVzczogJHtnZW5lcmFsLmNoYWluY29kZUxpc3RlbkFkZHJlc3N9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmNoYWluY29kZUxpc3RlbkFkZHJlc3MgPSBnZW5lcmFsLmNoYWluY29kZUxpc3RlbkFkZHJlc3M7XG4gICAgfVxuICAgIGlmIChnZW5lcmFsLmNoYWluY29kZUFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhaW5jb2RlIGFkZHJlc3M6ICR7Z2VuZXJhbC5jaGFpbmNvZGVBZGRyZXNzfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuY2hhaW5jb2RlQWRkcmVzcyA9IGdlbmVyYWwuY2hhaW5jb2RlQWRkcmVzcztcbiAgICB9XG4gICAgaWYgKGdlbmVyYWwuYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwZWVyIGFkZHJlc3M6ICR7Z2VuZXJhbC5hZGRyZXNzfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuYWRkcmVzcyA9IGdlbmVyYWwuYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKGdlbmVyYWwuYWRkcmVzc0F1dG9EZXRlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGFkZHJlc3MgYXV0by1kZXRlY3QgdG8gJHtnZW5lcmFsLmFkZHJlc3NBdXRvRGV0ZWN0fWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5hZGRyZXNzQXV0b0RldGVjdCA9IGdlbmVyYWwuYWRkcmVzc0F1dG9EZXRlY3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRCQ0NTUChiY2NzcD86IEJDQ1NQQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGJjY3NwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChiY2NzcC5EZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgZGVmYXVsdCB0byAke2JjY3NwLkRlZmF1bHR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5EZWZhdWx0ID0gYmNjc3AuRGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmIChiY2NzcC5TVyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChiY2NzcC5TVy5IYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBTVyBoYXNoIHRvICR7YmNjc3AuU1cuSGFzaH1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuU1chLkhhc2ggPSBiY2NzcC5TVy5IYXNoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5TVy5TZWN1cml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgU1cgc2VjdXJpdHkgdG8gJHtiY2NzcC5TVy5TZWN1cml0eX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuU1chLlNlY3VyaXR5ID0gYmNjc3AuU1cuU2VjdXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlNXLkZpbGVLZXlTdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGJjY3NwLlNXLkZpbGVLZXlTdG9yZS5LZXlTdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgU1cgRmlsZUtleVN0b3JlIGtleSBzdG9yZSB0byAke2JjY3NwLlNXLkZpbGVLZXlTdG9yZS5LZXlTdG9yZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlNXIS5GaWxlS2V5U3RvcmUhLktleVN0b3JlID1cbiAgICAgICAgICAgICAgYmNjc3AuU1cuRmlsZUtleVN0b3JlLktleVN0b3JlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYmNjc3AuUEtDUzExICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5MaWJyYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBsaWJyYXJ5IHRvICR7YmNjc3AuUEtDUzExLkxpYnJhcnl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuTGlicmFyeSA9IGJjY3NwLlBLQ1MxMS5MaWJyYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuTGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBsYWJlbCB0byAke2JjY3NwLlBLQ1MxMS5MYWJlbH1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuUEtDUzExIS5MYWJlbCA9IGJjY3NwLlBLQ1MxMS5MYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLlBpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgUEtDUzExIHBpbiB0byAke2JjY3NwLlBLQ1MxMS5QaW59YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuUGluID0gYmNjc3AuUEtDUzExLlBpbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLkhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIFBLQ1MxMSBoYXNoIHRvICR7YmNjc3AuUEtDUzExLkhhc2h9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuSGFzaCA9IGJjY3NwLlBLQ1MxMS5IYXNoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuU2VjdXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIHNlY3VyaXR5IHRvICR7YmNjc3AuUEtDUzExLlNlY3VyaXR5fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLlNlY3VyaXR5ID0gYmNjc3AuUEtDUzExLlNlY3VyaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5Tb2Z0d2FyZVZlcmlmeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEgc29mdHdhcmUgdmVyaWZ5IHRvICR7YmNjc3AuUEtDUzExLlNvZnR3YXJlVmVyaWZ5fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLkJDQ1NQIS5QS0NTMTEhLlNvZnR3YXJlVmVyaWZ5ID1cbiAgICAgICAgICAgIGJjY3NwLlBLQ1MxMS5Tb2Z0d2FyZVZlcmlmeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLkltbXV0YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEgaW1tdXRhYmxlIHRvICR7YmNjc3AuUEtDUzExLkltbXV0YWJsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuUEtDUzExIS5JbW11dGFibGUgPSBiY2NzcC5QS0NTMTEuSW1tdXRhYmxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuQWx0SUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIGFsdCBJRCB0byAke2JjY3NwLlBLQ1MxMS5BbHRJRH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5CQ0NTUCEuUEtDUzExIS5BbHRJRCA9IGJjY3NwLlBLQ1MxMS5BbHRJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLktleUlkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEga2V5IElEcyB0byAke2JjY3NwLlBLQ1MxMS5LZXlJZHN9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuQkNDU1AhLlBLQ1MxMSEuS2V5SWRzID0gYmNjc3AuUEtDUzExLktleUlkcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TXNwQ29uZmlnKG1zcENvbmZpZz86IE1TUENvbmZpZyk6IHRoaXMge1xuICAgIGlmIChtc3BDb25maWcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobXNwQ29uZmlnLmxvY2FsTXNwVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsb2NhbCBNU1AgdHlwZSB0byAke21zcENvbmZpZy5sb2NhbE1zcFR5cGV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5sb2NhbE1zcFR5cGUgPSBtc3BDb25maWcubG9jYWxNc3BUeXBlO1xuICAgIH1cbiAgICBpZiAobXNwQ29uZmlnLm1zcENvbmZpZ1BhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgTVNQIGNvbmZpZyBwYXRoIHRvICR7bXNwQ29uZmlnLm1zcENvbmZpZ1BhdGh9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5tc3BDb25maWdQYXRoID0gbXNwQ29uZmlnLm1zcENvbmZpZ1BhdGg7XG4gICAgfVxuICAgIGlmIChtc3BDb25maWcubG9jYWxNc3BJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsb2NhbCBNU1AgSUQgdG8gJHttc3BDb25maWcubG9jYWxNc3BJZH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmxvY2FsTXNwSWQgPSBtc3BDb25maWcubG9jYWxNc3BJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENvbm5UaW1lb3V0Q2xpZW50KGNvbm5UaW1lb3V0Q2xpZW50Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbm5UaW1lb3V0Q2xpZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBjb25uZWN0aW9uIHRpbWVvdXQgY2xpZW50IHRvICR7Y29ublRpbWVvdXRDbGllbnR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmNsaWVudCEuY29ublRpbWVvdXQgPSBjb25uVGltZW91dENsaWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERlbGl2ZXJ5Q2xpZW50KGRlbGl2ZXJ5Q2xpZW50PzogRGVsaXZlcnlDbGllbnRDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoZGVsaXZlcnlDbGllbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoZGVsaXZlcnlDbGllbnQuYWRkcmVzc092ZXJyaWRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYWRkcmVzcyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkoZGVsaXZlcnlDbGllbnQuYWRkcmVzc092ZXJyaWRlcyl9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRlbGl2ZXJ5Y2xpZW50IS5hZGRyZXNzT3ZlcnJpZGVzID1cbiAgICAgICAgZGVsaXZlcnlDbGllbnQuYWRkcmVzc092ZXJyaWRlcztcbiAgICB9XG5cbiAgICBpZiAoZGVsaXZlcnlDbGllbnQuYmxvY2tHb3NzaXBFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBibG9jayBnb3NzaXAgZW5hYmxlZCB0byAke2RlbGl2ZXJ5Q2xpZW50LmJsb2NrR29zc2lwRW5hYmxlZH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZGVsaXZlcnljbGllbnQhLmJsb2NrR29zc2lwRW5hYmxlZCA9XG4gICAgICAgIGRlbGl2ZXJ5Q2xpZW50LmJsb2NrR29zc2lwRW5hYmxlZDtcbiAgICB9XG5cbiAgICBpZiAoZGVsaXZlcnlDbGllbnQucmVjb25uZWN0VG90YWxUaW1lVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyByZWNvbm5lY3QgdG90YWwgdGltZSB0aHJlc2hvbGQgdG8gJHtkZWxpdmVyeUNsaWVudC5yZWNvbm5lY3RUb3RhbFRpbWVUaHJlc2hvbGR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRlbGl2ZXJ5Y2xpZW50IS5yZWNvbm5lY3RUb3RhbFRpbWVUaHJlc2hvbGQgPVxuICAgICAgICBkZWxpdmVyeUNsaWVudC5yZWNvbm5lY3RUb3RhbFRpbWVUaHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgaWYgKGRlbGl2ZXJ5Q2xpZW50LmNvbm5UaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBjb25uZWN0aW9uIHRpbWVvdXQgdG8gJHtkZWxpdmVyeUNsaWVudC5jb25uVGltZW91dH1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZGVsaXZlcnljbGllbnQhLmNvbm5UaW1lb3V0ID1cbiAgICAgICAgZGVsaXZlcnlDbGllbnQuY29ublRpbWVvdXQ7XG4gICAgfVxuICAgIGlmIChkZWxpdmVyeUNsaWVudC5yZUNvbm5lY3RCYWNrb2ZmVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyByZWNvbm5lY3QgYmFja29mZiB0aHJlc2hvbGQgdG8gJHtkZWxpdmVyeUNsaWVudC5yZUNvbm5lY3RCYWNrb2ZmVGhyZXNob2xkfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5kZWxpdmVyeWNsaWVudCEucmVDb25uZWN0QmFja29mZlRocmVzaG9sZCA9XG4gICAgICAgIGRlbGl2ZXJ5Q2xpZW50LnJlQ29ubmVjdEJhY2tvZmZUaHJlc2hvbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBQcm9maWxlQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKHByb2ZpbGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAocHJvZmlsZS5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHByb2ZpbGUgdG8gJHtwcm9maWxlLmVuYWJsZWR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5wcm9maWxlID0gcHJvZmlsZTtcbiAgICB9XG4gICAgaWYgKHByb2ZpbGUubGlzdGVuQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsaXN0ZW4gYWRkcmVzcyB0byAke3Byb2ZpbGUubGlzdGVuQWRkcmVzc31gKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLnByb2ZpbGUhLmxpc3RlbkFkZHJlc3MgPSBwcm9maWxlLmxpc3RlbkFkZHJlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRIYW5kbGVycyhoYW5kbGVycz86IEhhbmRsZXJzQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGhhbmRsZXJzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGhhbmRsZXJzLmF1dGhGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBhdXRoIGZpbHRlcnM6ICR7SlNPTi5zdHJpbmdpZnkoaGFuZGxlcnMuYXV0aEZpbHRlcnMpfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5wZWVyIS5oYW5kbGVycyEuYXV0aEZpbHRlcnMgPSBoYW5kbGVycy5hdXRoRmlsdGVycztcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlcnMuZGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgZGVjb3JhdG9yczogJHtKU09OLnN0cmluZ2lmeShoYW5kbGVycy5kZWNvcmF0b3JzKX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuaGFuZGxlcnMhLmRlY29yYXRvcnMgPSBoYW5kbGVycy5kZWNvcmF0b3JzO1xuICAgIH1cbiAgICBpZiAoaGFuZGxlcnMuZW5kb3JzZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVjc3MgPSBoYW5kbGVycy5lbmRvcnNlcnMuZXNjYztcblxuICAgICAgaWYgKGVjc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZWNzcy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBFU0NDIG5hbWU6ICR7ZWNzcy5uYW1lfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmhhbmRsZXJzIS5lbmRvcnNlcnMhLmVzY2MhLm5hbWUgPSBlY3NzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVjc3MubGlicmFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgRVNDQyBsaWJyYXJ5OiAke2Vjc3MubGlicmFyeX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5oYW5kbGVycyEuZW5kb3JzZXJzIS5lc2NjIS5saWJyYXJ5ID0gZWNzcy5saWJyYXJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXJzLnZhbGlkYXRvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdnNjYyA9IGhhbmRsZXJzLnZhbGlkYXRvcnMudnNjYztcblxuICAgICAgaWYgKHZzY2MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodnNjYy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBWU0NDIG5hbWU6ICR7dnNjYy5uYW1lfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmhhbmRsZXJzIS52YWxpZGF0b3JzIS52c2NjIS5uYW1lID0gdnNjYy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2c2NjLmxpYnJhcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFZTQ0MgbGlicmFyeTogJHt2c2NjLmxpYnJhcnl9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcucGVlciEuaGFuZGxlcnMhLnZhbGlkYXRvcnMhLnZzY2MhLmxpYnJhcnkgPSB2c2NjLmxpYnJhcnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERpc2NvdmVyeShkaXNjb3Zlcnk/OiBEaXNjb3ZlcnlDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoZGlzY292ZXJ5ID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGRpc2NvdmVyeS5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGRpc2NvdmVyeSBlbmFibGVkOiAke2Rpc2NvdmVyeS5lbmFibGVkfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZGlzY292ZXJ5IS5lbmFibGVkID0gZGlzY292ZXJ5LmVuYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKGRpc2NvdmVyeS5hdXRoQ2FjaGVFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBhdXRoIGNhY2hlIGVuYWJsZWQ6ICR7ZGlzY292ZXJ5LmF1dGhDYWNoZUVuYWJsZWR9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRpc2NvdmVyeSEuYXV0aENhY2hlRW5hYmxlZCA9XG4gICAgICAgIGRpc2NvdmVyeS5hdXRoQ2FjaGVFbmFibGVkO1xuICAgIH1cblxuICAgIGlmIChkaXNjb3ZlcnkuYXV0aENhY2hlTWF4U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYXV0aCBjYWNoZSBtYXggc2l6ZTogJHtkaXNjb3ZlcnkuYXV0aENhY2hlTWF4U2l6ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEuZGlzY292ZXJ5IS5hdXRoQ2FjaGVNYXhTaXplID1cbiAgICAgICAgZGlzY292ZXJ5LmF1dGhDYWNoZU1heFNpemU7XG4gICAgfVxuICAgIGlmIChkaXNjb3ZlcnkuYXV0aENhY2hlUHVyZ2VSZXRlbnRpb25SYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgYXV0aCBjYWNoZSBwdXJnZSByZXRlbnRpb24gcmF0aW86ICR7ZGlzY292ZXJ5LmF1dGhDYWNoZVB1cmdlUmV0ZW50aW9uUmF0aW99YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRpc2NvdmVyeSEuYXV0aENhY2hlUHVyZ2VSZXRlbnRpb25SYXRpbyA9XG4gICAgICAgIGRpc2NvdmVyeS5hdXRoQ2FjaGVQdXJnZVJldGVudGlvblJhdGlvO1xuICAgIH1cbiAgICBpZiAoZGlzY292ZXJ5Lm9yZ01lbWJlcnNBbGxvd2VkQWNjZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBvcmcgbWVtYmVycyBhbGxvd2VkIGFjY2VzczogJHtkaXNjb3Zlcnkub3JnTWVtYmVyc0FsbG93ZWRBY2Nlc3N9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmRpc2NvdmVyeSEub3JnTWVtYmVyc0FsbG93ZWRBY2Nlc3MgPVxuICAgICAgICBkaXNjb3Zlcnkub3JnTWVtYmVyc0FsbG93ZWRBY2Nlc3M7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGltaXRzKGxpbWl0cz86IExpbWl0c0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChsaW1pdHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGltaXRzLmNvbmN1cnJlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gbGltaXRzLmNvbmN1cnJlbmN5O1xuXG4gICAgICBpZiAoY29uY3VycmVuY3kuZGVsaXZlclNlcnZpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBkZWxpdmVyIHNlcnZpY2UgY29uY3VycmVuY3k6ICR7Y29uY3VycmVuY3kuZGVsaXZlclNlcnZpY2V9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5saW1pdHMhLmNvbmN1cnJlbmN5IS5kZWxpdmVyU2VydmljZSA9XG4gICAgICAgICAgY29uY3VycmVuY3kuZGVsaXZlclNlcnZpY2U7XG4gICAgICB9XG4gICAgICBpZiAoY29uY3VycmVuY3kuZ2F0ZXdheVNlcnZpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBnYXRld2F5IHNlcnZpY2UgY29uY3VycmVuY3k6ICR7Y29uY3VycmVuY3kuZ2F0ZXdheVNlcnZpY2V9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5wZWVyIS5saW1pdHMhLmNvbmN1cnJlbmN5IS5nYXRld2F5U2VydmljZSA9XG4gICAgICAgICAgY29uY3VycmVuY3kuZ2F0ZXdheVNlcnZpY2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25jdXJyZW5jeS5lbmRvcnNlclNlcnZpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBlbmRvcnNlciBzZXJ2aWNlIGNvbmN1cnJlbmN5OiAke2NvbmN1cnJlbmN5LmVuZG9yc2VyU2VydmljZX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLnBlZXIhLmxpbWl0cyEuY29uY3VycmVuY3khLmVuZG9yc2VyU2VydmljZSA9XG4gICAgICAgICAgY29uY3VycmVuY3kuZW5kb3JzZXJTZXJ2aWNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWVzc2FnZVNpemUoc2l6ZT86IE1TR1NpemVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChzaXplLm1heFJlY3ZNc2dTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBtYXggcmVjZWl2ZSBtZXNzYWdlIHNpemU6ICR7c2l6ZS5tYXhSZWN2TXNnU2l6ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEubWF4UmVjdk1zZ1NpemUgPSBzaXplLm1heFJlY3ZNc2dTaXplO1xuICAgIH1cblxuICAgIGlmIChzaXplLm1heFNlbmRNc2dTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIG1heCBzZW5kIG1lc3NhZ2Ugc2l6ZTogJHtzaXplLm1heFNlbmRNc2dTaXplfWApO1xuICAgICAgdGhpcy5jb25maWcucGVlciEubWF4U2VuZE1zZ1NpemUgPSBzaXplLm1heFNlbmRNc2dTaXplO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hhaW5jb2RlKGNoYWluY29kZT86IENoYWluY29kZUNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChjaGFpbmNvZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoY2hhaW5jb2RlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjaGFpbmNvZGUuaWQucGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBwYXRoOiAke2NoYWluY29kZS5pZC5wYXRofWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmlkIS5wYXRoID0gY2hhaW5jb2RlLmlkLnBhdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFpbmNvZGUuaWQubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBuYW1lOiAke2NoYWluY29kZS5pZC5uYW1lfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmlkIS5uYW1lID0gY2hhaW5jb2RlLmlkLm5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5idWlsZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBidWlsZGVyOiAke2NoYWluY29kZS5idWlsZGVyfWApO1xuICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5idWlsZGVyID0gY2hhaW5jb2RlLmJ1aWxkZXI7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5wdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBwdWxsOiAke2NoYWluY29kZS5wdWxsfWApO1xuICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5wdWxsID0gY2hhaW5jb2RlLnB1bGw7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5nb2xhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ29sYW5nID0gY2hhaW5jb2RlLmdvbGFuZztcblxuICAgICAgaWYgKGdvbGFuZy5ydW50aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgR28gcnVudGltZTogJHtnb2xhbmcucnVudGltZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5nb2xhbmchLnJ1bnRpbWUgPSBnb2xhbmcucnVudGltZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdvbGFuZy5keW5hbWljTGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEdvIGR5bmFtaWMgbGluazogJHtnb2xhbmcuZHluYW1pY0xpbmt9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuZ29sYW5nIS5keW5hbWljTGluayA9IGdvbGFuZy5keW5hbWljTGluaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLmphdmEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgamF2YSA9IGNoYWluY29kZS5qYXZhO1xuXG4gICAgICBpZiAoamF2YS5ydW50aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgSmF2YSBydW50aW1lOiAke2phdmEucnVudGltZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5qYXZhIS5ydW50aW1lID0gamF2YS5ydW50aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUubm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBub2RlID0gY2hhaW5jb2RlLm5vZGU7XG5cbiAgICAgIGlmIChub2RlLnJ1bnRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBOb2RlIHJ1bnRpbWU6ICR7bm9kZS5ydW50aW1lfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLm5vZGUhLnJ1bnRpbWUgPSBub2RlLnJ1bnRpbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5leHRlcm5hbEJ1aWxkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBleHRlcm5hbCBidWlsZGVyczogJHtjaGFpbmNvZGUuZXh0ZXJuYWxCdWlsZGVycy5sZW5ndGh9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuZXh0ZXJuYWxCdWlsZGVycyA9IGNoYWluY29kZS5leHRlcm5hbEJ1aWxkZXJzO1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUuaW5zdGFsbFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgaW5zdGFsbCB0aW1lb3V0OiAke2NoYWluY29kZS5pbnN0YWxsVGltZW91dH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEuaW5zdGFsbFRpbWVvdXQgPSBjaGFpbmNvZGUuaW5zdGFsbFRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluY29kZS5zdGFydHVwdGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGFydHVwIHRpbWVvdXQ6ICR7Y2hhaW5jb2RlLnN0YXJ0dXB0aW1lb3V0fWApO1xuICAgICAgdGhpcy5jb25maWcuY2hhaW5jb2RlIS5zdGFydHVwdGltZW91dCA9IGNoYWluY29kZS5zdGFydHVwdGltZW91dDtcbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLmV4ZWN1dGV0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGV4ZWN1dGUgdGltZW91dDogJHtjaGFpbmNvZGUuZXhlY3V0ZXRpbWVvdXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmV4ZWN1dGV0aW1lb3V0ID0gY2hhaW5jb2RlLmV4ZWN1dGV0aW1lb3V0O1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFpbmNvZGUgbW9kZTogJHtjaGFpbmNvZGUubW9kZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEubW9kZSA9IGNoYWluY29kZS5tb2RlO1xuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNoYWluY29kZSBrZWVwYWxpdmU6ICR7Y2hhaW5jb2RlLmtlZXBhbGl2ZX1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEua2VlcGFsaXZlID0gY2hhaW5jb2RlLmtlZXBhbGl2ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhaW5jb2RlLnN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzeXN0ZW0gPSBjaGFpbmNvZGUuc3lzdGVtO1xuXG4gICAgICBpZiAoc3lzdGVtLl9saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzeXN0ZW0gbGlmZWN5Y2xlOiAke3N5c3RlbS5fbGlmZWN5Y2xlfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLnN5c3RlbSEuX2xpZmVjeWNsZSA9IHN5c3RlbS5fbGlmZWN5Y2xlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3lzdGVtLmNzY2MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDU0NDOiAke3N5c3RlbS5jc2NjfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLnN5c3RlbSEuX2xpZmVjeWNsZSA9IHN5c3RlbS5jc2NjO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3lzdGVtLmxzY2MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBMU0NDOiAke3N5c3RlbS5sc2NjfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLnN5c3RlbSEuX2xpZmVjeWNsZSA9IHN5c3RlbS5sc2NjO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3lzdGVtLnFzY2MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBRU0NDOiAke3N5c3RlbS5xc2NjfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLnN5c3RlbSEuX2xpZmVjeWNsZSA9IHN5c3RlbS5xc2NjO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFpbmNvZGUubG9nZ2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsb2dnaW5nID0gY2hhaW5jb2RlLmxvZ2dpbmc7XG5cbiAgICAgIGlmIChsb2dnaW5nLmxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbG9nZ2luZyBsZXZlbDogJHtsb2dnaW5nLmxldmVsfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5jaGFpbmNvZGUhLmxvZ2dpbmchLmxldmVsID0gbG9nZ2luZy5sZXZlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2dpbmcuc2hpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxvZ2dpbmcgc2hpbTogJHtsb2dnaW5nLnNoaW19YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEubG9nZ2luZyEuc2hpbSA9IGxvZ2dpbmcuc2hpbTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2dpbmcuZm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbG9nZ2luZyBmb3JtYXQ6ICR7bG9nZ2luZy5mb3JtYXR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmNoYWluY29kZSEubG9nZ2luZyEuZm9ybWF0ID0gbG9nZ2luZy5mb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Vk1PcHRpb25zKG9wdGlvbnM/OiBWTUNvbmZpZyk6IHRoaXMge1xuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKG9wdGlvbnMuZW5kcG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVk0gZW5kcG9pbnQ6ICR7b3B0aW9ucy5lbmRwb2ludH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLnZtIS5lbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQ7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZG9ja2VyICE9IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZG9ja2VyID0gb3B0aW9ucy5kb2NrZXI7XG5cbiAgICAgIGlmIChkb2NrZXIudGxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGRvY2tlci50bHMuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGVuYWJsZWQ6ICR7ZG9ja2VyLnRscy5lbmFibGVkfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLnRscyEuZW5hYmxlZCA9IGRvY2tlci50bHMuZW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkb2NrZXIudGxzLmNhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoZG9ja2VyLnRscy5jYS5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBDQSBmaWxlOiAke2RvY2tlci50bHMuY2EuZmlsZX1gKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLnRscyEuY2EhLmZpbGUgPSBkb2NrZXIudGxzLmNhLmZpbGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRvY2tlci50bHMuY2VydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGRvY2tlci50bHMuY2VydC5maWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjZXJ0IGZpbGU6ICR7ZG9ja2VyLnRscy5jZXJ0LmZpbGV9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS50bHMhLmNlcnQhLmZpbGUgPSBkb2NrZXIudGxzLmNlcnQuZmlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRvY2tlci5hdHRhY2hTdGRvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBhdHRhY2ggc3Rkb3V0OiAke2RvY2tlci5hdHRhY2hTdGRvdXR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmF0dGFjaFN0ZG91dCA9IGRvY2tlci5hdHRhY2hTdGRvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkb2NrZXIuaG9zdENvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGhvc3RDb25maWcgPSBkb2NrZXIuaG9zdENvbmZpZztcblxuICAgICAgICBpZiAoaG9zdENvbmZpZy5OZXR3b3JrTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgTmV0d29ya01vZGU6ICR7aG9zdENvbmZpZy5OZXR3b3JrTW9kZX1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy52bSEuZG9ja2VyIS5ob3N0Q29uZmlnIS5OZXR3b3JrTW9kZSA9XG4gICAgICAgICAgICBob3N0Q29uZmlnLk5ldHdvcmtNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RDb25maWcuRG5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTZXR0aW5nIEROUzogJHtob3N0Q29uZmlnLkRucy5qb2luKFwiLCBcIil9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcudm0hLmRvY2tlciEuaG9zdENvbmZpZyEuRG5zID0gaG9zdENvbmZpZy5EbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG9zdENvbmZpZy5Mb2dDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGxvZ0NvbmZpZyA9IGhvc3RDb25maWcuTG9nQ29uZmlnO1xuXG4gICAgICAgICAgaWYgKGxvZ0NvbmZpZy5UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgTG9nVHlwZTogJHtsb2dDb25maWcuVHlwZX1gKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmhvc3RDb25maWchLkxvZ0NvbmZpZyEuVHlwZSA9XG4gICAgICAgICAgICAgIGxvZ0NvbmZpZy5UeXBlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsb2dDb25maWcuQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2dDb25maWcuQ29uZmlnW1wibWF4LXNpemVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgICAgICAgICAgIGBTZXR0aW5nIExvZyBtYXhTaXplOiAke2xvZ0NvbmZpZy5Db25maWdbXCJtYXgtc2l6ZVwiXX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZtIS5kb2NrZXIhLmhvc3RDb25maWchLkxvZ0NvbmZpZyEuQ29uZmlnIVtcbiAgICAgICAgICAgICAgICBcIm1heC1zaXplXCJcbiAgICAgICAgICAgICAgXSA9IGxvZ0NvbmZpZy5Db25maWdbXCJtYXgtc2l6ZVwiXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxvZ0NvbmZpZy5Db25maWdbXCJtYXgtZmlsZVwiXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oXG4gICAgICAgICAgICAgICAgYFNldHRpbmcgTG9nIG1heEZpbGU6ICR7bG9nQ29uZmlnLkNvbmZpZ1tcIm1heC1maWxlXCJdfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcudm0hLmRvY2tlciEuaG9zdENvbmZpZyEuTG9nQ29uZmlnIS5Db25maWchW1xuICAgICAgICAgICAgICAgIFwibWF4LWZpbGVcIlxuICAgICAgICAgICAgICBdID0gbG9nQ29uZmlnLkNvbmZpZ1tcIm1heC1maWxlXCJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0Q29uZmlnLk1lbW9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBNZW1vcnk6ICR7aG9zdENvbmZpZy5NZW1vcnl9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcudm0hLmRvY2tlciEuaG9zdENvbmZpZyEuTWVtb3J5ID0gaG9zdENvbmZpZy5NZW1vcnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlZGdlclN0YXRlKHN0YXRlPzogTGVkZ2VyU3RhdGVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoc3RhdGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoc3RhdGUuc3RhdGVEYXRhYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGF0ZSBkYXRhYmFzZTogJHtzdGF0ZS5zdGF0ZURhdGFiYXNlfWApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuc3RhdGVEYXRhYmFzZSA9IHN0YXRlLnN0YXRlRGF0YWJhc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnRvdGFsUXVlcnlMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyB0b3RhbCBxdWVyeSBsaW1pdDogJHtzdGF0ZS50b3RhbFF1ZXJ5TGltaXR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS50b3RhbFF1ZXJ5TGltaXQgPSBzdGF0ZS50b3RhbFF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmNvdWNoREJDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY291Y2hEQiA9IHN0YXRlLmNvdWNoREJDb25maWc7XG5cbiAgICAgIGlmIChjb3VjaERCLmNvdWNoREJBZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ291Y2hEQiBhZGRyZXNzOiAke2NvdWNoREIuY291Y2hEQkFkZHJlc3N9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLmNvdWNoREJBZGRyZXNzID1cbiAgICAgICAgICBjb3VjaERCLmNvdWNoREJBZGRyZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi51c2VybmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENvdWNoREIgdXNlcjogJHtjb3VjaERCLnVzZXJuYW1lfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS51c2VybmFtZSA9IGNvdWNoREIudXNlcm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3VjaERCLnBhc3N3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQ291Y2hEQiBwYXNzd29yZDogJHtjb3VjaERCLnBhc3N3b3JkfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5wYXNzd29yZCA9IGNvdWNoREIucGFzc3dvcmQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3VjaERCLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBDb3VjaERCIG1heCByZXRyaWVzOiAke2NvdWNoREIubWF4UmV0cmllc31gKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEubWF4UmV0cmllcyA9XG4gICAgICAgICAgY291Y2hEQi5tYXhSZXRyaWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5tYXhSZXRyaWVzT25TdGFydHVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgQ291Y2hEQiBtYXggcmV0cmllcyBvbiBzdGFydHVwOiAke2NvdWNoREIubWF4UmV0cmllc09uU3RhcnR1cH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLm1heFJldHJpZXNPblN0YXJ0dXAgPVxuICAgICAgICAgIGNvdWNoREIubWF4UmV0cmllc09uU3RhcnR1cDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvdWNoREIucmVxdWVzdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBDb3VjaERCIHJlcXVlc3QgdGltZW91dDogJHtjb3VjaERCLnJlcXVlc3RUaW1lb3V0fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEucmVxdWVzdFRpbWVvdXQgPVxuICAgICAgICAgIGNvdWNoREIucmVxdWVzdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3VjaERCLmludGVybmFsUXVlcnlMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIENvdWNoREIgaW50ZXJuYWwgcXVlcnkgbGltaXQ6ICR7Y291Y2hEQi5pbnRlcm5hbFF1ZXJ5TGltaXR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5pbnRlcm5hbFF1ZXJ5TGltaXQgPVxuICAgICAgICAgIGNvdWNoREIuaW50ZXJuYWxRdWVyeUxpbWl0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5tYXhCYXRjaFVwZGF0ZVNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBDb3VjaERCIG1heGltdW0gYmF0Y2ggdXBkYXRlIHNpemU6ICR7Y291Y2hEQi5tYXhCYXRjaFVwZGF0ZVNpemV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnN0YXRlIS5jb3VjaERCQ29uZmlnIS5tYXhCYXRjaFVwZGF0ZVNpemUgPVxuICAgICAgICAgIGNvdWNoREIubWF4QmF0Y2hVcGRhdGVTaXplO1xuICAgICAgfVxuXG4gICAgICBpZiAoY291Y2hEQi5jcmVhdGVHbG9iYWxDaGFuZ2VzREIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBDb3VjaERCIGNyZWF0ZSBnbG9iYWwgY2hhbmdlcyBkYXRhYmFzZTogJHtjb3VjaERCLmNyZWF0ZUdsb2JhbENoYW5nZXNEQn1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEuc3RhdGUhLmNvdWNoREJDb25maWchLmNyZWF0ZUdsb2JhbENoYW5nZXNEQiA9XG4gICAgICAgICAgY291Y2hEQi5jcmVhdGVHbG9iYWxDaGFuZ2VzREI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3VjaERCLmNhY2hlU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIENvdWNoREIgY2FjaGUgc2l6ZTogJHtjb3VjaERCLmNhY2hlU2l6ZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5zdGF0ZSEuY291Y2hEQkNvbmZpZyEuY2FjaGVTaXplID0gY291Y2hEQi5jYWNoZVNpemU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMZWdlckJsb2NrY2hhaW4oYmxvY2tjaGFpbj86IGFueSk6IHRoaXMge1xuICAgIGlmIChibG9ja2NoYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICBgU2V0dGluZyBsZWRnZXIgYmxvY2tjaGFpbjogJHtKU09OLnN0cmluZ2lmeShibG9ja2NoYWluKX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5ibG9ja2NoYWluID0gYmxvY2tjaGFpbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlbmFibGVMZWRnZXJIaXN0b3J5RGF0YWJhc2UoZW5hYmxlPzogYm9vbGVhbik6IHRoaXMge1xuICAgIGlmIChlbmFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbGVkZ2VyIGhpc3RvcnkgZGF0YWJhc2UgZW5hYmxlZDogJHtlbmFibGV9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLmhpc3RvcnkhLmVuYWJsZUhpc3RvcnlEYXRhYmFzZSA9IGVuYWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMZWRnZXJQdnREYXRhU3RvcmUocHZ0RGF0YT86IFByaXZhdGVEYXRhU3RvcmVDb25maWcpIHtcbiAgICBpZiAocHZ0RGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChwdnREYXRhLmNvbGxFbGdQcm9jRGJCYXRjaGVzSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHByaXZhdGUgZGF0YSBjb2xsZWN0aW9uIGVsaWdpYmlsaXR5IHByb2Nlc3MgZGF0YWJhc2UgYmF0Y2hlcyBpbnRlcnZhbDogJHtwdnREYXRhLmNvbGxFbGdQcm9jRGJCYXRjaGVzSW50ZXJ2YWx9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEucHZ0ZGF0YVN0b3JlIS5jb2xsRWxnUHJvY0RiQmF0Y2hlc0ludGVydmFsID1cbiAgICAgICAgcHZ0RGF0YS5jb2xsRWxnUHJvY0RiQmF0Y2hlc0ludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChwdnREYXRhLmNvbGxFbGdQcm9jTWF4RGJCYXRjaFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIHByaXZhdGUgZGF0YSBjb2xsZWN0aW9uIGVsaWdpYmlsaXR5IHByb2Nlc3MgbWF4aW11bSBkYXRhYmFzZSBiYXRjaCBzaXplOiAke3B2dERhdGEuY29sbEVsZ1Byb2NNYXhEYkJhdGNoU2l6ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcubGVkZ2VyIS5wdnRkYXRhU3RvcmUhLmNvbGxFbGdQcm9jTWF4RGJCYXRjaFNpemUgPVxuICAgICAgICBwdnREYXRhLmNvbGxFbGdQcm9jTWF4RGJCYXRjaFNpemU7XG4gICAgfVxuXG4gICAgaWYgKHB2dERhdGEuZGVwcmlvcml0aXplZERhdGFSZWNvbmNpbGVySW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGRlcHJpb3JpdGl6ZWQgZGF0YSByZWNvbmNpbGlhdGlvbiBpbnRlcnZhbDogJHtwdnREYXRhLmRlcHJpb3JpdGl6ZWREYXRhUmVjb25jaWxlckludGVydmFsfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnB2dGRhdGFTdG9yZSEuZGVwcmlvcml0aXplZERhdGFSZWNvbmNpbGVySW50ZXJ2YWwgPVxuICAgICAgICBwdnREYXRhLmRlcHJpb3JpdGl6ZWREYXRhUmVjb25jaWxlckludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChwdnREYXRhLnB1cmdlSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbGVkZ2VyIHB1cmdlIGludGVydmFsOiAke3B2dERhdGEucHVyZ2VJbnRlcnZhbH1gKTtcbiAgICAgIHRoaXMuY29uZmlnLmxlZGdlciEucHZ0ZGF0YVN0b3JlIS5wdXJnZUludGVydmFsID0gcHZ0RGF0YS5wdXJnZUludGVydmFsO1xuICAgIH1cblxuICAgIGlmIChwdnREYXRhLnB1cmdlZEtleUF1ZGl0TG9nZ2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgcHVyZ2VkIGtleSBhdWRpdCBsb2dnaW5nOiAke3B2dERhdGEucHVyZ2VkS2V5QXVkaXRMb2dnaW5nfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnB2dGRhdGFTdG9yZSEucHVyZ2VkS2V5QXVkaXRMb2dnaW5nID1cbiAgICAgICAgcHZ0RGF0YS5wdXJnZWRLZXlBdWRpdExvZ2dpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMZWRnZXJTbmFwc2hvdHNSb290RGlyKHJvb3REaXI/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAocm9vdERpciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsZWRnZXIgc25hcHNob3RzIHJvb3QgZGlyZWN0b3J5OiAke3Jvb3REaXJ9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5sZWRnZXIhLnNuYXBzaG90cyEucm9vdERpciA9IHJvb3REaXI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zPzogT3BlcmF0aW9uc0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChvcGVyYXRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKG9wZXJhdGlvbnMubGlzdGVuQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBsaXN0ZW4gYWRkcmVzczogJHtvcGVyYXRpb25zLmxpc3RlbkFkZHJlc3N9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLmxpc3RlbkFkZHJlc3MgPSBvcGVyYXRpb25zLmxpc3RlbkFkZHJlc3M7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25zLnRscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3BlcmF0aW9ucy50bHMuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgVExTIGVuYWJsZWQ6ICR7b3BlcmF0aW9ucy50bHMuZW5hYmxlZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm9wZXJhdGlvbnMhLnRscyEuZW5hYmxlZCA9IG9wZXJhdGlvbnMudGxzLmVuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0aW9ucy50bHMuY2VydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcGVyYXRpb25zLnRscy5jZXJ0LmZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBUTFMgY2VydCBmaWxlOiAke29wZXJhdGlvbnMudGxzLmNlcnQuZmlsZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS50bHMhLmNlcnQhLmZpbGUgPSBvcGVyYXRpb25zLnRscy5jZXJ0LmZpbGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRpb25zLnRscy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3BlcmF0aW9ucy50bHMua2V5LmZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgb3BlcmF0aW9ucyBUTFMga2V5IGZpbGU6ICR7b3BlcmF0aW9ucy50bHMua2V5LmZpbGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEudGxzIS5rZXkhLmZpbGUgPSBvcGVyYXRpb25zLnRscy5rZXkuZmlsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmNsaWVudEF1dGhSZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG9wZXJhdGlvbnMgVExTIGNsaWVudCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZDogJHtvcGVyYXRpb25zLnRscy5jbGllbnRBdXRoUmVxdWlyZWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5vcGVyYXRpb25zIS50bHMhLmNsaWVudEF1dGhSZXF1aXJlZCA9XG4gICAgICAgICAgb3BlcmF0aW9ucy50bHMuY2xpZW50QXV0aFJlcXVpcmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wZXJhdGlvbnMudGxzLmNsaWVudFJvb3RDQXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3BlcmF0aW9ucy50bHMuY2xpZW50Um9vdENBcy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIFRMUyBjbGllbnQgcm9vdCBDQXMgZmlsZXM6ICR7b3BlcmF0aW9ucy50bHMuY2xpZW50Um9vdENBcy5maWxlcy5qb2luKFxuICAgICAgICAgICAgICBcIiwgXCJcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcub3BlcmF0aW9ucyEudGxzIS5jbGllbnRSb290Q0FzIS5maWxlcyA9XG4gICAgICAgICAgICBvcGVyYXRpb25zLnRscy5jbGllbnRSb290Q0FzLmZpbGVzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TWV0cmljcyhtZXRyaWNzPzogTWV0cmljc0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChtZXRyaWNzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKG1ldHJpY3MucHJvdmlkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbWV0cmljcyBwcm92aWRlcjogJHttZXRyaWNzLnByb3ZpZGVyfWApO1xuICAgICAgdGhpcy5jb25maWcubWV0cmljcyEucHJvdmlkZXIgPSBtZXRyaWNzLnByb3ZpZGVyO1xuICAgIH1cblxuICAgIGlmIChtZXRyaWNzLnN0YXRzZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobWV0cmljcy5zdGF0c2QubmV0d29yayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG1ldHJpY3Mgc3RhdHNkIG5ldHdvcms6ICR7bWV0cmljcy5zdGF0c2QubmV0d29ya31gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm1ldHJpY3MhLnN0YXRzZCEubmV0d29yayA9IG1ldHJpY3Muc3RhdHNkLm5ldHdvcms7XG4gICAgICB9XG4gICAgICBpZiAobWV0cmljcy5zdGF0c2QuYWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG1ldHJpY3Mgc3RhdHNkIGFkZHJlc3M6ICR7bWV0cmljcy5zdGF0c2QuYWRkcmVzc31gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm1ldHJpY3MhLnN0YXRzZCEuYWRkcmVzcyA9IG1ldHJpY3Muc3RhdHNkLmFkZHJlc3M7XG4gICAgICB9XG4gICAgICBpZiAobWV0cmljcy5zdGF0c2Qud3JpdGVJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG1ldHJpY3Mgc3RhdHNkIHdyaXRlIGludGVydmFsOiAke21ldHJpY3Muc3RhdHNkLndyaXRlSW50ZXJ2YWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5tZXRyaWNzIS5zdGF0c2QhLndyaXRlSW50ZXJ2YWwgPVxuICAgICAgICAgIG1ldHJpY3Muc3RhdHNkLndyaXRlSW50ZXJ2YWw7XG4gICAgICB9XG4gICAgICBpZiAobWV0cmljcy5zdGF0c2QucHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgbWV0cmljcyBzdGF0c2QgcHJlZml4OiAke21ldHJpY3Muc3RhdHNkLnByZWZpeH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLm1ldHJpY3MhLnN0YXRzZCEucHJlZml4ID0gbWV0cmljcy5zdGF0c2QucHJlZml4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2F2ZXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBhIGZpbGUuXG4gICAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgY3VycmVudCBGYWJyaWMgQ0EgU2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gYSBZQU1MIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNwYXRoIC0gVGhlIHBhdGggd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzaG91bGQgYmUgc2F2ZWQuXG4gICAqIEByZXR1cm4ge3RoaXN9IFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmFicmljQ0FTZXJ2ZXJDb21tYW5kQnVpbGRlcigpO1xuICAgKiBidWlsZGVyLnNhdmUoJy9wYXRoL3RvL2NvbmZpZy9mYWJyaWMtY2Etc2VydmVyLnlhbWwnKTtcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQnVpbGRlciBhcyBGYWJyaWNDQVNlcnZlckNvbW1hbmRCdWlsZGVyXG4gICAqICAgcGFydGljaXBhbnQgRmlsZVN5c3RlbSBhcyBGaWxlIFN5c3RlbVxuICAgKiAgIENsaWVudC0+PkJ1aWxkZXI6IHNhdmVDb25maWcoJy9wYXRoL3RvL2NvbmZpZy9mYWJyaWMtY2Etc2VydmVyLnlhbWwnKVxuICAgKiAgIEJ1aWxkZXItPj5CdWlsZGVyOiBDaGVjayBpZiBjcGF0aCBpcyBkZWZpbmVkXG4gICAqICAgYWx0IGNwYXRoIGlzIGRlZmluZWRcbiAgICogICAgIEJ1aWxkZXItPj5GaWxlU3lzdGVtOiBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzXG4gICAqICAgICBhbHQgRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgQnVpbGRlci0+PkZpbGVTeXN0ZW06IENyZWF0ZSBkaXJlY3RvcnlcbiAgICogICAgIGVuZFxuICAgKiAgICAgQnVpbGRlci0+PkJ1aWxkZXI6IExvZyBkZWJ1ZyBtZXNzYWdlXG4gICAqICAgICBCdWlsZGVyLT4+RmlsZVN5c3RlbTogV3JpdGUgWUFNTCBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICogICBlbmRcbiAgICogICBCdWlsZGVyLS0+PkNsaWVudDogUmV0dXJuIHRoaXNcbiAgICovXG4gIHNhdmUoY3BhdGg/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoY3BhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNwYXRoKSkpXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGNwYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBpZiAoIWNwYXRoLmVuZHNXaXRoKFwiLnlhbWxcIikpIGNwYXRoID0gcGF0aC5qb2luKGNwYXRoLCBcImNvcmUueWFtbFwiKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKGBXcml0aW5nIGNvbmZpZ3VyYXRpb24gdG8gJHtjcGF0aH1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29uZmlnIGZpbGU6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcsIG51bGwsIDIpfWApO1xuICAgIHdyaXRlRmlsZVlhbWwoY3BhdGgsIHRoaXMuY29uZmlnKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=