theme-lib
Version:
This is a simple example Angular Library published to npm.
381 lines • 27.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Component, Input, HostBinding, ViewChild, ElementRef, ContentChildren, QueryList, } from '@angular/core';
import { convertToBoolProperty } from '../helpers';
import { NbChatMessageComponent } from './chat-message.component';
/*
* Conversational UI collection - a set of components for chat-like UI construction.
*
* Main features:
* - different message types support (text, image, file, file group, map, etc)
* - drag & drop for images and files with preview
* - different UI styles
* - custom action buttons (coming soon)
*
* Here's a complete example build in a bot-like app. Type `help` to be able to receive different message types.
* Enjoy the conversation and the beautiful UI.
* @stacked-example(Showcase, chat/chat-showcase.component)
*
* Basic chat configuration and usage:
* ```ts
* <nb-chat title="Nebular Conversational UI">
* <nb-chat-message *ngFor="let msg of messages"
* [type]="msg.type"
* [message]="msg.text"
* [reply]="msg.reply"
* [sender]="msg.user.name"
* [date]="msg.date"
* [files]="msg.files"
* [quote]="msg.quote"
* [latitude]="msg.latitude"
* [longitude]="msg.longitude"
* [avatar]="msg.user.avatar">
* </nb-chat-message>
*
* <nb-chat-form (send)="sendMessage($event)" [dropFiles]="true">
* </nb-chat-form>
* </nb-chat>
* ```
* ### Installation
*
* Import `NbChatModule` to your feature module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbChatModule,
* ],
* })
* export class PageModule { }
* ```
*
* If you need to provide an API key for a `map` message type (which is required by Google Maps)
* you may use `NbChatModule.forRoot({ ... })` call if this is a global app configuration
* or `NbChatModule.forChild({ ... })` for a feature module configuration:
*
* ```ts
* @NgModule({
* imports: [
* // ...
* NbChatModule.forRoot({ messageGoogleMapKey: 'MAP_KEY' }),
* ],
* })
* export class AppModule { }
*
* ### Usage
*
* There are three main components:
* ```ts
* <nb-chat>
* </nb-chat> // chat container
*
* <nb-chat-form>
* </nb-chat-form> // chat form with drag&drop files feature
*
* <nb-chat-message>
* </nb-chat-message> // chat message, available multiple types
* ```
*
* Two users conversation showcase:
* @stacked-example(Conversation, chat/chat-conversation-showcase.component)
*
* Chat UI is also available in different colors by specifying a `[status]` input:
*
* @stacked-example(Colored Chat, chat/chat-colors.component)
*
* Also it is possible to configure sizes through `[size]` input:
*
* @stacked-example(Chat Sizes, chat/chat-sizes.component)
*
* @styles
*
* chat-font-size:
* chat-fg:
* chat-bg:
* chat-border-radius:
* chat-fg-text:
* chat-height-xxsmall:
* chat-height-xsmall:
* chat-height-small:
* chat-height-medium:
* chat-height-large:
* chat-height-xlarge:
* chat-height-xxlarge:
* chat-border:
* chat-padding:
* chat-shadow:
* chat-separator:
* chat-active-bg:
* chat-disabled-bg:
* chat-disabled-fg:
* chat-primary-bg:
* chat-info-bg:
* chat-success-bg:
* chat-warning-bg:
* chat-danger-bg:
*/
export class NbChatComponent {
constructor() {
this.scrollBottom = true;
}
/**
* @return {?}
*/
get xxsmall() {
return this.size === NbChatComponent.SIZE_XXSMALL;
}
/**
* @return {?}
*/
get xsmall() {
return this.size === NbChatComponent.SIZE_XSMALL;
}
/**
* @return {?}
*/
get small() {
return this.size === NbChatComponent.SIZE_SMALL;
}
/**
* @return {?}
*/
get medium() {
return this.size === NbChatComponent.SIZE_MEDIUM;
}
/**
* @return {?}
*/
get large() {
return this.size === NbChatComponent.SIZE_LARGE;
}
/**
* @return {?}
*/
get xlarge() {
return this.size === NbChatComponent.SIZE_XLARGE;
}
/**
* @return {?}
*/
get xxlarge() {
return this.size === NbChatComponent.SIZE_XXLARGE;
}
/**
* @return {?}
*/
get active() {
return this.status === NbChatComponent.STATUS_ACTIVE;
}
/**
* @return {?}
*/
get disabled() {
return this.status === NbChatComponent.STATUS_DISABLED;
}
/**
* @return {?}
*/
get primary() {
return this.status === NbChatComponent.STATUS_PRIMARY;
}
/**
* @return {?}
*/
get info() {
return this.status === NbChatComponent.STATUS_INFO;
}
/**
* @return {?}
*/
get success() {
return this.status === NbChatComponent.STATUS_SUCCESS;
}
/**
* @return {?}
*/
get warning() {
return this.status === NbChatComponent.STATUS_WARNING;
}
/**
* @return {?}
*/
get danger() {
return this.status === NbChatComponent.STATUS_DANGER;
}
/**
* @return {?}
*/
get hasAccent() {
return this.accent;
}
/*
* Chat size, available sizes:
* xxsmall, xsmall, small, medium, large, xlarge, xxlarge
* @param {string} val
*/
/**
* @private
* @param {?} val
* @return {?}
*/
set setSize(val) {
this.size = val;
}
/*
* Chat status color (adds specific styles):
* active, disabled, primary, info, success, warning, danger
* @param {string} val
*/
/**
* @private
* @param {?} val
* @return {?}
*/
set setStatus(val) {
this.status = val;
}
/*
* Scroll chat to the bottom of the list when a new message arrives
* @param {boolean} val
*/
/**
* @private
* @param {?} val
* @return {?}
*/
set setScrollBottom(val) {
this.scrollBottom = convertToBoolProperty(val);
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.messages.changes
.subscribe((messages) => {
this.messages = messages;
this.updateView();
});
this.updateView();
}
/**
* @return {?}
*/
updateView() {
if (this.scrollBottom) {
this.scrollListBottom();
}
}
/**
* @return {?}
*/
scrollListBottom() {
this.scrollable.nativeElement.scrollTop = this.scrollable.nativeElement.scrollHeight;
}
}
NbChatComponent.SIZE_XXSMALL = 'xxsmall';
NbChatComponent.SIZE_XSMALL = 'xsmall';
NbChatComponent.SIZE_SMALL = 'small';
NbChatComponent.SIZE_MEDIUM = 'medium';
NbChatComponent.SIZE_LARGE = 'large';
NbChatComponent.SIZE_XLARGE = 'xlarge';
NbChatComponent.SIZE_XXLARGE = 'xxlarge';
NbChatComponent.STATUS_ACTIVE = 'active';
NbChatComponent.STATUS_DISABLED = 'disabled';
NbChatComponent.STATUS_PRIMARY = 'primary';
NbChatComponent.STATUS_INFO = 'info';
NbChatComponent.STATUS_SUCCESS = 'success';
NbChatComponent.STATUS_WARNING = 'warning';
NbChatComponent.STATUS_DANGER = 'danger';
NbChatComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-chat',
template: `
<div class="header">{{ title }}</div>
<div class="scrollable" #scrollable>
<div class="messages">
<ng-content select="nb-chat-message"></ng-content>
<p class="no-messages" *ngIf="!messages?.length">No messages yet.</p>
</div>
</div>
<div class="form">
<ng-content select="nb-chat-form"></ng-content>
</div>
`,
styles: [":host{display:flex;flex-direction:column;position:relative;height:100%}"]
}] }
];
NbChatComponent.propDecorators = {
title: [{ type: Input }],
xxsmall: [{ type: HostBinding, args: ['class.xxsmall-chat',] }],
xsmall: [{ type: HostBinding, args: ['class.xsmall-chat',] }],
small: [{ type: HostBinding, args: ['class.small-chat',] }],
medium: [{ type: HostBinding, args: ['class.medium-chat',] }],
large: [{ type: HostBinding, args: ['class.large-chat',] }],
xlarge: [{ type: HostBinding, args: ['class.xlarge-chat',] }],
xxlarge: [{ type: HostBinding, args: ['class.xxlarge-chat',] }],
active: [{ type: HostBinding, args: ['class.active-chat',] }],
disabled: [{ type: HostBinding, args: ['class.disabled-chat',] }],
primary: [{ type: HostBinding, args: ['class.primary-chat',] }],
info: [{ type: HostBinding, args: ['class.info-chat',] }],
success: [{ type: HostBinding, args: ['class.success-chat',] }],
warning: [{ type: HostBinding, args: ['class.warning-chat',] }],
danger: [{ type: HostBinding, args: ['class.danger-chat',] }],
hasAccent: [{ type: HostBinding, args: ['class.accent',] }],
setSize: [{ type: Input, args: ['size',] }],
setStatus: [{ type: Input, args: ['status',] }],
setScrollBottom: [{ type: Input, args: ['scrollBottom',] }],
scrollable: [{ type: ViewChild, args: ['scrollable',] }],
messages: [{ type: ContentChildren, args: [NbChatMessageComponent,] }]
};
if (false) {
/** @type {?} */
NbChatComponent.SIZE_XXSMALL;
/** @type {?} */
NbChatComponent.SIZE_XSMALL;
/** @type {?} */
NbChatComponent.SIZE_SMALL;
/** @type {?} */
NbChatComponent.SIZE_MEDIUM;
/** @type {?} */
NbChatComponent.SIZE_LARGE;
/** @type {?} */
NbChatComponent.SIZE_XLARGE;
/** @type {?} */
NbChatComponent.SIZE_XXLARGE;
/** @type {?} */
NbChatComponent.STATUS_ACTIVE;
/** @type {?} */
NbChatComponent.STATUS_DISABLED;
/** @type {?} */
NbChatComponent.STATUS_PRIMARY;
/** @type {?} */
NbChatComponent.STATUS_INFO;
/** @type {?} */
NbChatComponent.STATUS_SUCCESS;
/** @type {?} */
NbChatComponent.STATUS_WARNING;
/** @type {?} */
NbChatComponent.STATUS_DANGER;
/** @type {?} */
NbChatComponent.prototype.size;
/** @type {?} */
NbChatComponent.prototype.status;
/** @type {?} */
NbChatComponent.prototype.accent;
/** @type {?} */
NbChatComponent.prototype.scrollBottom;
/** @type {?} */
NbChatComponent.prototype.title;
/** @type {?} */
NbChatComponent.prototype.scrollable;
/** @type {?} */
NbChatComponent.prototype.messages;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9jaGF0L2NoYXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUlsRSxNQUFNLE9BQU8sZUFBZTtJQWhCNUI7UUFxQ0UsaUJBQVksR0FBWSxJQUFJLENBQUM7SUFrSS9CLENBQUM7Ozs7SUE5SEMsSUFDSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFDcEQsQ0FBQzs7OztJQUVELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsV0FBVyxDQUFDO0lBQ25ELENBQUM7Ozs7SUFFRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFVBQVUsQ0FBQztJQUNsRCxDQUFDOzs7O0lBRUQsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxXQUFXLENBQUM7SUFDbkQsQ0FBQzs7OztJQUVELElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsVUFB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b250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBIb3N0QmluZGluZyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LCBBZnRlclZpZXdJbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjb252ZXJ0VG9Cb29sUHJvcGVydHkgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgTmJDaGF0TWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudCc7XHJcblxyXG4vKlxyXG4gKiBDb252ZXJzYXRpb25hbCBVSSBjb2xsZWN0aW9uIC0gYSBzZXQgb2YgY29tcG9uZW50cyBmb3IgY2hhdC1saWtlIFVJIGNvbnN0cnVjdGlvbi5cclxuICpcclxuICogTWFpbiBmZWF0dXJlczpcclxuICogLSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcyBzdXBwb3J0ICh0ZXh0LCBpbWFnZSwgZmlsZSwgZmlsZSBncm91cCwgbWFwLCBldGMpXHJcbiAqIC0gZHJhZyAmIGRyb3AgZm9yIGltYWdlcyBhbmQgZmlsZXMgd2l0aCBwcmV2aWV3XHJcbiAqIC0gZGlmZmVyZW50IFVJIHN0eWxlc1xyXG4gKiAtIGN1c3RvbSBhY3Rpb24gYnV0dG9ucyAoY29taW5nIHNvb24pXHJcbiAqXHJcbiAqIEhlcmUncyBhIGNvbXBsZXRlIGV4YW1wbGUgYnVpbGQgaW4gYSBib3QtbGlrZSBhcHAuIFR5cGUgYGhlbHBgIHRvIGJlIGFibGUgdG8gcmVjZWl2ZSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcy5cclxuICogRW5qb3kgdGhlIGNvbnZlcnNhdGlvbiBhbmQgdGhlIGJlYXV0aWZ1bCBVSS5cclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgY2hhdC9jaGF0LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogQmFzaWMgY2hhdCBjb25maWd1cmF0aW9uIGFuZCB1c2FnZTpcclxuICogYGBgdHNcclxuICogPG5iLWNoYXQgdGl0bGU9XCJOZWJ1bGFyIENvbnZlcnNhdGlvbmFsIFVJXCI+XHJcbiAqICAgICAgIDxuYi1jaGF0LW1lc3NhZ2UgKm5nRm9yPVwibGV0IG1zZyBvZiBtZXNzYWdlc1wiXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwibXNnLnR5cGVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1zZy50ZXh0XCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbcmVwbHldPVwibXNnLnJlcGx5XCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbc2VuZGVyXT1cIm1zZy51c2VyLm5hbWVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlXT1cIm1zZy5kYXRlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbZmlsZXNdPVwibXNnLmZpbGVzXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbcXVvdGVdPVwibXNnLnF1b3RlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbbGF0aXR1ZGVdPVwibXNnLmxhdGl0dWRlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbbG9uZ2l0dWRlXT1cIm1zZy5sb25naXR1ZGVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFthdmF0YXJdPVwibXNnLnVzZXIuYXZhdGFyXCI+XHJcbiAqICAgPC9uYi1jaGF0LW1lc3NhZ2U+XHJcbiAqXHJcbiAqICAgPG5iLWNoYXQtZm9ybSAoc2VuZCk9XCJzZW5kTWVzc2FnZSgkZXZlbnQpXCIgW2Ryb3BGaWxlc109XCJ0cnVlXCI+XHJcbiAqICAgPC9uYi1jaGF0LWZvcm0+XHJcbiAqIDwvbmItY2hhdD5cclxuICogYGBgXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkNoYXRNb2R1bGVgIHRvIHlvdXIgZmVhdHVyZSBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYkNoYXRNb2R1bGUsXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIFBhZ2VNb2R1bGUgeyB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgbmVlZCB0byBwcm92aWRlIGFuIEFQSSBrZXkgZm9yIGEgYG1hcGAgbWVzc2FnZSB0eXBlICh3aGljaCBpcyByZXF1aXJlZCBieSBHb29nbGUgTWFwcylcclxuICogeW91IG1heSB1c2UgYE5iQ2hhdE1vZHVsZS5mb3JSb290KHsgLi4uIH0pYCBjYWxsIGlmIHRoaXMgaXMgYSBnbG9iYWwgYXBwIGNvbmZpZ3VyYXRpb25cclxuICogb3IgYE5iQ2hhdE1vZHVsZS5mb3JDaGlsZCh7IC4uLiB9KWAgZm9yIGEgZmVhdHVyZSBtb2R1bGUgY29uZmlndXJhdGlvbjpcclxuICpcclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iQ2hhdE1vZHVsZS5mb3JSb290KHsgbWVzc2FnZUdvb2dsZU1hcEtleTogJ01BUF9LRVknIH0pLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XHJcbiAqXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjb21wb25lbnRzOlxyXG4gKiBgYGB0c1xyXG4gKiA8bmItY2hhdD5cclxuICogPC9uYi1jaGF0PiAvLyBjaGF0IGNvbnRhaW5lclxyXG4gKlxyXG4gKiA8bmItY2hhdC1mb3JtPlxyXG4gKiA8L25iLWNoYXQtZm9ybT4gLy8gY2hhdCBmb3JtIHdpdGggZHJhZyZkcm9wIGZpbGVzIGZlYXR1cmVcclxuICpcclxuICogPG5iLWNoYXQtbWVzc2FnZT5cclxuICogPC9uYi1jaGF0LW1lc3NhZ2U+IC8vIGNoYXQgbWVzc2FnZSwgYXZhaWxhYmxlIG11bHRpcGxlIHR5cGVzXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUd28gdXNlcnMgY29udmVyc2F0aW9uIHNob3djYXNlOlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENvbnZlcnNhdGlvbiwgY2hhdC9jaGF0LWNvbnZlcnNhdGlvbi1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIENoYXQgVUkgaXMgYWxzbyBhdmFpbGFibGUgaW4gZGlmZmVyZW50IGNvbG9ycyBieSBzcGVjaWZ5aW5nIGEgYFtzdGF0dXNdYCBpbnB1dDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShDb2xvcmVkIENoYXQsIGNoYXQvY2hhdC1jb2xvcnMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBBbHNvIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBzaXplcyB0aHJvdWdoIGBbc2l6ZV1gIGlucHV0OlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENoYXQgU2l6ZXMsIGNoYXQvY2hhdC1zaXplcy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEBzdHlsZXNcclxuICpcclxuICogY2hhdC1mb250LXNpemU6XHJcbiAqIGNoYXQtZmc6XHJcbiAqIGNoYXQtYmc6XHJcbiAqIGNoYXQtYm9yZGVyLXJhZGl1czpcclxuICogY2hhdC1mZy10ZXh0OlxyXG4gKiBjaGF0LWhlaWdodC14eHNtYWxsOlxyXG4gKiBjaGF0LWhlaWdodC14c21hbGw6XHJcbiAqIGNoYXQtaGVpZ2h0LXNtYWxsOlxyXG4gKiBjaGF0LWhlaWdodC1tZWRpdW06XHJcbiAqIGNoYXQtaGVpZ2h0LWxhcmdlOlxyXG4gKiBjaGF0LWhlaWdodC14bGFyZ2U6XHJcbiAqIGNoYXQtaGVpZ2h0LXh4bGFyZ2U6XHJcbiAqIGNoYXQtYm9yZGVyOlxyXG4gKiBjaGF0LXBhZGRpbmc6XHJcbiAqIGNoYXQtc2hhZG93OlxyXG4gKiBjaGF0LXNlcGFyYXRvcjpcclxuICogY2hhdC1hY3RpdmUtYmc6XHJcbiAqIGNoYXQtZGlzYWJsZWQtYmc6XHJcbiAqIGNoYXQtZGlzYWJsZWQtZmc6XHJcbiAqIGNoYXQtcHJpbWFyeS1iZzpcclxuICogY2hhdC1pbmZvLWJnOlxyXG4gKiBjaGF0LXN1Y2Nlc3MtYmc6XHJcbiAqIGNoYXQtd2FybmluZy1iZzpcclxuICogY2hhdC1kYW5nZXItYmc6XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25iLWNoYXQnLFxyXG4gIHN0eWxlVXJsczogWycuL2NoYXQuY29tcG9uZW50LnNjc3MnXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPnt7IHRpdGxlIH19PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsYWJsZVwiICNzY3JvbGxhYmxlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZXNcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJuYi1jaGF0LW1lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJuby1tZXNzYWdlc1wiICpuZ0lmPVwiIW1lc3NhZ2VzPy5sZW5ndGhcIj5ObyBtZXNzYWdlcyB5ZXQuPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm1cIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibmItY2hhdC1mb3JtXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iQ2hhdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9YWFNNQUxMID0gJ3h4c21hbGwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX1hTTUFMTCA9ICd4c21hbGwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX1NNQUxMID0gJ3NtYWxsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9NRURJVU0gPSAnbWVkaXVtJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9MQVJHRSA9ICdsYXJnZSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfWExBUkdFID0gJ3hsYXJnZSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfWFhMQVJHRSA9ICd4eGxhcmdlJztcclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19BQ1RJVkUgPSAnYWN0aXZlJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX0RJU0FCTEVEID0gJ2Rpc2FibGVkJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1BSSU1BUlkgPSAncHJpbWFyeSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19JTkZPID0gJ2luZm8nO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfU1VDQ0VTUyA9ICdzdWNjZXNzJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1dBUk5JTkcgPSAnd2FybmluZyc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19EQU5HRVIgPSAnZGFuZ2VyJztcclxuXHJcbiAgc2l6ZTogc3RyaW5nO1xyXG4gIHN0YXR1czogc3RyaW5nO1xyXG4gIGFjY2VudDogc3RyaW5nO1xyXG4gIHNjcm9sbEJvdHRvbTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MueHhzbWFsbC1jaGF0JylcclxuICBnZXQgeHhzbWFsbCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hYU01BTEw7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnhzbWFsbC1jaGF0JylcclxuICBnZXQgeHNtYWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJDaGF0Q29tcG9uZW50LlNJWkVfWFNNQUxMO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zbWFsbC1jaGF0JylcclxuICBnZXQgc21hbGwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkNoYXRDb21wb25lbnQuU0laRV9TTUFMTDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MubWVkaXVtLWNoYXQnKVxyXG4gIGdldCBtZWRpdW0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkNoYXRDb21wb25lbnQuU0laRV9NRURJVU07XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmxhcmdlLWNoYXQnKVxyXG4gIGdldCBsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX0xBUkdFO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy54bGFyZ2UtY2hhdCcpXHJcbiAgZ2V0IHhsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hMQVJHRTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MueHhsYXJnZS1jaGF0JylcclxuICBnZXQgeHhsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hYTEFSR0U7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFjdGl2ZS1jaGF0JylcclxuICBnZXQgYWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0FDVElWRTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQtY2hhdCcpXHJcbiAgZ2V0IGRpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0RJU0FCTEVEO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5wcmltYXJ5LWNoYXQnKVxyXG4gIGdldCBwcmltYXJ5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX1BSSU1BUlk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmluZm8tY2hhdCcpXHJcbiAgZ2V0IGluZm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IE5iQ2hhdENvbXBvbmVudC5TVEFUVVNfSU5GTztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3VjY2Vzcy1jaGF0JylcclxuICBnZXQgc3VjY2VzcygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJDaGF0Q29tcG9uZW50LlNUQVRVU19TVUNDRVNTO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy53YXJuaW5nLWNoYXQnKVxyXG4gIGdldCB3YXJuaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX1dBUk5JTkc7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRhbmdlci1jaGF0JylcclxuICBnZXQgZGFuZ2VyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0RBTkdFUjtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWNjZW50JylcclxuICBnZXQgaGFzQWNjZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWNjZW50O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDaGF0IHNpemUsIGF2YWlsYWJsZSBzaXplczpcclxuICAgKiB4eHNtYWxsLCB4c21hbGwsIHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4bGFyZ2UsIHh4bGFyZ2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCdzaXplJylcclxuICBwcml2YXRlIHNldCBzZXRTaXplKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNpemUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENoYXQgc3RhdHVzIGNvbG9yIChhZGRzIHNwZWNpZmljIHN0eWxlcyk6XHJcbiAgICogYWN0aXZlLCBkaXNhYmxlZCwgcHJpbWFyeSwgaW5mbywgc3VjY2Vzcywgd2FybmluZywgZGFuZ2VyXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc3RhdHVzJylcclxuICBwcml2YXRlIHNldCBzZXRTdGF0dXModmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTY3JvbGwgY2hhdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHdoZW4gYSBuZXcgbWVzc2FnZSBhcnJpdmVzXHJcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ3Njcm9sbEJvdHRvbScpXHJcbiAgcHJpdmF0ZSBzZXQgc2V0U2Nyb2xsQm90dG9tKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGFibGUnKSBzY3JvbGxhYmxlOiBFbGVtZW50UmVmO1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJDaGF0TWVzc2FnZUNvbXBvbmVudCkgbWVzc2FnZXM6IFF1ZXJ5TGlzdDxOYkNoYXRNZXNzYWdlQ29tcG9uZW50PjtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5tZXNzYWdlcy5jaGFuZ2VzXHJcbiAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2VzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxCb3R0b20pIHtcclxuICAgICAgdGhpcy5zY3JvbGxMaXN0Qm90dG9tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JvbGxMaXN0Qm90dG9tKCkge1xyXG4gICAgdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xyXG4gIH1cclxufVxyXG4iXX0=