@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
551 lines • 47.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: tags.input.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
import isEmpty from 'lodash-es/isEmpty';
import { BehaviorSubject, fromEvent, of } from 'rxjs';
import { debounceTime, filter, map, switchMap } from 'rxjs/operators';
export class TagsInputComponent {
constructor() {
/**
* 【必选】记录输入的标签
*/
this.tags = [];
/**
* 【可选】使用的属性名
*/
this.displayProperty = 'name';
/**
* 【可选】输入的placeholder
*/
this.placeholder = '';
/**
* 【可选】输入标签的最小长度
*/
this.minLength = 3;
/**
* 【可选】输入标签的最大长度
*/
this.maxLength = Number.MAX_SAFE_INTEGER;
/**
* 【可选】标签的最小个数
*/
this.minTags = 0;
/**
* 【可选】标签的最大个数
*/
this.maxTags = Number.MAX_SAFE_INTEGER;
/**
* 【可选】输入框的spellcheck
*/
this.spellcheck = true;
/**
* 【可选】下拉选项
*/
this.suggestionList = [];
/**
* 是否按空格添加tag
*/
this.isAddBySpace = true;
/**
* 大小写敏感
*/
this.caseSensitivity = false;
/**
* 输出函数,当选中某个选项项后,将会调用此函数,参数为当前选择项的值。如果需要获取所有选择状态的值,请参考(ngModelChange)方法
*/
this.valueChange = new EventEmitter();
this.newTag = '';
this.showSuggestionList = false;
this.availableOptions = [];
this.newTagValid = false;
this.isReduce = false;
this.KEYS = {
backspace: 8,
tab: 9,
enter: 13,
escape: 27,
space: 32,
up: 38,
down: 40,
left: 37,
right: 39,
delete: 46,
comma: 188
};
// 下拉选中suggestionList的item索引
this.selectIndex = 0;
}
/**
* @return {?}
*/
ngOnInit() {
this.newTag = '';
this.searchFn = (/**
* @param {?} term
* @return {?}
*/
(term) => {
return of((this.suggestionList ? this.suggestionList : [])
.filter((/**
* @param {?} item
* @return {?}
*/
item => term === '' ? true : this.caseSensitivity ?
(item[this.displayProperty]).indexOf(term) !== -1 :
(item[this.displayProperty]).toLowerCase().indexOf(term.toLowerCase()) !== -1)));
});
this.registerFilterChange();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes && changes.suggestionList && changes.suggestionList.currentValue) {
this.reduceSuggestionList();
if (this.sourceSubscription && this.searchFn) {
this.sourceSubscription.next('');
}
}
if (changes && changes.tags && changes.tags.currentValue) {
this.reduceSuggestionList();
}
}
/**
* @return {?}
*/
registerFilterChange() {
this.sourceSubscription = new BehaviorSubject('');
this.sourceSubscription.pipe(map((/**
* @param {?} term
* @return {?}
*/
term => {
this.tagIsValid();
return term;
})), switchMap((/**
* @param {?} term
* @return {?}
*/
term => this.searchFn(term))))
.subscribe((/**
* @param {?} options
* @return {?}
*/
options => {
this.availableOptions = options;
if (!this.availableOptions || this.availableOptions.length <= 0) {
this.selectIndex = -1;
}
else {
this.selectIndex = 0;
}
}));
fromEvent(this.tagInputElement.nativeElement, 'input')
.pipe(map((/**
* @param {?} e
* @return {?}
*/
(e) => e['target'].value)), filter((/**
* @param {?} term
* @return {?}
*/
term => true)), debounceTime(100) // hard code need refactory
).subscribe((/**
* @param {?} term
* @return {?}
*/
term => this.sourceSubscription.next(term)));
}
/**
* @return {?}
*/
reduceSuggestionList() {
if (this.isReduce) {
return;
}
if (this.suggestionList.length > 0 && this.tags.length > 0) {
this.isReduce = true;
this.suggestionList = this.suggestionList.filter((/**
* @param {?} suggestion
* @return {?}
*/
suggestion => {
return this.tags.findIndex((/**
* @param {?} tag
* @return {?}
*/
tag => this.caseSensitivity ?
tag[this.displayProperty] === suggestion[this.displayProperty] :
tag[this.displayProperty].toLowerCase() === suggestion[this.displayProperty].toLowerCase())) === -1;
}));
if (this.sourceSubscription && this.searchFn) {
this.sourceSubscription.next('');
}
}
}
/**
* @return {?}
*/
host_click() {
this.tagInputElement.nativeElement.focus();
this.selectIndex = 0;
}
/**
* @param {?} event
* @return {?}
*/
input_keydown(event) {
/** @type {?} */
const hotkeys = [this.KEYS.enter, this.KEYS.tab, this.KEYS.up, this.KEYS.down];
if (this.isAddBySpace) {
hotkeys.push(this.KEYS.space);
}
if (hotkeys.indexOf(event.keyCode) === -1) {
return;
}
else if (event.keyCode === this.KEYS.down) {
// 向下选择选项
this.select(++this.selectIndex);
}
else if (event.keyCode === this.KEYS.up) {
// 向上选择选项
this.select(--this.selectIndex);
}
else if (event.keyCode === this.KEYS.enter || event.keyCode === this.KEYS.tab) {
if (this.selectIndex !== -1) {
// 回车或tab添加selectIndex的值
setTimeout((/**
* @return {?}
*/
() => {
this.addSuggestionByIndex(this.selectIndex, this.availableOptions[this.selectIndex]);
}), 50);
}
else {
this.addTag();
}
}
else {
// 添加输入的值
this.addTag();
}
}
/**
* @param {?} index
* @return {?}
*/
select(index) {
if (index < 0) {
index = this.suggestionList.length - 1;
}
else if (index >= this.suggestionList.length) {
index = 0;
}
this.selectIndex = index;
}
/**
* @param {?} event
* @return {?}
*/
input_focus(event) {
this.showSuggestionList = true;
}
/**
* @param {?} event
* @return {?}
*/
input_blur(event) {
if (isEmpty(this.newTag)) {
return;
}
this.addTag();
}
/**
* @param {?} index
* @param {?} value
* @return {?}
*/
addSuggestionByIndex(index, value) {
if (index < 0 || index >= this.availableOptions.length || this.maxTags <= this.tags.length
|| this.tags.findIndex((/**
* @param {?} item
* @return {?}
*/
item => this.caseSensitivity ? item[this.displayProperty] === value[this.displayProperty]
: item[this.displayProperty].toLowerCase() === value[this.displayProperty].toLowerCase())) !== -1) {
return;
}
this.canAdd().then((/**
* @param {?} result
* @return {?}
*/
result => {
if (!result) {
return;
}
this.tags.push(this.availableOptions[index]);
this.valueChange.emit(this.availableOptions[index]);
/** @type {?} */
const suggestionListIndex = this.suggestionList.findIndex((/**
* @param {?} item
* @return {?}
*/
item => this.caseSensitivity ? item[this.displayProperty] === value[this.displayProperty] :
item[this.displayProperty].toLowerCase() === value[this.displayProperty].toLowerCase()));
this.suggestionList.splice(suggestionListIndex, 1);
this.newTag = '';
this.sourceSubscription.next(this.newTag);
}));
}
/**
* @param {?} index
* @return {?}
*/
removeTag(index) {
if (index < 0 || index >= this.tags.length) {
return;
}
this.availableOptions.push(this.tags[index]);
this.suggestionList = this.availableOptions;
/** @type {?} */
const tag = this.tags[index];
this.tags.splice(index, 1);
this.valueChange.emit(tag);
}
/**
* @return {?}
*/
tagIsValid() {
/** @type {?} */
const tag = this.newTag;
/** @type {?} */
const tmp = this.displayProperty;
/** @type {?} */
const result = tag && tag.length >= this.minLength
&& tag.length <= this.maxLength
&& this.suggestionList.findIndex((/**
* @param {?} item
* @return {?}
*/
item => this.caseSensitivity ? item[tmp] === tag
: item[tmp].toLowerCase() === tag.toLowerCase())) === -1
&& this.tags.findIndex((/**
* @param {?} item
* @return {?}
*/
item => this.caseSensitivity ? item[tmp] === tag
: item[tmp].toLowerCase() === tag.toLowerCase())) === -1
&& !this.isEmptyString(tag);
this.newTagValid = tag === '' || !!result;
return result;
}
/**
* @param {?} tag
* @return {?}
*/
isEmptyString(tag) {
/** @type {?} */
const temp = tag.match(/\s/g);
if (temp) {
return tag.length === temp.length;
}
else {
return false;
}
}
/**
* @return {?}
*/
addTag() {
this.canAdd().then((/**
* @param {?} result
* @return {?}
*/
result => {
if (result && this.maxTags > this.tags.length) {
if (this.tagIsValid()) {
/** @type {?} */
const obj = {};
obj[this.displayProperty] = this.newTag;
this.tags.push(obj);
this.valueChange.emit(this.newTag);
// this.availableOptions = this.suggestionList;
}
setTimeout((/**
* @return {?}
*/
() => {
// 放在timeout里是因为如果用空格添加tag,会导致添加之后输入框里有个空格。
this.newTag = '';
}), 50);
}
else {
this.newTagValid = false;
}
}));
this.sourceSubscription.next('');
}
/**
* @return {?}
*/
canAdd() {
/** @type {?} */
let checkResult = Promise.resolve(true);
if (this.checkBeforeAdd) {
/** @type {?} */
const result = this.checkBeforeAdd(this.newTag);
if (typeof result !== 'undefined') {
if (result.then) {
checkResult = result;
}
else if (result.subscribe) {
checkResult = ((/** @type {?} */ (result))).toPromise();
}
else {
checkResult = Promise.resolve(result);
}
}
}
return checkResult;
}
/**
* @param {?} $event
* @return {?}
*/
onDocumentClick($event) {
if (this.showSuggestionList && !this.selectBoxElement.nativeElement.contains($event.target)) {
this.showSuggestionList = false;
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.sourceSubscription) {
this.sourceSubscription.unsubscribe();
}
}
}
TagsInputComponent.decorators = [
{ type: Component, args: [{
selector: 'd-tags-input',
template: "<div #selectBox class=\"devui-tags-host\" tabindex=\"-1\" (click)=\"host_click()\">\r\n <div class=\"devui-tags\">\r\n <ul class=\"devui-tag-list\">\r\n <li class=\"devui-tag-item\" *ngFor=\"let tag of tags; let index = index\">\r\n <span>{{ tag[displayProperty] }}</span>\r\n <a class=\"remove-button\" (click)=\"removeTag(index)\">\u00D7</a>\r\n </li>\r\n </ul>\r\n <input\r\n #tagInput\r\n class=\"input devui-input\"\r\n [(ngModel)]=\"newTag\"\r\n (keydown)=\"input_keydown($event)\"\r\n (focus)=\"input_focus($event)\"\r\n (blur)=\"input_blur($event)\"\r\n (trim)=\"(false)\"\r\n [placeholder]=\"placeholder\"\r\n [spellcheck]=\"spellcheck\"\r\n [ngClass]=\"{ 'invalid-tag': !newTagValid }\"\r\n type=\"text\"\r\n />\r\n </div>\r\n <div class=\"devui-tags-autocomplete\" *ngIf=\"showSuggestionList && availableOptions?.length\">\r\n <ul class=\"devui-suggestion-list\">\r\n <li\r\n class=\"devui-suggestion-item\"\r\n *ngFor=\"let item of availableOptions; let index = index\"\r\n [ngClass]=\"{ selected: index === selectIndex }\"\r\n (mousedown)=\"addSuggestionByIndex(index, item)\"\r\n >\r\n {{ item[displayProperty] }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>\r\n",
exportAs: 'TagsInput',
styles: [":host{display:block}.devui-tags-host{position:relative;height:100%}.devui-tags-host:active{outline:0}.devui-tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:2px 5px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #adb0b8;border-radius:1px;height:100%}.devui-tags:hover{border-color:#344899}.devui-tags.focused{outline:0}.devui-tags .devui-tag-list{margin:0;padding:0;list-style-type:none}.devui-tags .devui-tag-item{margin:2px;padding:0 5px;display:inline-block;min-height:20px;line-height:20px;border-radius:1px;color:#252b3a;background-color:#eef0f5}.devui-tags .devui-tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:top;font-size:16px;line-height:20px;color:#252b3a}.devui-tags .devui-tag-item .remove-button:hover{text-decoration:none}.devui-tags input.devui-input{border:0;outline:0;float:left;width:100%;height:26px;font-size:14px;padding-left:5px}.devui-tags input.devui-input::-ms-clear{display:none}.devui-tags-autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:99999;width:100%;background-color:#fff;border:#adb0b8;box-shadow:0 5px 10px rgba(41,48,64,.2)}.devui-tags-autocomplete .devui-suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;line-height:20px;color:#252b3a;background-color:#fff}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item:hover{background-color:#f2f5fc}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item.selected{color:#5e7ce0;background-color:#f2f5fc}"]
}] }
];
TagsInputComponent.propDecorators = {
tags: [{ type: Input }],
displayProperty: [{ type: Input }],
placeholder: [{ type: Input }],
minLength: [{ type: Input }],
maxLength: [{ type: Input }],
minTags: [{ type: Input }],
maxTags: [{ type: Input }],
spellcheck: [{ type: Input }],
suggestionList: [{ type: Input }],
isAddBySpace: [{ type: Input }],
caseSensitivity: [{ type: Input }],
checkBeforeAdd: [{ type: Input }],
valueChange: [{ type: Output }],
tagInputElement: [{ type: ViewChild, args: ['tagInput', { static: true },] }],
selectBoxElement: [{ type: ViewChild, args: ['selectBox', { static: true },] }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
if (false) {
/**
* 【必选】记录输入的标签
* @type {?}
*/
TagsInputComponent.prototype.tags;
/**
* 【可选】使用的属性名
* @type {?}
*/
TagsInputComponent.prototype.displayProperty;
/**
* 【可选】输入的placeholder
* @type {?}
*/
TagsInputComponent.prototype.placeholder;
/**
* 【可选】输入标签的最小长度
* @type {?}
*/
TagsInputComponent.prototype.minLength;
/**
* 【可选】输入标签的最大长度
* @type {?}
*/
TagsInputComponent.prototype.maxLength;
/**
* 【可选】标签的最小个数
* @type {?}
*/
TagsInputComponent.prototype.minTags;
/**
* 【可选】标签的最大个数
* @type {?}
*/
TagsInputComponent.prototype.maxTags;
/**
* 【可选】输入框的spellcheck
* @type {?}
*/
TagsInputComponent.prototype.spellcheck;
/**
* 【可选】下拉选项
* @type {?}
*/
TagsInputComponent.prototype.suggestionList;
/**
* 是否按空格添加tag
* @type {?}
*/
TagsInputComponent.prototype.isAddBySpace;
/**
* 大小写敏感
* @type {?}
*/
TagsInputComponent.prototype.caseSensitivity;
/** @type {?} */
TagsInputComponent.prototype.checkBeforeAdd;
/**
* 输出函数,当选中某个选项项后,将会调用此函数,参数为当前选择项的值。如果需要获取所有选择状态的值,请参考(ngModelChange)方法
* @type {?}
*/
TagsInputComponent.prototype.valueChange;
/** @type {?} */
TagsInputComponent.prototype.tagInputElement;
/** @type {?} */
TagsInputComponent.prototype.selectBoxElement;
/** @type {?} */
TagsInputComponent.prototype.newTag;
/** @type {?} */
TagsInputComponent.prototype.showSuggestionList;
/** @type {?} */
TagsInputComponent.prototype.availableOptions;
/** @type {?} */
TagsInputComponent.prototype.newTagValid;
/** @type {?} */
TagsInputComponent.prototype.isReduce;
/** @type {?} */
TagsInputComponent.prototype.searchFn;
/**
* @type {?}
* @private
*/
TagsInputComponent.prototype.sourceSubscription;
/**
* @type {?}
* @private
*/
TagsInputComponent.prototype.KEYS;
/** @type {?} */
TagsInputComponent.prototype.selectIndex;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS90YWdzLWlucHV0LyIsInNvdXJjZXMiOlsidGFncy5pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDakMsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVF0RSxNQUFNLE9BQU8sa0JBQWtCO0lBUC9COzs7O1FBV1csU0FBSSxHQUFHLEVBQUUsQ0FBQzs7OztRQUlWLG9CQUFlLEdBQUcsTUFBTSxDQUFDOzs7O1FBSXpCLGdCQUFXLEdBQUcsRUFBRSxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxDQUFDLENBQUM7Ozs7UUFJZCxjQUFTLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTVDLFlBQU8sR0FBRyxDQUFDLENBQUM7Ozs7UUFJWixZQUFPLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTFDLGVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7UUFJbEIsbUJBQWMsR0FBUSxFQUFFLENBQUM7Ozs7UUFJekIsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7Ozs7UUFNdkIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzNDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IscUJBQWdC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QTZCOzs7OztJQUk3Qiw2Q0FBaUM7O0lBRWpDLDRDQUE4Rjs7Ozs7SUFJOUYseUNBQTJDOztJQUUzQyw2Q0FBcUU7O0lBQ3JFLDhDQUF1RTs7SUFFdkUsb0NBQVk7O0lBQ1osZ0RBQTJCOztJQUMzQiw4Q0FBc0I7O0lBQ3RCLHlDQUFvQjs7SUFDcEIsc0NBQWlCOztJQUNqQixzQ0FBb0Y7Ozs7O0lBQ3BGLGdEQUFpRDs7Ozs7SUFDakQsa0NBWUU7O0lBRUYseUNBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoLWVzL2lzRW1wdHknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtdGFncy1pbnB1dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZ3MuaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhZ3MuaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBleHBvcnRBczogJ1RhZ3NJbnB1dCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWdzSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvKipcclxuICAqIOOAkOW/hemAieOAkeiusOW9lei+k+WFpeeahOagh+etvlxyXG4gICovXHJcbiAgQElucHV0KCkgdGFncyA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeS9v+eUqOeahOWxnuaAp+WQjVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlQcm9wZXJ0eSA9ICduYW1lJztcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHovpPlhaXnmoRwbGFjZWhvbGRlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XHJcbiAgLyoqXHJcbiAgICog44CQ5Y+v6YCJ44CR6L6T5YWl5qCH562+55qE5pyA5bCP6ZW/5bqmXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWluTGVuZ3RoID0gMztcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHovpPlhaXmoIfnrb7nmoTmnIDlpKfplb/luqZcclxuICAgKi9cclxuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlciA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeagh+etvueahOacgOWwj+S4quaVsFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG1pblRhZ3MgPSAwO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeagh+etvueahOacgOWkp+S4quaVsFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG1heFRhZ3M6IG51bWJlciA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkei+k+WFpeahhueahHNwZWxsY2hlY2tcclxuICAgKi9cclxuICBASW5wdXQoKSBzcGVsbGNoZWNrID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHkuIvmi4npgInpoblcclxuICAgKi9cclxuICBASW5wdXQoKSBzdWdnZXN0aW9uTGlzdDogYW55ID0gW107XHJcbiAgLyoqXHJcbiAgICog5piv5ZCm5oyJ56m65qC85re75YqgdGFnXHJcbiAgICovXHJcbiAgQElucHV0KCkgaXNBZGRCeVNwYWNlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiDlpKflsI/lhpnmlY/mhJ9cclxuICAgKi9cclxuICBASW5wdXQoKSBjYXNlU2Vuc2l0aXZpdHkgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY2hlY2tCZWZvcmVBZGQ6IChuZXdUYWc6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIC8qKlxyXG4gKiDovpPlh7rlh73mlbDvvIzlvZPpgInkuK3mn5DkuKrpgInpobnpobnlkI7vvIzlsIbkvJrosIPnlKjmraTlh73mlbDvvIzlj4LmlbDkuLrlvZPliY3pgInmi6npobnnmoTlgLzjgILlpoLmnpzpnIDopoHojrflj5bmiYDmnInpgInmi6nnirbmgIHnmoTlgLzvvIzor7flj4LogIMobmdNb2RlbENoYW5nZSnmlrnms5VcclxuICovXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCd0YWdJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHRhZ0lucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RCb3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZWxlY3RCb3hFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBuZXdUYWcgPSAnJztcclxuICBzaG93U3VnZ2VzdGlvbkxpc3QgPSBmYWxzZTtcclxuICBhdmFpbGFibGVPcHRpb25zID0gW107XHJcbiAgbmV3VGFnVmFsaWQgPSBmYWxzZTtcclxuICBpc1JlZHVjZSA9IGZhbHNlO1xyXG4gIHNlYXJjaEZuOiAodGVybTogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PHsgaWQ6IHN0cmluZyB8IG51bWJlciwgb3B0aW9uOiBhbnkgfT4+O1xyXG4gIHByaXZhdGUgc291cmNlU3Vic2NyaXB0aW9uOiBCZWhhdmlvclN1YmplY3Q8YW55PjtcclxuICBwcml2YXRlIEtFWVM6IGFueSA9IHtcclxuICAgIGJhY2tzcGFjZTogOCxcclxuICAgIHRhYjogOSxcclxuICAgIGVudGVyOiAxMyxcclxuICAgIGVzY2FwZTogMjcsXHJcbiAgICBzcGFjZTogMzIsXHJcbiAgICB1cDogMzgsXHJcbiAgICBkb3duOiA0MCxcclxuICAgIGxlZnQ6IDM3LFxyXG4gICAgcmlnaHQ6IDM5LFxyXG4gICAgZGVsZXRlOiA0NixcclxuICAgIGNvbW1hOiAxODhcclxuICB9O1xyXG4gIC8vIOS4i+aLiemAieS4rXN1Z2dlc3Rpb25MaXN055qEaXRlbee0ouW8lVxyXG4gIHNlbGVjdEluZGV4ID0gMDtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm5ld1RhZyA9ICcnO1xyXG4gICAgdGhpcy5zZWFyY2hGbiA9ICh0ZXJtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIG9mKCh0aGlzLnN1Z2dlc3Rpb25MaXN0ID8gdGhpcy5zdWdnZXN0aW9uTGlzdCA6IFtdKVxyXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiB0ZXJtID09PSAnJyA/IHRydWUgOiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/XHJcbiAgICAgICAgKGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldKS5pbmRleE9mKHRlcm0pICE9PSAtMSA6XHJcbiAgICAgICAgKGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGVybS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZWdpc3RlckZpbHRlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5zdWdnZXN0aW9uTGlzdCAmJiBjaGFuZ2VzLnN1Z2dlc3Rpb25MaXN0LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnJlZHVjZVN1Z2dlc3Rpb25MaXN0KCk7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnNlYXJjaEZuKSB7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpcHRpb24ubmV4dCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMudGFncyAmJiBjaGFuZ2VzLnRhZ3MuY3VycmVudFZhbHVlICkge1xyXG4gICAgICB0aGlzLnJlZHVjZVN1Z2dlc3Rpb25MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckZpbHRlckNoYW5nZSgpIHtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCcnKTtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLnBpcGUoXHJcbiAgICAgIG1hcCh0ZXJtID0+IHtcclxuICAgICAgICB0aGlzLnRhZ0lzVmFsaWQoKTtcclxuICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCh0ZXJtID0+IHRoaXMuc2VhcmNoRm4odGVybSkpLFxyXG4gICAgIClcclxuICAgICAuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF2YWlsYWJsZU9wdGlvbnMgfHwgdGhpcy5hdmFpbGFibGVPcHRpb25zLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEluZGV4ID0gLTE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBmcm9tRXZlbnQodGhpcy50YWdJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2lucHV0JylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChlOiBIVE1MU2VsZWN0RWxlbWVudCkgPT4gZVsndGFyZ2V0J10udmFsdWUpLFxyXG4gICAgICAgIGZpbHRlcih0ZXJtID0+IHRydWUpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApIC8vIGhhcmQgY29kZSBuZWVkIHJlZmFjdG9yeVxyXG4gICAgICApLnN1YnNjcmliZSh0ZXJtID0+IHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLm5leHQodGVybSkpO1xyXG4gIH1cclxuXHJcbiAgcmVkdWNlU3VnZ2VzdGlvbkxpc3QoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlZHVjZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdWdnZXN0aW9uTGlzdC5sZW5ndGggPiAwICYmIHRoaXMudGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNSZWR1Y2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN1Z2dlc3Rpb25MaXN0ID0gdGhpcy5zdWdnZXN0aW9uTGlzdC5maWx0ZXIoIHN1Z2dlc3Rpb24gPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3MuZmluZEluZGV4KHRhZyA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/XHJcbiAgICAgICAgICB0YWdbdGhpcy5kaXNwbGF5UHJvcGVydHldID09PSBzdWdnZXN0aW9uW3RoaXMuZGlzcGxheVByb3BlcnR5XSA6XHJcbiAgICAgICAgICB0YWdbdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkgPT09IHN1Z2dlc3Rpb25bdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnNlYXJjaEZuKSB7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpcHRpb24ubmV4dCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhvc3RfY2xpY2soKSB7XHJcbiAgICB0aGlzLnRhZ0lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB0aGlzLnNlbGVjdEluZGV4ID0gMDtcclxuICB9XHJcblxyXG4gIGlucHV0X2tleWRvd24oZXZlbnQpIHtcclxuICAgIGNvbnN0IGhvdGtleXMgPSBbdGhpcy5LRVlTLmVudGVyLCB0aGlzLktFWVMudGFiLCB0aGlzLktFWVMudXAsIHRoaXMuS0VZUy5kb3duXTtcclxuICAgIGlmICh0aGlzLmlzQWRkQnlTcGFjZSkge1xyXG4gICAgICBob3RrZXlzLnB1c2godGhpcy5LRVlTLnNwYWNlKTtcclxuICAgIH1cclxuICAgIGlmIChob3RrZXlzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPT09IC0xKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gdGhpcy5LRVlTLmRvd24pIHtcclxuICAgICAgLy8g5ZCR5LiL6YCJ5oup6YCJ6aG5XHJcbiAgICAgIHRoaXMuc2VsZWN0KCsrdGhpcy5zZWxlY3RJbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IHRoaXMuS0VZUy51cCkge1xyXG4gICAgICAvLyDlkJHkuIrpgInmi6npgInpoblcclxuICAgICAgdGhpcy5zZWxlY3QoLS10aGlzLnNlbGVjdEluZGV4KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gdGhpcy5LRVlTLmVudGVyIHx8IGV2ZW50LmtleUNvZGUgPT09IHRoaXMuS0VZUy50YWIpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgLy8g5Zue6L2m5oiWdGFi5re75Yqgc2VsZWN0SW5kZXjnmoTlgLxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWRkU3VnZ2VzdGlvbkJ5SW5kZXgodGhpcy5zZWxlY3RJbmRleCwgdGhpcy5hdmFpbGFibGVPcHRpb25zW3RoaXMuc2VsZWN0SW5kZXhdKTtcclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRUYWcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5re75Yqg6L6T5YWl55qE5YC8XHJcbiAgICAgIHRoaXMuYWRkVGFnKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3QgKGluZGV4KSB7XHJcbiAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgIGluZGV4ID0gdGhpcy5zdWdnZXN0aW9uTGlzdC5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIGlmIChpbmRleCA+PSB0aGlzLnN1Z2dlc3Rpb25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0SW5kZXggPSBpbmRleDtcclxuICB9XHJcblxyXG4gIGlucHV0X2ZvY3VzKGV2ZW50KSB7XHJcbiAgICB0aGlzLnNob3dTdWdnZXN0aW9uTGlzdCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBpbnB1dF9ibHVyKGV2ZW50KSB7XHJcbiAgICBpZiAoaXNFbXB0eSh0aGlzLm5ld1RhZykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUYWcoKTtcclxuICB9XHJcblxyXG4gIGFkZFN1Z2dlc3Rpb25CeUluZGV4KGluZGV4LCB2YWx1ZSkge1xyXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmF2YWlsYWJsZU9wdGlvbnMubGVuZ3RoIHx8IHRoaXMubWF4VGFncyA8PSB0aGlzLnRhZ3MubGVuZ3RoXHJcbiAgICAgIHx8IHRoaXMudGFncy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/IGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldID09PSB2YWx1ZVt0aGlzLmRpc3BsYXlQcm9wZXJ0eV1cclxuICAgICAgICA6IGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlW3RoaXMuZGlzcGxheVByb3BlcnR5XS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW5BZGQoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFncy5wdXNoKHRoaXMuYXZhaWxhYmxlT3B0aW9uc1tpbmRleF0pO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5hdmFpbGFibGVPcHRpb25zW2luZGV4XSk7XHJcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MaXN0SW5kZXggPSB0aGlzLnN1Z2dlc3Rpb25MaXN0LmZpbmRJbmRleChpdGVtID0+XHJcbiAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZpdHkgPyBpdGVtW3RoaXMuZGlzcGxheVByb3BlcnR5XSAgPT09IHZhbHVlW3RoaXMuZGlzcGxheVByb3BlcnR5XSA6XHJcbiAgICAgICAgICBpdGVtW3RoaXMuZGlzcGxheVByb3BlcnR5XS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZVt0aGlzLmRpc3BsYXlQcm9wZXJ0eV0udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgIHRoaXMuc3VnZ2VzdGlvbkxpc3Quc3BsaWNlKHN1Z2dlc3Rpb25MaXN0SW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLm5ld1RhZyA9ICcnO1xyXG4gICAgICB0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbi5uZXh0KHRoaXMubmV3VGFnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGFnKGluZGV4KSB7XHJcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudGFncy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hdmFpbGFibGVPcHRpb25zLnB1c2godGhpcy50YWdzW2luZGV4XSk7XHJcbiAgICB0aGlzLnN1Z2dlc3Rpb25MaXN0ID0gdGhpcy5hdmFpbGFibGVPcHRpb25zO1xyXG4gICAgY29uc3QgdGFnID0gdGhpcy50YWdzW2luZGV4XTtcclxuICAgIHRoaXMudGFncy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRhZyk7XHJcbiAgfVxyXG5cclxuICB0YWdJc1ZhbGlkKCkge1xyXG4gICAgY29uc3QgdGFnID0gdGhpcy5uZXdUYWc7XHJcbiAgICBjb25zdCB0bXAgPSB0aGlzLmRpc3BsYXlQcm9wZXJ0eTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRhZyAmJiB0YWcubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoXHJcbiAgICAgICYmIHRhZy5sZW5ndGggPD0gdGhpcy5tYXhMZW5ndGhcclxuICAgICAgJiYgdGhpcy5zdWdnZXN0aW9uTGlzdC5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/IGl0ZW1bdG1wXSA9PT0gdGFnXHJcbiAgICAgICAgICA6IGl0ZW1bdG1wXS50b0xvd2VyQ2FzZSgpID09PSB0YWcudG9Mb3dlckNhc2UoKSkgPT09IC0xXHJcbiAgICAgICYmIHRoaXMudGFncy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/ICBpdGVtW3RtcF0gPT09IHRhZ1xyXG4gICAgICAgICAgOiBpdGVtW3RtcF0udG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkpID09PSAtMVxyXG4gICAgICAmJiAhdGhpcy5pc0VtcHR5U3RyaW5nKHRhZyk7XHJcbiAgICB0aGlzLm5ld1RhZ1ZhbGlkID0gdGFnID09PSAnJyB8fCAhIXJlc3VsdDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBpc0VtcHR5U3RyaW5nKHRhZykge1xyXG4gICAgY29uc3QgdGVtcCA9IHRhZy5tYXRjaCgvXFxzL2cpO1xyXG4gICAgaWYgKHRlbXApIHtcclxuICAgICAgcmV0dXJuIHRhZy5sZW5ndGggPT09IHRlbXAubGVuZ3RoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGFnKCkge1xyXG4gICAgdGhpcy5jYW5BZGQoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgdGhpcy5tYXhUYWdzID4gdGhpcy50YWdzLmxlbmd0aCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRhZ0lzVmFsaWQoKSkge1xyXG4gICAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgICBvYmpbdGhpcy5kaXNwbGF5UHJvcGVydHldID0gdGhpcy5uZXdUYWc7XHJcbiAgICAgICAgICB0aGlzLnRhZ3MucHVzaChvYmopO1xyXG4gICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMubmV3VGFnKTtcclxuICAgICAgICAgIC8vIHRoaXMuYXZhaWxhYmxlT3B0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbkxpc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8g5pS+5ZyodGltZW91dOmHjOaYr+WboOS4uuWmguaenOeUqOepuuagvOa3u+WKoHRhZ++8jOS8muWvvOiHtOa3u+WKoOS5i+WQjui+k+WFpeahhumHjOacieS4quepuuagvOOAglxyXG4gICAgICAgICAgdGhpcy5uZXdUYWcgPSAnJztcclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uZXdUYWdWYWxpZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLm5leHQoJycpO1xyXG4gIH1cclxuXHJcbiAgY2FuQWRkKCkge1xyXG4gICAgbGV0IGNoZWNrUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgaWYgKHRoaXMuY2hlY2tCZWZvcmVBZGQpIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmNoZWNrQmVmb3JlQWRkKHRoaXMubmV3VGFnKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC50aGVuKSB7XHJcbiAgICAgICAgICBjaGVja1Jlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdWJzY3JpYmUpIHtcclxuICAgICAgICAgIGNoZWNrUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2hlY2tSZXN1bHQgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjaGVja1Jlc3VsdDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soJGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuc2hvd1N1Z2dlc3Rpb25MaXN0ICYmICF0aGlzLnNlbGVjdEJveEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uTGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgaWYgKHRoaXMuc291cmNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19