UNPKG

ngx-particlesjs

Version:

[![npm](https://img.shields.io/npm/v/ngx-particlesjs.svg)](https://www.npmjs.com/package/ngx-particlesjs) [![npm](https://img.shields.io/npm/dm/ngx-particlesjs.svg)](https://www.npmjs.com/package/ngx-particlesjs) [![TypeScript](https://img.shields.io/badg

264 lines (256 loc) 22.4 kB
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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