stimulsoft-forms
Version:
Stimulsoft PDF Forms
166 lines (165 loc) • 21.7 kB
JavaScript
/*
{*******************************************************************}
{ }
{ }
{ }
{ Copyright (C) Stimulsoft }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ ARE CONFIDENTIAL AND PROPRIETARY }
{ TRADE SECRETS OF Stimulsoft }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
*/
import List from "./List";
import { StiObject } from "./StiObject";
export default class Hashtable {
constructor(options = { ignoreCase: false }) {
this.ignoreCase = false;
this.isSimpleKeys = false;
this.keys = new List();
this.values = new List();
this.indexObject = {};
this.ignoreCase = options.ignoreCase;
if (this.ignoreCase)
this.isSimpleKeys = true;
}
get(key) {
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
return this.values[this.indexObject[key]];
}
return this.values[this.keys.indexOf(key)];
}
set(key, value) {
if (this.isSimpleKeys) {
let type = typeof key;
if (type != "string" && type != "number") {
this.isSimpleKeys = false;
this.indexObject = {};
}
}
else if (this.keys.length == 0) {
let type = typeof key;
if (type == "string" || type == "number")
this.isSimpleKeys = true;
}
let index = -1;
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
index = this.indexObject[key];
}
else
index = this.keys.indexOf(key);
if (index >= 0)
this.values[index] = value;
else {
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
this.indexObject[key] = this.keys.length;
}
this.keys.push(key);
this.values.push(value);
}
}
/** Adds an element with the specified key and value into the Hashtable. */
add(key, value) {
this.set(key, value);
}
/** Determines whether the Hashtable contains a specific key. */
contains(key) {
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
return this.indexObject[key] != undefined;
}
return this.keys.contains(key);
}
/** Determines whether the Hashtable contains a specific key. */
containsKey(key) {
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
return this.indexObject[key] != undefined;
}
return this.keys.contains(key);
}
/** Determines whether the Hashtable contains a specific value. */
containsValue(value) {
return this.values.contains(value);
}
/** Removes the element with the specified key from the Hashtable. */
remove(key) {
let index;
if (this.isSimpleKeys) {
if (this.ignoreCase)
key = key.toLowerCase();
index = this.indexObject[key];
}
else
index = this.keys.indexOf(key);
if (index >= 0) {
this.keys.removeAt(index);
this.values.removeAt(index);
if (this.isSimpleKeys) {
this.indexObject = {};
for (let index = 0; index < this.keys.length; index++) {
this.indexObject[this.ignoreCase ? this.keys[index].toLowerCase() : this.keys[index]] = index;
}
}
}
}
/** Removes all elements from the Hashtable. */
clear() {
this.keys = new List();
this.values = new List();
this.indexObject = {};
this.isSimpleKeys = false;
}
/** Copies the Hashtable elements to a one-dimensional Array instance at the specified index. */
copyTo(array, arrayIndex) {
while (array.length < arrayIndex) {
array.push(null);
}
for (let value of this.values) {
if (array.length > arrayIndex)
array[arrayIndex] = value;
else
array.push(value);
arrayIndex++;
}
}
/** Gets the number of key/value pairs contained in the Hashtable. */
get count() {
return this.keys.length;
}
clone() {
let newHashtable = new Hashtable();
this.keys.copyTo(newHashtable.keys);
this.values.copyTo(newHashtable.values);
if (this.isSimpleKeys)
for (let key of StiObject.keys(this.indexObject)) {
newHashtable.indexObject[key] = this.indexObject[key];
}
newHashtable.ignoreCase = this.ignoreCase;
newHashtable.isSimpleKeys = this.isSimpleKeys;
return newHashtable;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaHRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RpbXVsc29mdC1mb3Jtcy9zcmMvbGliL3N5c3RlbS9IYXNodGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMEJFO0FBQ0YsT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxTQUFTO0lBUzFCLFlBQVksT0FBTyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtRQVJuQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLFNBQUksR0FBRyxJQUFJLElBQUksRUFBSyxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxJQUFJLElBQUksRUFBSyxDQUFDO1FBRWYsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFHMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQU07UUFDTixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVO2dCQUFFLEdBQUcsR0FBUyxHQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0Ms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QUFHLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBRUwsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUU5QyxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG57KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKn1cclxueyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG57ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxueyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbnsgICBDb3B5cmlnaHQgKEMpICBTdGltdWxzb2Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG57ICAgQUxMIFJJR0hUUyBSRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxueyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbnsgICBUaGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBpcyBwcm90ZWN0ZWQgYnkgVS5TLiBhbmQgICAgICAgfVxyXG57ICAgSW50ZXJuYXRpb25hbCBDb3B5cmlnaHQgTGF3cy4gVW5hdXRob3JpemVkIHJlcHJvZHVjdGlvbiwgICAgICAgIH1cclxueyAgIHJldmVyc2UtZW5naW5lZXJpbmcsIGFuZCBkaXN0cmlidXRpb24gb2YgYWxsIG9yIGFueSBwb3J0aW9uIG9mICB9XHJcbnsgICB0aGUgY29kZSBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIHN0cmljdGx5IHByb2hpYml0ZWQgYW5kIG1heSAgfVxyXG57ICAgcmVzdWx0IGluIHNldmVyZSBjaXZpbCBhbmQgY3JpbWluYWwgcGVuYWx0aWVzIGFuZCB3aWxsIGJlICAgICAgIH1cclxueyAgIHByb3NlY3V0ZWQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlIHVuZGVyIHRoZSBsYXcuICAgICAgICB9XHJcbnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG57ICAgUkVTVFJJQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxueyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbnsgICBUSElTIFNPVVJDRSBDT0RFIEFORCBBTEwgUkVTVUxUSU5HIElOVEVSTUVESUFURSBGSUxFUyAgICAgICAgICAgfVxyXG57ICAgQVJFIENPTkZJREVOVElBTCBBTkQgUFJPUFJJRVRBUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxueyAgIFRSQURFIFNFQ1JFVFMgT0YgU3RpbXVsc29mdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG57ICAgQ09OU1VMVCBUSEUgRU5EIFVTRVIgTElDRU5TRSBBR1JFRU1FTlQgRk9SIElORk9STUFUSU9OIE9OICAgICAgIH1cclxueyAgIEFERElUSU9OQUwgUkVTVFJJQ1RJT05TLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG57KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKn1cclxuKi9cclxuaW1wb3J0IExpc3QgZnJvbSBcIi4vTGlzdFwiO1xyXG5pbXBvcnQgeyBTdGlPYmplY3QgfSBmcm9tIFwiLi9TdGlPYmplY3RcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGFzaHRhYmxlPEsgPSBhbnksIFYgPSBhbnk+IHtcclxuICAgIHByaXZhdGUgaWdub3JlQ2FzZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBpc1NpbXBsZUtleXMgPSBmYWxzZTtcclxuXHJcbiAgICBrZXlzID0gbmV3IExpc3Q8Sz4oKTtcclxuICAgIHZhbHVlcyA9IG5ldyBMaXN0PFY+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBpbmRleE9iamVjdDogYW55ID0ge307XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHsgaWdub3JlQ2FzZTogZmFsc2UgfSkge1xyXG4gICAgICAgIHRoaXMuaWdub3JlQ2FzZSA9IG9wdGlvbnMuaWdub3JlQ2FzZTtcclxuICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSB0aGlzLmlzU2ltcGxlS2V5cyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGtleTogSyk6IFYge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2ltcGxlS2V5cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSBrZXkgPSAoPGFueT5rZXkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4T2JqZWN0W2tleV1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy5rZXlzLmluZGV4T2Yoa2V5KV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGtleTogSywgdmFsdWU6IFYpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1NpbXBsZUtleXMpIHtcclxuICAgICAgICAgICAgbGV0IHR5cGU6IHN0cmluZyA9IHR5cGVvZiBrZXk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic3RyaW5nXCIgJiYgdHlwZSAhPSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2ltcGxlS2V5cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMua2V5cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBsZXQgdHlwZTogc3RyaW5nID0gdHlwZW9mIGtleTtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIiB8fCB0eXBlID09IFwibnVtYmVyXCIpIHRoaXMuaXNTaW1wbGVLZXlzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaW1wbGVLZXlzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpIGtleSA9ICg8YW55PmtleSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmluZGV4T2JqZWN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy52YWx1ZXNbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2ltcGxlS2V5cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkga2V5ID0gKDxhbnk+a2V5KS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE9iamVjdFtrZXldID0gdGhpcy5rZXlzLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFkZHMgYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZSBpbnRvIHRoZSBIYXNodGFibGUuICovXHJcbiAgICBhZGQoa2V5OiBLLCB2YWx1ZTogVikge1xyXG4gICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEhhc2h0YWJsZSBjb250YWlucyBhIHNwZWNpZmljIGtleS4gKi9cclxuICAgIGNvbnRhaW5zKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2ltcGxlS2V5cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSBrZXkgPSAoPGFueT5rZXkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4T2JqZWN0W2tleV0gIT0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5rZXlzLmNvbnRhaW5zKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIERldGVybWluZXMgd2hldGhlciB0aGUgSGFzaHRhYmxlIGNvbnRhaW5zIGEgc3BlY2lmaWMga2V5LiAqL1xyXG4gICAgY29udGFpbnNLZXkoa2V5OiBLKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaW1wbGVLZXlzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpIGtleSA9ICg8YW55PmtleSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPYmplY3Rba2V5XSAhPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmtleXMuY29udGFpbnMoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBIYXNodGFibGUgY29udGFpbnMgYSBzcGVjaWZpYyB2YWx1ZS4gKi9cclxuICAgIGNvbnRhaW5zVmFsdWUodmFsdWU6IFYpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuY29udGFpbnModmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZW1vdmVzIHRoZSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgSGFzaHRhYmxlLiAqL1xyXG4gICAgcmVtb3ZlKGtleTogSykge1xyXG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2ltcGxlS2V5cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSBrZXkgPSAoPGFueT5rZXkpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleE9iamVjdFtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGluZGV4ID0gdGhpcy5rZXlzLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmtleXMucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5yZW1vdmVBdChpbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpbXBsZUtleXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhPYmplY3QgPSB7fTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmtleXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleE9iamVjdFt0aGlzLmlnbm9yZUNhc2UgPyAoPGFueT50aGlzLmtleXNbaW5kZXhdKS50b0xvd2VyQ2FzZSgpIDogdGhpcy5rZXlzW2luZGV4XV0gPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgSGFzaHRhYmxlLiAqL1xyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5rZXlzID0gbmV3IExpc3Q8Sz4oKTtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBMaXN0PFY+KCk7XHJcbiAgICAgICAgdGhpcy5pbmRleE9iamVjdCA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXNTaW1wbGVLZXlzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvcGllcyB0aGUgSGFzaHRhYmxlIGVsZW1lbnRzIHRvIGEgb25lLWRpbWVuc2lvbmFsIEFycmF5IGluc3RhbmNlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguICovXHJcbiAgICBjb3B5VG8oYXJyYXk6IFZbXSwgYXJyYXlJbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgd2hpbGUgKGFycmF5Lmxlbmd0aCA8IGFycmF5SW5kZXgpIHtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdGhpcy52YWx1ZXMpIHtcclxuICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IGFycmF5SW5kZXgpIGFycmF5W2FycmF5SW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGVsc2UgYXJyYXkucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIGFycmF5SW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEdldHMgdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkIGluIHRoZSBIYXNodGFibGUuICovXHJcbiAgICBnZXQgY291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5rZXlzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBjbG9uZSgpOiBIYXNodGFibGU8SywgVj4ge1xyXG4gICAgICAgIGxldCBuZXdIYXNodGFibGU6IEhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTtcclxuICAgICAgICB0aGlzLmtleXMuY29weVRvKG5ld0hhc2h0YWJsZS5rZXlzKTtcclxuICAgICAgICB0aGlzLnZhbHVlcy5jb3B5VG8obmV3SGFzaHRhYmxlLnZhbHVlcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU2ltcGxlS2V5cylcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIFN0aU9iamVjdC5rZXlzKHRoaXMuaW5kZXhPYmplY3QpKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdIYXNodGFibGUuaW5kZXhPYmplY3Rba2V5XSA9IHRoaXMuaW5kZXhPYmplY3Rba2V5XTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXdIYXNodGFibGUuaWdub3JlQ2FzZSA9IHRoaXMuaWdub3JlQ2FzZTtcclxuICAgICAgICBuZXdIYXNodGFibGUuaXNTaW1wbGVLZXlzID0gdGhpcy5pc1NpbXBsZUtleXM7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdIYXNodGFibGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==