HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/api/Hi.Common.Collections.LazyLinkedList-1.html

660 lines
23 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class LazyLinkedList&lt;T&gt; | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class LazyLinkedList&lt;T&gt; | HiAPI-C# 2025 ">
<meta name="description" content="A singly-growable linked list that can lazily materialize nodes from an source. Without a source it behaves like a regular append-only linked list. With a source, nodes are pulled on demand when is accessed on the tail, or when is accessed on an empty list.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.Common.Collections.LazyLinkedList`1">
<h1 id="Hi_Common_Collections_LazyLinkedList_1" data-uid="Hi.Common.Collections.LazyLinkedList`1" class="text-break">
Class LazyLinkedList&lt;T&gt;
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.Common.html">Common</a>.<a class="xref" href="Hi.Common.Collections.html">Collections</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiGeom.dll</dd></dl>
</div>
<div class="markdown summary"><p>A singly-growable linked list that can lazily materialize nodes
from an <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable&lt;T&gt;</a> source.</p>
<p></p>
Without a source it behaves like a regular append-only linked list.
With a source, nodes are pulled on demand when
<a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_Next">Next</a> is accessed on the tail,
or when <a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_First">First</a> is accessed on an empty list.
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public class LazyLinkedList&lt;T&gt; : IEnumerable&lt;T&gt;, IEnumerable, IDisposable</code></pre>
</div>
<h4 class="section">Type Parameters</h4>
<dl class="parameters">
<dt><code>T</code></dt>
<dd></dd>
</dl>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">LazyLinkedList&lt;T&gt;</span></div>
</dd>
</dl>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;T&gt;</div>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.ienumerable">IEnumerable</a></div>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.idisposable">IDisposable</a></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate&lt;TSelf&gt;(TSelf, params object[])</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_ToDotSplitedString__1_System_Collections_Generic_IEnumerable___0__">StringUtil.ToDotSplitedString&lt;T&gt;(IEnumerable&lt;T&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 id="Hi_Common_Collections_LazyLinkedList_1_examples">Examples</h2>
<pre><code class="lang-csharp">// Lazy: nodes materialize as you walk .Next
using var list = new LazyLinkedList&lt;string&gt;(File.ReadLines(path));
var node = list.First; // materializes line 0
var next = node.Next; // materializes line 1
// Manual: just like a regular linked list
var list2 = new LazyLinkedList&lt;int&gt;();
list2.AddLast(1);
list2.AddLast(2);</code></pre>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="Hi_Common_Collections_LazyLinkedList_1__ctor_" data-uid="Hi.Common.Collections.LazyLinkedList`1.#ctor*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1__ctor" data-uid="Hi.Common.Collections.LazyLinkedList`1.#ctor">
LazyLinkedList()
</h3>
<div class="markdown level1 summary"><p>Creates an empty list (no lazy source).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedList()</code></pre>
</div>
<a id="Hi_Common_Collections_LazyLinkedList_1__ctor_" data-uid="Hi.Common.Collections.LazyLinkedList`1.#ctor*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1__ctor_System_Collections_Generic_IEnumerable__0__" data-uid="Hi.Common.Collections.LazyLinkedList`1.#ctor(System.Collections.Generic.IEnumerable{`0})">
LazyLinkedList(IEnumerable&lt;T&gt;)
</h3>
<div class="markdown level1 summary"><p>Creates a list backed by a lazy source.
Nodes are materialized on demand via <a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_Next">Next</a>
or <a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_First">First</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedList(IEnumerable&lt;T&gt; source)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>source</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;T&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_Common_Collections_LazyLinkedList_1_Count_" data-uid="Hi.Common.Collections.LazyLinkedList`1.Count*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_Count" data-uid="Hi.Common.Collections.LazyLinkedList`1.Count">
Count
</h3>
<div class="markdown level1 summary"><p>Number of nodes currently materialized in the list.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int Count { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_ExhaustedLast_" data-uid="Hi.Common.Collections.LazyLinkedList`1.ExhaustedLast*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_ExhaustedLast" data-uid="Hi.Common.Collections.LazyLinkedList`1.ExhaustedLast">
ExhaustedLast
</h3>
<div class="markdown level1 summary"><p>Forces full materialization of the lazy source and returns the last node.
Walks the source to completion (no-op if already exhausted), then returns
<a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_Last">Last</a>. Use when callers need the definitive tail at this point
in time (e.g. as a stable predecessor before <a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_AppendSource_System_Collections_Generic_IEnumerable__0__">AppendSource(IEnumerable&lt;T&gt;)</a>).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedListNode&lt;T&gt; ExhaustedLast { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;T&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_First_" data-uid="Hi.Common.Collections.LazyLinkedList`1.First*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_First" data-uid="Hi.Common.Collections.LazyLinkedList`1.First">
First
</h3>
<div class="markdown level1 summary"><p>Gets the first node, materializing from source if the list is empty.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedListNode&lt;T&gt; First { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;T&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_IsExhausted_" data-uid="Hi.Common.Collections.LazyLinkedList`1.IsExhausted*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_IsExhausted" data-uid="Hi.Common.Collections.LazyLinkedList`1.IsExhausted">
IsExhausted
</h3>
<div class="markdown level1 summary"><p>Whether all items from the source have been materialized
(or no source was provided).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool IsExhausted { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_Last_" data-uid="Hi.Common.Collections.LazyLinkedList`1.Last*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_Last" data-uid="Hi.Common.Collections.LazyLinkedList`1.Last">
Last
</h3>
<div class="markdown level1 summary"><p>Gets the last materialized node in the list.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedListNode&lt;T&gt; Last { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;T&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="Hi_Common_Collections_LazyLinkedList_1_AddLast_" data-uid="Hi.Common.Collections.LazyLinkedList`1.AddLast*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_AddLast__0_" data-uid="Hi.Common.Collections.LazyLinkedList`1.AddLast(`0)">
AddLast(T)
</h3>
<div class="markdown level1 summary"><p>Appends a new node with the specified value to the end of the list.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public LazyLinkedListNode&lt;T&gt; AddLast(T value)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>value</code> <span class="xref">T</span></dt>
<dd><p>The value to add.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;T&gt;</dt>
<dd><p>The newly created node.</p>
</dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_AppendSource_" data-uid="Hi.Common.Collections.LazyLinkedList`1.AppendSource*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_AppendSource_System_Collections_Generic_IEnumerable__0__" data-uid="Hi.Common.Collections.LazyLinkedList`1.AppendSource(System.Collections.Generic.IEnumerable{`0})">
AppendSource(IEnumerable&lt;T&gt;)
</h3>
<div class="markdown level1 summary"><p>Appends a new lazy source after the current source. The existing source's
remaining items (if any) are drained first, then the new source is yielded.
Re-opens the list for further on-demand materialization, so calling
<a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_Next">Next</a> on the prior tail materializes the
next item and links <a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_Previous">Previous</a> across the
boundary.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void AppendSource(IEnumerable&lt;T&gt; src)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>src</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;T&gt;</dt>
<dd><p>The new source to append.</p>
</dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_Dispose_" data-uid="Hi.Common.Collections.LazyLinkedList`1.Dispose*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_Dispose" data-uid="Hi.Common.Collections.LazyLinkedList`1.Dispose">
Dispose()
</h3>
<div class="markdown level1 summary"><p>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Dispose()</code></pre>
</div>
<a id="Hi_Common_Collections_LazyLinkedList_1_GetEnumerator_" data-uid="Hi.Common.Collections.LazyLinkedList`1.GetEnumerator*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_GetEnumerator" data-uid="Hi.Common.Collections.LazyLinkedList`1.GetEnumerator">
GetEnumerator()
</h3>
<div class="markdown level1 summary"><p>Returns an enumerator that iterates through the collection.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public IEnumerator&lt;T&gt; GetEnumerator()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerator-1">IEnumerator</a>&lt;T&gt;</dt>
<dd><p>An enumerator that can be used to iterate through the collection.</p>
</dd>
</dl>
<a id="Hi_Common_Collections_LazyLinkedList_1_PrependSource_" data-uid="Hi.Common.Collections.LazyLinkedList`1.PrependSource*"></a>
<h3 id="Hi_Common_Collections_LazyLinkedList_1_PrependSource_System_Collections_Generic_IEnumerable__0__" data-uid="Hi.Common.Collections.LazyLinkedList`1.PrependSource(System.Collections.Generic.IEnumerable{`0})">
PrependSource(IEnumerable&lt;T&gt;)
</h3>
<div class="markdown level1 summary"><p>Prepends a new source ahead of the current source's remaining items.
On the next on-demand materialization (triggered by
<a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_Next">Next</a> on the present tail or
<a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_First">First</a> on an empty list), <code class="paramref">src</code> is
yielded first; once exhausted, the previous source's untouched tail
resumes. The materialized prefix of the list — including the present
tail — is unaffected, so this is the natural way to splice extra
items in immediately after the current tail (for example, inlining
an M98 subprogram's blocks after the host node so the rest of the
pipeline picks them up via ordinary <code>walkNode.Next</code> traversal).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void PrependSource(IEnumerable&lt;T&gt; src)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>src</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;T&gt;</dt>
<dd><p>The source to insert ahead of the remaining items.</p>
</dd>
</dl>
<h4 class="section" id="Hi_Common_Collections_LazyLinkedList_1_PrependSource_System_Collections_Generic_IEnumerable__0___remarks">Remarks</h4>
<div class="markdown level1 remarks"><p>Constraint: the caller must treat the present tail as the splice
point. There is no way to prepend &ldquo;after some interior node&rdquo; — the
prepended items are queued ahead of whatever the current source
would have produced next. Use this when the splice point coincides
with the tail at the moment of the call (which is how
<code>SoftNcRunner</code>'s pipeline drives node-by-node lazy
materialization in lock-step with syntax/semantic processing).</p>
</div>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>