@emasoft/svg-matrix 1.3.0 → 1.3.1

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.
package/bin/svgfonts.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  statSync,
22
22
  realpathSync,
23
23
  } from "fs";
24
- import { join, dirname, basename, extname, resolve, isAbsolute } from "path";
24
+ import { join, basename, extname, resolve, isAbsolute } from "path";
25
25
  import { createInterface } from "readline";
26
26
 
27
27
  // Import library modules
@@ -84,8 +84,11 @@ const DEFAULT_CONFIG = {
84
84
  // Embed options
85
85
  subset: true,
86
86
  full: false,
87
+ woff2: false,
87
88
  source: null, // 'google' | 'local' | 'fontget' | 'fnt'
88
89
  timeout: CONSTANTS.DEFAULT_TIMEOUT,
90
+ useCache: true,
91
+ searchAlternatives: false,
89
92
  // Replace options
90
93
  mapFile: null,
91
94
  autoDownload: true,
@@ -94,6 +97,13 @@ const DEFAULT_CONFIG = {
94
97
  restoreLinks: false,
95
98
  // Template options
96
99
  templateOutput: null,
100
+ // Cache options
101
+ cacheAction: "stats", // 'stats' | 'clean' | 'list'
102
+ maxAge: 30, // days
103
+ // Search options
104
+ query: null,
105
+ limit: 10,
106
+ threshold: 0.3,
97
107
  };
98
108
 
99
109
  let config = { ...DEFAULT_CONFIG };
@@ -139,6 +149,9 @@ ${colors.cyan}COMMANDS:${colors.reset}
139
149
  list List fonts in SVG
140
150
  interactive Interactive font management mode
141
151
  template Generate replacement map template
152
+ cache Manage font cache (stats, clean)
153
+ search Search for fonts by name with similarity matching
154
+ dedupe Detect and merge duplicate @font-face rules
142
155
 
143
156
  ${colors.cyan}GLOBAL OPTIONS:${colors.reset}
144
157
  -i, --input <file> Input SVG file(s)
@@ -156,8 +169,11 @@ ${colors.cyan}GLOBAL OPTIONS:${colors.reset}
156
169
  ${colors.cyan}EMBED OPTIONS:${colors.reset}
157
170
  --subset Only embed glyphs used in SVG (default)
158
171
  --full Embed complete font files
172
+ --woff2 Convert fonts to WOFF2 format (~30% smaller)
159
173
  --source <name> Preferred font source (google|local|fontget|fnt)
160
174
  --timeout <ms> Download timeout (default: 30000)
175
+ --no-cache Disable font caching (enabled by default)
176
+ --search-alternatives If font unavailable, search for alternatives
161
177
 
162
178
  ${colors.cyan}REPLACE OPTIONS:${colors.reset}
163
179
  --map <file> Path to replacement YAML
@@ -170,14 +186,28 @@ ${colors.cyan}EXTRACT OPTIONS:${colors.reset}
170
186
  ${colors.cyan}TEMPLATE OPTIONS:${colors.reset}
171
187
  --template-output <file> Output path for template (default: stdout)
172
188
 
189
+ ${colors.cyan}CACHE OPTIONS:${colors.reset}
190
+ --cache-action <action> Cache action: stats, clean, list (default: stats)
191
+ --max-age <days> Max cache age in days for clean (default: 30)
192
+
193
+ ${colors.cyan}SEARCH OPTIONS:${colors.reset}
194
+ --query <name> Font name to search for (required)
195
+ --limit <n> Max results to show (default: 10)
196
+ --threshold <0-1> Minimum similarity (default: 0.3)
197
+
173
198
  ${colors.cyan}EXAMPLES:${colors.reset}
174
199
  svgfonts embed icon.svg # Embed fonts with subsetting
175
200
  svgfonts embed --full icon.svg # Embed complete fonts
201
+ svgfonts embed --woff2 icon.svg # Embed with WOFF2 compression
176
202
  svgfonts list document.svg # List all fonts in SVG
177
203
  svgfonts replace --map fonts.yml *.svg # Apply replacement map
178
204
  svgfonts extract -o ./fonts doc.svg # Extract embedded fonts
179
205
  svgfonts interactive icon.svg # Interactive mode
180
206
  svgfonts template > fonts.yml # Generate template
207
+ svgfonts cache # Show font cache stats
208
+ svgfonts cache --cache-action clean # Clean old cached fonts
209
+ svgfonts search --query "roboto" # Search for fonts by name
210
+ svgfonts dedupe icon.svg # Merge duplicate @font-face rules
181
211
 
182
212
  ${colors.cyan}ENVIRONMENT:${colors.reset}
183
213
  SVGM_REPLACEMENT_MAP Path to default replacement map YAML
@@ -215,6 +245,9 @@ function parseArgs(args) {
215
245
  case "list":
216
246
  case "interactive":
217
247
  case "template":
248
+ case "cache":
249
+ case "search":
250
+ case "dedupe":
218
251
  if (!result.command) {
219
252
  result.command = arg;
220
253
  } else {
@@ -307,6 +340,41 @@ function parseArgs(args) {
307
340
  result.templateOutput = args[++i];
308
341
  break;
309
342
 
343
+ // Embed new options
344
+ case "--woff2":
345
+ result.woff2 = true;
346
+ break;
347
+
348
+ case "--no-cache":
349
+ result.useCache = false;
350
+ break;
351
+
352
+ case "--search-alternatives":
353
+ result.searchAlternatives = true;
354
+ break;
355
+
356
+ // Cache options
357
+ case "--cache-action":
358
+ result.cacheAction = args[++i];
359
+ break;
360
+
361
+ case "--max-age":
362
+ result.maxAge = parseInt(args[++i], 10);
363
+ break;
364
+
365
+ // Search options
366
+ case "--query":
367
+ result.query = args[++i];
368
+ break;
369
+
370
+ case "--limit":
371
+ result.limit = parseInt(args[++i], 10);
372
+ break;
373
+
374
+ case "--threshold":
375
+ result.threshold = parseFloat(args[++i]);
376
+ break;
377
+
310
378
  default:
311
379
  // Assume it's an input file
312
380
  if (!arg.startsWith("-")) {
@@ -601,6 +669,176 @@ function cmdTemplate() {
601
669
  }
602
670
  }
603
671
 
672
+ // ============================================================================
673
+ // COMMAND: CACHE
674
+ // ============================================================================
675
+ function cmdCache() {
676
+ // Initialize cache if needed
677
+ FontManager.initFontCache();
678
+
679
+ switch (config.cacheAction) {
680
+ case "stats": {
681
+ const stats = FontManager.getFontCacheStats();
682
+ log(`\n${colors.bright}Font Cache Statistics${colors.reset}`);
683
+ log(`${"─".repeat(40)}`);
684
+ log(` Location: ${FontManager.FONT_CACHE_DIR}`);
685
+ log(` Total fonts: ${stats.totalFonts}`);
686
+ log(` Total size: ${formatSize(stats.totalSize)}`);
687
+ if (stats.oldestAge > 0) {
688
+ const oldestDays = Math.floor(stats.oldestAge / (24 * 60 * 60 * 1000));
689
+ const newestDays = Math.floor(stats.newestAge / (24 * 60 * 60 * 1000));
690
+ log(` Oldest entry: ${oldestDays} days ago`);
691
+ log(` Newest entry: ${newestDays} days ago`);
692
+ } else {
693
+ log(` Oldest entry: N/A`);
694
+ log(` Newest entry: N/A`);
695
+ }
696
+ break;
697
+ }
698
+
699
+ case "clean": {
700
+ const maxAgeMs = config.maxAge * 24 * 60 * 60 * 1000;
701
+ const result = FontManager.cleanupFontCache(maxAgeMs);
702
+ if (result.removed > 0) {
703
+ logSuccess(`Cleaned ${result.removed} old cached fonts (${formatSize(result.freedBytes)})`);
704
+ } else {
705
+ log("No fonts to clean (all within max age)");
706
+ }
707
+ break;
708
+ }
709
+
710
+ case "list": {
711
+ // Read the cache index directly to get list
712
+ const indexPath = join(FontManager.FONT_CACHE_DIR, FontManager.FONT_CACHE_INDEX);
713
+ log(`\n${colors.bright}Cached Fonts${colors.reset}`);
714
+ log(`${"─".repeat(60)}`);
715
+ if (existsSync(indexPath)) {
716
+ try {
717
+ const index = JSON.parse(readFileSync(indexPath, "utf8"));
718
+ const entries = Object.entries(index.fonts);
719
+ if (entries.length > 0) {
720
+ for (const [key, data] of entries) {
721
+ const age = Math.floor((Date.now() - data.timestamp) / (24 * 60 * 60 * 1000));
722
+ log(` ${key.slice(0, 30).padEnd(30)} ${formatSize(data.size || 0).padStart(10)} ${age}d ago`);
723
+ }
724
+ } else {
725
+ log(" No cached fonts");
726
+ }
727
+ } catch {
728
+ log(" No cached fonts");
729
+ }
730
+ } else {
731
+ log(" No cached fonts");
732
+ }
733
+ break;
734
+ }
735
+
736
+ default:
737
+ logError(`Unknown cache action: ${config.cacheAction}`);
738
+ process.exit(CONSTANTS.EXIT_ERROR);
739
+ }
740
+ }
741
+
742
+ // ============================================================================
743
+ // COMMAND: SEARCH
744
+ // ============================================================================
745
+ async function cmdSearch() {
746
+ if (!config.query) {
747
+ logError("Missing --query option. Usage: svgfonts search --query <font-name>");
748
+ process.exit(CONSTANTS.EXIT_ERROR);
749
+ }
750
+
751
+ log(`\n${colors.bright}Searching for fonts matching: "${config.query}"${colors.reset}`);
752
+ log(`${"─".repeat(60)}`);
753
+
754
+ const results = await FontManager.searchSimilarFonts(config.query, {
755
+ limit: config.limit,
756
+ threshold: config.threshold,
757
+ });
758
+
759
+ if (results.length === 0) {
760
+ log(`No fonts found matching "${config.query}" with similarity >= ${config.threshold}`);
761
+ return;
762
+ }
763
+
764
+ log(`\n${colors.cyan}# Similarity Font Name${" ".repeat(25)}Source${colors.reset}`);
765
+ log(`${"─".repeat(60)}`);
766
+
767
+ results.forEach((result, idx) => {
768
+ const simPercent = Math.round(result.similarity * 100);
769
+ const simBar = "█".repeat(Math.round(simPercent / 10)) + "░".repeat(10 - Math.round(simPercent / 10));
770
+ const simColor = simPercent >= 80 ? colors.green : simPercent >= 50 ? colors.yellow : colors.dim;
771
+ log(
772
+ `${(idx + 1).toString().padStart(2)}. ${simColor}${simBar}${colors.reset} ${simPercent.toString().padStart(3)}% ${result.name.padEnd(28)} ${colors.dim}${result.source}${colors.reset}`
773
+ );
774
+ });
775
+
776
+ log(`\n${colors.dim}Use 'svgfonts embed --source google <svg>' to embed a font${colors.reset}`);
777
+ }
778
+
779
+ // ============================================================================
780
+ // COMMAND: DEDUPE
781
+ // ============================================================================
782
+ async function cmdDedupe(files) {
783
+ for (const file of files) {
784
+ logVerbose(`Processing: ${file}`);
785
+
786
+ const content = readFileSync(file, "utf8");
787
+
788
+ // Create backup
789
+ if (!config.noBackup && !config.dryRun) {
790
+ const backupPath = FontManager.createBackup(file, { noBackup: config.noBackup });
791
+ if (backupPath) {
792
+ logVerbose(`Backup created: ${backupPath}`);
793
+ }
794
+ }
795
+
796
+ const doc = parseSVG(content);
797
+
798
+ // Detect duplicates first
799
+ const { duplicates, total } = FontManager.detectDuplicateFontFaces(doc);
800
+
801
+ if (duplicates.length === 0) {
802
+ log(`${basename(file)}: No duplicate @font-face rules found (${total} total)`);
803
+ continue;
804
+ }
805
+
806
+ if (config.dryRun) {
807
+ log(`[dry-run] Would merge ${duplicates.length} duplicate font group(s) in: ${file}`);
808
+ for (const dup of duplicates) {
809
+ log(` - "${dup.family}" (${dup.weight}/${dup.style}): ${dup.count} occurrences`);
810
+ }
811
+ continue;
812
+ }
813
+
814
+ // Merge duplicates
815
+ const result = FontManager.mergeDuplicateFontFaces(doc);
816
+
817
+ if (result.removed > 0) {
818
+ const output = serializeSVG(doc);
819
+
820
+ // Validate if requested
821
+ if (config.validate) {
822
+ const validation = await FontManager.validateSvgAfterFontOperation(output, "dedupe");
823
+ if (!validation.valid) {
824
+ logError(`Validation failed for ${file}: ${validation.errors.join(", ")}`);
825
+ continue;
826
+ }
827
+ }
828
+
829
+ const outputPath = config.output || file;
830
+ writeFileSync(outputPath, output);
831
+
832
+ logSuccess(`Merged ${result.removed} duplicate @font-face rule(s): ${outputPath}`);
833
+ for (const dup of duplicates) {
834
+ log(` - "${dup.family}" (${dup.weight}/${dup.style})`);
835
+ }
836
+ } else {
837
+ log(`${basename(file)}: No duplicates merged`);
838
+ }
839
+ }
840
+ }
841
+
604
842
  // ============================================================================
605
843
  // COMMAND: INTERACTIVE
606
844
  // ============================================================================
@@ -721,13 +959,13 @@ async function cmdInteractive(files) {
721
959
  });
722
960
 
723
961
  const question = (prompt) =>
724
- new Promise((resolve) => rl.question(prompt, resolve));
962
+ new Promise((res) => rl.question(prompt, res));
725
963
 
726
964
  /**
727
965
  * Read single keypress (for arrow key navigation)
728
966
  */
729
- const readKey = () =>
730
- new Promise((resolve) => {
967
+ const _readKey = () =>
968
+ new Promise((res) => {
731
969
  const wasRaw = process.stdin.isRaw;
732
970
  if (process.stdin.setRawMode) {
733
971
  process.stdin.setRawMode(true);
@@ -737,7 +975,7 @@ async function cmdInteractive(files) {
737
975
  if (process.stdin.setRawMode) {
738
976
  process.stdin.setRawMode(wasRaw);
739
977
  }
740
- resolve(key.toString());
978
+ res(key.toString());
741
979
  });
742
980
  });
743
981
 
@@ -1361,6 +1599,18 @@ async function main() {
1361
1599
  process.exit(CONSTANTS.EXIT_SUCCESS);
1362
1600
  }
1363
1601
 
1602
+ // Handle cache command (no inputs needed)
1603
+ if (config.command === "cache") {
1604
+ cmdCache();
1605
+ process.exit(CONSTANTS.EXIT_SUCCESS);
1606
+ }
1607
+
1608
+ // Handle search command (no inputs needed)
1609
+ if (config.command === "search") {
1610
+ await cmdSearch();
1611
+ process.exit(CONSTANTS.EXIT_SUCCESS);
1612
+ }
1613
+
1364
1614
  // Collect files
1365
1615
  const files = collectSvgFiles(config.inputs, config.recursive);
1366
1616
 
@@ -1394,6 +1644,10 @@ async function main() {
1394
1644
  await cmdInteractive(files);
1395
1645
  break;
1396
1646
 
1647
+ case "dedupe":
1648
+ await cmdDedupe(files);
1649
+ break;
1650
+
1397
1651
  default:
1398
1652
  // Default to embed
1399
1653
  await cmdEmbed(files);
@@ -1,8 +1,8 @@
1
- /*! svg-matrix v1.3.0 | MIT License | https://github.com/Emasoft/svg-matrix */
1
+ /*! svg-matrix v1.3.1 | MIT License | https://github.com/Emasoft/svg-matrix */
2
2
  (()=>{var{defineProperty:EJ,getOwnPropertyNames:VK,getOwnPropertyDescriptor:GK}=Object,zK=Object.prototype.hasOwnProperty;var pJ=new WeakMap,NK=(J)=>{var K=pJ.get(J),$;if(K)return K;if(K=EJ({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")VK(J).map((Q)=>!zK.call(K,Q)&&EJ(K,Q,{get:()=>J[Q],enumerable:!($=GK(J,Q))||$.enumerable}));return pJ.set(J,K),K};var AJ=(J,K)=>{for(var $ in K)EJ(J,$,{get:K[$],enumerable:!0,configurable:!0,set:(Q)=>K[$]=()=>Q})};var T$={};AJ(T$,{translate3D:()=>WK,translate2D:()=>KK,skew2D:()=>HK,scale3D:()=>UK,scale2D:()=>QK,rotateZ:()=>XK,rotateY:()=>ZK,rotateX:()=>FK,rotate2D:()=>$K,default:()=>O$,applyTransform3D:()=>qK,applyTransform2D:()=>YK,Vector:()=>E,VERSION:()=>JK,Transforms3D:()=>_J,Transforms2D:()=>NJ,Matrix:()=>I,Decimal:()=>Z});/*!
3
3
  * decimal.js v10.6.0
4
4
  * An arbitrary-precision Decimal type for JavaScript.
5
5
  * https://github.com/MikeMcl/decimal.js
6
6
  * Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>
7
7
  * MIT Licence
8
- */var i=9000000000000000,x=1e9,wJ="0123456789abcdef",XJ="2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058",UJ="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789",SJ={precision:20,rounding:4,modulo:1,toExpNeg:-7,toExpPos:21,minE:-i,maxE:i,crypto:!1},lJ,n,O=!0,RJ="[DecimalError] ",o=RJ+"Invalid argument: ",dJ=RJ+"Precision limit exceeded",nJ=RJ+"crypto unavailable",mJ="[object Decimal]",C=Math.floor,f=Math.pow,IK=/^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i,_K=/^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i,BK=/^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i,sJ=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,c=1e7,_=7,TK=9007199254740991,OK=XJ.length-1,MJ=UJ.length-1,G={toStringTag:mJ};G.absoluteValue=G.abs=function(){var J=new this.constructor(this);if(J.s<0)J.s=1;return N(J)};G.ceil=function(){return N(new this.constructor(this),this.e+1,2)};G.clampedTo=G.clamp=function(J,K){var $,Q=this,H=Q.constructor;if(J=new H(J),K=new H(K),!J.s||!K.s)return new H(NaN);if(J.gt(K))throw Error(o+K);return $=Q.cmp(J),$<0?J:Q.cmp(K)>0?K:new H(Q)};G.comparedTo=G.cmp=function(J){var K,$,Q,H,Y=this,W=Y.d,F=(J=new Y.constructor(J)).d,U=Y.s,X=J.s;if(!W||!F)return!U||!X?NaN:U!==X?U:W===F?0:!W^U<0?1:-1;if(!W[0]||!F[0])return W[0]?U:F[0]?-X:0;if(U!==X)return U;if(Y.e!==J.e)return Y.e>J.e^U<0?1:-1;Q=W.length,H=F.length;for(K=0,$=Q<H?Q:H;K<$;++K)if(W[K]!==F[K])return W[K]>F[K]^U<0?1:-1;return Q===H?0:Q>H^U<0?1:-1};G.cosine=G.cos=function(){var J,K,$=this,Q=$.constructor;if(!$.d)return new Q(NaN);if(!$.d[0])return new Q(1);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max($.e,$.sd())+_,Q.rounding=1,$=EK(Q,tJ(Q,$)),Q.precision=J,Q.rounding=K,N(n==2||n==3?$.neg():$,J,K,!0)};G.cubeRoot=G.cbrt=function(){var J,K,$,Q,H,Y,W,F,U,X,q=this,R=q.constructor;if(!q.isFinite()||q.isZero())return new R(q);if(O=!1,Y=q.s*f(q.s*q,0.3333333333333333),!Y||Math.abs(Y)==1/0){if($=k(q.d),J=q.e,Y=(J-$.length+1)%3)$+=Y==1||Y==-2?"0":"00";if(Y=f($,0.3333333333333333),J=C((J+1)/3)-(J%3==(J<0?-1:2)),Y==1/0)$="5e"+J;else $=Y.toExponential(),$=$.slice(0,$.indexOf("e")+1)+J;Q=new R($),Q.s=q.s}else Q=new R(Y.toString());W=(J=R.precision)+3;for(;;)if(F=Q,U=F.times(F).times(F),X=U.plus(q),Q=w(X.plus(q).times(F),X.plus(U),W+2,1),k(F.d).slice(0,W)===($=k(Q.d)).slice(0,W))if($=$.slice(W-3,W+1),$=="9999"||!H&&$=="4999"){if(!H){if(N(F,J+1,0),F.times(F).times(F).eq(q)){Q=F;break}}W+=4,H=1}else{if(!+$||!+$.slice(1)&&$.charAt(0)=="5")N(Q,J+1,1),K=!Q.times(Q).times(Q).eq(q);break}return O=!0,N(Q,J,R.rounding,K)};G.decimalPlaces=G.dp=function(){var J,K=this.d,$=NaN;if(K){if(J=K.length-1,$=(J-C(this.e/_))*_,J=K[J],J)for(;J%10==0;J/=10)$--;if($<0)$=0}return $};G.dividedBy=G.div=function(J){return w(this,new this.constructor(J))};G.dividedToIntegerBy=G.divToInt=function(J){var K=this,$=K.constructor;return N(w(K,new $(J),0,1,1),$.precision,$.rounding)};G.equals=G.eq=function(J){return this.cmp(J)===0};G.floor=function(){return N(new this.constructor(this),this.e+1,3)};G.greaterThan=G.gt=function(J){return this.cmp(J)>0};G.greaterThanOrEqualTo=G.gte=function(J){var K=this.cmp(J);return K==1||K===0};G.hyperbolicCosine=G.cosh=function(){var J,K,$,Q,H,Y=this,W=Y.constructor,F=new W(1);if(!Y.isFinite())return new W(Y.s?1/0:NaN);if(Y.isZero())return F;if($=W.precision,Q=W.rounding,W.precision=$+Math.max(Y.e,Y.sd())+4,W.rounding=1,H=Y.d.length,H<32)J=Math.ceil(H/3),K=(1/GJ(4,J)).toString();else J=16,K="2.3283064365386962890625e-10";Y=t(W,1,Y.times(K),new W(1),!0);var U,X=J,q=new W(8);for(;X--;)U=Y.times(Y),Y=F.minus(U.times(q.minus(U.times(q))));return N(Y,W.precision=$,W.rounding=Q,!0)};G.hyperbolicSine=G.sinh=function(){var J,K,$,Q,H=this,Y=H.constructor;if(!H.isFinite()||H.isZero())return new Y(H);if(K=Y.precision,$=Y.rounding,Y.precision=K+Math.max(H.e,H.sd())+4,Y.rounding=1,Q=H.d.length,Q<3)H=t(Y,2,H,H,!0);else{J=1.4*Math.sqrt(Q),J=J>16?16:J|0,H=H.times(1/GJ(5,J)),H=t(Y,2,H,H,!0);var W,F=new Y(5),U=new Y(16),X=new Y(20);for(;J--;)W=H.times(H),H=H.times(F.plus(W.times(U.times(W).plus(X))))}return Y.precision=K,Y.rounding=$,N(H,K,$,!0)};G.hyperbolicTangent=G.tanh=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q($.s);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+7,Q.rounding=1,w($.sinh(),$.cosh(),Q.precision=J,Q.rounding=K)};G.inverseCosine=G.acos=function(){var J=this,K=J.constructor,$=J.abs().cmp(1),Q=K.precision,H=K.rounding;if($!==-1)return $===0?J.isNeg()?l(K,Q,H):new K(0):new K(NaN);if(J.isZero())return l(K,Q+4,H).times(0.5);return K.precision=Q+6,K.rounding=1,J=new K(1).minus(J).div(J.plus(1)).sqrt().atan(),K.precision=Q,K.rounding=H,J.times(2)};G.inverseHyperbolicCosine=G.acosh=function(){var J,K,$=this,Q=$.constructor;if($.lte(1))return new Q($.eq(1)?0:NaN);if(!$.isFinite())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max(Math.abs($.e),$.sd())+4,Q.rounding=1,O=!1,$=$.times($).minus(1).sqrt().plus($),O=!0,Q.precision=J,Q.rounding=K,$.ln()};G.inverseHyperbolicSine=G.asinh=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite()||$.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+2*Math.max(Math.abs($.e),$.sd())+6,Q.rounding=1,O=!1,$=$.times($).plus(1).sqrt().plus($),O=!0,Q.precision=J,Q.rounding=K,$.ln()};G.inverseHyperbolicTangent=G.atanh=function(){var J,K,$,Q,H=this,Y=H.constructor;if(!H.isFinite())return new Y(NaN);if(H.e>=0)return new Y(H.abs().eq(1)?H.s/0:H.isZero()?H:NaN);if(J=Y.precision,K=Y.rounding,Q=H.sd(),Math.max(Q,J)<2*-H.e-1)return N(new Y(H),J,K,!0);return Y.precision=$=Q-H.e,H=w(H.plus(1),new Y(1).minus(H),$+J,1),Y.precision=J+4,Y.rounding=1,H=H.ln(),Y.precision=J,Y.rounding=K,H.times(0.5)};G.inverseSine=G.asin=function(){var J,K,$,Q,H=this,Y=H.constructor;if(H.isZero())return new Y(H);if(K=H.abs().cmp(1),$=Y.precision,Q=Y.rounding,K!==-1){if(K===0)return J=l(Y,$+4,Q).times(0.5),J.s=H.s,J;return new Y(NaN)}return Y.precision=$+6,Y.rounding=1,H=H.div(new Y(1).minus(H.times(H)).sqrt().plus(1)).atan(),Y.precision=$,Y.rounding=Q,H.times(2)};G.inverseTangent=G.atan=function(){var J,K,$,Q,H,Y,W,F,U,X=this,q=X.constructor,R=q.precision,V=q.rounding;if(!X.isFinite()){if(!X.s)return new q(NaN);if(R+4<=MJ)return W=l(q,R+4,V).times(0.5),W.s=X.s,W}else if(X.isZero())return new q(X);else if(X.abs().eq(1)&&R+4<=MJ)return W=l(q,R+4,V).times(0.25),W.s=X.s,W;q.precision=F=R+10,q.rounding=1,$=Math.min(28,F/_+2|0);for(J=$;J;--J)X=X.div(X.times(X).plus(1).sqrt().plus(1));O=!1,K=Math.ceil(F/_),Q=1,U=X.times(X),W=new q(X),H=X;for(;J!==-1;)if(H=H.times(U),Y=W.minus(H.div(Q+=2)),H=H.times(U),W=Y.plus(H.div(Q+=2)),W.d[K]!==void 0)for(J=K;W.d[J]===Y.d[J]&&J--;);if($)W=W.times(2<<$-1);return O=!0,N(W,q.precision=R,q.rounding=V,!0)};G.isFinite=function(){return!!this.d};G.isInteger=G.isInt=function(){return!!this.d&&C(this.e/_)>this.d.length-2};G.isNaN=function(){return!this.s};G.isNegative=G.isNeg=function(){return this.s<0};G.isPositive=G.isPos=function(){return this.s>0};G.isZero=function(){return!!this.d&&this.d[0]===0};G.lessThan=G.lt=function(J){return this.cmp(J)<0};G.lessThanOrEqualTo=G.lte=function(J){return this.cmp(J)<1};G.logarithm=G.log=function(J){var K,$,Q,H,Y,W,F,U,X=this,q=X.constructor,R=q.precision,V=q.rounding,z=5;if(J==null)J=new q(10),K=!0;else{if(J=new q(J),$=J.d,J.s<0||!$||!$[0]||J.eq(1))return new q(NaN);K=J.eq(10)}if($=X.d,X.s<0||!$||!$[0]||X.eq(1))return new q($&&!$[0]?-1/0:X.s!=1?NaN:$?0:1/0);if(K)if($.length>1)Y=!0;else{for(H=$[0];H%10===0;)H/=10;Y=H!==1}if(O=!1,F=R+z,W=s(X,F),Q=K?qJ(q,F+10):s(J,F),U=w(W,Q,F,1),JJ(U.d,H=R,V))do if(F+=10,W=s(X,F),Q=K?qJ(q,F+10):s(J,F),U=w(W,Q,F,1),!Y){if(+k(U.d).slice(H+1,H+15)+1==100000000000000)U=N(U,R+1,0);break}while(JJ(U.d,H+=10,V));return O=!0,N(U,R,V)};G.minus=G.sub=function(J){var K,$,Q,H,Y,W,F,U,X,q,R,V,z=this,T=z.constructor;if(J=new T(J),!z.d||!J.d){if(!z.s||!J.s)J=new T(NaN);else if(z.d)J.s=-J.s;else J=new T(J.d||z.s!==J.s?z:NaN);return J}if(z.s!=J.s)return J.s=-J.s,z.plus(J);if(X=z.d,V=J.d,F=T.precision,U=T.rounding,!X[0]||!V[0]){if(V[0])J.s=-J.s;else if(X[0])J=new T(z);else return new T(U===3?-0:0);return O?N(J,F,U):J}if($=C(J.e/_),q=C(z.e/_),X=X.slice(),Y=q-$,Y){if(R=Y<0,R)K=X,Y=-Y,W=V.length;else K=V,$=q,W=X.length;if(Q=Math.max(Math.ceil(F/_),W)+2,Y>Q)Y=Q,K.length=1;K.reverse();for(Q=Y;Q--;)K.push(0);K.reverse()}else{if(Q=X.length,W=V.length,R=Q<W,R)W=Q;for(Q=0;Q<W;Q++)if(X[Q]!=V[Q]){R=X[Q]<V[Q];break}Y=0}if(R)K=X,X=V,V=K,J.s=-J.s;W=X.length;for(Q=V.length-W;Q>0;--Q)X[W++]=0;for(Q=V.length;Q>Y;){if(X[--Q]<V[Q]){for(H=Q;H&&X[--H]===0;)X[H]=c-1;--X[H],X[Q]+=c}X[Q]-=V[Q]}for(;X[--W]===0;)X.pop();for(;X[0]===0;X.shift())--$;if(!X[0])return new T(U===3?-0:0);return J.d=X,J.e=VJ(X,$),O?N(J,F,U):J};G.modulo=G.mod=function(J){var K,$=this,Q=$.constructor;if(J=new Q(J),!$.d||!J.s||J.d&&!J.d[0])return new Q(NaN);if(!J.d||$.d&&!$.d[0])return N(new Q($),Q.precision,Q.rounding);if(O=!1,Q.modulo==9)K=w($,J.abs(),0,3,1),K.s*=J.s;else K=w($,J,0,Q.modulo,1);return K=K.times(J),O=!0,$.minus(K)};G.naturalExponential=G.exp=function(){return PJ(this)};G.naturalLogarithm=G.ln=function(){return s(this)};G.negated=G.neg=function(){var J=new this.constructor(this);return J.s=-J.s,N(J)};G.plus=G.add=function(J){var K,$,Q,H,Y,W,F,U,X,q,R=this,V=R.constructor;if(J=new V(J),!R.d||!J.d){if(!R.s||!J.s)J=new V(NaN);else if(!R.d)J=new V(J.d||R.s===J.s?R:NaN);return J}if(R.s!=J.s)return J.s=-J.s,R.minus(J);if(X=R.d,q=J.d,F=V.precision,U=V.rounding,!X[0]||!q[0]){if(!q[0])J=new V(R);return O?N(J,F,U):J}if(Y=C(R.e/_),Q=C(J.e/_),X=X.slice(),H=Y-Q,H){if(H<0)$=X,H=-H,W=q.length;else $=q,Q=Y,W=X.length;if(Y=Math.ceil(F/_),W=Y>W?Y+1:W+1,H>W)H=W,$.length=1;$.reverse();for(;H--;)$.push(0);$.reverse()}if(W=X.length,H=q.length,W-H<0)H=W,$=q,q=X,X=$;for(K=0;H;)K=(X[--H]=X[H]+q[H]+K)/c|0,X[H]%=c;if(K)X.unshift(K),++Q;for(W=X.length;X[--W]==0;)X.pop();return J.d=X,J.e=VJ(X,Q),O?N(J,F,U):J};G.precision=G.sd=function(J){var K,$=this;if(J!==void 0&&J!==!!J&&J!==1&&J!==0)throw Error(o+J);if($.d){if(K=oJ($.d),J&&$.e+1>K)K=$.e+1}else K=NaN;return K};G.round=function(){var J=this,K=J.constructor;return N(new K(J),J.e+1,K.rounding)};G.sine=G.sin=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q(NaN);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max($.e,$.sd())+_,Q.rounding=1,$=wK(Q,tJ(Q,$)),Q.precision=J,Q.rounding=K,N(n>2?$.neg():$,J,K,!0)};G.squareRoot=G.sqrt=function(){var J,K,$,Q,H,Y,W=this,F=W.d,U=W.e,X=W.s,q=W.constructor;if(X!==1||!F||!F[0])return new q(!X||X<0&&(!F||F[0])?NaN:F?W:1/0);if(O=!1,X=Math.sqrt(+W),X==0||X==1/0){if(K=k(F),(K.length+U)%2==0)K+="0";if(X=Math.sqrt(K),U=C((U+1)/2)-(U<0||U%2),X==1/0)K="5e"+U;else K=X.toExponential(),K=K.slice(0,K.indexOf("e")+1)+U;Q=new q(K)}else Q=new q(X.toString());$=(U=q.precision)+3;for(;;)if(Y=Q,Q=Y.plus(w(W,Y,$+2,1)).times(0.5),k(Y.d).slice(0,$)===(K=k(Q.d)).slice(0,$))if(K=K.slice($-3,$+1),K=="9999"||!H&&K=="4999"){if(!H){if(N(Y,U+1,0),Y.times(Y).eq(W)){Q=Y;break}}$+=4,H=1}else{if(!+K||!+K.slice(1)&&K.charAt(0)=="5")N(Q,U+1,1),J=!Q.times(Q).eq(W);break}return O=!0,N(Q,U,q.rounding,J)};G.tangent=G.tan=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q(NaN);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+10,Q.rounding=1,$=$.sin(),$.s=1,$=w($,new Q(1).minus($.times($)).sqrt(),J+10,0),Q.precision=J,Q.rounding=K,N(n==2||n==4?$.neg():$,J,K,!0)};G.times=G.mul=function(J){var K,$,Q,H,Y,W,F,U,X,q=this,R=q.constructor,V=q.d,z=(J=new R(J)).d;if(J.s*=q.s,!V||!V[0]||!z||!z[0])return new R(!J.s||V&&!V[0]&&!z||z&&!z[0]&&!V?NaN:!V||!z?J.s/0:J.s*0);if($=C(q.e/_)+C(J.e/_),U=V.length,X=z.length,U<X)Y=V,V=z,z=Y,W=U,U=X,X=W;Y=[],W=U+X;for(Q=W;Q--;)Y.push(0);for(Q=X;--Q>=0;){K=0;for(H=U+Q;H>Q;)F=Y[H]+z[Q]*V[H-Q-1]+K,Y[H--]=F%c|0,K=F/c|0;Y[H]=(Y[H]+K)%c|0}for(;!Y[--W];)Y.pop();if(K)++$;else Y.shift();return J.d=Y,J.e=VJ(Y,$),O?N(J,R.precision,R.rounding):J};G.toBinary=function(J,K){return fJ(this,2,J,K)};G.toDecimalPlaces=G.toDP=function(J,K){var $=this,Q=$.constructor;if($=new Q($),J===void 0)return $;if(v(J,0,x),K===void 0)K=Q.rounding;else v(K,0,8);return N($,J+$.e+1,K)};G.toExponential=function(J,K){var $,Q=this,H=Q.constructor;if(J===void 0)$=d(Q,!0);else{if(v(J,0,x),K===void 0)K=H.rounding;else v(K,0,8);Q=N(new H(Q),J+1,K),$=d(Q,!0,J+1)}return Q.isNeg()&&!Q.isZero()?"-"+$:$};G.toFixed=function(J,K){var $,Q,H=this,Y=H.constructor;if(J===void 0)$=d(H);else{if(v(J,0,x),K===void 0)K=Y.rounding;else v(K,0,8);Q=N(new Y(H),J+H.e+1,K),$=d(Q,!1,J+Q.e+1)}return H.isNeg()&&!H.isZero()?"-"+$:$};G.toFraction=function(J){var K,$,Q,H,Y,W,F,U,X,q,R,V,z=this,T=z.d,B=z.constructor;if(!T)return new B(z);if(X=$=new B(1),Q=U=new B(0),K=new B(Q),Y=K.e=oJ(T)-z.e-1,W=Y%_,K.d[0]=f(10,W<0?_+W:W),J==null)J=Y>0?K:X;else{if(F=new B(J),!F.isInt()||F.lt(X))throw Error(o+F);J=F.gt(K)?Y>0?K:X:F}O=!1,F=new B(k(T)),q=B.precision,B.precision=Y=T.length*_*2;for(;;){if(R=w(F,K,0,1,1),H=$.plus(R.times(Q)),H.cmp(J)==1)break;$=Q,Q=H,H=X,X=U.plus(R.times(H)),U=H,H=K,K=F.minus(R.times(H)),F=H}return H=w(J.minus($),Q,0,1,1),U=U.plus(H.times(X)),$=$.plus(H.times(Q)),U.s=X.s=z.s,V=w(X,Q,Y,1).minus(z).abs().cmp(w(U,$,Y,1).minus(z).abs())<1?[X,Q]:[U,$],B.precision=q,O=!0,V};G.toHexadecimal=G.toHex=function(J,K){return fJ(this,16,J,K)};G.toNearest=function(J,K){var $=this,Q=$.constructor;if($=new Q($),J==null){if(!$.d)return $;J=new Q(1),K=Q.rounding}else{if(J=new Q(J),K===void 0)K=Q.rounding;else v(K,0,8);if(!$.d)return J.s?$:J;if(!J.d){if(J.s)J.s=$.s;return J}}if(J.d[0])O=!1,$=w($,J,0,K,1).times(J),O=!0,N($);else J.s=$.s,$=J;return $};G.toNumber=function(){return+this};G.toOctal=function(J,K){return fJ(this,8,J,K)};G.toPower=G.pow=function(J){var K,$,Q,H,Y,W,F=this,U=F.constructor,X=+(J=new U(J));if(!F.d||!J.d||!F.d[0]||!J.d[0])return new U(f(+F,X));if(F=new U(F),F.eq(1))return F;if(Q=U.precision,Y=U.rounding,J.eq(1))return N(F,Q,Y);if(K=C(J.e/_),K>=J.d.length-1&&($=X<0?-X:X)<=TK)return H=xJ(U,F,$,Q),J.s<0?new U(1).div(H):N(H,Q,Y);if(W=F.s,W<0){if(K<J.d.length-1)return new U(NaN);if((J.d[K]&1)==0)W=1;if(F.e==0&&F.d[0]==1&&F.d.length==1)return F.s=W,F}if($=f(+F,X),K=$==0||!isFinite($)?C(X*(Math.log("0."+k(F.d))/Math.LN10+F.e+1)):new U($+"").e,K>U.maxE+1||K<U.minE-1)return new U(K>0?W/0:0);if(O=!1,U.rounding=F.s=1,$=Math.min(12,(K+"").length),H=PJ(J.times(s(F,Q+$)),Q),H.d){if(H=N(H,Q+5,1),JJ(H.d,Q,Y)){if(K=Q+10,H=N(PJ(J.times(s(F,K+$)),K),K+5,1),+k(H.d).slice(Q+1,Q+15)+1==100000000000000)H=N(H,Q+1,0)}}return H.s=W,O=!0,U.rounding=Y,N(H,Q,Y)};G.toPrecision=function(J,K){var $,Q=this,H=Q.constructor;if(J===void 0)$=d(Q,Q.e<=H.toExpNeg||Q.e>=H.toExpPos);else{if(v(J,1,x),K===void 0)K=H.rounding;else v(K,0,8);Q=N(new H(Q),J,K),$=d(Q,J<=Q.e||Q.e<=H.toExpNeg,J)}return Q.isNeg()&&!Q.isZero()?"-"+$:$};G.toSignificantDigits=G.toSD=function(J,K){var $=this,Q=$.constructor;if(J===void 0)J=Q.precision,K=Q.rounding;else if(v(J,1,x),K===void 0)K=Q.rounding;else v(K,0,8);return N(new Q($),J,K)};G.toString=function(){var J=this,K=J.constructor,$=d(J,J.e<=K.toExpNeg||J.e>=K.toExpPos);return J.isNeg()&&!J.isZero()?"-"+$:$};G.truncated=G.trunc=function(){return N(new this.constructor(this),this.e+1,1)};G.valueOf=G.toJSON=function(){var J=this,K=J.constructor,$=d(J,J.e<=K.toExpNeg||J.e>=K.toExpPos);return J.isNeg()?"-"+$:$};function k(J){var K,$,Q,H=J.length-1,Y="",W=J[0];if(H>0){Y+=W;for(K=1;K<H;K++){if(Q=J[K]+"",$=_-Q.length,$)Y+=m($);Y+=Q}if(W=J[K],Q=W+"",$=_-Q.length,$)Y+=m($)}else if(W===0)return"0";for(;W%10===0;)W/=10;return Y+W}function v(J,K,$){if(J!==~~J||J<K||J>$)throw Error(o+J)}function JJ(J,K,$,Q){var H,Y,W,F;for(Y=J[0];Y>=10;Y/=10)--K;if(--K<0)K+=_,H=0;else H=Math.ceil((K+1)/_),K%=_;if(Y=f(10,_-K),F=J[H]%Y|0,Q==null)if(K<3){if(K==0)F=F/100|0;else if(K==1)F=F/10|0;W=$<4&&F==99999||$>3&&F==49999||F==50000||F==0}else W=($<4&&F+1==Y||$>3&&F+1==Y/2)&&(J[H+1]/Y/100|0)==f(10,K-2)-1||(F==Y/2||F==0)&&(J[H+1]/Y/100|0)==0;else if(K<4){if(K==0)F=F/1000|0;else if(K==1)F=F/100|0;else if(K==2)F=F/10|0;W=(Q||$<4)&&F==9999||!Q&&$>3&&F==4999}else W=((Q||$<4)&&F+1==Y||!Q&&$>3&&F+1==Y/2)&&(J[H+1]/Y/1000|0)==f(10,K-3)-1;return W}function FJ(J,K,$){var Q,H=[0],Y,W=0,F=J.length;for(;W<F;){for(Y=H.length;Y--;)H[Y]*=K;H[0]+=wJ.indexOf(J.charAt(W++));for(Q=0;Q<H.length;Q++)if(H[Q]>$-1){if(H[Q+1]===void 0)H[Q+1]=0;H[Q+1]+=H[Q]/$|0,H[Q]%=$}}return H.reverse()}function EK(J,K){var $,Q,H;if(K.isZero())return K;if(Q=K.d.length,Q<32)$=Math.ceil(Q/3),H=(1/GJ(4,$)).toString();else $=16,H="2.3283064365386962890625e-10";J.precision+=$,K=t(J,1,K.times(H),new J(1));for(var Y=$;Y--;){var W=K.times(K);K=W.times(W).minus(W).times(8).plus(1)}return J.precision-=$,K}var w=function(){function J(Q,H,Y){var W,F=0,U=Q.length;for(Q=Q.slice();U--;)W=Q[U]*H+F,Q[U]=W%Y|0,F=W/Y|0;if(F)Q.unshift(F);return Q}function K(Q,H,Y,W){var F,U;if(Y!=W)U=Y>W?1:-1;else for(F=U=0;F<Y;F++)if(Q[F]!=H[F]){U=Q[F]>H[F]?1:-1;break}return U}function $(Q,H,Y,W){var F=0;for(;Y--;)Q[Y]-=F,F=Q[Y]<H[Y]?1:0,Q[Y]=F*W+Q[Y]-H[Y];for(;!Q[0]&&Q.length>1;)Q.shift()}return function(Q,H,Y,W,F,U){var X,q,R,V,z,T,B,L,M,p,A,b,a,D,BJ,HJ,r,TJ,y,YJ,WJ=Q.constructor,OJ=Q.s==H.s?1:-1,g=Q.d,S=H.d;if(!g||!g[0]||!S||!S[0])return new WJ(!Q.s||!H.s||(g?S&&g[0]==S[0]:!S)?NaN:g&&g[0]==0||!S?OJ*0:OJ/0);if(U)z=1,q=Q.e-H.e;else U=c,z=_,q=C(Q.e/z)-C(H.e/z);y=S.length,r=g.length,M=new WJ(OJ),p=M.d=[];for(R=0;S[R]==(g[R]||0);R++);if(S[R]>(g[R]||0))q--;if(Y==null)D=Y=WJ.precision,W=WJ.rounding;else if(F)D=Y+(Q.e-H.e)+1;else D=Y;if(D<0)p.push(1),T=!0;else{if(D=D/z+2|0,R=0,y==1){V=0,S=S[0],D++;for(;(R<r||V)&&D--;R++)BJ=V*U+(g[R]||0),p[R]=BJ/S|0,V=BJ%S|0;T=V||R<r}else{if(V=U/(S[0]+1)|0,V>1)S=J(S,V,U),g=J(g,V,U),y=S.length,r=g.length;HJ=y,A=g.slice(0,y),b=A.length;for(;b<y;)A[b++]=0;if(YJ=S.slice(),YJ.unshift(0),TJ=S[0],S[1]>=U/2)++TJ;do{if(V=0,X=K(S,A,y,b),X<0){if(a=A[0],y!=b)a=a*U+(A[1]||0);if(V=a/TJ|0,V>1){if(V>=U)V=U-1;if(B=J(S,V,U),L=B.length,b=A.length,X=K(B,A,L,b),X==1)V--,$(B,y<L?YJ:S,L,U)}else{if(V==0)X=V=1;B=S.slice()}if(L=B.length,L<b)B.unshift(0);if($(A,B,b,U),X==-1){if(b=A.length,X=K(S,A,y,b),X<1)V++,$(A,y<b?YJ:S,b,U)}b=A.length}else if(X===0)V++,A=[0];if(p[R++]=V,X&&A[0])A[b++]=g[HJ]||0;else A=[g[HJ]],b=1}while((HJ++<r||A[0]!==void 0)&&D--);T=A[0]!==void 0}if(!p[0])p.shift()}if(z==1)M.e=q,lJ=T;else{for(R=1,V=p[0];V>=10;V/=10)R++;M.e=R+q*z-1,N(M,F?Y+M.e+1:Y,W,T)}return M}}();function N(J,K,$,Q){var H,Y,W,F,U,X,q,R,V,z=J.constructor;J:if(K!=null){if(R=J.d,!R)return J;for(H=1,F=R[0];F>=10;F/=10)H++;if(Y=K-H,Y<0)Y+=_,W=K,q=R[V=0],U=q/f(10,H-W-1)%10|0;else if(V=Math.ceil((Y+1)/_),F=R.length,V>=F)if(Q){for(;F++<=V;)R.push(0);q=U=0,H=1,Y%=_,W=Y-_+1}else break J;else{q=F=R[V];for(H=1;F>=10;F/=10)H++;Y%=_,W=Y-_+H,U=W<0?0:q/f(10,H-W-1)%10|0}if(Q=Q||K<0||R[V+1]!==void 0||(W<0?q:q%f(10,H-W-1)),X=$<4?(U||Q)&&($==0||$==(J.s<0?3:2)):U>5||U==5&&($==4||Q||$==6&&(Y>0?W>0?q/f(10,H-W):0:R[V-1])%10&1||$==(J.s<0?8:7)),K<1||!R[0]){if(R.length=0,X)K-=J.e+1,R[0]=f(10,(_-K%_)%_),J.e=-K||0;else R[0]=J.e=0;return J}if(Y==0)R.length=V,F=1,V--;else R.length=V+1,F=f(10,_-Y),R[V]=W>0?(q/f(10,H-W)%f(10,W)|0)*F:0;if(X)for(;;)if(V==0){for(Y=1,W=R[0];W>=10;W/=10)Y++;W=R[0]+=F;for(F=1;W>=10;W/=10)F++;if(Y!=F){if(J.e++,R[0]==c)R[0]=1}break}else{if(R[V]+=F,R[V]!=c)break;R[V--]=0,F=1}for(Y=R.length;R[--Y]===0;)R.pop()}if(O){if(J.e>z.maxE)J.d=null,J.e=NaN;else if(J.e<z.minE)J.e=0,J.d=[0]}return J}function d(J,K,$){if(!J.isFinite())return iJ(J);var Q,H=J.e,Y=k(J.d),W=Y.length;if(K){if($&&(Q=$-W)>0)Y=Y.charAt(0)+"."+Y.slice(1)+m(Q);else if(W>1)Y=Y.charAt(0)+"."+Y.slice(1);Y=Y+(J.e<0?"e":"e+")+J.e}else if(H<0){if(Y="0."+m(-H-1)+Y,$&&(Q=$-W)>0)Y+=m(Q)}else if(H>=W){if(Y+=m(H+1-W),$&&(Q=$-H-1)>0)Y=Y+"."+m(Q)}else{if((Q=H+1)<W)Y=Y.slice(0,Q)+"."+Y.slice(Q);if($&&(Q=$-W)>0){if(H+1===W)Y+=".";Y+=m(Q)}}return Y}function VJ(J,K){var $=J[0];for(K*=_;$>=10;$/=10)K++;return K}function qJ(J,K,$){if(K>OK){if(O=!0,$)J.precision=$;throw Error(dJ)}return N(new J(XJ),K,1,!0)}function l(J,K,$){if(K>MJ)throw Error(dJ);return N(new J(UJ),K,$,!0)}function oJ(J){var K=J.length-1,$=K*_+1;if(K=J[K],K){for(;K%10==0;K/=10)$--;for(K=J[0];K>=10;K/=10)$++}return $}function m(J){var K="";for(;J--;)K+="0";return K}function xJ(J,K,$,Q){var H,Y=new J(1),W=Math.ceil(Q/_+4);O=!1;for(;;){if($%2){if(Y=Y.times(K),yJ(Y.d,W))H=!0}if($=C($/2),$===0){if($=Y.d.length-1,H&&Y.d[$]===0)++Y.d[$];break}K=K.times(K),yJ(K.d,W)}return O=!0,Y}function DJ(J){return J.d[J.d.length-1]&1}function aJ(J,K,$){var Q,H,Y=new J(K[0]),W=0;for(;++W<K.length;){if(H=new J(K[W]),!H.s){Y=H;break}if(Q=Y.cmp(H),Q===$||Q===0&&Y.s===$)Y=H}return Y}function PJ(J,K){var $,Q,H,Y,W,F,U,X=0,q=0,R=0,V=J.constructor,z=V.rounding,T=V.precision;if(!J.d||!J.d[0]||J.e>17)return new V(J.d?!J.d[0]?1:J.s<0?0:1/0:J.s?J.s<0?0:J:NaN);if(K==null)O=!1,U=T;else U=K;F=new V(0.03125);while(J.e>-2)J=J.times(F),R+=5;Q=Math.log(f(2,R))/Math.LN10*2+5|0,U+=Q,$=Y=W=new V(1),V.precision=U;for(;;){if(Y=N(Y.times(J),U,1),$=$.times(++q),F=W.plus(w(Y,$,U,1)),k(F.d).slice(0,U)===k(W.d).slice(0,U)){H=R;while(H--)W=N(W.times(W),U,1);if(K==null)if(X<3&&JJ(W.d,U-Q,z,X))V.precision=U+=10,$=Y=F=new V(1),q=0,X++;else return N(W,V.precision=T,z,O=!0);else return V.precision=T,W}W=F}}function s(J,K){var $,Q,H,Y,W,F,U,X,q,R,V,z=1,T=10,B=J,L=B.d,M=B.constructor,p=M.rounding,A=M.precision;if(B.s<0||!L||!L[0]||!B.e&&L[0]==1&&L.length==1)return new M(L&&!L[0]?-1/0:B.s!=1?NaN:L?0:B);if(K==null)O=!1,q=A;else q=K;if(M.precision=q+=T,$=k(L),Q=$.charAt(0),Math.abs(Y=B.e)<1500000000000000){while(Q<7&&Q!=1||Q==1&&$.charAt(1)>3)B=B.times(J),$=k(B.d),Q=$.charAt(0),z++;if(Y=B.e,Q>1)B=new M("0."+$),Y++;else B=new M(Q+"."+$.slice(1))}else return X=qJ(M,q+2,A).times(Y+""),B=s(new M(Q+"."+$.slice(1)),q-T).plus(X),M.precision=A,K==null?N(B,A,p,O=!0):B;R=B,U=W=B=w(B.minus(1),B.plus(1),q,1),V=N(B.times(B),q,1),H=3;for(;;){if(W=N(W.times(V),q,1),X=U.plus(w(W,new M(H),q,1)),k(X.d).slice(0,q)===k(U.d).slice(0,q)){if(U=U.times(2),Y!==0)U=U.plus(qJ(M,q+2,A).times(Y+""));if(U=w(U,new M(z),q,1),K==null)if(JJ(U.d,q-T,p,F))M.precision=q+=T,X=W=B=w(R.minus(1),R.plus(1),q,1),V=N(B.times(B),q,1),H=F=1;else return N(U,M.precision=A,p,O=!0);else return M.precision=A,U}U=X,H+=2}}function iJ(J){return String(J.s*J.s/0)}function ZJ(J,K){var $,Q,H;if(($=K.indexOf("."))>-1)K=K.replace(".","");if((Q=K.search(/e/i))>0){if($<0)$=Q;$+=+K.slice(Q+1),K=K.substring(0,Q)}else if($<0)$=K.length;for(Q=0;K.charCodeAt(Q)===48;Q++);for(H=K.length;K.charCodeAt(H-1)===48;--H);if(K=K.slice(Q,H),K){if(H-=Q,J.e=$=$-Q-1,J.d=[],Q=($+1)%_,$<0)Q+=_;if(Q<H){if(Q)J.d.push(+K.slice(0,Q));for(H-=_;Q<H;)J.d.push(+K.slice(Q,Q+=_));K=K.slice(Q),Q=_-K.length}else Q-=H;for(;Q--;)K+="0";if(J.d.push(+K),O){if(J.e>J.constructor.maxE)J.d=null,J.e=NaN;else if(J.e<J.constructor.minE)J.e=0,J.d=[0]}}else J.e=0,J.d=[0];return J}function AK(J,K){var $,Q,H,Y,W,F,U,X,q;if(K.indexOf("_")>-1){if(K=K.replace(/(\d)_(?=\d)/g,"$1"),sJ.test(K))return ZJ(J,K)}else if(K==="Infinity"||K==="NaN"){if(!+K)J.s=NaN;return J.e=NaN,J.d=null,J}if(_K.test(K))$=16,K=K.toLowerCase();else if(IK.test(K))$=2;else if(BK.test(K))$=8;else throw Error(o+K);if(Y=K.search(/p/i),Y>0)U=+K.slice(Y+1),K=K.substring(2,Y);else K=K.slice(2);if(Y=K.indexOf("."),W=Y>=0,Q=J.constructor,W)K=K.replace(".",""),F=K.length,Y=F-Y,H=xJ(Q,new Q($),Y,Y*2);X=FJ(K,$,c),q=X.length-1;for(Y=q;X[Y]===0;--Y)X.pop();if(Y<0)return new Q(J.s*0);if(J.e=VJ(X,q),J.d=X,O=!1,W)J=w(J,H,F*4);if(U)J=J.times(Math.abs(U)<54?f(2,U):KJ.pow(2,U));return O=!0,J}function wK(J,K){var $,Q=K.d.length;if(Q<3)return K.isZero()?K:t(J,2,K,K);$=1.4*Math.sqrt(Q),$=$>16?16:$|0,K=K.times(1/GJ(5,$)),K=t(J,2,K,K);var H,Y=new J(5),W=new J(16),F=new J(20);for(;$--;)H=K.times(K),K=K.times(Y.plus(H.times(W.times(H).minus(F))));return K}function t(J,K,$,Q,H){var Y,W,F,U,X=1,q=J.precision,R=Math.ceil(q/_);O=!1,U=$.times($),F=new J(Q);for(;;){if(W=w(F.times(U),new J(K++*K++),q,1),F=H?Q.plus(W):Q.minus(W),Q=w(W.times(U),new J(K++*K++),q,1),W=F.plus(Q),W.d[R]!==void 0){for(Y=R;W.d[Y]===F.d[Y]&&Y--;);if(Y==-1)break}Y=F,F=Q,Q=W,W=Y,X++}return O=!0,W.d.length=R+1,W}function GJ(J,K){var $=J;while(--K)$*=J;return $}function tJ(J,K){var $,Q=K.s<0,H=l(J,J.precision,1),Y=H.times(0.5);if(K=K.abs(),K.lte(Y))return n=Q?4:1,K;if($=K.divToInt(H),$.isZero())n=Q?3:2;else{if(K=K.minus($.times(H)),K.lte(Y))return n=DJ($)?Q?2:3:Q?4:1,K;n=DJ($)?Q?1:4:Q?3:2}return K.minus(H).abs()}function fJ(J,K,$,Q){var H,Y,W,F,U,X,q,R,V,z=J.constructor,T=$!==void 0;if(T)if(v($,1,x),Q===void 0)Q=z.rounding;else v(Q,0,8);else $=z.precision,Q=z.rounding;if(!J.isFinite())q=iJ(J);else{if(q=d(J),W=q.indexOf("."),T){if(H=2,K==16)$=$*4-3;else if(K==8)$=$*3-2}else H=K;if(W>=0)q=q.replace(".",""),V=new z(1),V.e=q.length-W,V.d=FJ(d(V),10,H),V.e=V.d.length;R=FJ(q,10,H),Y=U=R.length;for(;R[--U]==0;)R.pop();if(!R[0])q=T?"0p+0":"0";else{if(W<0)Y--;else J=new z(J),J.d=R,J.e=Y,J=w(J,V,$,Q,0,H),R=J.d,Y=J.e,X=lJ;if(W=R[$],F=H/2,X=X||R[$+1]!==void 0,X=Q<4?(W!==void 0||X)&&(Q===0||Q===(J.s<0?3:2)):W>F||W===F&&(Q===4||X||Q===6&&R[$-1]&1||Q===(J.s<0?8:7)),R.length=$,X){for(;++R[--$]>H-1;)if(R[$]=0,!$)++Y,R.unshift(1)}for(U=R.length;!R[U-1];--U);for(W=0,q="";W<U;W++)q+=wJ.charAt(R[W]);if(T){if(U>1)if(K==16||K==8){W=K==16?4:3;for(--U;U%W;U++)q+="0";R=FJ(q,H,K);for(U=R.length;!R[U-1];--U);for(W=1,q="1.";W<U;W++)q+=wJ.charAt(R[W])}else q=q.charAt(0)+"."+q.slice(1);q=q+(Y<0?"p":"p+")+Y}else if(Y<0){for(;++Y;)q="0"+q;q="0."+q}else if(++Y>U)for(Y-=U;Y--;)q+="0";else if(Y<U)q=q.slice(0,Y)+"."+q.slice(Y)}q=(K==16?"0x":K==2?"0b":K==8?"0o":"")+q}return J.s<0?"-"+q:q}function yJ(J,K){if(J.length>K)return J.length=K,!0}function SK(J){return new this(J).abs()}function MK(J){return new this(J).acos()}function PK(J){return new this(J).acosh()}function fK(J,K){return new this(J).plus(K)}function jK(J){return new this(J).asin()}function bK(J){return new this(J).asinh()}function LK(J){return new this(J).atan()}function kK(J){return new this(J).atanh()}function gK(J,K){J=new this(J),K=new this(K);var $,Q=this.precision,H=this.rounding,Y=Q+4;if(!J.s||!K.s)$=new this(NaN);else if(!J.d&&!K.d)$=l(this,Y,1).times(K.s>0?0.25:0.75),$.s=J.s;else if(!K.d||J.isZero())$=K.s<0?l(this,Q,H):new this(0),$.s=J.s;else if(!J.d||K.isZero())$=l(this,Y,1).times(0.5),$.s=J.s;else if(K.s<0)this.precision=Y,this.rounding=1,$=this.atan(w(J,K,Y,1)),K=l(this,Y,1),this.precision=Q,this.rounding=H,$=J.s<0?$.minus(K):$.plus(K);else $=this.atan(w(J,K,Y,1));return $}function CK(J){return new this(J).cbrt()}function hK(J){return N(J=new this(J),J.e+1,2)}function vK(J,K,$){return new this(J).clamp(K,$)}function uK(J){if(!J||typeof J!=="object")throw Error(RJ+"Object expected");var K,$,Q,H=J.defaults===!0,Y=["precision",1,x,"rounding",0,8,"toExpNeg",-i,0,"toExpPos",0,i,"maxE",0,i,"minE",-i,0,"modulo",0,9];for(K=0;K<Y.length;K+=3){if($=Y[K],H)this[$]=SJ[$];if((Q=J[$])!==void 0)if(C(Q)===Q&&Q>=Y[K+1]&&Q<=Y[K+2])this[$]=Q;else throw Error(o+$+": "+Q)}if($="crypto",H)this[$]=SJ[$];if((Q=J[$])!==void 0)if(Q===!0||Q===!1||Q===0||Q===1)if(Q)if(typeof crypto!="undefined"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))this[$]=!0;else throw Error(nJ);else this[$]=!1;else throw Error(o+$+": "+Q);return this}function pK(J){return new this(J).cos()}function DK(J){return new this(J).cosh()}function eJ(J){var K,$,Q;function H(Y){var W,F,U,X=this;if(!(X instanceof H))return new H(Y);if(X.constructor=H,cJ(Y)){if(X.s=Y.s,O)if(!Y.d||Y.e>H.maxE)X.e=NaN,X.d=null;else if(Y.e<H.minE)X.e=0,X.d=[0];else X.e=Y.e,X.d=Y.d.slice();else X.e=Y.e,X.d=Y.d?Y.d.slice():Y.d;return}if(U=typeof Y,U==="number"){if(Y===0){X.s=1/Y<0?-1:1,X.e=0,X.d=[0];return}if(Y<0)Y=-Y,X.s=-1;else X.s=1;if(Y===~~Y&&Y<1e7){for(W=0,F=Y;F>=10;F/=10)W++;if(O)if(W>H.maxE)X.e=NaN,X.d=null;else if(W<H.minE)X.e=0,X.d=[0];else X.e=W,X.d=[Y];else X.e=W,X.d=[Y];return}if(Y*0!==0){if(!Y)X.s=NaN;X.e=NaN,X.d=null;return}return ZJ(X,Y.toString())}if(U==="string"){if((F=Y.charCodeAt(0))===45)Y=Y.slice(1),X.s=-1;else{if(F===43)Y=Y.slice(1);X.s=1}return sJ.test(Y)?ZJ(X,Y):AK(X,Y)}if(U==="bigint"){if(Y<0)Y=-Y,X.s=-1;else X.s=1;return ZJ(X,Y.toString())}throw Error(o+Y)}if(H.prototype=G,H.ROUND_UP=0,H.ROUND_DOWN=1,H.ROUND_CEIL=2,H.ROUND_FLOOR=3,H.ROUND_HALF_UP=4,H.ROUND_HALF_DOWN=5,H.ROUND_HALF_EVEN=6,H.ROUND_HALF_CEIL=7,H.ROUND_HALF_FLOOR=8,H.EUCLID=9,H.config=H.set=uK,H.clone=eJ,H.isDecimal=cJ,H.abs=SK,H.acos=MK,H.acosh=PK,H.add=fK,H.asin=jK,H.asinh=bK,H.atan=LK,H.atanh=kK,H.atan2=gK,H.cbrt=CK,H.ceil=hK,H.clamp=vK,H.cos=pK,H.cosh=DK,H.div=yK,H.exp=cK,H.floor=lK,H.hypot=dK,H.ln=nK,H.log=mK,H.log10=oK,H.log2=sK,H.max=xK,H.min=aK,H.mod=iK,H.mul=tK,H.pow=eK,H.random=rK,H.round=J$,H.sign=K$,H.sin=$$,H.sinh=Q$,H.sqrt=H$,H.sub=Y$,H.sum=W$,H.tan=F$,H.tanh=Z$,H.trunc=X$,J===void 0)J={};if(J){if(J.defaults!==!0){Q=["precision","rounding","toExpNeg","toExpPos","maxE","minE","modulo","crypto"];for(K=0;K<Q.length;)if(!J.hasOwnProperty($=Q[K++]))J[$]=this[$]}}return H.config(J),H}function yK(J,K){return new this(J).div(K)}function cK(J){return new this(J).exp()}function lK(J){return N(J=new this(J),J.e+1,3)}function dK(){var J,K,$=new this(0);O=!1;for(J=0;J<arguments.length;)if(K=new this(arguments[J++]),!K.d){if(K.s)return O=!0,new this(1/0);$=K}else if($.d)$=$.plus(K.times(K));return O=!0,$.sqrt()}function cJ(J){return J instanceof KJ||J&&J.toStringTag===mJ||!1}function nK(J){return new this(J).ln()}function mK(J,K){return new this(J).log(K)}function sK(J){return new this(J).log(2)}function oK(J){return new this(J).log(10)}function xK(){return aJ(this,arguments,-1)}function aK(){return aJ(this,arguments,1)}function iK(J,K){return new this(J).mod(K)}function tK(J,K){return new this(J).mul(K)}function eK(J,K){return new this(J).pow(K)}function rK(J){var K,$,Q,H,Y=0,W=new this(1),F=[];if(J===void 0)J=this.precision;else v(J,1,x);if(Q=Math.ceil(J/_),!this.crypto)for(;Y<Q;)F[Y++]=Math.random()*1e7|0;else if(crypto.getRandomValues){K=crypto.getRandomValues(new Uint32Array(Q));for(;Y<Q;)if(H=K[Y],H>=4290000000)K[Y]=crypto.getRandomValues(new Uint32Array(1))[0];else F[Y++]=H%1e7}else if(crypto.randomBytes){K=crypto.randomBytes(Q*=4);for(;Y<Q;)if(H=K[Y]+(K[Y+1]<<8)+(K[Y+2]<<16)+((K[Y+3]&127)<<24),H>=2140000000)crypto.randomBytes(4).copy(K,Y);else F.push(H%1e7),Y+=4;Y=Q/4}else throw Error(nJ);if(Q=F[--Y],J%=_,Q&&J)H=f(10,_-J),F[Y]=(Q/H|0)*H;for(;F[Y]===0;Y--)F.pop();if(Y<0)$=0,F=[0];else{$=-1;for(;F[0]===0;$-=_)F.shift();for(Q=1,H=F[0];H>=10;H/=10)Q++;if(Q<_)$-=_-Q}return W.e=$,W.d=F,W}function J$(J){return N(J=new this(J),J.e+1,this.rounding)}function K$(J){return J=new this(J),J.d?J.d[0]?J.s:0*J.s:J.s||NaN}function $$(J){return new this(J).sin()}function Q$(J){return new this(J).sinh()}function H$(J){return new this(J).sqrt()}function Y$(J,K){return new this(J).sub(K)}function W$(){var J=0,K=arguments,$=new this(K[J]);O=!1;for(;$.s&&++J<K.length;)$=$.plus(K[J]);return O=!0,N($,this.precision,this.rounding)}function F$(J){return new this(J).tan()}function Z$(J){return new this(J).tanh()}function X$(J){return N(J=new this(J),J.e+1,1)}G[Symbol.for("nodejs.util.inspect.custom")]=G.toString;G[Symbol.toStringTag]="Decimal";var KJ=G.constructor=eJ(SJ);XJ=new KJ(XJ);UJ=new KJ(UJ);var Z=KJ;var jJ=(J)=>{if(J===null||J===void 0)throw new Error(`Cannot convert ${J===null?"null":"undefined"} to Decimal`);if(J instanceof Z)return J;try{return new Z(J)}catch(K){throw new Error(`Invalid numeric value: ${K.message}`)}};class E{constructor(J){if(!Array.isArray(J))throw new Error("Vector requires array");if(J.length===0)throw new Error("Vector requires at least one component");try{this.data=J.map((K,$)=>{if(K===null||K===void 0)throw new Error(`Vector component at index ${$} is ${K===null?"null":"undefined"}`);return jJ(K)})}catch(K){throw new Error(`Vector constructor failed: ${K.message}`)}this.length=this.data.length}static from(J){if(J===null||J===void 0)throw new Error(`Vector.from: argument is ${J===null?"null":"undefined"}`);return new E(J)}clone(){return new E(this.data.map((J)=>new Z(J)))}toArray(){return this.data.slice()}toNumberArray(){return this.data.map((J)=>J.toNumber())}toStringArray(){return this.data.map((J)=>J.toString())}add(J){if(!J||!(J instanceof E))throw new Error("add: argument must be a Vector");if(this.length!==J.length)throw new Error(`add: dimension mismatch (${this.length} vs ${J.length})`);return new E(this.data.map((K,$)=>K.plus(J.data[$])))}sub(J){if(!J||!(J instanceof E))throw new Error("sub: argument must be a Vector");if(this.length!==J.length)throw new Error(`sub: dimension mismatch (${this.length} vs ${J.length})`);return new E(this.data.map((K,$)=>K.minus(J.data[$])))}scale(J){if(J===null||J===void 0)throw new Error(`scale: scalar is ${J===null?"null":"undefined"}`);let K;try{K=jJ(J)}catch($){throw new Error(`scale: invalid scalar - ${$.message}`)}return new E(this.data.map(($)=>$.mul(K)))}negate(){return new E(this.data.map((J)=>J.negated()))}dot(J){if(!J||!(J instanceof E))throw new Error("dot: argument must be a Vector");if(this.length!==J.length)throw new Error(`dot: dimension mismatch (${this.length} vs ${J.length})`);return this.data.reduce((K,$,Q)=>K.plus($.mul(J.data[Q])),new Z(0))}outer(J){if(!J||!(J instanceof E))throw new Error("outer: argument must be a Vector");if(this.length===0||J.length===0)throw new Error("outer: cannot compute outer product with empty vector");let K=this.length,$=J.length;return Array.from({length:K},(H,Y)=>Array.from({length:$},(W,F)=>this.data[Y].mul(J.data[F])))}cross(J){if(!J||!(J instanceof E))throw new Error("cross: argument must be a Vector");if(this.length!==3||J.length!==3)throw new Error(`cross: requires 3D vectors (got ${this.length}D and ${J.length}D)`);let[K,$,Q]=this.data,[H,Y,W]=J.data;return new E([$.mul(W).minus(Q.mul(Y)),Q.mul(H).minus(K.mul(W)),K.mul(Y).minus($.mul(H))])}norm(){let J=new Z(0);for(let K of this.data)J=J.plus(K.mul(K));return J.sqrt()}normalize(){let J=this.norm();if(J.isZero())throw new Error("Cannot normalize zero vector");return this.scale(new Z(1).div(J))}angleBetween(J){if(!J||!(J instanceof E))throw new Error("angleBetween: argument must be a Vector");if(this.length!==J.length)throw new Error(`angleBetween: dimension mismatch (${this.length} vs ${J.length})`);let K=this.dot(J),$=this.norm(),Q=J.norm();if($.isZero()||Q.isZero())throw new Error("angleBetween: angle with zero vector is undefined");let Y=K.div($.mul(Q)).toNumber(),W=Math.min(1,Math.max(-1,Y));return new Z(Math.acos(W))}projectOnto(J){if(!J||!(J instanceof E))throw new Error("projectOnto: argument must be a Vector");if(this.length!==J.length)throw new Error(`projectOnto: dimension mismatch (${this.length} vs ${J.length})`);let K=J.dot(J);if(K.isZero())throw new Error("projectOnto: cannot project onto zero vector");let $=this.dot(J).div(K);return J.scale($)}orthogonal(){if(this.norm().isZero())throw new Error("orthogonal: cannot find orthogonal vector to zero vector");if(this.length===2)return new E([this.data[1].negated(),this.data[0]]);for(let K=0;K<this.length;K++){let $=Array.from({length:this.length},(F,U)=>new Z(U===K?1:0)),Q=new E($),H=Q.projectOnto(this),Y=Q.sub(H);if(!Y.norm().isZero())return Y.normalize()}throw new Error("orthogonal: unable to find orthogonal vector (degenerate case)")}isOrthogonalTo(J){if(!J||!(J instanceof E))throw new Error("isOrthogonalTo: argument must be a Vector");if(this.length!==J.length)throw new Error(`isOrthogonalTo: dimension mismatch (${this.length} vs ${J.length})`);return this.dot(J).isZero()}distance(J){if(!J||!(J instanceof E))throw new Error("distance: argument must be a Vector");if(this.length!==J.length)throw new Error(`distance: dimension mismatch (${this.length} vs ${J.length})`);return this.sub(J).norm()}equals(J,K=0){if(!(J instanceof E))return!1;if(J.length!==this.length)return!1;if(K===null)throw new Error("equals: tolerance cannot be null");let $;try{if($=jJ(K),$.isNaN())throw new Error("equals: tolerance cannot be NaN");if($.isNegative())throw new Error("equals: tolerance must be non-negative")}catch(Q){throw new Error(`equals: invalid tolerance - ${Q.message}`)}for(let Q=0;Q<this.length;Q++)if(this.data[Q].minus(J.data[Q]).abs().greaterThan($))return!1;return!0}}var e=(J)=>{if(J==null)throw new Error("Cannot convert null or undefined to Decimal");return J instanceof Z?J:new Z(J)};class I{constructor(J){if(!Array.isArray(J)||J.length===0)throw new Error("Matrix requires non-empty 2D array");if(!Array.isArray(J[0])||J[0].length===0)throw new Error("Matrix rows must be non-empty arrays");let K=J[0].length;for(let $ of J)if(!Array.isArray($)||$.length!==K)throw new Error("All rows must have same length");this.data=J.map(($)=>$.map((Q)=>e(Q))),this.rows=J.length,this.cols=K}static from(J){return new I(J)}static zeros(J,K){if(!Number.isInteger(J)||J<=0)throw new Error("rows must be a positive integer");if(!Number.isInteger(K)||K<=0)throw new Error("cols must be a positive integer");let $=Array.from({length:J},()=>Array.from({length:K},()=>new Z(0)));return new I($)}static identity(J){if(!Number.isInteger(J)||J<=0)throw new Error("size must be a positive integer");let K=Array.from({length:J},($,Q)=>Array.from({length:J},(H,Y)=>Q===Y?new Z(1):new Z(0)));return new I(K)}clone(){return new I(this.data.map((J)=>J.map((K)=>new Z(K))))}toArrayOfStrings(){return this.data.map((J)=>J.map((K)=>K.toString()))}toNumberArray(){return this.data.map((J)=>J.map((K)=>K.toNumber()))}isSquare(){return this.rows===this.cols}applyToVector(J){let K;if(J instanceof E)K=J;else if(Array.isArray(J))K=E.from(J);else throw new Error("applyToVector expects Vector or array");if(this.cols!==K.length)throw new Error("shape mismatch: matrix cols must equal vector length");let $=[];for(let Q=0;Q<this.rows;Q++){let H=new Z(0);for(let Y=0;Y<this.cols;Y++)H=H.plus(this.data[Q][Y].mul(K.data[Y]));$.push(H)}return new E($)}add(J){if(J instanceof I){if(this.rows!==J.rows||this.cols!==J.cols)throw new Error("shape mismatch: matrices must have same dimensions");return new I(this.data.map((K,$)=>K.map((Q,H)=>Q.plus(J.data[$][H]))))}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.plus(K))))}}sub(J){if(J instanceof I){if(this.rows!==J.rows||this.cols!==J.cols)throw new Error("shape mismatch: matrices must have same dimensions");return new I(this.data.map((K,$)=>K.map((Q,H)=>Q.minus(J.data[$][H]))))}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.minus(K))))}}mul(J){if(J instanceof I){if(this.cols!==J.rows)throw new Error("shape mismatch: A.cols must equal B.rows for matrix multiplication");let K=Array.from({length:this.rows},()=>Array.from({length:J.cols},()=>new Z(0)));for(let $=0;$<this.rows;$++)for(let Q=0;Q<this.cols;Q++){let H=this.data[$][Q];if(H.isZero())continue;for(let Y=0;Y<J.cols;Y++)K[$][Y]=K[$][Y].plus(H.mul(J.data[Q][Y]))}return new I(K)}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.mul(K))))}}div(J){let K=e(J);if(K.isZero())throw new Error("Cannot divide by zero");return new I(this.data.map(($)=>$.map((Q)=>Q.div(K))))}negate(){return new I(this.data.map((J)=>J.map((K)=>K.negated())))}transpose(){let J=Array.from({length:this.cols},(K,$)=>Array.from({length:this.rows},(Q,H)=>new Z(this.data[H][$])));return new I(J)}trace(){if(!this.isSquare())throw new Error("Trace only defined for square matrices");let J=new Z(0);for(let K=0;K<this.rows;K++)J=J.plus(this.data[K][K]);return J}equals(J,K=0){if(!(J instanceof I))return!1;if(this.rows!==J.rows||this.cols!==J.cols)return!1;let $=e(K);if($.isNegative()||!$.isFinite())throw new Error("tolerance must be non-negative and finite");for(let Q=0;Q<this.rows;Q++)for(let H=0;H<this.cols;H++)if(this.data[Q][H].minus(J.data[Q][H]).abs().greaterThan($))return!1;return!0}lu(){if(!this.isSquare())throw new Error("LU decomposition requires square matrix");let J=this.rows,K=this.data.map((W)=>W.map((F)=>new Z(F))),$=Array.from({length:J},(W,F)=>F),Q=Array.from({length:J},()=>Array.from({length:J},()=>new Z(0)));for(let W=0;W<J;W++)Q[W][W]=new Z(1);for(let W=0;W<J;W++){let F=W,U=K[W][W].abs();for(let X=W+1;X<J;X++){let q=K[X][W].abs();if(q.greaterThan(U))U=q,F=X}if(K[F][W].isZero())throw new Error("Singular matrix: LU decomposition failed");if(F!==W){let X=K[W];K[W]=K[F],K[F]=X;let q=$[W];$[W]=$[F],$[F]=q;for(let R=0;R<W;R++){let V=Q[W][R];Q[W][R]=Q[F][R],Q[F][R]=V}}for(let X=W+1;X<J;X++){let q=K[X][W].div(K[W][W]);Q[X][W]=q;for(let R=W;R<J;R++)K[X][R]=K[X][R].minus(q.mul(K[W][R]))}}let H=Array.from({length:J},(W,F)=>Array.from({length:J},(U,X)=>X<F?new Z(0):K[F][X])),Y=I.zeros(J,J);for(let W=0;W<J;W++)Y.data[W][$[W]]=new Z(1);return{L:new I(Q),U:new I(H),P:Y}}determinant(){if(!this.isSquare())throw new Error("Determinant only defined for square matrices");let J=this.rows,{L:K,U:$,P:Q}=this.lu(),H=new Z(1);for(let F=0;F<J;F++)H=H.mul($.data[F][F]);let Y=[];for(let F=0;F<J;F++)for(let U=0;U<J;U++)if(Q.data[F][U].equals(1))Y.push(U);let W=0;for(let F=0;F<Y.length;F++)for(let U=F+1;U<Y.length;U++)if(Y[F]>Y[U])W++;if(W%2===1)H=H.negated();return H}inverse(){if(!this.isSquare())throw new Error("Inverse only defined for square matrices");let J=this.rows,K=Array.from({length:J},(Q,H)=>Array.from({length:2*J},(Y,W)=>W<J?new Z(this.data[H][W]):W-J===H?new Z(1):new Z(0)));for(let Q=0;Q<J;Q++){let H=Q,Y=K[Q][Q].abs();for(let F=Q+1;F<J;F++){let U=K[F][Q].abs();if(U.greaterThan(Y))Y=U,H=F}if(K[H][Q].isZero())throw new Error("Singular matrix: inverse does not exist");if(H!==Q){let F=K[Q];K[Q]=K[H],K[H]=F}let W=K[Q][Q];for(let F=0;F<2*J;F++)K[Q][F]=K[Q][F].div(W);for(let F=0;F<J;F++){if(F===Q)continue;let U=K[F][Q];if(U.isZero())continue;for(let X=0;X<2*J;X++)K[F][X]=K[F][X].minus(U.mul(K[Q][X]))}}let $=K.map((Q)=>Q.slice(J));return new I($)}solve(J){let K;if(J instanceof E)K=J;else if(Array.isArray(J))K=E.from(J);else throw new Error("b must be Vector or array");if(!this.isSquare())throw new Error("solve() only implemented for square matrices");let $=this.rows;if(K.length!==$)throw new Error("dimension mismatch: b length must equal matrix rows");let Q=Array.from({length:$},(Y,W)=>Array.from({length:$+1},(F,U)=>new Z(U<$?this.data[W][U]:K.data[W])));for(let Y=0;Y<$;Y++){let W=Y,F=Q[Y][Y].abs();for(let U=Y+1;U<$;U++){let X=Q[U][Y].abs();if(X.greaterThan(F))F=X,W=U}if(Q[W][Y].isZero())throw new Error("Singular matrix: no unique solution");if(W!==Y){let U=Q[Y];Q[Y]=Q[W],Q[W]=U}for(let U=Y+1;U<$;U++){let X=Q[U][Y].div(Q[Y][Y]);if(X.isZero())continue;for(let q=Y;q<$+1;q++)Q[U][q]=Q[U][q].minus(X.mul(Q[Y][q]))}}let H=Array.from({length:$},()=>new Z(0));for(let Y=$-1;Y>=0;Y--){if(Q[Y][Y].isZero())throw new Error("Zero diagonal element in back substitution: system is singular");let W=new Z(0);for(let F=Y+1;F<$;F++)W=W.plus(Q[Y][F].mul(H[F]));H[Y]=Q[Y][$].minus(W).div(Q[Y][Y])}return new E(H)}qr(){let J=this.rows,K=this.cols,$=this.data.map((Y)=>Y.map((W)=>new Z(W))),Q=I.identity(J).data;for(let Y=0;Y<Math.min(J,K);Y++){let W=[];for(let R=Y;R<J;R++)W.push($[R][Y]);let F=new Z(0);for(let R of W)F=F.plus(R.mul(R));if(F=F.sqrt(),F.isZero())continue;let U=W[0].isNegative()?new Z(-1):new Z(1),X=W.slice();X[0]=X[0].plus(U.mul(F));let q=new Z(0);for(let R of X)q=q.plus(R.mul(R));if(q=q.sqrt(),q.isZero())continue;for(let R=0;R<X.length;R++)X[R]=X[R].div(q);for(let R=Y;R<K;R++){let V=new Z(0);for(let z=0;z<X.length;z++)V=V.plus(X[z].mul($[Y+z][R]));for(let z=0;z<X.length;z++)$[Y+z][R]=$[Y+z][R].minus(new Z(2).mul(X[z]).mul(V))}for(let R=0;R<J;R++){let V=new Z(0);for(let z=0;z<X.length;z++)V=V.plus(X[z].mul(Q[Y+z][R]));for(let z=0;z<X.length;z++)Q[Y+z][R]=Q[Y+z][R].minus(new Z(2).mul(X[z]).mul(V))}}let H=Array.from({length:J},(Y,W)=>Array.from({length:K},(F,U)=>W<=U?$[W][U]:new Z(0)));return{Q:new I(Q).transpose(),R:new I(H)}}exp(J={}){let K=this.rows;if(!this.isSquare())throw new Error("Matrix exponential requires square matrix");let $=I.identity(K),Q=J.maxIter||120;if(!Number.isInteger(Q)||Q<=0)throw new Error("maxIter must be a positive integer");let H=new Z(J.tolerance||"1e-40");if(H.isNegative()||H.isZero()||!H.isFinite())throw new Error("tolerance must be positive and finite");let W=((R)=>{let V=new Z(0);for(let z=0;z<R.rows;z++){let T=new Z(0);for(let B=0;B<R.cols;B++)T=T.plus(R.data[z][B].abs());if(T.greaterThan(V))V=T}return V})(this),F=0;if(W.greaterThan(new Z(1))){let R=W.toNumber();if(!isFinite(R))throw new Error("Matrix norm too large for exponential computation");if(F=Math.max(0,Math.ceil(Math.log2(R))),F>50)throw new Error(`Matrix norm too large: requires ${F} scaling steps (max 50 allowed)`)}let U=this;if(F>0)U=this.mul(new Z(1).div(new Z(2).pow(F)));let X=$.clone(),q=$.clone();for(let R=1;R<Q;R++){X=X.mul(U).mul(new Z(1).div(R)),q=q.add(X);let V=new Z(0);for(let z=0;z<X.rows;z++)for(let T=0;T<X.cols;T++)V=V.plus(X.data[z][T].abs());if(V.lessThan(H))break}for(let R=0;R<F;R++)q=q.mul(q);return q}}var NJ={};AJ(NJ,{translation:()=>$J,stretchAlongAxis:()=>q$,skew:()=>LJ,scale:()=>bJ,rotateAroundPoint:()=>U$,rotate:()=>zJ,reflectY:()=>V$,reflectX:()=>R$,reflectOrigin:()=>G$,applyTransform:()=>kJ});var u=(J)=>{if(J instanceof Z){if(!J.isFinite())throw new Error(`Value must be finite (got ${J.toString()})`);return J}try{let K=new Z(J);if(!K.isFinite())throw new Error(`Value must be finite (got ${J})`);return K}catch(K){throw new Error(`Invalid numeric value: "${J}" (${K.message})`)}};function h(J,K){if(J===void 0||J===null)throw new Error(`${K} is required`);if(typeof J!=="number"&&typeof J!=="string"&&!(J instanceof Z))throw new Error(`${K} must be a number, string, or Decimal`);if(typeof J==="number"&&!isFinite(J))throw new Error(`${K} must be a finite number (got ${J})`);if(J instanceof Z&&!J.isFinite())throw new Error(`${K} must be a finite Decimal (got ${J.toString()})`)}function $J(J,K){return h(J,"tx"),h(K,"ty"),I.from([[new Z(1),new Z(0),u(J)],[new Z(0),new Z(1),u(K)],[new Z(0),new Z(0),new Z(1)]])}function bJ(J,K=null){if(h(J,"sx"),K!==null)h(K,"sy");let $=K===null?J:K,Q=u(J),H=u($);if(Q.isZero()||H.isZero())throw new Error("Scale factors cannot be zero (creates singular matrix)");return I.from([[Q,new Z(0),new Z(0)],[new Z(0),H,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function zJ(J){h(J,"theta");let $=u(J).toNumber(),Q=Math.PI,H=$-2*Q*Math.floor(($+Q)/(2*Q));if(!isFinite(H))throw new Error(`Angle normalization failed for theta=${J} (too large or invalid)`);let Y=new Z(Math.cos(H)),W=new Z(Math.sin(H));if(!Y.isFinite()||!W.isFinite())throw new Error(`Trigonometric computation failed for theta=${J} (produced non-finite values)`);return I.from([[Y,W.negated(),new Z(0)],[W,Y,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function U$(J,K,$){h(J,"theta"),h(K,"px"),h($,"py");let Q=u(K),H=u($);return $J(Q,H).mul(zJ(J)).mul($J(Q.negated(),H.negated()))}function LJ(J,K){h(J,"ax"),h(K,"ay");let $=u(J),Q=u(K);if(new Z(1).minus($.mul(Q)).lessThanOrEqualTo(0))throw new Error(`Skew parameters create singular or orientation-inverting matrix (ax*ay = ${$.mul(Q).toString()}, must be < 1)`);return I.from([[new Z(1),$,new Z(0)],[Q,new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function q$(J,K,$){h(J,"ux"),h(K,"uy"),h($,"k");let Q=u(J),H=u(K),Y=u($);if(Y.isZero())throw new Error("Stretch factor k cannot be zero (creates singular matrix)");let W=Q.mul(Q).plus(H.mul(H));if(W.isZero())throw new Error("Axis vector (ux, uy) cannot be zero");let F=W.minus(1).abs(),U=new Z(0.000001);if(F.greaterThan(U))throw new Error(`Axis vector (ux, uy) must be normalized (||u|| = 1). Current magnitude squared: ${W.toString()}, expected: 1. Use normalized vector: (${Q.div(W.sqrt()).toString()}, ${H.div(W.sqrt()).toString()})`);let X=new Z(1),q=Y.minus(X),R=X.plus(q.mul(Q.mul(Q))),V=q.mul(Q.mul(H)),z=q.mul(H.mul(Q)),T=X.plus(q.mul(H.mul(H)));return I.from([[R,V,new Z(0)],[z,T,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function kJ(J,K,$){if(!J||typeof J.mul!=="function")throw new Error("applyTransform: first argument must be a Matrix");if(!J.data||!Array.isArray(J.data)||J.data.length!==3||!J.data[0]||J.data[0].length!==3||!J.data[1]||J.data[1].length!==3||!J.data[2]||J.data[2].length!==3)throw new Error("applyTransform: matrix must be 3x3");h(K,"x"),h($,"y");let Q=I.from([[u(K)],[u($)],[new Z(1)]]),H=J.mul(Q);if(!H||!H.data||!Array.isArray(H.data)||H.data.length!==3||!H.data[0]||!H.data[0][0]||!H.data[1]||!H.data[1][0]||!H.data[2]||!H.data[2][0])throw new Error("applyTransform: matrix multiplication produced invalid result");let Y=H.data[0][0],W=H.data[1][0],F=H.data[2][0];if(F.isZero())throw new Error("applyTransform: perspective division by zero (invalid transformation matrix)");return[Y.div(F),W.div(F)]}function R$(){return I.from([[new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function V$(){return I.from([[new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function G$(){return I.from([[new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}var _J={};AJ(_J,{translation:()=>QJ,scale:()=>gJ,rotateZ:()=>vJ,rotateY:()=>hJ,rotateX:()=>CJ,rotateAroundPoint:()=>z$,rotateAroundAxis:()=>rJ,reflectYZ:()=>_$,reflectXZ:()=>I$,reflectXY:()=>N$,reflectOrigin:()=>B$,applyTransform:()=>uJ});var j=(J)=>{if(J instanceof Z)return J;try{let K=new Z(J);if(!K.isFinite())throw new Error(`Value must be finite, got ${J}`);return K}catch(K){throw new Error(`Invalid numeric value: ${J}`)}};function P(J,K){if(J===void 0||J===null)throw new Error(`${K} is required`);if(typeof J!=="number"&&typeof J!=="string"&&!(J instanceof Z))throw new Error(`${K} must be a number, string, or Decimal`)}function IJ(J){let K=J.toNumber();if(!Number.isFinite(K))throw new Error(`Angle must be finite, got ${J}`);if(Math.abs(K)<=6.283185307179586)return K;let $=6.283185307179586,Q=K%$;if(Q>$)Q-=$;else if(Q<-$)Q+=$;return Q}function QJ(J,K,$){return P(J,"tx"),P(K,"ty"),P($,"tz"),I.from([[new Z(1),new Z(0),new Z(0),j(J)],[new Z(0),new Z(1),new Z(0),j(K)],[new Z(0),new Z(0),new Z(1),j($)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function gJ(J,K=null,$=null){if(P(J,"sx"),K!==null)P(K,"sy");if($!==null)P($,"sz");let Q=K===null?J:K,H=$===null?J:$,Y=j(J),W=j(Q),F=j(H);if(Y.isZero()||W.isZero()||F.isZero());return I.from([[Y,new Z(0),new Z(0),new Z(0)],[new Z(0),W,new Z(0),new Z(0)],[new Z(0),new Z(0),F,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function CJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),Q,H.negated(),new Z(0)],[new Z(0),H,Q,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function hJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[Q,new Z(0),H,new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[H.negated(),new Z(0),Q,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function vJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[Q,H.negated(),new Z(0),new Z(0)],[H,Q,new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function rJ(J,K,$,Q){P(J,"ux"),P(K,"uy"),P($,"uz"),P(Q,"theta");let H=[j(J),j(K),j($)],Y=H[0].mul(H[0]).plus(H[1].mul(H[1])).plus(H[2].mul(H[2])).sqrt();if(Y.isZero())throw new Error("Rotation axis cannot be zero vector (ux=0, uy=0, uz=0)");H[0]=H[0].div(Y),H[1]=H[1].div(Y),H[2]=H[2].div(Y);let W=j(Q),F=IJ(W),U=new Z(Math.cos(F)),X=new Z(Math.sin(F)),q=new Z(1),R=H[0].mul(H[0]),V=H[1].mul(H[1]),z=H[2].mul(H[2]),T=R.plus(U.mul(q.minus(R))),B=H[0].mul(H[1]).mul(q.minus(U)).minus(H[2].mul(X)),L=H[0].mul(H[2]).mul(q.minus(U)).plus(H[1].mul(X)),M=H[1].mul(H[0]).mul(q.minus(U)).plus(H[2].mul(X)),p=V.plus(U.mul(q.minus(V))),A=H[1].mul(H[2]).mul(q.minus(U)).minus(H[0].mul(X)),b=H[2].mul(H[0]).mul(q.minus(U)).minus(H[1].mul(X)),a=H[2].mul(H[1]).mul(q.minus(U)).plus(H[0].mul(X)),D=z.plus(U.mul(q.minus(z)));return I.from([[T,B,L,new Z(0)],[M,p,A,new Z(0)],[b,a,D,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function z$(J,K,$,Q,H,Y,W){P(J,"ux"),P(K,"uy"),P($,"uz"),P(Q,"theta"),P(H,"px"),P(Y,"py"),P(W,"pz");let F=j(H),U=j(Y),X=j(W);return QJ(F,U,X).mul(rJ(J,K,$,Q)).mul(QJ(F.negated(),U.negated(),X.negated()))}function uJ(J,K,$,Q){if(!(J instanceof I))throw new Error("M must be a Matrix instance");if(J.rows!==4||J.cols!==4)throw new Error(`M must be a 4x4 matrix, got ${J.rows}x${J.cols}`);P(K,"x"),P($,"y"),P(Q,"z");let H=I.from([[j(K)],[j($)],[j(Q)],[new Z(1)]]),Y=J.mul(H),W=Y.data[0][0],F=Y.data[1][0],U=Y.data[2][0],X=Y.data[3][0];if(X.isZero())throw new Error("Perspective division by zero: transformation results in point at infinity");return[W.div(X),F.div(X),U.div(X)]}function N$(){return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function I$(){return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function _$(){return I.from([[new Z(-1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function B$(){return I.from([[new Z(-1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}Z.set({precision:80});var JK="1.3.0";var KK=$J,$K=zJ,QK=bJ,HK=LJ,YK=kJ,WK=QJ,FK=CJ,ZK=hJ,XK=vJ,UK=gJ,qK=uJ,RK={VERSION:JK,Decimal:Z,Matrix:I,Vector:E,Transforms2D:NJ,Transforms3D:_J,translate2D:KK,rotate2D:$K,scale2D:QK,skew2D:HK,applyTransform2D:YK,translate3D:WK,rotateX:FK,rotateY:ZK,rotateZ:XK,scale3D:UK,applyTransform3D:qK},O$=RK;if(typeof window!=="undefined")window.SVGMatrixLib=RK;})();
8
+ */var i=9000000000000000,x=1e9,wJ="0123456789abcdef",XJ="2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058",UJ="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789",SJ={precision:20,rounding:4,modulo:1,toExpNeg:-7,toExpPos:21,minE:-i,maxE:i,crypto:!1},lJ,n,O=!0,RJ="[DecimalError] ",o=RJ+"Invalid argument: ",dJ=RJ+"Precision limit exceeded",nJ=RJ+"crypto unavailable",mJ="[object Decimal]",C=Math.floor,f=Math.pow,IK=/^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i,_K=/^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i,BK=/^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i,sJ=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,c=1e7,_=7,TK=9007199254740991,OK=XJ.length-1,MJ=UJ.length-1,G={toStringTag:mJ};G.absoluteValue=G.abs=function(){var J=new this.constructor(this);if(J.s<0)J.s=1;return N(J)};G.ceil=function(){return N(new this.constructor(this),this.e+1,2)};G.clampedTo=G.clamp=function(J,K){var $,Q=this,H=Q.constructor;if(J=new H(J),K=new H(K),!J.s||!K.s)return new H(NaN);if(J.gt(K))throw Error(o+K);return $=Q.cmp(J),$<0?J:Q.cmp(K)>0?K:new H(Q)};G.comparedTo=G.cmp=function(J){var K,$,Q,H,Y=this,W=Y.d,F=(J=new Y.constructor(J)).d,U=Y.s,X=J.s;if(!W||!F)return!U||!X?NaN:U!==X?U:W===F?0:!W^U<0?1:-1;if(!W[0]||!F[0])return W[0]?U:F[0]?-X:0;if(U!==X)return U;if(Y.e!==J.e)return Y.e>J.e^U<0?1:-1;Q=W.length,H=F.length;for(K=0,$=Q<H?Q:H;K<$;++K)if(W[K]!==F[K])return W[K]>F[K]^U<0?1:-1;return Q===H?0:Q>H^U<0?1:-1};G.cosine=G.cos=function(){var J,K,$=this,Q=$.constructor;if(!$.d)return new Q(NaN);if(!$.d[0])return new Q(1);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max($.e,$.sd())+_,Q.rounding=1,$=EK(Q,tJ(Q,$)),Q.precision=J,Q.rounding=K,N(n==2||n==3?$.neg():$,J,K,!0)};G.cubeRoot=G.cbrt=function(){var J,K,$,Q,H,Y,W,F,U,X,q=this,R=q.constructor;if(!q.isFinite()||q.isZero())return new R(q);if(O=!1,Y=q.s*f(q.s*q,0.3333333333333333),!Y||Math.abs(Y)==1/0){if($=k(q.d),J=q.e,Y=(J-$.length+1)%3)$+=Y==1||Y==-2?"0":"00";if(Y=f($,0.3333333333333333),J=C((J+1)/3)-(J%3==(J<0?-1:2)),Y==1/0)$="5e"+J;else $=Y.toExponential(),$=$.slice(0,$.indexOf("e")+1)+J;Q=new R($),Q.s=q.s}else Q=new R(Y.toString());W=(J=R.precision)+3;for(;;)if(F=Q,U=F.times(F).times(F),X=U.plus(q),Q=w(X.plus(q).times(F),X.plus(U),W+2,1),k(F.d).slice(0,W)===($=k(Q.d)).slice(0,W))if($=$.slice(W-3,W+1),$=="9999"||!H&&$=="4999"){if(!H){if(N(F,J+1,0),F.times(F).times(F).eq(q)){Q=F;break}}W+=4,H=1}else{if(!+$||!+$.slice(1)&&$.charAt(0)=="5")N(Q,J+1,1),K=!Q.times(Q).times(Q).eq(q);break}return O=!0,N(Q,J,R.rounding,K)};G.decimalPlaces=G.dp=function(){var J,K=this.d,$=NaN;if(K){if(J=K.length-1,$=(J-C(this.e/_))*_,J=K[J],J)for(;J%10==0;J/=10)$--;if($<0)$=0}return $};G.dividedBy=G.div=function(J){return w(this,new this.constructor(J))};G.dividedToIntegerBy=G.divToInt=function(J){var K=this,$=K.constructor;return N(w(K,new $(J),0,1,1),$.precision,$.rounding)};G.equals=G.eq=function(J){return this.cmp(J)===0};G.floor=function(){return N(new this.constructor(this),this.e+1,3)};G.greaterThan=G.gt=function(J){return this.cmp(J)>0};G.greaterThanOrEqualTo=G.gte=function(J){var K=this.cmp(J);return K==1||K===0};G.hyperbolicCosine=G.cosh=function(){var J,K,$,Q,H,Y=this,W=Y.constructor,F=new W(1);if(!Y.isFinite())return new W(Y.s?1/0:NaN);if(Y.isZero())return F;if($=W.precision,Q=W.rounding,W.precision=$+Math.max(Y.e,Y.sd())+4,W.rounding=1,H=Y.d.length,H<32)J=Math.ceil(H/3),K=(1/GJ(4,J)).toString();else J=16,K="2.3283064365386962890625e-10";Y=t(W,1,Y.times(K),new W(1),!0);var U,X=J,q=new W(8);for(;X--;)U=Y.times(Y),Y=F.minus(U.times(q.minus(U.times(q))));return N(Y,W.precision=$,W.rounding=Q,!0)};G.hyperbolicSine=G.sinh=function(){var J,K,$,Q,H=this,Y=H.constructor;if(!H.isFinite()||H.isZero())return new Y(H);if(K=Y.precision,$=Y.rounding,Y.precision=K+Math.max(H.e,H.sd())+4,Y.rounding=1,Q=H.d.length,Q<3)H=t(Y,2,H,H,!0);else{J=1.4*Math.sqrt(Q),J=J>16?16:J|0,H=H.times(1/GJ(5,J)),H=t(Y,2,H,H,!0);var W,F=new Y(5),U=new Y(16),X=new Y(20);for(;J--;)W=H.times(H),H=H.times(F.plus(W.times(U.times(W).plus(X))))}return Y.precision=K,Y.rounding=$,N(H,K,$,!0)};G.hyperbolicTangent=G.tanh=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q($.s);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+7,Q.rounding=1,w($.sinh(),$.cosh(),Q.precision=J,Q.rounding=K)};G.inverseCosine=G.acos=function(){var J=this,K=J.constructor,$=J.abs().cmp(1),Q=K.precision,H=K.rounding;if($!==-1)return $===0?J.isNeg()?l(K,Q,H):new K(0):new K(NaN);if(J.isZero())return l(K,Q+4,H).times(0.5);return K.precision=Q+6,K.rounding=1,J=new K(1).minus(J).div(J.plus(1)).sqrt().atan(),K.precision=Q,K.rounding=H,J.times(2)};G.inverseHyperbolicCosine=G.acosh=function(){var J,K,$=this,Q=$.constructor;if($.lte(1))return new Q($.eq(1)?0:NaN);if(!$.isFinite())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max(Math.abs($.e),$.sd())+4,Q.rounding=1,O=!1,$=$.times($).minus(1).sqrt().plus($),O=!0,Q.precision=J,Q.rounding=K,$.ln()};G.inverseHyperbolicSine=G.asinh=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite()||$.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+2*Math.max(Math.abs($.e),$.sd())+6,Q.rounding=1,O=!1,$=$.times($).plus(1).sqrt().plus($),O=!0,Q.precision=J,Q.rounding=K,$.ln()};G.inverseHyperbolicTangent=G.atanh=function(){var J,K,$,Q,H=this,Y=H.constructor;if(!H.isFinite())return new Y(NaN);if(H.e>=0)return new Y(H.abs().eq(1)?H.s/0:H.isZero()?H:NaN);if(J=Y.precision,K=Y.rounding,Q=H.sd(),Math.max(Q,J)<2*-H.e-1)return N(new Y(H),J,K,!0);return Y.precision=$=Q-H.e,H=w(H.plus(1),new Y(1).minus(H),$+J,1),Y.precision=J+4,Y.rounding=1,H=H.ln(),Y.precision=J,Y.rounding=K,H.times(0.5)};G.inverseSine=G.asin=function(){var J,K,$,Q,H=this,Y=H.constructor;if(H.isZero())return new Y(H);if(K=H.abs().cmp(1),$=Y.precision,Q=Y.rounding,K!==-1){if(K===0)return J=l(Y,$+4,Q).times(0.5),J.s=H.s,J;return new Y(NaN)}return Y.precision=$+6,Y.rounding=1,H=H.div(new Y(1).minus(H.times(H)).sqrt().plus(1)).atan(),Y.precision=$,Y.rounding=Q,H.times(2)};G.inverseTangent=G.atan=function(){var J,K,$,Q,H,Y,W,F,U,X=this,q=X.constructor,R=q.precision,V=q.rounding;if(!X.isFinite()){if(!X.s)return new q(NaN);if(R+4<=MJ)return W=l(q,R+4,V).times(0.5),W.s=X.s,W}else if(X.isZero())return new q(X);else if(X.abs().eq(1)&&R+4<=MJ)return W=l(q,R+4,V).times(0.25),W.s=X.s,W;q.precision=F=R+10,q.rounding=1,$=Math.min(28,F/_+2|0);for(J=$;J;--J)X=X.div(X.times(X).plus(1).sqrt().plus(1));O=!1,K=Math.ceil(F/_),Q=1,U=X.times(X),W=new q(X),H=X;for(;J!==-1;)if(H=H.times(U),Y=W.minus(H.div(Q+=2)),H=H.times(U),W=Y.plus(H.div(Q+=2)),W.d[K]!==void 0)for(J=K;W.d[J]===Y.d[J]&&J--;);if($)W=W.times(2<<$-1);return O=!0,N(W,q.precision=R,q.rounding=V,!0)};G.isFinite=function(){return!!this.d};G.isInteger=G.isInt=function(){return!!this.d&&C(this.e/_)>this.d.length-2};G.isNaN=function(){return!this.s};G.isNegative=G.isNeg=function(){return this.s<0};G.isPositive=G.isPos=function(){return this.s>0};G.isZero=function(){return!!this.d&&this.d[0]===0};G.lessThan=G.lt=function(J){return this.cmp(J)<0};G.lessThanOrEqualTo=G.lte=function(J){return this.cmp(J)<1};G.logarithm=G.log=function(J){var K,$,Q,H,Y,W,F,U,X=this,q=X.constructor,R=q.precision,V=q.rounding,z=5;if(J==null)J=new q(10),K=!0;else{if(J=new q(J),$=J.d,J.s<0||!$||!$[0]||J.eq(1))return new q(NaN);K=J.eq(10)}if($=X.d,X.s<0||!$||!$[0]||X.eq(1))return new q($&&!$[0]?-1/0:X.s!=1?NaN:$?0:1/0);if(K)if($.length>1)Y=!0;else{for(H=$[0];H%10===0;)H/=10;Y=H!==1}if(O=!1,F=R+z,W=s(X,F),Q=K?qJ(q,F+10):s(J,F),U=w(W,Q,F,1),JJ(U.d,H=R,V))do if(F+=10,W=s(X,F),Q=K?qJ(q,F+10):s(J,F),U=w(W,Q,F,1),!Y){if(+k(U.d).slice(H+1,H+15)+1==100000000000000)U=N(U,R+1,0);break}while(JJ(U.d,H+=10,V));return O=!0,N(U,R,V)};G.minus=G.sub=function(J){var K,$,Q,H,Y,W,F,U,X,q,R,V,z=this,T=z.constructor;if(J=new T(J),!z.d||!J.d){if(!z.s||!J.s)J=new T(NaN);else if(z.d)J.s=-J.s;else J=new T(J.d||z.s!==J.s?z:NaN);return J}if(z.s!=J.s)return J.s=-J.s,z.plus(J);if(X=z.d,V=J.d,F=T.precision,U=T.rounding,!X[0]||!V[0]){if(V[0])J.s=-J.s;else if(X[0])J=new T(z);else return new T(U===3?-0:0);return O?N(J,F,U):J}if($=C(J.e/_),q=C(z.e/_),X=X.slice(),Y=q-$,Y){if(R=Y<0,R)K=X,Y=-Y,W=V.length;else K=V,$=q,W=X.length;if(Q=Math.max(Math.ceil(F/_),W)+2,Y>Q)Y=Q,K.length=1;K.reverse();for(Q=Y;Q--;)K.push(0);K.reverse()}else{if(Q=X.length,W=V.length,R=Q<W,R)W=Q;for(Q=0;Q<W;Q++)if(X[Q]!=V[Q]){R=X[Q]<V[Q];break}Y=0}if(R)K=X,X=V,V=K,J.s=-J.s;W=X.length;for(Q=V.length-W;Q>0;--Q)X[W++]=0;for(Q=V.length;Q>Y;){if(X[--Q]<V[Q]){for(H=Q;H&&X[--H]===0;)X[H]=c-1;--X[H],X[Q]+=c}X[Q]-=V[Q]}for(;X[--W]===0;)X.pop();for(;X[0]===0;X.shift())--$;if(!X[0])return new T(U===3?-0:0);return J.d=X,J.e=VJ(X,$),O?N(J,F,U):J};G.modulo=G.mod=function(J){var K,$=this,Q=$.constructor;if(J=new Q(J),!$.d||!J.s||J.d&&!J.d[0])return new Q(NaN);if(!J.d||$.d&&!$.d[0])return N(new Q($),Q.precision,Q.rounding);if(O=!1,Q.modulo==9)K=w($,J.abs(),0,3,1),K.s*=J.s;else K=w($,J,0,Q.modulo,1);return K=K.times(J),O=!0,$.minus(K)};G.naturalExponential=G.exp=function(){return PJ(this)};G.naturalLogarithm=G.ln=function(){return s(this)};G.negated=G.neg=function(){var J=new this.constructor(this);return J.s=-J.s,N(J)};G.plus=G.add=function(J){var K,$,Q,H,Y,W,F,U,X,q,R=this,V=R.constructor;if(J=new V(J),!R.d||!J.d){if(!R.s||!J.s)J=new V(NaN);else if(!R.d)J=new V(J.d||R.s===J.s?R:NaN);return J}if(R.s!=J.s)return J.s=-J.s,R.minus(J);if(X=R.d,q=J.d,F=V.precision,U=V.rounding,!X[0]||!q[0]){if(!q[0])J=new V(R);return O?N(J,F,U):J}if(Y=C(R.e/_),Q=C(J.e/_),X=X.slice(),H=Y-Q,H){if(H<0)$=X,H=-H,W=q.length;else $=q,Q=Y,W=X.length;if(Y=Math.ceil(F/_),W=Y>W?Y+1:W+1,H>W)H=W,$.length=1;$.reverse();for(;H--;)$.push(0);$.reverse()}if(W=X.length,H=q.length,W-H<0)H=W,$=q,q=X,X=$;for(K=0;H;)K=(X[--H]=X[H]+q[H]+K)/c|0,X[H]%=c;if(K)X.unshift(K),++Q;for(W=X.length;X[--W]==0;)X.pop();return J.d=X,J.e=VJ(X,Q),O?N(J,F,U):J};G.precision=G.sd=function(J){var K,$=this;if(J!==void 0&&J!==!!J&&J!==1&&J!==0)throw Error(o+J);if($.d){if(K=oJ($.d),J&&$.e+1>K)K=$.e+1}else K=NaN;return K};G.round=function(){var J=this,K=J.constructor;return N(new K(J),J.e+1,K.rounding)};G.sine=G.sin=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q(NaN);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+Math.max($.e,$.sd())+_,Q.rounding=1,$=wK(Q,tJ(Q,$)),Q.precision=J,Q.rounding=K,N(n>2?$.neg():$,J,K,!0)};G.squareRoot=G.sqrt=function(){var J,K,$,Q,H,Y,W=this,F=W.d,U=W.e,X=W.s,q=W.constructor;if(X!==1||!F||!F[0])return new q(!X||X<0&&(!F||F[0])?NaN:F?W:1/0);if(O=!1,X=Math.sqrt(+W),X==0||X==1/0){if(K=k(F),(K.length+U)%2==0)K+="0";if(X=Math.sqrt(K),U=C((U+1)/2)-(U<0||U%2),X==1/0)K="5e"+U;else K=X.toExponential(),K=K.slice(0,K.indexOf("e")+1)+U;Q=new q(K)}else Q=new q(X.toString());$=(U=q.precision)+3;for(;;)if(Y=Q,Q=Y.plus(w(W,Y,$+2,1)).times(0.5),k(Y.d).slice(0,$)===(K=k(Q.d)).slice(0,$))if(K=K.slice($-3,$+1),K=="9999"||!H&&K=="4999"){if(!H){if(N(Y,U+1,0),Y.times(Y).eq(W)){Q=Y;break}}$+=4,H=1}else{if(!+K||!+K.slice(1)&&K.charAt(0)=="5")N(Q,U+1,1),J=!Q.times(Q).eq(W);break}return O=!0,N(Q,U,q.rounding,J)};G.tangent=G.tan=function(){var J,K,$=this,Q=$.constructor;if(!$.isFinite())return new Q(NaN);if($.isZero())return new Q($);return J=Q.precision,K=Q.rounding,Q.precision=J+10,Q.rounding=1,$=$.sin(),$.s=1,$=w($,new Q(1).minus($.times($)).sqrt(),J+10,0),Q.precision=J,Q.rounding=K,N(n==2||n==4?$.neg():$,J,K,!0)};G.times=G.mul=function(J){var K,$,Q,H,Y,W,F,U,X,q=this,R=q.constructor,V=q.d,z=(J=new R(J)).d;if(J.s*=q.s,!V||!V[0]||!z||!z[0])return new R(!J.s||V&&!V[0]&&!z||z&&!z[0]&&!V?NaN:!V||!z?J.s/0:J.s*0);if($=C(q.e/_)+C(J.e/_),U=V.length,X=z.length,U<X)Y=V,V=z,z=Y,W=U,U=X,X=W;Y=[],W=U+X;for(Q=W;Q--;)Y.push(0);for(Q=X;--Q>=0;){K=0;for(H=U+Q;H>Q;)F=Y[H]+z[Q]*V[H-Q-1]+K,Y[H--]=F%c|0,K=F/c|0;Y[H]=(Y[H]+K)%c|0}for(;!Y[--W];)Y.pop();if(K)++$;else Y.shift();return J.d=Y,J.e=VJ(Y,$),O?N(J,R.precision,R.rounding):J};G.toBinary=function(J,K){return fJ(this,2,J,K)};G.toDecimalPlaces=G.toDP=function(J,K){var $=this,Q=$.constructor;if($=new Q($),J===void 0)return $;if(v(J,0,x),K===void 0)K=Q.rounding;else v(K,0,8);return N($,J+$.e+1,K)};G.toExponential=function(J,K){var $,Q=this,H=Q.constructor;if(J===void 0)$=d(Q,!0);else{if(v(J,0,x),K===void 0)K=H.rounding;else v(K,0,8);Q=N(new H(Q),J+1,K),$=d(Q,!0,J+1)}return Q.isNeg()&&!Q.isZero()?"-"+$:$};G.toFixed=function(J,K){var $,Q,H=this,Y=H.constructor;if(J===void 0)$=d(H);else{if(v(J,0,x),K===void 0)K=Y.rounding;else v(K,0,8);Q=N(new Y(H),J+H.e+1,K),$=d(Q,!1,J+Q.e+1)}return H.isNeg()&&!H.isZero()?"-"+$:$};G.toFraction=function(J){var K,$,Q,H,Y,W,F,U,X,q,R,V,z=this,T=z.d,B=z.constructor;if(!T)return new B(z);if(X=$=new B(1),Q=U=new B(0),K=new B(Q),Y=K.e=oJ(T)-z.e-1,W=Y%_,K.d[0]=f(10,W<0?_+W:W),J==null)J=Y>0?K:X;else{if(F=new B(J),!F.isInt()||F.lt(X))throw Error(o+F);J=F.gt(K)?Y>0?K:X:F}O=!1,F=new B(k(T)),q=B.precision,B.precision=Y=T.length*_*2;for(;;){if(R=w(F,K,0,1,1),H=$.plus(R.times(Q)),H.cmp(J)==1)break;$=Q,Q=H,H=X,X=U.plus(R.times(H)),U=H,H=K,K=F.minus(R.times(H)),F=H}return H=w(J.minus($),Q,0,1,1),U=U.plus(H.times(X)),$=$.plus(H.times(Q)),U.s=X.s=z.s,V=w(X,Q,Y,1).minus(z).abs().cmp(w(U,$,Y,1).minus(z).abs())<1?[X,Q]:[U,$],B.precision=q,O=!0,V};G.toHexadecimal=G.toHex=function(J,K){return fJ(this,16,J,K)};G.toNearest=function(J,K){var $=this,Q=$.constructor;if($=new Q($),J==null){if(!$.d)return $;J=new Q(1),K=Q.rounding}else{if(J=new Q(J),K===void 0)K=Q.rounding;else v(K,0,8);if(!$.d)return J.s?$:J;if(!J.d){if(J.s)J.s=$.s;return J}}if(J.d[0])O=!1,$=w($,J,0,K,1).times(J),O=!0,N($);else J.s=$.s,$=J;return $};G.toNumber=function(){return+this};G.toOctal=function(J,K){return fJ(this,8,J,K)};G.toPower=G.pow=function(J){var K,$,Q,H,Y,W,F=this,U=F.constructor,X=+(J=new U(J));if(!F.d||!J.d||!F.d[0]||!J.d[0])return new U(f(+F,X));if(F=new U(F),F.eq(1))return F;if(Q=U.precision,Y=U.rounding,J.eq(1))return N(F,Q,Y);if(K=C(J.e/_),K>=J.d.length-1&&($=X<0?-X:X)<=TK)return H=xJ(U,F,$,Q),J.s<0?new U(1).div(H):N(H,Q,Y);if(W=F.s,W<0){if(K<J.d.length-1)return new U(NaN);if((J.d[K]&1)==0)W=1;if(F.e==0&&F.d[0]==1&&F.d.length==1)return F.s=W,F}if($=f(+F,X),K=$==0||!isFinite($)?C(X*(Math.log("0."+k(F.d))/Math.LN10+F.e+1)):new U($+"").e,K>U.maxE+1||K<U.minE-1)return new U(K>0?W/0:0);if(O=!1,U.rounding=F.s=1,$=Math.min(12,(K+"").length),H=PJ(J.times(s(F,Q+$)),Q),H.d){if(H=N(H,Q+5,1),JJ(H.d,Q,Y)){if(K=Q+10,H=N(PJ(J.times(s(F,K+$)),K),K+5,1),+k(H.d).slice(Q+1,Q+15)+1==100000000000000)H=N(H,Q+1,0)}}return H.s=W,O=!0,U.rounding=Y,N(H,Q,Y)};G.toPrecision=function(J,K){var $,Q=this,H=Q.constructor;if(J===void 0)$=d(Q,Q.e<=H.toExpNeg||Q.e>=H.toExpPos);else{if(v(J,1,x),K===void 0)K=H.rounding;else v(K,0,8);Q=N(new H(Q),J,K),$=d(Q,J<=Q.e||Q.e<=H.toExpNeg,J)}return Q.isNeg()&&!Q.isZero()?"-"+$:$};G.toSignificantDigits=G.toSD=function(J,K){var $=this,Q=$.constructor;if(J===void 0)J=Q.precision,K=Q.rounding;else if(v(J,1,x),K===void 0)K=Q.rounding;else v(K,0,8);return N(new Q($),J,K)};G.toString=function(){var J=this,K=J.constructor,$=d(J,J.e<=K.toExpNeg||J.e>=K.toExpPos);return J.isNeg()&&!J.isZero()?"-"+$:$};G.truncated=G.trunc=function(){return N(new this.constructor(this),this.e+1,1)};G.valueOf=G.toJSON=function(){var J=this,K=J.constructor,$=d(J,J.e<=K.toExpNeg||J.e>=K.toExpPos);return J.isNeg()?"-"+$:$};function k(J){var K,$,Q,H=J.length-1,Y="",W=J[0];if(H>0){Y+=W;for(K=1;K<H;K++){if(Q=J[K]+"",$=_-Q.length,$)Y+=m($);Y+=Q}if(W=J[K],Q=W+"",$=_-Q.length,$)Y+=m($)}else if(W===0)return"0";for(;W%10===0;)W/=10;return Y+W}function v(J,K,$){if(J!==~~J||J<K||J>$)throw Error(o+J)}function JJ(J,K,$,Q){var H,Y,W,F;for(Y=J[0];Y>=10;Y/=10)--K;if(--K<0)K+=_,H=0;else H=Math.ceil((K+1)/_),K%=_;if(Y=f(10,_-K),F=J[H]%Y|0,Q==null)if(K<3){if(K==0)F=F/100|0;else if(K==1)F=F/10|0;W=$<4&&F==99999||$>3&&F==49999||F==50000||F==0}else W=($<4&&F+1==Y||$>3&&F+1==Y/2)&&(J[H+1]/Y/100|0)==f(10,K-2)-1||(F==Y/2||F==0)&&(J[H+1]/Y/100|0)==0;else if(K<4){if(K==0)F=F/1000|0;else if(K==1)F=F/100|0;else if(K==2)F=F/10|0;W=(Q||$<4)&&F==9999||!Q&&$>3&&F==4999}else W=((Q||$<4)&&F+1==Y||!Q&&$>3&&F+1==Y/2)&&(J[H+1]/Y/1000|0)==f(10,K-3)-1;return W}function FJ(J,K,$){var Q,H=[0],Y,W=0,F=J.length;for(;W<F;){for(Y=H.length;Y--;)H[Y]*=K;H[0]+=wJ.indexOf(J.charAt(W++));for(Q=0;Q<H.length;Q++)if(H[Q]>$-1){if(H[Q+1]===void 0)H[Q+1]=0;H[Q+1]+=H[Q]/$|0,H[Q]%=$}}return H.reverse()}function EK(J,K){var $,Q,H;if(K.isZero())return K;if(Q=K.d.length,Q<32)$=Math.ceil(Q/3),H=(1/GJ(4,$)).toString();else $=16,H="2.3283064365386962890625e-10";J.precision+=$,K=t(J,1,K.times(H),new J(1));for(var Y=$;Y--;){var W=K.times(K);K=W.times(W).minus(W).times(8).plus(1)}return J.precision-=$,K}var w=function(){function J(Q,H,Y){var W,F=0,U=Q.length;for(Q=Q.slice();U--;)W=Q[U]*H+F,Q[U]=W%Y|0,F=W/Y|0;if(F)Q.unshift(F);return Q}function K(Q,H,Y,W){var F,U;if(Y!=W)U=Y>W?1:-1;else for(F=U=0;F<Y;F++)if(Q[F]!=H[F]){U=Q[F]>H[F]?1:-1;break}return U}function $(Q,H,Y,W){var F=0;for(;Y--;)Q[Y]-=F,F=Q[Y]<H[Y]?1:0,Q[Y]=F*W+Q[Y]-H[Y];for(;!Q[0]&&Q.length>1;)Q.shift()}return function(Q,H,Y,W,F,U){var X,q,R,V,z,T,B,L,M,p,A,b,a,D,BJ,HJ,r,TJ,y,YJ,WJ=Q.constructor,OJ=Q.s==H.s?1:-1,g=Q.d,S=H.d;if(!g||!g[0]||!S||!S[0])return new WJ(!Q.s||!H.s||(g?S&&g[0]==S[0]:!S)?NaN:g&&g[0]==0||!S?OJ*0:OJ/0);if(U)z=1,q=Q.e-H.e;else U=c,z=_,q=C(Q.e/z)-C(H.e/z);y=S.length,r=g.length,M=new WJ(OJ),p=M.d=[];for(R=0;S[R]==(g[R]||0);R++);if(S[R]>(g[R]||0))q--;if(Y==null)D=Y=WJ.precision,W=WJ.rounding;else if(F)D=Y+(Q.e-H.e)+1;else D=Y;if(D<0)p.push(1),T=!0;else{if(D=D/z+2|0,R=0,y==1){V=0,S=S[0],D++;for(;(R<r||V)&&D--;R++)BJ=V*U+(g[R]||0),p[R]=BJ/S|0,V=BJ%S|0;T=V||R<r}else{if(V=U/(S[0]+1)|0,V>1)S=J(S,V,U),g=J(g,V,U),y=S.length,r=g.length;HJ=y,A=g.slice(0,y),b=A.length;for(;b<y;)A[b++]=0;if(YJ=S.slice(),YJ.unshift(0),TJ=S[0],S[1]>=U/2)++TJ;do{if(V=0,X=K(S,A,y,b),X<0){if(a=A[0],y!=b)a=a*U+(A[1]||0);if(V=a/TJ|0,V>1){if(V>=U)V=U-1;if(B=J(S,V,U),L=B.length,b=A.length,X=K(B,A,L,b),X==1)V--,$(B,y<L?YJ:S,L,U)}else{if(V==0)X=V=1;B=S.slice()}if(L=B.length,L<b)B.unshift(0);if($(A,B,b,U),X==-1){if(b=A.length,X=K(S,A,y,b),X<1)V++,$(A,y<b?YJ:S,b,U)}b=A.length}else if(X===0)V++,A=[0];if(p[R++]=V,X&&A[0])A[b++]=g[HJ]||0;else A=[g[HJ]],b=1}while((HJ++<r||A[0]!==void 0)&&D--);T=A[0]!==void 0}if(!p[0])p.shift()}if(z==1)M.e=q,lJ=T;else{for(R=1,V=p[0];V>=10;V/=10)R++;M.e=R+q*z-1,N(M,F?Y+M.e+1:Y,W,T)}return M}}();function N(J,K,$,Q){var H,Y,W,F,U,X,q,R,V,z=J.constructor;J:if(K!=null){if(R=J.d,!R)return J;for(H=1,F=R[0];F>=10;F/=10)H++;if(Y=K-H,Y<0)Y+=_,W=K,q=R[V=0],U=q/f(10,H-W-1)%10|0;else if(V=Math.ceil((Y+1)/_),F=R.length,V>=F)if(Q){for(;F++<=V;)R.push(0);q=U=0,H=1,Y%=_,W=Y-_+1}else break J;else{q=F=R[V];for(H=1;F>=10;F/=10)H++;Y%=_,W=Y-_+H,U=W<0?0:q/f(10,H-W-1)%10|0}if(Q=Q||K<0||R[V+1]!==void 0||(W<0?q:q%f(10,H-W-1)),X=$<4?(U||Q)&&($==0||$==(J.s<0?3:2)):U>5||U==5&&($==4||Q||$==6&&(Y>0?W>0?q/f(10,H-W):0:R[V-1])%10&1||$==(J.s<0?8:7)),K<1||!R[0]){if(R.length=0,X)K-=J.e+1,R[0]=f(10,(_-K%_)%_),J.e=-K||0;else R[0]=J.e=0;return J}if(Y==0)R.length=V,F=1,V--;else R.length=V+1,F=f(10,_-Y),R[V]=W>0?(q/f(10,H-W)%f(10,W)|0)*F:0;if(X)for(;;)if(V==0){for(Y=1,W=R[0];W>=10;W/=10)Y++;W=R[0]+=F;for(F=1;W>=10;W/=10)F++;if(Y!=F){if(J.e++,R[0]==c)R[0]=1}break}else{if(R[V]+=F,R[V]!=c)break;R[V--]=0,F=1}for(Y=R.length;R[--Y]===0;)R.pop()}if(O){if(J.e>z.maxE)J.d=null,J.e=NaN;else if(J.e<z.minE)J.e=0,J.d=[0]}return J}function d(J,K,$){if(!J.isFinite())return iJ(J);var Q,H=J.e,Y=k(J.d),W=Y.length;if(K){if($&&(Q=$-W)>0)Y=Y.charAt(0)+"."+Y.slice(1)+m(Q);else if(W>1)Y=Y.charAt(0)+"."+Y.slice(1);Y=Y+(J.e<0?"e":"e+")+J.e}else if(H<0){if(Y="0."+m(-H-1)+Y,$&&(Q=$-W)>0)Y+=m(Q)}else if(H>=W){if(Y+=m(H+1-W),$&&(Q=$-H-1)>0)Y=Y+"."+m(Q)}else{if((Q=H+1)<W)Y=Y.slice(0,Q)+"."+Y.slice(Q);if($&&(Q=$-W)>0){if(H+1===W)Y+=".";Y+=m(Q)}}return Y}function VJ(J,K){var $=J[0];for(K*=_;$>=10;$/=10)K++;return K}function qJ(J,K,$){if(K>OK){if(O=!0,$)J.precision=$;throw Error(dJ)}return N(new J(XJ),K,1,!0)}function l(J,K,$){if(K>MJ)throw Error(dJ);return N(new J(UJ),K,$,!0)}function oJ(J){var K=J.length-1,$=K*_+1;if(K=J[K],K){for(;K%10==0;K/=10)$--;for(K=J[0];K>=10;K/=10)$++}return $}function m(J){var K="";for(;J--;)K+="0";return K}function xJ(J,K,$,Q){var H,Y=new J(1),W=Math.ceil(Q/_+4);O=!1;for(;;){if($%2){if(Y=Y.times(K),yJ(Y.d,W))H=!0}if($=C($/2),$===0){if($=Y.d.length-1,H&&Y.d[$]===0)++Y.d[$];break}K=K.times(K),yJ(K.d,W)}return O=!0,Y}function DJ(J){return J.d[J.d.length-1]&1}function aJ(J,K,$){var Q,H,Y=new J(K[0]),W=0;for(;++W<K.length;){if(H=new J(K[W]),!H.s){Y=H;break}if(Q=Y.cmp(H),Q===$||Q===0&&Y.s===$)Y=H}return Y}function PJ(J,K){var $,Q,H,Y,W,F,U,X=0,q=0,R=0,V=J.constructor,z=V.rounding,T=V.precision;if(!J.d||!J.d[0]||J.e>17)return new V(J.d?!J.d[0]?1:J.s<0?0:1/0:J.s?J.s<0?0:J:NaN);if(K==null)O=!1,U=T;else U=K;F=new V(0.03125);while(J.e>-2)J=J.times(F),R+=5;Q=Math.log(f(2,R))/Math.LN10*2+5|0,U+=Q,$=Y=W=new V(1),V.precision=U;for(;;){if(Y=N(Y.times(J),U,1),$=$.times(++q),F=W.plus(w(Y,$,U,1)),k(F.d).slice(0,U)===k(W.d).slice(0,U)){H=R;while(H--)W=N(W.times(W),U,1);if(K==null)if(X<3&&JJ(W.d,U-Q,z,X))V.precision=U+=10,$=Y=F=new V(1),q=0,X++;else return N(W,V.precision=T,z,O=!0);else return V.precision=T,W}W=F}}function s(J,K){var $,Q,H,Y,W,F,U,X,q,R,V,z=1,T=10,B=J,L=B.d,M=B.constructor,p=M.rounding,A=M.precision;if(B.s<0||!L||!L[0]||!B.e&&L[0]==1&&L.length==1)return new M(L&&!L[0]?-1/0:B.s!=1?NaN:L?0:B);if(K==null)O=!1,q=A;else q=K;if(M.precision=q+=T,$=k(L),Q=$.charAt(0),Math.abs(Y=B.e)<1500000000000000){while(Q<7&&Q!=1||Q==1&&$.charAt(1)>3)B=B.times(J),$=k(B.d),Q=$.charAt(0),z++;if(Y=B.e,Q>1)B=new M("0."+$),Y++;else B=new M(Q+"."+$.slice(1))}else return X=qJ(M,q+2,A).times(Y+""),B=s(new M(Q+"."+$.slice(1)),q-T).plus(X),M.precision=A,K==null?N(B,A,p,O=!0):B;R=B,U=W=B=w(B.minus(1),B.plus(1),q,1),V=N(B.times(B),q,1),H=3;for(;;){if(W=N(W.times(V),q,1),X=U.plus(w(W,new M(H),q,1)),k(X.d).slice(0,q)===k(U.d).slice(0,q)){if(U=U.times(2),Y!==0)U=U.plus(qJ(M,q+2,A).times(Y+""));if(U=w(U,new M(z),q,1),K==null)if(JJ(U.d,q-T,p,F))M.precision=q+=T,X=W=B=w(R.minus(1),R.plus(1),q,1),V=N(B.times(B),q,1),H=F=1;else return N(U,M.precision=A,p,O=!0);else return M.precision=A,U}U=X,H+=2}}function iJ(J){return String(J.s*J.s/0)}function ZJ(J,K){var $,Q,H;if(($=K.indexOf("."))>-1)K=K.replace(".","");if((Q=K.search(/e/i))>0){if($<0)$=Q;$+=+K.slice(Q+1),K=K.substring(0,Q)}else if($<0)$=K.length;for(Q=0;K.charCodeAt(Q)===48;Q++);for(H=K.length;K.charCodeAt(H-1)===48;--H);if(K=K.slice(Q,H),K){if(H-=Q,J.e=$=$-Q-1,J.d=[],Q=($+1)%_,$<0)Q+=_;if(Q<H){if(Q)J.d.push(+K.slice(0,Q));for(H-=_;Q<H;)J.d.push(+K.slice(Q,Q+=_));K=K.slice(Q),Q=_-K.length}else Q-=H;for(;Q--;)K+="0";if(J.d.push(+K),O){if(J.e>J.constructor.maxE)J.d=null,J.e=NaN;else if(J.e<J.constructor.minE)J.e=0,J.d=[0]}}else J.e=0,J.d=[0];return J}function AK(J,K){var $,Q,H,Y,W,F,U,X,q;if(K.indexOf("_")>-1){if(K=K.replace(/(\d)_(?=\d)/g,"$1"),sJ.test(K))return ZJ(J,K)}else if(K==="Infinity"||K==="NaN"){if(!+K)J.s=NaN;return J.e=NaN,J.d=null,J}if(_K.test(K))$=16,K=K.toLowerCase();else if(IK.test(K))$=2;else if(BK.test(K))$=8;else throw Error(o+K);if(Y=K.search(/p/i),Y>0)U=+K.slice(Y+1),K=K.substring(2,Y);else K=K.slice(2);if(Y=K.indexOf("."),W=Y>=0,Q=J.constructor,W)K=K.replace(".",""),F=K.length,Y=F-Y,H=xJ(Q,new Q($),Y,Y*2);X=FJ(K,$,c),q=X.length-1;for(Y=q;X[Y]===0;--Y)X.pop();if(Y<0)return new Q(J.s*0);if(J.e=VJ(X,q),J.d=X,O=!1,W)J=w(J,H,F*4);if(U)J=J.times(Math.abs(U)<54?f(2,U):KJ.pow(2,U));return O=!0,J}function wK(J,K){var $,Q=K.d.length;if(Q<3)return K.isZero()?K:t(J,2,K,K);$=1.4*Math.sqrt(Q),$=$>16?16:$|0,K=K.times(1/GJ(5,$)),K=t(J,2,K,K);var H,Y=new J(5),W=new J(16),F=new J(20);for(;$--;)H=K.times(K),K=K.times(Y.plus(H.times(W.times(H).minus(F))));return K}function t(J,K,$,Q,H){var Y,W,F,U,X=1,q=J.precision,R=Math.ceil(q/_);O=!1,U=$.times($),F=new J(Q);for(;;){if(W=w(F.times(U),new J(K++*K++),q,1),F=H?Q.plus(W):Q.minus(W),Q=w(W.times(U),new J(K++*K++),q,1),W=F.plus(Q),W.d[R]!==void 0){for(Y=R;W.d[Y]===F.d[Y]&&Y--;);if(Y==-1)break}Y=F,F=Q,Q=W,W=Y,X++}return O=!0,W.d.length=R+1,W}function GJ(J,K){var $=J;while(--K)$*=J;return $}function tJ(J,K){var $,Q=K.s<0,H=l(J,J.precision,1),Y=H.times(0.5);if(K=K.abs(),K.lte(Y))return n=Q?4:1,K;if($=K.divToInt(H),$.isZero())n=Q?3:2;else{if(K=K.minus($.times(H)),K.lte(Y))return n=DJ($)?Q?2:3:Q?4:1,K;n=DJ($)?Q?1:4:Q?3:2}return K.minus(H).abs()}function fJ(J,K,$,Q){var H,Y,W,F,U,X,q,R,V,z=J.constructor,T=$!==void 0;if(T)if(v($,1,x),Q===void 0)Q=z.rounding;else v(Q,0,8);else $=z.precision,Q=z.rounding;if(!J.isFinite())q=iJ(J);else{if(q=d(J),W=q.indexOf("."),T){if(H=2,K==16)$=$*4-3;else if(K==8)$=$*3-2}else H=K;if(W>=0)q=q.replace(".",""),V=new z(1),V.e=q.length-W,V.d=FJ(d(V),10,H),V.e=V.d.length;R=FJ(q,10,H),Y=U=R.length;for(;R[--U]==0;)R.pop();if(!R[0])q=T?"0p+0":"0";else{if(W<0)Y--;else J=new z(J),J.d=R,J.e=Y,J=w(J,V,$,Q,0,H),R=J.d,Y=J.e,X=lJ;if(W=R[$],F=H/2,X=X||R[$+1]!==void 0,X=Q<4?(W!==void 0||X)&&(Q===0||Q===(J.s<0?3:2)):W>F||W===F&&(Q===4||X||Q===6&&R[$-1]&1||Q===(J.s<0?8:7)),R.length=$,X){for(;++R[--$]>H-1;)if(R[$]=0,!$)++Y,R.unshift(1)}for(U=R.length;!R[U-1];--U);for(W=0,q="";W<U;W++)q+=wJ.charAt(R[W]);if(T){if(U>1)if(K==16||K==8){W=K==16?4:3;for(--U;U%W;U++)q+="0";R=FJ(q,H,K);for(U=R.length;!R[U-1];--U);for(W=1,q="1.";W<U;W++)q+=wJ.charAt(R[W])}else q=q.charAt(0)+"."+q.slice(1);q=q+(Y<0?"p":"p+")+Y}else if(Y<0){for(;++Y;)q="0"+q;q="0."+q}else if(++Y>U)for(Y-=U;Y--;)q+="0";else if(Y<U)q=q.slice(0,Y)+"."+q.slice(Y)}q=(K==16?"0x":K==2?"0b":K==8?"0o":"")+q}return J.s<0?"-"+q:q}function yJ(J,K){if(J.length>K)return J.length=K,!0}function SK(J){return new this(J).abs()}function MK(J){return new this(J).acos()}function PK(J){return new this(J).acosh()}function fK(J,K){return new this(J).plus(K)}function jK(J){return new this(J).asin()}function bK(J){return new this(J).asinh()}function LK(J){return new this(J).atan()}function kK(J){return new this(J).atanh()}function gK(J,K){J=new this(J),K=new this(K);var $,Q=this.precision,H=this.rounding,Y=Q+4;if(!J.s||!K.s)$=new this(NaN);else if(!J.d&&!K.d)$=l(this,Y,1).times(K.s>0?0.25:0.75),$.s=J.s;else if(!K.d||J.isZero())$=K.s<0?l(this,Q,H):new this(0),$.s=J.s;else if(!J.d||K.isZero())$=l(this,Y,1).times(0.5),$.s=J.s;else if(K.s<0)this.precision=Y,this.rounding=1,$=this.atan(w(J,K,Y,1)),K=l(this,Y,1),this.precision=Q,this.rounding=H,$=J.s<0?$.minus(K):$.plus(K);else $=this.atan(w(J,K,Y,1));return $}function CK(J){return new this(J).cbrt()}function hK(J){return N(J=new this(J),J.e+1,2)}function vK(J,K,$){return new this(J).clamp(K,$)}function uK(J){if(!J||typeof J!=="object")throw Error(RJ+"Object expected");var K,$,Q,H=J.defaults===!0,Y=["precision",1,x,"rounding",0,8,"toExpNeg",-i,0,"toExpPos",0,i,"maxE",0,i,"minE",-i,0,"modulo",0,9];for(K=0;K<Y.length;K+=3){if($=Y[K],H)this[$]=SJ[$];if((Q=J[$])!==void 0)if(C(Q)===Q&&Q>=Y[K+1]&&Q<=Y[K+2])this[$]=Q;else throw Error(o+$+": "+Q)}if($="crypto",H)this[$]=SJ[$];if((Q=J[$])!==void 0)if(Q===!0||Q===!1||Q===0||Q===1)if(Q)if(typeof crypto!="undefined"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))this[$]=!0;else throw Error(nJ);else this[$]=!1;else throw Error(o+$+": "+Q);return this}function pK(J){return new this(J).cos()}function DK(J){return new this(J).cosh()}function eJ(J){var K,$,Q;function H(Y){var W,F,U,X=this;if(!(X instanceof H))return new H(Y);if(X.constructor=H,cJ(Y)){if(X.s=Y.s,O)if(!Y.d||Y.e>H.maxE)X.e=NaN,X.d=null;else if(Y.e<H.minE)X.e=0,X.d=[0];else X.e=Y.e,X.d=Y.d.slice();else X.e=Y.e,X.d=Y.d?Y.d.slice():Y.d;return}if(U=typeof Y,U==="number"){if(Y===0){X.s=1/Y<0?-1:1,X.e=0,X.d=[0];return}if(Y<0)Y=-Y,X.s=-1;else X.s=1;if(Y===~~Y&&Y<1e7){for(W=0,F=Y;F>=10;F/=10)W++;if(O)if(W>H.maxE)X.e=NaN,X.d=null;else if(W<H.minE)X.e=0,X.d=[0];else X.e=W,X.d=[Y];else X.e=W,X.d=[Y];return}if(Y*0!==0){if(!Y)X.s=NaN;X.e=NaN,X.d=null;return}return ZJ(X,Y.toString())}if(U==="string"){if((F=Y.charCodeAt(0))===45)Y=Y.slice(1),X.s=-1;else{if(F===43)Y=Y.slice(1);X.s=1}return sJ.test(Y)?ZJ(X,Y):AK(X,Y)}if(U==="bigint"){if(Y<0)Y=-Y,X.s=-1;else X.s=1;return ZJ(X,Y.toString())}throw Error(o+Y)}if(H.prototype=G,H.ROUND_UP=0,H.ROUND_DOWN=1,H.ROUND_CEIL=2,H.ROUND_FLOOR=3,H.ROUND_HALF_UP=4,H.ROUND_HALF_DOWN=5,H.ROUND_HALF_EVEN=6,H.ROUND_HALF_CEIL=7,H.ROUND_HALF_FLOOR=8,H.EUCLID=9,H.config=H.set=uK,H.clone=eJ,H.isDecimal=cJ,H.abs=SK,H.acos=MK,H.acosh=PK,H.add=fK,H.asin=jK,H.asinh=bK,H.atan=LK,H.atanh=kK,H.atan2=gK,H.cbrt=CK,H.ceil=hK,H.clamp=vK,H.cos=pK,H.cosh=DK,H.div=yK,H.exp=cK,H.floor=lK,H.hypot=dK,H.ln=nK,H.log=mK,H.log10=oK,H.log2=sK,H.max=xK,H.min=aK,H.mod=iK,H.mul=tK,H.pow=eK,H.random=rK,H.round=J$,H.sign=K$,H.sin=$$,H.sinh=Q$,H.sqrt=H$,H.sub=Y$,H.sum=W$,H.tan=F$,H.tanh=Z$,H.trunc=X$,J===void 0)J={};if(J){if(J.defaults!==!0){Q=["precision","rounding","toExpNeg","toExpPos","maxE","minE","modulo","crypto"];for(K=0;K<Q.length;)if(!J.hasOwnProperty($=Q[K++]))J[$]=this[$]}}return H.config(J),H}function yK(J,K){return new this(J).div(K)}function cK(J){return new this(J).exp()}function lK(J){return N(J=new this(J),J.e+1,3)}function dK(){var J,K,$=new this(0);O=!1;for(J=0;J<arguments.length;)if(K=new this(arguments[J++]),!K.d){if(K.s)return O=!0,new this(1/0);$=K}else if($.d)$=$.plus(K.times(K));return O=!0,$.sqrt()}function cJ(J){return J instanceof KJ||J&&J.toStringTag===mJ||!1}function nK(J){return new this(J).ln()}function mK(J,K){return new this(J).log(K)}function sK(J){return new this(J).log(2)}function oK(J){return new this(J).log(10)}function xK(){return aJ(this,arguments,-1)}function aK(){return aJ(this,arguments,1)}function iK(J,K){return new this(J).mod(K)}function tK(J,K){return new this(J).mul(K)}function eK(J,K){return new this(J).pow(K)}function rK(J){var K,$,Q,H,Y=0,W=new this(1),F=[];if(J===void 0)J=this.precision;else v(J,1,x);if(Q=Math.ceil(J/_),!this.crypto)for(;Y<Q;)F[Y++]=Math.random()*1e7|0;else if(crypto.getRandomValues){K=crypto.getRandomValues(new Uint32Array(Q));for(;Y<Q;)if(H=K[Y],H>=4290000000)K[Y]=crypto.getRandomValues(new Uint32Array(1))[0];else F[Y++]=H%1e7}else if(crypto.randomBytes){K=crypto.randomBytes(Q*=4);for(;Y<Q;)if(H=K[Y]+(K[Y+1]<<8)+(K[Y+2]<<16)+((K[Y+3]&127)<<24),H>=2140000000)crypto.randomBytes(4).copy(K,Y);else F.push(H%1e7),Y+=4;Y=Q/4}else throw Error(nJ);if(Q=F[--Y],J%=_,Q&&J)H=f(10,_-J),F[Y]=(Q/H|0)*H;for(;F[Y]===0;Y--)F.pop();if(Y<0)$=0,F=[0];else{$=-1;for(;F[0]===0;$-=_)F.shift();for(Q=1,H=F[0];H>=10;H/=10)Q++;if(Q<_)$-=_-Q}return W.e=$,W.d=F,W}function J$(J){return N(J=new this(J),J.e+1,this.rounding)}function K$(J){return J=new this(J),J.d?J.d[0]?J.s:0*J.s:J.s||NaN}function $$(J){return new this(J).sin()}function Q$(J){return new this(J).sinh()}function H$(J){return new this(J).sqrt()}function Y$(J,K){return new this(J).sub(K)}function W$(){var J=0,K=arguments,$=new this(K[J]);O=!1;for(;$.s&&++J<K.length;)$=$.plus(K[J]);return O=!0,N($,this.precision,this.rounding)}function F$(J){return new this(J).tan()}function Z$(J){return new this(J).tanh()}function X$(J){return N(J=new this(J),J.e+1,1)}G[Symbol.for("nodejs.util.inspect.custom")]=G.toString;G[Symbol.toStringTag]="Decimal";var KJ=G.constructor=eJ(SJ);XJ=new KJ(XJ);UJ=new KJ(UJ);var Z=KJ;var jJ=(J)=>{if(J===null||J===void 0)throw new Error(`Cannot convert ${J===null?"null":"undefined"} to Decimal`);if(J instanceof Z)return J;try{return new Z(J)}catch(K){throw new Error(`Invalid numeric value: ${K.message}`)}};class E{constructor(J){if(!Array.isArray(J))throw new Error("Vector requires array");if(J.length===0)throw new Error("Vector requires at least one component");try{this.data=J.map((K,$)=>{if(K===null||K===void 0)throw new Error(`Vector component at index ${$} is ${K===null?"null":"undefined"}`);return jJ(K)})}catch(K){throw new Error(`Vector constructor failed: ${K.message}`)}this.length=this.data.length}static from(J){if(J===null||J===void 0)throw new Error(`Vector.from: argument is ${J===null?"null":"undefined"}`);return new E(J)}clone(){return new E(this.data.map((J)=>new Z(J)))}toArray(){return this.data.slice()}toNumberArray(){return this.data.map((J)=>J.toNumber())}toStringArray(){return this.data.map((J)=>J.toString())}add(J){if(!J||!(J instanceof E))throw new Error("add: argument must be a Vector");if(this.length!==J.length)throw new Error(`add: dimension mismatch (${this.length} vs ${J.length})`);return new E(this.data.map((K,$)=>K.plus(J.data[$])))}sub(J){if(!J||!(J instanceof E))throw new Error("sub: argument must be a Vector");if(this.length!==J.length)throw new Error(`sub: dimension mismatch (${this.length} vs ${J.length})`);return new E(this.data.map((K,$)=>K.minus(J.data[$])))}scale(J){if(J===null||J===void 0)throw new Error(`scale: scalar is ${J===null?"null":"undefined"}`);let K;try{K=jJ(J)}catch($){throw new Error(`scale: invalid scalar - ${$.message}`)}return new E(this.data.map(($)=>$.mul(K)))}negate(){return new E(this.data.map((J)=>J.negated()))}dot(J){if(!J||!(J instanceof E))throw new Error("dot: argument must be a Vector");if(this.length!==J.length)throw new Error(`dot: dimension mismatch (${this.length} vs ${J.length})`);return this.data.reduce((K,$,Q)=>K.plus($.mul(J.data[Q])),new Z(0))}outer(J){if(!J||!(J instanceof E))throw new Error("outer: argument must be a Vector");if(this.length===0||J.length===0)throw new Error("outer: cannot compute outer product with empty vector");let K=this.length,$=J.length;return Array.from({length:K},(H,Y)=>Array.from({length:$},(W,F)=>this.data[Y].mul(J.data[F])))}cross(J){if(!J||!(J instanceof E))throw new Error("cross: argument must be a Vector");if(this.length!==3||J.length!==3)throw new Error(`cross: requires 3D vectors (got ${this.length}D and ${J.length}D)`);let[K,$,Q]=this.data,[H,Y,W]=J.data;return new E([$.mul(W).minus(Q.mul(Y)),Q.mul(H).minus(K.mul(W)),K.mul(Y).minus($.mul(H))])}norm(){let J=new Z(0);for(let K of this.data)J=J.plus(K.mul(K));return J.sqrt()}normalize(){let J=this.norm();if(J.isZero())throw new Error("Cannot normalize zero vector");return this.scale(new Z(1).div(J))}angleBetween(J){if(!J||!(J instanceof E))throw new Error("angleBetween: argument must be a Vector");if(this.length!==J.length)throw new Error(`angleBetween: dimension mismatch (${this.length} vs ${J.length})`);let K=this.dot(J),$=this.norm(),Q=J.norm();if($.isZero()||Q.isZero())throw new Error("angleBetween: angle with zero vector is undefined");let Y=K.div($.mul(Q)).toNumber(),W=Math.min(1,Math.max(-1,Y));return new Z(Math.acos(W))}projectOnto(J){if(!J||!(J instanceof E))throw new Error("projectOnto: argument must be a Vector");if(this.length!==J.length)throw new Error(`projectOnto: dimension mismatch (${this.length} vs ${J.length})`);let K=J.dot(J);if(K.isZero())throw new Error("projectOnto: cannot project onto zero vector");let $=this.dot(J).div(K);return J.scale($)}orthogonal(){if(this.norm().isZero())throw new Error("orthogonal: cannot find orthogonal vector to zero vector");if(this.length===2)return new E([this.data[1].negated(),this.data[0]]);for(let K=0;K<this.length;K++){let $=Array.from({length:this.length},(F,U)=>new Z(U===K?1:0)),Q=new E($),H=Q.projectOnto(this),Y=Q.sub(H);if(!Y.norm().isZero())return Y.normalize()}throw new Error("orthogonal: unable to find orthogonal vector (degenerate case)")}isOrthogonalTo(J){if(!J||!(J instanceof E))throw new Error("isOrthogonalTo: argument must be a Vector");if(this.length!==J.length)throw new Error(`isOrthogonalTo: dimension mismatch (${this.length} vs ${J.length})`);return this.dot(J).isZero()}distance(J){if(!J||!(J instanceof E))throw new Error("distance: argument must be a Vector");if(this.length!==J.length)throw new Error(`distance: dimension mismatch (${this.length} vs ${J.length})`);return this.sub(J).norm()}equals(J,K=0){if(!(J instanceof E))return!1;if(J.length!==this.length)return!1;if(K===null)throw new Error("equals: tolerance cannot be null");let $;try{if($=jJ(K),$.isNaN())throw new Error("equals: tolerance cannot be NaN");if($.isNegative())throw new Error("equals: tolerance must be non-negative")}catch(Q){throw new Error(`equals: invalid tolerance - ${Q.message}`)}for(let Q=0;Q<this.length;Q++)if(this.data[Q].minus(J.data[Q]).abs().greaterThan($))return!1;return!0}}var e=(J)=>{if(J==null)throw new Error("Cannot convert null or undefined to Decimal");return J instanceof Z?J:new Z(J)};class I{constructor(J){if(!Array.isArray(J)||J.length===0)throw new Error("Matrix requires non-empty 2D array");if(!Array.isArray(J[0])||J[0].length===0)throw new Error("Matrix rows must be non-empty arrays");let K=J[0].length;for(let $ of J)if(!Array.isArray($)||$.length!==K)throw new Error("All rows must have same length");this.data=J.map(($)=>$.map((Q)=>e(Q))),this.rows=J.length,this.cols=K}static from(J){return new I(J)}static zeros(J,K){if(!Number.isInteger(J)||J<=0)throw new Error("rows must be a positive integer");if(!Number.isInteger(K)||K<=0)throw new Error("cols must be a positive integer");let $=Array.from({length:J},()=>Array.from({length:K},()=>new Z(0)));return new I($)}static identity(J){if(!Number.isInteger(J)||J<=0)throw new Error("size must be a positive integer");let K=Array.from({length:J},($,Q)=>Array.from({length:J},(H,Y)=>Q===Y?new Z(1):new Z(0)));return new I(K)}clone(){return new I(this.data.map((J)=>J.map((K)=>new Z(K))))}toArrayOfStrings(){return this.data.map((J)=>J.map((K)=>K.toString()))}toNumberArray(){return this.data.map((J)=>J.map((K)=>K.toNumber()))}isSquare(){return this.rows===this.cols}applyToVector(J){let K;if(J instanceof E)K=J;else if(Array.isArray(J))K=E.from(J);else throw new Error("applyToVector expects Vector or array");if(this.cols!==K.length)throw new Error("shape mismatch: matrix cols must equal vector length");let $=[];for(let Q=0;Q<this.rows;Q++){let H=new Z(0);for(let Y=0;Y<this.cols;Y++)H=H.plus(this.data[Q][Y].mul(K.data[Y]));$.push(H)}return new E($)}add(J){if(J instanceof I){if(this.rows!==J.rows||this.cols!==J.cols)throw new Error("shape mismatch: matrices must have same dimensions");return new I(this.data.map((K,$)=>K.map((Q,H)=>Q.plus(J.data[$][H]))))}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.plus(K))))}}sub(J){if(J instanceof I){if(this.rows!==J.rows||this.cols!==J.cols)throw new Error("shape mismatch: matrices must have same dimensions");return new I(this.data.map((K,$)=>K.map((Q,H)=>Q.minus(J.data[$][H]))))}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.minus(K))))}}mul(J){if(J instanceof I){if(this.cols!==J.rows)throw new Error("shape mismatch: A.cols must equal B.rows for matrix multiplication");let K=Array.from({length:this.rows},()=>Array.from({length:J.cols},()=>new Z(0)));for(let $=0;$<this.rows;$++)for(let Q=0;Q<this.cols;Q++){let H=this.data[$][Q];if(H.isZero())continue;for(let Y=0;Y<J.cols;Y++)K[$][Y]=K[$][Y].plus(H.mul(J.data[Q][Y]))}return new I(K)}else{let K=e(J);return new I(this.data.map(($)=>$.map((Q)=>Q.mul(K))))}}div(J){let K=e(J);if(K.isZero())throw new Error("Cannot divide by zero");return new I(this.data.map(($)=>$.map((Q)=>Q.div(K))))}negate(){return new I(this.data.map((J)=>J.map((K)=>K.negated())))}transpose(){let J=Array.from({length:this.cols},(K,$)=>Array.from({length:this.rows},(Q,H)=>new Z(this.data[H][$])));return new I(J)}trace(){if(!this.isSquare())throw new Error("Trace only defined for square matrices");let J=new Z(0);for(let K=0;K<this.rows;K++)J=J.plus(this.data[K][K]);return J}equals(J,K=0){if(!(J instanceof I))return!1;if(this.rows!==J.rows||this.cols!==J.cols)return!1;let $=e(K);if($.isNegative()||!$.isFinite())throw new Error("tolerance must be non-negative and finite");for(let Q=0;Q<this.rows;Q++)for(let H=0;H<this.cols;H++)if(this.data[Q][H].minus(J.data[Q][H]).abs().greaterThan($))return!1;return!0}lu(){if(!this.isSquare())throw new Error("LU decomposition requires square matrix");let J=this.rows,K=this.data.map((W)=>W.map((F)=>new Z(F))),$=Array.from({length:J},(W,F)=>F),Q=Array.from({length:J},()=>Array.from({length:J},()=>new Z(0)));for(let W=0;W<J;W++)Q[W][W]=new Z(1);for(let W=0;W<J;W++){let F=W,U=K[W][W].abs();for(let X=W+1;X<J;X++){let q=K[X][W].abs();if(q.greaterThan(U))U=q,F=X}if(K[F][W].isZero())throw new Error("Singular matrix: LU decomposition failed");if(F!==W){let X=K[W];K[W]=K[F],K[F]=X;let q=$[W];$[W]=$[F],$[F]=q;for(let R=0;R<W;R++){let V=Q[W][R];Q[W][R]=Q[F][R],Q[F][R]=V}}for(let X=W+1;X<J;X++){let q=K[X][W].div(K[W][W]);Q[X][W]=q;for(let R=W;R<J;R++)K[X][R]=K[X][R].minus(q.mul(K[W][R]))}}let H=Array.from({length:J},(W,F)=>Array.from({length:J},(U,X)=>X<F?new Z(0):K[F][X])),Y=I.zeros(J,J);for(let W=0;W<J;W++)Y.data[W][$[W]]=new Z(1);return{L:new I(Q),U:new I(H),P:Y}}determinant(){if(!this.isSquare())throw new Error("Determinant only defined for square matrices");let J=this.rows,{L:K,U:$,P:Q}=this.lu(),H=new Z(1);for(let F=0;F<J;F++)H=H.mul($.data[F][F]);let Y=[];for(let F=0;F<J;F++)for(let U=0;U<J;U++)if(Q.data[F][U].equals(1))Y.push(U);let W=0;for(let F=0;F<Y.length;F++)for(let U=F+1;U<Y.length;U++)if(Y[F]>Y[U])W++;if(W%2===1)H=H.negated();return H}inverse(){if(!this.isSquare())throw new Error("Inverse only defined for square matrices");let J=this.rows,K=Array.from({length:J},(Q,H)=>Array.from({length:2*J},(Y,W)=>W<J?new Z(this.data[H][W]):W-J===H?new Z(1):new Z(0)));for(let Q=0;Q<J;Q++){let H=Q,Y=K[Q][Q].abs();for(let F=Q+1;F<J;F++){let U=K[F][Q].abs();if(U.greaterThan(Y))Y=U,H=F}if(K[H][Q].isZero())throw new Error("Singular matrix: inverse does not exist");if(H!==Q){let F=K[Q];K[Q]=K[H],K[H]=F}let W=K[Q][Q];for(let F=0;F<2*J;F++)K[Q][F]=K[Q][F].div(W);for(let F=0;F<J;F++){if(F===Q)continue;let U=K[F][Q];if(U.isZero())continue;for(let X=0;X<2*J;X++)K[F][X]=K[F][X].minus(U.mul(K[Q][X]))}}let $=K.map((Q)=>Q.slice(J));return new I($)}solve(J){let K;if(J instanceof E)K=J;else if(Array.isArray(J))K=E.from(J);else throw new Error("b must be Vector or array");if(!this.isSquare())throw new Error("solve() only implemented for square matrices");let $=this.rows;if(K.length!==$)throw new Error("dimension mismatch: b length must equal matrix rows");let Q=Array.from({length:$},(Y,W)=>Array.from({length:$+1},(F,U)=>new Z(U<$?this.data[W][U]:K.data[W])));for(let Y=0;Y<$;Y++){let W=Y,F=Q[Y][Y].abs();for(let U=Y+1;U<$;U++){let X=Q[U][Y].abs();if(X.greaterThan(F))F=X,W=U}if(Q[W][Y].isZero())throw new Error("Singular matrix: no unique solution");if(W!==Y){let U=Q[Y];Q[Y]=Q[W],Q[W]=U}for(let U=Y+1;U<$;U++){let X=Q[U][Y].div(Q[Y][Y]);if(X.isZero())continue;for(let q=Y;q<$+1;q++)Q[U][q]=Q[U][q].minus(X.mul(Q[Y][q]))}}let H=Array.from({length:$},()=>new Z(0));for(let Y=$-1;Y>=0;Y--){if(Q[Y][Y].isZero())throw new Error("Zero diagonal element in back substitution: system is singular");let W=new Z(0);for(let F=Y+1;F<$;F++)W=W.plus(Q[Y][F].mul(H[F]));H[Y]=Q[Y][$].minus(W).div(Q[Y][Y])}return new E(H)}qr(){let J=this.rows,K=this.cols,$=this.data.map((Y)=>Y.map((W)=>new Z(W))),Q=I.identity(J).data;for(let Y=0;Y<Math.min(J,K);Y++){let W=[];for(let R=Y;R<J;R++)W.push($[R][Y]);let F=new Z(0);for(let R of W)F=F.plus(R.mul(R));if(F=F.sqrt(),F.isZero())continue;let U=W[0].isNegative()?new Z(-1):new Z(1),X=W.slice();X[0]=X[0].plus(U.mul(F));let q=new Z(0);for(let R of X)q=q.plus(R.mul(R));if(q=q.sqrt(),q.isZero())continue;for(let R=0;R<X.length;R++)X[R]=X[R].div(q);for(let R=Y;R<K;R++){let V=new Z(0);for(let z=0;z<X.length;z++)V=V.plus(X[z].mul($[Y+z][R]));for(let z=0;z<X.length;z++)$[Y+z][R]=$[Y+z][R].minus(new Z(2).mul(X[z]).mul(V))}for(let R=0;R<J;R++){let V=new Z(0);for(let z=0;z<X.length;z++)V=V.plus(X[z].mul(Q[Y+z][R]));for(let z=0;z<X.length;z++)Q[Y+z][R]=Q[Y+z][R].minus(new Z(2).mul(X[z]).mul(V))}}let H=Array.from({length:J},(Y,W)=>Array.from({length:K},(F,U)=>W<=U?$[W][U]:new Z(0)));return{Q:new I(Q).transpose(),R:new I(H)}}exp(J={}){let K=this.rows;if(!this.isSquare())throw new Error("Matrix exponential requires square matrix");let $=I.identity(K),Q=J.maxIter||120;if(!Number.isInteger(Q)||Q<=0)throw new Error("maxIter must be a positive integer");let H=new Z(J.tolerance||"1e-40");if(H.isNegative()||H.isZero()||!H.isFinite())throw new Error("tolerance must be positive and finite");let W=((R)=>{let V=new Z(0);for(let z=0;z<R.rows;z++){let T=new Z(0);for(let B=0;B<R.cols;B++)T=T.plus(R.data[z][B].abs());if(T.greaterThan(V))V=T}return V})(this),F=0;if(W.greaterThan(new Z(1))){let R=W.toNumber();if(!isFinite(R))throw new Error("Matrix norm too large for exponential computation");if(F=Math.max(0,Math.ceil(Math.log2(R))),F>50)throw new Error(`Matrix norm too large: requires ${F} scaling steps (max 50 allowed)`)}let U=this;if(F>0)U=this.mul(new Z(1).div(new Z(2).pow(F)));let X=$.clone(),q=$.clone();for(let R=1;R<Q;R++){X=X.mul(U).mul(new Z(1).div(R)),q=q.add(X);let V=new Z(0);for(let z=0;z<X.rows;z++)for(let T=0;T<X.cols;T++)V=V.plus(X.data[z][T].abs());if(V.lessThan(H))break}for(let R=0;R<F;R++)q=q.mul(q);return q}}var NJ={};AJ(NJ,{translation:()=>$J,stretchAlongAxis:()=>q$,skew:()=>LJ,scale:()=>bJ,rotateAroundPoint:()=>U$,rotate:()=>zJ,reflectY:()=>V$,reflectX:()=>R$,reflectOrigin:()=>G$,applyTransform:()=>kJ});var u=(J)=>{if(J instanceof Z){if(!J.isFinite())throw new Error(`Value must be finite (got ${J.toString()})`);return J}try{let K=new Z(J);if(!K.isFinite())throw new Error(`Value must be finite (got ${J})`);return K}catch(K){throw new Error(`Invalid numeric value: "${J}" (${K.message})`)}};function h(J,K){if(J===void 0||J===null)throw new Error(`${K} is required`);if(typeof J!=="number"&&typeof J!=="string"&&!(J instanceof Z))throw new Error(`${K} must be a number, string, or Decimal`);if(typeof J==="number"&&!isFinite(J))throw new Error(`${K} must be a finite number (got ${J})`);if(J instanceof Z&&!J.isFinite())throw new Error(`${K} must be a finite Decimal (got ${J.toString()})`)}function $J(J,K){return h(J,"tx"),h(K,"ty"),I.from([[new Z(1),new Z(0),u(J)],[new Z(0),new Z(1),u(K)],[new Z(0),new Z(0),new Z(1)]])}function bJ(J,K=null){if(h(J,"sx"),K!==null)h(K,"sy");let $=K===null?J:K,Q=u(J),H=u($);if(Q.isZero()||H.isZero())throw new Error("Scale factors cannot be zero (creates singular matrix)");return I.from([[Q,new Z(0),new Z(0)],[new Z(0),H,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function zJ(J){h(J,"theta");let $=u(J).toNumber(),Q=Math.PI,H=$-2*Q*Math.floor(($+Q)/(2*Q));if(!isFinite(H))throw new Error(`Angle normalization failed for theta=${J} (too large or invalid)`);let Y=new Z(Math.cos(H)),W=new Z(Math.sin(H));if(!Y.isFinite()||!W.isFinite())throw new Error(`Trigonometric computation failed for theta=${J} (produced non-finite values)`);return I.from([[Y,W.negated(),new Z(0)],[W,Y,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function U$(J,K,$){h(J,"theta"),h(K,"px"),h($,"py");let Q=u(K),H=u($);return $J(Q,H).mul(zJ(J)).mul($J(Q.negated(),H.negated()))}function LJ(J,K){h(J,"ax"),h(K,"ay");let $=u(J),Q=u(K);if(new Z(1).minus($.mul(Q)).lessThanOrEqualTo(0))throw new Error(`Skew parameters create singular or orientation-inverting matrix (ax*ay = ${$.mul(Q).toString()}, must be < 1)`);return I.from([[new Z(1),$,new Z(0)],[Q,new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function q$(J,K,$){h(J,"ux"),h(K,"uy"),h($,"k");let Q=u(J),H=u(K),Y=u($);if(Y.isZero())throw new Error("Stretch factor k cannot be zero (creates singular matrix)");let W=Q.mul(Q).plus(H.mul(H));if(W.isZero())throw new Error("Axis vector (ux, uy) cannot be zero");let F=W.minus(1).abs(),U=new Z(0.000001);if(F.greaterThan(U))throw new Error(`Axis vector (ux, uy) must be normalized (||u|| = 1). Current magnitude squared: ${W.toString()}, expected: 1. Use normalized vector: (${Q.div(W.sqrt()).toString()}, ${H.div(W.sqrt()).toString()})`);let X=new Z(1),q=Y.minus(X),R=X.plus(q.mul(Q.mul(Q))),V=q.mul(Q.mul(H)),z=q.mul(H.mul(Q)),T=X.plus(q.mul(H.mul(H)));return I.from([[R,V,new Z(0)],[z,T,new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function kJ(J,K,$){if(!J||typeof J.mul!=="function")throw new Error("applyTransform: first argument must be a Matrix");if(!J.data||!Array.isArray(J.data)||J.data.length!==3||!J.data[0]||J.data[0].length!==3||!J.data[1]||J.data[1].length!==3||!J.data[2]||J.data[2].length!==3)throw new Error("applyTransform: matrix must be 3x3");h(K,"x"),h($,"y");let Q=I.from([[u(K)],[u($)],[new Z(1)]]),H=J.mul(Q);if(!H||!H.data||!Array.isArray(H.data)||H.data.length!==3||!H.data[0]||!H.data[0][0]||!H.data[1]||!H.data[1][0]||!H.data[2]||!H.data[2][0])throw new Error("applyTransform: matrix multiplication produced invalid result");let Y=H.data[0][0],W=H.data[1][0],F=H.data[2][0];if(F.isZero())throw new Error("applyTransform: perspective division by zero (invalid transformation matrix)");return[Y.div(F),W.div(F)]}function R$(){return I.from([[new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function V$(){return I.from([[new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}function G$(){return I.from([[new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(1)]])}var _J={};AJ(_J,{translation:()=>QJ,scale:()=>gJ,rotateZ:()=>vJ,rotateY:()=>hJ,rotateX:()=>CJ,rotateAroundPoint:()=>z$,rotateAroundAxis:()=>rJ,reflectYZ:()=>_$,reflectXZ:()=>I$,reflectXY:()=>N$,reflectOrigin:()=>B$,applyTransform:()=>uJ});var j=(J)=>{if(J instanceof Z)return J;try{let K=new Z(J);if(!K.isFinite())throw new Error(`Value must be finite, got ${J}`);return K}catch(K){throw new Error(`Invalid numeric value: ${J}`)}};function P(J,K){if(J===void 0||J===null)throw new Error(`${K} is required`);if(typeof J!=="number"&&typeof J!=="string"&&!(J instanceof Z))throw new Error(`${K} must be a number, string, or Decimal`)}function IJ(J){let K=J.toNumber();if(!Number.isFinite(K))throw new Error(`Angle must be finite, got ${J}`);if(Math.abs(K)<=6.283185307179586)return K;let $=6.283185307179586,Q=K%$;if(Q>$)Q-=$;else if(Q<-$)Q+=$;return Q}function QJ(J,K,$){return P(J,"tx"),P(K,"ty"),P($,"tz"),I.from([[new Z(1),new Z(0),new Z(0),j(J)],[new Z(0),new Z(1),new Z(0),j(K)],[new Z(0),new Z(0),new Z(1),j($)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function gJ(J,K=null,$=null){if(P(J,"sx"),K!==null)P(K,"sy");if($!==null)P($,"sz");let Q=K===null?J:K,H=$===null?J:$,Y=j(J),W=j(Q),F=j(H);if(Y.isZero()||W.isZero()||F.isZero());return I.from([[Y,new Z(0),new Z(0),new Z(0)],[new Z(0),W,new Z(0),new Z(0)],[new Z(0),new Z(0),F,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function CJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),Q,H.negated(),new Z(0)],[new Z(0),H,Q,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function hJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[Q,new Z(0),H,new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[H.negated(),new Z(0),Q,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function vJ(J){P(J,"theta");let K=j(J),$=IJ(K),Q=new Z(Math.cos($)),H=new Z(Math.sin($));return I.from([[Q,H.negated(),new Z(0),new Z(0)],[H,Q,new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function rJ(J,K,$,Q){P(J,"ux"),P(K,"uy"),P($,"uz"),P(Q,"theta");let H=[j(J),j(K),j($)],Y=H[0].mul(H[0]).plus(H[1].mul(H[1])).plus(H[2].mul(H[2])).sqrt();if(Y.isZero())throw new Error("Rotation axis cannot be zero vector (ux=0, uy=0, uz=0)");H[0]=H[0].div(Y),H[1]=H[1].div(Y),H[2]=H[2].div(Y);let W=j(Q),F=IJ(W),U=new Z(Math.cos(F)),X=new Z(Math.sin(F)),q=new Z(1),R=H[0].mul(H[0]),V=H[1].mul(H[1]),z=H[2].mul(H[2]),T=R.plus(U.mul(q.minus(R))),B=H[0].mul(H[1]).mul(q.minus(U)).minus(H[2].mul(X)),L=H[0].mul(H[2]).mul(q.minus(U)).plus(H[1].mul(X)),M=H[1].mul(H[0]).mul(q.minus(U)).plus(H[2].mul(X)),p=V.plus(U.mul(q.minus(V))),A=H[1].mul(H[2]).mul(q.minus(U)).minus(H[0].mul(X)),b=H[2].mul(H[0]).mul(q.minus(U)).minus(H[1].mul(X)),a=H[2].mul(H[1]).mul(q.minus(U)).plus(H[0].mul(X)),D=z.plus(U.mul(q.minus(z)));return I.from([[T,B,L,new Z(0)],[M,p,A,new Z(0)],[b,a,D,new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function z$(J,K,$,Q,H,Y,W){P(J,"ux"),P(K,"uy"),P($,"uz"),P(Q,"theta"),P(H,"px"),P(Y,"py"),P(W,"pz");let F=j(H),U=j(Y),X=j(W);return QJ(F,U,X).mul(rJ(J,K,$,Q)).mul(QJ(F.negated(),U.negated(),X.negated()))}function uJ(J,K,$,Q){if(!(J instanceof I))throw new Error("M must be a Matrix instance");if(J.rows!==4||J.cols!==4)throw new Error(`M must be a 4x4 matrix, got ${J.rows}x${J.cols}`);P(K,"x"),P($,"y"),P(Q,"z");let H=I.from([[j(K)],[j($)],[j(Q)],[new Z(1)]]),Y=J.mul(H),W=Y.data[0][0],F=Y.data[1][0],U=Y.data[2][0],X=Y.data[3][0];if(X.isZero())throw new Error("Perspective division by zero: transformation results in point at infinity");return[W.div(X),F.div(X),U.div(X)]}function N$(){return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function I$(){return I.from([[new Z(1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function _$(){return I.from([[new Z(-1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}function B$(){return I.from([[new Z(-1),new Z(0),new Z(0),new Z(0)],[new Z(0),new Z(-1),new Z(0),new Z(0)],[new Z(0),new Z(0),new Z(-1),new Z(0)],[new Z(0),new Z(0),new Z(0),new Z(1)]])}Z.set({precision:80});var JK="1.3.1";var KK=$J,$K=zJ,QK=bJ,HK=LJ,YK=kJ,WK=QJ,FK=CJ,ZK=hJ,XK=vJ,UK=gJ,qK=uJ,RK={VERSION:JK,Decimal:Z,Matrix:I,Vector:E,Transforms2D:NJ,Transforms3D:_J,translate2D:KK,rotate2D:$K,scale2D:QK,skew2D:HK,applyTransform2D:YK,translate3D:WK,rotateX:FK,rotateY:ZK,rotateZ:XK,scale3D:UK,applyTransform3D:qK},O$=RK;if(typeof window!=="undefined")window.SVGMatrixLib=RK;})();