@angular-package/wrapper
Version:
Wrap the text with the opening and closing chars.
83 lines • 30.3 kB
JavaScript
import { Wrap } from './wrap.class';
export class Wrapper extends Wrap {
get [Symbol.toStringTag]() {
return 'Wrapper';
}
static define(opening, closing, text) {
return new this(opening, closing, text);
}
static isWrapper(value, opening, closing, text) {
return (typeof value === 'object' &&
value instanceof this &&
super.isWrap(value, opening, closing, text));
}
static replaceClosing(text, closing, replaceValue) {
return this.hasClosing(text, closing)
? text.slice(0, -closing.length) + replaceValue
: text;
}
static replaceOpening(text, opening, replaceValue) {
return this.hasOpening(text, opening)
? text.replace(opening, String(replaceValue))
: text;
}
static unwrap(text, opening, closing) {
return ((text = this.replaceClosing(text, closing, '')),
(text = this.replaceOpening(text, opening, '')),
text);
}
constructor(opening, closing, text = '') {
super(opening, closing, text);
}
isClosingIn(text) {
return Wrapper.hasClosing(text, this.closing);
}
isOpeningIn(text) {
return Wrapper.hasOpening(text, this.opening);
}
replaceClosingIn(text, replaceValue) {
return Wrapper.replaceClosing(text, this.closing, replaceValue);
}
replaceOpeningIn(text, replaceValue) {
return Wrapper.replaceOpening(text, this.opening, replaceValue);
}
removeWrapIn(text) {
return ((text = this.replaceClosingIn(text, '')),
(text = this.replaceOpeningIn(text, '')),
text);
}
textReplaceClosing(closing) {
return Wrapper.replaceClosing(this.text, this.closing, closing);
}
textReplaceOpening(opening) {
return Wrapper.replaceOpening(this.text, this.opening, opening);
}
textUnwrap(opening = this.opening, closing = this.closing) {
return Wrapper.unwrap(this.text, opening, closing);
}
textWrap(opening, closing) {
return new Wrap(opening, closing, this.text).valueOf();
}
toArray() {
return [this.opening, this.text, this.closing];
}
toWrap() {
return new Wrap(this.opening, this.closing, this.text);
}
unwrap() {
return this.text;
}
unwrapText(opening = this.opening, closing = this.closing) {
return `${this.opening}${Wrapper.unwrap(this.text, opening, closing)}${this.closing}`;
}
wrap(opening = this.opening, closing = this.closing) {
return new Wrap(opening, closing, this.valueOf()).valueOf();
}
wrapOn(text) {
return new Wrap(this.opening, this.closing, text).valueOf();
}
wrapText(opening, closing) {
return `${this.opening}${this.textWrap(opening, closing)}${this.closing}`;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcHBlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dyYXBwZXIvc3JjL2xpYi93cmFwcGVyLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFPcEMsTUFBTSxPQUFPLE9BSVgsU0FBUSxJQUE0QjtJQU1wQyxJQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBWU0sTUFBTSxDQUFDLE1BQU0sQ0FLbEIsT0FBZ0IsRUFDaEIsT0FBZ0IsRUFDaEIsSUFBVztRQUVYLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBWU0sTUFBTSxDQUFDLFNBQVMsQ0FLckIsS0FBVSxFQUNWLE9BQWlCLEVBQ2pCLE9BQWlCLEVBQ2pCLElBQVc7UUFFWCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLFlBQVksSUFBSTtZQUNyQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQVdNLE1BQU0sQ0FBQyxjQUFjLENBQzFCLElBQVksRUFDWixPQUFlLEVBQ2YsWUFBb0I7UUFFcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFlBQVk7WUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFXTSxNQUFNLENBQUMsY0FBYyxDQUMxQixJQUFZLEVBQ1osT0FBZSxFQUNmLFlBQW9CO1FBRXBCLE9B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RSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBT00sTUFBTTtRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBYU0sVUFBVSxDQUNmLFVBQWtCLElBQUksQ0FBQyxPQUFPLEVBQzlCLFVBQWtCLElBQUksQ0FBQyxPQUFPO1FBRTlCLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQ2xFLElBQUksQ0FBQyxPQUNQLEVBQUUsQ0FBQztJQUNMLENBQUM7SUFhTSxJQUFJLENBSVQsVUFBeUIsSUFBSSxDQUFDLE9BQWMsRUFDNUMsVUFBeUIsSUFBSSxDQUFDLE9BQWM7UUFFNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFTTSxNQUFNLENBQ1gsSUFBZ0I7UUFFaEIsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQVNNLFFBQVEsQ0FJYixPQUFvQixFQUNwQixPQUFvQjtRQUVwQixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUUsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ2xhc3MuXG5pbXBvcnQgeyBXcmFwIH0gZnJvbSAnLi93cmFwLmNsYXNzJztcbi8vIFR5cGUuXG5pbXBvcnQgeyBXcmFwcGVkIH0gZnJvbSAnLi4vdHlwZS93cmFwcGVkLnR5cGUnO1xuLyoqXG4gKiBUaGUgYFdyYXBwZXJgIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYFdyYXBgIG9iamVjdCwgd2hpY2ggbWVhbnMgaXQgcmVwcmVzZW50cyB0aGUgaW1tdXRhYmxlIHdyYXAgb2YgdGhlIG9wZW5pbmcgYW5kIGNsb3Npbmcgd2l0aCB0aGVcbiAqIGFkZGl0aW9uYWwgYWJpbGl0eSB0byB1c2UgaXQgdG8gd3JhcCBzdHJpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgV3JhcHBlcjxcbiAgT3BlbmluZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVGV4dCBleHRlbmRzIHN0cmluZyA9ICcnLFxuICBDbG9zaW5nIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nXG4+IGV4dGVuZHMgV3JhcDxPcGVuaW5nLCBUZXh0LCBDbG9zaW5nPiB7XG4gIC8vI3JlZ2lvbiBpbnN0YW5jZSBhY2Nlc3NvcnMuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHksIHdpdGggdGhlIGhlbHAgb2YgYHRvU3RyaW5nVGFnYCwgY2hhbmdlcyB0aGUgZGVmYXVsdCB0YWcgdG8gYCd3cmFwcGVyJ2AgaW4gdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS4gSXQgY2FuIGJlIHJlYWQgYnkgdGhlXG4gICAqIGB0eXBlT2YoKWAgZnVuY3Rpb24gb2YgYEBhbmd1bGFyLXBhY2thZ2UvdHlwZWAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdXcmFwcGVyJztcbiAgfVxuICAvLyNlbmRyZWdpb24gaW5zdGFuY2UgYWNjZXNzb3JzLlxuXG4gIC8vI3JlZ2lvbiBzdGF0aWMgcHVibGljIG1ldGhvZHMuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgbmV3IGBXcmFwcGVyYCBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBgb3BlbmluZ2AsIGBjbG9zaW5nYCBjaGFycywgYW5kIG9wdGlvbmFsIGB0ZXh0YC5cbiAgICogQHBhcmFtIG9wZW5pbmcgVGhlIG9wZW5pbmcgY2hhcnMgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBPcGVuaW5nYCBmb3IgbmV3IGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsb3NpbmcgVGhlIGNsb3NpbmcgY2hhcnMgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBDbG9zaW5nYCBmb3IgbmV3IGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHRleHQgQW4gb3B0aW9uYWwgdGV4dCBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRgIGZvciBuZXcgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2Ugb2YgZ2l2ZW4gYG9wZW5pbmdgLCBgY2xvc2luZ2AgY2hhcnMsIGFuZCBvcHRpb25hbCBgdGV4dGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmU8XG4gICAgT3BlbmluZyBleHRlbmRzIHN0cmluZyxcbiAgICBDbG9zaW5nIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRleHQgZXh0ZW5kcyBzdHJpbmcgPSAnJ1xuICA+KFxuICAgIG9wZW5pbmc6IE9wZW5pbmcsXG4gICAgY2xvc2luZzogQ2xvc2luZyxcbiAgICB0ZXh0PzogVGV4dFxuICApOiBXcmFwcGVyPE9wZW5pbmcsIFRleHQsIENsb3Npbmc+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMob3BlbmluZywgY2xvc2luZywgdGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIHZhbHVlIG9mIGFueSB0eXBlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBgV3JhcHBlcmAgb2YgYW55LCBvciB0aGUgZ2l2ZW4gYG9wZW5pbmdgLCBgY2xvc2luZ2AgY2hhcnMsIGFuZCBgdGV4dGAuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgYW55IHR5cGUgdG8gdGVzdCBhZ2FpbnN0IHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvcGVuaW5nIE9wdGlvbmFsIG9wZW5pbmcgY2hhcnMgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBPcGVuaW5nYCB0byBjaGVjayBpZiB0aGUgZ2l2ZW4gYHZhbHVlYCBjb250YWlucy5cbiAgICogQHBhcmFtIGNsb3NpbmcgT3B0aW9uYWwgY2xvc2luZyBjaGFycyBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGUgYENsb3NpbmdgIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBgdmFsdWVgIGNvbnRhaW5zLlxuICAgKiBAcGFyYW0gdGV4dCBBbiBvcHRpb25hbCB0ZXh0IG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVGV4dGAgdG8gY2hlY2sgaWYgdGhlIGdpdmVuIGB2YWx1ZWAgY29udGFpbnMuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgdHlwZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGBXcmFwcGVyYCBvZiBhbnksIG9yIHRoZSBnaXZlbiBvcGVuaW5nLFxuICAgKiBjbG9zaW5nIGNoYXJzLCBhbmQgdGV4dC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzV3JhcHBlcjxcbiAgICBPcGVuaW5nIGV4dGVuZHMgc3RyaW5nLFxuICAgIENsb3NpbmcgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVGV4dCBleHRlbmRzIHN0cmluZyA9IHN0cmluZ1xuICA+KFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3BlbmluZz86IE9wZW5pbmcsXG4gICAgY2xvc2luZz86IENsb3NpbmcsXG4gICAgdGV4dD86IFRleHRcbiAgKTogdmFsdWUgaXMgV3JhcHBlcjxPcGVuaW5nLCBUZXh0LCBDbG9zaW5nPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgdGhpcyAmJlxuICAgICAgc3VwZXIuaXNXcmFwKHZhbHVlLCBvcGVuaW5nLCBjbG9zaW5nLCB0ZXh0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgZ2l2ZW4gYGNsb3NpbmdgIGNoYXJzIHdpdGggYSBnaXZlbiByZXBsYWNlbWVudCB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBnaXZlbiBgdGV4dGAuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIGBzdHJpbmdgIHR5cGUgaW4gd2hpY2ggZ2l2ZW4gYGNsb3NpbmdgIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IGEgZ2l2ZW4gcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAqIEBwYXJhbSBjbG9zaW5nIFRoZSBjbG9zaW5nIGNoYXJzIG9mIHRoZSBgc3RyaW5nYCB0byByZXBsYWNlIGJ5IGEgZ2l2ZW4gcmVwbGFjZW1lbnQgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYHRleHRgLlxuICAgKiBAcGFyYW0gcmVwbGFjZVZhbHVlIFRoZSByZXBsYWNlbWVudCB2YWx1ZSBvZiBhIHN0cmluZyB0eXBlIGZvciB0aGUgZ2l2ZW4gYGNsb3NpbmdgIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIGB0ZXh0YC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZ2l2ZW4gYHRleHRgIG9mIGBzdHJpbmdgIHR5cGUgd2l0aCBhIHJlcGxhY2VkIGBjbG9zaW5nYCBjaGFycyBieSBhIGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlIG9yIHRoZVxuICAgKiBzcGVjaWZpZWQgYHRleHRgIHVuY2hhbmdlZCBpZiBpdCBkb2VzIG5vdCBjb250YWluIHRoZSBnaXZlbiBgY2xvc2luZ2AgY2hhcnMuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXBsYWNlQ2xvc2luZyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgY2xvc2luZzogc3RyaW5nLFxuICAgIHJlcGxhY2VWYWx1ZTogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQ2xvc2luZyh0ZXh0LCBjbG9zaW5nKVxuICAgICAgPyB0ZXh0LnNsaWNlKDAsIC1jbG9zaW5nLmxlbmd0aCkgKyByZXBsYWNlVmFsdWVcbiAgICAgIDogdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBnaXZlbiBgb3BlbmluZ2AgY2hhcnMgd2l0aCBhIGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdpdmVuIGB0ZXh0YC5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgYHN0cmluZ2AgdHlwZSBpbiB3aGljaCB0aGUgZ2l2ZW4gYG9wZW5pbmdgIGNoYXJzIGFyZSByZXBsYWNlZCBieSBhIGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgKiBAcGFyYW0gb3BlbmluZyBUaGUgb3BlbmluZyBjaGFycyBvZiB0aGUgYHN0cmluZ2AgdG8gcmVwbGFjZSBieSBhIGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdpdmVuIGB0ZXh0YC5cbiAgICogQHBhcmFtIHJlcGxhY2VWYWx1ZSBUaGUgcmVwbGFjZW1lbnQgdmFsdWUgb2YgYSBzdHJpbmcgdHlwZSBmb3IgdGhlIGdpdmVuIGBvcGVuaW5nYCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBgdGV4dGAuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGdpdmVuIGB0ZXh0YCBvZiBgc3RyaW5nYCB0eXBlIHdpdGggYSByZXBsYWNlZCBgb3BlbmluZ2AgY2hhcnMgYnkgYSBnaXZlbiByZXBsYWNlbWVudCB2YWx1ZSBvciB0aGVcbiAgICogc3BlY2lmaWVkIGB0ZXh0YCB1bmNoYW5nZWQgaWYgaXQgZG9lcyBub3QgY29udGFpbiB0aGUgZ2l2ZW4gYG9wZW5pbmdgIGNoYXJzLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVwbGFjZU9wZW5pbmcoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG9wZW5pbmc6IHN0cmluZyxcbiAgICByZXBsYWNlVmFsdWU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmhhc09wZW5pbmcodGV4dCwgb3BlbmluZylcbiAgICAgID8gdGV4dC5yZXBsYWNlKG9wZW5pbmcsIFN0cmluZyhyZXBsYWNlVmFsdWUpKVxuICAgICAgOiB0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgZ2l2ZW4gYHRleHRgIHdpdGhvdXQgdGhlIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgYHN0cmluZ2AgZnJvbSB3aGljaCBnaXZlbiBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIGFyZSByZW1vdmVkLlxuICAgKiBAcGFyYW0gb3BlbmluZyBUaGUgb3BlbmluZyBjaGFycyBvZiB0aGUgYHN0cmluZ2AgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgZ2l2ZW4gYHRleHRgLlxuICAgKiBAcGFyYW0gY2xvc2luZyBUaGUgY2xvc2luZyBjaGFycyBvZiB0aGUgYHN0cmluZ2AgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgZ2l2ZW4gYHRleHRgLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBnaXZlbiBgdGV4dGAgb2YgYHN0cmluZ2AgdHlwZSB3aXRob3V0IHRoZSBnaXZlbiBgb3BlbmluZ2AgYW5kIGBjbG9zaW5nYCBjaGFycyBvciB1bmNoYW5nZWQgYHRleHRgIGlmXG4gICAqIGl0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW53cmFwKHRleHQ6IHN0cmluZywgb3BlbmluZzogc3RyaW5nLCBjbG9zaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAodGV4dCA9IHRoaXMucmVwbGFjZUNsb3NpbmcodGV4dCwgY2xvc2luZywgJycpKSxcbiAgICAgICh0ZXh0ID0gdGhpcy5yZXBsYWNlT3BlbmluZyh0ZXh0LCBvcGVuaW5nLCAnJykpLFxuICAgICAgdGV4dFxuICAgICk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uIHN0YXRpYyBwdWJsaWMgbWV0aG9kcy5cblxuICAvLyNyZWdpb24gY29uc3RydWN0b3IuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGBXcmFwcGVyYCBpbnN0YW5jZSB3aXRoIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIGFuZCBvcHRpb25hbCB0ZXh0LlxuICAgKiBAcGFyYW0gb3BlbmluZyBUaGUgb3BlbmluZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgT3BlbmluZ2AgcGxhY2VkIGJlZm9yZSB0aGUgZ2l2ZW4gYHRleHRgLlxuICAgKiBAcGFyYW0gY2xvc2luZyBUaGUgY2xvc2luZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgQ2xvc2luZ2AgcGxhY2VkIGFmdGVyIHRoZSBnaXZlbiBgdGV4dGAuXG4gICAqIEBwYXJhbSB0ZXh0IE9wdGlvbmFsIHRleHQgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRgIHRvIHdyYXAgYnkgZ2l2ZW4gYG9wZW5pbmdgIGFuZCBgY2xvc2luZ2AgY2hhcnMuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBuZXcgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wZW5pbmc6IE9wZW5pbmcsIGNsb3Npbmc6IENsb3NpbmcsIHRleHQ6IFRleHQgPSAnJyBhcyBUZXh0KSB7XG4gICAgc3VwZXIob3BlbmluZywgY2xvc2luZywgdGV4dCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uIGNvbnN0cnVjdG9yLlxuXG4gIC8vI3JlZ2lvbiBpbnN0YW5jZSBwdWJsaWMgbWV0aG9kcy5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgYHRleHRgIGhhcyB0aGUgY2xvc2luZyBjaGFycyBvZiB0aGUgc3BlY2lmaWVkIGBXcmFwcGVyYCBvYmplY3QgYXQgdGhlIGVuZC5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgYHN0cmluZ2AgdG8gdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY2xvc2luZyBjaGFycyBhdCB0aGUgZW5kIG9mIGl0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYHRleHRgIGhhcyB0aGUgY2xvc2luZyBjaGFycyBvZiB0aGUgd3JhcC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaXNDbG9zaW5nSW4odGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFdyYXBwZXIuaGFzQ2xvc2luZyh0ZXh0LCB0aGlzLmNsb3NpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBgdGV4dGAgaGFzIHRoZSBvcGVuaW5nIGNoYXJzIG9mIGEgc3BlY2lmaWVkIGBXcmFwcGVyYCBvYmplY3QgYXQgdGhlIGJlZ2lubmluZy5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgYHN0cmluZ2AgdG8gdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgb3BlbmluZyBjaGFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYHRleHRgIGhhcyB0aGUgb3BlbmluZyBjaGFycyBvZiB0aGUgd3JhcC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaXNPcGVuaW5nSW4odGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFdyYXBwZXIuaGFzT3BlbmluZyh0ZXh0LCB0aGlzLm9wZW5pbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBjbG9zaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgb2JqZWN0IGluIHRoZSBnaXZlbiBgdGV4dGAgd2l0aCBhIGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgKiBUaGUgcmVwbGFjZW1lbnQgc3VjY2VlZHMgaWYgdGhlIGNsb3NpbmcgY2hhcmFjdGVycyBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiBgc3RyaW5nYCB0eXBlIGluIHdoaWNoIHRoZSBjbG9zaW5nIGNoYXJzIGFyZSByZXBsYWNlZCBieSBnaXZlbiByZXBsYWNlbWVudCB2YWx1ZS5cbiAgICogQHBhcmFtIHJlcGxhY2VWYWx1ZSBUaGUgdmFsdWUgb2YgYHN0cmluZ2AgdHlwZSBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgY2xvc2luZyBjaGFycyBhdCB0aGUgZW5kIG9mIHRoZSBnaXZlbiBgdGV4dGAuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGdpdmVuIGB0ZXh0YCBvZiBgc3RyaW5nYCB0eXBlIHdpdGggcmVwbGFjZWQgY2xvc2luZyBjaGFycyBieSBnaXZlbiByZXBsYWNlbWVudCB2YWx1ZS5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZUNsb3NpbmdJbih0ZXh0OiBzdHJpbmcsIHJlcGxhY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gV3JhcHBlci5yZXBsYWNlQ2xvc2luZyh0ZXh0LCB0aGlzLmNsb3NpbmcsIHJlcGxhY2VWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIG9wZW5pbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3QgaW4gdGhlIGdpdmVuIGB0ZXh0YCB3aXRoIGEgZ2l2ZW4gcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAqIFRoZSByZXBsYWNlbWVudCBzdWNjZWVkcyBpZiB0aGUgb3BlbmluZyBjaGFyYWN0ZXJzIGV4aXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIGBzdHJpbmdgIHR5cGUgaW4gd2hpY2ggdGhlIG9wZW5pbmcgY2hhcnMgYXJlIHJlcGxhY2VkIGJ5IGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgKiBAcGFyYW0gcmVwbGFjZVZhbHVlIFRoZSB2YWx1ZSBvZiBgc3RyaW5nYCB0eXBlIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvcGVuaW5nIGNoYXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdpdmVuIGB0ZXh0YC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZ2l2ZW4gYHRleHRgIG9mIGBzdHJpbmdgIHR5cGUgd2l0aCByZXBsYWNlZCBvcGVuaW5nIGNoYXJzIGJ5IGdpdmVuIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlT3BlbmluZ0luKHRleHQ6IHN0cmluZywgcmVwbGFjZVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBXcmFwcGVyLnJlcGxhY2VPcGVuaW5nKHRleHQsIHRoaXMub3BlbmluZywgcmVwbGFjZVZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdpdmVuIGB0ZXh0YCB3aXRob3V0IHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiBhIGBzdHJpbmdgIHR5cGUgdG8gdW53cmFwIGZyb20gdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRleHQgb2YgYHN0cmluZ2AgdHlwZSB1bndyYXBwZWQgZnJvbSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlV3JhcEluKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0ZXh0ID0gdGhpcy5yZXBsYWNlQ2xvc2luZ0luKHRleHQsICcnKSksXG4gICAgICAodGV4dCA9IHRoaXMucmVwbGFjZU9wZW5pbmdJbih0ZXh0LCAnJykpLFxuICAgICAgdGV4dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3QgaW4gdGhlIHRleHQgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBUaGUgcmVwbGFjZW1lbnQgc3VjY2VlZHMgaWYgdGhlIGNsb3NpbmcgY2hhcmFjdGVycyBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LlxuICAgKiBAcGFyYW0gY2xvc2luZyBUaGUgY2xvc2luZyBjaGFycyBvZiBgc3RyaW5nYCB0byByZXBsYWNlIGluIHRoZSB0ZXh0KHBhcnQgb2YgdGhlIHByaW1pdGl2ZSB2YWx1ZSkuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRleHQgb2YgYHN0cmluZ2AgdHlwZSB3aXRoIHJlcGxhY2VkIGNsb3NpbmcgY2hhcnMuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHRleHRSZXBsYWNlQ2xvc2luZyhjbG9zaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBXcmFwcGVyLnJlcGxhY2VDbG9zaW5nKHRoaXMudGV4dCwgdGhpcy5jbG9zaW5nLCBjbG9zaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgb3BlbmluZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCBpbiB0aGUgdGV4dCBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgb3BlbmluZ2AgY2hhcnMuIFRoZSByZXBsYWNlbWVudFxuICAgKiBzdWNjZWVkcyBpZiB0aGUgb3BlbmluZyBjaGFyYWN0ZXJzIGV4aXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuXG4gICAqIEBwYXJhbSBvcGVuaW5nIFRoZSBvcGVuaW5nIGNoYXJzIG9mIGBzdHJpbmdgIHRvIHJlcGxhY2UgaW4gdGhlIHRleHQocGFydCBvZiB0aGUgcHJpbWl0aXZlIHZhbHVlKS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGV4dCBvZiBgc3RyaW5nYCB0eXBlIHdpdGggcmVwbGFjZWQgb3BlbmluZyBjaGFycy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgdGV4dFJlcGxhY2VPcGVuaW5nKG9wZW5pbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFdyYXBwZXIucmVwbGFjZU9wZW5pbmcodGhpcy50ZXh0LCB0aGlzLm9wZW5pbmcsIG9wZW5pbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCB3aXRob3V0IGl0cyBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9yIHRoZSBnaXZlbiBgb3BlbmluZ2AgYW5kIGBjbG9zaW5nYCBjaGFycy5cbiAgICogQHBhcmFtIG9wZW5pbmcgT3B0aW9uYWwgb3BlbmluZyBjaGFycyBvZiBgc3RyaW5nYCB0eXBlIHRvIHJlbW92ZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgb2YgdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS4gQnkgZGVmYXVsdCxcbiAgICogaXRzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBvcGVuaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbG9zaW5nIE9wdGlvbmFsIGNsb3NpbmcgY2hhcnMgb2YgYHN0cmluZ2AgdHlwZSB0byByZW1vdmUgZnJvbSB0aGUgZW5kIG9mIHRoZSB0ZXh0IG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuIEJ5IGRlZmF1bHQsIGl0c1xuICAgKiB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgY2xvc2luZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB0ZXh0IG9mIGBzdHJpbmdgIHR5cGUgd2l0aG91dCB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCBvciBnaXZlbiBgb3BlbmluZ2BcbiAgICogYW5kIGBjbG9zaW5nYCBjaGFycy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgdGV4dFVud3JhcChcbiAgICBvcGVuaW5nOiBzdHJpbmcgPSB0aGlzLm9wZW5pbmcsXG4gICAgY2xvc2luZzogc3RyaW5nID0gdGhpcy5jbG9zaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFdyYXBwZXIudW53cmFwKHRoaXMudGV4dCwgb3BlbmluZywgY2xvc2luZyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBgV3JhcHBlcmAgb2JqZWN0IHdyYXBwZWQgYnkgdGhlIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBAcGFyYW0gb3BlbmluZyBUaGUgb3BlbmluZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVGV4dE9wZW5pbmdgIHRvIHdyYXAgdGhlIHRleHQgb2YgdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsb3NpbmcgVGhlIGNsb3NpbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRDbG9zaW5nYCB0byB3cmFwIHRoZSB0ZXh0IG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRleHQgd3JhcHBlZCBieSBnaXZlbiBgb3BlbmluZ2AgYW5kIGNsb3NpbmcgYGNoYXJzYCBvZiBnZW5lcmljIHR5cGUgYFdyYXBwZWRgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB0ZXh0V3JhcDxUZXh0T3BlbmluZyBleHRlbmRzIHN0cmluZywgVGV4dENsb3NpbmcgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIG9wZW5pbmc6IFRleHRPcGVuaW5nLFxuICAgIGNsb3Npbmc6IFRleHRDbG9zaW5nXG4gICk6IFdyYXBwZWQ8VGV4dE9wZW5pbmcsIFRleHQsIFRleHRDbG9zaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBXcmFwKG9wZW5pbmcsIGNsb3NpbmcsIHRoaXMudGV4dCkudmFsdWVPZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYGFycmF5YCBjb25zaXN0aW5nIG9mIHRoZSBvcGVuaW5nIGNoYXJzLCB0ZXh0LCBhbmQgY2xvc2luZyBjaGFycy5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlYWQtb25seSBgYXJyYXlgIGNvbnNpc3Rpbmcgb2YgdGhlIG9wZW5pbmcgY2hhcnMsIHRleHQsIGFuZCBjbG9zaW5nIGNoYXJzLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB0b0FycmF5KCk6IHJlYWRvbmx5IFtPcGVuaW5nLCBUZXh0LCBDbG9zaW5nXSB7XG4gICAgcmV0dXJuIFt0aGlzLm9wZW5pbmcsIHRoaXMudGV4dCwgdGhpcy5jbG9zaW5nXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgV3JhcGAgaW5zdGFuY2UgY29uc2lzdHMgb2YgdGhlIHRleHQsIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgYFdyYXBgIGNvbnNpc3Rpbmcgb2YgdGhlIHRleHQsIG9wZW5pbmcsIGFuZCBjbG9zaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgb2JqZWN0LlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB0b1dyYXAoKTogV3JhcDxPcGVuaW5nLCBUZXh0LCBDbG9zaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBXcmFwKHRoaXMub3BlbmluZywgdGhpcy5jbG9zaW5nLCB0aGlzLnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgd2l0aG91dCB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycy5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGV4dCBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVGV4dGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHVud3JhcCgpOiBUZXh0IHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGBXcmFwcGVyYCBvYmplY3Qgd2l0aCB0ZXh0IHVud3JhcHBlZCBmcm9tIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9mIHRoZVxuICAgKiBgV3JhcHBlcmAgaW5zdGFuY2Ugb3IgZ2l2ZW4gYG9wZW5pbmdgIGFuZCBgY2xvc2luZ2AgY2hhcnMuXG4gICAqIEBwYXJhbSBvcGVuaW5nIE9wdGlvbmFsIG9wZW5pbmcgY2hhcnMgb2YgYHN0cmluZ2AgdHlwZSB0byByZW1vdmUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuIEJ5IGRlZmF1bHQsXG4gICAqIGl0cyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgb3BlbmluZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gY2xvc2luZyBPcHRpb25hbCBjbG9zaW5nIGNoYXJzIG9mIGBzdHJpbmdgIHR5cGUgdG8gcmVtb3ZlIGZyb20gdGhlIGVuZCBvZiB0aGUgdGV4dCBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLiBCeSBkZWZhdWx0LCBpdHNcbiAgICogdmFsdWUgaXMgZXF1YWwgdG8gdGhlIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIGBzdHJpbmdgIHR5cGUgd2l0aCB0ZXh0IHVud3JhcHBlZCBmcm9tIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9mIHRoZVxuICAgKiBgV3JhcHBlcmAgb2JqZWN0IG9yIHRoZSBnaXZlbiBgb3BlbmluZ2AgYW5kIGBjbG9zaW5nYCBjaGFycy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgdW53cmFwVGV4dChcbiAgICBvcGVuaW5nOiBzdHJpbmcgPSB0aGlzLm9wZW5pbmcsXG4gICAgY2xvc2luZzogc3RyaW5nID0gdGhpcy5jbG9zaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMub3BlbmluZ30ke1dyYXBwZXIudW53cmFwKHRoaXMudGV4dCwgb3BlbmluZywgY2xvc2luZyl9JHtcbiAgICAgIHRoaXMuY2xvc2luZ1xuICAgIH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2Qgd3JhcHMgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBgV3JhcHBlcmAgb2JqZWN0IGJ5IGl0cyBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9yIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgXG4gICAqIGNoYXJzLlxuICAgKiBAcGFyYW0gb3BlbmluZyBPcHRpb25hbCBvcGVuaW5nIGNoYXJzIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBDdXN0b21PcGVuaW5nYCB0byB3cmFwIHRoZSBwcmltaXRpdmUgdmFsdWUgb2YgdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQnkgZGVmYXVsdCwgaXRzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBvcGVuaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbG9zaW5nIE9wdGlvbmFsIGNsb3NpbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYEN1c3RvbUNsb3NpbmdgIHRvIHdyYXAgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBCeSBkZWZhdWx0LCBpdHMgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHByaW1pdGl2ZSB2YWx1ZSB3cmFwcGVkIGJ5IHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2Ugb3IgdGhlIGdpdmVuXG4gICAqIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyB3cmFwPFxuICAgIEN1c3RvbU9wZW5pbmcgZXh0ZW5kcyBzdHJpbmcgPSBPcGVuaW5nLFxuICAgIEN1c3RvbUNsb3NpbmcgZXh0ZW5kcyBzdHJpbmcgPSBDbG9zaW5nXG4gID4oXG4gICAgb3BlbmluZzogQ3VzdG9tT3BlbmluZyA9IHRoaXMub3BlbmluZyBhcyBhbnksXG4gICAgY2xvc2luZzogQ3VzdG9tQ2xvc2luZyA9IHRoaXMuY2xvc2luZyBhcyBhbnlcbiAgKTogV3JhcHBlZDxDdXN0b21PcGVuaW5nLCBXcmFwcGVkPE9wZW5pbmcsIFRleHQsIENsb3Npbmc+LCBDdXN0b21DbG9zaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBXcmFwKG9wZW5pbmcsIGNsb3NpbmcsIHRoaXMudmFsdWVPZigpKS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGhvZCB3cmFwcyB0aGUgZ2l2ZW4gYHRleHRgIHdpdGggdGhlIHdyYXAsIHRoZSBgb3BlbmluZ2AsIGFuZCBgY2xvc2luZ2AgY2hhcnMgb2YgdGhlIGBXcmFwcGVyYCBvYmplY3QuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgQ3VzdG9tVGV4dGAgdG8gd3JhcCBieSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBnaXZlbiBgdGV4dGAgd3JhcHBlZCBieSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycyBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCBvZiB0aGUgZ2VuZXJpYyB0eXBlXG4gICAqIGBXcmFwcGVkYC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgd3JhcE9uPEN1c3RvbVRleHQgZXh0ZW5kcyBzdHJpbmcgPSAnJz4oXG4gICAgdGV4dDogQ3VzdG9tVGV4dFxuICApOiBXcmFwcGVkPE9wZW5pbmcsIEN1c3RvbVRleHQsIENsb3Npbmc+IHtcbiAgICByZXR1cm4gbmV3IFdyYXAodGhpcy5vcGVuaW5nLCB0aGlzLmNsb3NpbmcsIHRleHQpLnZhbHVlT2YoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGUgYFdyYXBwZXJgIG9iamVjdCB3aXRoIHRleHQgd3JhcHBlZCBieSBnaXZlbiBgb3BlbmluZ2AgYW5kIGBjbG9zaW5nYCBjaGFycy5cbiAgICogQHBhcmFtIG9wZW5pbmcgVGhlIG9wZW5pbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRPcGVuaW5nYCB0byB3cmFwIHRoZSB0ZXh0IG9mIHRoZSBgV3JhcHBlcmAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbG9zaW5nIFRoZSBjbG9zaW5nIGNoYXJzIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBUZXh0Q2xvc2luZ2AgdG8gd3JhcCB0aGUgdGV4dCBvZiB0aGUgYFdyYXBwZXJgIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwcmltaXRpdmUgdmFsdWUgd2l0aCB3cmFwcGVkIHRleHQgYnkgZ2l2ZW4gb3BlbmluZyBhbmQgY2xvc2luZyBjaGFyYWN0ZXJzIG9mIGdlbmVyaWMgdHlwZSBgV3JhcHBlZGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHdyYXBUZXh0PFxuICAgIFRleHRPcGVuaW5nIGV4dGVuZHMgc3RyaW5nID0gJycsXG4gICAgVGV4dENsb3NpbmcgZXh0ZW5kcyBzdHJpbmcgPSAnJ1xuICA+KFxuICAgIG9wZW5pbmc6IFRleHRPcGVuaW5nLFxuICAgIGNsb3Npbmc6IFRleHRDbG9zaW5nXG4gICk6IFdyYXBwZWQ8T3BlbmluZywgV3JhcHBlZDxUZXh0T3BlbmluZywgVGV4dCwgVGV4dENsb3Npbmc+LCBDbG9zaW5nPiB7XG4gICAgcmV0dXJuIGAke3RoaXMub3BlbmluZ30ke3RoaXMudGV4dFdyYXAob3BlbmluZywgY2xvc2luZyl9JHt0aGlzLmNsb3Npbmd9YDtcbiAgfVxuICAvLyNlbmRyZWdpb24gaW5zdGFuY2UgcHVibGljIG1ldGhvZHMuXG59XG4iXX0=