ngx-particlesjs
Version:
[](https://www.npmjs.com/package/ngx-particlesjs) [](https://www.npmjs.com/package/ngx-particlesjs) [ • 22.4 kB
JavaScript
import { Component, HostListener, Input, ViewChild, NgModule } from '@angular/core';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @param {?} origin
* @return {?}
*/
function saveDecimal(origin) {
return Math.floor(origin * 100) / 100;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class Particle {
/**
* @param {?} range
* @param {?=} speed
* @param {?=} size
*/
constructor(range, speed = 'normal', size = 1.5) {
this.max_width = range[0];
this.max_height = range[1];
this.initPosition();
this.initSpeed(speed);
this.initSize(size);
this.initColor();
}
/**
* @param {?} range
* @return {?}
*/
onRange(range) {
this.max_width = range[0];
this.max_height = range[1];
}
/**
* @return {?}
*/
initPosition() {
this.x = saveDecimal(Math.random() * this.max_width);
this.y = saveDecimal(Math.random() * this.max_height);
}
/**
* @param {?} speed
* @return {?}
*/
initSpeed(speed) {
/** @type {?} */
let vi = [];
if (typeof speed === 'string') {
switch (speed) {
case 'fast':
vi = [1, 1];
break;
case 'normal':
vi = [2, 2];
break;
case 'slow':
vi = [5, 5];
break;
default:
vi = [2, 2];
}
}
else {
vi = speed;
}
this.vx = saveDecimal(Math.random() / vi[0]);
this.vy = saveDecimal(Math.random() / vi[1]);
}
/**
* @param {?} size
* @return {?}
*/
initSize(size) {
this.size = (1 + Math.random()) * size;
}
/**
* @return {?}
*/
initColor() {
this.color = `rgb(${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)},${Math.floor(Math.random() * 256)})`;
}
/**
* @param {?} ctx
* @return {?}
*/
draw(ctx) {
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);
ctx.fillStyle = this.color;
ctx.strokeStyle = this.color;
ctx.closePath();
ctx.fill();
ctx.stroke();
}
/**
* @return {?}
*/
update() {
this.edge();
this.x = this.x + this.vx;
this.y = this.y + this.vy;
}
/**
* @return {?}
*/
edge() {
if (this.x + this.vx > this.max_width || this.x + this.vx < 0) {
this.vx = -this.vx;
}
if (this.y + this.vy > this.max_height || this.y + this.vy < 0) {
this.vy = -this.vy;
}
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class NgxParticlesComponent {
constructor() {
this.particles = [];
this.resizing = false;
this.total = 100;
this.stageChange = () => {
this.initStage();
/** @type {?} */
const range = [this.width, this.height];
for (const x of this.particles) {
x.onRange(range);
}
this.resizing = false;
};
this.drawContext = () => {
this.ctx.clearRect(0, 0, this.width, this.height);
for (const x of this.particles) {
x.draw(this.ctx);
x.update();
}
this.mainAnimationFrame = window.requestAnimationFrame(this.drawContext);
this.resizing = false;
};
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.canvas = this.stageRef.nativeElement;
this.ctx = this.canvas.getContext('2d', { alpha: false });
this.initStage();
this.initParticle();
this.drawContext();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.ctx.clearRect(0, 0, this.width, this.height);
window.cancelAnimationFrame(this.mainAnimationFrame);
window.cancelAnimationFrame(this.changeAnimationFrame);
}
/**
* @return {?}
*/
onResize() {
if (!this.resizing && (!this.default_height || !this.default_width)) {
this.resizing = true;
if (window.requestAnimationFrame) {
window.requestAnimationFrame(this.stageChange);
}
else {
setTimeout(this.stageChange, 66);
}
}
}
/**
* @return {?}
*/
initStage() {
const { clientWidth, clientHeight } = this.canvas.parentElement;
if (this.default_width) {
this.canvas.width = this.width = this.default_width;
}
else {
this.canvas.width = this.width = clientWidth;
}
if (this.default_height) {
this.canvas.height = this.height = this.default_height;
}
else {
this.canvas.height = this.height = clientHeight;
}
}
/**
* @return {?}
*/
initParticle() {
/** @type {?} */
const range = [this.width, this.height];
for (let i = 0; i < this.total; i++) {
this.particles[i] = new Particle(range, (this.args && this.args.speed) ? this.args.speed : 'normal', (this.args && this.args.size) ? this.args.size : 1.5);
}
}
}
NgxParticlesComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-particle',
template: `
<div id="stage">
<canvas #stageRef></canvas>
</div>
`,
styles: [`
#stage {
height: 100%;
width: 100%;
will-change: all;
}
`]
}] }
];
NgxParticlesComponent.propDecorators = {
stageRef: [{ type: ViewChild, args: ['stageRef',] }],
total: [{ type: Input }],
default_width: [{ type: Input }],
default_height: [{ type: Input }],
args: [{ type: Input }],
onResize: [{ type: HostListener, args: ['window:resize',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class NgxParticlesModule {
}
NgxParticlesModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [NgxParticlesComponent],
exports: [NgxParticlesComponent]
},] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { NgxParticlesModule, NgxParticlesComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBhcnRpY2xlc2pzLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtcGFydGljbGVzanMvbGliL2NvbW1vbi50cyIsIm5nOi8vbmd4LXBhcnRpY2xlc2pzL2xpYi9wYXJ0aWNsZS50cyIsIm5nOi8vbmd4LXBhcnRpY2xlc2pzL2xpYi9uZ3gtcGFydGljbGVzLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LXBhcnRpY2xlc2pzL2xpYi9uZ3gtcGFydGljbGVzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFBhcnRpY2xlQXJncyB7XHJcbiAgc3BlZWQ/OiAnZmFzdCcgfCAnbm9ybWFsJyB8ICdzbG93JyB8IG51bWJlcltdO1xyXG4gIHNpemU/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYXZlRGVjaW1hbChvcmlnaW46IG51bWJlcikge1xyXG4gIHJldHVybiBNYXRoLmZsb29yKG9yaWdpbiAqIDEwMCkgLyAxMDA7XHJcbn1cclxuIiwiaW1wb3J0IHtzYXZlRGVjaW1hbH0gZnJvbSAnLi9jb21tb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhcnRpY2xlIHtcclxuICBwcml2YXRlIG1heF93aWR0aDogbnVtYmVyO1xyXG4gIHByaXZhdGUgbWF4X2hlaWdodDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIHg6IG51bWJlcjtcclxuICBwcml2YXRlIHk6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSB2eDogbnVtYmVyO1xyXG4gIHByaXZhdGUgdnk6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBzaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb2xvcjogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihyYW5nZTogbnVtYmVyW10sIHNwZWVkOiAnZmFzdCcgfCAnbm9ybWFsJyB8ICdzbG93JyB8IG51bWJlcltdID0gJ25vcm1hbCcsIHNpemUgPSAxLjUpIHtcclxuICAgIHRoaXMubWF4X3dpZHRoID0gcmFuZ2VbMF07XHJcbiAgICB0aGlzLm1heF9oZWlnaHQgPSByYW5nZVsxXTtcclxuICAgIHRoaXMuaW5pdFBvc2l0aW9uKCk7XHJcbiAgICB0aGlzLmluaXRTcGVlZChzcGVlZCk7XHJcbiAgICB0aGlzLmluaXRTaXplKHNpemUpO1xyXG4gICAgdGhpcy5pbml0Q29sb3IoKTtcclxuICB9XHJcblxyXG4gIG9uUmFuZ2UocmFuZ2U6IG51bWJlcltdKSB7XHJcbiAgICB0aGlzLm1heF93aWR0aCA9IHJhbmdlWzBdO1xyXG4gICAgdGhpcy5tYXhfaGVpZ2h0ID0gcmFuZ2VbMV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRQb3NpdGlvbigpIHtcclxuICAgIHRoaXMueCA9IHNhdmVEZWNpbWFsKE1hdGgucmFuZG9tKCkgKiB0aGlzLm1heF93aWR0aCk7XHJcbiAgICB0aGlzLnkgPSBzYXZlRGVjaW1hbChNYXRoLnJhbmRvbSgpICogdGhpcy5tYXhfaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFNwZWVkKHNwZWVkOiAnZmFzdCcgfCAnbm9ybWFsJyB8ICdzbG93JyB8IG51bWJlcltdKSB7XHJcbiAgICBsZXQgdmkgPSBbXTtcclxuICAgIGlmICh0eXBlb2Ygc3BlZWQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHN3aXRjaCAoc3BlZWQpIHtcclxuICAgICAgICBjYXNlICdmYXN0JzpcclxuICAgICAgICAgIHZpID0gWzEsIDFdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgICAgIHZpID0gWzIsIDJdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnc2xvdyc6XHJcbiAgICAgICAgICB2aSA9IFs1LCA1XTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB2aSA9IFsyLCAyXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmkgPSBzcGVlZDtcclxuICAgIH1cclxuICAgIHRoaXMudnggPSBzYXZlRGVjaW1hbChNYXRoLnJhbmRvbSgpIC8gdmlbMF0pO1xyXG4gICAgdGhpcy52eSA9IHNhdmVEZWNpbWFsKE1hdGgucmFuZG9tKCkgLyB2aVsxXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTaXplKHNpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5zaXplID0gKDEgKyBNYXRoLnJhbmRvbSgpKSAqIHNpemU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb2xvcigpIHtcclxuICAgIHRoaXMuY29sb3IgPSBgcmdiKCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KX0sJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpfSwke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nil9KWA7XHJcbiAgfVxyXG5cclxuICBkcmF3KGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBjdHguYXJjKHRoaXMueCwgdGhpcy55LCB0aGlzLnNpemUsIDAsIDIgKiBNYXRoLlBJKTtcclxuICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmNvbG9yO1xyXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcjtcclxuICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgICBjdHguc3Ryb2tlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICB0aGlzLmVkZ2UoKTtcclxuICAgIHRoaXMueCA9IHRoaXMueCArIHRoaXMudng7XHJcbiAgICB0aGlzLnkgPSB0aGlzLnkgKyB0aGlzLnZ5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlZGdlKCkge1xyXG4gICAgaWYgKHRoaXMueCArIHRoaXMudnggPiB0aGlzLm1heF93aWR0aCB8fCB0aGlzLnggKyB0aGlzLnZ4IDwgMCkge1xyXG4gICAgICB0aGlzLnZ4ID0gLXRoaXMudng7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy55ICsgdGhpcy52eSA+IHRoaXMubWF4X2hlaWdodCB8fCB0aGlzLnkgKyB0aGlzLnZ5IDwgMCkge1xyXG4gICAgICB0aGlzLnZ5ID0gLXRoaXMudnk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BhcnRpY2xlfSBmcm9tICcuL3BhcnRpY2xlJztcbmltcG9ydCB7UGFydGljbGVBcmdzfSBmcm9tICcuL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wYXJ0aWNsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBpZD1cInN0YWdlXCI+XG4gICAgICA8Y2FudmFzICNzdGFnZVJlZj48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgICNzdGFnZSB7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHdpbGwtY2hhbmdlOiBhbGw7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hQYXJ0aWNsZXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdzdGFnZVJlZicpIHN0YWdlUmVmOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSB3aWR0aDogbnVtYmVyO1xuICBwcml2YXRlIGhlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIHBhcnRpY2xlczogUGFydGljbGVbXSA9IFtdO1xuICBwcml2YXRlIG1haW5BbmltYXRpb25GcmFtZTogYW55O1xuICBwcml2YXRlIGNoYW5nZUFuaW1hdGlvbkZyYW1lOiBhbnk7XG4gIHByaXZhdGUgcmVzaXppbmc6IGFueSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHRvdGFsID0gMTAwO1xuICBASW5wdXQoKSBkZWZhdWx0X3dpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGRlZmF1bHRfaGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIGFyZ3M/OiBQYXJ0aWNsZUFyZ3M7XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2FudmFzID0gdGhpcy5zdGFnZVJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7YWxwaGE6IGZhbHNlfSk7XG4gICAgdGhpcy5pbml0U3RhZ2UoKTtcbiAgICB0aGlzLmluaXRQYXJ0aWNsZSgpO1xuICAgIHRoaXMuZHJhd0NvbnRleHQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWFpbkFuaW1hdGlvbkZyYW1lKTtcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5jaGFuZ2VBbmltYXRpb25GcmFtZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25SZXNpemUoKSB7XG4gICAgaWYgKCF0aGlzLnJlc2l6aW5nICYmICghdGhpcy5kZWZhdWx0X2hlaWdodCB8fCAhdGhpcy5kZWZhdWx0X3dpZHRoKSkge1xuICAgICAgdGhpcy5yZXNpemluZyA9IHRydWU7XG4gICAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuc3RhZ2VDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGltZW91dCh0aGlzLnN0YWdlQ2hhbmdlLCA2Nik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhZ2UoKSB7XG4gICAgY29uc3Qge2NsaWVudFdpZHRoLCBjbGllbnRIZWlnaHR9ID0gdGhpcy5jYW52YXMucGFyZW50RWxlbWVudDtcbiAgICBpZiAodGhpcy5kZWZhdWx0X3dpZHRoKSB7XG4gICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGggPSB0aGlzLmRlZmF1bHRfd2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy53aWR0aCA9IGNsaWVudFdpZHRoO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWZhdWx0X2hlaWdodCkge1xuICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgPSB0aGlzLmRlZmF1bHRfaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodCA9IGNsaWVudEhlaWdodDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRQYXJ0aWNsZSgpIHtcbiAgICBjb25zdCByYW5nZSA9IFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvdGFsOyBpKyspIHtcbiAgICAgIHRoaXMucGFydGljbGVzW2ldID0gbmV3IFBhcnRpY2xlKFxuICAgICAgICByYW5nZSxcbiAgICAgICAgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3Muc3BlZWQpID8gdGhpcy5hcmdzLnNwZWVkIDogJ25vcm1hbCcsXG4gICAgICAgICh0aGlzLmFyZ3MgJiYgdGhpcy5hcmdzLnNpemUpID8gdGhpcy5hcmdzLnNpemUgOiAxLjVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFnZUNoYW5nZSA9ICgpID0+IHtcbiAgICB0aGlzLmluaXRTdGFnZSgpO1xuICAgIGNvbnN0IHJhbmdlID0gW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XTtcbiAgICBmb3IgKGNvbnN0IHggb2YgdGhpcy5wYXJ0aWNsZXMpIHtcbiAgICAgIHgub25SYW5nZShyYW5nZSk7XG4gICAgfVxuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgfTtcblxuICBwcml2YXRlIGRyYXdDb250ZXh0ID0gKCkgPT4ge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMucGFydGljbGVzKSB7XG4gICAgICB4LmRyYXcodGhpcy5jdHgpO1xuICAgICAgeC51cGRhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5tYWluQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuZHJhd0NvbnRleHQpO1xuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgfTtcbn1cbiIsImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ3hQYXJ0aWNsZXNDb21wb25lbnR9IGZyb20gJy4vbmd4LXBhcnRpY2xlcy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbTmd4UGFydGljbGVzQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW05neFBhcnRpY2xlc0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4UGFydGljbGVzTW9kdWxlIHtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBS0EscUJBQTRCLE1BQWM7SUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDdkM7Ozs7OztBQ1BEOzs7Ozs7SUFlRSxZQUFZLEtBQWUsRUFBRSxRQUErQyxRQUFRLEVBQUUsSUFBSSxHQUFH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