UNPKG

@aws-cdk/aws-redshift-alpha

Version:

The CDK Construct Library for AWS::Redshift

330 lines 41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ColumnEncoding = exports.TableSortStyle = exports.TableDistStyle = exports.Table = exports.TableAction = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk = require("aws-cdk-lib/core"); const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal"); const cx_api_1 = require("aws-cdk-lib/cx-api"); const constructs_1 = require("constructs"); const database_query_1 = require("./private/database-query"); const handler_name_1 = require("./private/database-query-provider/handler-name"); const util_1 = require("./private/database-query-provider/util"); /** * An action that a Redshift user can be granted privilege to perform on a table. */ var TableAction; (function (TableAction) { /** * Grants privilege to select data from a table or view using a SELECT statement. */ TableAction[TableAction["SELECT"] = 0] = "SELECT"; /** * Grants privilege to load data into a table using an INSERT statement or a COPY statement. */ TableAction[TableAction["INSERT"] = 1] = "INSERT"; /** * Grants privilege to update a table column using an UPDATE statement. */ TableAction[TableAction["UPDATE"] = 2] = "UPDATE"; /** * Grants privilege to delete a data row from a table. */ TableAction[TableAction["DELETE"] = 3] = "DELETE"; /** * Grants privilege to drop a table. */ TableAction[TableAction["DROP"] = 4] = "DROP"; /** * Grants privilege to create a foreign key constraint. * * You need to grant this privilege on both the referenced table and the referencing table; otherwise, the user can't create the constraint. */ TableAction[TableAction["REFERENCES"] = 5] = "REFERENCES"; /** * Grants all available privileges at once to the specified user or user group. */ TableAction[TableAction["ALL"] = 6] = "ALL"; })(TableAction || (exports.TableAction = TableAction = {})); class TableBase extends constructs_1.Construct { grant(user, ...actions) { user.addTablePrivileges(this, ...actions); } } /** * A table in a Redshift cluster. */ class Table extends TableBase { static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-redshift-alpha.Table", version: "2.257.0-alpha.0" }; /** * Specify a Redshift table using a table name and schema that already exists. */ static fromTableAttributes(scope, id, attrs) { try { jsiiDeprecationWarnings._aws_cdk_aws_redshift_alpha_TableAttributes(attrs); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromTableAttributes); } throw error; } return new class extends TableBase { tableName = attrs.tableName; tableColumns = attrs.tableColumns; cluster = attrs.cluster; databaseName = attrs.databaseName; }(scope, id); } tableName; tableColumns; cluster; databaseName; resource; constructor(scope, id, props) { super(scope, id); try { jsiiDeprecationWarnings._aws_cdk_aws_redshift_alpha_TableProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Table); } throw error; } this.validateDistKeyColumns(props.tableColumns); if (props.distStyle) { this.validateDistStyle(props.distStyle, props.tableColumns); } if (props.sortStyle) { this.validateSortStyle(props.sortStyle, props.tableColumns); } this.tableColumns = this.configureTableColumns(props.tableColumns); this.cluster = props.cluster; this.databaseName = props.databaseName; const useColumnIds = !!cdk.FeatureFlags.of(this).isEnabled(cx_api_1.REDSHIFT_COLUMN_ID); this.resource = new database_query_1.DatabaseQuery(this, 'Resource', { removalPolicy: cdk.RemovalPolicy.RETAIN, ...props, handler: handler_name_1.HandlerName.Table, properties: { tableName: { prefix: props.tableName ?? cdk.Names.uniqueId(this), generateSuffix: (props.tableName == null).toString(), }, tableColumns: this.tableColumns, distStyle: props.distStyle, sortStyle: props.sortStyle ?? this.getDefaultSortStyle(props.tableColumns), tableComment: props.tableComment, useColumnIds, }, }); this.tableName = props.tableName ?? this.resource.ref; } /** * Apply the given removal policy to this resource * * The Removal Policy controls what happens to this resource when it stops * being managed by CloudFormation, either because you've removed it from the * CDK application or because you've made a change that requires the resource * to be replaced. * * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`). * * This resource is retained by default. */ applyRemovalPolicy(policy) { this.resource.applyRemovalPolicy(policy); } validateDistKeyColumns(columns) { try { (0, util_1.getDistKeyColumn)(columns); } catch { throw new cdk.ValidationError((0, helpers_internal_1.lit) `MultipleDistKeys`, 'Only one column can be configured as distKey.', this); } } validateDistStyle(distStyle, columns) { const distKeyColumn = (0, util_1.getDistKeyColumn)(columns); if (distKeyColumn && distStyle !== TableDistStyle.KEY) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `DistStyleMustBeKey`, `Only 'TableDistStyle.KEY' can be configured when distKey is also configured. Found ${distStyle}`, this); } if (!distKeyColumn && distStyle === TableDistStyle.KEY) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `DistKeyRequiredForKeyStyle`, 'distStyle of "TableDistStyle.KEY" can only be configured when distKey is also configured.', this); } } validateSortStyle(sortStyle, columns) { const sortKeyColumns = (0, util_1.getSortKeyColumns)(columns); if (sortKeyColumns.length === 0 && sortStyle !== TableSortStyle.AUTO) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `SortKeyRequiredForSortStyle`, `sortStyle of '${sortStyle}' can only be configured when sortKey is also configured.`, this); } if (sortKeyColumns.length > 0 && sortStyle === TableSortStyle.AUTO) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `AutoSortStyleConflictsWithSortKey`, `sortStyle of '${TableSortStyle.AUTO}' cannot be configured when sortKey is also configured.`, this); } } getDefaultSortStyle(columns) { const sortKeyColumns = (0, util_1.getSortKeyColumns)(columns); return (sortKeyColumns.length === 0) ? TableSortStyle.AUTO : TableSortStyle.COMPOUND; } configureTableColumns(columns) { const newColumns = [...columns]; const columnIds = new Set(); for (let i = 0; i < columns.length; i++) { const column = newColumns[i]; if (column.id) { if (columnIds.has(column.id)) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `DuplicateColumnId`, `Column id '${column.id}' is not unique.`, this); } columnIds.add(column.id); } else { if (columnIds.has(column.name)) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `DuplicateColumnName`, `Column name '${column.name}' is not unique amongst the column ids.`, this); } newColumns[i] = { ...column, id: column.name }; columnIds.add(column.name); } } return newColumns; } } exports.Table = Table; /** * The data distribution style of a table. */ var TableDistStyle; (function (TableDistStyle) { /** * Amazon Redshift assigns an optimal distribution style based on the table data */ TableDistStyle["AUTO"] = "AUTO"; /** * The data in the table is spread evenly across the nodes in a cluster in a round-robin distribution. */ TableDistStyle["EVEN"] = "EVEN"; /** * The data is distributed by the values in the DISTKEY column. */ TableDistStyle["KEY"] = "KEY"; /** * A copy of the entire table is distributed to every node. */ TableDistStyle["ALL"] = "ALL"; })(TableDistStyle || (exports.TableDistStyle = TableDistStyle = {})); /** * The sort style of a table. */ var TableSortStyle; (function (TableSortStyle) { /** * Amazon Redshift assigns an optimal sort key based on the table data. */ TableSortStyle["AUTO"] = "AUTO"; /** * Specifies that the data is sorted using a compound key made up of all of the listed columns, * in the order they are listed. */ TableSortStyle["COMPOUND"] = "COMPOUND"; /** * Specifies that the data is sorted using an interleaved sort key. */ TableSortStyle["INTERLEAVED"] = "INTERLEAVED"; })(TableSortStyle || (exports.TableSortStyle = TableSortStyle = {})); /** * The compression encoding of a column. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html */ var ColumnEncoding; (function (ColumnEncoding) { /** * Amazon Redshift assigns an optimal encoding based on the column data. * This is the default. */ ColumnEncoding["AUTO"] = "AUTO"; /** * The column is not compressed. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Raw_encoding.html */ ColumnEncoding["RAW"] = "RAW"; /** * The column is compressed using the AZ64 algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/az64-encoding.html */ ColumnEncoding["AZ64"] = "AZ64"; /** * The column is compressed using a separate dictionary for each block column value on disk. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Byte_dictionary_encoding.html */ ColumnEncoding["BYTEDICT"] = "BYTEDICT"; /** * The column is compressed based on the difference between values in the column. * This records differences as 1-byte values. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Delta_encoding.html */ ColumnEncoding["DELTA"] = "DELTA"; /** * The column is compressed based on the difference between values in the column. * This records differences as 2-byte values. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Delta_encoding.html */ ColumnEncoding["DELTA32K"] = "DELTA32K"; /** * The column is compressed using the LZO algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/lzo-encoding.html */ ColumnEncoding["LZO"] = "LZO"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 1 byte. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY8"] = "MOSTLY8"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 2 bytes. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY16"] = "MOSTLY16"; /** * The column is compressed to a smaller storage size than the original data type. * The compressed storage size is 4 bytes. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_MostlyN_encoding.html */ ColumnEncoding["MOSTLY32"] = "MOSTLY32"; /** * The column is compressed by recording the number of occurrences of each value in the column. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Runlength_encoding.html */ ColumnEncoding["RUNLENGTH"] = "RUNLENGTH"; /** * The column is compressed by recording the first 245 unique words and then using a 1-byte index to represent each word. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Text255_encoding.html */ ColumnEncoding["TEXT255"] = "TEXT255"; /** * The column is compressed by recording the first 32K unique words and then using a 2-byte index to represent each word. * * @see https://docs.aws.amazon.com/redshift/latest/dg/c_Text255_encoding.html */ ColumnEncoding["TEXT32K"] = "TEXT32K"; /** * The column is compressed using the ZSTD algorithm. * * @see https://docs.aws.amazon.com/redshift/latest/dg/zstd-encoding.html */ ColumnEncoding["ZSTD"] = "ZSTD"; })(ColumnEncoding || (exports.ColumnEncoding = ColumnEncoding = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHdDQUF3QztBQUN4Qyw0RUFBNEQ7QUFDNUQsK0NBQXdEO0FBRXhELDJDQUF1QztBQUd2Qyw2REFBeUQ7QUFDekQsaUZBQTZFO0FBQzdFLGlFQUE2RjtBQUk3Rjs7R0FFRztBQUNILElBQVksV0FxQ1g7QUFyQ0QsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsaURBQU0sQ0FBQTtJQUVOOztPQUVHO0lBQ0gsaURBQU0sQ0FBQTtJQUVOOztPQUVHO0lBQ0gsaURBQU0sQ0FBQTtJQUVOOztPQUVHO0lBQ0gsaURBQU0sQ0FBQTtJQUVOOztPQUVHO0lBQ0gsNkNBQUksQ0FBQTtJQUVKOzs7O09BSUc7SUFDSCx5REFBVSxDQUFBO0lBRVY7O09BRUc7SUFDSCwyQ0FBRyxDQUFBO0FBQ0wsQ0FBQyxFQXJDVyxXQUFXLDJCQUFYLFdBQVcsUUFxQ3RCO0FBcUtELE1BQWUsU0FBVSxTQUFRLHNCQUFTO0lBS3hDLEtBQUssQ0FBQyxJQUFXLEVBQUUsR0FBRyxPQUFzQjtRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7S0FDM0M7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxLQUFNLFNBQVEsU0FBUzs7SUFDbEM7O09BRUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7UUFDN0UsT0FBTyxJQUFJLEtBQU0sU0FBUSxTQUFTO1lBQ3ZCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzVCLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3hCLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1NBQzVDLENBQUMsS0FBSyxF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LHFDQUFtQixDQUFBO0lBRW5COzs7O09BSUc7SUFDSCwrQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQXRHVyxjQUFjLDhCQUFkLGNBQWMsUUFzR3pCIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IFJFRFNISUZUX0NPTFVNTl9JRCB9IGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQ2x1c3RlciB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3B0aW9ucyB9IGZyb20gJy4vZGF0YWJhc2Utb3B0aW9ucyc7XG5pbXBvcnQgeyBEYXRhYmFzZVF1ZXJ5IH0gZnJvbSAnLi9wcml2YXRlL2RhdGFiYXNlLXF1ZXJ5JztcbmltcG9ydCB7IEhhbmRsZXJOYW1lIH0gZnJvbSAnLi9wcml2YXRlL2RhdGFiYXNlLXF1ZXJ5LXByb3ZpZGVyL2hhbmRsZXItbmFtZSc7XG5pbXBvcnQgeyBnZXREaXN0S2V5Q29sdW1uLCBnZXRTb3J0S2V5Q29sdW1ucyB9IGZyb20gJy4vcHJpdmF0ZS9kYXRhYmFzZS1xdWVyeS1wcm92aWRlci91dGlsJztcbmltcG9ydCB0eXBlIHsgVGFibGVIYW5kbGVyUHJvcHMgfSBmcm9tICcuL3ByaXZhdGUvaGFuZGxlci1wcm9wcyc7XG5pbXBvcnQgdHlwZSB7IElVc2VyIH0gZnJvbSAnLi91c2VyJztcblxuLyoqXG4gKiBBbiBhY3Rpb24gdGhhdCBhIFJlZHNoaWZ0IHVzZXIgY2FuIGJlIGdyYW50ZWQgcHJpdmlsZWdlIHRvIHBlcmZvcm0gb24gYSB0YWJsZS5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVBY3Rpb24ge1xuICAvKipcbiAgICogR3JhbnRzIHByaXZpbGVnZSB0byBzZWxlY3QgZGF0YSBmcm9tIGEgdGFibGUgb3IgdmlldyB1c2luZyBhIFNFTEVDVCBzdGF0ZW1lbnQuXG4gICAqL1xuICBTRUxFQ1QsXG5cbiAgLyoqXG4gICAqIEdyYW50cyBwcml2aWxlZ2UgdG8gbG9hZCBkYXRhIGludG8gYSB0YWJsZSB1c2luZyBhbiBJTlNFUlQgc3RhdGVtZW50IG9yIGEgQ09QWSBzdGF0ZW1lbnQuXG4gICAqL1xuICBJTlNFUlQsXG5cbiAgLyoqXG4gICAqIEdyYW50cyBwcml2aWxlZ2UgdG8gdXBkYXRlIGEgdGFibGUgY29sdW1uIHVzaW5nIGFuIFVQREFURSBzdGF0ZW1lbnQuXG4gICAqL1xuICBVUERBVEUsXG5cbiAgLyoqXG4gICAqIEdyYW50cyBwcml2aWxlZ2UgdG8gZGVsZXRlIGEgZGF0YSByb3cgZnJvbSBhIHRhYmxlLlxuICAgKi9cbiAgREVMRVRFLFxuXG4gIC8qKlxuICAgKiBHcmFudHMgcHJpdmlsZWdlIHRvIGRyb3AgYSB0YWJsZS5cbiAgICovXG4gIERST1AsXG5cbiAgLyoqXG4gICAqIEdyYW50cyBwcml2aWxlZ2UgdG8gY3JlYXRlIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludC5cbiAgICpcbiAgICogWW91IG5lZWQgdG8gZ3JhbnQgdGhpcyBwcml2aWxlZ2Ugb24gYm90aCB0aGUgcmVmZXJlbmNlZCB0YWJsZSBhbmQgdGhlIHJlZmVyZW5jaW5nIHRhYmxlOyBvdGhlcndpc2UsIHRoZSB1c2VyIGNhbid0IGNyZWF0ZSB0aGUgY29uc3RyYWludC5cbiAgICovXG4gIFJFRkVSRU5DRVMsXG5cbiAgLyoqXG4gICAqIEdyYW50cyBhbGwgYXZhaWxhYmxlIHByaXZpbGVnZXMgYXQgb25jZSB0byB0aGUgc3BlY2lmaWVkIHVzZXIgb3IgdXNlciBncm91cC5cbiAgICovXG4gIEFMTCxcbn1cblxuLyoqXG4gKiBBIGNvbHVtbiBpbiBhIFJlZHNoaWZ0IHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbHVtbi5cbiAgICpcbiAgICogVGhpcyBpcyBub3QgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiwgYW5kIHJlbmFtaW5nIHRoaXMgaWRlbnRpZmllciB3aWxsIGNhdXNlIGEgbmV3IGNvbHVtbiB0byBiZSBjcmVhdGVkIGFuZCB0aGUgb2xkIGNvbHVtbiB0byBiZSBkcm9wcGVkLlxuICAgKlxuICAgKiAqKk5PVEUqKiAtIFRoaXMgZmllbGQgd2lsbCBiZSBzZXQsIGhvd2V2ZXIsIG9ubHkgYnkgc2V0dGluZyB0aGUgYEBhd3MtY2RrL2F3cy1yZWRzaGlmdDpjb2x1bW5JZGAgZmVhdHVyZSBmbGFnIHdpbGwgdGhpcyBmaWVsZCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBjb2x1bW4gbmFtZSBpcyB1c2VkIGFzIHRoZSBpZGVudGlmaWVyXG4gICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi4gVGhpcyB3aWxsIGFwcGVhciBvbiBBbWF6b24gUmVkc2hpZnQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29sdW1uIGlzIHRvIGJlIGNvbmZpZ3VyZWQgYXMgRElTVEtFWS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjb2x1bW4gaXMgbm90IERJU1RLRVlcbiAgICovXG4gIHJlYWRvbmx5IGRpc3RLZXk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyB0byBiZSBjb25maWd1cmVkIGFzIFNPUlRLRVkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY29sdW1uIGlzIG5vdCBhIFNPUlRLRVlcbiAgICovXG4gIHJlYWRvbmx5IHNvcnRLZXk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgY29sdW1uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFtYXpvbiBSZWRzaGlmdCBkZXRlcm1pbmVzIHRoZSBlbmNvZGluZyBiYXNlZCBvbiB0aGUgZGF0YSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2Rpbmc/OiBDb2x1bW5FbmNvZGluZztcblxuICAvKipcbiAgICogQSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgY29sdW1uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY29uZmlndXJpbmcgYSBSZWRzaGlmdCB0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVByb3BzIGV4dGVuZHMgRGF0YWJhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgaXMgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ29sdW1uczogQ29sdW1uW107XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0cmlidXRpb24gc3R5bGUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUYWJsZURpc3RTdHlsZS5BVVRPXG4gICAqL1xuICByZWFkb25seSBkaXN0U3R5bGU/OiBUYWJsZURpc3RTdHlsZTtcblxuICAvKipcbiAgICogVGhlIHNvcnQgc3R5bGUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUYWJsZVNvcnRTdHlsZS5BVVRPIGlmIG5vIHNvcnQga2V5IGlzIHNwZWNpZmllZCwgVGFibGVTb3J0U3R5bGUuQ09NUE9VTkQgaWYgYSBzb3J0IGtleSBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvcnRTdHlsZT86IFRhYmxlU29ydFN0eWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IHRvIGFwcGx5IHdoZW4gdGhpcyByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjZGsuUmVtb3ZhbFBvbGljeS5SZXRhaW5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogQSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVDb21tZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHRpbWVvdXQgZHVyYXRpb24uXG4gICAqXG4gICAqIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAxIHNlY29uZCBhbmQgMTUgbWludXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAxIG1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IGNkay5EdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGFibGUgaW4gYSBSZWRzaGlmdCBkYXRhYmFzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGFibGUgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQ29sdW1uczogQ29sdW1uW107XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVyIHdoZXJlIHRoZSB0YWJsZSBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSB3aGVyZSB0aGUgdGFibGUgaXMgbG9jYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCBhIHVzZXIgcHJpdmlsZWdlIHRvIGFjY2VzcyB0aGlzIHRhYmxlLlxuICAgKi9cbiAgZ3JhbnQodXNlcjogSVVzZXIsIC4uLmFjdGlvbnM6IFRhYmxlQWN0aW9uW10pOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgZnVsbCBzcGVjaWZpY2F0aW9uIG9mIGEgUmVkc2hpZnQgdGFibGUgdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBvcnQgaXQgZmx1ZW50bHkgaW50byB0aGUgQ0RLIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB3aGVyZSB0aGUgdGFibGUgaXMgbG9jYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2Ugd2hlcmUgdGhlIHRhYmxlIGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcbn1cblxuYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVRhYmxlIHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQ29sdW1uczogQ29sdW1uW107XG4gIGFic3RyYWN0IHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuICBhYnN0cmFjdCByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgZ3JhbnQodXNlcjogSVVzZXIsIC4uLmFjdGlvbnM6IFRhYmxlQWN0aW9uW10pIHtcbiAgICB1c2VyLmFkZFRhYmxlUHJpdmlsZWdlcyh0aGlzLCAuLi5hY3Rpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgdGFibGUgaW4gYSBSZWRzaGlmdCBjbHVzdGVyLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKipcbiAgICogU3BlY2lmeSBhIFJlZHNoaWZ0IHRhYmxlIHVzaW5nIGEgdGFibGUgbmFtZSBhbmQgc2NoZW1hIHRoYXQgYWxyZWFkeSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZnJvbVRhYmxlQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogVGFibGVBdHRyaWJ1dGVzKTogSVRhYmxlIHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgICAgIHJlYWRvbmx5IHRhYmxlTmFtZSA9IGF0dHJzLnRhYmxlTmFtZTtcbiAgICAgIHJlYWRvbmx5IHRhYmxlQ29sdW1ucyA9IGF0dHJzLnRhYmxlQ29sdW1ucztcbiAgICAgIHJlYWRvbmx5IGNsdXN0ZXIgPSBhdHRycy5jbHVzdGVyO1xuICAgICAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lID0gYXR0cnMuZGF0YWJhc2VOYW1lO1xuICAgIH0oc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuICByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlcjtcbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZXNvdXJjZTogRGF0YWJhc2VRdWVyeTxUYWJsZUhhbmRsZXJQcm9wcz47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy52YWxpZGF0ZURpc3RLZXlDb2x1bW5zKHByb3BzLnRhYmxlQ29sdW1ucyk7XG4gICAgaWYgKHByb3BzLmRpc3RTdHlsZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZURpc3RTdHlsZShwcm9wcy5kaXN0U3R5bGUsIHByb3BzLnRhYmxlQ29sdW1ucyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5zb3J0U3R5bGUpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVTb3J0U3R5bGUocHJvcHMuc29ydFN0eWxlLCBwcm9wcy50YWJsZUNvbHVtbnMpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2x1bW5zID0gdGhpcy5jb25maWd1cmVUYWJsZUNvbHVtbnMocHJvcHMudGFibGVDb2x1bW5zKTtcbiAgICB0aGlzLmNsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyO1xuICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lO1xuXG4gICAgY29uc3QgdXNlQ29sdW1uSWRzID0gISFjZGsuRmVhdHVyZUZsYWdzLm9mKHRoaXMpLmlzRW5hYmxlZChSRURTSElGVF9DT0xVTU5fSUQpO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBEYXRhYmFzZVF1ZXJ5PFRhYmxlSGFuZGxlclByb3BzPih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGhhbmRsZXI6IEhhbmRsZXJOYW1lLlRhYmxlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICB0YWJsZU5hbWU6IHtcbiAgICAgICAgICBwcmVmaXg6IHByb3BzLnRhYmxlTmFtZSA/PyBjZGsuTmFtZXMudW5pcXVlSWQodGhpcyksXG4gICAgICAgICAgZ2VuZXJhdGVTdWZmaXg6IChwcm9wcy50YWJsZU5hbWUgPT0gbnVsbCkudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFibGVDb2x1bW5zOiB0aGlzLnRhYmxlQ29sdW1ucyxcbiAgICAgICAgZGlzdFN0eWxlOiBwcm9wcy5kaXN0U3R5bGUsXG4gICAgICAgIHNvcnRTdHlsZTogcHJvcHMuc29ydFN0eWxlID8/IHRoaXMuZ2V0RGVmYXVsdFNvcnRTdHlsZShwcm9wcy50YWJsZUNvbHVtbnMpLFxuICAgICAgICB0YWJsZUNvbW1lbnQ6IHByb3BzLnRhYmxlQ29tbWVudCxcbiAgICAgICAgdXNlQ29sdW1uSWRzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVOYW1lID0gcHJvcHMudGFibGVOYW1lID8/IHRoaXMucmVzb3VyY2UucmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBnaXZlbiByZW1vdmFsIHBvbGljeSB0byB0aGlzIHJlc291cmNlXG4gICAqXG4gICAqIFRoZSBSZW1vdmFsIFBvbGljeSBjb250cm9scyB3aGF0IGhhcHBlbnMgdG8gdGhpcyByZXNvdXJjZSB3aGVuIGl0IHN0b3BzXG4gICAqIGJlaW5nIG1hbmFnZWQgYnkgQ2xvdWRGb3JtYXRpb24sIGVpdGhlciBiZWNhdXNlIHlvdSd2ZSByZW1vdmVkIGl0IGZyb20gdGhlXG4gICAqIENESyBhcHBsaWNhdGlvbiBvciBiZWNhdXNlIHlvdSd2ZSBtYWRlIGEgY2hhbmdlIHRoYXQgcmVxdWlyZXMgdGhlIHJlc291cmNlXG4gICAqIHRvIGJlIHJlcGxhY2VkLlxuICAgKlxuICAgKiBUaGUgcmVzb3VyY2UgY2FuIGJlIGRlc3Ryb3llZCAoYFJlbW92YWxQb2xpY3kuREVTVFJPWWApLCBvciBsZWZ0IGluIHlvdXIgQVdTXG4gICAqIGFjY291bnQgZm9yIGRhdGEgcmVjb3ZlcnkgYW5kIGNsZWFudXAgbGF0ZXIgKGBSZW1vdmFsUG9saWN5LlJFVEFJTmApLlxuICAgKlxuICAgKiBUaGlzIHJlc291cmNlIGlzIHJldGFpbmVkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlSZW1vdmFsUG9saWN5KHBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlc291cmNlLmFwcGx5UmVtb3ZhbFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZURpc3RLZXlDb2x1bW5zKGNvbHVtbnM6IENvbHVtbltdKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGdldERpc3RLZXlDb2x1bW4oY29sdW1ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihsaXRgTXVsdGlwbGVEaXN0S2V5c2AsICdPbmx5IG9uZSBjb2x1bW4gY2FuIGJlIGNvbmZpZ3VyZWQgYXMgZGlzdEtleS4nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRGlzdFN0eWxlKGRpc3RTdHlsZTogVGFibGVEaXN0U3R5bGUsIGNvbHVtbnM6IENvbHVtbltdKTogdm9pZCB7XG4gICAgY29uc3QgZGlzdEtleUNvbHVtbiA9IGdldERpc3RLZXlDb2x1bW4oY29sdW1ucyk7XG4gICAgaWYgKGRpc3RLZXlDb2x1bW4gJiYgZGlzdFN0eWxlICE9PSBUYWJsZURpc3RTdHlsZS5LRVkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBEaXN0U3R5bGVNdXN0QmVLZXlgLCBgT25seSAnVGFibGVEaXN0U3R5bGUuS0VZJyBjYW4gYmUgY29uZmlndXJlZCB3aGVuIGRpc3RLZXkgaXMgYWxzbyBjb25maWd1cmVkLiBGb3VuZCAke2Rpc3RTdHlsZX1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFkaXN0S2V5Q29sdW1uICYmIGRpc3RTdHlsZSA9PT0gVGFibGVEaXN0U3R5bGUuS0VZKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihsaXRgRGlzdEtleVJlcXVpcmVkRm9yS2V5U3R5bGVgLCAnZGlzdFN0eWxlIG9mIFwiVGFibGVEaXN0U3R5bGUuS0VZXCIgY2FuIG9ubHkgYmUgY29uZmlndXJlZCB3aGVuIGRpc3RLZXkgaXMgYWxzbyBjb25maWd1cmVkLicsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVTb3J0U3R5bGUoc29ydFN0eWxlOiBUYWJsZVNvcnRTdHlsZSwgY29sdW1uczogQ29sdW1uW10pOiB2b2lkIHtcbiAgICBjb25zdCBzb3J0S2V5Q29sdW1ucyA9IGdldFNvcnRLZXlDb2x1bW5zKGNvbHVtbnMpO1xuICAgIGlmIChzb3J0S2V5Q29sdW1ucy5sZW5ndGggPT09IDAgJiYgc29ydFN0eWxlICE9PSBUYWJsZVNvcnRTdHlsZS5BVVRPKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihsaXRgU29ydEtleVJlcXVpcmVkRm9yU29ydFN0eWxlYCwgYHNvcnRTdHlsZSBvZiAnJHtzb3J0U3R5bGV9JyBjYW4gb25seSBiZSBjb25maWd1cmVkIHdoZW4gc29ydEtleSBpcyBhbHNvIGNvbmZpZ3VyZWQuYCwgdGhpcyk7XG4gICAgfVxuICAgIGlmIChzb3J0S2V5Q29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRTdHlsZSA9PT0gVGFibGVTb3J0U3R5bGUuQVVUTykge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IobGl0YEF1dG9Tb3J0U3R5bGVDb25mbGljdHNXaXRoU29ydEtleWAsIGBzb3J0U3R5bGUgb2YgJyR7VGFibGVTb3J0U3R5bGUuQVVUT30nIGNhbm5vdCBiZSBjb25maWd1cmVkIHdoZW4gc29ydEtleSBpcyBhbHNvIGNvbmZpZ3VyZWQuYCwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0U29ydFN0eWxlKGNvbHVtbnM6IENvbHVtbltdKTogVGFibGVTb3J0U3R5bGUge1xuICAgIGNvbnN0IHNvcnRLZXlDb2x1bW5zID0gZ2V0U29ydEtleUNvbHVtbnMoY29sdW1ucyk7XG4gICAgcmV0dXJuIChzb3J0S2V5Q29sdW1ucy5sZW5ndGggPT09IDApID8gVGFibGVTb3J0U3R5bGUuQVVUTyA6IFRhYmxlU29ydFN0eWxlLkNPTVBPVU5EO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVUYWJsZUNvbHVtbnMoY29sdW1uczogQ29sdW1uW10pOiBDb2x1bW5bXSB7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IFsuLi5jb2x1bW5zXTtcbiAgICBjb25zdCBjb2x1bW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IG5ld0NvbHVtbnNbaV07XG4gICAgICBpZiAoY29sdW1uLmlkKSB7XG4gICAgICAgIGlmIChjb2x1bW5JZHMuaGFzKGNvbHVtbi5pZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihsaXRgRHVwbGljYXRlQ29sdW1uSWRgLCBgQ29sdW1uIGlkICcke2NvbHVtbi5pZH0nIGlzIG5vdCB1bmlxdWUuYCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uSWRzLmFkZChjb2x1bW4uaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbHVtbklkcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZUNvbHVtbk5hbWVgLCBgQ29sdW1uIG5hbWUgJyR7Y29sdW1uLm5hbWV9JyBpcyBub3QgdW5pcXVlIGFtb25nc3QgdGhlIGNvbHVtbiBpZHMuYCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q29sdW1uc1tpXSA9IHsgLi4uY29sdW1uLCBpZDogY29sdW1uLm5hbWUgfTtcbiAgICAgICAgY29sdW1uSWRzLmFkZChjb2x1bW4ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdDb2x1bW5zO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRhdGEgZGlzdHJpYnV0aW9uIHN0eWxlIG9mIGEgdGFibGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlRGlzdFN0eWxlIHtcbiAgLyoqXG4gICAqICBBbWF6b24gUmVkc2hpZnQgYXNzaWducyBhbiBvcHRpbWFsIGRpc3RyaWJ1dGlvbiBzdHlsZSBiYXNlZCBvbiB0aGUgdGFibGUgZGF0YVxuICAgKi9cbiAgQVVUTyA9ICdBVVRPJyxcblxuICAvKipcbiAgICogVGhlIGRhdGEgaW4gdGhlIHRhYmxlIGlzIHNwcmVhZCBldmVubHkgYWNyb3NzIHRoZSBub2RlcyBpbiBhIGNsdXN0ZXIgaW4gYSByb3VuZC1yb2JpbiBkaXN0cmlidXRpb24uXG4gICAqL1xuICBFVkVOID0gJ0VWRU4nLFxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBpcyBkaXN0cmlidXRlZCBieSB0aGUgdmFsdWVzIGluIHRoZSBESVNUS0VZIGNvbHVtbi5cbiAgICovXG4gIEtFWSA9ICdLRVknLFxuXG4gIC8qKlxuICAgKiBBIGNvcHkgb2YgdGhlIGVudGlyZSB0YWJsZSBpcyBkaXN0cmlidXRlZCB0byBldmVyeSBub2RlLlxuICAgKi9cbiAgQUxMID0gJ0FMTCcsXG59XG5cbi8qKlxuICogVGhlIHNvcnQgc3R5bGUgb2YgYSB0YWJsZS5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVTb3J0U3R5bGUge1xuICAvKipcbiAgICogQW1hem9uIFJlZHNoaWZ0IGFzc2lnbnMgYW4gb3B0aW1hbCBzb3J0IGtleSBiYXNlZCBvbiB0aGUgdGFibGUgZGF0YS5cbiAgICovXG4gIEFVVE8gPSAnQVVUTycsXG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGlzIHNvcnRlZCB1c2luZyBhIGNvbXBvdW5kIGtleSBtYWRlIHVwIG9mIGFsbCBvZiB0aGUgbGlzdGVkIGNvbHVtbnMsXG4gICAqIGluIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQuXG4gICAqL1xuICBDT01QT1VORCA9ICdDT01QT1VORCcsXG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGF0IHRoZSBkYXRhIGlzIHNvcnRlZCB1c2luZyBhbiBpbnRlcmxlYXZlZCBzb3J0IGtleS5cbiAgICovXG4gIElOVEVSTEVBVkVEID0gJ0lOVEVSTEVBVkVEJyxcbn1cblxuLyoqXG4gKiBUaGUgY29tcHJlc3Npb24gZW5jb2Rpbmcgb2YgYSBjb2x1bW4uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfQ29tcHJlc3Npb25fZW5jb2RpbmdzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gQ29sdW1uRW5jb2Rpbmcge1xuICAvKipcbiAgICogQW1hem9uIFJlZHNoaWZ0IGFzc2lnbnMgYW4gb3B0aW1hbCBlbmNvZGluZyBiYXNlZCBvbiB0aGUgY29sdW1uIGRhdGEuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICBBVVRPID0gJ0FVVE8nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIG5vdCBjb21wcmVzc2VkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvY19SYXdfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgUkFXID0gJ1JBVycsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB1c2luZyB0aGUgQVo2NCBhbGdvcml0aG0uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9hejY0LWVuY29kaW5nLmh0bWxcbiAgICovXG4gIEFaNjQgPSAnQVo2NCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB1c2luZyBhIHNlcGFyYXRlIGRpY3Rpb25hcnkgZm9yIGVhY2ggYmxvY2sgY29sdW1uIHZhbHVlIG9uIGRpc2suXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX0J5dGVfZGljdGlvbmFyeV9lbmNvZGluZy5odG1sXG4gICAqL1xuICBCWVRFRElDVCA9ICdCWVRFRElDVCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZhbHVlcyBpbiB0aGUgY29sdW1uLlxuICAgKiBUaGlzIHJlY29yZHMgZGlmZmVyZW5jZXMgYXMgMS1ieXRlIHZhbHVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfRGVsdGFfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgREVMVEEgPSAnREVMVEEnLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYmFzZWQgb24gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2YWx1ZXMgaW4gdGhlIGNvbHVtbi5cbiAgICogVGhpcyByZWNvcmRzIGRpZmZlcmVuY2VzIGFzIDItYnl0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX0RlbHRhX2VuY29kaW5nLmh0bWxcbiAgICovXG4gIERFTFRBMzJLID0gJ0RFTFRBMzJLJyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHVzaW5nIHRoZSBMWk8gYWxnb3JpdGhtLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvbHpvLWVuY29kaW5nLmh0bWxcbiAgICovXG4gIExaTyA9ICdMWk8nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgdG8gYSBzbWFsbGVyIHN0b3JhZ2Ugc2l6ZSB0aGFuIHRoZSBvcmlnaW5hbCBkYXRhIHR5cGUuXG4gICAqIFRoZSBjb21wcmVzc2VkIHN0b3JhZ2Ugc2l6ZSBpcyAxIGJ5dGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX01vc3RseU5fZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgTU9TVExZOCA9ICdNT1NUTFk4JyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHRvIGEgc21hbGxlciBzdG9yYWdlIHNpemUgdGhhbiB0aGUgb3JpZ2luYWwgZGF0YSB0eXBlLlxuICAgKiBUaGUgY29tcHJlc3NlZCBzdG9yYWdlIHNpemUgaXMgMiBieXRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfTW9zdGx5Tl9lbmNvZGluZy5odG1sXG4gICAqL1xuICBNT1NUTFkxNiA9ICdNT1NUTFkxNicsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCB0byBhIHNtYWxsZXIgc3RvcmFnZSBzaXplIHRoYW4gdGhlIG9yaWdpbmFsIGRhdGEgdHlwZS5cbiAgICogVGhlIGNvbXByZXNzZWQgc3RvcmFnZSBzaXplIGlzIDQgYnl0ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX01vc3RseU5fZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgTU9TVExZMzIgPSAnTU9TVExZMzInLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYnkgcmVjb3JkaW5nIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgZWFjaCB2YWx1ZSBpbiB0aGUgY29sdW1uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9yZWRzaGlmdC9sYXRlc3QvZGcvY19SdW5sZW5ndGhfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgUlVOTEVOR1RIID0gJ1JVTkxFTkdUSCcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4gaXMgY29tcHJlc3NlZCBieSByZWNvcmRpbmcgdGhlIGZpcnN0IDI0NSB1bmlxdWUgd29yZHMgYW5kIHRoZW4gdXNpbmcgYSAxLWJ5dGUgaW5kZXggdG8gcmVwcmVzZW50IGVhY2ggd29yZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL2NfVGV4dDI1NV9lbmNvZGluZy5odG1sXG4gICAqL1xuICBURVhUMjU1ID0gJ1RFWFQyNTUnLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGlzIGNvbXByZXNzZWQgYnkgcmVjb3JkaW5nIHRoZSBmaXJzdCAzMksgdW5pcXVlIHdvcmRzIGFuZCB0aGVuIHVzaW5nIGEgMi1ieXRlIGluZGV4IHRvIHJlcHJlc2VudCBlYWNoIHdvcmQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9jX1RleHQyNTVfZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgVEVYVDMySyA9ICdURVhUMzJLJyxcblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBpcyBjb21wcmVzc2VkIHVzaW5nIHRoZSBaU1REIGFsZ29yaXRobS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL3pzdGQtZW5jb2RpbmcuaHRtbFxuICAgKi9cbiAgWlNURCA9ICdaU1REJyxcbn1cbiJdfQ==