cdk8s-plus-29
Version:
cdk8s+ is a software development framework that provides high level abstractions for authoring Kubernetes applications. cdk8s-plus-29 synthesizes Kubernetes manifests for Kubernetes 1.29.0
273 lines • 42.3 kB
JavaScript
"use strict";
var _a, _b, _c, _d;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GCEPersistentDiskPersistentVolume = exports.AzureDiskPersistentVolume = exports.AwsElasticBlockStorePersistentVolume = exports.PersistentVolumeReclaimPolicy = exports.PersistentVolume = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk8s_1 = require("cdk8s");
const constructs_1 = require("constructs");
const base = require("./base");
const k8s = require("./imports/k8s");
const pvc = require("./pvc");
const volume = require("./volume");
class ImportedPersistentVolume extends constructs_1.Construct {
constructor(scope, id, name) {
super(scope, id);
this.resourceType = 'persistentvolumes';
this._name = name;
}
get name() {
return this._name;
}
get apiVersion() {
return k8s.KubePersistentVolume.GVK.apiVersion;
}
get apiGroup() {
return '';
}
get kind() {
return k8s.KubePersistentVolume.GVK.kind;
}
get resourceName() {
return this.name;
}
}
/**
* A PersistentVolume (PV) is a piece of storage in the cluster that has been
* provisioned by an administrator or dynamically provisioned using Storage Classes.
* It is a resource in the cluster just like a node is a cluster resource.
* PVs are volume plugins like Volumes, but have a lifecycle independent of any
* individual Pod that uses the PV. This API object captures the details of the
* implementation of the storage, be that NFS, iSCSI, or a
* cloud-provider-specific storage system.
*/
class PersistentVolume extends base.Resource {
/**
* Imports a pv from the cluster as a reference.
*/
static fromPersistentVolumeName(scope, id, volumeName) {
return new ImportedPersistentVolume(scope, id, volumeName);
}
constructor(scope, id, props = {}) {
super(scope, id);
this.resourceType = 'persistentvolumes';
this.storage = props.storage;
this.mode = props.volumeMode ?? pvc.PersistentVolumeMode.FILE_SYSTEM;
this.storageClassName = props.storageClassName;
this._accessModes = props.accessModes;
this.mountOptions = props.mountOptions;
this.reclaimPolicy = props.reclaimPolicy ?? PersistentVolumeReclaimPolicy.RETAIN;
if (props.claim) {
this.bind(props.claim);
}
this.apiObject = new k8s.KubePersistentVolume(this, 'Resource', {
metadata: props.metadata,
spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }),
});
}
/**
* Access modes requirement of this claim.
*/
get accessModes() {
return this._accessModes ? [...this._accessModes] : undefined;
}
/**
* PVC this volume is bound to. Undefined means this volume is not yet
* claimed by any PVC.
*/
get claim() {
return this._claim;
}
/**
* Reserve a `PersistentVolume` by creating a `PersistentVolumeClaim`
* that is wired to claim this volume.
*
* Note that this method will throw in case the volume is already claimed.
*
* @see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reserving-a-persistentvolume
*/
reserve() {
const claim = new pvc.PersistentVolumeClaim(this, `${this.name}PVC`, {
metadata: { name: `pvc-${this.name}`, namespace: this.metadata.namespace },
// the storage classes must match, otherwise the claim
// will use the default class (or no class at all), which may be different than the class
// of this volume. note that other requirements are not needed since
// when they are not defined, any volume satisifies them.
storageClassName: this.storageClassName,
});
this.bind(claim);
claim.bind(this);
return claim;
}
/**
* Bind a volume to a specific claim.
* Note that you must also bind the claim to the volume.
*
* @see https://kubernetes.io/docs/concepts/storage/persistent-volumes/#binding
*
* @param claim The PVC to bind to.
*/
bind(claim) {
if (this._claim && this._claim.name !== claim.name) {
throw new Error(`Cannot bind volume '${this.name}' to claim '${claim.name}' since it is already bound to claim '${this._claim.name}'`);
}
this._claim = claim;
}
asVolume() {
const claim = this.reserve();
return volume.Volume.fromPersistentVolumeClaim(this, 'Volume', claim);
}
/**
* @internal
*/
_toKube() {
const storage = this.storage ? k8s.Quantity.fromString(this.storage.toGibibytes() + 'Gi') : undefined;
return {
claimRef: this._claim ? { name: this._claim?.name } : undefined,
accessModes: this.accessModes?.map(a => a.toString()),
capacity: storage ? { storage } : undefined,
mountOptions: this.mountOptions?.map(o => o),
storageClassName: this.storageClassName,
persistentVolumeReclaimPolicy: this.reclaimPolicy,
volumeMode: this.mode,
};
}
}
exports.PersistentVolume = PersistentVolume;
_a = JSII_RTTI_SYMBOL_1;
PersistentVolume[_a] = { fqn: "cdk8s-plus-29.PersistentVolume", version: "2.6.0" };
/**
* Reclaim Policies.
*/
var PersistentVolumeReclaimPolicy;
(function (PersistentVolumeReclaimPolicy) {
/**
* The Retain reclaim policy allows for manual reclamation of the resource.
* When the PersistentVolumeClaim is deleted, the PersistentVolume still exists and the
* volume is considered "released". But it is not yet available for another claim
* because the previous claimant's data remains on the volume.
* An administrator can manually reclaim the volume with the following steps:
*
* 1. Delete the PersistentVolume. The associated storage asset in external
* infrastructure (such as an AWS EBS, GCE PD, Azure Disk, or Cinder volume) still exists after the PV is deleted.
* 2. Manually clean up the data on the associated storage asset accordingly.
* 3. Manually delete the associated storage asset.
*
* If you want to reuse the same storage asset, create a new PersistentVolume
* with the same storage asset definition.
*/
PersistentVolumeReclaimPolicy["RETAIN"] = "Retain";
/**
* For volume plugins that support the Delete reclaim policy, deletion removes both the
* PersistentVolume object from Kubernetes, as well as the associated storage asset in
* the external infrastructure, such as an AWS EBS, GCE PD, Azure Disk, or Cinder volume.
* Volumes that were dynamically provisioned inherit the reclaim policy of their StorageClass, which defaults to Delete.
* The administrator should configure the StorageClass according to users' expectations; otherwise,
* the PV must be edited or patched after it is created
*/
PersistentVolumeReclaimPolicy["DELETE"] = "Delete";
})(PersistentVolumeReclaimPolicy || (exports.PersistentVolumeReclaimPolicy = PersistentVolumeReclaimPolicy = {}));
/**
* Represents an AWS Disk resource that is attached to a kubelet's host machine and
* then exposed to the pod.
*
* @see https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore
*/
class AwsElasticBlockStorePersistentVolume extends PersistentVolume {
constructor(scope, id, props) {
super(scope, id, props);
this.volumeId = props.volumeId;
this.readOnly = props.readOnly ?? false;
this.fsType = props.fsType ?? 'ext4';
this.partition = props.partition;
}
/**
* @internal
*/
_toKube() {
const spec = super._toKube();
return {
...spec,
awsElasticBlockStore: {
volumeId: this.volumeId,
fsType: this.fsType,
partition: this.partition,
readOnly: this.readOnly,
},
};
}
}
exports.AwsElasticBlockStorePersistentVolume = AwsElasticBlockStorePersistentVolume;
_b = JSII_RTTI_SYMBOL_1;
AwsElasticBlockStorePersistentVolume[_b] = { fqn: "cdk8s-plus-29.AwsElasticBlockStorePersistentVolume", version: "2.6.0" };
/**
* AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
*/
class AzureDiskPersistentVolume extends PersistentVolume {
constructor(scope, id, props) {
super(scope, id, props);
this.diskName = props.diskName;
this.diskUri = props.diskUri;
this.cachingMode = props.cachingMode ?? volume.AzureDiskPersistentVolumeCachingMode.NONE;
this.fsType = props.fsType ?? 'ext4';
this.azureKind = props.kind ?? volume.AzureDiskPersistentVolumeKind.SHARED;
this.readOnly = props.readOnly ?? false;
}
/**
* @internal
*
* @see https://github.com/kubernetes/examples/blob/master/staging/volumes/azure_disk/README.md
*/
_toKube() {
const spec = super._toKube();
return {
...spec,
azureDisk: {
diskName: this.diskName,
diskUri: this.diskUri,
cachingMode: this.cachingMode,
fsType: this.fsType,
kind: this.azureKind,
readOnly: this.readOnly,
},
};
}
}
exports.AzureDiskPersistentVolume = AzureDiskPersistentVolume;
_c = JSII_RTTI_SYMBOL_1;
AzureDiskPersistentVolume[_c] = { fqn: "cdk8s-plus-29.AzureDiskPersistentVolume", version: "2.6.0" };
/**
* GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine
* and then exposed to the pod. Provisioned by an admin.
*
* @see https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk
*/
class GCEPersistentDiskPersistentVolume extends PersistentVolume {
constructor(scope, id, props) {
super(scope, id, props);
this.pdName = props.pdName;
this.readOnly = props.readOnly ?? false;
this.fsType = props.fsType ?? 'ext4';
this.partition = props.partition;
}
/**
* @internal
*
* @see https://github.com/kubernetes/examples/blob/master/staging/volumes/azure_disk/README.md
*/
_toKube() {
const spec = super._toKube();
return {
...spec,
gcePersistentDisk: {
pdName: this.pdName,
fsType: this.fsType,
partition: this.partition,
readOnly: this.readOnly,
},
};
}
}
exports.GCEPersistentDiskPersistentVolume = GCEPersistentDiskPersistentVolume;
_d = JSII_RTTI_SYMBOL_1;
GCEPersistentDiskPersistentVolume[_d] = { fqn: "cdk8s-plus-29.GCEPersistentDiskPersistentVolume", version: "2.6.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBOEM7QUFDOUMsMkNBQXVDO0FBQ3ZDLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMsNkJBQTZCO0FBQzdCLG1DQUFtQztBQXdFbkMsTUFBTSx3QkFBeUIsU0FBUSxzQkFBUztJQU05QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLElBQVk7UUFDcEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhILGlCQUFZLEdBQUcsbUJBQW1CLENBQUM7UUFJakQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDakQsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FFRjtBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxJQUFJLENBQUMsUUFBUTtJQUVqRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxVQUFrQjtRQUNyRixPQUFPLElBQUksd0JBQXdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBeUNELFlBQXNCLEtBQWdCLEVBQUUsRUFB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LElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLGlCQUFpQixFQUFFO2dCQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEI7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUFoREgsOEVBaURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5LCBTaXplIH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBwdmMgZnJvbSAnLi9wdmMnO1xuaW1wb3J0ICogYXMgdm9sdW1lIGZyb20gJy4vdm9sdW1lJztcblxuLyoqXG4gKiBDb250cmFjdCBvZiBhIGBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQZXJzaXN0ZW50Vm9sdW1lIGV4dGVuZHMgYmFzZS5JUmVzb3VyY2Uge1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBQZXJzaXN0ZW50Vm9sdW1lYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZW50Vm9sdW1lUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBhbGwgd2F5cyB0aGUgdm9sdW1lIGNhbiBiZSBtb3VudGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI2FjY2Vzcy1tb2Rlc1xuICAgKiBAZGVmYXVsdCAtIE5vIGFjY2VzcyBtb2Rlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc01vZGVzPzogcHZjLlBlcnNpc3RlbnRWb2x1bWVBY2Nlc3NNb2RlW107XG5cbiAgLyoqXG4gICAqIFdoYXQgaXMgdGhlIHN0b3JhZ2UgY2FwYWNpdHkgb2YgdGhpcyB2b2x1bWUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjcmVzb3VyY2VzXG4gICAqIEBkZWZhdWx0IC0gTm8gc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZT86IFNpemU7XG5cbiAgLyoqXG4gICAqIFBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gUGVyc2lzdGVudFZvbHVtZSBhbmQgUGVyc2lzdGVudFZvbHVtZUNsYWltLlxuICAgKiBFeHBlY3RlZCB0byBiZSBub24tbmlsIHdoZW4gYm91bmQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS9wZXJzaXN0ZW50LXZvbHVtZXMjYmluZGluZ1xuICAgKiBAZGVmYXVsdCAtIE5vdCBib3VuZCB0byBhIHNwZWNpZmljIGNsYWltLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xhaW0/OiBwdmMuSVBlcnNpc3RlbnRWb2x1bWVDbGFpbTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1vdW50IG9wdGlvbnMsIGUuZy4gW1wicm9cIiwgXCJzb2Z0XCJdLiBOb3QgdmFsaWRhdGVkIC0gbW91bnQgd2lsbCBzaW1wbHkgZmFpbCBpZiBvbmUgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcy8jbW91bnQtb3B0aW9uc1xuICAgKiBAZGVmYXVsdCAtIE5vIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBtb3VudE9wdGlvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hlbiBhIHVzZXIgaXMgZG9uZSB3aXRoIHRoZWlyIHZvbHVtZSwgdGhleSBjYW4gZGVsZXRlIHRoZSBQVkMgb2JqZWN0cyBmcm9tIHRoZSBBUEkgdGhhdFxuICAgKiBhbGxvd3MgcmVjbGFtYXRpb24gb2YgdGhlIHJlc291cmNlLiBUaGUgcmVjbGFpbSBwb2xpY3kgdGVsbHMgdGhlIGNsdXN0ZXIgd2hhdCB0byBkbyB3aXRoXG4gICAqIHRoZSB2b2x1bWUgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVsZWFzZWQgb2YgaXRzIGNsYWltLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzI3JlY2xhaW1pbmdcbiAgICogQGRlZmF1bHQgUGVyc2lzdGVudFZvbHVtZVJlY2xhaW1Qb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSByZWNsYWltUG9saWN5PzogUGVyc2lzdGVudFZvbHVtZVJlY2xhaW1Qb2xpY3k7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgU3RvcmFnZUNsYXNzIHRvIHdoaWNoIHRoaXMgcGVyc2lzdGVudCB2b2x1bWUgYmVsb25ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBWb2x1bWUgZG9lcyBub3QgYmVsb25nIHRvIGFueSBzdG9yYWdlIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVmaW5lcyB3aGF0IHR5cGUgb2Ygdm9sdW1lIGlzIHJlcXVpcmVkIGJ5IHRoZSBjbGFpbS5cbiAgICpcbiAgICogQGRlZmF1bHQgVm9sdW1lTW9kZS5GSUxFX1NZU1RFTVxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lTW9kZT86IHB2Yy5QZXJzaXN0ZW50Vm9sdW1lTW9kZTtcblxufVxuXG5jbGFzcyBJbXBvcnRlZFBlcnNpc3RlbnRWb2x1bWUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJUGVyc2lzdGVudFZvbHVtZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZVR5cGUgPSAncGVyc2lzdGVudHZvbHVtZXMnO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBrOHMuS3ViZVBlcnNpc3RlbnRWb2x1bWUuR1ZLLmFwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUdyb3VwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIGdldCBraW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGs4cy5LdWJlUGVyc2lzdGVudFZvbHVtZS5HVksua2luZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG59XG5cbi8qKlxuICogQSBQZXJzaXN0ZW50Vm9sdW1lIChQVikgaXMgYSBwaWVjZSBvZiBzdG9yYWdlIGluIHRoZSBjbHVzdGVyIHRoYXQgaGFzIGJlZW5cbiAqIHByb3Zpc2lvbmVkIGJ5IGFuIGFkbWluaXN0cmF0b3Igb3IgZHluYW1pY2FsbHkgcHJvdmlzaW9uZWQgdXNpbmcgU3RvcmFnZSBDbGFzc2VzLlxuICogSXQgaXMgYSByZXNvdXJjZSBpbiB0aGUgY2x1c3RlciBqdXN0IGxpa2UgYSBub2RlIGlzIGEgY2x1c3RlciByZXNvdXJjZS5cbiAqIFBWcyBhcmUgdm9sdW1lIHBsdWdpbnMgbGlrZSBWb2x1bWVzLCBidXQgaGF2ZSBhIGxpZmVjeWNsZSBpbmRlcGVuZGVudCBvZiBhbnlcbiAqIGluZGl2aWR1YWwgUG9kIHRoYXQgdXNlcyB0aGUgUFYuIFRoaXMgQVBJIG9iamVjdCBjYXB0dXJlcyB0aGUgZGV0YWlscyBvZiB0aGVcbiAqIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdG9yYWdlLCBiZSB0aGF0IE5GUywgaVNDU0ksIG9yIGFcbiAqIGNsb3VkLXByb3ZpZGVyLXNwZWNpZmljIHN0b3JhZ2Ugc3lzdGVtLlxuICovXG5leHBvcnQgY2xhc3MgUGVyc2lzdGVudFZvbHVtZSBleHRlbmRzIGJhc2UuUmVzb3VyY2UgaW1wbGVtZW50cyBJUGVyc2lzdGVudFZvbHVtZSwgdm9sdW1lLklTdG9yYWdlIHtcblxuICAvKipcbiAgICogSW1wb3J0cyBhIHB2IGZyb20gdGhlIGNsdXN0ZXIgYXMgYSByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21QZXJzaXN0ZW50Vm9sdW1lTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB2b2x1bWVOYW1lOiBzdHJpbmcpOiBJUGVyc2lzdGVudFZvbHVtZSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZFBlcnNpc3RlbnRWb2x1bWUoc2NvcGUsIGlkLCB2b2x1bWVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGJhc2UuUmVzb3VyY2UuYXBpT2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpT2JqZWN0OiBBcGlPYmplY3Q7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlVHlwZSA9ICdwZXJzaXN0ZW50dm9sdW1lcyc7XG5cbiAgcHJpdmF0ZSBfY2xhaW0/OiBwdmMuSVBlcnNpc3RlbnRWb2x1bWVDbGFpbTtcblxuICAvKipcbiAgICogU3RvcmFnZSBzaXplIG9mIHRoaXMgdm9sdW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2U/OiBTaXplO1xuXG4gIC8qKlxuICAgKiBWb2x1bWUgbW9kZSBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RlOiBwdmMuUGVyc2lzdGVudFZvbHVtZU1vZGU7XG5cbiAgLyoqXG4gICAgKiBTdG9yYWdlIGNsYXNzIHRoaXMgdm9sdW1lIGJlbG9uZ3MgdG8uXG4gICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VDbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyBtb2RlcyByZXF1aXJlbWVudCBvZiB0aGlzIGNsYWltLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYWNjZXNzTW9kZXM/OiBwdmMuUGVyc2lzdGVudFZvbHVtZUFjY2Vzc01vZGVbXTtcblxuICAvKipcbiAgICogTW91bnQgb3B0aW9ucyBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb3VudE9wdGlvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUmVjbGFpbSBwb2xpY3kgb2YgdGhpcyB2b2x1bWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVjbGFpbVBvbGljeTogUGVyc2lzdGVudFZvbHVtZVJlY2xhaW1Qb2xpY3k7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQZXJzaXN0ZW50Vm9sdW1lUHJvcHMgPSB7IH0pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zdG9yYWdlID0gcHJvcHMuc3RvcmFnZTtcbiAgICB0aGlzLm1vZGUgPSBwcm9wcy52b2x1bWVNb2RlID8/IHB2Yy5QZXJzaXN0ZW50Vm9sdW1lTW9kZS5GSUxFX1NZU1RFTTtcbiAgICB0aGlzLnN0b3JhZ2VDbGFzc05hbWUgPSBwcm9wcy5zdG9yYWdlQ2xhc3NOYW1lO1xuICAgIHRoaXMuX2FjY2Vzc01vZGVzID0gcHJvcHMuYWNjZXNzTW9kZXM7XG4gICAgdGhpcy5tb3VudE9wdGlvbnMgPSBwcm9wcy5tb3VudE9wdGlvbnM7XG4gICAgdGhpcy5yZWNsYWltUG9saWN5ID0gcHJvcHMucmVjbGFpbVBvbGljeSA/PyBQZXJzaXN0ZW50Vm9sdW1lUmVjbGFpbVBvbGljeS5SRVRBSU47XG5cbiAgICBpZiAocHJvcHMuY2xhaW0pIHtcbiAgICAgIHRoaXMuYmluZChwcm9wcy5jbGFpbSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlPYmplY3QgPSBuZXcgazhzLkt1YmVQZXJzaXN0ZW50Vm9sdW1lKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG1ldGFkYXRhOiBwcm9wcy5tZXRhZGF0YSxcbiAgICAgIHNwZWM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5fdG9LdWJlKCkgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIG1vZGVzIHJlcXVpcmVtZW50IG9mIHRoaXMgY2xhaW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjY2Vzc01vZGVzKCk6IHB2Yy5QZXJzaXN0ZW50Vm9sdW1lQWNjZXNzTW9kZVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjZXNzTW9kZXMgPyBbLi4udGhpcy5fYWNjZXNzTW9kZXNdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBWQyB0aGlzIHZvbHVtZSBpcyBib3VuZCB0by4gVW5kZWZpbmVkIG1lYW5zIHRoaXMgdm9sdW1lIGlzIG5vdCB5ZXRcbiAgICogY2xhaW1lZCBieSBhbnkgUFZDLlxuICAgKi9cbiAgcHVibGljIGdldCBjbGFpbSgpOiBwdmMuSVBlcnNpc3RlbnRWb2x1bWVDbGFpbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYWltO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VydmUgYSBgUGVyc2lzdGVudFZvbHVtZWAgYnkgY3JlYXRpbmcgYSBgUGVyc2lzdGVudFZvbHVtZUNsYWltYFxuICAgKiB0aGF0IGlzIHdpcmVkIHRvIGNsYWltIHRoaXMgdm9sdW1lLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBpbiBjYXNlIHRoZSB2b2x1bWUgaXMgYWxyZWFkeSBjbGFpbWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2UvcGVyc2lzdGVudC12b2x1bWVzLyNyZXNlcnZpbmctYS1wZXJzaXN0ZW50dm9sdW1lXG4gICAqL1xuICBwdWJsaWMgcmVzZXJ2ZSgpOiBwdmMuUGVyc2lzdGVudFZvbHVtZUNsYWltIHtcbiAgICBjb25zdCBjbGFpbSA9IG5ldyBwdmMuUGVyc2lzdGVudFZvbHVtZUNsYWltKHRoaXMsIGAke3RoaXMubmFtZX1QVkNgLCB7XG4gICAgICBtZXRhZGF0YTogeyBuYW1lOiBgcHZjLSR7dGhpcy5uYW1lfWAsIG5hbWVzcGFjZTogdGhpcy5tZXRhZGF0YS5uYW1lc3BhY2UgfSxcblxuICAgICAgLy8gdGhlIHN0b3JhZ2UgY2xhc3NlcyBtdXN0IG1hdGNoLCBvdGhlcndpc2UgdGhlIGNsYWltXG4gICAgICAvLyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBjbGFzcyAob3Igbm8gY2xhc3MgYXQgYWxsKSwgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBjbGFzc1xuICAgICAgLy8gb2YgdGhpcyB2b2x1bWUuIG5vdGUgdGhhdCBvdGhlciByZXF1aXJlbWVudHMgYXJlIG5vdCBuZWVkZWQgc2luY2VcbiAgICAgIC8vIHdoZW4gdGhleSBhcmUgbm90IGRlZmluZWQsIGFueSB2b2x1bWUgc2F0aXNpZmllcyB0aGVtLlxuICAgICAgc3RvcmFnZUNsYXNzTmFtZTogdGhpcy5zdG9yYWdlQ2xhc3NOYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5iaW5kKGNsYWltKTtcbiAgICBjbGFpbS5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGNsYWltO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgYSB2b2x1bWUgdG8gYSBzcGVjaWZpYyBjbGFpbS5cbiAgICogTm90ZSB0aGF0IHlvdSBtdXN0IGFsc28gYmluZCB0aGUgY2xhaW0gdG8gdGhlIHZvbHVtZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3BlcnNpc3RlbnQtdm9sdW1lcy8jYmluZGluZ1xuICAgKlxuICAgKiBAcGFyYW0gY2xhaW0gVGhlIFBWQyB0byBiaW5kIHRvLlxuICAgKi9cbiAgcHVibGljIGJpbmQoY2xhaW06IHB2Yy5JUGVyc2lzdGVudFZvbHVtZUNsYWltKSB7XG4gICAgaWYgKHRoaXMuX2NsYWltICYmIHRoaXMuX2NsYWltLm5hbWUgIT09IGNsYWltLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGJpbmQgdm9sdW1lICcke3RoaXMubmFtZX0nIHRvIGNsYWltICcke2NsYWltLm5hbWV9JyBzaW5jZSBpdCBpcyBhbHJlYWR5IGJvdW5kIHRvIGNsYWltICcke3RoaXMuX2NsYWltLm5hbWV9J2ApO1xuICAgIH1cbiAgICB0aGlzLl9jbGFpbSA9IGNsYWltO1xuICB9XG5cbiAgcHVibGljIGFzVm9sdW1lKCk6IHZvbHVtZS5Wb2x1bWUge1xuICAgIGNvbnN0IGNsYWltID0gdGhpcy5yZXNlcnZlKCk7XG4gICAgcmV0dXJuIHZvbHVtZS5Wb2x1bWUuZnJvbVBlcnNpc3RlbnRWb2x1bWVDbGFpbSh0aGlzLCAnVm9sdW1lJywgY2xhaW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLlBlcnNpc3RlbnRWb2x1bWVTcGVjIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5zdG9yYWdlID8gazhzLlF1YW50aXR5LmZyb21TdHJpbmcodGhpcy5zdG9yYWdlLnRvR2liaWJ5dGVzKCkgKyAnR2knKSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjbGFpbVJlZjogdGhpcy5fY2xhaW0gPyB7IG5hbWU6IHRoaXMuX2NsYWltPy5uYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgICBhY2Nlc3NNb2RlczogdGhpcy5hY2Nlc3NNb2Rlcz8ubWFwKGEgPT4gYS50b1N0cmluZygpKSxcbiAgICAgIGNhcGFjaXR5OiBzdG9yYWdlID8geyBzdG9yYWdlIH0gOiB1bmRlZmluZWQsXG4gICAgICBtb3VudE9wdGlvbnM6IHRoaXMubW91bnRPcHRpb25zPy5tYXAobyA9PiBvKSxcbiAgICAgIHN0b3JhZ2VDbGFzc05hbWU6IHRoaXMuc3RvcmFnZUNsYXNzTmFtZSxcbiAgICAgIHBlcnNpc3RlbnRWb2x1bWVSZWNsYWltUG9saWN5OiB0aGlzLnJlY2xhaW1Qb2xpY3ksXG4gICAgICB2b2x1bWVNb2RlOiB0aGlzLm1vZGUsXG4gICAgfTtcbiAgfVxuXG59XG5cbi8qKlxuICogUmVjbGFpbSBQb2xpY2llcy5cbiAqL1xuZXhwb3J0IGVudW0gUGVyc2lzdGVudFZvbHVtZVJlY2xhaW1Qb2xpY3kge1xuXG4gIC8qKlxuICAgKiBUaGUgUmV0YWluIHJlY2xhaW0gcG9saWN5IGFsbG93cyBmb3IgbWFudWFsIHJlY2xhbWF0aW9uIG9mIHRoZSByZXNvdXJjZS5cbiAgICogV2hlbiB0aGUgUGVyc2lzdGVudFZvbHVtZUNsYWltIGlzIGRlbGV0ZWQsIHRoZSBQZXJzaXN0ZW50Vm9sdW1lIHN0aWxsIGV4aXN0cyBhbmQgdGhlXG4gICAqIHZvbHVtZSBpcyBjb25zaWRlcmVkIFwicmVsZWFzZWRcIi4gQnV0IGl0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciBhbm90aGVyIGNsYWltXG4gICAqIGJlY2F1c2UgdGhlIHByZXZpb3VzIGNsYWltYW50J3MgZGF0YSByZW1haW5zIG9uIHRoZSB2b2x1bWUuXG4gICAqIEFuIGFkbWluaXN0cmF0b3IgY2FuIG1hbnVhbGx5IHJlY2xhaW0gdGhlIHZvbHVtZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAqXG4gICAqIDEuIERlbGV0ZSB0aGUgUGVyc2lzdGVudFZvbHVtZS4gVGhlIGFzc29jaWF0ZWQgc3RvcmFnZSBhc3NldCBpbiBleHRlcm5hbFxuICAgKiAgICBpbmZyYXN0cnVjdHVyZSAoc3VjaCBhcyBhbiBBV1MgRUJTLCBHQ0UgUEQsIEF6dXJlIERpc2ssIG9yIENpbmRlciB2b2x1bWUpIHN0aWxsIGV4aXN0cyBhZnRlciB0aGUgUFYgaXMgZGVsZXRlZC5cbiAgICogMi4gTWFudWFsbHkgY2xlYW4gdXAgdGhlIGRhdGEgb24gdGhlIGFzc29jaWF0ZWQgc3RvcmFnZSBhc3NldCBhY2NvcmRpbmdseS5cbiAgICogMy4gTWFudWFsbHkgZGVsZXRlIHRoZSBhc3NvY2lhdGVkIHN0b3JhZ2UgYXNzZXQuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHJldXNlIHRoZSBzYW1lIHN0b3JhZ2UgYXNzZXQsIGNyZWF0ZSBhIG5ldyBQZXJzaXN0ZW50Vm9sdW1lXG4gICAqIHdpdGggdGhlIHNhbWUgc3RvcmFnZSBhc3NldCBkZWZpbml0aW9uLlxuICAgKi9cbiAgUkVUQUlOID0gJ1JldGFpbicsXG5cbiAgLyoqXG4gICAqIEZvciB2b2x1bWUgcGx1Z2lucyB0aGF0IHN1cHBvcnQgdGhlIERlbGV0ZSByZWNsYWltIHBvbGljeSwgZGVsZXRpb24gcmVtb3ZlcyBib3RoIHRoZVxuICAgKiBQZXJzaXN0ZW50Vm9sdW1lIG9iamVjdCBmcm9tIEt1YmVybmV0ZXMsIGFzIHdlbGwgYXMgdGhlIGFzc29jaWF0ZWQgc3RvcmFnZSBhc3NldCBpblxuICAgKiB0aGUgZXh0ZXJuYWwgaW5mcmFzdHJ1Y3R1cmUsIHN1Y2ggYXMgYW4gQVdTIEVCUywgR0NFIFBELCBBenVyZSBEaXNrLCBvciBDaW5kZXIgdm9sdW1lLlxuICAgKiBWb2x1bWVzIHRoYXQgd2VyZSBkeW5hbWljYWxseSBwcm92aXNpb25lZCBpbmhlcml0IHRoZSByZWNsYWltIHBvbGljeSBvZiB0aGVpciBTdG9yYWdlQ2xhc3MsIHdoaWNoIGRlZmF1bHRzIHRvIERlbGV0ZS5cbiAgICogVGhlIGFkbWluaXN0cmF0b3Igc2hvdWxkIGNvbmZpZ3VyZSB0aGUgU3RvcmFnZUNsYXNzIGFjY29yZGluZyB0byB1c2VycycgZXhwZWN0YXRpb25zOyBvdGhlcndpc2UsXG4gICAqIHRoZSBQViBtdXN0IGJlIGVkaXRlZCBvciBwYXRjaGVkIGFmdGVyIGl0IGlzIGNyZWF0ZWRcbiAgICovXG4gIERFTEVURSA9ICdEZWxldGUnLFxuXG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYEF3c0VsYXN0aWNCbG9ja1N0b3JlUGVyc2lzdGVudFZvbHVtZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzRWxhc3RpY0Jsb2NrU3RvcmVQZXJzaXN0ZW50Vm9sdW1lUHJvcHMgZXh0ZW5kcyBQZXJzaXN0ZW50Vm9sdW1lUHJvcHMge1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgSUQgb2YgdGhlIHBlcnNpc3RlbnQgZGlzayByZXNvdXJjZSBpbiBBV1MgKEFtYXpvbiBFQlMgdm9sdW1lKS4gTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGVzeXN0ZW0gdHlwZSBvZiB0aGUgdm9sdW1lIHRoYXQgeW91IHdhbnQgdG8gbW91bnQuXG4gICAqIFRpcDogRW5zdXJlIHRoYXQgdGhlIGZpbGVzeXN0ZW0gdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICogQGRlZmF1bHQgJ2V4dDQnXG4gICAqL1xuICByZWFkb25seSBmc1R5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAgKiBUaGUgcGFydGl0aW9uIGluIHRoZSB2b2x1bWUgdGhhdCB5b3Ugd2FudCB0byBtb3VudC4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgdG8gbW91bnQgYnkgdm9sdW1lIG5hbWUuXG4gICAgKiBFeGFtcGxlczogRm9yIHZvbHVtZSAvZGV2L3NkYTEsIHlvdSBzcGVjaWZ5IHRoZSBwYXJ0aXRpb24gYXMgXCIxXCIuXG4gICAgKiBTaW1pbGFybHksIHRoZSB2b2x1bWUgcGFydGl0aW9uIGZvciAvZGV2L3NkYSBpcyBcIjBcIiAob3IgeW91IGNhbiBsZWF2ZSB0aGUgcHJvcGVydHkgZW1wdHkpLlxuICAgICpcbiAgICAqIEBkZWZhdWx0IC0gTm8gcGFydGl0aW9uLlxuICAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IG51bWJlcjtcblxuICAvKipcbiAgICAqIFNwZWNpZnkgXCJ0cnVlXCIgdG8gZm9yY2UgYW5kIHNldCB0aGUgUmVhZE9ubHkgcHJvcGVydHkgaW4gVm9sdW1lTW91bnRzIHRvIFwidHJ1ZVwiLlxuICAgICpcbiAgICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2F3c2VsYXN0aWNibG9ja3N0b3JlXG4gICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICovXG4gIHJlYWRvbmx5IHJlYWRPbmx5PzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gQVdTIERpc2sgcmVzb3VyY2UgdGhhdCBpcyBhdHRhY2hlZCB0byBhIGt1YmVsZXQncyBob3N0IG1hY2hpbmUgYW5kXG4gKiB0aGVuIGV4cG9zZWQgdG8gdGhlIHBvZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNhd3NlbGFzdGljYmxvY2tzdG9yZVxuICovXG5leHBvcnQgY2xhc3MgQXdzRWxhc3RpY0Jsb2NrU3RvcmVQZXJzaXN0ZW50Vm9sdW1lIGV4dGVuZHMgUGVyc2lzdGVudFZvbHVtZSB7XG5cbiAgLyoqXG4gICAqIFZvbHVtZSBpZCBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2b2x1bWVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBpdCBpcyBtb3VudGVkIGFzIGEgcmVhZC1vbmx5IHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFkT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRmlsZSBzeXN0ZW0gdHlwZSBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmc1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogUGFydGl0aW9uIG9mIHRoaXMgdm9sdW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbj86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzRWxhc3RpY0Jsb2NrU3RvcmVQZXJzaXN0ZW50Vm9sdW1lUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMudm9sdW1lSWQgPSBwcm9wcy52b2x1bWVJZDtcbiAgICB0aGlzLnJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHkgPz8gZmFsc2U7XG4gICAgdGhpcy5mc1R5cGUgPSBwcm9wcy5mc1R5cGUgPz8gJ2V4dDQnO1xuICAgIHRoaXMucGFydGl0aW9uID0gcHJvcHMucGFydGl0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLlBlcnNpc3RlbnRWb2x1bWVTcGVjIHtcbiAgICBjb25zdCBzcGVjID0gc3VwZXIuX3RvS3ViZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zcGVjLFxuICAgICAgYXdzRWxhc3RpY0Jsb2NrU3RvcmU6IHtcbiAgICAgICAgdm9sdW1lSWQ6IHRoaXMudm9sdW1lSWQsXG4gICAgICAgIGZzVHlwZTogdGhpcy5mc1R5cGUsXG4gICAgICAgIHBhcnRpdGlvbjogdGhpcy5wYXJ0aXRpb24sXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYEF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVQcm9wcyBleHRlbmRzIFBlcnNpc3RlbnRWb2x1bWVQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFRoZSBOYW1lIG9mIHRoZSBkYXRhIGRpc2sgaW4gdGhlIGJsb2Igc3RvcmFnZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlza05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSSSB0aGUgZGF0YSBkaXNrIGluIHRoZSBibG9iIHN0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2tVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogSG9zdCBDYWNoaW5nIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXp1cmVEaXNrUGVyc2lzdGVudFZvbHVtZUNhY2hpbmdNb2RlLk5PTkUuXG4gICAqL1xuICByZWFkb25seSBjYWNoaW5nTW9kZT86IHZvbHVtZS5BenVyZURpc2tQZXJzaXN0ZW50Vm9sdW1lQ2FjaGluZ01vZGU7XG5cbiAgLyoqXG4gICAgKiBGaWxlc3lzdGVtIHR5cGUgdG8gbW91bnQuIE11c3QgYmUgYSBmaWxlc3lzdGVtIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uXG4gICAgKlxuICAgICogQGRlZmF1bHQgJ2V4dDQnXG4gICAgKi9cbiAgcmVhZG9ubHkgZnNUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgICogS2luZCBvZiBkaXNrLlxuICAgICpcbiAgICAqIEBkZWZhdWx0IEF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVLaW5kLlNIQVJFRFxuICAgICovXG4gIHJlYWRvbmx5IGtpbmQ/OiB2b2x1bWUuQXp1cmVEaXNrUGVyc2lzdGVudFZvbHVtZUtpbmQ7XG5cbiAgLyoqXG4gICAgKiBGb3JjZSB0aGUgUmVhZE9ubHkgc2V0dGluZyBpbiBWb2x1bWVNb3VudHMuXG4gICAgKlxuICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBBenVyZURpc2sgcmVwcmVzZW50cyBhbiBBenVyZSBEYXRhIERpc2sgbW91bnQgb24gdGhlIGhvc3QgYW5kIGJpbmQgbW91bnQgdG8gdGhlIHBvZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWUgZXh0ZW5kcyBQZXJzaXN0ZW50Vm9sdW1lIHtcblxuICAvKipcbiAgICogRGlzayBuYW1lIG9mIHRoaXMgdm9sdW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2sgVVJJIG9mIHRoaXMgdm9sdW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc2tVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgaXQgaXMgbW91bnRlZCBhcyBhIHJlYWQtb25seSB2b2x1bWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhY2hpbmcgbW9kZSBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYWNoaW5nTW9kZTogdm9sdW1lLkF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVDYWNoaW5nTW9kZTtcblxuICAvKipcbiAgICogRmlsZSBzeXN0ZW0gdHlwZSBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmc1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogQXp1cmUga2luZCBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhenVyZUtpbmQ6IHZvbHVtZS5BenVyZURpc2tQZXJzaXN0ZW50Vm9sdW1lS2luZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXp1cmVEaXNrUGVyc2lzdGVudFZvbHVtZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmRpc2tOYW1lID0gcHJvcHMuZGlza05hbWU7XG4gICAgdGhpcy5kaXNrVXJpID0gcHJvcHMuZGlza1VyaTtcbiAgICB0aGlzLmNhY2hpbmdNb2RlID0gcHJvcHMuY2FjaGluZ01vZGUgPz8gdm9sdW1lLkF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVDYWNoaW5nTW9kZS5OT05FO1xuICAgIHRoaXMuZnNUeXBlID0gcHJvcHMuZnNUeXBlID8/ICdleHQ0JztcbiAgICB0aGlzLmF6dXJlS2luZCA9IHByb3BzLmtpbmQgPz8gdm9sdW1lLkF6dXJlRGlza1BlcnNpc3RlbnRWb2x1bWVLaW5kLlNIQVJFRDtcbiAgICB0aGlzLnJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2t1YmVybmV0ZXMvZXhhbXBsZXMvYmxvYi9tYXN0ZXIvc3RhZ2luZy92b2x1bWVzL2F6dXJlX2Rpc2svUkVBRE1FLm1kXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuUGVyc2lzdGVudFZvbHVtZVNwZWMge1xuICAgIGNvbnN0IHNwZWMgPSBzdXBlci5fdG9LdWJlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNwZWMsXG4gICAgICBhenVyZURpc2s6IHtcbiAgICAgICAgZGlza05hbWU6IHRoaXMuZGlza05hbWUsXG4gICAgICAgIGRpc2tVcmk6IHRoaXMuZGlza1VyaSxcbiAgICAgICAgY2FjaGluZ01vZGU6IHRoaXMuY2FjaGluZ01vZGUsXG4gICAgICAgIGZzVHlwZTogdGhpcy5mc1R5cGUsXG4gICAgICAgIGtpbmQ6IHRoaXMuYXp1cmVLaW5kLFxuICAgICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBHQ0VQZXJzaXN0ZW50RGlza1BlcnNpc3RlbnRWb2x1bWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdDRVBlcnNpc3RlbnREaXNrUGVyc2lzdGVudFZvbHVtZVByb3BzIGV4dGVuZHMgUGVyc2lzdGVudFZvbHVtZVByb3BzIHtcblxuICAvKipcbiAgICogVW5pcXVlIG5hbWUgb2YgdGhlIFBEIHJlc291cmNlIGluIEdDRS4gVXNlZCB0byBpZGVudGlmeSB0aGUgZGlzayBpbiBHQ0UuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc3RvcmFnZS92b2x1bWVzI2djZXBlcnNpc3RlbnRkaXNrXG4gICAqL1xuICByZWFkb25seSBwZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZXN5c3RlbSB0eXBlIG9mIHRoZSB2b2x1bWUgdGhhdCB5b3Ugd2FudCB0byBtb3VudC5cbiAgICogVGlwOiBFbnN1cmUgdGhhdCB0aGUgZmlsZXN5c3RlbSB0eXBlIGlzIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNhd3NlbGFzdGljYmxvY2tzdG9yZVxuICAgKiBAZGVmYXVsdCAnZXh0NCdcbiAgICovXG4gIHJlYWRvbmx5IGZzVHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiBpbiB0aGUgdm9sdW1lIHRoYXQgeW91IHdhbnQgdG8gbW91bnQuIElmIG9taXR0ZWQsIHRoZSBkZWZhdWx0IGlzIHRvIG1vdW50IGJ5IHZvbHVtZSBuYW1lLlxuICAgKiBFeGFtcGxlczogRm9yIHZvbHVtZSAvZGV2L3NkYTEsIHlvdSBzcGVjaWZ5IHRoZSBwYXJ0aXRpb24gYXMgXCIxXCIuXG4gICAqIFNpbWlsYXJseSwgdGhlIHZvbHVtZSBwYXJ0aXRpb24gZm9yIC9kZXYvc2RhIGlzIFwiMFwiIChvciB5b3UgY2FuIGxlYXZlIHRoZSBwcm9wZXJ0eSBlbXB0eSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcGFydGl0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IFwidHJ1ZVwiIHRvIGZvcmNlIGFuZCBzZXQgdGhlIFJlYWRPbmx5IHByb3BlcnR5IGluIFZvbHVtZU1vdW50cyB0byBcInRydWVcIi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zdG9yYWdlL3ZvbHVtZXMjYXdzZWxhc3RpY2Jsb2Nrc3RvcmVcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRPbmx5PzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEdDRVBlcnNpc3RlbnREaXNrIHJlcHJlc2VudHMgYSBHQ0UgRGlzayByZXNvdXJjZSB0aGF0IGlzIGF0dGFjaGVkIHRvIGEga3ViZWxldCdzIGhvc3QgbWFjaGluZVxuICogYW5kIHRoZW4gZXhwb3NlZCB0byB0aGUgcG9kLiBQcm92aXNpb25lZCBieSBhbiBhZG1pbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3N0b3JhZ2Uvdm9sdW1lcyNnY2VwZXJzaXN0ZW50ZGlza1xuICovXG5leHBvcnQgY2xhc3MgR0NFUGVyc2lzdGVudERpc2tQZXJzaXN0ZW50Vm9sdW1lIGV4dGVuZHMgUGVyc2lzdGVudFZvbHVtZSB7XG5cbiAgLyoqXG4gICAqIFBEIHJlc291cmNlIGluIEdDRSBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgaXQgaXMgbW91bnRlZCBhcyBhIHJlYWQtb25seSB2b2x1bWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbGUgc3lzdGVtIHR5cGUgb2YgdGhpcyB2b2x1bWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnNUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhcnRpdGlvbiBvZiB0aGlzIHZvbHVtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXJ0aXRpb24/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEdDRVBlcnNpc3RlbnREaXNrUGVyc2lzdGVudFZvbHVtZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnBkTmFtZSA9IHByb3BzLnBkTmFtZTtcbiAgICB0aGlzLnJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHkgPz8gZmFsc2U7XG4gICAgdGhpcy5mc1R5cGUgPSBwcm9wcy5mc1R5cGUgPz8gJ2V4dDQnO1xuICAgIHRoaXMucGFydGl0aW9uID0gcHJvcHMucGFydGl0aW9uO1xuXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2t1YmVybmV0ZXMvZXhhbXBsZXMvYmxvYi9tYXN0ZXIvc3RhZ2luZy92b2x1bWVzL2F6dXJlX2Rpc2svUkVBRE1FLm1kXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuUGVyc2lzdGVudFZvbHVtZVNwZWMge1xuICAgIGNvbnN0IHNwZWMgPSBzdXBlci5fdG9LdWJlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNwZWMsXG4gICAgICBnY2VQZXJzaXN0ZW50RGlzazoge1xuICAgICAgICBwZE5hbWU6IHRoaXMucGROYW1lLFxuICAgICAgICBmc1R5cGU6IHRoaXMuZnNUeXBlLFxuICAgICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufSJdfQ==