angular-three-postprocessing 2.0.0-beta.25 → 2.0.0-beta.250

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/esm2022/lib/effect-composer.mjs +118 -167
  2. package/esm2022/lib/effect.mjs +43 -71
  3. package/esm2022/lib/effects/ascii.mjs +120 -0
  4. package/esm2022/lib/effects/bloom.mjs +39 -0
  5. package/esm2022/lib/effects/brightness-contrast.mjs +38 -0
  6. package/esm2022/lib/effects/chromatic-abberation.mjs +38 -0
  7. package/esm2022/lib/effects/color-average.mjs +33 -0
  8. package/esm2022/lib/effects/color-depth.mjs +38 -0
  9. package/esm2022/lib/effects/depth-of-field.mjs +56 -0
  10. package/esm2022/lib/effects/depth.mjs +38 -0
  11. package/esm2022/lib/effects/dot-screen.mjs +38 -0
  12. package/esm2022/lib/effects/fxaa.mjs +38 -0
  13. package/esm2022/lib/effects/glitch.mjs +63 -0
  14. package/esm2022/lib/effects/god-rays.mjs +41 -0
  15. package/esm2022/lib/effects/grid.mjs +44 -0
  16. package/esm2022/lib/effects/hue-saturation.mjs +38 -0
  17. package/esm2022/lib/effects/index.mjs +27 -18
  18. package/esm2022/lib/effects/lens-flare.mjs +194 -0
  19. package/esm2022/lib/effects/lut.mjs +50 -0
  20. package/esm2022/lib/effects/noise.mjs +39 -0
  21. package/esm2022/lib/effects/pixelation.mjs +30 -0
  22. package/esm2022/lib/effects/scanline.mjs +43 -0
  23. package/esm2022/lib/effects/sepia.mjs +38 -0
  24. package/esm2022/lib/effects/shock-wave.mjs +38 -0
  25. package/esm2022/lib/effects/smaa.mjs +38 -0
  26. package/esm2022/lib/effects/tilt-shift-2.mjs +121 -0
  27. package/esm2022/lib/effects/tilt-shift.mjs +39 -0
  28. package/esm2022/lib/effects/vignette.mjs +38 -0
  29. package/esm2022/lib/effects/water.mjs +64 -0
  30. package/fesm2022/angular-three-postprocessing.mjs +1147 -654
  31. package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
  32. package/lib/effect-composer.d.ts +63 -66
  33. package/lib/effect.d.ts +54 -25
  34. package/lib/effects/ascii.d.ts +23 -0
  35. package/lib/effects/bloom.d.ts +10 -0
  36. package/lib/effects/brightness-contrast.d.ts +15 -0
  37. package/lib/effects/chromatic-abberation.d.ts +16 -0
  38. package/lib/effects/color-average.d.ts +11 -0
  39. package/lib/effects/color-depth.d.ts +14 -0
  40. package/lib/effects/depth-of-field.d.ts +29 -0
  41. package/lib/effects/depth.d.ts +14 -0
  42. package/lib/effects/dot-screen.d.ts +15 -0
  43. package/lib/effects/fxaa.d.ts +13 -0
  44. package/lib/effects/glitch.d.ts +29 -0
  45. package/lib/effects/god-rays.d.ts +37 -0
  46. package/lib/effects/grid.d.ts +23 -0
  47. package/lib/effects/hue-saturation.d.ts +15 -0
  48. package/lib/effects/index.d.ts +26 -17
  49. package/lib/effects/lens-flare.d.ts +110 -0
  50. package/lib/effects/lut.d.ts +19 -0
  51. package/lib/effects/noise.d.ts +14 -0
  52. package/lib/effects/pixelation.d.ts +16 -0
  53. package/lib/effects/scanline.d.ts +17 -0
  54. package/lib/effects/sepia.d.ts +14 -0
  55. package/lib/effects/shock-wave.d.ts +11 -0
  56. package/lib/effects/smaa.d.ts +15 -0
  57. package/lib/effects/tilt-shift-2.d.ts +35 -0
  58. package/lib/effects/tilt-shift.d.ts +22 -0
  59. package/lib/effects/vignette.d.ts +17 -0
  60. package/lib/effects/water.d.ts +20 -0
  61. package/package.json +13 -6
  62. package/esm2022/lib/effects/bloom/bloom.mjs +0 -33
  63. package/esm2022/lib/effects/brightness-contrast/brightness-contrast.mjs +0 -29
  64. package/esm2022/lib/effects/color-depth/color-depth.mjs +0 -29
  65. package/esm2022/lib/effects/depth/depth.mjs +0 -29
  66. package/esm2022/lib/effects/dot-screen/dot-screen.mjs +0 -29
  67. package/esm2022/lib/effects/hue-saturation/hue-saturation.mjs +0 -29
  68. package/esm2022/lib/effects/lut/lut.mjs +0 -74
  69. package/esm2022/lib/effects/noise/noise.mjs +0 -33
  70. package/esm2022/lib/effects/pixelation/pixelation.mjs +0 -37
  71. package/esm2022/lib/effects/scanline/scanline.mjs +0 -33
  72. package/esm2022/lib/effects/sepia/sepia.mjs +0 -29
  73. package/esm2022/lib/effects/shock-wave/shock-wave.mjs +0 -29
  74. package/esm2022/lib/effects/smaa/smaa.mjs +0 -29
  75. package/esm2022/lib/effects/ssao/ssao.mjs +0 -217
  76. package/esm2022/lib/effects/tilt-shift/tilt-shift.mjs +0 -33
  77. package/esm2022/lib/effects/tone-mapping/tone-mapping.mjs +0 -29
  78. package/esm2022/lib/effects/vignette/vignette.mjs +0 -29
  79. package/lib/effects/bloom/bloom.d.ts +0 -13
  80. package/lib/effects/brightness-contrast/brightness-contrast.d.ts +0 -15
  81. package/lib/effects/color-depth/color-depth.d.ts +0 -14
  82. package/lib/effects/depth/depth.d.ts +0 -14
  83. package/lib/effects/dot-screen/dot-screen.d.ts +0 -15
  84. package/lib/effects/hue-saturation/hue-saturation.d.ts +0 -15
  85. package/lib/effects/lut/lut.d.ts +0 -29
  86. package/lib/effects/noise/noise.d.ts +0 -15
  87. package/lib/effects/pixelation/pixelation.d.ts +0 -20
  88. package/lib/effects/scanline/scanline.d.ts +0 -15
  89. package/lib/effects/sepia/sepia.d.ts +0 -14
  90. package/lib/effects/shock-wave/shock-wave.d.ts +0 -17
  91. package/lib/effects/smaa/smaa.d.ts +0 -16
  92. package/lib/effects/ssao/ssao.d.ts +0 -42
  93. package/lib/effects/tilt-shift/tilt-shift.d.ts +0 -23
  94. package/lib/effects/tone-mapping/tone-mapping.d.ts +0 -22
  95. package/lib/effects/vignette/vignette.d.ts +0 -17
@@ -0,0 +1,63 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
2
+ import { NgtArgs, injectStore, pick, vector2 } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { mergeInputs } from 'ngxtension/inject-inputs';
5
+ import { GlitchEffect, GlitchMode } from 'postprocessing';
6
+ import * as i0 from "@angular/core";
7
+ export class NgtpGlitch {
8
+ constructor() {
9
+ this.autoEffect = injectAutoEffect();
10
+ this.store = injectStore();
11
+ this.invalidate = this.store.select('invalidate');
12
+ this.options = input({ active: true }, { transform: mergeInputs({ active: true }) });
13
+ this.active = pick(this.options, 'active');
14
+ this.mode = pick(this.options, 'mode');
15
+ this.delay = vector2(this.options, 'delay');
16
+ this.duration = vector2(this.options, 'duration');
17
+ this.chromaticAberrationOffset = vector2(this.options, 'chromaticAberrationOffset');
18
+ this.strength = vector2(this.options, 'strength');
19
+ this.effect = computed(() => {
20
+ const [{ ratio, dtSize, columns, blendFunction, perturbationMap }, delay, duration, chromaticAberrationOffset, strength,] = [this.options(), this.delay(), this.duration(), this.chromaticAberrationOffset(), this.strength()];
21
+ return new GlitchEffect({
22
+ ratio,
23
+ dtSize,
24
+ columns,
25
+ blendFunction,
26
+ perturbationMap,
27
+ delay,
28
+ duration,
29
+ chromaticAberrationOffset,
30
+ strength,
31
+ });
32
+ });
33
+ afterNextRender(() => {
34
+ this.autoEffect(() => {
35
+ const effect = this.effect();
36
+ return () => effect.dispose();
37
+ });
38
+ this.autoEffect(() => {
39
+ const [effect, invalidate, mode, active] = [this.effect(), this.invalidate(), this.mode(), this.active()];
40
+ effect.mode = active ? mode || GlitchMode.SPORADIC : GlitchMode.DISABLED;
41
+ invalidate();
42
+ });
43
+ });
44
+ }
45
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGlitch, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGlitch, isStandalone: true, selector: "ngtp-glitch", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
47
+ <ngt-primitive *args="[effect()]" />
48
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGlitch, decorators: [{
51
+ type: Component,
52
+ args: [{
53
+ selector: 'ngtp-glitch',
54
+ standalone: true,
55
+ template: `
56
+ <ngt-primitive *args="[effect()]" />
57
+ `,
58
+ imports: [NgtArgs],
59
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
60
+ changeDetection: ChangeDetectionStrategy.OnPush,
61
+ }]
62
+ }], ctorParameters: () => [] });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xpdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvbGliL2VmZmVjdHMvZ2xpdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLEtBQUssR0FDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFjLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQXNCMUQsTUFBTSxPQUFPLFVBQVU7SUFvQ3RCO1FBbkNBLGVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hDLFVBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUN0QixlQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0MsWUFBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQW1CLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWpHLFdBQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxTQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEMsVUFBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3Qyw4QkFBeUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQy9FLGFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU3QyxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN0QixNQUFNLENBQ0wsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEVBQzFELEtBQUssRUFDTCxRQUFRLEVBQ1IseUJBQXlCLEVBQ3pCLFFBQVEsRUFDUixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdkcsT0FBTyxJQUFJLFlBQVksQ0FBQztnQkFDdkIsS0FBSztnQkFDTCxNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2dCQUNmLEtBQUs7Z0JBQ0wsUUFBUTtnQkFDUix5QkFBeUI7Z0JBQ3pCLFFBQVE7YUFDUixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUdGLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDekUsVUFBVSxFQUFFLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FqRFcsVUFBVTtrR0FBVixVQUFVLGlOQVBaOztFQUVULDREQUNTLE9BQU87OzJGQUlMLFVBQVU7a0JBVnRCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7O0VBRVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgTmd0VmVjdG9yMiwgaW5qZWN0U3RvcmUsIHBpY2ssIHZlY3RvcjIgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEdsaXRjaEVmZmVjdCwgR2xpdGNoTW9kZSB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcblxuZXhwb3J0IHR5cGUgR2xpdGNoT3B0aW9ucyA9IE5vbk51bGxhYmxlPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgR2xpdGNoRWZmZWN0PlswXT4gJlxuXHRQYXJ0aWFsPHtcblx0XHRtb2RlOiBHbGl0Y2hNb2RlO1xuXHRcdGFjdGl2ZTogYm9vbGVhbjtcblx0XHRkZWxheTogTmd0VmVjdG9yMjtcblx0XHRkdXJhdGlvbjogTmd0VmVjdG9yMjtcblx0XHRjaHJvbWF0aWNBYmVycmF0aW9uT2Zmc2V0OiBOZ3RWZWN0b3IyO1xuXHRcdHN0cmVuZ3RoOiBOZ3RWZWN0b3IyO1xuXHR9PjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1nbGl0Y2gnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2VmZmVjdCgpXVwiIC8+XG5cdGAsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0cEdsaXRjaCB7XG5cdGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0aW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0b3B0aW9ucyA9IGlucHV0KHsgYWN0aXZlOiB0cnVlIH0gYXMgR2xpdGNoT3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKHsgYWN0aXZlOiB0cnVlIH0pIH0pO1xuXG5cdGFjdGl2ZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnYWN0aXZlJyk7XG5cdG1vZGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ21vZGUnKTtcblxuXHRkZWxheSA9IHZlY3RvcjIodGhpcy5vcHRpb25zLCAnZGVsYXknKTtcblx0ZHVyYXRpb24gPSB2ZWN0b3IyKHRoaXMub3B0aW9ucywgJ2R1cmF0aW9uJyk7XG5cdGNocm9tYXRpY0FiZXJyYXRpb25PZmZzZXQgPSB2ZWN0b3IyKHRoaXMub3B0aW9ucywgJ2Nocm9tYXRpY0FiZXJyYXRpb25PZmZzZXQnKTtcblx0c3RyZW5ndGggPSB2ZWN0b3IyKHRoaXMub3B0aW9ucywgJ3N0cmVuZ3RoJyk7XG5cblx0ZWZmZWN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtcblx0XHRcdHsgcmF0aW8sIGR0U2l6ZSwgY29sdW1ucywgYmxlbmRGdW5jdGlvbiwgcGVydHVyYmF0aW9uTWFwIH0sXG5cdFx0XHRkZWxheSxcblx0XHRcdGR1cmF0aW9uLFxuXHRcdFx0Y2hyb21hdGljQWJlcnJhdGlvbk9mZnNldCxcblx0XHRcdHN0cmVuZ3RoLFxuXHRcdF0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMuZGVsYXkoKSwgdGhpcy5kdXJhdGlvbigpLCB0aGlzLmNocm9tYXRpY0FiZXJyYXRpb25PZmZzZXQoKSwgdGhpcy5zdHJlbmd0aCgpXTtcblx0XHRyZXR1cm4gbmV3IEdsaXRjaEVmZmVjdCh7XG5cdFx0XHRyYXRpbyxcblx0XHRcdGR0U2l6ZSxcblx0XHRcdGNvbHVtbnMsXG5cdFx0XHRibGVuZEZ1bmN0aW9uLFxuXHRcdFx0cGVydHVyYmF0aW9uTWFwLFxuXHRcdFx0ZGVsYXksXG5cdFx0XHRkdXJhdGlvbixcblx0XHRcdGNocm9tYXRpY0FiZXJyYXRpb25PZmZzZXQsXG5cdFx0XHRzdHJlbmd0aCxcblx0XHR9KTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGVmZmVjdCA9IHRoaXMuZWZmZWN0KCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiBlZmZlY3QuZGlzcG9zZSgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtlZmZlY3QsIGludmFsaWRhdGUsIG1vZGUsIGFjdGl2ZV0gPSBbdGhpcy5lZmZlY3QoKSwgdGhpcy5pbnZhbGlkYXRlKCksIHRoaXMubW9kZSgpLCB0aGlzLmFjdGl2ZSgpXTtcblx0XHRcdFx0ZWZmZWN0Lm1vZGUgPSBhY3RpdmUgPyBtb2RlIHx8IEdsaXRjaE1vZGUuU1BPUkFESUMgOiBHbGl0Y2hNb2RlLkRJU0FCTEVEO1xuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,41 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
2
+ import { NgtArgs, is } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { GodRaysEffect } from 'postprocessing';
5
+ import { injectEffectComposerApi } from '../effect-composer';
6
+ import * as i0 from "@angular/core";
7
+ export class NgtpGodRays {
8
+ constructor() {
9
+ this.autoEffect = injectAutoEffect();
10
+ this.composerApi = injectEffectComposerApi();
11
+ this.options = input({});
12
+ this.effect = computed(() => {
13
+ const [{ camera }, { sun, ...options }] = [this.composerApi(), this.options()];
14
+ return new GodRaysEffect(camera, is.ref(sun) ? sun.nativeElement : sun, options);
15
+ });
16
+ afterNextRender(() => {
17
+ this.autoEffect(() => {
18
+ const [sun, effect] = [this.options().sun, this.effect()];
19
+ effect.lightSource = is.ref(sun) ? sun.nativeElement : sun;
20
+ });
21
+ });
22
+ }
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGodRays, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGodRays, isStandalone: true, selector: "ngtp-god-rays", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
25
+ <ngt-primitive *args="[effect()]" />
26
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGodRays, decorators: [{
29
+ type: Component,
30
+ args: [{
31
+ selector: 'ngtp-god-rays',
32
+ standalone: true,
33
+ template: `
34
+ <ngt-primitive *args="[effect()]" />
35
+ `,
36
+ imports: [NgtArgs],
37
+ changeDetection: ChangeDetectionStrategy.OnPush,
38
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
39
+ }]
40
+ }], ctorParameters: () => [] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29kLXJheXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9nb2QtcmF5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsZUFBZSxFQUNmLFFBQVEsRUFDUixLQUFLLEdBQ0wsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQWdCN0QsTUFBTSxPQUFPLFdBQVc7SUFXdkI7UUFWQSxlQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoQyxnQkFBVyxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFFeEMsWUFBTyxHQUFHLEtBQUssQ0FBQyxFQUFvQixDQUFDLENBQUM7UUFFdEMsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUMsQ0FBQztRQUdGLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FsQlcsV0FBVztrR0FBWCxXQUFXLG1OQVBiOztFQUVULDREQUNTLE9BQU87OzJGQUlMLFdBQVc7a0JBVnZCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7O0VBRVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNsQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaXMgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IEdvZFJheXNFZmZlY3QgfSBmcm9tICdwb3N0cHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBNZXNoLCBQb2ludHMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RFZmZlY3RDb21wb3NlckFwaSB9IGZyb20gJy4uL2VmZmVjdC1jb21wb3Nlcic7XG5cbnR5cGUgR29kUmF5c09wdGlvbnMgPSBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEdvZFJheXNFZmZlY3Q+WzJdICYge1xuXHRzdW46IE1lc2ggfCBQb2ludHMgfCBFbGVtZW50UmVmPE1lc2ggfCBQb2ludHM+O1xufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1nb2QtcmF5cycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgKmFyZ3M9XCJbZWZmZWN0KCldXCIgLz5cblx0YCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RwR29kUmF5cyB7XG5cdGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdGNvbXBvc2VyQXBpID0gaW5qZWN0RWZmZWN0Q29tcG9zZXJBcGkoKTtcblxuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgR29kUmF5c09wdGlvbnMpO1xuXG5cdGVmZmVjdCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbeyBjYW1lcmEgfSwgeyBzdW4sIC4uLm9wdGlvbnMgfV0gPSBbdGhpcy5jb21wb3NlckFwaSgpLCB0aGlzLm9wdGlvbnMoKV07XG5cdFx0cmV0dXJuIG5ldyBHb2RSYXlzRWZmZWN0KGNhbWVyYSwgaXMucmVmKHN1bikgPyBzdW4ubmF0aXZlRWxlbWVudCA6IHN1biwgb3B0aW9ucyk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLmF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbc3VuLCBlZmZlY3RdID0gW3RoaXMub3B0aW9ucygpLnN1biwgdGhpcy5lZmZlY3QoKV07XG5cdFx0XHRcdGVmZmVjdC5saWdodFNvdXJjZSA9IGlzLnJlZihzdW4pID8gc3VuLm5hdGl2ZUVsZW1lbnQgOiBzdW47XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,44 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
2
+ import { NgtArgs, injectStore, pick } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { GridEffect } from 'postprocessing';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtpGrid {
7
+ constructor() {
8
+ this.autoEffect = injectAutoEffect();
9
+ this.store = injectStore();
10
+ this.invalidate = this.store.select('invalidate');
11
+ this.options = input({});
12
+ this.size = pick(this.options, 'size');
13
+ this.effect = computed(() => {
14
+ const { size: _, ...options } = this.options();
15
+ return new GridEffect(options);
16
+ });
17
+ afterNextRender(() => {
18
+ this.autoEffect(() => {
19
+ const [size, effect] = [this.size(), this.effect()];
20
+ if (size) {
21
+ effect.setSize(size.width, size.height);
22
+ }
23
+ });
24
+ });
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpGrid, isStandalone: true, selector: "ngtp-grid", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
28
+ <ngt-primitive *args="[effect()]" />
29
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpGrid, decorators: [{
32
+ type: Component,
33
+ args: [{
34
+ selector: 'ngtp-grid',
35
+ standalone: true,
36
+ template: `
37
+ <ngt-primitive *args="[effect()]" />
38
+ `,
39
+ imports: [NgtArgs],
40
+ changeDetection: ChangeDetectionStrategy.OnPush,
41
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
42
+ }]
43
+ }], ctorParameters: () => [] });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL2dyaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixRQUFRLEVBQ1IsS0FBSyxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBZTVDLE1BQU0sT0FBTyxRQUFRO0lBYXBCO1FBWkEsZUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDaEMsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3QyxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQWlCLENBQUMsQ0FBQztRQUNuQyxTQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEMsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUdGLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3BELElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQXRCVyxRQUFRO2tHQUFSLFFBQVEsK01BUFY7O0VBRVQsNERBQ1MsT0FBTzs7MkZBSUwsUUFBUTtrQkFWcEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsV0FBVztvQkFDckIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRhZnRlck5leHRSZW5kZXIsXG5cdGNvbXB1dGVkLFxuXHRpbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3RBcmdzLCBpbmplY3RTdG9yZSwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgR3JpZEVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcblxudHlwZSBHcmlkT3B0aW9ucyA9IE5vbk51bGxhYmxlPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgR3JpZEVmZmVjdD5bMF0+ICZcblx0UGFydGlhbDx7IHNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB9PjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1ncmlkJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltlZmZlY3QoKV1cIiAvPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBHcmlkIHtcblx0YXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0c3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRpbnZhbGlkYXRlID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2ludmFsaWRhdGUnKTtcblxuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgR3JpZE9wdGlvbnMpO1xuXHRzaXplID0gcGljayh0aGlzLm9wdGlvbnMsICdzaXplJyk7XG5cblx0ZWZmZWN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHsgc2l6ZTogXywgLi4ub3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0cmV0dXJuIG5ldyBHcmlkRWZmZWN0KG9wdGlvbnMpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW3NpemUsIGVmZmVjdF0gPSBbdGhpcy5zaXplKCksIHRoaXMuZWZmZWN0KCldO1xuXHRcdFx0XHRpZiAoc2l6ZSkge1xuXHRcdFx0XHRcdGVmZmVjdC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, inject, input } from '@angular/core';
2
+ import { NgtArgs, extend } from 'angular-three';
3
+ import { HueSaturationEffect } from 'postprocessing';
4
+ import { NgtpEffect, NgtpEffectBlendMode, NgtpEffectHostDirective } from '../effect';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../effect";
7
+ extend({ HueSaturationEffect });
8
+ export class NgtpHueSaturation {
9
+ constructor() {
10
+ this.effect = inject(NgtpEffect, { host: true });
11
+ this.options = input({});
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpHueSaturation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpHueSaturation, isStandalone: true, selector: "ngtp-hue-saturation", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: i1.NgtpEffect, inputs: ["blendFunction", "blendFunction", "opacity", "opacity"] }], ngImport: i0, template: `
15
+ <ngt-hue-saturation-effect *args="[options()]" [camera]="effect.camera()">
16
+ <ngtp-effect-blend-mode />
17
+ <ng-content />
18
+ </ngt-hue-saturation-effect>
19
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }, { kind: "component", type: NgtpEffectBlendMode, selector: "ngtp-effect-blend-mode" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpHueSaturation, decorators: [{
22
+ type: Component,
23
+ args: [{
24
+ selector: 'ngtp-hue-saturation',
25
+ template: `
26
+ <ngt-hue-saturation-effect *args="[options()]" [camera]="effect.camera()">
27
+ <ngtp-effect-blend-mode />
28
+ <ng-content />
29
+ </ngt-hue-saturation-effect>
30
+ `,
31
+ standalone: true,
32
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
33
+ changeDetection: ChangeDetectionStrategy.OnPush,
34
+ imports: [NgtArgs, NgtpEffectBlendMode],
35
+ hostDirectives: [NgtpEffectHostDirective],
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVlLXNhdHVyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9odWUtc2F0dXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBRXJGLE1BQU0sQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQWtCaEMsTUFBTSxPQUFPLGlCQUFpQjtJQWQ5QjtRQWVDLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUMsWUFBTyxHQUFHLEtBQUssQ0FBQyxFQUF1RCxDQUFDLENBQUM7S0FDekU7OEdBSFksaUJBQWlCO2tHQUFqQixpQkFBaUIsMlVBWm5COzs7OztFQUtULDREQUlTLE9BQU8sZ0ZBQUUsbUJBQW1COzsyRkFHMUIsaUJBQWlCO2tCQWQ3QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRTs7Ozs7RUFLVDtvQkFDRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUM7b0JBQ3ZDLGNBQWMsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2lCQUN6QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MsIGV4dGVuZCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgSHVlU2F0dXJhdGlvbkVmZmVjdCB9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nJztcbmltcG9ydCB7IE5ndHBFZmZlY3QsIE5ndHBFZmZlY3RCbGVuZE1vZGUsIE5ndHBFZmZlY3RIb3N0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZWZmZWN0JztcblxuZXh0ZW5kKHsgSHVlU2F0dXJhdGlvbkVmZmVjdCB9KTtcblxuZXhwb3J0IHR5cGUgSHVlU2F0dXJhdGlvbkVmZmVjdE9wdGlvbnMgPSBQYXJ0aWFsPE5vbk51bGxhYmxlPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgSHVlU2F0dXJhdGlvbkVmZmVjdD5bMF0+PjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1odWUtc2F0dXJhdGlvbicsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1odWUtc2F0dXJhdGlvbi1lZmZlY3QgKmFyZ3M9XCJbb3B0aW9ucygpXVwiIFtjYW1lcmFdPVwiZWZmZWN0LmNhbWVyYSgpXCI+XG5cdFx0XHQ8bmd0cC1lZmZlY3QtYmxlbmQtbW9kZSAvPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1odWUtc2F0dXJhdGlvbi1lZmZlY3Q+XG5cdGAsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzLCBOZ3RwRWZmZWN0QmxlbmRNb2RlXSxcblx0aG9zdERpcmVjdGl2ZXM6IFtOZ3RwRWZmZWN0SG9zdERpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBIdWVTYXR1cmF0aW9uIHtcblx0ZWZmZWN0ID0gaW5qZWN0KE5ndHBFZmZlY3QsIHsgaG9zdDogdHJ1ZSB9KTtcblx0b3B0aW9ucyA9IGlucHV0KHt9IGFzIE9taXQ8SHVlU2F0dXJhdGlvbkVmZmVjdE9wdGlvbnMsICdibGVuZEZ1bmN0aW9uJz4pO1xufVxuIl19
@@ -1,18 +1,27 @@
1
- export * from './bloom/bloom';
2
- export * from './brightness-contrast/brightness-contrast';
3
- export * from './color-depth/color-depth';
4
- export * from './depth/depth';
5
- export * from './dot-screen/dot-screen';
6
- export * from './hue-saturation/hue-saturation';
7
- export * from './lut/lut';
8
- export * from './noise/noise';
9
- export * from './pixelation/pixelation';
10
- export * from './scanline/scanline';
11
- export * from './sepia/sepia';
12
- export * from './shock-wave/shock-wave';
13
- export * from './smaa/smaa';
14
- export * from './ssao/ssao';
15
- export * from './tilt-shift/tilt-shift';
16
- export * from './tone-mapping/tone-mapping';
17
- export * from './vignette/vignette';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ibG9vbS9ibG9vbSc7XG5leHBvcnQgKiBmcm9tICcuL2JyaWdodG5lc3MtY29udHJhc3QvYnJpZ2h0bmVzcy1jb250cmFzdCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbG9yLWRlcHRoL2NvbG9yLWRlcHRoJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwdGgvZGVwdGgnO1xuZXhwb3J0ICogZnJvbSAnLi9kb3Qtc2NyZWVuL2RvdC1zY3JlZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9odWUtc2F0dXJhdGlvbi9odWUtc2F0dXJhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2x1dC9sdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2lzZS9ub2lzZSc7XG5leHBvcnQgKiBmcm9tICcuL3BpeGVsYXRpb24vcGl4ZWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NjYW5saW5lL3NjYW5saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vc2VwaWEvc2VwaWEnO1xuZXhwb3J0ICogZnJvbSAnLi9zaG9jay13YXZlL3Nob2NrLXdhdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zbWFhL3NtYWEnO1xuZXhwb3J0ICogZnJvbSAnLi9zc2FvL3NzYW8nO1xuZXhwb3J0ICogZnJvbSAnLi90aWx0LXNoaWZ0L3RpbHQtc2hpZnQnO1xuZXhwb3J0ICogZnJvbSAnLi90b25lLW1hcHBpbmcvdG9uZS1tYXBwaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vdmlnbmV0dGUvdmlnbmV0dGUnO1xuIl19
1
+ export * from './ascii';
2
+ export * from './bloom';
3
+ export * from './brightness-contrast';
4
+ export * from './chromatic-abberation';
5
+ export * from './color-average';
6
+ export * from './color-depth';
7
+ export * from './depth';
8
+ export * from './depth-of-field';
9
+ export * from './dot-screen';
10
+ export * from './fxaa';
11
+ export * from './glitch';
12
+ export * from './god-rays';
13
+ export * from './grid';
14
+ export * from './hue-saturation';
15
+ export * from './lens-flare';
16
+ export * from './lut';
17
+ export * from './noise';
18
+ export * from './pixelation';
19
+ export * from './scanline';
20
+ export * from './sepia';
21
+ export * from './shock-wave';
22
+ export * from './smaa';
23
+ export * from './tilt-shift';
24
+ export * from './tilt-shift-2';
25
+ export * from './vignette';
26
+ export * from './water';
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9saWIvZWZmZWN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxPQUFPLENBQUM7QUFDdEIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXNjaWknO1xuZXhwb3J0ICogZnJvbSAnLi9ibG9vbSc7XG5leHBvcnQgKiBmcm9tICcuL2JyaWdodG5lc3MtY29udHJhc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9jaHJvbWF0aWMtYWJiZXJhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2NvbG9yLWF2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb2xvci1kZXB0aCc7XG5leHBvcnQgKiBmcm9tICcuL2RlcHRoJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwdGgtb2YtZmllbGQnO1xuZXhwb3J0ICogZnJvbSAnLi9kb3Qtc2NyZWVuJztcbmV4cG9ydCAqIGZyb20gJy4vZnhhYSc7XG5leHBvcnQgKiBmcm9tICcuL2dsaXRjaCc7XG5leHBvcnQgKiBmcm9tICcuL2dvZC1yYXlzJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JpZCc7XG5leHBvcnQgKiBmcm9tICcuL2h1ZS1zYXR1cmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGVucy1mbGFyZSc7XG5leHBvcnQgKiBmcm9tICcuL2x1dCc7XG5leHBvcnQgKiBmcm9tICcuL25vaXNlJztcbmV4cG9ydCAqIGZyb20gJy4vcGl4ZWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NjYW5saW5lJztcbmV4cG9ydCAqIGZyb20gJy4vc2VwaWEnO1xuZXhwb3J0ICogZnJvbSAnLi9zaG9jay13YXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc21hYSc7XG5leHBvcnQgKiBmcm9tICcuL3RpbHQtc2hpZnQnO1xuZXhwb3J0ICogZnJvbSAnLi90aWx0LXNoaWZ0LTInO1xuZXhwb3J0ICogZnJvbSAnLi92aWduZXR0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGVyJztcbiJdfQ==
@@ -0,0 +1,194 @@
1
+ // Created by Anderson Mancini 2023
2
+ // React Three Fiber Ultimate LensFlare
3
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
4
+ import { NgtArgs, injectBeforeRender, injectStore } from 'angular-three';
5
+ import { easing } from 'maath';
6
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
7
+ import { mergeInputs } from 'ngxtension/inject-inputs';
8
+ import { BlendFunction, Effect } from 'postprocessing';
9
+ import { Color, Mesh, Uniform, Vector2, Vector3 } from 'three';
10
+ import { injectEffectComposerApi } from '../effect-composer';
11
+ import * as i0 from "@angular/core";
12
+ const LensFlareShader = {
13
+ fragmentShader: /* glsl */ `
14
+
15
+ uniform float iTime;
16
+ uniform vec2 lensPosition;
17
+ uniform vec2 iResolution;
18
+ uniform vec3 colorGain;
19
+ uniform float starPoints;
20
+ uniform float glareSize;
21
+ uniform float flareSize;
22
+ uniform float flareSpeed;
23
+ uniform float flareShape;
24
+ uniform float haloScale;
25
+ uniform float opacity;
26
+ uniform bool animated;
27
+ uniform bool anamorphic;
28
+ uniform bool enabled;
29
+ uniform bool secondaryGhosts;
30
+ uniform bool starBurst;
31
+ uniform float ghostScale;
32
+ uniform bool aditionalStreaks;
33
+ uniform sampler2D lensDirtTexture;
34
+ vec2 vxtC;
35
+
36
+ float rndf(float n){return fract(sin(n) * 43758.5453123);}float niz(float p){float fl = floor(p);float fc = fract(p);return mix(rndf(fl),rndf(fl + 1.0), fc);}
37
+ vec3 hsv2rgb(vec3 c){vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);}
38
+ float satU(float x){return clamp(x, 0.,1.);}vec2 rtU(vec2 naz, float rtn){return vec2(cos(rtn) * naz.x + sin(rtn) * naz.y,cos(rtn) * naz.y - sin(rtn) * naz.x);}
39
+ vec3 drwF(vec2 p, float intensity, float rnd, float speed, int id){float flhos = (1. / 32.) * float(id) * 0.1;float lingrad = distance(vec2(0.), p);float expg = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));vec3 qzTg = hsv2rgb(vec3( fract( (expg * 8.) + speed * flareSpeed + flhos), pow(1.-abs(expg*2.-1.), 0.45), 20.0 * expg * intensity));float internalStarPoints;if(anamorphic){internalStarPoints = 1.0;} else{internalStarPoints = starPoints;}float ams = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));float kJhg = pow(1.-satU(ams), ( anamorphic ? 100. : 12.));kJhg += satU(expg-0.9) * 3.;kJhg = pow(kJhg * expg, 8. + (1.-intensity) * 5.);if(flareSpeed > 0.0){return vec3(kJhg) * qzTg;} else{return vec3(kJhg) * flareSize * 15.;}}
40
+ float ams2(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);}vec3 satU(vec3 x){return clamp(x, vec3(0.0), vec3(1.0));}
41
+ float glR(vec2 naz, vec2 pos, float zsi){vec2 mni;if(animated){mni = rtU(naz-pos, iTime * 0.1);} else{mni = naz-pos;}float ang = atan(mni.y, mni.x) * (anamorphic ? 1.0 : starPoints);float ams2 = length(mni);ams2 = pow(ams2, .9);float f0 = 1.0/(length(naz-pos)*(1.0/zsi*16.0)+.2);return f0+f0*(sin((ang))*.2 +.3);}
42
+ float sdHex(vec2 p){p = abs(p);vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);return dot(step(q.xy,q.yx), 1.0-q.yx);}float fpow(float x, float k){return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;}
43
+ vec3 rHx(vec2 naz, vec2 p, float s, vec3 col){naz -= p;if (abs(naz.x) < 0.2*s && abs(naz.y) < 0.2*s){return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(naz/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(naz*20.0/s)));}return vec3(0);}
44
+ vec3 mLs(vec2 naz, vec2 pos){vec2 mni = naz-pos;vec2 zxMp = naz*(length(naz));float ang = atan(mni.x,mni.y);float f0 = .3/(length(naz-pos)*16.0+1.0);f0 = f0*(sin(niz(sin(ang*3.9-(animated ? iTime : 0.0) * 0.3) * starPoints))*.2 );float f1 = max(0.01-pow(length(naz+1.2*pos),1.9),.0)*7.0;float f2 = max(.9/(10.0+32.0*pow(length(zxMp+0.99*pos),2.0)),.0)*0.35;float f22 = max(.9/(11.0+32.0*pow(length(zxMp+0.85*pos),2.0)),.0)*0.23;float f23 = max(.9/(12.0+32.0*pow(length(zxMp+0.95*pos),2.0)),.0)*0.6;vec2 ztX = mix(naz,zxMp, 0.1);float f4 = max(0.01-pow(length(ztX+0.4*pos),2.9),.0)*4.02;float f42 = max(0.0-pow(length(ztX+0.45*pos),2.9),.0)*4.1;float f43 = max(0.01-pow(length(ztX+0.5*pos),2.9),.0)*4.6;ztX = mix(naz,zxMp,-.4);float f5 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;float f52 = max(0.01-pow(length(ztX+0.2*pos),5.5),.0)*2.0;float f53 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;ztX = mix(naz,zxMp, 2.1);float f6 = max(0.01-pow(length(ztX-0.3*pos),1.61),.0)*3.159;float f62 = max(0.01-pow(length(ztX-0.325*pos),1.614),.0)*3.14;float f63 = max(0.01-pow(length(ztX-0.389*pos),1.623),.0)*3.12;vec3 c = vec3(glR(naz,pos, glareSize));vec2 prot;if(animated){prot = rtU(naz - pos, (iTime * 0.1));} else if(anamorphic){prot = rtU(naz - pos, 1.570796);} else {prot = naz - pos;}c += drwF(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, iTime, 1);c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;c = c*1.3 * vec3(length(zxMp)+.09);c+=vec3(f0);return c;}
45
+ vec3 cc(vec3 clr, float fct,float fct2){float w = clr.x+clr.y+clr.z;return mix(clr,vec3(w)*fct,w*fct2);}float rnd(vec2 p){float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));return f;}float rnd(float w){float f = fract(sin(w)*1000.);return f;}
46
+ float rShp(vec2 p, int N){float f;float a=atan(p.x,p.y)+.2;float b=6.28319/float(N);f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);return f;}
47
+ vec3 drC(vec2 p, float zsi, float dCy, vec3 clr, vec3 clr2, float ams2, vec2 esom){float l = length(p + esom*(ams2*2.))+zsi/2.;float l2 = length(p + esom*(ams2*4.))+zsi/3.;float c = max(0.01-pow(length(p + esom*ams2), zsi*ghostScale), 0.0)*10.;float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;float c2 = max(0.09/pow(length(p-esom*ams2/.5)*1., .95), 0.0)/20.;float s = max(0.02-pow(rShp(p*5. + esom*ams2*5. + dCy, 6) , 1.), 0.0)*1.5;clr = cos(vec3(0.44, .24, .2)*8. + ams2*4.)*0.5+.5;vec3 f = c*clr;f += c1*clr;f += c2*clr;f += s*clr;return f-0.01;}
48
+ vec4 geLC(float x){return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),1.0);}
49
+ float diTN(vec2 p){vec2 f = fract(p);f = (f * f) * (3.0 - (2.0 * f));float n = dot(floor(p), vec2(1.0, 157.0));vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);}
50
+ float fbm(vec2 p){const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);float f = 0.0;f += 0.5000*diTN(p); p = m*p*2.02;f += 0.2500*diTN(p); p = m*p*2.03;f += 0.1250*diTN(p); p = m*p*2.01;f += 0.0625*diTN(p);return f/0.9375;}
51
+ vec4 geLS(vec2 p){vec2 pp = (p - vec2(0.5)) * 2.0;float a = atan(pp.y, pp.x);vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;return vec4(vec3(c * 1.0), d);}
52
+ vec4 geLD(vec2 p){p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),smoothstep(0.4, 0.0, length(p - vec2(0.75)))),smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);}
53
+ vec4 txL(sampler2D tex, vec2 xtC){if(((xtC.x < 0.) || (xtC.y < 0.)) || ((xtC.x > 1.) || (xtC.y > 1.))){return vec4(0.0);}else{return texture(tex, xtC); }}
54
+ vec4 txD(sampler2D tex, vec2 xtC, vec2 dir, vec3 ditn) {return vec4(txL(tex, (xtC + (dir * ditn.r))).r,txL(tex, (xtC + (dir * ditn.g))).g,txL(tex, (xtC + (dir * ditn.b))).b,1.0);}
55
+ vec4 strB(){vec2 aspXtc = vec2(1.0) - (((vxtC - vec2(0.5)) * vec2(1.0)) + vec2(0.5)); vec2 xtC = vec2(1.0) - vxtC; vec2 ghvc = (vec2(0.5) - xtC) * 0.3 - lensPosition; vec2 ghNm = normalize(ghvc * vec2(1.0)) * vec2(1.0);vec2 haloVec = normalize(ghvc) * 0.6;vec2 hlNm = ghNm * 0.6;vec2 texelSize = vec2(1.0) / vec2(iResolution.xy);vec3 ditn = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);vec4 c = vec4(0.0);for (int i = 0; i < 8; i++) {vec2 offset = xtC + (ghvc * float(i));c += txD(lensDirtTexture, offset, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);}vec2 uyTrz = xtC + hlNm; return (c * geLC((length(vec2(0.5) - aspXtc) / length(vec2(haloScale))))) +(txD(lensDirtTexture, uyTrz, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - uyTrz) / length(vec2(0.5)))), 10.0));}
56
+ void mainImage(vec4 v,vec2 r,out vec4 i){vec2 g=r-.5;g.y*=iResolution.y/iResolution.x;vec2 l=lensPosition*.5;l.y*=iResolution.y/iResolution.x;vec3 f=mLs(g,l)*20.*colorGain/256.;if(aditionalStreaks){vec3 o=vec3(.9,.2,.1),p=vec3(.3,.1,.9);for(float n=0.;n<10.;n++)f+=drC(g,pow(rnd(n*2e3)*2.8,.1)+1.41,0.,o+n,p+n,rnd(n*20.)*3.+.2-.5,lensPosition);}if(secondaryGhosts){vec3 n=vec3(0);n+=rHx(g,-lensPosition*.25,ghostScale*1.4,vec3(.25,.35,0));n+=rHx(g,lensPosition*.25,ghostScale*.5,vec3(1,.5,.5));n+=rHx(g,lensPosition*.1,ghostScale*1.6,vec3(1));n+=rHx(g,lensPosition*1.8,ghostScale*2.,vec3(0,.5,.75));n+=rHx(g,lensPosition*1.25,ghostScale*.8,vec3(1,1,.5));n+=rHx(g,-lensPosition*1.25,ghostScale*5.,vec3(.5,.5,.25));n+=fpow(1.-abs(distance(lensPosition*.8,g)-.7),.985)*colorGain/2100.;f+=n;}if(starBurst){vxtC=g+.5;vec4 n=geLD(g);float o=1.-clamp(0.5,0.,.5)*2.;n+=mix(n,pow(n*2.,vec4(2))*.5,o);float s=(g.x+g.y)*(1./6.);vec2 d=mat2(cos(s),-sin(s),sin(s),cos(s))*vxtC;n+=geLS(d)*2.;f+=clamp(n.xyz*strB().xyz,.01,1.);}i=enabled?vec4(mix(f,vec3(0),opacity)+v.xyz,v.w):vec4(v);}
57
+ `,
58
+ };
59
+ export class LensFlareEffect extends Effect {
60
+ constructor({ blendFunction = BlendFunction.NORMAL, enabled = true, glareSize = 0.2, lensPosition = [0.01, 0.01], iResolution = [0, 0], starPoints = 6, flareSize = 0.01, flareSpeed = 0.01, flareShape = 0.01, animated = true, anamorphic = false, colorGain = new Color(20, 20, 20), lensDirtTexture = null, haloScale = 0.5, secondaryGhosts = true, aditionalStreaks = true, ghostScale = 0.0, opacity = 1.0, starBurst = false, } = {}) {
61
+ super('LensFlareEffect', LensFlareShader.fragmentShader, {
62
+ blendFunction,
63
+ uniforms: new Map([
64
+ ['enabled', new Uniform(enabled)],
65
+ ['glareSize', new Uniform(glareSize)],
66
+ ['lensPosition', new Uniform(lensPosition)],
67
+ ['iTime', new Uniform(0)],
68
+ ['iResolution', new Uniform(iResolution)],
69
+ ['starPoints', new Uniform(starPoints)],
70
+ ['flareSize', new Uniform(flareSize)],
71
+ ['flareSpeed', new Uniform(flareSpeed)],
72
+ ['flareShape', new Uniform(flareShape)],
73
+ ['animated', new Uniform(animated)],
74
+ ['anamorphic', new Uniform(anamorphic)],
75
+ ['colorGain', new Uniform(colorGain)],
76
+ ['lensDirtTexture', new Uniform(lensDirtTexture)],
77
+ ['haloScale', new Uniform(haloScale)],
78
+ ['secondaryGhosts', new Uniform(secondaryGhosts)],
79
+ ['aditionalStreaks', new Uniform(aditionalStreaks)],
80
+ ['ghostScale', new Uniform(ghostScale)],
81
+ ['starBurst', new Uniform(starBurst)],
82
+ ['opacity', new Uniform(opacity)],
83
+ ]),
84
+ });
85
+ }
86
+ update(_renderer, _inputBuffer, deltaTime) {
87
+ const iTime = this.uniforms.get('iTime');
88
+ if (iTime) {
89
+ iTime.value += deltaTime;
90
+ }
91
+ }
92
+ }
93
+ const defaultOptions = {
94
+ position: new Vector3(-25, 6, -60),
95
+ followMouse: false,
96
+ smoothTime: 0.7,
97
+ };
98
+ export class NgtpLensFlare {
99
+ constructor() {
100
+ this.autoEffect = injectAutoEffect();
101
+ this.store = injectStore();
102
+ this.viewport = this.store.select('viewport');
103
+ this.raycaster = this.store.select('raycaster');
104
+ this.pointer = this.store.select('pointer');
105
+ this.composerApi = injectEffectComposerApi();
106
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
107
+ this.projectedPosition = new Vector3();
108
+ this.mouse2d = new Vector2();
109
+ this.effect = computed(() => {
110
+ const { position: _, followMouse: __, smoothTime: ___, ...options } = this.options();
111
+ return new LensFlareEffect(options);
112
+ });
113
+ afterNextRender(() => {
114
+ this.autoEffect(() => {
115
+ const [effect, viewport] = [this.effect(), this.viewport()];
116
+ const iResolution = effect.uniforms.get('iResolution');
117
+ if (iResolution) {
118
+ iResolution.value.x = viewport.width;
119
+ iResolution.value.y = viewport.height;
120
+ }
121
+ });
122
+ });
123
+ injectBeforeRender(({ delta }) => {
124
+ const [effect] = [this.effect()];
125
+ if (!effect)
126
+ return;
127
+ const [{ followMouse, position, smoothTime }, pointer, { camera, scene }, raycaster] = [
128
+ this.options(),
129
+ this.pointer(),
130
+ this.composerApi(),
131
+ this.raycaster(),
132
+ ];
133
+ const uLensPosition = effect.uniforms.get('lensPosition');
134
+ const uOpacity = effect.uniforms.get('opacity');
135
+ if (!uLensPosition || !uOpacity)
136
+ return;
137
+ let target = 1;
138
+ if (followMouse) {
139
+ uLensPosition.value.x = pointer.x;
140
+ uLensPosition.value.y = pointer.y;
141
+ target = 0;
142
+ }
143
+ else {
144
+ this.projectedPosition.copy(position).project(camera);
145
+ if (this.projectedPosition.z > 1)
146
+ return;
147
+ uLensPosition.value.x = this.projectedPosition.x;
148
+ uLensPosition.value.y = this.projectedPosition.y;
149
+ this.mouse2d.set(this.projectedPosition.x, this.projectedPosition.y);
150
+ raycaster.setFromCamera(this.mouse2d, camera);
151
+ const intersects = raycaster.intersectObjects(scene.children, true);
152
+ const { object } = intersects[0] ?? {};
153
+ if (object) {
154
+ if (object.userData?.['lensflare'] === 'no-occlusion') {
155
+ target = 0;
156
+ }
157
+ else if (object instanceof Mesh) {
158
+ if (object.material.uniforms?._transmission?.value > 0.2) {
159
+ //Check for MeshTransmissionMaterial
160
+ target = 0.2;
161
+ }
162
+ else if (object.material._transmission && object.material._transmission > 0.2) {
163
+ //Check for MeshPhysicalMaterial with transmission setting
164
+ target = 0.2;
165
+ }
166
+ else if (object.material.transparent) {
167
+ // Check for OtherMaterials with transparent parameter
168
+ target = object.material.opacity;
169
+ }
170
+ }
171
+ }
172
+ }
173
+ easing.damp(uOpacity, 'value', target, smoothTime, delta);
174
+ });
175
+ }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLensFlare, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpLensFlare, isStandalone: true, selector: "ngtp-lens-flare", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
178
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
179
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
180
+ }
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLensFlare, decorators: [{
182
+ type: Component,
183
+ args: [{
184
+ selector: 'ngtp-lens-flare',
185
+ standalone: true,
186
+ template: `
187
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
188
+ `,
189
+ imports: [NgtArgs],
190
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
191
+ changeDetection: ChangeDetectionStrategy.OnPush,
192
+ }]
193
+ }], ctorParameters: () => [] });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVucy1mbGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2xpYi9lZmZlY3RzL2xlbnMtZmxhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQW1DO0FBQ25DLHVDQUF1QztBQUV2QyxPQUFPLEVBQ04sc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFFBQVEsRUFDUixLQUFLLEdBQ0wsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBVyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFN0QsTUFBTSxlQUFlLEdBQUc7SUFDdkIsY0FBYyxFQUFFLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0QzNCO0NBQ0EsQ0FBQztBQUVGLE1BQU0sT0FBTyxlQUFnQixTQUFRLE1BQU07SUFDMUMsWUFBWSxFQUNYLGFBQWEsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUNwQyxPQUFPLEdBQUcsSUFBSSxFQUNkLFNBQVMsR0FBRyxHQUFHLEVBQ2YsWUFBWSxHQUFHLENBQUMsSUFBSSxFQUFF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QUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQzs0QkFDMUQsb0NBQW9DOzRCQUNwQyxNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNkLENBQUM7NkJBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQzs0QkFDakYsMERBQTBEOzRCQUMxRCxNQUFNLEdBQUcsR0FBRyxDQUFDO3dCQUNkLENBQUM7NkJBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUN4QyxzREFBc0Q7NEJBQ3RELE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQzt3QkFDbEMsQ0FBQztvQkFDRixDQUFDO2dCQUNGLENBQUM7WUFDRixDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQW5GVyxhQUFhO2tHQUFiLGFBQWEscU5BUGY7O0VBRVQsNERBQ1MsT0FBTzs7MkZBSUwsYUFBYTtrQkFWekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOztFQUVUO29CQUNELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDbEIsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENyZWF0ZWQgYnkgQW5kZXJzb24gTWFuY2luaSAyMDIzXG4vLyBSZWFjdCBUaHJlZSBGaWJlciBVbHRpbWF0ZSBMZW5zRmxhcmVcblxuaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgZWFzaW5nIH0gZnJvbSAnbWFhdGgnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQmxlbmRGdW5jdGlvbiwgRWZmZWN0IH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgQ29sb3IsIE1lc2gsIFRleHR1cmUsIFVuaWZvcm0sIFZlY3RvcjIsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RFZmZlY3RDb21wb3NlckFwaSB9IGZyb20gJy4uL2VmZmVjdC1jb21wb3Nlcic7XG5cbmNvbnN0IExlbnNGbGFyZVNoYWRlciA9IHtcblx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi8gYFxuXG4gIHVuaWZvcm0gZmxvYXQgaVRpbWU7XG4gIHVuaWZvcm0gdmVjMiBsZW5zUG9zaXRpb247XG4gIHVuaWZvcm0gdmVjMiBpUmVzb2x1dGlvbjtcbiAgdW5pZm9ybSB2ZWMzIGNvbG9yR2FpbjtcbiAgdW5pZm9ybSBmbG9hdCBzdGFyUG9pbnRzO1xuICB1bmlmb3JtIGZsb2F0IGdsYXJlU2l6ZTtcbiAgdW5pZm9ybSBmbG9hdCBmbGFyZVNpemU7XG4gIHVuaWZvcm0gZmxvYXQgZmxhcmVTcGVlZDtcbiAgdW5pZm9ybSBmbG9hdCBmbGFyZVNoYXBlO1xuICB1bmlmb3JtIGZsb2F0IGhhbG9TY2FsZTtcbiAgdW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuICB1bmlmb3JtIGJvb2wgYW5pbWF0ZWQ7XG4gIHVuaWZvcm0gYm9vbCBhbmFtb3JwaGljO1xuICB1bmlmb3JtIGJvb2wgZW5hYmxlZDtcbiAgdW5pZm9ybSBib29sIHNlY29uZGFyeUdob3N0cztcbiAgdW5pZm9ybSBib29sIHN0YXJCdXJzdDtcbiAgdW5pZm9ybSBmbG9hdCBnaG9zdFNjYWxlO1xuICB1bmlmb3JtIGJvb2wgYWRpdGlvbmFsU3RyZWFrcztcbiAgdW5pZm9ybSBzYW1wbGVyMkQgbGVuc0RpcnRUZXh0dXJlO1xuICB2ZWMyIHZ4dEM7XG5cbiAgZmxvYXQgcm5kZihmbG9hdCBuKXtyZXR1cm4gZnJhY3Qoc2luKG4pICogNDM3NTguNTQ1MzEyMyk7fWZsb2F0IG5peihmbG9hdCBwKXtmbG9hdCBmbCA9IGZsb29yKHApO2Zsb2F0IGZjID0gZnJhY3QocCk7cmV0dXJuIG1peChybmRmKGZsKSxybmRmKGZsICsgMS4wKSwgZmMpO31cbiAgdmVjMyBoc3YycmdiKHZlYzMgYyl7dmVjNCBrID0gdmVjNCgxLjAsIDIuMCAvIDMuMCwgMS4wIC8gMy4wLCAzLjApO3ZlYzMgcCA9IGFicyhmcmFjdChjLnh4eCArIGsueHl6KSAqIDYuMCAtIGsud3d3KTtyZXR1cm4gYy56ICogbWl4KGsueHh4LCBjbGFtcChwIC0gay54eHgsIDAuMCwgMS4wKSwgYy55KTt9XG4gIGZsb2F0IHNhdFUoZmxvYXQgeCl7cmV0dXJuIGNsYW1wKHgsIDAuLDEuKTt9dmVjMiBydFUodmVjMiBuYXosIGZsb2F0IHJ0bil7cmV0dXJuIHZlYzIoY29zKHJ0bikgKiBuYXoueCArIHNpbihydG4pICogbmF6LnksY29zKHJ0bikgKiBuYXoueSAtIHNpbihydG4pICogbmF6LngpO31cbiAgdmVjMyBkcndGKHZlYzIgcCwgZmxvYXQgaW50ZW5zaXR5LCBmbG9hdCBybmQsIGZsb2F0IHNwZWVkLCBpbnQgaWQpe2Zsb2F0IGZsaG9zID0gKDEuIC8gMzIuKSAqIGZsb2F0KGlkKSAqIDAuMTtmbG9hdCBsaW5ncmFkID0gZGlzdGFuY2UodmVjMigwLiksIHApO2Zsb2F0IGV4cGcgPSAxLiAvIGV4cChsaW5ncmFkICogKGZyYWN0KHJuZCkgKiAwLjY2ICsgMC4zMykpO3ZlYzMgcXpUZyA9IGhzdjJyZ2IodmVjMyggZnJhY3QoIChleHBnICogOC4pICsgc3BlZWQgKiBmbGFyZVNwZWVkICsgZmxob3MpLCBwb3coMS4tYWJzKGV4cGcqMi4tMS4pLCAwLjQ1KSwgMjAuMCAqIGV4cGcgKiBpbnRlbnNpdHkpKTtmbG9hdCBpbnRlcm5hbFN0YXJQb2ludHM7aWYoYW5hbW9ycGhpYyl7aW50ZXJuYWxTdGFyUG9pbnRzID0gMS4wO30gZWxzZXtpbnRlcm5hbFN0YXJQb2ludHMgPSBzdGFyUG9pbnRzO31mbG9hdCBhbXMgPSBsZW5ndGgocCAqIGZsYXJlU2hhcGUgKiBzaW4oaW50ZXJuYWxTdGFyUG9pbnRzICogYXRhbihwLngsIHAueSkpKTtmbG9hdCBrSmhnID0gcG93KDEuLXNhdFUoYW1zKSwgKCBhbmFtb3JwaGljID8gMTAwLiA6IDEyLikpO2tKaGcgKz0gc2F0VShleHBnLTAuOSkgKiAzLjtrSmhnID0gcG93KGtKaGcgKiBleHBnLCA4LiArICgxLi1pbnRlbnNpdHkpICogNS4pO2lmKGZsYXJlU3BlZWQgPiAwLjApe3JldHVybiB2ZWMzKGtKaGcpICogcXpUZzt9IGVsc2V7cmV0dXJuIHZlYzMoa0poZykgKiBmbGFyZVNpemUgKiAxNS47fX1cbiAgZmxvYXQgYW1zMih2ZWMzIGEsIHZlYzMgYikgeyByZXR1cm4gYWJzKGEueCAtIGIueCkgKyBhYnMoYS55IC0gYi55KSArIGFicyhhLnogLSBiLnopO312ZWMzIHNhdFUodmVjMyB4KXtyZXR1cm4gY2xhbXAoeCwgdmVjMygwLjApLCB2ZWMzKDEuMCkpO31cbiAgZmxvYXQgZ2xSKHZlYzIgbmF6LCB2ZWMyIHBvcywgZmxvYXQgenNpKXt2ZWMyIG1uaTtpZihhbmltYXRlZCl7bW5pID0gcnRVKG5hei1wb3MsIGlUaW1lICogMC4xKTt9IGVsc2V7bW5pID0gbmF6LXBvczt9ZmxvYXQgYW5nID0gYXRhbihtbmkueSwgbW5pLngpICogKGFuYW1vcnBoaWMgPyAxLjAgOiBzdGFyUG9pbnRzKTtmbG9hdCBhbXMyID0gbGVuZ3RoKG1uaSk7YW1zMiA9IHBvdyhhbXMyLCAuOSk7ZmxvYXQgZjAgPSAxLjAvKGxlbmd0aChuYXotcG9zKSooMS4wL3pzaSoxNi4wKSsuMik7cmV0dXJuIGYwK2YwKihzaW4oKGFuZykpKi4yICsuMyk7fVxuICBmbG9hdCBzZEhleCh2ZWMyIHApe3AgPSBhYnMocCk7dmVjMiBxID0gdmVjMihwLngqMi4wKjAuNTc3MzUwMywgcC55ICsgcC54KjAuNTc3MzUwMyk7cmV0dXJuIGRvdChzdGVwKHEueHkscS55eCksIDEuMC1xLnl4KTt9ZmxvYXQgZnBvdyhmbG9hdCB4LCBmbG9hdCBrKXtyZXR1cm4geCA+IGsgPyBwb3coKHgtaykvKDEuMC1rKSwyLjApIDogMC4wO31cbiAgdmVjMyBySHgodmVjMiBuYXosIHZlYzIgcCwgZmxvYXQgcywgdmVjMyBjb2wpe25heiAtPSBwO2lmIChhYnMobmF6LngpIDwgMC4yKnMgJiYgYWJzKG5hei55KSA8IDAuMipzKXtyZXR1cm4gbWl4KHZlYzMoMCksbWl4KHZlYzMoMCksY29sLDAuMSArIGZwb3cobGVuZ3RoKG5hei9zKSwwLjEpKjEwLjApLHNtb290aHN0ZXAoMC4wLDAuMSxzZEhleChuYXoqMjAuMC9zKSkpO31yZXR1cm4gdmVjMygwKTt9XG4gIHZlYzMgbUxzKHZlYzIgbmF6LCB2ZWMyIHBvcyl7dmVjMiBtbmkgPSBuYXotcG9zO3ZlYzIgenhNcCA9IG5heioobGVuZ3RoKG5heikpO2Zsb2F0IGFuZyA9IGF0YW4obW5pLngsbW5pLnkpO2Zsb2F0IGYwID0gLjMvKGxlbmd0aChuYXotcG9zKSoxNi4wKzEuMCk7ZjAgPSBmMCooc2luKG5peihzaW4oYW5nKjMuOS0oYW5pbWF0ZWQgPyBpVGltZSA6IDAuMCkgKiAwLjMpICogc3RhclBvaW50cykpKi4yICk7ZmxvYXQgZjEgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKG5heisxLjIqcG9zKSwxLjkpLC4wKSo3LjA7ZmxvYXQgZjIgPSBtYXgoLjkvKDEwLjArMzIuMCpwb3cobGVuZ3RoKHp4TXArMC45OSpwb3MpLDIuMCkpLC4wKSowLjM1O2Zsb2F0IGYyMiA9IG1heCguOS8oMTEuMCszMi4wKnBvdyhsZW5ndGgoenhNcCswLjg1KnBvcyksMi4wKSksLjApKjAuMjM7ZmxvYXQgZjIzID0gbWF4KC45LygxMi4wKzMyLjAqcG93KGxlbmd0aCh6eE1wKzAuOTUqcG9zKSwyLjApKSwuMCkqMC42O3ZlYzIgenRYID0gbWl4KG5heix6eE1wLCAwLjEpO2Zsb2F0IGY0ID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgrMC40KnBvcyksMi45KSwuMCkqNC4wMjtmbG9hdCBmNDIgPSBtYXgoMC4wLXBvdyhsZW5ndGgoenRYKzAuNDUqcG9zKSwyLjkpLC4wKSo0LjE7ZmxvYXQgZjQzID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgrMC41KnBvcyksMi45KSwuMCkqNC42O3p0WCA9IG1peChuYXosenhNcCwtLjQpO2Zsb2F0IGY1ID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgrMC4xKnBvcyksNS41KSwuMCkqMi4wO2Zsb2F0IGY1MiA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYKzAuMipwb3MpLDUuNSksLjApKjIuMDtmbG9hdCBmNTMgPSBtYXgoMC4wMS1wb3cobGVuZ3RoKHp0WCswLjEqcG9zKSw1LjUpLC4wKSoyLjA7enRYID0gbWl4KG5heix6eE1wLCAyLjEpO2Zsb2F0IGY2ID0gbWF4KDAuMDEtcG93KGxlbmd0aCh6dFgtMC4zKnBvcyksMS42MSksLjApKjMuMTU5O2Zsb2F0IGY2MiA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYLTAuMzI1KnBvcyksMS42MTQpLC4wKSozLjE0O2Zsb2F0IGY2MyA9IG1heCgwLjAxLXBvdyhsZW5ndGgoenRYLTAuMzg5KnBvcyksMS42MjMpLC4wKSozLjEyO3ZlYzMgYyA9IHZlYzMoZ2xSKG5heixwb3MsIGdsYXJlU2l6ZSkpO3ZlYzIgcHJvdDtpZihhbmltYXRlZCl7cHJvdCA9IHJ0VShuYXogLSBwb3MsIChpVGltZSAqIDAuMSkpO30gZWxzZSBpZihhbmFtb3JwaGljKXtwcm90ID0gcnRVKG5heiAtIHBvcywgMS41NzA3OTYpO30gZWxzZSB7cHJvdCA9IG5heiAtIHBvczt9YyArPSBkcndGKHByb3QsIChhbmFtb3JwaGljID8gZmxhcmVTaXplICogMTAuIDogZmxhcmVTaXplKSwgMC4xLCBpVGltZSwgMSk7Yy5yKz1mMStmMitmNCtmNStmNjsgYy5nKz1mMStmMjIrZjQyK2Y1MitmNjI7IGMuYis9ZjErZjIzK2Y0MytmNTMrZjYzO2MgPSBjKjEuMyAqIHZlYzMobGVuZ3RoKHp4TXApKy4wOSk7Yys9dmVjMyhmMCk7cmV0dXJuIGM7fVxuICB2ZWMzIGNjKHZlYzMgY2xyLCBmbG9hdCBmY3QsZmxvYXQgZmN0Mil7ZmxvYXQgdyA9IGNsci54K2Nsci55K2Nsci56O3JldHVybiBtaXgoY2xyLHZlYzModykqZmN0LHcqZmN0Mik7fWZsb2F0IHJuZCh2ZWMyIHApe2Zsb2F0IGYgPSBmcmFjdChzaW4oZG90KHAsIHZlYzIoMTIuMTIzNCwgNzIuODM5MikgKSo0NTEyMy4yKSk7cmV0dXJuIGY7fWZsb2F0IHJuZChmbG9hdCB3KXtmbG9hdCBmID0gZnJhY3Qoc2luKHcpKjEwMDAuKTtyZXR1cm4gZjt9XG4gIGZsb2F0IHJTaHAodmVjMiBwLCBpbnQgTil7ZmxvYXQgZjtmbG9hdCBhPWF0YW4ocC54LHAueSkrLjI7ZmxvYXQgYj02LjI4MzE5L2Zsb2F0KE4pO2Y9c21vb3Roc3RlcCguNSwuNTEsIGNvcyhmbG9vciguNSthL2IpKmItYSkqbGVuZ3RoKHAueHkpKiAyLjAgIC1naG9zdFNjYWxlKTtyZXR1cm4gZjt9XG4gIHZlYzMgZHJDKHZlYzIgcCwgZmxvYXQgenNpLCBmbG9hdCBkQ3ksIHZlYzMgY2xyLCB2ZWMzIGNscjIsIGZsb2F0IGFtczIsIHZlYzIgZXNvbSl7ZmxvYXQgbCA9IGxlbmd0aChwICsgZXNvbSooYW1zMioyLikpK3pzaS8yLjtmbG9hdCBsMiA9IGxlbmd0aChwICsgZXNvbSooYW1zMio0LikpK3pzaS8zLjtmbG9hdCBjID0gbWF4KDAuMDEtcG93KGxlbmd0aChwICsgZXNvbSphbXMyKSwgenNpKmdob3N0U2NhbGUpLCAwLjApKjEwLjtmbG9hdCBjMSA9IG1heCgwLjAwMS1wb3cobC0wLjMsIDEuLzQwLikrc2luKGwqMjAuKSwgMC4wKSozLjtmbG9hdCBjMiA9ICBtYXgoMC4wOS9wb3cobGVuZ3RoKHAtZXNvbSphbXMyLy41KSoxLiwgLjk1KSwgMC4wKS8yMC47ZmxvYXQgcyA9IG1heCgwLjAyLXBvdyhyU2hwKHAqNS4gKyBlc29tKmFtczIqNS4gKyBkQ3ksIDYpICwgMS4pLCAwLjApKjEuNTtjbHIgPSBjb3ModmVjMygwLjQ0LCAuMjQsIC4yKSo4LiArIGFtczIqNC4pKjAuNSsuNTt2ZWMzIGYgPSBjKmNscjtmICs9IGMxKmNscjtmICs9IGMyKmNscjtmICs9ICBzKmNscjtyZXR1cm4gZi0wLjAxO31cbiAgdmVjNCBnZUxDKGZsb2F0IHgpe3JldHVybiB2ZWM0KHZlYzMobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgobWl4KG1peChtaXgodmVjMygwLiwgMC4sIDAuKSx2ZWMzKDAuLCAwLiwgMC4pLCBzbW9vdGhzdGVwKDAuMCwgMC4wNjMsIHgpKSx2ZWMzKDAuLCAwLiwgMC4pLCBzbW9vdGhzdGVwKDAuMDYzLCAwLjEyNSwgeCkpLHZlYzMoMC4wLCAwLiwgMC4pLCBzbW9vdGhzdGVwKDAuMTI1LCAwLjE4OCwgeCkpLHZlYzMoMC4xODgsIDAuMTMxLCAwLjExNiksIHNtb290aHN0ZXAoMC4xODgsIDAuMjI3LCB4KSksdmVjMygwLjMxLCAwLjIwNCwgMC41MzcpLCBzbW9vdGhzdGVwKDAuMjI3LCAwLjI1MSwgeCkpLHZlYzMoMC4xOTIsIDAuMTA2LCAwLjI4NiksIHNtb290aHN0ZXAoMC4yNTEsIDAuMzE0LCB4KSksdmVjMygwLjEwMiwgMC4wMDgsIDAuMzQxKSwgc21vb3Roc3RlcCgwLjMxNCwgMC4zOTIsIHgpKSx2ZWMzKDAuMDg2LCAwLjAsIDAuMTQxKSwgc21vb3Roc3RlcCgwLjM5MiwgMC41MDIsIHgpKSx2ZWMzKDEuMCwgMC4zMSwgMC4wKSwgc21vb3Roc3RlcCgwLjUwMiwgMC42MDQsIHgpKSx2ZWMzKC4xLCAwLjEsIDAuMSksIHNtb290aHN0ZXAoMC42MDQsIDAuNjQzLCB4KSksdmVjMygxLjAsIDAuOTI5LCAwLjApLCBzbW9vdGhzdGVwKDAuNjQzLCAwLjc2MSwgeCkpLHZlYzMoMS4wLCAwLjA4NiwgMC40MjQpLCBzbW9vdGhzdGVwKDAuNzYxLCAwLjg0NywgeCkpLHZlYzMoMS4wLCAwLjQ5LCAwLjApLCBzbW9vdGhzdGVwKDAuODQ3LCAwLjg5LCB4KSksdmVjMygwLjk0NSwgMC4yNzUsIDAuNDc1KSwgc21vb3Roc3RlcCgwLjg5LCAwLjk0MSwgeCkpLHZlYzMoMC4yNTEsIDAuMjc1LCAwLjc5NiksIHNtb290aHN0ZXAoMC45NDEsIDEuMCwgeCkpKSwxLjApO31cbiAgZmxvYXQgZGlUTih2ZWMyIHApe3ZlYzIgZiA9IGZyYWN0KHApO2YgPSAoZiAqIGYpICogKDMuMCAtICgyLjAgKiBmKSk7ZmxvYXQgbiA9IGRvdChmbG9vcihwKSwgdmVjMigxLjAsIDE1Ny4wKSk7dmVjNCBhID0gZnJhY3Qoc2luKHZlYzQobiArIDAuMCwgbiArIDEuMCwgbiArIDE1Ny4wLCBuICsgMTU4LjApKSAqIDQzNzU4LjU0NTMxMjMpO3JldHVybiBtaXgobWl4KGEueCwgYS55LCBmLngpLCBtaXgoYS56LCBhLncsIGYueCksIGYueSk7fVxuICBmbG9hdCBmYm0odmVjMiBwKXtjb25zdCBtYXQyIG0gPSBtYXQyKDAuODAsIC0wLjYwLCAwLjYwLCAwLjgwKTtmbG9hdCBmID0gMC4wO2YgKz0gMC41MDAwKmRpVE4ocCk7IHAgPSBtKnAqMi4wMjtmICs9IDAuMjUwMCpkaVROKHApOyBwID0gbSpwKjIuMDM7ZiArPSAwLjEyNTAqZGlUTihwKTsgcCA9IG0qcCoyLjAxO2YgKz0gMC4wNjI1KmRpVE4ocCk7cmV0dXJuIGYvMC45Mzc1O31cbiAgdmVjNCBnZUxTKHZlYzIgcCl7dmVjMiBwcCA9IChwIC0gdmVjMigwLjUpKSAqIDIuMDtmbG9hdCBhID0gYXRhbihwcC55LCBwcC54KTt2ZWM0IGNwID0gdmVjNChzaW4oYSAqIDEuMCksIGxlbmd0aChwcCksIHNpbihhICogMTMuMCksIHNpbihhICogNTMuMCkpO2Zsb2F0IGQgPSBzaW4oY2xhbXAocG93KGxlbmd0aCh2ZWMyKDAuNSkgLSBwKSAqIDAuNSArIGhhbG9TY2FsZSAvMi4sIDUuMCksIDAuMCwgMS4wKSAqIDMuMTQxNTkpO3ZlYzMgYyA9IHZlYzMoZCkgKiB2ZWMzKGZibShjcC54eSAqIDE2LjApICogZmJtKGNwLnp3ICogOS4wKSAqIG1heChtYXgobWF4KG1heCgwLjUsIHNpbihhICogMS4wKSksIHNpbihhICogMy4wKSAqIDAuOCksIHNpbihhICogNy4wKSAqIDAuOCksIHNpbihhICogOS4wKSAqIDEwLjYpKTtjICo9IHZlYzMobWl4KDIuMCwgKHNpbihsZW5ndGgocHAueHkpICogMjU2LjApICogMC41KSArIDAuNSwgc2luKChjbGFtcCgobGVuZ3RoKHBwLnh5KSAtIDAuODc1KSAvIDAuMSwgMC4wLCAxLjApICsgMC4wKSAqIDIuMCAqIDMuMTQxNTkpICogMS41KSArIDAuNSkgKiAwLjMyNzU7cmV0dXJuIHZlYzQodmVjMyhjICogMS4wKSwgZCk7fVxuICB2ZWM0IGdlTEQodmVjMiBwKXtwLnh5ICs9IHZlYzIoZmJtKHAueXggKiAzLjApLCBmYm0ocC55eCAqIDIuMCkpICogMC4wODI1O3ZlYzMgbyA9IHZlYzMobWl4KDAuMTI1LCAwLjI1LCBtYXgobWF4KHNtb290aHN0ZXAoMC4xLCAwLjAsIGxlbmd0aChwIC0gdmVjMigwLjI1KSkpLHNtb290aHN0ZXAoMC40LCAwLjAsIGxlbmd0aChwIC0gdmVjMigwLjc1KSkpKSxzbW9vdGhzdGVwKDAuOCwgMC4wLCBsZW5ndGgocCAtIHZlYzIoMC44NzUsIDAuMTI1KSkpKSkpO28gKz0gdmVjMyhtYXgoZmJtKHAgKiAxLjApIC0gMC41LCAwLjApKSAqIDAuNTtvICs9IHZlYzMobWF4KGZibShwICogMi4wKSAtIDAuNSwgMC4wKSkgKiAwLjU7byArPSB2ZWMzKG1heChmYm0ocCAqIDQuMCkgLSAwLjUsIDAuMCkpICogMC4yNTtvICs9IHZlYzMobWF4KGZibShwICogOC4wKSAtIDAuNzUsIDAuMCkpICogMS4wO28gKz0gdmVjMyhtYXgoZmJtKHAgKiAxNi4wKSAtIDAuNzUsIDAuMCkpICogMC43NTtvICs9IHZlYzMobWF4KGZibShwICogNjQuMCkgLSAwLjc1LCAwLjApKSAqIDAuNTtyZXR1cm4gdmVjNChjbGFtcChvLCB2ZWMzKDAuMTUpLCB2ZWMzKDEuMCkpLCAxLjApO31cbiAgdmVjNCB0eEwoc2FtcGxlcjJEIHRleCwgdmVjMiB4dEMpe2lmKCgoeHRDLnggPCAwLikgfHwgKHh0Qy55IDwgMC4pKSB8fCAoKHh0Qy54ID4gMS4pIHx8ICh4dEMueSA+IDEuKSkpe3JldHVybiB2ZWM0KDAuMCk7fWVsc2V7cmV0dXJuIHRleHR1cmUodGV4LCB4dEMpOyB9fVxuICB2ZWM0IHR4RChzYW1wbGVyMkQgdGV4LCB2ZWMyIHh0QywgdmVjMiBkaXIsIHZlYzMgZGl0bikge3JldHVybiB2ZWM0KHR4TCh0ZXgsICh4dEMgKyAoZGlyICogZGl0bi5yKSkpLnIsdHhMKHRleCwgKHh0QyArIChkaXIgKiBkaXRuLmcpKSkuZyx0eEwodGV4LCAoeHRDICsgKGRpciAqIGRpdG4uYikpKS5iLDEuMCk7fVxuICB2ZWM0IHN0ckIoKXt2ZWMyIGFzcFh0YyA9IHZlYzIoMS4wKSAtICgoKHZ4dEMgLSB2ZWMyKDAuNSkpICogdmVjMigxLjApKSArIHZlYzIoMC41KSk7IHZlYzIgeHRDID0gdmVjMigxLjApIC0gdnh0QzsgdmVjMiBnaHZjID0gKHZlYzIoMC41KSAtIHh0QykgKiAwLjMgLSBsZW5zUG9zaXRpb247IHZlYzIgZ2hObSA9IG5vcm1hbGl6ZShnaHZjICogdmVjMigxLjApKSAqIHZlYzIoMS4wKTt2ZWMyIGhhbG9WZWMgPSBub3JtYWxpemUoZ2h2YykgKiAwLjY7dmVjMiBobE5tID0gZ2hObSAqIDAuNjt2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoMS4wKSAvIHZlYzIoaVJlc29sdXRpb24ueHkpO3ZlYzMgZGl0biA9IHZlYzMoLSh0ZXhlbFNpemUueCAqIDEuNSksIDAuMiwgdGV4ZWxTaXplLnggKiAxLjUpO3ZlYzQgYyA9IHZlYzQoMC4wKTtmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykge3ZlYzIgb2Zmc2V0ID0geHRDICsgKGdodmMgKiBmbG9hdChpKSk7YyArPSB0eEQobGVuc0RpcnRUZXh0dXJlLCBvZmZzZXQsIGdoTm0sIGRpdG4pICogcG93KG1heCgwLjAsIDEuMCAtIChsZW5ndGgodmVjMigwLjUpIC0gb2Zmc2V0KSAvIGxlbmd0aCh2ZWMyKDAuNSkpKSksIDEwLjApO312ZWMyIHV5VHJ6ID0geHRDICsgaGxObTsgcmV0dXJuIChjICogZ2VMQygobGVuZ3RoKHZlYzIoMC41KSAtIGFzcFh0YykgLyBsZW5ndGgodmVjMihoYWxvU2NhbGUpKSkpKSArKHR4RChsZW5zRGlydFRleHR1cmUsIHV5VHJ6LCBnaE5tLCBkaXRuKSAqIHBvdyhtYXgoMC4wLCAxLjAgLSAobGVuZ3RoKHZlYzIoMC41KSAtIHV5VHJ6KSAvIGxlbmd0aCh2ZWMyKDAuNSkpKSksIDEwLjApKTt9XG4gIHZvaWQgbWFpbkltYWdlKHZlYzQgdix2ZWMyIHIsb3V0IHZlYzQgaSl7dmVjMiBnPXItLjU7Zy55Kj1pUmVzb2x1dGlvbi55L2lSZXNvbHV0aW9uLng7dmVjMiBsPWxlbnNQb3NpdGlvbiouNTtsLnkqPWlSZXNvbHV0aW9uLnkvaVJlc29sdXRpb24ueDt2ZWMzIGY9bUxzKGcsbCkqMjAuKmNvbG9yR2Fpbi8yNTYuO2lmKGFkaXRpb25hbFN0cmVha3Mpe3ZlYzMgbz12ZWMzKC45LC4yLC4xKSxwPXZlYzMoLjMsLjEsLjkpO2ZvcihmbG9hdCBuPTAuO248MTAuO24rKylmKz1kckMoZyxwb3cocm5kKG4qMmUzKSoyLjgsLjEpKzEuNDEsMC4sbytuLHArbixybmQobioyMC4pKjMuKy4yLS41LGxlbnNQb3NpdGlvbik7fWlmKHNlY29uZGFyeUdob3N0cyl7dmVjMyBuPXZlYzMoMCk7bis9ckh4KGcsLWxlbnNQb3NpdGlvbiouMjUsZ2hvc3RTY2FsZSoxLjQsdmVjMyguMjUsLjM1LDApKTtuKz1ySHgoZyxsZW5zUG9zaXRpb24qLjI1LGdob3N0U2NhbGUqLjUsdmVjMygxLC41LC41KSk7bis9ckh4KGcsbGVuc1Bvc2l0aW9uKi4xLGdob3N0U2NhbGUqMS42LHZlYzMoMSkpO24rPXJIeChnLGxlbnNQb3NpdGlvbioxLjgsZ2hvc3RTY2FsZSoyLix2ZWMzKDAsLjUsLjc1KSk7bis9ckh4KGcsbGVuc1Bvc2l0aW9uKjEuMjUsZ2hvc3RTY2FsZSouOCx2ZWMzKDEsMSwuNSkpO24rPXJIeChnLC1sZW5zUG9zaXRpb24qMS4yNSxnaG9zdFNjYWxlKjUuLHZlYzMoLjUsLjUsLjI1KSk7bis9ZnBvdygxLi1hYnMoZGlzdGFuY2UobGVuc1Bvc2l0aW9uKi44LGcpLS43KSwuOTg1KSpjb2xvckdhaW4vMjEwMC47Zis9bjt9aWYoc3RhckJ1cnN0KXt2eHRDPWcrLjU7dmVjNCBuPWdlTEQoZyk7ZmxvYXQgbz0xLi1jbGFtcCgwLjUsMC4sLjUpKjIuO24rPW1peChuLHBvdyhuKjIuLHZlYzQoMikpKi41LG8pO2Zsb2F0IHM9KGcueCtnLnkpKigxLi82Lik7dmVjMiBkPW1hdDIoY29zKHMpLC1zaW4ocyksc2luKHMpLGNvcyhzKSkqdnh0QztuKz1nZUxTKGQpKjIuO2YrPWNsYW1wKG4ueHl6KnN0ckIoKS54eXosLjAxLDEuKTt9aT1lbmFibGVkP3ZlYzQobWl4KGYsdmVjMygwKSxvcGFjaXR5KSt2Lnh5eix2LncpOnZlYzQodik7fVxuYCxcbn07XG5cbmV4cG9ydCBjbGFzcyBMZW5zRmxhcmVFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuXHRjb25zdHJ1Y3Rvcih7XG5cdFx0YmxlbmRGdW5jdGlvbiA9IEJsZW5kRnVuY3Rpb24uTk9STUFMLFxuXHRcdGVuYWJsZWQgPSB0cnVlLFxuXHRcdGdsYXJlU2l6ZSA9IDAuMixcblx0XHRsZW5zUG9zaXRpb24gPSBbMC4wMSwgMC4wMV0sXG5cdFx0aVJlc29sdXRpb24gPSBbMCwgMF0sXG5cdFx0c3RhclBvaW50cyA9IDYsXG5cdFx0ZmxhcmVTaXplID0gMC4wMSxcblx0XHRmbGFyZVNwZWVkID0gMC4wMSxcblx0XHRmbGFyZVNoYXBlID0gMC4wMSxcblx0XHRhbmltYXRlZCA9IHRydWUsXG5cdFx0YW5hbW9ycGhpYyA9IGZhbHNlLFxuXHRcdGNvbG9yR2FpbiA9IG5ldyBDb2xvcigyMCwgMjAsIDIwKSxcblx0XHRsZW5zRGlydFRleHR1cmUgPSBudWxsIGFzIFRleHR1cmUgfCBudWxsLFxuXHRcdGhhbG9TY2FsZSA9IDAuNSxcblx0XHRzZWNvbmRhcnlHaG9zdHMgPSB0cnVlLFxuXHRcdGFkaXRpb25hbFN0cmVha3MgPSB0cnVlLFxuXHRcdGdob3N0U2NhbGUgPSAwLjAsXG5cdFx0b3BhY2l0eSA9IDEuMCxcblx0XHRzdGFyQnVyc3QgPSBmYWxzZSxcblx0fSA9IHt9KSB7XG5cdFx0c3VwZXIoJ0xlbnNGbGFyZUVmZmVjdCcsIExlbnNGbGFyZVNoYWRlci5mcmFnbWVudFNoYWRlciwge1xuXHRcdFx0YmxlbmRGdW5jdGlvbixcblx0XHRcdHVuaWZvcm1zOiBuZXcgTWFwPHN0cmluZywgVW5pZm9ybT4oW1xuXHRcdFx0XHRbJ2VuYWJsZWQnLCBuZXcgVW5pZm9ybShlbmFibGVkKV0sXG5cdFx0XHRcdFsnZ2xhcmVTaXplJywgbmV3IFVuaWZvcm0oZ2xhcmVTaXplKV0sXG5cdFx0XHRcdFsnbGVuc1Bvc2l0aW9uJywgbmV3IFVuaWZvcm0obGVuc1Bvc2l0aW9uKV0sXG5cdFx0XHRcdFsnaVRpbWUnLCBuZXcgVW5pZm9ybSgwKV0sXG5cdFx0XHRcdFsnaVJlc29sdXRpb24nLCBuZXcgVW5pZm9ybShpUmVzb2x1dGlvbildLFxuXHRcdFx0XHRbJ3N0YXJQb2ludHMnLCBuZXcgVW5pZm9ybShzdGFyUG9pbnRzKV0sXG5cdFx0XHRcdFsnZmxhcmVTaXplJywgbmV3IFVuaWZvcm0oZmxhcmVTaXplKV0sXG5cdFx0XHRcdFsnZmxhcmVTcGVlZCcsIG5ldyBVbmlmb3JtKGZsYXJlU3BlZWQpXSxcblx0XHRcdFx0WydmbGFyZVNoYXBlJywgbmV3IFVuaWZvcm0oZmxhcmVTaGFwZSldLFxuXHRcdFx0XHRbJ2FuaW1hdGVkJywgbmV3IFVuaWZvcm0oYW5pbWF0ZWQpXSxcblx0XHRcdFx0WydhbmFtb3JwaGljJywgbmV3IFVuaWZvcm0oYW5hbW9ycGhpYyldLFxuXHRcdFx0XHRbJ2NvbG9yR2FpbicsIG5ldyBVbmlmb3JtKGNvbG9yR2FpbildLFxuXHRcdFx0XHRbJ2xlbnNEaXJ0VGV4dHVyZScsIG5ldyBVbmlmb3JtKGxlbnNEaXJ0VGV4dHVyZSldLFxuXHRcdFx0XHRbJ2hhbG9TY2FsZScsIG5ldyBVbmlmb3JtKGhhbG9TY2FsZSldLFxuXHRcdFx0XHRbJ3NlY29uZGFyeUdob3N0cycsIG5ldyBVbmlmb3JtKHNlY29uZGFyeUdob3N0cyldLFxuXHRcdFx0XHRbJ2FkaXRpb25hbFN0cmVha3MnLCBuZXcgVW5pZm9ybShhZGl0aW9uYWxTdHJlYWtzKV0sXG5cdFx0XHRcdFsnZ2hvc3RTY2FsZScsIG5ldyBVbmlmb3JtKGdob3N0U2NhbGUpXSxcblx0XHRcdFx0WydzdGFyQnVyc3QnLCBuZXcgVW5pZm9ybShzdGFyQnVyc3QpXSxcblx0XHRcdFx0WydvcGFjaXR5JywgbmV3IFVuaWZvcm0ob3BhY2l0eSldLFxuXHRcdFx0XSksXG5cdFx0fSk7XG5cdH1cblxuXHRvdmVycmlkZSB1cGRhdGUoX3JlbmRlcmVyOiBhbnksIF9pbnB1dEJ1ZmZlcjogYW55LCBkZWx0YVRpbWU6IG51bWJlcikge1xuXHRcdGNvbnN0IGlUaW1lID0gdGhpcy51bmlmb3Jtcy5nZXQoJ2lUaW1lJyk7XG5cdFx0aWYgKGlUaW1lKSB7XG5cdFx0XHRpVGltZS52YWx1ZSArPSBkZWx0YVRpbWU7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCB0eXBlIExlbnNGbGFyZU9wdGlvbnMgPSBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIExlbnNGbGFyZUVmZmVjdD5bMF0gJiB7XG5cdHBvc2l0aW9uOiBWZWN0b3IzO1xuXHRmb2xsb3dNb3VzZTogYm9vbGVhbjtcblx0c21vb3RoVGltZTogbnVtYmVyO1xufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IExlbnNGbGFyZU9wdGlvbnMgPSB7XG5cdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygtMjUsIDYsIC02MCksXG5cdGZvbGxvd01vdXNlOiBmYWxzZSxcblx0c21vb3RoVGltZTogMC43LFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1sZW5zLWZsYXJlJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LXByaW1pdGl2ZSAqYXJncz1cIltlZmZlY3QoKV1cIiBbZGlzcG9zZV09XCJudWxsXCIgLz5cblx0YCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RwTGVuc0ZsYXJlIHtcblx0YXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0c3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHR2aWV3cG9ydCA9IHRoaXMuc3RvcmUuc2VsZWN0KCd2aWV3cG9ydCcpO1xuXHRyYXljYXN0ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncmF5Y2FzdGVyJyk7XG5cdHBvaW50ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncG9pbnRlcicpO1xuXG5cdGNvbXBvc2VyQXBpID0gaW5qZWN0RWZmZWN0Q29tcG9zZXJBcGkoKTtcblxuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJvamVjdGVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRtb3VzZTJkID0gbmV3IFZlY3RvcjIoKTtcblxuXHRlZmZlY3QgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgeyBwb3NpdGlvbjogXywgZm9sbG93TW91c2U6IF9fLCBzbW9vdGhUaW1lOiBfX18sIC4uLm9wdGlvbnMgfSA9IHRoaXMub3B0aW9ucygpO1xuXHRcdHJldHVybiBuZXcgTGVuc0ZsYXJlRWZmZWN0KG9wdGlvbnMpO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW2VmZmVjdCwgdmlld3BvcnRdID0gW3RoaXMuZWZmZWN0KCksIHRoaXMudmlld3BvcnQoKV07XG5cdFx0XHRcdGNvbnN0IGlSZXNvbHV0aW9uID0gZWZmZWN0LnVuaWZvcm1zLmdldCgnaVJlc29sdXRpb24nKTtcblx0XHRcdFx0aWYgKGlSZXNvbHV0aW9uKSB7XG5cdFx0XHRcdFx0aVJlc29sdXRpb24udmFsdWUueCA9IHZpZXdwb3J0LndpZHRoO1xuXHRcdFx0XHRcdGlSZXNvbHV0aW9uLnZhbHVlLnkgPSB2aWV3cG9ydC5oZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdGNvbnN0IFtlZmZlY3RdID0gW3RoaXMuZWZmZWN0KCldO1xuXHRcdFx0aWYgKCFlZmZlY3QpIHJldHVybjtcblxuXHRcdFx0Y29uc3QgW3sgZm9sbG93TW91c2UsIHBvc2l0aW9uLCBzbW9vdGhUaW1lIH0sIHBvaW50ZXIsIHsgY2FtZXJhLCBzY2VuZSB9LCByYXljYXN0ZXJdID0gW1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5wb2ludGVyKCksXG5cdFx0XHRcdHRoaXMuY29tcG9zZXJBcGkoKSxcblx0XHRcdFx0dGhpcy5yYXljYXN0ZXIoKSxcblx0XHRcdF07XG5cblx0XHRcdGNvbnN0IHVMZW5zUG9zaXRpb24gPSBlZmZlY3QudW5pZm9ybXMuZ2V0KCdsZW5zUG9zaXRpb24nKTtcblx0XHRcdGNvbnN0IHVPcGFjaXR5ID0gZWZmZWN0LnVuaWZvcm1zLmdldCgnb3BhY2l0eScpO1xuXHRcdFx0aWYgKCF1TGVuc1Bvc2l0aW9uIHx8ICF1T3BhY2l0eSkgcmV0dXJuO1xuXG5cdFx0XHRsZXQgdGFyZ2V0ID0gMTtcblxuXHRcdFx0aWYgKGZvbGxvd01vdXNlKSB7XG5cdFx0XHRcdHVMZW5zUG9zaXRpb24udmFsdWUueCA9IHBvaW50ZXIueDtcblx0XHRcdFx0dUxlbnNQb3NpdGlvbi52YWx1ZS55ID0gcG9pbnRlci55O1xuXHRcdFx0XHR0YXJnZXQgPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi5jb3B5KHBvc2l0aW9uKS5wcm9qZWN0KGNhbWVyYSk7XG5cdFx0XHRcdGlmICh0aGlzLnByb2plY3RlZFBvc2l0aW9uLnogPiAxKSByZXR1cm47XG5cblx0XHRcdFx0dUxlbnNQb3NpdGlvbi52YWx1ZS54ID0gdGhpcy5wcm9qZWN0ZWRQb3NpdGlvbi54O1xuXHRcdFx0XHR1TGVuc1Bvc2l0aW9uLnZhbHVlLnkgPSB0aGlzLnByb2plY3RlZFBvc2l0aW9uLnk7XG5cblx0XHRcdFx0dGhpcy5tb3VzZTJkLnNldCh0aGlzLnByb2plY3RlZFBvc2l0aW9uLngsIHRoaXMucHJvamVjdGVkUG9zaXRpb24ueSk7XG5cdFx0XHRcdHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UyZCwgY2FtZXJhKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0cyA9IHJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHNjZW5lLmNoaWxkcmVuLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgeyBvYmplY3QgfSA9IGludGVyc2VjdHNbMF0gPz8ge307XG5cdFx0XHRcdGlmIChvYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob2JqZWN0LnVzZXJEYXRhPy5bJ2xlbnNmbGFyZSddID09PSAnbm8tb2NjbHVzaW9uJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gMDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1lc2gpIHtcblx0XHRcdFx0XHRcdGlmIChvYmplY3QubWF0ZXJpYWwudW5pZm9ybXM/Ll90cmFuc21pc3Npb24/LnZhbHVlID4gMC4yKSB7XG5cdFx0XHRcdFx0XHRcdC8vQ2hlY2sgZm9yIE1lc2hUcmFuc21pc3Npb25NYXRlcmlhbFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQgPSAwLjI7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9iamVjdC5tYXRlcmlhbC5fdHJhbnNtaXNzaW9uICYmIG9iamVjdC5tYXRlcmlhbC5fdHJhbnNtaXNzaW9uID4gMC4yKSB7XG5cdFx0XHRcdFx0XHRcdC8vQ2hlY2sgZm9yIE1lc2hQaHlzaWNhbE1hdGVyaWFsIHdpdGggdHJhbnNtaXNzaW9uIHNldHRpbmdcblx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gMC4yO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvYmplY3QubWF0ZXJpYWwudHJhbnNwYXJlbnQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIE90aGVyTWF0ZXJpYWxzIHdpdGggdHJhbnNwYXJlbnQgcGFyYW1ldGVyXG5cdFx0XHRcdFx0XHRcdHRhcmdldCA9IG9iamVjdC5tYXRlcmlhbC5vcGFjaXR5O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRlYXNpbmcuZGFtcCh1T3BhY2l0eSwgJ3ZhbHVlJywgdGFyZ2V0LCBzbW9vdGhUaW1lLCBkZWx0YSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,50 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, afterNextRender, computed, input, } from '@angular/core';
2
+ import { NgtArgs, injectStore, pick } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { LUT3DEffect } from 'postprocessing';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtpLUT {
7
+ constructor() {
8
+ this.autoEffect = injectAutoEffect();
9
+ this.store = injectStore();
10
+ this.invalidate = this.store.select('invalidate');
11
+ this.options = input({});
12
+ this.lut = pick(this.options, 'lut');
13
+ this.effect = computed(() => {
14
+ const [lut, { lut: _, ...options }] = [this.lut(), this.options()];
15
+ return new LUT3DEffect(lut, options);
16
+ });
17
+ afterNextRender(() => {
18
+ this.autoEffect(() => {
19
+ const [effect, { lut, tetrahedralInterpolation }, invalidate] = [
20
+ this.effect(),
21
+ this.options(),
22
+ this.invalidate(),
23
+ ];
24
+ if (tetrahedralInterpolation)
25
+ effect.tetrahedralInterpolation = tetrahedralInterpolation;
26
+ if (lut)
27
+ effect.lut = lut;
28
+ invalidate();
29
+ });
30
+ });
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLUT, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.6", type: NgtpLUT, isStandalone: true, selector: "ngtp-lut", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
34
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
35
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgtpLUT, decorators: [{
38
+ type: Component,
39
+ args: [{
40
+ selector: 'ngtp-lut',
41
+ template: `
42
+ <ngt-primitive *args="[effect()]" [dispose]="null" />
43
+ `,
44
+ imports: [NgtArgs],
45
+ standalone: true,
46
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
47
+ changeDetection: ChangeDetectionStrategy.OnPush,
48
+ }]
49
+ }], ctorParameters: () => [] });
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvbGliL2VmZmVjdHMvbHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLEtBQUssR0FDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFtQjVELE1BQU0sT0FBTyxPQUFPO0lBYW5CO1FBWkEsZUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDaEMsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3QyxZQUFPLEdBQUcsS0FBSyxDQUFDLEVBQWdCLENBQUMsQ0FBQztRQUNsQyxRQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFaEMsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBR0YsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDcEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxHQUFHO29CQUMvRCxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNiLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRTtpQkFDakIsQ0FBQztnQkFFRixJQUFJLHdCQUF3QjtvQkFBRSxNQUFNLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUM7Z0JBQ3pGLElBQUksR0FBRztvQkFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0EzQlcsT0FBTztrR0FBUCxPQUFPLDhNQVJUOztFQUVULDREQUNTLE9BQU87OzJGQUtMLE9BQU87a0JBVm5CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgaW5qZWN0U3RvcmUsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IEJsZW5kRnVuY3Rpb24sIExVVDNERWZmZWN0IH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBMVVRPcHRpb25zIHtcblx0bHV0OiBUZXh0dXJlO1xuXHRibGVuZEZ1bmN0aW9uPzogQmxlbmRGdW5jdGlvbjtcblx0dGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uPzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cC1sdXQnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2VmZmVjdCgpXVwiIFtkaXNwb3NlXT1cIm51bGxcIiAvPlxuXHRgLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBMVVQge1xuXHRhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dCh7fSBhcyBMVVRPcHRpb25zKTtcblx0bHV0ID0gcGljayh0aGlzLm9wdGlvbnMsICdsdXQnKTtcblxuXHRlZmZlY3QgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW2x1dCwgeyBsdXQ6IF8sIC4uLm9wdGlvbnMgfV0gPSBbdGhpcy5sdXQoKSwgdGhpcy5vcHRpb25zKCldO1xuXHRcdHJldHVybiBuZXcgTFVUM0RFZmZlY3QobHV0LCBvcHRpb25zKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IFtlZmZlY3QsIHsgbHV0LCB0ZXRyYWhlZHJhbEludGVycG9sYXRpb24gfSwgaW52YWxpZGF0ZV0gPSBbXG5cdFx0XHRcdFx0dGhpcy5lZmZlY3QoKSxcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRcdFx0XTtcblxuXHRcdFx0XHRpZiAodGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uKSBlZmZlY3QudGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uID0gdGV0cmFoZWRyYWxJbnRlcnBvbGF0aW9uO1xuXHRcdFx0XHRpZiAobHV0KSBlZmZlY3QubHV0ID0gbHV0O1xuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19