Initial commit
This commit is contained in:
206 files changed
+38863
No files matched your search
@@ -0,0 +1,23 @@
|
||||
module.exports = {
|
||||
parserOptions: {
|
||||
parser: "babel-eslint"
|
||||
},
|
||||
root: true,
|
||||
env: {
|
||||
node: true
|
||||
},
|
||||
extends: [
|
||||
"plugin:vue/recommended",
|
||||
"eslint:recommended",
|
||||
"prettier/vue",
|
||||
"plugin:prettier/recommended"
|
||||
],
|
||||
rules: {
|
||||
"vue/component-name-in-template-casing": ["error", "PascalCase"],
|
||||
"no-console": process.env.NODE_ENV === "production" ? "error" : "off",
|
||||
"no-debugger": process.env.NODE_ENV === "production" ? "error" : "off"
|
||||
},
|
||||
globals: {
|
||||
$nuxt: true
|
||||
}
|
||||
};
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
.vscode/
|
||||
.tmp/
|
||||
node_modules/
|
||||
vendor/
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
*.test
|
||||
*.out
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
lib-cov
|
||||
coverage
|
||||
*.lcov
|
||||
.nyc_output
|
||||
typings/
|
||||
*.tsbuildinfo
|
||||
.npm
|
||||
.eslintcache
|
||||
.node_repl_history
|
||||
*.tgz
|
||||
.yarn-integrity
|
||||
.env
|
||||
.env.test
|
||||
.cache
|
||||
.next
|
||||
.nuxt
|
||||
.vuepress/dist
|
||||
.serverless/
|
||||
.fusebox/
|
||||
.dynamodb/
|
||||
application/controller/status_pages/
|
||||
sshwifty
|
||||
@@ -0,0 +1,23 @@
|
||||
# Dependences Of Sshwifty
|
||||
|
||||
Sshwifty uses many third-party components. Those components is required inorder
|
||||
for Sshwifty to function.
|
||||
|
||||
A list of used components can be found inside `package.json` and `go.mod` file.
|
||||
|
||||
Major dependences includes:
|
||||
|
||||
## For front-end application
|
||||
|
||||
- [Vue](https://vuejs.org), Licensed under MIT license
|
||||
- [Babel](https://babeljs.io/), Licensed under MIT license
|
||||
- [XTerm.js](https://xtermjs.org/), Licensed under MIT license
|
||||
- [normalize.css](https://github.com/necolas/normalize.css), Licensed under MIT license
|
||||
- [Roboto font](https://en.wikipedia.org/wiki/Roboto), Licensed under Apache license.
|
||||
Packaged by [Christian Hoffmeister](https://github.com/choffmeister/roboto-fontface-bower), Licensed under Apache 2.0
|
||||
|
||||
## For back-end application
|
||||
|
||||
- `github.com/gorilla/websocket`, Licensed under BSD-2-Cause license
|
||||
- `golang.org/x/net/proxy` [View license](https://github.com/golang/net/blob/master/LICENSE)
|
||||
- `golang.org/x/crypto`, [View license](https://github.com/golang/crypto/blob/master/LICENSE)
|
||||
+660
@@ -0,0 +1,660 @@
|
||||
### GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
<https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
### Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains
|
||||
free software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing
|
||||
under this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
### TERMS AND CONDITIONS
|
||||
|
||||
#### 0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public
|
||||
License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds
|
||||
of works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of
|
||||
an exact copy. The resulting work is called a "modified version" of
|
||||
the earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user
|
||||
through a computer network, with no transfer of a copy, is not
|
||||
conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to
|
||||
the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
#### 1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for
|
||||
making modifications to it. "Object code" means any non-source form of
|
||||
a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can
|
||||
regenerate automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same
|
||||
work.
|
||||
|
||||
#### 2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey,
|
||||
without conditions so long as your license otherwise remains in force.
|
||||
You may convey covered works to others for the sole purpose of having
|
||||
them make modifications exclusively for you, or provide you with
|
||||
facilities for running those works, provided that you comply with the
|
||||
terms of this License in conveying all material for which you do not
|
||||
control copyright. Those thus making or running the covered works for
|
||||
you must do so exclusively on your behalf, under your direction and
|
||||
control, on terms that prohibit them from making any copies of your
|
||||
copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the
|
||||
conditions stated below. Sublicensing is not allowed; section 10 makes
|
||||
it unnecessary.
|
||||
|
||||
#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such
|
||||
circumvention is effected by exercising rights under this License with
|
||||
respect to the covered work, and you disclaim any intention to limit
|
||||
operation or modification of the work as a means of enforcing, against
|
||||
the work's users, your or third parties' legal rights to forbid
|
||||
circumvention of technological measures.
|
||||
|
||||
#### 4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
#### 5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these
|
||||
conditions:
|
||||
|
||||
- a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
- b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under
|
||||
section 7. This requirement modifies the requirement in section 4
|
||||
to "keep intact all notices".
|
||||
- c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
- d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
#### 6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of
|
||||
sections 4 and 5, provided that you also convey the machine-readable
|
||||
Corresponding Source under the terms of this License, in one of these
|
||||
ways:
|
||||
|
||||
- a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
- b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the Corresponding
|
||||
Source from a network server at no charge.
|
||||
- c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
- d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
- e) Convey the object code using peer-to-peer transmission,
|
||||
provided you inform other peers where the object code and
|
||||
Corresponding Source of the work are being offered to the general
|
||||
public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal,
|
||||
family, or household purposes, or (2) anything designed or sold for
|
||||
incorporation into a dwelling. In determining whether a product is a
|
||||
consumer product, doubtful cases shall be resolved in favor of
|
||||
coverage. For a particular product received by a particular user,
|
||||
"normally used" refers to a typical or common use of that class of
|
||||
product, regardless of the status of the particular user or of the way
|
||||
in which the particular user actually uses, or expects or is expected
|
||||
to use, the product. A product is a consumer product regardless of
|
||||
whether the product has substantial commercial, industrial or
|
||||
non-consumer uses, unless such uses represent the only significant
|
||||
mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to
|
||||
install and execute modified versions of a covered work in that User
|
||||
Product from a modified version of its Corresponding Source. The
|
||||
information must suffice to ensure that the continued functioning of
|
||||
the modified object code is in no case prevented or interfered with
|
||||
solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or
|
||||
updates for a work that has been modified or installed by the
|
||||
recipient, or for the User Product in which it has been modified or
|
||||
installed. Access to a network may be denied when the modification
|
||||
itself materially and adversely affects the operation of the network
|
||||
or violates the rules and protocols for communication across the
|
||||
network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
#### 7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders
|
||||
of that material) supplement the terms of this License with terms:
|
||||
|
||||
- a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
- b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
- c) Prohibiting misrepresentation of the origin of that material,
|
||||
or requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
- d) Limiting the use for publicity purposes of names of licensors
|
||||
or authors of the material; or
|
||||
- e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
- f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions
|
||||
of it) with contractual assumptions of liability to the recipient,
|
||||
for any liability that these contractual assumptions directly
|
||||
impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions; the
|
||||
above requirements apply either way.
|
||||
|
||||
#### 8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
#### 9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run
|
||||
a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
#### 10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
#### 11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned
|
||||
or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the
|
||||
scope of its coverage, prohibits the exercise of, or is conditioned on
|
||||
the non-exercise of one or more of the rights that are specifically
|
||||
granted under this License. You may not convey a covered work if you
|
||||
are a party to an arrangement with a third party that is in the
|
||||
business of distributing software, under which you make payment to the
|
||||
third party based on the extent of your activity of conveying the
|
||||
work, and under which the third party grants, to any of the parties
|
||||
who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by
|
||||
you (or copies made from those copies), or (b) primarily for and in
|
||||
connection with specific products or compilations that contain the
|
||||
covered work, unless you entered into that arrangement, or that patent
|
||||
license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
#### 12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under
|
||||
this License and any other pertinent obligations, then as a
|
||||
consequence you may not convey it at all. For example, if you agree to
|
||||
terms that obligate you to collect a royalty for further conveying
|
||||
from those to whom you convey the Program, the only way you could
|
||||
satisfy both those terms and this License would be to refrain entirely
|
||||
from conveying the Program.
|
||||
|
||||
#### 13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your
|
||||
version supports such interaction) an opportunity to receive the
|
||||
Corresponding Source of your version by providing access to the
|
||||
Corresponding Source from a network server at no charge, through some
|
||||
standard or customary means of facilitating copying of software. This
|
||||
Corresponding Source shall include the Corresponding Source for any
|
||||
work covered by version 3 of the GNU General Public License that is
|
||||
incorporated pursuant to the following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
#### 14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Affero General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever
|
||||
published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions
|
||||
of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
#### 15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
|
||||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
|
||||
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
|
||||
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION.
|
||||
|
||||
#### 16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
|
||||
CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
|
||||
NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
|
||||
LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
|
||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
|
||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
#### 17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
### How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these
|
||||
terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively state
|
||||
the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper
|
||||
mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for
|
||||
the specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. For more information on this, and how to apply and follow
|
||||
the GNU AGPL, see <https://www.gnu.org/licenses/>.
|
||||
@@ -0,0 +1,215 @@
|
||||
# Sshwifty Web SSH Client
|
||||
|
||||

|
||||
|
||||
Sshwifty is a SSH client that provides a web interface. You can deploy it on
|
||||
your computer or server, so you can access SSH servers via a web browser.
|
||||
|
||||
## Install
|
||||
|
||||
### Binary
|
||||
|
||||
You can download compiled binaries at [Release] section of the page.
|
||||
|
||||
Please noted that those binaries was generated by an automatic proccess, and the
|
||||
author of this project will NOT verify them. You have to try it at your owk
|
||||
risk.
|
||||
|
||||
[release]: https://github.com/niruix/sshwifty/releases
|
||||
|
||||
### Docker Image
|
||||
|
||||
If you have [Docker] installed on your machine, you can directly use the Docker
|
||||
image by executing following command:
|
||||
|
||||
```
|
||||
$ docker run --detach \
|
||||
--restart=always \
|
||||
--publish 8182:8182 \
|
||||
--name sshwifty \
|
||||
niruix/sshwifty:latest
|
||||
```
|
||||
|
||||
[Docker]: https://www.docker.com
|
||||
|
||||
### Compile from source code
|
||||
|
||||
In order to use the source code, you need to install following tools:
|
||||
|
||||
- `git` to download the source code
|
||||
- `npm` to compile front-end application
|
||||
- `go` to compile back-end application
|
||||
|
||||
After you have installed those tools, run following command to download the code
|
||||
to your computer, and start the build proccess:
|
||||
|
||||
```
|
||||
$ git clone https://github.com/niruix/sshwifty
|
||||
$ cd sshwifty
|
||||
$ npm install
|
||||
$ npm run build
|
||||
```
|
||||
|
||||
If the command succeed, you will found the newly generated `sshwifty` binary
|
||||
under current working directory.
|
||||
|
||||
### Deploy on the cloud
|
||||
|
||||
To deploy this project onto the cloud, Google App Engine or Heroku for example,
|
||||
you need to first download the source code, build it locally, then try to deploy
|
||||
it.
|
||||
|
||||
The `npm run build` will build all static files, then automatically call
|
||||
`go generate ./...` to bind those static files directly into program source
|
||||
code. You need those generated source code to get application to function. Also
|
||||
because of this, directly call `go build .` on the newly downloaded souce code
|
||||
will result a failure.
|
||||
|
||||
## Configure
|
||||
|
||||
Sshwifty can be configured though either file or environment variables. By
|
||||
default, the configuration loader will try to load file from default paths
|
||||
first, then try environment variables.
|
||||
|
||||
You can also specifc your own configuration file by setting `SSHWIFTY_CONFIG`
|
||||
environment variables. For example:
|
||||
|
||||
```
|
||||
$ SSHWIFTY_CONFIG=./sshwifty.conf.json ./sshwifty
|
||||
```
|
||||
|
||||
Then, Sshwifty will load the configuration from file `./sshwifty.conf.json`, and
|
||||
will never try for environment variable.
|
||||
|
||||
### Configuration file
|
||||
|
||||
Here is the options that can be used in a configuration file and what it for:
|
||||
|
||||
```
|
||||
{
|
||||
// HTTP Host. Keep it empty to accept request from all hosts
|
||||
"HostName": "localhost",
|
||||
|
||||
// Web interface access password. Set to empty to allow public access
|
||||
"SharedKey": "WEB_ACCESS_PASSWORD",
|
||||
|
||||
// Socks5 proxy. When set, we will try to connect remote through the given
|
||||
// proxy
|
||||
"Socks5": "localhost:1080",
|
||||
|
||||
// Username of the Socks5 server. Set when the Socks5 server requires login
|
||||
"Socks5User": "",
|
||||
|
||||
// Password of the Socks5 server. Set when the Socks5 server requires login
|
||||
"Socks5Password": "",
|
||||
|
||||
// Sshwifty HTTP server, you can set multiple ones to serve on different
|
||||
// ports
|
||||
"Servers": [
|
||||
{
|
||||
// Which local interface this server will be listening
|
||||
"ListenInterface": "0.0.0.0",
|
||||
|
||||
// Which local port this server will be listening
|
||||
"ListenPort": 8182,
|
||||
|
||||
// Timeout of initial request. HTTP handshake must be finished within
|
||||
// this time
|
||||
"InitialTimeout": 3,
|
||||
|
||||
// How long the connection can be idle before the server disconnects the
|
||||
// client
|
||||
"ReadTimeout": 60,
|
||||
|
||||
// How long the server will wait until the client connect is ready to
|
||||
// recieve new data
|
||||
"WriteTimeout": 60,
|
||||
|
||||
// The interval between internal echo requests
|
||||
"HeartbeatTimeout": 20,
|
||||
|
||||
// Forced delay between each request
|
||||
"ReadDelay": 10,
|
||||
|
||||
// Forced delay between each write
|
||||
"WriteDelay": 10,
|
||||
|
||||
// Path to TLS certificate file. Set empty to use HTTP
|
||||
"TLSCertificateFile": "",
|
||||
|
||||
// Path to TLS certificate key file. Set empty to use HTTP
|
||||
"TLSCertificateKeyFile": ""
|
||||
},
|
||||
{
|
||||
"ListenInterface": "0.0.0.0",
|
||||
"ListenPort": 8182,
|
||||
"InitialTimeout": 3,
|
||||
.....
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`sshwifty.conf.example.json` is an example of a valid configuration file.
|
||||
|
||||
### Environment variables
|
||||
|
||||
Valid environment variables are:
|
||||
|
||||
```
|
||||
SSHWIFTY_HOSTNAME
|
||||
SSHWIFTY_SHAREDKEY
|
||||
SSHWIFTY_SOCKS5
|
||||
SSHWIFTY_SOCKS5_USER
|
||||
SSHWIFTY_SOCKS5_PASSWORD
|
||||
SSHWIFTY_LISTENPORT
|
||||
SSHWIFTY_INITIALTIMEOUT
|
||||
SSHWIFTY_READTIMEOUT
|
||||
SSHWIFTY_WRITETIMEOUT
|
||||
SSHWIFTY_HEARTBEATTIMEOUT
|
||||
SSHWIFTY_READDELAY
|
||||
SSHWIFTY_WRITEELAY
|
||||
SSHWIFTY_LISTENINTERFACE
|
||||
SSHWIFTY_TLSCERTIFICATEFILE
|
||||
SSHWIFTY_TLSCERTIFICATEKEYFILE
|
||||
```
|
||||
|
||||
The option they represented is corresponded to their counterpart in the
|
||||
configuration file.
|
||||
|
||||
Notice: When you use environment variables to configure Sshwifty, then only one
|
||||
Sshwifty HTTP server is then allowed. There is no way to setup mulitple servers
|
||||
here. If you need to serve on multiple ports, use configuratio file instead.
|
||||
|
||||
Be adviced: An invalid value inside following environment variables will cause
|
||||
the value to be reset to default during configuration parsing without warning:
|
||||
|
||||
```
|
||||
SSHWIFTY_INITIALTIMEOUT
|
||||
SSHWIFTY_READTIMEOUT
|
||||
SSHWIFTY_WRITETIMEOUT
|
||||
SSHWIFTY_HEARTBEATTIMEOUT
|
||||
SSHWIFTY_READDELAY
|
||||
SSHWIFTY_WRITEELAY
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Code of this project is licensed under AGPL, see [LICENSE.md] for detail.
|
||||
|
||||
Third-party components used by this project are licensed under their respective
|
||||
license. See [DEPENDENCES.md] for dependences used by this project.
|
||||
|
||||
[LICENSE.md]: LICENSE.md
|
||||
[DEPENDENCES.md]: DEPENDENCES.md
|
||||
|
||||
## Contribute
|
||||
|
||||
This is a hobbyist project, meaning I don't have too many time to put into it.
|
||||
|
||||
Upon release (Which is then you're able to read this file), this project will
|
||||
enter maintaining state, which includes doing bug fix and security updates.
|
||||
Adding new features however, is not a part of the state.
|
||||
|
||||
Please don't send pull request. If you need new function, fork it, and maintain
|
||||
it like one of your own. Appreciated!
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
@@ -0,0 +1,176 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package application
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
goLog "log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/niruix/sshwifty/application/configuration"
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/server"
|
||||
)
|
||||
|
||||
// ProccessSignaller send signal to the running application
|
||||
type ProccessSignaller chan os.Signal
|
||||
|
||||
// ProccessSignallerBuilder builds a ProccessSignaler
|
||||
type ProccessSignallerBuilder func() chan os.Signal
|
||||
|
||||
// DefaultProccessSignallerBuilder the default ProccessSignallerBuilder
|
||||
func DefaultProccessSignallerBuilder() chan os.Signal {
|
||||
return make(chan os.Signal, 1)
|
||||
}
|
||||
|
||||
var (
|
||||
screenLineWipper = []byte("\r")
|
||||
)
|
||||
|
||||
// Application contains data required for the application, and yes I don't like
|
||||
// to write comments
|
||||
type Application struct {
|
||||
screen io.Writer
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
// New creates a new Application
|
||||
func New(screen io.Writer, logger log.Logger) Application {
|
||||
return Application{
|
||||
screen: screen,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
// Run execute the application. It will return when the application is finished
|
||||
// running
|
||||
func (a Application) run(
|
||||
cLoader configuration.Loader,
|
||||
closeSigBuilder ProccessSignallerBuilder,
|
||||
handlerBuilder server.HandlerBuilder,
|
||||
) (bool, error) {
|
||||
var err error
|
||||
|
||||
loaderName, c, cErr := cLoader(a.logger.Context("Configuration"))
|
||||
|
||||
if cErr != nil {
|
||||
a.logger.Error("\"%s\" loader cannot load configuration: %s",
|
||||
loaderName, cErr)
|
||||
|
||||
return false, cErr
|
||||
}
|
||||
|
||||
err = c.Verify()
|
||||
|
||||
if err != nil {
|
||||
a.logger.Error("Configuration was invalid: %s", err)
|
||||
|
||||
return false, err
|
||||
}
|
||||
|
||||
closeNotify := closeSigBuilder()
|
||||
signal.Notify(closeNotify, os.Kill, os.Interrupt, syscall.SIGHUP)
|
||||
defer signal.Stop(closeNotify)
|
||||
|
||||
servers := make([]*server.Serving, 0, len(c.Servers))
|
||||
s := server.New(a.logger)
|
||||
|
||||
defer func() {
|
||||
for i := len(servers); i > 0; i-- {
|
||||
servers[i-1].Close()
|
||||
}
|
||||
|
||||
s.Wait()
|
||||
}()
|
||||
|
||||
closeNotifyDisableLock := sync.Mutex{}
|
||||
|
||||
for _, ss := range c.Servers {
|
||||
newServer := s.Serve(c.Common(), ss, func(e error) {
|
||||
closeNotifyDisableLock.Lock()
|
||||
defer closeNotifyDisableLock.Unlock()
|
||||
|
||||
if closeNotify == nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = e
|
||||
|
||||
close(closeNotify)
|
||||
closeNotify = nil
|
||||
}, handlerBuilder)
|
||||
|
||||
servers = append(servers, newServer)
|
||||
}
|
||||
|
||||
switch <-closeNotify {
|
||||
case syscall.SIGHUP:
|
||||
return true, nil
|
||||
|
||||
case os.Kill:
|
||||
fallthrough
|
||||
case os.Interrupt:
|
||||
a.screen.Write(screenLineWipper)
|
||||
|
||||
return false, nil
|
||||
|
||||
default:
|
||||
closeNotifyDisableLock.Lock()
|
||||
defer closeNotifyDisableLock.Unlock()
|
||||
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
// Run execute the application. It will return when the application is finished
|
||||
// running
|
||||
func (a Application) Run(
|
||||
cLoader configuration.Loader,
|
||||
closeSigBuilder ProccessSignallerBuilder,
|
||||
handlerBuilder server.HandlerBuilder,
|
||||
) error {
|
||||
fmt.Fprintf(a.screen, banner, FullName, version, Author, URL)
|
||||
|
||||
goLog.SetOutput(a.logger)
|
||||
defer goLog.SetOutput(os.Stderr)
|
||||
|
||||
a.logger.Info("Initializing")
|
||||
defer a.logger.Info("Closed")
|
||||
|
||||
for {
|
||||
restart, runErr := a.run(cLoader, closeSigBuilder, handlerBuilder)
|
||||
|
||||
if runErr != nil {
|
||||
a.logger.Error("Unable to start due to error: %s", runErr)
|
||||
|
||||
return runErr
|
||||
}
|
||||
|
||||
if restart {
|
||||
a.logger.Info("Restarting")
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Commander command control
|
||||
type Commander struct {
|
||||
commands Commands
|
||||
}
|
||||
|
||||
// New creates a new Commander
|
||||
func New(cs Commands) Commander {
|
||||
return Commander{
|
||||
commands: cs,
|
||||
}
|
||||
}
|
||||
|
||||
// New Adds a new client
|
||||
func (c Commander) New(
|
||||
dialer network.Dial,
|
||||
receiver rw.FetchReader,
|
||||
sender io.Writer,
|
||||
senderLock *sync.Mutex,
|
||||
receiveDelay time.Duration,
|
||||
sendDelay time.Duration,
|
||||
l log.Logger,
|
||||
) (Handler, error) {
|
||||
return newHandler(
|
||||
dialer,
|
||||
&c.commands,
|
||||
receiver,
|
||||
sender,
|
||||
senderLock,
|
||||
receiveDelay,
|
||||
sendDelay,
|
||||
l,
|
||||
), nil
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
)
|
||||
|
||||
// Consts
|
||||
const (
|
||||
MaxCommandID = 0x0f
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrCommandRunUndefinedCommand = errors.New(
|
||||
"Undefined Command")
|
||||
)
|
||||
|
||||
// Command represents a command handler machine builder
|
||||
type Command func(l log.Logger, w StreamResponder, d network.Dial) FSMMachine
|
||||
|
||||
// Commands contains data of all commands
|
||||
type Commands [MaxCommandID + 1]Command
|
||||
|
||||
// Register registers a new command
|
||||
func (c *Commands) Register(id byte, cb Command) {
|
||||
if id > MaxCommandID {
|
||||
panic("Command ID must be not greater than MaxCommandID")
|
||||
}
|
||||
|
||||
if (*c)[id] != nil {
|
||||
panic(fmt.Sprintf("Command %d already been registered", id))
|
||||
}
|
||||
|
||||
(*c)[id] = cb
|
||||
}
|
||||
|
||||
// Run creates command executer
|
||||
func (c Commands) Run(
|
||||
id byte, l log.Logger, w StreamResponder, dial network.Dial) (FSM, error) {
|
||||
if id > MaxCommandID {
|
||||
return FSM{}, ErrCommandRunUndefinedCommand
|
||||
}
|
||||
|
||||
cc := c[id]
|
||||
|
||||
if cc == nil {
|
||||
return FSM{}, ErrCommandRunUndefinedCommand
|
||||
}
|
||||
|
||||
return newFSM(cc(l, w, dial)), nil
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrFSMMachineClosed = errors.New(
|
||||
"FSM Machine is already closed, it cannot do anything but be released")
|
||||
)
|
||||
|
||||
// FSMError Represents an error from FSM
|
||||
type FSMError struct {
|
||||
code StreamError
|
||||
message string
|
||||
succeed bool
|
||||
}
|
||||
|
||||
// ToFSMError converts error to FSMError
|
||||
func ToFSMError(e error, c StreamError) FSMError {
|
||||
return FSMError{
|
||||
code: c,
|
||||
message: e.Error(),
|
||||
succeed: false,
|
||||
}
|
||||
}
|
||||
|
||||
// NoFSMError return a FSMError that represents a success operation
|
||||
func NoFSMError() FSMError {
|
||||
return FSMError{
|
||||
code: 0,
|
||||
message: "No error",
|
||||
succeed: true,
|
||||
}
|
||||
}
|
||||
|
||||
// Error return the error message
|
||||
func (e FSMError) Error() string {
|
||||
return e.message
|
||||
}
|
||||
|
||||
// Code return the error code
|
||||
func (e FSMError) Code() StreamError {
|
||||
return e.code
|
||||
}
|
||||
|
||||
// Succeed returns whether or not current error represents a succeed operation
|
||||
func (e FSMError) Succeed() bool {
|
||||
return e.succeed
|
||||
}
|
||||
|
||||
// FSMState represents a state of a machine
|
||||
type FSMState func(f *FSM, r *rw.LimitedReader, h StreamHeader, b []byte) error
|
||||
|
||||
// FSMMachine State machine
|
||||
type FSMMachine interface {
|
||||
// Bootup boots up the machine
|
||||
Bootup(r *rw.LimitedReader, b []byte) (FSMState, FSMError)
|
||||
|
||||
// Close stops the machine and get it ready for release.
|
||||
//
|
||||
// NOTE: Close function is responsible in making sure the HeaderClose signal
|
||||
// is sent before it returns.
|
||||
// (It may not need to send the header by itself, but it have to
|
||||
// make sure the header is sent)
|
||||
Close() error
|
||||
|
||||
// Release shuts the machine down completely and release it's resources
|
||||
Release() error
|
||||
}
|
||||
|
||||
// FSM state machine control
|
||||
type FSM struct {
|
||||
m FSMMachine
|
||||
s FSMState
|
||||
closed bool
|
||||
}
|
||||
|
||||
// newFSM creates a new FSM
|
||||
func newFSM(m FSMMachine) FSM {
|
||||
return FSM{
|
||||
m: m,
|
||||
s: nil,
|
||||
closed: false,
|
||||
}
|
||||
}
|
||||
|
||||
// emptyFSM creates a empty FSM
|
||||
func emptyFSM() FSM {
|
||||
return FSM{
|
||||
m: nil,
|
||||
s: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// bootup initialize the machine
|
||||
func (f *FSM) bootup(r *rw.LimitedReader, b []byte) FSMError {
|
||||
s, err := f.m.Bootup(r, b)
|
||||
|
||||
if s == nil {
|
||||
panic("FSMState must not be nil")
|
||||
}
|
||||
|
||||
if !err.Succeed() {
|
||||
return err
|
||||
}
|
||||
|
||||
f.s = s
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// running returns whether or not current FSM is running
|
||||
func (f *FSM) running() bool {
|
||||
return f.s != nil
|
||||
}
|
||||
|
||||
// tick ticks current machine
|
||||
func (f *FSM) tick(r *rw.LimitedReader, h StreamHeader, b []byte) error {
|
||||
if f.closed {
|
||||
return ErrFSMMachineClosed
|
||||
}
|
||||
|
||||
return f.s(f, r, h, b)
|
||||
}
|
||||
|
||||
// Release shuts down current machine and release it's resource
|
||||
func (f *FSM) release() error {
|
||||
f.s = nil
|
||||
|
||||
if !f.closed {
|
||||
f.close()
|
||||
}
|
||||
|
||||
rErr := f.m.Release()
|
||||
|
||||
f.m = nil
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close stops the machine and get it ready to release
|
||||
func (f *FSM) close() error {
|
||||
f.closed = true
|
||||
|
||||
return f.m.Close()
|
||||
}
|
||||
|
||||
// Switch switch to specificied State for the next tick
|
||||
func (f *FSM) Switch(s FSMState) {
|
||||
f.s = s
|
||||
}
|
||||
@@ -0,0 +1,334 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrHandlerUnknownHeaderType = errors.New(
|
||||
"Unknown command header type")
|
||||
|
||||
ErrHandlerControlMessageTooLong = errors.New(
|
||||
"Control message was too long")
|
||||
|
||||
ErrHandlerInvalidControlMessage = errors.New(
|
||||
"Invalid control message")
|
||||
)
|
||||
|
||||
// HandlerCancelSignal signals the cancel of the entire handling proccess
|
||||
type HandlerCancelSignal chan struct{}
|
||||
|
||||
const (
|
||||
handlerReadBufLen = HeaderMaxData + 3 // (3 = 1 Header, 2 Etc)
|
||||
)
|
||||
|
||||
type handlerBuf [handlerReadBufLen]byte
|
||||
|
||||
// handlerSender writes handler signal
|
||||
type handlerSender struct {
|
||||
writer io.Writer
|
||||
lock *sync.Mutex
|
||||
}
|
||||
|
||||
// signal sends handler signal
|
||||
func (h handlerSender) signal(hd Header, d []byte, buf []byte) error {
|
||||
bufLen := len(buf)
|
||||
dLen := len(d)
|
||||
|
||||
if bufLen < dLen+1 {
|
||||
panic(fmt.Sprintln("Sending signal %s:%d requires %d bytes of buffer, "+
|
||||
"but only %d bytes is available", hd, d, dLen+1, bufLen))
|
||||
}
|
||||
|
||||
buf[0] = byte(hd)
|
||||
|
||||
wLen := copy(buf[1:], d) + 1
|
||||
|
||||
_, wErr := h.Write(buf[:wLen])
|
||||
|
||||
return wErr
|
||||
}
|
||||
|
||||
// Write sends data
|
||||
func (h handlerSender) Write(b []byte) (int, error) {
|
||||
h.lock.Lock()
|
||||
defer h.lock.Unlock()
|
||||
|
||||
return h.writer.Write(b)
|
||||
}
|
||||
|
||||
// streamHandlerSender includes all receiver as handlerSender, but it been
|
||||
// designed to be use in streams
|
||||
type streamHandlerSender struct {
|
||||
*handlerSender
|
||||
|
||||
sendDelay time.Duration
|
||||
}
|
||||
|
||||
// signal sends handler signal
|
||||
func (h streamHandlerSender) signal(hd Header, d []byte, buf []byte) error {
|
||||
return h.handlerSender.signal(hd, d, buf)
|
||||
}
|
||||
|
||||
// Write sends data
|
||||
func (h streamHandlerSender) Write(b []byte) (int, error) {
|
||||
defer time.Sleep(h.sendDelay)
|
||||
|
||||
return h.handlerSender.Write(b)
|
||||
}
|
||||
|
||||
// Handler client stream control
|
||||
type Handler struct {
|
||||
dialer network.Dial
|
||||
commands *Commands
|
||||
receiver rw.FetchReader
|
||||
sender handlerSender
|
||||
senderPaused bool
|
||||
receiveDelay time.Duration
|
||||
sendDelay time.Duration
|
||||
log log.Logger
|
||||
rBuf handlerBuf
|
||||
streams streams
|
||||
}
|
||||
|
||||
func newHandler(
|
||||
dialer network.Dial,
|
||||
commands *Commands,
|
||||
receiver rw.FetchReader,
|
||||
sender io.Writer,
|
||||
senderLock *sync.Mutex,
|
||||
receiveDelay time.Duration,
|
||||
sendDelay time.Duration,
|
||||
l log.Logger,
|
||||
) Handler {
|
||||
return Handler{
|
||||
dialer: dialer,
|
||||
commands: commands,
|
||||
receiver: receiver,
|
||||
sender: handlerSender{writer: sender, lock: senderLock},
|
||||
senderPaused: false,
|
||||
receiveDelay: receiveDelay,
|
||||
sendDelay: sendDelay,
|
||||
log: l,
|
||||
rBuf: handlerBuf{},
|
||||
streams: newStreams(),
|
||||
}
|
||||
}
|
||||
|
||||
// handleControl handles Control request
|
||||
//
|
||||
// Params:
|
||||
// - d: length of the control message
|
||||
//
|
||||
// Returns:
|
||||
// - error
|
||||
func (e *Handler) handleControl(d byte, l log.Logger) error {
|
||||
buf := e.rBuf[1:]
|
||||
|
||||
if len(buf) < int(d) {
|
||||
return ErrHandlerControlMessageTooLong
|
||||
}
|
||||
|
||||
rLen, rErr := io.ReadFull(&e.receiver, buf[:d])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
if rLen <= 0 {
|
||||
return ErrHandlerInvalidControlMessage
|
||||
}
|
||||
|
||||
switch buf[0] {
|
||||
case HeaderControlEcho:
|
||||
hd := HeaderControl
|
||||
hd.Set(d)
|
||||
|
||||
e.rBuf[0] = byte(hd)
|
||||
e.rBuf[1] = HeaderControlEcho
|
||||
|
||||
var wErr error
|
||||
|
||||
if !e.senderPaused {
|
||||
_, wErr = e.sender.Write(e.rBuf[:rLen+1])
|
||||
} else {
|
||||
_, wErr = e.sender.writer.Write(e.rBuf[:rLen+1])
|
||||
}
|
||||
|
||||
return wErr
|
||||
|
||||
case HeaderControlPauseStream:
|
||||
if !e.senderPaused {
|
||||
e.sender.lock.Lock()
|
||||
e.senderPaused = true
|
||||
}
|
||||
|
||||
case HeaderControlResumeStream:
|
||||
if e.senderPaused {
|
||||
e.sender.lock.Unlock()
|
||||
e.senderPaused = false
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// handleStream handles streams
|
||||
//
|
||||
// Params:
|
||||
// - d: Stream ID
|
||||
//
|
||||
// Returns:
|
||||
// - error
|
||||
func (e *Handler) handleStream(h Header, d byte, l log.Logger) error {
|
||||
st, stErr := e.streams.get(d)
|
||||
|
||||
if stErr != nil {
|
||||
return stErr
|
||||
}
|
||||
|
||||
// WARNING: stream.Tick and it's underlaying commands MUST NOT write to
|
||||
// client. This is because the client data writer maybe locked
|
||||
// and only current routine (the same routine will be used to
|
||||
// tick the stream) can unlock it.
|
||||
// Calling write may dead lock the routine, with there is no way
|
||||
// of recover.
|
||||
if st.running() {
|
||||
l.Debug("Ticking stream")
|
||||
|
||||
return st.tick(h, &e.receiver, e.rBuf[:])
|
||||
}
|
||||
|
||||
l.Debug("Start stream %d", h.Data())
|
||||
|
||||
if e.senderPaused {
|
||||
e.sender.lock.Unlock()
|
||||
defer e.sender.lock.Lock()
|
||||
}
|
||||
|
||||
return st.reinit(h, &e.receiver, streamHandlerSender{
|
||||
handlerSender: &e.sender,
|
||||
sendDelay: e.sendDelay,
|
||||
}, l, e.commands, e.dialer, e.rBuf[:])
|
||||
}
|
||||
|
||||
func (e *Handler) handleClose(h Header, d byte, l log.Logger) error {
|
||||
st, stErr := e.streams.get(d)
|
||||
|
||||
if stErr != nil {
|
||||
return stErr
|
||||
}
|
||||
|
||||
if e.senderPaused {
|
||||
e.sender.lock.Unlock()
|
||||
defer e.sender.lock.Lock()
|
||||
}
|
||||
|
||||
cErr := st.close()
|
||||
|
||||
if cErr != nil {
|
||||
return cErr
|
||||
}
|
||||
|
||||
hhd := HeaderCompleted
|
||||
hhd.Set(h.Data())
|
||||
|
||||
return e.sender.signal(hhd, nil, e.rBuf[:])
|
||||
}
|
||||
|
||||
func (e *Handler) handleCompleted(d byte, l log.Logger) error {
|
||||
st, stErr := e.streams.get(d)
|
||||
|
||||
if stErr != nil {
|
||||
return stErr
|
||||
}
|
||||
|
||||
if e.senderPaused {
|
||||
e.sender.lock.Unlock()
|
||||
defer e.sender.lock.Lock()
|
||||
}
|
||||
|
||||
return st.release()
|
||||
}
|
||||
|
||||
// Handle starts handling
|
||||
func (e *Handler) Handle() error {
|
||||
defer func() {
|
||||
if e.senderPaused {
|
||||
e.sender.lock.Unlock()
|
||||
e.senderPaused = false
|
||||
}
|
||||
|
||||
e.streams.shutdown()
|
||||
}()
|
||||
|
||||
requests := 0
|
||||
|
||||
for {
|
||||
time.Sleep(e.receiveDelay)
|
||||
|
||||
requests++
|
||||
|
||||
d, dErr := rw.FetchOneByte(e.receiver.Fetch)
|
||||
|
||||
if dErr != nil {
|
||||
return dErr
|
||||
}
|
||||
|
||||
h := Header(d[0])
|
||||
l := e.log.Context("Request (%d)", requests).Context(h.String())
|
||||
|
||||
l.Debug("Received")
|
||||
|
||||
switch h.Type() {
|
||||
case HeaderControl:
|
||||
dErr = e.handleControl(h.Data(), l)
|
||||
|
||||
case HeaderStream:
|
||||
dErr = e.handleStream(h, h.Data(), l)
|
||||
|
||||
case HeaderClose:
|
||||
dErr = e.handleClose(h, h.Data(), l)
|
||||
|
||||
case HeaderCompleted:
|
||||
dErr = e.handleCompleted(h.Data(), l)
|
||||
|
||||
default:
|
||||
return ErrHandlerUnknownHeaderType
|
||||
}
|
||||
|
||||
if dErr != nil {
|
||||
l.Debug("Request failed: %s", dErr)
|
||||
|
||||
return dErr
|
||||
}
|
||||
|
||||
l.Debug("Request successful")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
func testDummyFetchGen(data []byte) rw.FetchReaderFetcher {
|
||||
current := 0
|
||||
|
||||
return func() ([]byte, error) {
|
||||
if current >= len(data) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
oldCurrent := current
|
||||
current++
|
||||
|
||||
return data[oldCurrent:current], nil
|
||||
}
|
||||
}
|
||||
|
||||
type dummyWriter struct {
|
||||
written []byte
|
||||
}
|
||||
|
||||
func (d *dummyWriter) Write(b []byte) (int, error) {
|
||||
d.written = append(d.written, b...)
|
||||
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
func TestHandlerHandleEcho(t *testing.T) {
|
||||
w := dummyWriter{
|
||||
written: make([]byte, 0, 64),
|
||||
}
|
||||
s := []byte{
|
||||
byte(HeaderControl | 13),
|
||||
HeaderControlEcho,
|
||||
'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D', '1',
|
||||
byte(HeaderControl | 13),
|
||||
HeaderControlEcho,
|
||||
'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D', '2',
|
||||
byte(HeaderControl | HeaderMaxData),
|
||||
HeaderControlEcho,
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
|
||||
'2', '2',
|
||||
byte(HeaderControl | 13),
|
||||
HeaderControlEcho,
|
||||
'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D', '3',
|
||||
}
|
||||
lock := sync.Mutex{}
|
||||
handler := newHandler(
|
||||
nil,
|
||||
nil,
|
||||
rw.NewFetchReader(testDummyFetchGen(s)),
|
||||
&w,
|
||||
&lock,
|
||||
0,
|
||||
0,
|
||||
log.NewDitch(),
|
||||
)
|
||||
|
||||
hErr := handler.Handle()
|
||||
|
||||
if hErr != nil && hErr != io.EOF {
|
||||
t.Error("Failed to write due to error:", hErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(w.written, s) {
|
||||
t.Errorf("Expecting the data to be %d, got %d instead", s, w.written)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,249 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
func testDummyFetchChainGen(dd <-chan []byte) rw.FetchReaderFetcher {
|
||||
var data []byte
|
||||
var ok bool
|
||||
|
||||
current := 0
|
||||
|
||||
return func() ([]byte, error) {
|
||||
for {
|
||||
if current >= len(data) {
|
||||
data, ok = <-dd
|
||||
|
||||
if !ok {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
current = 0
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
oldCurrent := current
|
||||
current++
|
||||
|
||||
return data[oldCurrent:current], nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type dummyStreamCommand struct {
|
||||
l log.Logger
|
||||
w StreamResponder
|
||||
downWait sync.WaitGroup
|
||||
echoData []byte
|
||||
echoTrans chan []byte
|
||||
}
|
||||
|
||||
func newDummyStreamCommand(
|
||||
l log.Logger, w StreamResponder, d network.Dial) FSMMachine {
|
||||
return &dummyStreamCommand{
|
||||
l: l,
|
||||
w: w,
|
||||
downWait: sync.WaitGroup{},
|
||||
echoData: []byte{},
|
||||
echoTrans: make(chan []byte),
|
||||
}
|
||||
}
|
||||
|
||||
func (d *dummyStreamCommand) Bootup(
|
||||
r *rw.LimitedReader,
|
||||
b []byte,
|
||||
) (FSMState, FSMError) {
|
||||
d.downWait.Add(1)
|
||||
|
||||
go func() {
|
||||
defer func() {
|
||||
d.w.Signal(HeaderClose)
|
||||
|
||||
d.downWait.Done()
|
||||
}()
|
||||
|
||||
buf := make([]byte, 1024)
|
||||
|
||||
for {
|
||||
dt, dtOK := <-d.echoTrans
|
||||
|
||||
if !dtOK {
|
||||
return
|
||||
}
|
||||
|
||||
wErr := d.w.Send(0, []byte{dt[0], dt[1], dt[2], dt[3]}, buf)
|
||||
|
||||
if wErr != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
commandDataBuf := [5]byte{}
|
||||
|
||||
_, rErr := io.ReadFull(r, commandDataBuf[:])
|
||||
|
||||
if rErr != nil {
|
||||
return nil, ToFSMError(rErr, 11)
|
||||
}
|
||||
|
||||
if !bytes.Equal(commandDataBuf[:], []byte("HELLO")) {
|
||||
panic(fmt.Sprintf("Expecting handsake data to be %s, got %s instead",
|
||||
[]byte("HELLO"), commandDataBuf[:]))
|
||||
}
|
||||
|
||||
if !r.Completed() {
|
||||
panic("R must be Completed")
|
||||
}
|
||||
|
||||
return d.run, NoFSMError()
|
||||
}
|
||||
|
||||
func (d *dummyStreamCommand) run(
|
||||
f *FSM, r *rw.LimitedReader, h StreamHeader, b []byte) error {
|
||||
rLen, rErr := rw.ReadUntilCompleted(r, b[:])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
d.echoData = make([]byte, rLen)
|
||||
copy(d.echoData, b)
|
||||
|
||||
if d.echoTrans != nil {
|
||||
d.echoTrans <- d.echoData
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *dummyStreamCommand) Close() error {
|
||||
close(d.echoTrans)
|
||||
d.echoTrans = nil
|
||||
d.downWait.Wait()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *dummyStreamCommand) Release() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestHandlerHandleStream(t *testing.T) {
|
||||
cmds := Commands{}
|
||||
cmds.Register(0, newDummyStreamCommand)
|
||||
|
||||
readerDataInput := make(chan []byte)
|
||||
|
||||
readerSource := testDummyFetchChainGen(readerDataInput)
|
||||
wBuffer := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||
|
||||
lock := sync.Mutex{}
|
||||
hhd := newHandler(
|
||||
nil,
|
||||
&cmds,
|
||||
rw.NewFetchReader(readerSource),
|
||||
wBuffer,
|
||||
&lock,
|
||||
0,
|
||||
0,
|
||||
log.NewDitch())
|
||||
|
||||
go func() {
|
||||
stInitialHeader := streamInitialHeader{}
|
||||
|
||||
stInitialHeader.set(0, 5, true)
|
||||
|
||||
readerDataInput <- []byte{
|
||||
byte(HeaderStream | 63), stInitialHeader[0], stInitialHeader[1],
|
||||
'H', 'E', 'L', 'L', 'O',
|
||||
}
|
||||
|
||||
stHeader := StreamHeader{}
|
||||
stHeader.Set(0, 5)
|
||||
|
||||
readerDataInput <- []byte{
|
||||
byte(HeaderStream | 63), stHeader[0], stHeader[1],
|
||||
'W', 'O', 'R', 'L', 'D',
|
||||
}
|
||||
|
||||
readerDataInput <- []byte{
|
||||
byte(HeaderStream | 63), stHeader[0], stHeader[1],
|
||||
'0', '1', '2', '3', '4',
|
||||
}
|
||||
|
||||
readerDataInput <- []byte{
|
||||
byte(HeaderClose | 63),
|
||||
}
|
||||
|
||||
close(readerDataInput)
|
||||
}()
|
||||
|
||||
hErr := hhd.Handle()
|
||||
|
||||
if hErr != nil && hErr != io.EOF {
|
||||
t.Error("Failed to handle due to error:", hErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Build the expected header:
|
||||
|
||||
// HeaderStream(63): Success
|
||||
stInitialHeader := streamInitialHeader{}
|
||||
stInitialHeader.set(0, 0, true)
|
||||
|
||||
stHeaders := StreamHeader{}
|
||||
stHeaders.Set(0, 4)
|
||||
|
||||
expected := []byte{
|
||||
// HeaderStream(63): Success
|
||||
byte(HeaderStream | 63), stInitialHeader[0], stInitialHeader[1],
|
||||
|
||||
// HeaderStream(63): Echo 'W', 'O', 'R', 'L' (First 4 bytes of data)
|
||||
byte(HeaderStream | 63), stHeaders[0], stHeaders[1], 'W', 'O', 'R', 'L',
|
||||
|
||||
// HeaderStream(63): Echo '0', '1', '2', '3',
|
||||
byte(HeaderStream | 63), stHeaders[0], stHeaders[1], '0', '1', '2', '3',
|
||||
|
||||
// HeaderClose(63)
|
||||
byte(HeaderClose | 63),
|
||||
|
||||
// HeaderCompleted(63)
|
||||
byte(HeaderCompleted | 63),
|
||||
}
|
||||
|
||||
if !bytes.Equal(wBuffer.Bytes(), expected) {
|
||||
t.Errorf("Expecting received data to be %d, got %d instead",
|
||||
expected, wBuffer.Bytes())
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
@@ -0,0 +1,143 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Header Packet Type
|
||||
type Header byte
|
||||
|
||||
// Packet Types
|
||||
const (
|
||||
// 00------: Control signals
|
||||
// Remaing bits: Data length
|
||||
//
|
||||
// Format:
|
||||
// 0011111 [63 bytes long data] - 63 bytes of control data
|
||||
//
|
||||
HeaderControl Header = 0x00
|
||||
|
||||
// 01------: Bidirectional stream data
|
||||
// Remaining bits: Stream ID
|
||||
// Followed by: Parameter or data
|
||||
//
|
||||
// Format:
|
||||
// 0111111 [Command parameters / data] - Open/use stream 63 to execute
|
||||
// command or transmit data
|
||||
HeaderStream Header = 0x40
|
||||
|
||||
// 10------: Close stream
|
||||
// Remaining bits: Stream ID
|
||||
//
|
||||
// Format:
|
||||
// 1011111 - Close stream 63
|
||||
//
|
||||
// WARNING: The requester MUST NOT send any data to this stream once this
|
||||
// header is sent.
|
||||
//
|
||||
// WARNING: The receiver MUST reply with a Completed header to indicate
|
||||
// the success of the Close action. Until a Completed header is
|
||||
// replied, all data from the sender must be proccessed as normal.
|
||||
HeaderClose Header = 0x80
|
||||
|
||||
// 11------: Stream has been closed/completed in respond to client request
|
||||
// Remaining bits: Stream ID
|
||||
//
|
||||
// Format:
|
||||
// 1111111 - Stream 63 is completed
|
||||
//
|
||||
// WARNING: This header can ONLY be send in respond to a Close header
|
||||
//
|
||||
// WARNING: The sender of this header MUST NOT send any data to the stream
|
||||
// once this header is sent until this stream been re-opened by a
|
||||
// Data header
|
||||
HeaderCompleted Header = 0xc0
|
||||
)
|
||||
|
||||
// Control signal types
|
||||
const (
|
||||
HeaderControlEcho = 0x00
|
||||
HeaderControlPauseStream = 0x01
|
||||
HeaderControlResumeStream = 0x02
|
||||
)
|
||||
|
||||
// Consts
|
||||
const (
|
||||
HeaderMaxData = 0x3f
|
||||
)
|
||||
|
||||
// Cutters
|
||||
const (
|
||||
headerHeaderCutter = 0xc0
|
||||
headerDataCutter = 0x3f
|
||||
)
|
||||
|
||||
// Type get packet type
|
||||
func (p Header) Type() Header {
|
||||
return (p & headerHeaderCutter)
|
||||
}
|
||||
|
||||
// Data returns the data of current Packet header
|
||||
func (p Header) Data() byte {
|
||||
return byte(p & headerDataCutter)
|
||||
}
|
||||
|
||||
// Set set a new value of the Header
|
||||
func (p *Header) Set(data byte) {
|
||||
if data > headerDataCutter {
|
||||
panic("data must not be greater than 0x3f")
|
||||
}
|
||||
|
||||
*p |= (headerDataCutter & Header(data))
|
||||
}
|
||||
|
||||
// Set set a new value of the Header
|
||||
func (p Header) String() string {
|
||||
switch p.Type() {
|
||||
case HeaderControl:
|
||||
return fmt.Sprintf("Control (%d bytes)", p.Data())
|
||||
|
||||
case HeaderStream:
|
||||
return fmt.Sprintf("Stream (%d)", p.Data())
|
||||
|
||||
case HeaderClose:
|
||||
return fmt.Sprintf("Close (Stream %d)", p.Data())
|
||||
|
||||
case HeaderCompleted:
|
||||
return fmt.Sprintf("Completed (Stream %d)", p.Data())
|
||||
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
// IsStreamControl returns true when the header is for stream control, false
|
||||
// when otherwise
|
||||
func (p Header) IsStreamControl() bool {
|
||||
switch p {
|
||||
case HeaderStream:
|
||||
fallthrough
|
||||
case HeaderClose:
|
||||
fallthrough
|
||||
case HeaderCompleted:
|
||||
return true
|
||||
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,439 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrStreamsInvalidStreamID = errors.New(
|
||||
"Stream ID is invalid")
|
||||
|
||||
ErrStreamsStreamOperateInactiveStream = errors.New(
|
||||
"Specified stream was inactive for operation")
|
||||
|
||||
ErrStreamsStreamClosingInactiveStream = errors.New(
|
||||
"Closing an inactive stream is not allowed")
|
||||
|
||||
ErrStreamsStreamReleasingInactiveStream = errors.New(
|
||||
"Releasing an inactive stream is not allowed")
|
||||
)
|
||||
|
||||
// StreamError Stream Error signal
|
||||
type StreamError uint16
|
||||
|
||||
// Error signals
|
||||
const (
|
||||
StreamErrorCommandUndefined StreamError = 0x01
|
||||
StreamErrorCommandFailedToBootup StreamError = 0x02
|
||||
)
|
||||
|
||||
// StreamHeader contains data of the stream header
|
||||
type StreamHeader [2]byte
|
||||
|
||||
// Stream header consts
|
||||
const (
|
||||
StreamHeaderMaxLength = 0x1fff
|
||||
StreamHeaderMaxMarker = 0x07
|
||||
|
||||
streamHeaderLengthFirstByteCutter = 0x1f
|
||||
)
|
||||
|
||||
// Marker returns the header marker data
|
||||
func (s StreamHeader) Marker() byte {
|
||||
return s[0] >> 5
|
||||
}
|
||||
|
||||
// Length returns the data length of the stream
|
||||
func (s StreamHeader) Length() uint16 {
|
||||
r := uint16(0)
|
||||
|
||||
r |= uint16(s[0] & streamHeaderLengthFirstByteCutter)
|
||||
r <<= 8
|
||||
r |= uint16(s[1])
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
// Set sets the stream header
|
||||
func (s *StreamHeader) Set(marker byte, n uint16) {
|
||||
if marker > StreamHeaderMaxMarker {
|
||||
panic("marker must not be greater than 0x07")
|
||||
}
|
||||
|
||||
if n > StreamHeaderMaxLength {
|
||||
panic("n must not be greater than 0x1fff")
|
||||
}
|
||||
|
||||
s[0] = (marker << 5) | byte((n>>8)&streamHeaderLengthFirstByteCutter)
|
||||
s[1] = byte(n)
|
||||
}
|
||||
|
||||
// streamInitialHeader contains header data of the first stream after stream
|
||||
// reset.
|
||||
// Unlike StreamHeader, streamInitialHeader carries no extra data
|
||||
type streamInitialHeader StreamHeader
|
||||
|
||||
// command returns command ID of the stream
|
||||
func (s streamInitialHeader) command() byte {
|
||||
return s[0] >> 4
|
||||
}
|
||||
|
||||
// length returns the data of the stream header
|
||||
func (s streamInitialHeader) data() uint16 {
|
||||
r := uint16(0)
|
||||
|
||||
r |= uint16(s[0] & 0x07) // 0000 0111
|
||||
r <<= 8
|
||||
r |= uint16(s[1])
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
// success returns whether or not the command is representing a success
|
||||
func (s streamInitialHeader) success() bool {
|
||||
return (s[0] & 0x08) != 0
|
||||
}
|
||||
|
||||
// set sets header values
|
||||
func (s *streamInitialHeader) set(commandID byte, data uint16, success bool) {
|
||||
if commandID > 0x0f {
|
||||
panic("Command ID must not greater than 0x0f")
|
||||
}
|
||||
|
||||
if data > 0x07ff {
|
||||
panic("Data must not greater than 0x07ff")
|
||||
}
|
||||
|
||||
dd := data & 0x07ff
|
||||
|
||||
if success {
|
||||
dd |= 0x0800
|
||||
}
|
||||
|
||||
(*s)[0] = 0
|
||||
(*s)[0] |= commandID << 4
|
||||
(*s)[0] |= byte(dd >> 8)
|
||||
(*s)[1] = 0
|
||||
(*s)[1] |= byte(dd)
|
||||
}
|
||||
|
||||
// send sends current stream header as signal
|
||||
func (s *streamInitialHeader) signal(
|
||||
w *handlerSender,
|
||||
hd Header,
|
||||
buf []byte,
|
||||
) error {
|
||||
return w.signal(hd, (*s)[:], buf)
|
||||
}
|
||||
|
||||
// StreamInitialSignalSender sends stream initial signal
|
||||
type StreamInitialSignalSender struct {
|
||||
w *handlerSender
|
||||
hd Header
|
||||
cmdID byte
|
||||
buf []byte
|
||||
}
|
||||
|
||||
// Signal send signal
|
||||
func (s *StreamInitialSignalSender) Signal(
|
||||
errno StreamError, success bool) error {
|
||||
shd := streamInitialHeader{}
|
||||
shd.set(s.cmdID, uint16(errno), success)
|
||||
|
||||
return shd.signal(s.w, s.hd, s.buf)
|
||||
}
|
||||
|
||||
// StreamResponder sends data through stream
|
||||
type StreamResponder struct {
|
||||
w streamHandlerSender
|
||||
h Header
|
||||
}
|
||||
|
||||
// newStreamResponder creates a new StreamResponder
|
||||
func newStreamResponder(w streamHandlerSender, h Header) StreamResponder {
|
||||
return StreamResponder{
|
||||
w: w,
|
||||
h: h,
|
||||
}
|
||||
}
|
||||
|
||||
func (w StreamResponder) write(mk byte, b []byte, buf []byte) (int, error) {
|
||||
bufLen := len(buf)
|
||||
bLen := len(b)
|
||||
|
||||
if bLen > bufLen {
|
||||
bLen = bufLen
|
||||
}
|
||||
|
||||
if bLen > StreamHeaderMaxLength {
|
||||
bLen = StreamHeaderMaxLength
|
||||
}
|
||||
|
||||
sHeaderStream := StreamHeader{}
|
||||
sHeaderStream.Set(mk, uint16(bLen))
|
||||
|
||||
toWrite := copy(buf[3:], b)
|
||||
buf[0] = byte(w.h)
|
||||
buf[1] = sHeaderStream[0]
|
||||
buf[2] = sHeaderStream[1]
|
||||
|
||||
_, wErr := w.w.Write(buf[:toWrite+3])
|
||||
|
||||
if wErr != nil {
|
||||
return 0, wErr
|
||||
}
|
||||
|
||||
return len(b), wErr
|
||||
}
|
||||
|
||||
// HeaderSize returns the size of header
|
||||
func (w StreamResponder) HeaderSize() int {
|
||||
return 3
|
||||
}
|
||||
|
||||
// Send sends data. Data will be automatically segmentated if it's too long to
|
||||
// fit into one data package or buffer space
|
||||
func (w StreamResponder) Send(marker byte, data []byte, buf []byte) error {
|
||||
if len(buf) <= w.HeaderSize() {
|
||||
panic("The length of data buffer must be greater than 3")
|
||||
}
|
||||
|
||||
dataLen := len(data)
|
||||
start := 0
|
||||
|
||||
for {
|
||||
wLen, wErr := w.write(marker, data[start:], buf)
|
||||
|
||||
start += wLen
|
||||
|
||||
if wErr != nil {
|
||||
return wErr
|
||||
}
|
||||
|
||||
if start < dataLen {
|
||||
continue
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// SendManual sends the data without automatical segmentation. It will construct
|
||||
// the data package directly using the given `data` buffer, that is, the first
|
||||
// n bytes of the given `data` will be used to setup headers. It is the caller's
|
||||
// responsibility to leave n bytes of space so no meaningful data will be over
|
||||
// written. The number n can be acquired by calling .HeaderSize() method.
|
||||
func (w StreamResponder) SendManual(marker byte, data []byte) error {
|
||||
dataLen := len(data)
|
||||
|
||||
if dataLen < w.HeaderSize() {
|
||||
panic("The length of data buffer must be greater than the " +
|
||||
"w.HeaderSize()")
|
||||
}
|
||||
|
||||
if dataLen > StreamHeaderMaxLength {
|
||||
panic("Data length must not greater than StreamHeaderMaxLength")
|
||||
}
|
||||
|
||||
sHeaderStream := StreamHeader{}
|
||||
sHeaderStream.Set(marker, uint16(dataLen-w.HeaderSize()))
|
||||
|
||||
data[0] = byte(w.h)
|
||||
data[1] = sHeaderStream[0]
|
||||
data[2] = sHeaderStream[1]
|
||||
|
||||
_, wErr := w.w.Write(data)
|
||||
|
||||
return wErr
|
||||
}
|
||||
|
||||
// Signal sends a signal
|
||||
func (w StreamResponder) Signal(signal Header) error {
|
||||
if !signal.IsStreamControl() {
|
||||
panic("Only stream control signal is allowed")
|
||||
}
|
||||
|
||||
sHeader := signal
|
||||
sHeader.Set(w.h.Data())
|
||||
|
||||
_, wErr := w.w.Write([]byte{byte(sHeader)})
|
||||
|
||||
return wErr
|
||||
}
|
||||
|
||||
type stream struct {
|
||||
f FSM
|
||||
closed bool
|
||||
}
|
||||
|
||||
type streams [HeaderMaxData + 1]stream
|
||||
|
||||
func newStream() stream {
|
||||
return stream{
|
||||
f: emptyFSM(),
|
||||
closed: false,
|
||||
}
|
||||
}
|
||||
|
||||
func newStreams() streams {
|
||||
s := streams{}
|
||||
|
||||
for i := range s {
|
||||
s[i] = newStream()
|
||||
}
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
func (c *streams) get(id byte) (*stream, error) {
|
||||
if id > HeaderMaxData {
|
||||
return nil, ErrStreamsInvalidStreamID
|
||||
}
|
||||
|
||||
return &(*c)[id], nil
|
||||
}
|
||||
|
||||
func (c *streams) shutdown() {
|
||||
cc := *c
|
||||
|
||||
for i := range cc {
|
||||
if !cc[i].running() {
|
||||
continue
|
||||
}
|
||||
|
||||
if !cc[i].closed {
|
||||
cc[i].close()
|
||||
}
|
||||
|
||||
cc[i].release()
|
||||
}
|
||||
}
|
||||
|
||||
func (c *stream) running() bool {
|
||||
return c.f.running()
|
||||
}
|
||||
|
||||
func (c *stream) reinit(
|
||||
h Header,
|
||||
r *rw.FetchReader,
|
||||
w streamHandlerSender,
|
||||
l log.Logger,
|
||||
cc *Commands,
|
||||
dialer network.Dial,
|
||||
b []byte,
|
||||
) error {
|
||||
hd := streamInitialHeader{}
|
||||
|
||||
_, rErr := io.ReadFull(r, hd[:])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
l = l.Context("Command (%d)", hd.command())
|
||||
|
||||
ccc, cccErr := cc.Run(hd.command(), l, newStreamResponder(w, h), dialer)
|
||||
|
||||
if cccErr != nil {
|
||||
hd.set(0, uint16(StreamErrorCommandUndefined), false)
|
||||
hd.signal(w.handlerSender, h, b)
|
||||
|
||||
l.Warning("Trying to execute an unknown command %d", hd.command())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
signaller := StreamInitialSignalSender{
|
||||
w: w.handlerSender,
|
||||
hd: h,
|
||||
cmdID: hd.command(),
|
||||
buf: b,
|
||||
}
|
||||
|
||||
rr := rw.NewLimitedReader(r, int(hd.data()))
|
||||
defer rr.Ditch(b)
|
||||
|
||||
bootErr := ccc.bootup(&rr, b)
|
||||
|
||||
if !bootErr.Succeed() {
|
||||
l.Warning("Unable to start command %d due to error: %s",
|
||||
hd.command(), bootErr.Error())
|
||||
|
||||
signaller.Signal(bootErr.code, false)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
c.f = ccc
|
||||
c.closed = false
|
||||
|
||||
signaller.Signal(bootErr.code, true)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *stream) tick(
|
||||
h Header,
|
||||
r *rw.FetchReader,
|
||||
b []byte,
|
||||
) error {
|
||||
if !c.f.running() {
|
||||
return ErrStreamsStreamOperateInactiveStream
|
||||
}
|
||||
|
||||
hd := StreamHeader{}
|
||||
|
||||
_, rErr := io.ReadFull(r, hd[:])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
rr := rw.NewLimitedReader(r, int(hd.Length()))
|
||||
defer rr.Ditch(b)
|
||||
|
||||
return c.f.tick(&rr, hd, b)
|
||||
}
|
||||
|
||||
func (c *stream) close() error {
|
||||
if !c.f.running() {
|
||||
return ErrStreamsStreamClosingInactiveStream
|
||||
}
|
||||
|
||||
// Set a marker so streams.shutdown won't call it. Stream can call it
|
||||
// however they want, though that may cause error that disconnects.
|
||||
c.closed = true
|
||||
|
||||
return c.f.close()
|
||||
}
|
||||
|
||||
func (c *stream) release() error {
|
||||
if !c.f.running() {
|
||||
return ErrStreamsStreamReleasingInactiveStream
|
||||
}
|
||||
|
||||
return c.f.release()
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package command
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestStreamInitialHeader(t *testing.T) {
|
||||
hd := streamInitialHeader{}
|
||||
|
||||
hd.set(15, 128, true)
|
||||
|
||||
if hd.command() != 15 {
|
||||
t.Errorf("Expecting command to be %d, got %d instead",
|
||||
15, hd.command())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if hd.data() != 128 {
|
||||
t.Errorf("Expecting data to be %d, got %d instead", 128, hd.data())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if hd.success() != true {
|
||||
t.Errorf("Expecting success to be %v, got %v instead",
|
||||
true, hd.success())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
hd.set(0, 2047, false)
|
||||
|
||||
if hd.command() != 0 {
|
||||
t.Errorf("Expecting command to be %d, got %d instead",
|
||||
0, hd.command())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if hd.data() != 2047 {
|
||||
t.Errorf("Expecting data to be %d, got %d instead", 2047, hd.data())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if hd.success() != false {
|
||||
t.Errorf("Expecting success to be %v, got %v instead",
|
||||
false, hd.success())
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestStreamHeader(t *testing.T) {
|
||||
s := StreamHeader{}
|
||||
|
||||
s.Set(StreamHeaderMaxMarker, StreamHeaderMaxLength)
|
||||
|
||||
if s.Marker() != StreamHeaderMaxMarker {
|
||||
t.Errorf("Expecting the marker to be %d, got %d instead",
|
||||
StreamHeaderMaxMarker, s.Marker())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if s.Length() != StreamHeaderMaxLength {
|
||||
t.Errorf("Expecting the length to be %d, got %d instead",
|
||||
StreamHeaderMaxLength, s.Length())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if s[0] != s[1] || s[0] != 0xff {
|
||||
t.Errorf("Expecting the header to be 255, 255, got %d, %d instead",
|
||||
s[0], s[1])
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"strconv"
|
||||
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
//Errors
|
||||
var (
|
||||
ErrAddressParseBufferTooSmallForHeader = errors.New(
|
||||
"Buffer space was too small to parse the address header")
|
||||
|
||||
ErrAddressParseBufferTooSmallForIPv4 = errors.New(
|
||||
"Buffer space was too small to parse the IPv4 address")
|
||||
|
||||
ErrAddressParseBufferTooSmallForIPv6 = errors.New(
|
||||
"Buffer space was too small to parse the IPv6 address")
|
||||
|
||||
ErrAddressParseBufferTooSmallForHostName = errors.New(
|
||||
"Buffer space was too small to parse the hostname address")
|
||||
|
||||
ErrAddressMarshalBufferTooSmall = errors.New(
|
||||
"Buffer space was too small to marshal the address")
|
||||
|
||||
ErrAddressInvalidAddressType = errors.New(
|
||||
"Invalid address type")
|
||||
)
|
||||
|
||||
// AddressType Type of the address
|
||||
type AddressType byte
|
||||
|
||||
// Address types
|
||||
const (
|
||||
LoopbackAddr AddressType = 0x00
|
||||
IPv4Addr AddressType = 0x01
|
||||
IPv6Addr AddressType = 0x02
|
||||
HostNameAddr AddressType = 0x03
|
||||
)
|
||||
|
||||
// Address data
|
||||
type Address struct {
|
||||
port uint16
|
||||
kind AddressType
|
||||
data []byte
|
||||
}
|
||||
|
||||
// ParseAddress parses the reader and return an Address
|
||||
//
|
||||
// Address data format:
|
||||
// +-------------+--------------+---------------+
|
||||
// | 2 bytes | 1 byte | n bytes |
|
||||
// +-------------+--------------+---------------+
|
||||
// | Port number | Address type | Address data |
|
||||
// +-------------+--------------+---------------+
|
||||
//
|
||||
// Address types:
|
||||
// - LoopbackAddr: 00 Localhost, don't carry Address data
|
||||
// - IPv4Addr: 01 IPv4 Address, carries 4 bytes of Address data
|
||||
// - IPv6Addr: 10 IPv6 Address, carries 16 bytes Address data
|
||||
// - HostnameAddr: 11 Host name string, length of Address data is indicated
|
||||
// by the remainer of the byte (11-- ----). maxlen = 63
|
||||
//
|
||||
func ParseAddress(reader rw.ReaderFunc, buf []byte) (Address, error) {
|
||||
if len(buf) < 3 {
|
||||
return Address{}, ErrAddressParseBufferTooSmallForHeader
|
||||
}
|
||||
|
||||
_, rErr := rw.ReadFull(reader, buf[:3])
|
||||
|
||||
if rErr != nil {
|
||||
return Address{}, rErr
|
||||
}
|
||||
|
||||
portNum := uint16(0)
|
||||
portNum |= uint16(buf[0])
|
||||
portNum <<= 8
|
||||
portNum |= uint16(buf[1])
|
||||
|
||||
addrType := AddressType(buf[2] >> 6)
|
||||
|
||||
var addrData []byte
|
||||
|
||||
switch addrType {
|
||||
case LoopbackAddr:
|
||||
// Do nothing
|
||||
|
||||
case IPv4Addr:
|
||||
if len(buf) < 4 {
|
||||
return Address{}, ErrAddressParseBufferTooSmallForIPv4
|
||||
}
|
||||
|
||||
_, rErr := rw.ReadFull(reader, buf[:4])
|
||||
|
||||
if rErr != nil {
|
||||
return Address{}, rErr
|
||||
}
|
||||
|
||||
addrData = buf[:4]
|
||||
|
||||
case IPv6Addr:
|
||||
if len(buf) < 16 {
|
||||
return Address{}, ErrAddressParseBufferTooSmallForIPv6
|
||||
}
|
||||
|
||||
_, rErr := rw.ReadFull(reader, buf[:16])
|
||||
|
||||
if rErr != nil {
|
||||
return Address{}, rErr
|
||||
}
|
||||
|
||||
addrData = buf[:16]
|
||||
|
||||
case HostNameAddr:
|
||||
addrDataLen := int(0x3f & buf[2])
|
||||
|
||||
if len(buf) < addrDataLen {
|
||||
return Address{}, ErrAddressParseBufferTooSmallForHostName
|
||||
}
|
||||
|
||||
_, rErr := rw.ReadFull(reader, buf[:addrDataLen])
|
||||
|
||||
if rErr != nil {
|
||||
return Address{}, rErr
|
||||
}
|
||||
|
||||
addrData = buf[:addrDataLen]
|
||||
|
||||
default:
|
||||
return Address{}, ErrAddressInvalidAddressType
|
||||
}
|
||||
|
||||
return Address{
|
||||
port: portNum,
|
||||
kind: addrType,
|
||||
data: addrData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewAddress creates a new Address
|
||||
func NewAddress(addrType AddressType, data []byte, port uint16) Address {
|
||||
return Address{
|
||||
port: port,
|
||||
kind: addrType,
|
||||
data: data,
|
||||
}
|
||||
}
|
||||
|
||||
// Type returns the type of the address
|
||||
func (a Address) Type() AddressType {
|
||||
return a.kind
|
||||
}
|
||||
|
||||
// Data returns the address data
|
||||
func (a Address) Data() []byte {
|
||||
return a.data
|
||||
}
|
||||
|
||||
// Port returns port number
|
||||
func (a Address) Port() uint16 {
|
||||
return a.port
|
||||
}
|
||||
|
||||
// Marshal writes address data to the given b
|
||||
func (a Address) Marshal(b []byte) (int, error) {
|
||||
bLen := len(b)
|
||||
|
||||
switch a.Type() {
|
||||
case LoopbackAddr:
|
||||
if bLen < 3 {
|
||||
return 0, ErrAddressMarshalBufferTooSmall
|
||||
}
|
||||
|
||||
b[0] = byte(a.port >> 8)
|
||||
b[1] = byte(a.port)
|
||||
b[2] = byte(LoopbackAddr << 6)
|
||||
|
||||
return 3, nil
|
||||
|
||||
case IPv4Addr:
|
||||
if bLen < 7 {
|
||||
return 0, ErrAddressMarshalBufferTooSmall
|
||||
}
|
||||
|
||||
b[0] = byte(a.port >> 8)
|
||||
b[1] = byte(a.port)
|
||||
b[2] = byte(IPv4Addr << 6)
|
||||
|
||||
copy(b[3:], a.data)
|
||||
|
||||
return 7, nil
|
||||
|
||||
case IPv6Addr:
|
||||
if bLen < 19 {
|
||||
return 0, ErrAddressMarshalBufferTooSmall
|
||||
}
|
||||
|
||||
b[0] = byte(a.port >> 8)
|
||||
b[1] = byte(a.port)
|
||||
b[2] = byte(IPv6Addr << 6)
|
||||
|
||||
copy(b[3:], a.data)
|
||||
|
||||
return 19, nil
|
||||
|
||||
case HostNameAddr:
|
||||
hLen := len(a.data)
|
||||
|
||||
if hLen > 0x3f {
|
||||
panic("Host name cannot longer than 0x3f")
|
||||
}
|
||||
|
||||
if bLen < hLen+3 {
|
||||
return 0, ErrAddressMarshalBufferTooSmall
|
||||
}
|
||||
|
||||
b[0] = byte(a.port >> 8)
|
||||
b[1] = byte(a.port)
|
||||
b[2] = byte(HostNameAddr << 6)
|
||||
b[2] |= byte(hLen)
|
||||
|
||||
copy(b[3:], a.data)
|
||||
|
||||
return hLen + 3, nil
|
||||
|
||||
default:
|
||||
return 0, ErrAddressInvalidAddressType
|
||||
}
|
||||
}
|
||||
|
||||
// String return the Address as string
|
||||
func (a Address) String() string {
|
||||
switch a.Type() {
|
||||
case LoopbackAddr:
|
||||
return net.JoinHostPort(
|
||||
"localhost",
|
||||
strconv.FormatUint(uint64(a.Port()), 10))
|
||||
|
||||
case IPv4Addr:
|
||||
return net.JoinHostPort(
|
||||
net.IPv4(a.data[0], a.data[1], a.data[2], a.data[3]).String(),
|
||||
strconv.FormatUint(uint64(a.Port()), 10))
|
||||
|
||||
case IPv6Addr:
|
||||
return net.JoinHostPort(
|
||||
net.IP(a.data[:net.IPv6len]).String(),
|
||||
strconv.FormatUint(uint64(a.Port()), 10))
|
||||
|
||||
case HostNameAddr:
|
||||
return net.JoinHostPort(
|
||||
string(a.data),
|
||||
strconv.FormatUint(uint64(a.Port()), 10))
|
||||
|
||||
default:
|
||||
panic("Unknown Address type")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func testParseAddress(
|
||||
t *testing.T,
|
||||
input []byte,
|
||||
buf []byte,
|
||||
expectedType AddressType,
|
||||
expectedData []byte,
|
||||
expectedPort uint16,
|
||||
expectedHostPortString string,
|
||||
) {
|
||||
source := bytes.NewBuffer(input)
|
||||
addr, addrErr := ParseAddress(source.Read, buf)
|
||||
|
||||
if addrErr != nil {
|
||||
t.Error("Failed to parse due to error:", addrErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if addr.Type() != expectedType {
|
||||
t.Errorf("Expecting the Type to be %d, got %d instead",
|
||||
expectedType, addr.Type())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(addr.Data(), expectedData) {
|
||||
t.Errorf("Expecting the Data to be %d, got %d instead",
|
||||
expectedData, addr.Data())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if addr.Port() != expectedPort {
|
||||
t.Errorf("Expecting the Port to be %d, got %d instead",
|
||||
expectedPort, addr.Port())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if addr.String() != expectedHostPortString {
|
||||
t.Errorf("Expecting the Host Port string to be \"%s\", "+
|
||||
"got \"%s\" instead",
|
||||
expectedHostPortString, addr.String())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
output := make([]byte, len(input))
|
||||
mLen, mErr := addr.Marshal(output)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to marshal due to error:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(output[:mLen], input) {
|
||||
t.Errorf("Expecting marshaled result to be %d, got %d instead",
|
||||
input, output[:mLen])
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseAddress(t *testing.T) {
|
||||
testParseAddress(
|
||||
t, []byte{0x04, 0x1e, 0x00}, make([]byte, 3), LoopbackAddr, nil, 1054,
|
||||
"localhost:1054")
|
||||
|
||||
testParseAddress(
|
||||
t,
|
||||
[]byte{
|
||||
0x04, 0x1e, 0x40,
|
||||
0x7f, 0x00, 0x00, 0x01,
|
||||
},
|
||||
make([]byte, 4), IPv4Addr, []byte{0x7f, 0x00, 0x00, 0x01}, 1054,
|
||||
"127.0.0.1:1054")
|
||||
|
||||
testParseAddress(
|
||||
t,
|
||||
[]byte{
|
||||
0x04, 0x1e, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x7f, 0x00, 0x00, 0x01,
|
||||
},
|
||||
make([]byte, 16), IPv6Addr, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x7f, 0x00, 0x00, 0x01}, 1054,
|
||||
"[::7f00:1]:1054")
|
||||
|
||||
testParseAddress(
|
||||
t,
|
||||
[]byte{
|
||||
0x04, 0x1e, 0xff,
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'1', '2', '3',
|
||||
},
|
||||
make([]byte, 63), HostNameAddr, []byte{
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
||||
'1', '2', '3',
|
||||
}, 1054,
|
||||
strings.Repeat("ABCDEFGHIJ", 6)+"123:1054")
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"github.com/niruix/sshwifty/application/command"
|
||||
)
|
||||
|
||||
// New creates a new commands group
|
||||
func New() command.Commands {
|
||||
return command.Commands{
|
||||
newTelnet,
|
||||
newSSH,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrIntegerMarshalNotEnoughBuffer = errors.New(
|
||||
"Not enough buffer to marshal the integer")
|
||||
|
||||
ErrIntegerMarshalTooLarge = errors.New(
|
||||
"Integer cannot be marshalled, because the vaule was too large")
|
||||
)
|
||||
|
||||
// Integer is a 16bit unsigned integer data
|
||||
//
|
||||
// Format:
|
||||
// +-------------------------------------+--------------+
|
||||
// | 1 bit | 7 bits |
|
||||
// +-------------------------------------+--------------+
|
||||
// | 1 when current byte is the end byte | Integer data |
|
||||
// +-------------------------------------+--------------+
|
||||
//
|
||||
// Example:
|
||||
// - 00000000 00000000: 0
|
||||
// - 01111111: 127
|
||||
// - 11111111 01000000: 255
|
||||
type Integer uint16
|
||||
|
||||
const (
|
||||
integerHasNextBit = 0x80
|
||||
integerValueCutter = 0x7f
|
||||
)
|
||||
|
||||
// Consts
|
||||
const (
|
||||
MaxInteger = 0x3fff
|
||||
MaxIntegerBytes = 2
|
||||
)
|
||||
|
||||
// ByteSize returns how many bytes current integer will be encoded into
|
||||
func (i *Integer) ByteSize() int {
|
||||
if *i > integerValueCutter {
|
||||
return 2
|
||||
}
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
// Int returns a int of current Integer
|
||||
func (i *Integer) Int() int {
|
||||
return int(*i)
|
||||
}
|
||||
|
||||
// Marshal build serialized data of the integer
|
||||
func (i *Integer) Marshal(b []byte) (int, error) {
|
||||
bLen := len(b)
|
||||
|
||||
if *i > MaxInteger {
|
||||
return 0, ErrIntegerMarshalTooLarge
|
||||
}
|
||||
|
||||
if bLen < i.ByteSize() {
|
||||
return 0, ErrIntegerMarshalNotEnoughBuffer
|
||||
}
|
||||
|
||||
if *i <= integerValueCutter {
|
||||
b[0] = byte(*i & integerValueCutter)
|
||||
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
b[0] = byte((*i >> 7) | integerHasNextBit)
|
||||
b[1] = byte(*i & integerValueCutter)
|
||||
|
||||
return 2, nil
|
||||
}
|
||||
|
||||
// Unmarshal read data and parse the integer
|
||||
func (i *Integer) Unmarshal(reader rw.ReaderFunc) error {
|
||||
buf := [1]byte{}
|
||||
|
||||
for j := 0; j < MaxIntegerBytes; j++ {
|
||||
_, rErr := rw.ReadFull(reader, buf[:])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
*i |= Integer(buf[0] & integerValueCutter)
|
||||
|
||||
if integerHasNextBit&buf[0] == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
*i <<= 7
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestInteger(t *testing.T) {
|
||||
ii := Integer(0x3fff)
|
||||
result := Integer(0)
|
||||
buf := make([]byte, 2)
|
||||
|
||||
mLen, mErr := ii.Marshal(buf)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to marshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
mData := bytes.NewBuffer(buf[:mLen])
|
||||
mErr = result.Unmarshal(mData.Read)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to unmarshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result != ii {
|
||||
t.Errorf("Expecting result to be %d, got %d instead", ii, result)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegerSingleByte1(t *testing.T) {
|
||||
ii := Integer(102)
|
||||
result := Integer(0)
|
||||
buf := make([]byte, 2)
|
||||
|
||||
mLen, mErr := ii.Marshal(buf)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to marshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if mLen != 1 {
|
||||
t.Error("Expecting the Integer to be marshalled into %d bytes, got "+
|
||||
"%d instead", 1, mLen)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
mData := bytes.NewBuffer(buf[:mLen])
|
||||
mErr = result.Unmarshal(mData.Read)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to unmarshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result != ii {
|
||||
t.Errorf("Expecting result to be %d, got %d instead", ii, result)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegerSingleByte2(t *testing.T) {
|
||||
ii := Integer(127)
|
||||
result := Integer(0)
|
||||
buf := make([]byte, 2)
|
||||
|
||||
mLen, mErr := ii.Marshal(buf)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to marshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if mLen != 1 {
|
||||
t.Error("Expecting the Integer to be marshalled into %d bytes, got "+
|
||||
"%d instead", 1, mLen)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
mData := bytes.NewBuffer(buf[:mLen])
|
||||
mErr = result.Unmarshal(mData.Read)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to unmarshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if result != ii {
|
||||
t.Errorf("Expecting result to be %d, got %d instead", ii, result)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,664 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/crypto/ssh"
|
||||
|
||||
"github.com/niruix/sshwifty/application/command"
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Server -> client signal Consts
|
||||
const (
|
||||
SSHServerRemoteStdOut = 0x00
|
||||
SSHServerRemoteStdErr = 0x01
|
||||
SSHServerConnectFailed = 0x02
|
||||
SSHServerConnectSucceed = 0x03
|
||||
SSHServerConnectVerifyFingerprint = 0x04
|
||||
SSHServerConnectRequestCredential = 0x05
|
||||
)
|
||||
|
||||
// Client -> server signal consts
|
||||
const (
|
||||
SSHClientStdIn = 0x00
|
||||
SSHClientResize = 0x01
|
||||
SSHClientRespondFingerprint = 0x02
|
||||
SSHClientRespondCredential = 0x03
|
||||
)
|
||||
|
||||
const (
|
||||
sshCredentialMaxSize = 4096
|
||||
)
|
||||
|
||||
// Error codes
|
||||
const (
|
||||
SSHRequestErrorBadUserName = command.StreamError(0x01)
|
||||
SSHRequestErrorBadRemoteAddress = command.StreamError(0x02)
|
||||
SSHRequestErrorBadAuthMethod = command.StreamError(0x03)
|
||||
)
|
||||
|
||||
// Auth methods
|
||||
const (
|
||||
SSHAuthMethodNone byte = 0x00
|
||||
SSHAuthMethodPasspharse byte = 0x01
|
||||
SSHAuthMethodPrivateKey byte = 0x02
|
||||
)
|
||||
|
||||
type sshAuthMethodBuilder func(b []byte) []ssh.AuthMethod
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrSSHAuthCancelled = errors.New(
|
||||
"Authenication has been cancelled")
|
||||
|
||||
ErrSSHInvalidAuthMethod = errors.New(
|
||||
"Invalid auth method")
|
||||
|
||||
ErrSSHInvalidAddress = errors.New(
|
||||
"Invalid address")
|
||||
|
||||
ErrSSHRemoteFingerprintVerificationCancelled = errors.New(
|
||||
"Server Fingerprint verification process has been cancelled")
|
||||
|
||||
ErrSSHRemoteFingerprintRefused = errors.New(
|
||||
"Server Fingerprint has been refused")
|
||||
|
||||
ErrSSHRemoteConnUnavailable = errors.New(
|
||||
"Remote SSH connection is unavailable")
|
||||
|
||||
ErrSSHUnexpectedFingerprintVerificationRespond = errors.New(
|
||||
"Unexpected fingerprint verification respond")
|
||||
|
||||
ErrSSHUnexpectedCredentialDataRespond = errors.New(
|
||||
"Unexpected credential data respond")
|
||||
|
||||
ErrSSHCredentialDataTooLarge = errors.New(
|
||||
"Credential was too large")
|
||||
|
||||
ErrSSHUnknownClientSignal = errors.New(
|
||||
"Unknown client signal")
|
||||
)
|
||||
|
||||
type sshRemoteConn struct {
|
||||
writer io.Writer
|
||||
closer func() error
|
||||
session *ssh.Session
|
||||
}
|
||||
|
||||
func (s sshRemoteConn) isValid() bool {
|
||||
return s.writer != nil && s.closer != nil && s.session != nil
|
||||
}
|
||||
|
||||
type sshClient struct {
|
||||
w command.StreamResponder
|
||||
l log.Logger
|
||||
dial network.Dial
|
||||
dialTimeout time.Duration
|
||||
remoteCloseWait sync.WaitGroup
|
||||
credentialReceive chan []byte
|
||||
credentialProcessed bool
|
||||
credentialReceiveClosed bool
|
||||
fingerprintVerifyResultReceive chan bool
|
||||
fingerprintProcessed bool
|
||||
fingerprintVerifyResultReceiveClosed bool
|
||||
remoteConnReceive chan sshRemoteConn
|
||||
remoteConn sshRemoteConn
|
||||
}
|
||||
|
||||
func newSSH(
|
||||
l log.Logger,
|
||||
w command.StreamResponder,
|
||||
dial network.Dial,
|
||||
) command.FSMMachine {
|
||||
return &sshClient{
|
||||
w: w,
|
||||
l: l,
|
||||
dial: dial,
|
||||
dialTimeout: 10 * time.Second,
|
||||
remoteCloseWait: sync.WaitGroup{},
|
||||
credentialReceive: make(chan []byte, 1),
|
||||
credentialProcessed: false,
|
||||
credentialReceiveClosed: false,
|
||||
fingerprintVerifyResultReceive: make(chan bool, 1),
|
||||
fingerprintProcessed: false,
|
||||
fingerprintVerifyResultReceiveClosed: false,
|
||||
remoteConnReceive: make(chan sshRemoteConn, 1),
|
||||
remoteConn: sshRemoteConn{},
|
||||
}
|
||||
}
|
||||
|
||||
func (d *sshClient) Bootup(
|
||||
r *rw.LimitedReader,
|
||||
b []byte,
|
||||
) (command.FSMState, command.FSMError) {
|
||||
// User name
|
||||
userName, userNameErr := ParseString(r.Read, b)
|
||||
|
||||
if userNameErr != nil {
|
||||
return nil, command.ToFSMError(
|
||||
userNameErr, SSHRequestErrorBadUserName)
|
||||
}
|
||||
|
||||
userNameStr := string(userName.Data())
|
||||
|
||||
// Address
|
||||
addr, addrErr := ParseAddress(r.Read, b)
|
||||
|
||||
if addrErr != nil {
|
||||
return nil, command.ToFSMError(
|
||||
addrErr, SSHRequestErrorBadRemoteAddress)
|
||||
}
|
||||
|
||||
addrStr := addr.String()
|
||||
|
||||
if len(addrStr) <= 0 {
|
||||
return nil, command.ToFSMError(
|
||||
ErrSSHInvalidAddress, SSHRequestErrorBadRemoteAddress)
|
||||
}
|
||||
|
||||
// Auth method
|
||||
rData, rErr := rw.FetchOneByte(r.Fetch)
|
||||
|
||||
if rErr != nil {
|
||||
return nil, command.ToFSMError(
|
||||
rErr, SSHRequestErrorBadAuthMethod)
|
||||
}
|
||||
|
||||
authMethodBuilder, authMethodBuilderErr := d.buildAuthMethod(rData[0])
|
||||
|
||||
if authMethodBuilderErr != nil {
|
||||
return nil, command.ToFSMError(
|
||||
authMethodBuilderErr, SSHRequestErrorBadAuthMethod)
|
||||
}
|
||||
|
||||
d.remoteCloseWait.Add(1)
|
||||
go d.remote(userNameStr, addrStr, authMethodBuilder)
|
||||
|
||||
return d.local, command.NoFSMError()
|
||||
}
|
||||
|
||||
func (d *sshClient) buildAuthMethod(
|
||||
methodType byte) (sshAuthMethodBuilder, error) {
|
||||
switch methodType {
|
||||
case SSHAuthMethodNone:
|
||||
return func(b []byte) []ssh.AuthMethod {
|
||||
return nil
|
||||
}, nil
|
||||
|
||||
case SSHAuthMethodPasspharse:
|
||||
return func(b []byte) []ssh.AuthMethod {
|
||||
return []ssh.AuthMethod{
|
||||
ssh.PasswordCallback(func() (string, error) {
|
||||
wErr := d.w.SendManual(
|
||||
SSHServerConnectRequestCredential,
|
||||
b[d.w.HeaderSize():],
|
||||
)
|
||||
|
||||
if wErr != nil {
|
||||
return "", wErr
|
||||
}
|
||||
|
||||
passpharseBytes, passpharseReceived := <-d.credentialReceive
|
||||
|
||||
if !passpharseReceived {
|
||||
return "", ErrSSHAuthCancelled
|
||||
}
|
||||
|
||||
return string(passpharseBytes), nil
|
||||
}),
|
||||
}
|
||||
}, nil
|
||||
|
||||
case SSHAuthMethodPrivateKey:
|
||||
return func(b []byte) []ssh.AuthMethod {
|
||||
return []ssh.AuthMethod{
|
||||
ssh.PublicKeysCallback(func() ([]ssh.Signer, error) {
|
||||
wErr := d.w.SendManual(
|
||||
SSHServerConnectRequestCredential,
|
||||
b[d.w.HeaderSize():],
|
||||
)
|
||||
|
||||
if wErr != nil {
|
||||
return nil, wErr
|
||||
}
|
||||
|
||||
privateKeyBytes, privateKeyReceived := <-d.credentialReceive
|
||||
|
||||
if !privateKeyReceived {
|
||||
return nil, ErrSSHAuthCancelled
|
||||
}
|
||||
|
||||
signer, signerErr := ssh.ParsePrivateKey(privateKeyBytes)
|
||||
|
||||
if signerErr != nil {
|
||||
return nil, signerErr
|
||||
}
|
||||
|
||||
return []ssh.Signer{signer}, signerErr
|
||||
}),
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
return nil, ErrSSHInvalidAuthMethod
|
||||
}
|
||||
|
||||
func (d *sshClient) comfirmRemoteFingerprint(
|
||||
hostname string,
|
||||
remote net.Addr,
|
||||
key ssh.PublicKey,
|
||||
buf []byte,
|
||||
) error {
|
||||
fgp := ssh.FingerprintSHA256(key)
|
||||
fgpLen := copy(buf[d.w.HeaderSize():], fgp)
|
||||
|
||||
wErr := d.w.SendManual(
|
||||
SSHServerConnectVerifyFingerprint,
|
||||
buf[:d.w.HeaderSize()+fgpLen],
|
||||
)
|
||||
|
||||
if wErr != nil {
|
||||
return wErr
|
||||
}
|
||||
|
||||
confirmed, confirmOK := <-d.fingerprintVerifyResultReceive
|
||||
|
||||
if !confirmOK {
|
||||
return ErrSSHRemoteFingerprintVerificationCancelled
|
||||
}
|
||||
|
||||
if !confirmed {
|
||||
return ErrSSHRemoteFingerprintRefused
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *sshClient) dialRemote(
|
||||
network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) {
|
||||
conn, err := d.dial(network, addr, config.Timeout)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c, chans, reqs, err := ssh.NewClientConn(conn, addr, config)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ssh.NewClient(c, chans, reqs), nil
|
||||
}
|
||||
|
||||
func (d *sshClient) remote(
|
||||
user string, address string, authMethodBuilder sshAuthMethodBuilder) {
|
||||
defer func() {
|
||||
d.w.Signal(command.HeaderClose)
|
||||
|
||||
close(d.remoteConnReceive)
|
||||
d.remoteCloseWait.Done()
|
||||
}()
|
||||
|
||||
buf := [4096]byte{}
|
||||
|
||||
conn, dErr := d.dialRemote("tcp", address, &ssh.ClientConfig{
|
||||
User: user,
|
||||
Auth: authMethodBuilder(buf[:]),
|
||||
HostKeyCallback: func(h string, r net.Addr, k ssh.PublicKey) error {
|
||||
return d.comfirmRemoteFingerprint(h, r, k, buf[:])
|
||||
},
|
||||
Timeout: d.dialTimeout,
|
||||
})
|
||||
|
||||
if dErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], dErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable to connect to remote machine: %s", dErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
defer conn.Close()
|
||||
|
||||
session, sErr := conn.NewSession()
|
||||
|
||||
if sErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], sErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable open new session on remote machine: %s", sErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
defer session.Close()
|
||||
|
||||
in, inErr := session.StdinPipe()
|
||||
|
||||
if inErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], inErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable export Stdin pipe: %s", inErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
out, outErr := session.StdoutPipe()
|
||||
|
||||
if outErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], outErr.Error()) +
|
||||
d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable export Stdout pipe: %s", outErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
errOut, outErrErr := session.StderrPipe()
|
||||
|
||||
if outErrErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], outErrErr.Error()) +
|
||||
d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable export Stderr pipe: %s", outErrErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
sErr = session.RequestPty("xterm", 80, 40, ssh.TerminalModes{
|
||||
ssh.ECHO: 1,
|
||||
ssh.TTY_OP_ISPEED: 14400,
|
||||
ssh.TTY_OP_OSPEED: 14400,
|
||||
})
|
||||
|
||||
if sErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], sErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable request PTY: %s", sErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
sErr = session.Shell()
|
||||
|
||||
if sErr != nil {
|
||||
errLen := copy(buf[d.w.HeaderSize():], sErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(SSHServerConnectFailed, buf[:errLen])
|
||||
|
||||
d.l.Debug("Unable to start Shell: %s", sErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
defer session.Wait()
|
||||
|
||||
d.remoteConnReceive <- sshRemoteConn{
|
||||
writer: in,
|
||||
closer: func() error {
|
||||
sErr := session.Close()
|
||||
|
||||
if sErr != nil {
|
||||
return sErr
|
||||
}
|
||||
|
||||
return conn.Close()
|
||||
},
|
||||
session: session,
|
||||
}
|
||||
|
||||
wErr := d.w.SendManual(
|
||||
SSHServerConnectSucceed, buf[:d.w.HeaderSize()])
|
||||
|
||||
if wErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
d.l.Debug("Serving")
|
||||
|
||||
d.remoteCloseWait.Add(1)
|
||||
|
||||
go func() {
|
||||
defer d.remoteCloseWait.Done()
|
||||
|
||||
errOutBuf := [4096]byte{}
|
||||
|
||||
for {
|
||||
rLen, rErr := errOut.Read(errOutBuf[d.w.HeaderSize():])
|
||||
|
||||
if rErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
rErr = d.w.SendManual(
|
||||
SSHServerRemoteStdErr, errOutBuf[:d.w.HeaderSize()+rLen])
|
||||
|
||||
if rErr != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
for {
|
||||
rLen, rErr := out.Read(buf[d.w.HeaderSize():])
|
||||
|
||||
if rErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
rErr = d.w.SendManual(
|
||||
SSHServerRemoteStdOut, buf[:d.w.HeaderSize()+rLen])
|
||||
|
||||
if rErr != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *sshClient) getRemote() (sshRemoteConn, error) {
|
||||
if d.remoteConn.isValid() {
|
||||
return d.remoteConn, nil
|
||||
}
|
||||
|
||||
remoteConn, remoteConnFetched := <-d.remoteConnReceive
|
||||
|
||||
if !remoteConnFetched {
|
||||
return sshRemoteConn{}, ErrSSHRemoteConnUnavailable
|
||||
}
|
||||
|
||||
d.remoteConn = remoteConn
|
||||
|
||||
return d.remoteConn, nil
|
||||
}
|
||||
|
||||
func (d *sshClient) local(
|
||||
f *command.FSM,
|
||||
r *rw.LimitedReader,
|
||||
h command.StreamHeader,
|
||||
b []byte,
|
||||
) error {
|
||||
switch h.Marker() {
|
||||
case SSHClientStdIn:
|
||||
remote, remoteErr := d.getRemote()
|
||||
|
||||
if remoteErr != nil {
|
||||
return remoteErr
|
||||
}
|
||||
|
||||
for !r.Completed() {
|
||||
rData, rErr := r.Buffered()
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
_, wErr := remote.writer.Write(rData)
|
||||
|
||||
if wErr != nil {
|
||||
return wErr
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case SSHClientResize:
|
||||
remote, remoteErr := d.getRemote()
|
||||
|
||||
if remoteErr != nil {
|
||||
return remoteErr
|
||||
}
|
||||
|
||||
_, rErr := io.ReadFull(r, b[:4])
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
rows := int(b[0])
|
||||
rows <<= 8
|
||||
rows |= int(b[1])
|
||||
|
||||
cols := int(b[2])
|
||||
cols <<= 8
|
||||
cols |= int(b[3])
|
||||
|
||||
// It's ok for it to fail
|
||||
wcErr := remote.session.WindowChange(rows, cols)
|
||||
|
||||
if wcErr != nil {
|
||||
d.l.Debug("Failed to resize to %d, %d: %s", rows, cols, wcErr)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case SSHClientRespondFingerprint:
|
||||
if d.fingerprintProcessed {
|
||||
return ErrSSHUnexpectedFingerprintVerificationRespond
|
||||
}
|
||||
|
||||
d.fingerprintProcessed = true
|
||||
|
||||
rData, rErr := rw.FetchOneByte(r.Fetch)
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
comfirmed := rData[0] == 0
|
||||
|
||||
if !comfirmed {
|
||||
d.fingerprintVerifyResultReceive <- false
|
||||
|
||||
remote, remoteErr := d.getRemote()
|
||||
|
||||
if remoteErr == nil {
|
||||
remote.closer()
|
||||
}
|
||||
} else {
|
||||
d.fingerprintVerifyResultReceive <- true
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case SSHClientRespondCredential:
|
||||
if d.credentialProcessed {
|
||||
return ErrSSHUnexpectedCredentialDataRespond
|
||||
}
|
||||
|
||||
d.credentialProcessed = true
|
||||
|
||||
sshCredentialBufSize := 0
|
||||
|
||||
if r.Remains() > sshCredentialMaxSize {
|
||||
sshCredentialBufSize = sshCredentialMaxSize
|
||||
} else {
|
||||
sshCredentialBufSize = r.Remains()
|
||||
}
|
||||
|
||||
credentialDataBuf := make([]byte, 0, sshCredentialBufSize)
|
||||
totalCredentialRead := 0
|
||||
|
||||
for !r.Completed() {
|
||||
rData, rErr := r.Buffered()
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
totalCredentialRead += len(rData)
|
||||
|
||||
if totalCredentialRead > sshCredentialBufSize {
|
||||
return ErrSSHCredentialDataTooLarge
|
||||
}
|
||||
|
||||
credentialDataBuf = append(credentialDataBuf, rData...)
|
||||
}
|
||||
|
||||
d.credentialReceive <- credentialDataBuf
|
||||
|
||||
return nil
|
||||
|
||||
default:
|
||||
return ErrSSHUnknownClientSignal
|
||||
}
|
||||
}
|
||||
|
||||
func (d *sshClient) Close() error {
|
||||
d.credentialProcessed = true
|
||||
d.fingerprintProcessed = true
|
||||
|
||||
if !d.credentialReceiveClosed {
|
||||
close(d.credentialReceive)
|
||||
|
||||
d.credentialReceiveClosed = true
|
||||
}
|
||||
|
||||
if !d.fingerprintVerifyResultReceiveClosed {
|
||||
close(d.fingerprintVerifyResultReceive)
|
||||
|
||||
d.fingerprintVerifyResultReceiveClosed = true
|
||||
}
|
||||
|
||||
remote, remoteErr := d.getRemote()
|
||||
|
||||
if remoteErr == nil {
|
||||
remote.closer()
|
||||
}
|
||||
|
||||
d.remoteCloseWait.Wait()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *sshClient) Release() error {
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrStringParseBufferTooSmall = errors.New(
|
||||
"Not enough buffer space to parse given string")
|
||||
|
||||
ErrStringMarshalBufferTooSmall = errors.New(
|
||||
"Not enough buffer space to marshal given string")
|
||||
)
|
||||
|
||||
// String data
|
||||
type String struct {
|
||||
len Integer
|
||||
data []byte
|
||||
}
|
||||
|
||||
// ParseString build the String according to readed data
|
||||
func ParseString(reader rw.ReaderFunc, b []byte) (String, error) {
|
||||
lenData := Integer(0)
|
||||
|
||||
mErr := lenData.Unmarshal(reader)
|
||||
|
||||
if mErr != nil {
|
||||
return String{}, mErr
|
||||
}
|
||||
|
||||
bLen := len(b)
|
||||
|
||||
if bLen < lenData.Int() {
|
||||
return String{}, ErrStringParseBufferTooSmall
|
||||
}
|
||||
|
||||
_, rErr := rw.ReadFull(reader, b[:lenData])
|
||||
|
||||
if rErr != nil {
|
||||
return String{}, rErr
|
||||
}
|
||||
|
||||
return String{
|
||||
len: lenData,
|
||||
data: b[:lenData],
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewString create a new String
|
||||
func NewString(d []byte) String {
|
||||
dLen := len(d)
|
||||
|
||||
if dLen > MaxInteger {
|
||||
panic("Data was too long for a String")
|
||||
}
|
||||
|
||||
return String{
|
||||
len: Integer(dLen),
|
||||
data: d,
|
||||
}
|
||||
}
|
||||
|
||||
// Data returns the data of the string
|
||||
func (s String) Data() []byte {
|
||||
return s.data
|
||||
}
|
||||
|
||||
// Marshal the string to give buffer
|
||||
func (s String) Marshal(b []byte) (int, error) {
|
||||
bLen := len(b)
|
||||
|
||||
if bLen < s.len.ByteSize()+len(s.data) {
|
||||
return 0, ErrStringMarshalBufferTooSmall
|
||||
}
|
||||
|
||||
mLen, mErr := s.len.Marshal(b)
|
||||
|
||||
if mErr != nil {
|
||||
return 0, mErr
|
||||
}
|
||||
|
||||
return copy(b[mLen:], s.data) + mLen, nil
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func testString(t *testing.T, str []byte) {
|
||||
ss := NewString(str)
|
||||
mm := make([]byte, len(str)+2)
|
||||
|
||||
mLen, mErr := ss.Marshal(mm)
|
||||
|
||||
if mErr != nil {
|
||||
t.Error("Failed to marshal:", mErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
buf := make([]byte, mLen)
|
||||
source := bytes.NewBuffer(mm[:mLen])
|
||||
result, rErr := ParseString(source.Read, buf)
|
||||
|
||||
if rErr != nil {
|
||||
t.Error("Failed to parse:", rErr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if !bytes.Equal(result.Data(), ss.Data()) {
|
||||
t.Errorf("Expecting the data to be %d, got %d instead",
|
||||
ss.Data(), result.Data())
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestString(t *testing.T) {
|
||||
testString(t, []byte{
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
})
|
||||
|
||||
testString(t, []byte{
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'i',
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package commands
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/command"
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrTelnetUnableToReceiveRemoteConn = errors.New(
|
||||
"Unable to acquire remote connection handle")
|
||||
)
|
||||
|
||||
// Error codes
|
||||
const (
|
||||
TelnetRequestErrorBadRemoteAddress = command.StreamError(0x01)
|
||||
)
|
||||
|
||||
// Server signal codes
|
||||
const (
|
||||
TelnetServerRemoteBand = 0x00
|
||||
TelnetServerDialFailed = 0x01
|
||||
TelnetServerDialConnected = 0x02
|
||||
)
|
||||
|
||||
type telnetClient struct {
|
||||
l log.Logger
|
||||
w command.StreamResponder
|
||||
dial network.Dial
|
||||
remoteChan chan io.WriteCloser
|
||||
remoteConn io.WriteCloser
|
||||
closeWait sync.WaitGroup
|
||||
dialTimeout time.Duration
|
||||
}
|
||||
|
||||
func newTelnet(
|
||||
l log.Logger,
|
||||
w command.StreamResponder,
|
||||
dial network.Dial,
|
||||
) command.FSMMachine {
|
||||
return &telnetClient{
|
||||
l: l,
|
||||
w: w,
|
||||
dial: dial,
|
||||
remoteChan: make(chan io.WriteCloser, 1),
|
||||
remoteConn: nil,
|
||||
closeWait: sync.WaitGroup{},
|
||||
dialTimeout: 10 * time.Second,
|
||||
}
|
||||
}
|
||||
|
||||
func (d *telnetClient) Bootup(
|
||||
r *rw.LimitedReader,
|
||||
b []byte) (command.FSMState, command.FSMError) {
|
||||
addr, addrErr := ParseAddress(r.Read, b)
|
||||
|
||||
if addrErr != nil {
|
||||
return nil, command.ToFSMError(
|
||||
addrErr, TelnetRequestErrorBadRemoteAddress)
|
||||
}
|
||||
|
||||
// TODO: Test whether or not the address is allowed
|
||||
|
||||
d.closeWait.Add(1)
|
||||
go d.remote(addr.String())
|
||||
|
||||
return d.client, command.NoFSMError()
|
||||
}
|
||||
|
||||
func (d *telnetClient) remote(addr string) {
|
||||
defer func() {
|
||||
d.w.Signal(command.HeaderClose)
|
||||
|
||||
close(d.remoteChan)
|
||||
d.closeWait.Done()
|
||||
}()
|
||||
|
||||
buf := [4096]byte{}
|
||||
|
||||
clientConn, clientConnErr := d.dial("tcp", addr, d.dialTimeout)
|
||||
|
||||
if clientConnErr != nil {
|
||||
errLen := copy(
|
||||
buf[d.w.HeaderSize():], clientConnErr.Error()) + d.w.HeaderSize()
|
||||
d.w.SendManual(TelnetServerDialFailed, buf[:errLen])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
defer clientConn.Close()
|
||||
|
||||
clientConnErr = d.w.SendManual(
|
||||
TelnetServerDialConnected,
|
||||
buf[:d.w.HeaderSize()],
|
||||
)
|
||||
|
||||
if clientConnErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
d.remoteChan <- clientConn
|
||||
|
||||
for {
|
||||
rLen, rErr := clientConn.Read(buf[d.w.HeaderSize():])
|
||||
|
||||
if rErr != nil {
|
||||
return
|
||||
}
|
||||
|
||||
wErr := d.w.SendManual(
|
||||
TelnetServerRemoteBand, buf[:rLen+d.w.HeaderSize()])
|
||||
|
||||
if wErr != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *telnetClient) getRemote() (io.WriteCloser, error) {
|
||||
if d.remoteConn != nil {
|
||||
return d.remoteConn, nil
|
||||
}
|
||||
|
||||
remoteConn, ok := <-d.remoteChan
|
||||
|
||||
if !ok {
|
||||
return nil, ErrTelnetUnableToReceiveRemoteConn
|
||||
}
|
||||
|
||||
d.remoteConn = remoteConn
|
||||
|
||||
return d.remoteConn, nil
|
||||
}
|
||||
|
||||
func (d *telnetClient) client(
|
||||
f *command.FSM,
|
||||
r *rw.LimitedReader,
|
||||
h command.StreamHeader,
|
||||
b []byte,
|
||||
) error {
|
||||
remoteConn, remoteConnErr := d.getRemote()
|
||||
|
||||
if remoteConnErr != nil {
|
||||
return remoteConnErr
|
||||
}
|
||||
|
||||
// All Telnet requests are in-band, so we just directly send them all
|
||||
// to the server
|
||||
for !r.Completed() {
|
||||
rBuf, rErr := r.Buffered()
|
||||
|
||||
if rErr != nil {
|
||||
return rErr
|
||||
}
|
||||
|
||||
_, wErr := remoteConn.Write(rBuf)
|
||||
|
||||
if wErr != nil {
|
||||
return wErr
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *telnetClient) Close() error {
|
||||
remoteConn, remoteConnErr := d.getRemote()
|
||||
|
||||
if remoteConnErr == nil {
|
||||
remoteConn.Close()
|
||||
}
|
||||
|
||||
d.closeWait.Wait()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *telnetClient) Release() error {
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package configuration
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
)
|
||||
|
||||
// Server contains configuration of a HTTP server
|
||||
type Server struct {
|
||||
ListenInterface string
|
||||
ListenPort uint16
|
||||
InitialTimeout time.Duration
|
||||
ReadTimeout time.Duration
|
||||
WriteTimeout time.Duration
|
||||
HeartbeatTimeout time.Duration
|
||||
ReadDelay time.Duration
|
||||
WriteDelay time.Duration
|
||||
TLSCertificateFile string
|
||||
TLSCertificateKeyFile string
|
||||
}
|
||||
|
||||
func (s Server) defaultListenInterface() string {
|
||||
if len(s.ListenInterface) > 0 {
|
||||
return s.ListenInterface
|
||||
}
|
||||
|
||||
return net.IPv4(127, 0, 0, 1).String()
|
||||
}
|
||||
|
||||
func (s Server) defaultListenPort() uint16 {
|
||||
if s.ListenPort > 0 {
|
||||
return s.ListenPort
|
||||
}
|
||||
|
||||
return 80
|
||||
}
|
||||
|
||||
func (s Server) maxDur(cur, def time.Duration) time.Duration {
|
||||
if cur > def {
|
||||
return cur
|
||||
}
|
||||
|
||||
return def
|
||||
}
|
||||
|
||||
// WithDefault build the configuration and fill the blank with default values
|
||||
func (s Server) WithDefault() Server {
|
||||
initialTimeout := s.maxDur(s.InitialTimeout, 1*time.Second)
|
||||
|
||||
readTimeout := s.maxDur(initialTimeout, 3*time.Second)
|
||||
readTimeout = s.maxDur(s.ReadTimeout, readTimeout)
|
||||
|
||||
return Server{
|
||||
ListenInterface: s.defaultListenInterface(),
|
||||
ListenPort: s.defaultListenPort(),
|
||||
InitialTimeout: initialTimeout,
|
||||
ReadTimeout: readTimeout,
|
||||
WriteTimeout: s.maxDur(s.WriteTimeout, 3*time.Second),
|
||||
HeartbeatTimeout: s.maxDur(s.ReadTimeout, readTimeout/2),
|
||||
ReadDelay: 0,
|
||||
WriteDelay: 0,
|
||||
TLSCertificateFile: "",
|
||||
TLSCertificateKeyFile: "",
|
||||
}
|
||||
}
|
||||
|
||||
// IsTLS returns whether or not TLS should be used
|
||||
func (s Server) IsTLS() bool {
|
||||
return len(s.TLSCertificateFile) > 0 && len(s.TLSCertificateKeyFile) > 0
|
||||
}
|
||||
|
||||
// Verify verifies current configuration
|
||||
func (s Server) Verify() error {
|
||||
if net.ParseIP(s.ListenInterface) == nil {
|
||||
return fmt.Errorf("Invalid IP address \"%s\"", s.ListenInterface)
|
||||
}
|
||||
|
||||
if (len(s.TLSCertificateFile) > 0 && len(s.TLSCertificateKeyFile) <= 0) ||
|
||||
(len(s.TLSCertificateFile) <= 0 && len(s.TLSCertificateKeyFile) > 0) {
|
||||
return errors.New("TLSCertificateFile and TLSCertificateKeyFile must " +
|
||||
"both be specified in order to enable TLS")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Configuration contains configuration of the application
|
||||
type Configuration struct {
|
||||
HostName string
|
||||
SharedKey string
|
||||
Dialer network.Dial
|
||||
Servers []Server
|
||||
}
|
||||
|
||||
// Common settings shared by mulitple servers
|
||||
type Common struct {
|
||||
HostName string
|
||||
SharedKey string
|
||||
Dialer network.Dial
|
||||
}
|
||||
|
||||
// Verify verifies current setting
|
||||
func (c Configuration) Verify() error {
|
||||
if len(c.Servers) <= 0 {
|
||||
return errors.New("Must specify at least one server")
|
||||
}
|
||||
|
||||
for i, c := range c.Servers {
|
||||
vErr := c.Verify()
|
||||
|
||||
if vErr == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
return fmt.Errorf("Invalid setting for server %d: %s", i, vErr)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Common returns common settings
|
||||
func (c Configuration) Common() Common {
|
||||
return Common{
|
||||
HostName: c.HostName,
|
||||
SharedKey: c.SharedKey,
|
||||
Dialer: c.Dialer,
|
||||
}
|
||||
}
|
||||
|
||||
// WithDefault build the configuration and fill the blank with default values
|
||||
func (c Common) WithDefault() Common {
|
||||
dialer := c.Dialer
|
||||
|
||||
if dialer == nil {
|
||||
dialer = network.TCPDial()
|
||||
}
|
||||
|
||||
return Common{
|
||||
HostName: c.HostName,
|
||||
SharedKey: c.SharedKey,
|
||||
Dialer: dialer,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package configuration
|
||||
|
||||
import (
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
// Loader Configuration loader
|
||||
type Loader func(log log.Logger) (name string, cfg Configuration, err error)
|
||||
@@ -0,0 +1,107 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package configuration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
)
|
||||
|
||||
const (
|
||||
enviroTypeName = "Environment Variable"
|
||||
)
|
||||
|
||||
// Enviro creates an environment variable based configuration loader
|
||||
func Enviro() Loader {
|
||||
return func(log log.Logger) (string, Configuration, error) {
|
||||
log.Info("Loading configuration from environment variables ...")
|
||||
|
||||
cfg := fileCfgCommon{
|
||||
HostName: os.Getenv("SSHWIFTY_HOSTNAME"),
|
||||
SharedKey: os.Getenv("SSHWIFTY_SHAREDKEY"),
|
||||
Socks5: os.Getenv("SSHWIFTY_SOCKS5"),
|
||||
Socks5User: os.Getenv("SSHWIFTY_SOCKS5_USER"),
|
||||
Socks5Password: os.Getenv("SSHWIFTY_SOCKS5_PASSWORD"),
|
||||
}
|
||||
|
||||
listenPort, listenPortErr := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_LISTENPORT"), 10, 16)
|
||||
|
||||
if listenPortErr != nil {
|
||||
return enviroTypeName, Configuration{}, fmt.Errorf(
|
||||
"Invalid \"SSHWIFTY_LISTENPORT\": %s", listenPortErr)
|
||||
}
|
||||
|
||||
initialTimeout, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_INITIALTIMEOUT"), 10, 32)
|
||||
|
||||
readTimeout, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_READTIMEOUT"), 10, 32)
|
||||
|
||||
writeTimeout, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_WRITETIMEOUT"), 10, 32)
|
||||
|
||||
heartbeatTimeout, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_HEARTBEATTIMEOUT"), 10, 32)
|
||||
|
||||
readDelay, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_READDELAY"), 10, 32)
|
||||
|
||||
writeDelay, _ := strconv.ParseUint(
|
||||
os.Getenv("SSHWIFTY_WRITEELAY"), 10, 32)
|
||||
|
||||
cfgSer := fileCfgServer{
|
||||
ListenInterface: os.Getenv("SSHWIFTY_LISTENINTERFACE"),
|
||||
ListenPort: uint16(listenPort),
|
||||
InitialTimeout: int(initialTimeout),
|
||||
ReadTimeout: int(readTimeout),
|
||||
WriteTimeout: int(writeTimeout),
|
||||
HeartbeatTimeout: int(heartbeatTimeout),
|
||||
ReadDelay: int(readDelay),
|
||||
WriteDelay: int(writeDelay),
|
||||
TLSCertificateFile: os.Getenv("SSHWIFTY_TLSCERTIFICATEFILE"),
|
||||
TLSCertificateKeyFile: os.Getenv("SSHWIFTY_TLSCERTIFICATEKEYFILE"),
|
||||
}
|
||||
|
||||
var dialer network.Dial
|
||||
|
||||
if len(cfg.Socks5) <= 0 {
|
||||
dialer = network.TCPDial()
|
||||
} else {
|
||||
sDial, sDialErr := network.BuildSocks5Dial(
|
||||
cfg.Socks5, cfg.Socks5User, cfg.Socks5Password)
|
||||
|
||||
if sDialErr != nil {
|
||||
return enviroTypeName, Configuration{}, sDialErr
|
||||
}
|
||||
|
||||
dialer = sDial
|
||||
}
|
||||
|
||||
return enviroTypeName, Configuration{
|
||||
HostName: cfg.HostName,
|
||||
SharedKey: cfg.SharedKey,
|
||||
Dialer: dialer,
|
||||
Servers: []Server{cfgSer.build()},
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package configuration
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/user"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/network"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
const (
|
||||
fileTypeName = "File"
|
||||
)
|
||||
|
||||
type fileCfgServer struct {
|
||||
ListenInterface string // Interface to listen to
|
||||
ListenPort uint16 // Port to listen
|
||||
InitialTimeout int // Client initial request timeout, in second
|
||||
ReadTimeout int // Read operation timeout, in second
|
||||
WriteTimeout int // Write operation timeout, in second
|
||||
HeartbeatTimeout int // Client heartbeat interval, in second
|
||||
ReadDelay int // Read delay, in millisecond
|
||||
WriteDelay int // Write delay, in millisecond
|
||||
TLSCertificateFile string // Location of TLS certificate file
|
||||
TLSCertificateKeyFile string // Location of TLS certificate key
|
||||
}
|
||||
|
||||
func (f fileCfgServer) minDur(current, min int) int {
|
||||
if current > min {
|
||||
return current
|
||||
}
|
||||
|
||||
return min
|
||||
}
|
||||
|
||||
func (f *fileCfgServer) build() Server {
|
||||
return Server{
|
||||
ListenInterface: f.ListenInterface,
|
||||
ListenPort: f.ListenPort,
|
||||
InitialTimeout: time.Duration(
|
||||
f.minDur(f.InitialTimeout, 5)) * time.Second,
|
||||
ReadTimeout: time.Duration(
|
||||
f.minDur(f.ReadTimeout, 30)) * time.Second,
|
||||
WriteTimeout: time.Duration(
|
||||
f.minDur(f.WriteTimeout, 30)) * time.Second,
|
||||
HeartbeatTimeout: time.Duration(
|
||||
f.minDur(f.HeartbeatTimeout, 10)) * time.Second,
|
||||
ReadDelay: time.Duration(
|
||||
f.minDur(f.ReadDelay, 0)) * time.Millisecond,
|
||||
WriteDelay: time.Duration(
|
||||
f.minDur(f.WriteDelay, 0)) * time.Millisecond,
|
||||
TLSCertificateFile: f.TLSCertificateFile,
|
||||
TLSCertificateKeyFile: f.TLSCertificateKeyFile,
|
||||
}
|
||||
}
|
||||
|
||||
type fileCfgCommon struct {
|
||||
HostName string // Host name
|
||||
SharedKey string // Shared key, empty to enable public access
|
||||
Socks5 string // Socks5 server address, optional
|
||||
Socks5User string // Login user for socks5 server, optional
|
||||
Socks5Password string // Login pass for socks5 server, optional
|
||||
Servers []*fileCfgServer // Servers
|
||||
}
|
||||
|
||||
func loadFile(filePath string) (string, Configuration, error) {
|
||||
f, fErr := os.Open(filePath)
|
||||
|
||||
if fErr != nil {
|
||||
return fileTypeName, Configuration{}, fErr
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
|
||||
cfg := fileCfgCommon{}
|
||||
|
||||
jDecoder := json.NewDecoder(f)
|
||||
jDecodeErr := jDecoder.Decode(&cfg)
|
||||
|
||||
if jDecodeErr != nil {
|
||||
return fileTypeName, Configuration{}, jDecodeErr
|
||||
}
|
||||
|
||||
servers := make([]Server, len(cfg.Servers))
|
||||
|
||||
for i := range servers {
|
||||
servers[i] = cfg.Servers[i].build()
|
||||
}
|
||||
|
||||
var dialer network.Dial
|
||||
|
||||
if len(cfg.Socks5) <= 0 {
|
||||
dialer = network.TCPDial()
|
||||
} else {
|
||||
sDial, sDialErr := network.BuildSocks5Dial(
|
||||
cfg.Socks5, cfg.Socks5User, cfg.Socks5Password)
|
||||
|
||||
if sDialErr != nil {
|
||||
return fileTypeName, Configuration{}, sDialErr
|
||||
}
|
||||
|
||||
dialer = sDial
|
||||
}
|
||||
|
||||
return fileTypeName, Configuration{
|
||||
HostName: cfg.HostName,
|
||||
SharedKey: cfg.SharedKey,
|
||||
Dialer: dialer,
|
||||
Servers: servers,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// File creates a configuration file loader
|
||||
func File(customPath string) Loader {
|
||||
return func(log log.Logger) (string, Configuration, error) {
|
||||
if len(customPath) > 0 {
|
||||
log.Info("Loading configuration from: %s", customPath)
|
||||
|
||||
return loadFile(customPath)
|
||||
}
|
||||
|
||||
fallbackFileSearchList := make([]string, 0, 3)
|
||||
|
||||
// ~/.config/sshwifty.conf.json
|
||||
u, userErr := user.Current()
|
||||
if userErr == nil {
|
||||
fallbackFileSearchList = append(
|
||||
fallbackFileSearchList,
|
||||
path.Join(u.HomeDir, ".config", "sshwifty.conf.json"))
|
||||
}
|
||||
|
||||
// /etc/sshwifty.conf.json
|
||||
fallbackFileSearchList = append(
|
||||
fallbackFileSearchList, "/etc/sshwifty.conf.json")
|
||||
|
||||
// sshwifty.conf.json located at the same directory as Sshwifty bin
|
||||
ex, exErr := os.Executable()
|
||||
if exErr == nil {
|
||||
fallbackFileSearchList = append(
|
||||
fallbackFileSearchList,
|
||||
path.Join(filepath.Dir(ex), "sshwifty.conf.json"))
|
||||
}
|
||||
|
||||
for f := range fallbackFileSearchList {
|
||||
fInfo, fErr := os.Stat(fallbackFileSearchList[f])
|
||||
|
||||
if fErr != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if fInfo.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
log.Info("Loading configuration from: %s",
|
||||
fallbackFileSearchList[f])
|
||||
|
||||
return loadFile(fallbackFileSearchList[f])
|
||||
}
|
||||
|
||||
return "", Configuration{}, fmt.Errorf(
|
||||
"Configuration file was not specified. Also tried fallback files "+
|
||||
"\"%s\", but none of it was available",
|
||||
strings.Join(fallbackFileSearchList, "\", \""))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package configuration
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
const (
|
||||
redundantTypeName = "Redundant"
|
||||
)
|
||||
|
||||
// Redundant creates a group of loaders. They will be executed one by one until
|
||||
// one of it successfully returned a configuration
|
||||
func Redundant(loaders ...Loader) Loader {
|
||||
return func(log log.Logger) (string, Configuration, error) {
|
||||
ll := log.Context("Redundant")
|
||||
|
||||
for i := range loaders {
|
||||
lLoaderName, lCfg, lErr := loaders[i](ll)
|
||||
|
||||
if lErr != nil {
|
||||
ll.Warning("Unable to load configuration from \"%s\": %s",
|
||||
lLoaderName, lErr)
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
return lLoaderName, lCfg, nil
|
||||
}
|
||||
|
||||
return redundantTypeName, Configuration{}, fmt.Errorf(
|
||||
"All existing redundant loader has failed")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
// Error
|
||||
var (
|
||||
ErrControllerNotImplemented = NewError(
|
||||
http.StatusNotImplemented, "Server does not know how to handle the "+
|
||||
"request")
|
||||
)
|
||||
|
||||
type controller interface {
|
||||
Get(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Head(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Post(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Put(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Delete(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Connect(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Options(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Trace(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Patch(w http.ResponseWriter, r *http.Request, l log.Logger) error
|
||||
Other(
|
||||
method string,
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
l log.Logger,
|
||||
) error
|
||||
}
|
||||
|
||||
type baseController struct{}
|
||||
|
||||
func (b baseController) Get(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Head(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Post(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Put(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Delete(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Connect(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Options(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Trace(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Patch(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func (b baseController) Other(
|
||||
method string, w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
func serveController(
|
||||
c controller,
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
l log.Logger,
|
||||
) error {
|
||||
switch strings.ToUpper(r.Method) {
|
||||
case "GET":
|
||||
return c.Get(w, r, l)
|
||||
case "HEAD":
|
||||
return c.Head(w, r, l)
|
||||
case "POST":
|
||||
return c.Post(w, r, l)
|
||||
case "PUT":
|
||||
return c.Put(w, r, l)
|
||||
case "DELETE":
|
||||
return c.Delete(w, r, l)
|
||||
case "CONNECT":
|
||||
return c.Connect(w, r, l)
|
||||
case "OPTIONS":
|
||||
return c.Options(w, r, l)
|
||||
case "TRACE":
|
||||
return c.Trace(w, r, l)
|
||||
case "PATCH":
|
||||
return c.Patch(w, r, l)
|
||||
default:
|
||||
return c.Other(r.Method, w, r, l)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func clientSupportGZIP(r *http.Request) bool {
|
||||
// Should be good enough
|
||||
return strings.Contains(r.Header.Get("Accept-Encoding"), "gzip")
|
||||
}
|
||||
|
||||
func clientContentEtagIsValid(r *http.Request, eTag string) bool {
|
||||
d := r.Header.Get("If-None-Match")
|
||||
|
||||
if len(d) < 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
dStart := 0
|
||||
qETag := "\"" + eTag + "\""
|
||||
|
||||
for {
|
||||
dIdx := strings.Index(d[dStart:], ",")
|
||||
|
||||
if dIdx < 0 {
|
||||
return strings.Contains(d[dStart:], qETag) ||
|
||||
strings.Contains(d[dStart:], "*")
|
||||
}
|
||||
|
||||
if strings.Contains(d[dStart:dStart+dIdx], qETag) {
|
||||
return true
|
||||
}
|
||||
|
||||
if strings.Contains(d[dStart:dStart+dIdx], "*") {
|
||||
return true
|
||||
}
|
||||
|
||||
dStart += dIdx + 1
|
||||
}
|
||||
}
|
||||
|
||||
func clientContentModifiedSince(r *http.Request, mod time.Time) bool {
|
||||
d := r.Header.Get("If-Modified-Since")
|
||||
|
||||
if len(d) < 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
dt, dtErr := time.Parse(time.RFC1123, d)
|
||||
|
||||
if dtErr != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return !mod.Before(dt)
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestClientContentEtagIsValid(t *testing.T) {
|
||||
test := func(id int, hd []string, etag string, expected bool) {
|
||||
r := http.Request{
|
||||
Header: http.Header{
|
||||
"If-None-Match": hd,
|
||||
},
|
||||
}
|
||||
rr := clientContentEtagIsValid(&r, etag)
|
||||
|
||||
if rr != expected {
|
||||
t.Errorf("Test: %d: Expecting the result to be %v, got %v instead",
|
||||
id, expected, rr)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
test(0, []string{""}, "test", false)
|
||||
test(1, []string{"*"}, "test", true)
|
||||
test(2, []string{"W/\"67ab43\", \"54ed21\", \"7892dd\""}, "54ed21", true)
|
||||
test(3, []string{"\"bfc13a64729c4290ef5b2c2730249c88ca92d82d\""},
|
||||
"bfc13a64729c4290ef5b2c2730249c88ca92d82d", true)
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/command"
|
||||
"github.com/niruix/sshwifty/application/configuration"
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/server"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrNotFound = NewError(
|
||||
http.StatusNotFound, "Page not found")
|
||||
)
|
||||
|
||||
// handler is the main service dispatcher
|
||||
type handler struct {
|
||||
hostNameChecker string
|
||||
commonCfg configuration.Common
|
||||
logger log.Logger
|
||||
homeCtl home
|
||||
socketCtl socket
|
||||
}
|
||||
|
||||
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
var err error
|
||||
|
||||
clientLogger := h.logger.Context("Client (%s)", r.RemoteAddr)
|
||||
|
||||
if len(h.commonCfg.HostName) > 0 {
|
||||
hostPort := r.Host
|
||||
|
||||
if len(hostPort) <= 0 {
|
||||
hostPort = r.URL.Host
|
||||
}
|
||||
|
||||
if h.commonCfg.HostName != hostPort &&
|
||||
!strings.HasPrefix(hostPort, h.hostNameChecker) {
|
||||
clientLogger.Warning("Request invalid host \"%s\", deined",
|
||||
r.Host)
|
||||
|
||||
serveFailure(
|
||||
NewError(http.StatusForbidden, "Invalid host"), w, r, h.logger)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
w.Header().Add("Date", time.Now().UTC().Format(time.RFC1123))
|
||||
|
||||
switch r.URL.Path {
|
||||
case "/":
|
||||
err = serveController(h.homeCtl, w, r, clientLogger)
|
||||
|
||||
case "/socket":
|
||||
err = serveController(h.socketCtl, w, r, clientLogger)
|
||||
|
||||
case "/robots.txt":
|
||||
fallthrough
|
||||
case "/favicon.ico":
|
||||
fallthrough
|
||||
case "/README.md":
|
||||
fallthrough
|
||||
case "/LICENSE.md":
|
||||
fallthrough
|
||||
case "/DEPENDENCES.md":
|
||||
err = serveStaticData(r.URL.Path[1:], w, r, clientLogger)
|
||||
|
||||
default:
|
||||
if strings.HasPrefix(r.URL.Path, "/assets/") {
|
||||
err = serveStaticData(r.URL.Path[8:], w, r, clientLogger)
|
||||
} else {
|
||||
err = ErrNotFound
|
||||
}
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
clientLogger.Info("Request completed: %s", r.URL.String())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
clientLogger.Warning("Request ended with error: %s: %s",
|
||||
r.URL.String(), err)
|
||||
|
||||
controllerErr, isControllerErr := err.(Error)
|
||||
|
||||
if isControllerErr {
|
||||
serveFailure(controllerErr, w, r, h.logger)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
serveFailure(
|
||||
NewError(http.StatusInternalServerError, err.Error()), w, r, h.logger)
|
||||
}
|
||||
|
||||
// Builder returns a http controller builder
|
||||
func Builder(cmds command.Commands) server.HandlerBuilder {
|
||||
return func(
|
||||
commonCfg configuration.Common,
|
||||
cfg configuration.Server,
|
||||
logger log.Logger,
|
||||
) http.Handler {
|
||||
return handler{
|
||||
hostNameChecker: commonCfg.HostName + ":",
|
||||
commonCfg: commonCfg,
|
||||
logger: logger,
|
||||
homeCtl: home{},
|
||||
socketCtl: newSocketCtl(commonCfg, cfg, cmds),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Error Controller error
|
||||
type Error struct {
|
||||
code int
|
||||
message string
|
||||
}
|
||||
|
||||
// NewError creates a new Error
|
||||
func NewError(code int, message string) Error {
|
||||
return Error{
|
||||
code: code,
|
||||
message: message,
|
||||
}
|
||||
}
|
||||
|
||||
// Code return the error code
|
||||
func (f Error) Code() int {
|
||||
return f.code
|
||||
}
|
||||
|
||||
// Error returns the error message
|
||||
func (f Error) Error() string {
|
||||
return fmt.Sprintf("HTTP Error (%d): %s", f.code, f.message)
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
func serveFailure(
|
||||
err Error,
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
l log.Logger,
|
||||
) error {
|
||||
w.WriteHeader(err.Code())
|
||||
|
||||
return serveStaticPage("error.html", w, r, l)
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
// home controller
|
||||
type home struct {
|
||||
baseController
|
||||
}
|
||||
|
||||
func (h home) Get(w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
return serveStaticPage("index.html", w, r, l)
|
||||
}
|
||||
@@ -0,0 +1,444 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/hmac"
|
||||
"crypto/rand"
|
||||
"crypto/sha512"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/niruix/sshwifty/application/command"
|
||||
"github.com/niruix/sshwifty/application/configuration"
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
"github.com/niruix/sshwifty/application/rw"
|
||||
)
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrSocketAuthFailed = NewError(
|
||||
http.StatusForbidden,
|
||||
"To use Websocket interface, a valid Auth Key must be provided")
|
||||
|
||||
ErrSocketUnableToGenerateKey = NewError(
|
||||
http.StatusInternalServerError,
|
||||
"Unable to generate crypto key")
|
||||
|
||||
ErrSocketInvalidDataPackage = NewError(
|
||||
http.StatusBadRequest, "Invalid data package")
|
||||
)
|
||||
|
||||
const (
|
||||
socketGCMStandardNonceSize = 12
|
||||
)
|
||||
|
||||
type socket struct {
|
||||
baseController
|
||||
|
||||
commonCfg configuration.Common
|
||||
serverCfg configuration.Server
|
||||
randomKey string
|
||||
authKey []byte
|
||||
upgrader websocket.Upgrader
|
||||
commander command.Commander
|
||||
}
|
||||
|
||||
func getNewSocketCtlRandomSharedKey() string {
|
||||
b := [32]byte{}
|
||||
|
||||
io.ReadFull(rand.Reader, b[:])
|
||||
|
||||
return base64.StdEncoding.EncodeToString(b[:])
|
||||
}
|
||||
|
||||
func getSocketAuthKey(randomKey string, sharedKey string) []byte {
|
||||
var k []byte
|
||||
|
||||
if len(sharedKey) > 0 {
|
||||
k = []byte(sharedKey)
|
||||
} else {
|
||||
k = []byte(randomKey)
|
||||
}
|
||||
|
||||
h := hmac.New(sha512.New, k)
|
||||
|
||||
h.Write([]byte(randomKey))
|
||||
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
||||
func newSocketCtl(
|
||||
commonCfg configuration.Common,
|
||||
cfg configuration.Server,
|
||||
cmds command.Commands,
|
||||
) socket {
|
||||
randomKey := getNewSocketCtlRandomSharedKey()
|
||||
|
||||
return socket{
|
||||
commonCfg: commonCfg,
|
||||
serverCfg: cfg,
|
||||
randomKey: randomKey,
|
||||
authKey: getSocketAuthKey(randomKey, commonCfg.SharedKey)[:32],
|
||||
upgrader: buildWebsocketUpgrader(cfg),
|
||||
commander: command.New(cmds),
|
||||
}
|
||||
}
|
||||
|
||||
type websocketWriter struct {
|
||||
*websocket.Conn
|
||||
}
|
||||
|
||||
func (w websocketWriter) Write(b []byte) (int, error) {
|
||||
wErr := w.WriteMessage(websocket.BinaryMessage, b)
|
||||
|
||||
if wErr != nil {
|
||||
return 0, wErr
|
||||
}
|
||||
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
type socketPackageWriter struct {
|
||||
w websocketWriter
|
||||
packager func(w websocketWriter, b []byte) error
|
||||
}
|
||||
|
||||
func (s socketPackageWriter) Write(b []byte) (int, error) {
|
||||
packageWriteErr := s.packager(s.w, b)
|
||||
|
||||
if packageWriteErr != nil {
|
||||
return 0, packageWriteErr
|
||||
}
|
||||
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
func buildWebsocketUpgrader(cfg configuration.Server) websocket.Upgrader {
|
||||
return websocket.Upgrader{
|
||||
HandshakeTimeout: cfg.InitialTimeout,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
Error: func(
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
status int,
|
||||
reason error,
|
||||
) {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s socket) Options(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
w.Header().Add("Access-Control-Allow-Origin", "*")
|
||||
w.Header().Add("Access-Control-Allow-Headers", "X-Key")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s socket) setServerConfigHeader(hd *http.Header) {
|
||||
hd.Add("X-Heartbeat",
|
||||
strconv.FormatFloat(s.serverCfg.HeartbeatTimeout.Seconds(), 'g', 2, 64))
|
||||
hd.Add("X-Timeout",
|
||||
strconv.FormatFloat(s.serverCfg.ReadTimeout.Seconds(), 'g', 2, 64))
|
||||
}
|
||||
|
||||
func (s socket) Head(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
key := r.Header.Get("X-Key")
|
||||
hd := w.Header()
|
||||
|
||||
if len(key) <= 0 {
|
||||
hd.Add("X-Key", s.randomKey)
|
||||
|
||||
if len(s.commonCfg.SharedKey) <= 0 {
|
||||
s.setServerConfigHeader(&hd)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return ErrSocketAuthFailed
|
||||
}
|
||||
|
||||
if len(key) > 64 {
|
||||
return ErrSocketAuthFailed
|
||||
}
|
||||
|
||||
decodedKey, decodedKeyErr := base64.StdEncoding.DecodeString(key)
|
||||
|
||||
if decodedKeyErr != nil {
|
||||
return NewError(http.StatusBadRequest, decodedKeyErr.Error())
|
||||
}
|
||||
|
||||
if !hmac.Equal(s.authKey, decodedKey) {
|
||||
return ErrSocketAuthFailed
|
||||
}
|
||||
|
||||
hd.Add("X-Key", s.randomKey)
|
||||
s.setServerConfigHeader(&hd)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s socket) buildWSFetcher(c *websocket.Conn) rw.FetchReaderFetcher {
|
||||
return func() ([]byte, error) {
|
||||
for {
|
||||
mt, message, err := c.ReadMessage()
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if mt != websocket.BinaryMessage {
|
||||
return nil, NewError(
|
||||
http.StatusBadRequest,
|
||||
fmt.Sprintf("Received unknown type of data: %d", message))
|
||||
}
|
||||
|
||||
return message, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s socket) generateNonce(nonce []byte) error {
|
||||
_, rErr := io.ReadFull(rand.Reader, nonce[:socketGCMStandardNonceSize])
|
||||
|
||||
return rErr
|
||||
}
|
||||
|
||||
func (s socket) increaseNonce(nonce []byte) {
|
||||
for i := len(nonce); i > 0; i-- {
|
||||
nonce[i-1]++
|
||||
|
||||
if nonce[i-1] <= 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func (s socket) createCipher(key []byte) (cipher.AEAD, cipher.AEAD, error) {
|
||||
readCipher, readCipherErr := aes.NewCipher(key)
|
||||
|
||||
if readCipherErr != nil {
|
||||
return nil, nil, readCipherErr
|
||||
}
|
||||
|
||||
writeCipher, writeCipherErr := aes.NewCipher(key)
|
||||
|
||||
if writeCipherErr != nil {
|
||||
return nil, nil, writeCipherErr
|
||||
}
|
||||
|
||||
gcmRead, gcmReadErr := cipher.NewGCMWithNonceSize(
|
||||
readCipher, socketGCMStandardNonceSize)
|
||||
|
||||
if gcmReadErr != nil {
|
||||
return nil, nil, gcmReadErr
|
||||
}
|
||||
|
||||
gcmWrite, gcmWriteErr := cipher.NewGCMWithNonceSize(
|
||||
writeCipher, socketGCMStandardNonceSize)
|
||||
|
||||
if gcmWriteErr != nil {
|
||||
return nil, nil, gcmWriteErr
|
||||
}
|
||||
|
||||
return gcmRead, gcmWrite, nil
|
||||
}
|
||||
|
||||
func (s socket) privateKey() string {
|
||||
if len(s.commonCfg.SharedKey) > 0 {
|
||||
return s.commonCfg.SharedKey
|
||||
}
|
||||
|
||||
return s.randomKey
|
||||
}
|
||||
|
||||
func (s socket) buildCipherKey() [24]byte {
|
||||
key := [24]byte{}
|
||||
now := strconv.FormatInt(time.Now().Unix()/100, 10)
|
||||
|
||||
copy(key[:], getSocketAuthKey(now, s.privateKey()))
|
||||
|
||||
return key
|
||||
}
|
||||
|
||||
func (s socket) Get(
|
||||
w http.ResponseWriter, r *http.Request, l log.Logger) error {
|
||||
// Error will not be returned when Websocket already handled
|
||||
// (i.e. returned the error to client). We just log the error and that's it
|
||||
c, err := s.upgrader.Upgrade(w, r, nil)
|
||||
|
||||
if err != nil {
|
||||
return NewError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
defer c.Close()
|
||||
|
||||
wsReader := rw.NewFetchReader(s.buildWSFetcher(c))
|
||||
wsWriter := websocketWriter{Conn: c}
|
||||
|
||||
// Initialize ciphers
|
||||
readNonce := [socketGCMStandardNonceSize]byte{}
|
||||
_, nonceReadErr := io.ReadFull(&wsReader, readNonce[:])
|
||||
|
||||
if nonceReadErr != nil {
|
||||
return NewError(http.StatusBadRequest, fmt.Sprintf(
|
||||
"Unable to read initial client nonce: %s", nonceReadErr.Error()))
|
||||
}
|
||||
|
||||
writeNonce := [socketGCMStandardNonceSize]byte{}
|
||||
nonceReadErr = s.generateNonce(writeNonce[:])
|
||||
|
||||
if nonceReadErr != nil {
|
||||
return NewError(http.StatusBadRequest, fmt.Sprintf(
|
||||
"Unable to generate initial server nonce: %s",
|
||||
nonceReadErr.Error()))
|
||||
}
|
||||
|
||||
_, nonceSendErr := wsWriter.Write(writeNonce[:])
|
||||
|
||||
if nonceSendErr != nil {
|
||||
return NewError(http.StatusBadRequest, fmt.Sprintf(
|
||||
"Unable to send server nonce to client: %s", nonceSendErr.Error()))
|
||||
}
|
||||
|
||||
cipherKey := s.buildCipherKey()
|
||||
|
||||
readCipher, writeCipher, cipherCreationErr := s.createCipher(cipherKey[:])
|
||||
|
||||
if cipherCreationErr != nil {
|
||||
return NewError(http.StatusInternalServerError, fmt.Sprintf(
|
||||
"Unable to create cipher: %s", cipherCreationErr.Error()))
|
||||
}
|
||||
|
||||
// Start service
|
||||
const cipherReadBufSize = 1024
|
||||
|
||||
cipherReadBuf := [cipherReadBufSize]byte{}
|
||||
cipherWriteBuf := [cipherReadBufSize]byte{}
|
||||
|
||||
maxWriteLen := cipherReadBufSize - (writeCipher.Overhead() + 2)
|
||||
|
||||
senderLock := sync.Mutex{}
|
||||
cmdExec, cmdExecErr := s.commander.New(
|
||||
s.commonCfg.Dialer, rw.NewFetchReader(func() ([]byte, error) {
|
||||
defer s.increaseNonce(readNonce[:])
|
||||
|
||||
// Size is unencrypted
|
||||
_, rErr := io.ReadFull(&wsReader, cipherReadBuf[:2])
|
||||
|
||||
if rErr != nil {
|
||||
return nil, rErr
|
||||
}
|
||||
|
||||
// Read full size
|
||||
packageSize := uint16(cipherReadBuf[0])
|
||||
packageSize <<= 8
|
||||
packageSize |= uint16(cipherReadBuf[1])
|
||||
|
||||
if packageSize <= 0 {
|
||||
return nil, ErrSocketInvalidDataPackage
|
||||
}
|
||||
|
||||
if int(packageSize) <= wsReader.Remain() {
|
||||
rData, rErr := wsReader.Export(int(packageSize))
|
||||
|
||||
if rErr != nil {
|
||||
return nil, rErr
|
||||
}
|
||||
|
||||
return readCipher.Open(rData[:0], readNonce[:], rData, nil)
|
||||
}
|
||||
|
||||
if packageSize > cipherReadBufSize {
|
||||
return nil, ErrSocketInvalidDataPackage
|
||||
}
|
||||
|
||||
_, rErr = io.ReadFull(&wsReader, cipherReadBuf[:packageSize])
|
||||
|
||||
if rErr != nil {
|
||||
return nil, rErr
|
||||
}
|
||||
|
||||
return readCipher.Open(
|
||||
cipherReadBuf[:0],
|
||||
readNonce[:],
|
||||
cipherReadBuf[:packageSize],
|
||||
nil)
|
||||
}), socketPackageWriter{
|
||||
w: wsWriter,
|
||||
packager: func(w websocketWriter, b []byte) error {
|
||||
start := 0
|
||||
bLen := len(b)
|
||||
readLen := bLen
|
||||
|
||||
for start < bLen {
|
||||
if readLen > maxWriteLen {
|
||||
readLen = maxWriteLen
|
||||
}
|
||||
|
||||
encrypted := writeCipher.Seal(
|
||||
cipherWriteBuf[2:2],
|
||||
writeNonce[:],
|
||||
b[start:start+readLen],
|
||||
nil)
|
||||
|
||||
s.increaseNonce(writeNonce[:])
|
||||
|
||||
encryptedSize := uint16(len(encrypted))
|
||||
|
||||
if encryptedSize <= 0 {
|
||||
return ErrSocketInvalidDataPackage
|
||||
}
|
||||
|
||||
cipherWriteBuf[0] = byte(encryptedSize >> 8)
|
||||
cipherWriteBuf[1] = byte(encryptedSize)
|
||||
|
||||
_, wErr := w.Write(cipherWriteBuf[:encryptedSize+2])
|
||||
|
||||
if wErr != nil {
|
||||
return wErr
|
||||
}
|
||||
|
||||
start += readLen
|
||||
readLen = bLen - start
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
}, &senderLock, s.serverCfg.ReadDelay, s.serverCfg.WriteDelay, l)
|
||||
|
||||
if cmdExecErr != nil {
|
||||
return NewError(http.StatusBadRequest, cmdExecErr.Error())
|
||||
}
|
||||
|
||||
return cmdExec.Handle()
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"mime"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/niruix/sshwifty/application/log"
|
||||
)
|
||||
|
||||
type staticData struct {
|
||||
data []byte
|
||||
dataHash string
|
||||
compressd []byte
|
||||
compressdHash string
|
||||
created time.Time
|
||||
}
|
||||
|
||||
func (s staticData) hasCompressed() bool {
|
||||
return len(s.compressd) > 0
|
||||
}
|
||||
|
||||
func staticFileExt(fileName string) string {
|
||||
extIdx := strings.LastIndex(fileName, ".")
|
||||
|
||||
if extIdx < 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
return strings.ToLower(fileName[extIdx:])
|
||||
}
|
||||
|
||||
func serveStaticPage(
|
||||
dataName string,
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
l log.Logger,
|
||||
) error {
|
||||
d, dFound := staticPages[dataName]
|
||||
|
||||
if !dFound {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
selectedData := d.data
|
||||
|
||||
if clientSupportGZIP(r) && d.hasCompressed() {
|
||||
selectedData = d.compressd
|
||||
|
||||
w.Header().Add("Vary", "Accept-Encoding")
|
||||
w.Header().Add("Content-Encoding", "gzip")
|
||||
}
|
||||
|
||||
mimeType := mime.TypeByExtension(staticFileExt(dataName))
|
||||
|
||||
if len(mimeType) > 0 {
|
||||
w.Header().Add("Content-Type", mimeType)
|
||||
} else {
|
||||
w.Header().Add("Content-Type", "application/binary")
|
||||
}
|
||||
|
||||
_, wErr := w.Write(selectedData)
|
||||
|
||||
return wErr
|
||||
}
|
||||
|
||||
func serveStaticData(
|
||||
dataName string,
|
||||
w http.ResponseWriter,
|
||||
r *http.Request,
|
||||
l log.Logger,
|
||||
) error {
|
||||
if strings.ToUpper(r.Method) != "GET" {
|
||||
return ErrControllerNotImplemented
|
||||
}
|
||||
|
||||
fileExt := staticFileExt(dataName)
|
||||
|
||||
if fileExt == ".html" || fileExt == ".htm" {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
d, dFound := staticPages[dataName]
|
||||
|
||||
if !dFound {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
selectedData := d.data
|
||||
selectedDataHash := d.dataHash
|
||||
compressEnabled := false
|
||||
|
||||
if clientSupportGZIP(r) && d.hasCompressed() {
|
||||
selectedData = d.compressd
|
||||
selectedDataHash = d.compressdHash
|
||||
|
||||
compressEnabled = true
|
||||
|
||||
w.Header().Add("Vary", "Accept-Encoding")
|
||||
}
|
||||
|
||||
canUseCache := true
|
||||
|
||||
if !clientContentEtagIsValid(r, selectedDataHash) {
|
||||
canUseCache = false
|
||||
}
|
||||
|
||||
if clientContentModifiedSince(r, d.created) {
|
||||
canUseCache = false
|
||||
}
|
||||
|
||||
if canUseCache {
|
||||
w.WriteHeader(http.StatusNotModified)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
w.Header().Add("Cache-Control", "public, max-age=31536000")
|
||||
w.Header().Add("ETag", "\""+selectedDataHash+"\"")
|
||||
|
||||
mimeType := mime.TypeByExtension(fileExt)
|
||||
|
||||
if len(mimeType) > 0 {
|
||||
w.Header().Add("Content-Type", mimeType)
|
||||
} else {
|
||||
w.Header().Add("Content-Type", "application/binary")
|
||||
}
|
||||
|
||||
if compressEnabled {
|
||||
w.Header().Add("Content-Encoding", "gzip")
|
||||
}
|
||||
|
||||
_, wErr := w.Write([]byte(selectedData))
|
||||
|
||||
return wErr
|
||||
}
|
||||
@@ -0,0 +1,457 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
parentPackage = "github.com/niruix/sshwifty/application/controller"
|
||||
)
|
||||
|
||||
const (
|
||||
staticListTemplate = `import "time"
|
||||
|
||||
var (
|
||||
staticPages = map[string]staticData{
|
||||
{{ range . }}"{{ .Name }}":
|
||||
parseStaticData({{ .GOPackage }}.{{ .GOVariableName }}()),
|
||||
{{ end }}
|
||||
}
|
||||
)
|
||||
|
||||
// parseStaticData parses result from a static file returner and generate
|
||||
// a new ` + "`" + `staticData` + "`" + ` item
|
||||
func parseStaticData(
|
||||
fileStart int,
|
||||
fileEnd int,
|
||||
compressedStart int,
|
||||
compressedEnd int,
|
||||
contentHash string,
|
||||
compressedHash string,
|
||||
creation time.Time,
|
||||
data []byte,
|
||||
) staticData {
|
||||
return staticData{
|
||||
data: data[fileStart:fileEnd],
|
||||
dataHash: contentHash,
|
||||
compressd: data[compressedStart:compressedEnd],
|
||||
compressdHash: compressedHash,
|
||||
created: creation,
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
staticListTemplateDev = `import "io/ioutil"
|
||||
import "bytes"
|
||||
import "fmt"
|
||||
import "compress/gzip"
|
||||
import "encoding/base64"
|
||||
import "time"
|
||||
import "crypto/sha256"
|
||||
|
||||
// WARNING: THIS GENERATION IS FOR DEBUG / DEVELOPMENT ONLY, DO NOT
|
||||
// USE IT IN PRODUCTION!
|
||||
|
||||
func staticFileGen(filePath string) staticData {
|
||||
content, readErr := ioutil.ReadFile(filePath)
|
||||
|
||||
if readErr != nil {
|
||||
panic(fmt.Sprintln("Cannot read file:", readErr))
|
||||
}
|
||||
|
||||
compressed := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||
|
||||
compresser, compresserBuildErr := gzip.NewWriterLevel(
|
||||
compressed, gzip.BestCompression)
|
||||
|
||||
if compresserBuildErr != nil {
|
||||
panic(fmt.Sprintln("Cannot build data compresser:", compresserBuildErr))
|
||||
}
|
||||
|
||||
contentLen := len(content)
|
||||
|
||||
_, compressErr := compresser.Write(content)
|
||||
|
||||
if compressErr != nil {
|
||||
panic(fmt.Sprintln("Cannot write compressed data:", compressErr))
|
||||
}
|
||||
|
||||
compressErr = compresser.Flush()
|
||||
|
||||
if compressErr != nil {
|
||||
panic(fmt.Sprintln("Cannot write compressed data:", compressErr))
|
||||
}
|
||||
|
||||
content = append(content, compressed.Bytes()...)
|
||||
|
||||
getHash := func(b []byte) []byte {
|
||||
h := sha256.New()
|
||||
h.Write(b)
|
||||
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
||||
return staticData{
|
||||
data: content[0:contentLen],
|
||||
dataHash: base64.StdEncoding.EncodeToString(
|
||||
getHash(content[0:contentLen])[:8]),
|
||||
compressd: content[contentLen:],
|
||||
compressdHash: base64.StdEncoding.EncodeToString(
|
||||
getHash(content[contentLen:])[:8]),
|
||||
created: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
staticPages = map[string]staticData{
|
||||
{{ range . }}"{{ .Name }}": staticFileGen(
|
||||
"{{ .Path }}",
|
||||
),
|
||||
{{ end }}
|
||||
}
|
||||
)`
|
||||
|
||||
staticPageTemplate = `package {{ .GOPackage }}
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) {{ .Date.Year }} Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 MST" }}
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var raw{{ .GOVariableName }}Data = ` + "`" + `{{ .Data }}` + "`" + `
|
||||
|
||||
// {{ .GOVariableName }} returns static file
|
||||
func {{ .GOVariableName }}() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 MST" }}")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(raw{{ .GOVariableName }}Data)
|
||||
|
||||
raw{{ .GOVariableName }}Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return {{ .FileStart }}, {{ .FileEnd }},
|
||||
{{ .CompressedStart }}, {{ .CompressedEnd }},
|
||||
"{{ .ContentHash }}", "{{ .CompressedHash }}", created, data
|
||||
}
|
||||
`
|
||||
)
|
||||
|
||||
const (
|
||||
templateStarts = "//go:generate"
|
||||
)
|
||||
|
||||
type parsedFile struct {
|
||||
Name string
|
||||
GOVariableName string
|
||||
GOFileName string
|
||||
GOPackage string
|
||||
Path string
|
||||
Data string
|
||||
FileStart int
|
||||
FileEnd int
|
||||
CompressedStart int
|
||||
CompressedEnd int
|
||||
ContentHash string
|
||||
CompressedHash string
|
||||
Date time.Time
|
||||
}
|
||||
|
||||
func getHash(b []byte) []byte {
|
||||
h := sha256.New()
|
||||
h.Write(b)
|
||||
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
||||
func buildListFile(w io.Writer, data interface{}) error {
|
||||
tpl := template.Must(template.New(
|
||||
"StaticPageList").Parse(staticListTemplate))
|
||||
|
||||
return tpl.Execute(w, data)
|
||||
}
|
||||
|
||||
func buildListFileDev(w io.Writer, data interface{}) error {
|
||||
tpl := template.Must(template.New(
|
||||
"StaticPageList").Parse(staticListTemplateDev))
|
||||
|
||||
return tpl.Execute(w, data)
|
||||
}
|
||||
|
||||
func buildDataFile(w io.Writer, data interface{}) error {
|
||||
tpl := template.Must(template.New(
|
||||
"StaticPageData").Parse(staticPageTemplate))
|
||||
|
||||
return tpl.Execute(w, data)
|
||||
}
|
||||
|
||||
func byteToArrayStr(b []byte) string {
|
||||
return hex.EncodeToString(b)
|
||||
}
|
||||
|
||||
func parseFile(
|
||||
id int, name string, filePath string, packageName string) parsedFile {
|
||||
content, readErr := ioutil.ReadFile(filePath)
|
||||
|
||||
if readErr != nil {
|
||||
panic(fmt.Sprintln("Cannot read file:", readErr))
|
||||
}
|
||||
|
||||
compressed := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||
|
||||
compresser, compresserBuildErr := gzip.NewWriterLevel(
|
||||
compressed, gzip.BestCompression)
|
||||
|
||||
if compresserBuildErr != nil {
|
||||
panic(fmt.Sprintln("Cannot build data compresser:", compresserBuildErr))
|
||||
}
|
||||
|
||||
contentLen := len(content)
|
||||
|
||||
_, compressErr := compresser.Write(content)
|
||||
|
||||
if compressErr != nil {
|
||||
panic(fmt.Sprintln("Cannot write compressed data:", compressErr))
|
||||
}
|
||||
|
||||
compressErr = compresser.Flush()
|
||||
|
||||
if compressErr != nil {
|
||||
panic(fmt.Sprintln("Cannot write compressed data:", compressErr))
|
||||
}
|
||||
|
||||
content = append(content, compressed.Bytes()...)
|
||||
|
||||
goFileName := "Static" + strconv.FormatInt(int64(id), 10)
|
||||
|
||||
return parsedFile{
|
||||
Name: name,
|
||||
GOVariableName: strings.Title(goFileName),
|
||||
GOFileName: strings.ToLower(goFileName) + "_generated.go",
|
||||
GOPackage: packageName,
|
||||
Path: filePath,
|
||||
Data: byteToArrayStr(content),
|
||||
FileStart: 0,
|
||||
FileEnd: contentLen,
|
||||
CompressedStart: contentLen,
|
||||
CompressedEnd: len(content),
|
||||
ContentHash: base64.StdEncoding.EncodeToString(
|
||||
getHash(content[0:contentLen])[:8]),
|
||||
CompressedHash: base64.StdEncoding.EncodeToString(
|
||||
getHash(content[contentLen:len(content)])[:8]),
|
||||
Date: time.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 3 {
|
||||
panic("Usage: <Source Folder> <(Destination) List File>")
|
||||
}
|
||||
|
||||
sourcePath, sourcePathErr := filepath.Abs(os.Args[1])
|
||||
|
||||
if sourcePathErr != nil {
|
||||
panic(fmt.Sprintf("Invalid source folder path %s: %s",
|
||||
os.Args[1], sourcePathErr))
|
||||
}
|
||||
|
||||
listFilePath, listFilePathErr := filepath.Abs(os.Args[2])
|
||||
|
||||
if listFilePathErr != nil {
|
||||
panic(fmt.Sprintf("Invalid destination list file path %s: %s",
|
||||
os.Args[2], listFilePathErr))
|
||||
}
|
||||
|
||||
listFileName := filepath.Base(listFilePath)
|
||||
destFolderPackage := strings.TrimSuffix(
|
||||
listFileName, filepath.Ext(listFileName))
|
||||
destFolderPath := filepath.Join(
|
||||
filepath.Dir(listFilePath), destFolderPackage)
|
||||
|
||||
destFolderPathErr := os.RemoveAll(destFolderPath)
|
||||
|
||||
if destFolderPathErr != nil {
|
||||
panic(fmt.Sprintf("Unable to remove data destination folder %s: %s",
|
||||
destFolderPath, destFolderPathErr))
|
||||
}
|
||||
|
||||
destFolderPathErr = os.Mkdir(destFolderPath, 0777)
|
||||
|
||||
if destFolderPathErr != nil {
|
||||
panic(fmt.Sprintf("Unable to build data destination folder %s: %s",
|
||||
destFolderPath, destFolderPathErr))
|
||||
}
|
||||
|
||||
listFile, listFileErr := os.OpenFile(listFilePath, os.O_RDWR, 0666)
|
||||
|
||||
if listFileErr != nil {
|
||||
panic(fmt.Sprintf("Unable to open destination list file %s: %s",
|
||||
listFilePath, listFileErr))
|
||||
}
|
||||
|
||||
defer listFile.Close()
|
||||
|
||||
files, dirOpenErr := ioutil.ReadDir(sourcePath)
|
||||
|
||||
if dirOpenErr != nil {
|
||||
panic(fmt.Sprintf("Unable to open dir: %s", dirOpenErr))
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(listFile)
|
||||
destBytesByPass := int64(0)
|
||||
foundLastLine := false
|
||||
|
||||
for scanner.Scan() {
|
||||
text := scanner.Text()
|
||||
|
||||
if strings.Index(text, templateStarts) < 0 {
|
||||
if foundLastLine {
|
||||
break
|
||||
}
|
||||
|
||||
destBytesByPass += int64(len(text) + 1)
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
destBytesByPass += int64(len(text) + 1)
|
||||
foundLastLine = true
|
||||
}
|
||||
|
||||
listFile.Seek(destBytesByPass, 0)
|
||||
listFile.Truncate(destBytesByPass)
|
||||
|
||||
listFile.WriteString("\n// This file is generated by `go generate` at " +
|
||||
time.Now().Format(time.RFC1123) + "\n// DO NOT EDIT!\n\n")
|
||||
|
||||
switch os.Getenv("NODE_ENV") {
|
||||
case "development":
|
||||
type sourceFiles struct {
|
||||
Name string
|
||||
Path string
|
||||
}
|
||||
|
||||
var sources []sourceFiles
|
||||
|
||||
for f := range files {
|
||||
if !files[f].Mode().IsRegular() {
|
||||
continue
|
||||
}
|
||||
|
||||
sources = append(sources, sourceFiles{
|
||||
Name: files[f].Name(),
|
||||
Path: filepath.Join(sourcePath, files[f].Name()),
|
||||
})
|
||||
}
|
||||
|
||||
tempBuildErr := buildListFileDev(listFile, sources)
|
||||
|
||||
if tempBuildErr != nil {
|
||||
panic(fmt.Sprintf(
|
||||
"Unable to build destination file due to error: %s",
|
||||
tempBuildErr))
|
||||
}
|
||||
|
||||
default:
|
||||
var parsedFiles []parsedFile
|
||||
|
||||
for f := range files {
|
||||
if !files[f].Mode().IsRegular() {
|
||||
continue
|
||||
}
|
||||
|
||||
currentFilePath := filepath.Join(sourcePath, files[f].Name())
|
||||
|
||||
parsedFiles = append(parsedFiles, parseFile(
|
||||
f, files[f].Name(), currentFilePath, destFolderPackage))
|
||||
}
|
||||
|
||||
for f := range parsedFiles {
|
||||
fn := filepath.Join(destFolderPath, parsedFiles[f].GOFileName)
|
||||
|
||||
ff, ffErr := os.Create(fn)
|
||||
|
||||
if ffErr != nil {
|
||||
panic(fmt.Sprintf("Unable to create static page file %s: %s",
|
||||
fn, ffErr))
|
||||
}
|
||||
|
||||
bErr := buildDataFile(ff, parsedFiles[f])
|
||||
|
||||
if bErr != nil {
|
||||
panic(fmt.Sprintf("Unable to build static page file %s: %s",
|
||||
fn, bErr))
|
||||
}
|
||||
}
|
||||
|
||||
listFile.WriteString(
|
||||
"\nimport \"" + parentPackage + "/" + destFolderPackage + "\"\n\n")
|
||||
|
||||
tempBuildErr := buildListFile(listFile, parsedFiles)
|
||||
|
||||
if tempBuildErr != nil {
|
||||
panic(fmt.Sprintf(
|
||||
"Unable to build destination file due to error: %s",
|
||||
tempBuildErr))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
// Sshwifty - A Web SSH client
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI <nirui@gmx.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package controller
|
||||
|
||||
//go:generate go run ./static_page_generater ../../.tmp/dist ./static_pages.go
|
||||
//go:generate go fmt ./static_pages.go
|
||||
|
||||
// This file is generated by `go generate` at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// DO NOT EDIT!
|
||||
|
||||
import "github.com/niruix/sshwifty/application/controller/static_pages"
|
||||
|
||||
import "time"
|
||||
|
||||
var (
|
||||
staticPages = map[string]staticData{
|
||||
"13ec0eb5bdb821ff4930237d7c9f943f.woff2": parseStaticData(static_pages.Static0()),
|
||||
"13efe6cbc10b97144a28310ebdeda594.woff": parseStaticData(static_pages.Static1()),
|
||||
"1d6594826615607f6dc860bb49258acb.woff": parseStaticData(static_pages.Static2()),
|
||||
"313a65630d341645c13e4f2a0364381d.woff": parseStaticData(static_pages.Static3()),
|
||||
"35b07eb2f8711ae08d1f58c043880930.woff": parseStaticData(static_pages.Static4()),
|
||||
"4357beb823a5f8d65c260f045d9e019a.woff2": parseStaticData(static_pages.Static5()),
|
||||
"4fe0f73cc919ba2b7a3c36e4540d725c.woff": parseStaticData(static_pages.Static6()),
|
||||
"50d75e48e0a3ddab1dd15d6bfb9d3700.woff": parseStaticData(static_pages.Static7()),
|
||||
"59eb3601394dd87f30f82433fb39dd94.woff2": parseStaticData(static_pages.Static8()),
|
||||
"5b4a33e176ff736a74f0ca2dd9e6b396.woff2": parseStaticData(static_pages.Static9()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-144x144.png": parseStaticData(static_pages.Static10()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-192x192.png": parseStaticData(static_pages.Static11()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-256x256.png": parseStaticData(static_pages.Static12()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-36x36.png": parseStaticData(static_pages.Static13()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-384x384.png": parseStaticData(static_pages.Static14()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-48x48.png": parseStaticData(static_pages.Static15()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-512x512.png": parseStaticData(static_pages.Static16()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-72x72.png": parseStaticData(static_pages.Static17()),
|
||||
"6972f63e5242168cc5637e2771292ec0-android-chrome-96x96.png": parseStaticData(static_pages.Static18()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-114x114.png": parseStaticData(static_pages.Static19()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-120x120.png": parseStaticData(static_pages.Static20()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-144x144.png": parseStaticData(static_pages.Static21()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-152x152.png": parseStaticData(static_pages.Static22()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-167x167.png": parseStaticData(static_pages.Static23()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-180x180.png": parseStaticData(static_pages.Static24()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-57x57.png": parseStaticData(static_pages.Static25()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-60x60.png": parseStaticData(static_pages.Static26()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-72x72.png": parseStaticData(static_pages.Static27()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-76x76.png": parseStaticData(static_pages.Static28()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon-precomposed.png": parseStaticData(static_pages.Static29()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-icon.png": parseStaticData(static_pages.Static30()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-1182x2208.png": parseStaticData(static_pages.Static31()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-1242x2148.png": parseStaticData(static_pages.Static32()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-1496x2048.png": parseStaticData(static_pages.Static33()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-1536x2008.png": parseStaticData(static_pages.Static34()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-320x460.png": parseStaticData(static_pages.Static35()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-640x1096.png": parseStaticData(static_pages.Static36()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-640x920.png": parseStaticData(static_pages.Static37()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-748x1024.png": parseStaticData(static_pages.Static38()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-750x1294.png": parseStaticData(static_pages.Static39()),
|
||||
"6972f63e5242168cc5637e2771292ec0-apple-touch-startup-image-768x1004.png": parseStaticData(static_pages.Static40()),
|
||||
"6972f63e5242168cc5637e2771292ec0-favicon-16x16.png": parseStaticData(static_pages.Static41()),
|
||||
"6972f63e5242168cc5637e2771292ec0-favicon-32x32.png": parseStaticData(static_pages.Static42()),
|
||||
"6972f63e5242168cc5637e2771292ec0-favicon.ico": parseStaticData(static_pages.Static43()),
|
||||
"6972f63e5242168cc5637e2771292ec0-firefox_app_128x128.png": parseStaticData(static_pages.Static44()),
|
||||
"6972f63e5242168cc5637e2771292ec0-firefox_app_512x512.png": parseStaticData(static_pages.Static45()),
|
||||
"6972f63e5242168cc5637e2771292ec0-firefox_app_60x60.png": parseStaticData(static_pages.Static46()),
|
||||
"6972f63e5242168cc5637e2771292ec0-manifest.json": parseStaticData(static_pages.Static47()),
|
||||
"6972f63e5242168cc5637e2771292ec0-manifest.webapp": parseStaticData(static_pages.Static48()),
|
||||
"7237b0744491024097d3d.css": parseStaticData(static_pages.Static49()),
|
||||
"7237b0744491024097d3d.css.map": parseStaticData(static_pages.Static50()),
|
||||
"7237b0744491024097d3d.js": parseStaticData(static_pages.Static51()),
|
||||
"73f0a88bbca1bec19fb1303c689d04c6.woff2": parseStaticData(static_pages.Static52()),
|
||||
"83e114c316fcc3f23f524ec3e1c65984.woff": parseStaticData(static_pages.Static53()),
|
||||
"8a96edbbcd9a6991d79371aed0b0288e.woff": parseStaticData(static_pages.Static54()),
|
||||
"90d1676003d9c28c04994c18bfd8b558.woff2": parseStaticData(static_pages.Static55()),
|
||||
"94008e69aaf05da75c0bbf8f8bb0db41.woff2": parseStaticData(static_pages.Static56()),
|
||||
"DEPENDENCES.md": parseStaticData(static_pages.Static57()),
|
||||
"LICENSE.md": parseStaticData(static_pages.Static58()),
|
||||
"README.md": parseStaticData(static_pages.Static59()),
|
||||
"ad538a69b0e8615ed0419c4529344ffc.woff2": parseStaticData(static_pages.Static60()),
|
||||
"b52fac2bb93c5858f3f2675e4b52e1de.woff2": parseStaticData(static_pages.Static61()),
|
||||
"c599374e350aa7225ee3e8a114e8d8d7.svg": parseStaticData(static_pages.Static62()),
|
||||
"c73eb1ceba3321a80a0aff13ad373cb4.woff": parseStaticData(static_pages.Static63()),
|
||||
"cc2fadc3928f2f223418887111947b40.woff": parseStaticData(static_pages.Static64()),
|
||||
"d26871e8149b5759f814fd3c7a4f784b.woff2": parseStaticData(static_pages.Static65()),
|
||||
"d3b47375afd904983d9be8d6e239a949.woff": parseStaticData(static_pages.Static66()),
|
||||
"e8eaae902c3a4dacb9a5062667e10576.woff2": parseStaticData(static_pages.Static67()),
|
||||
"ea4853ff509fe5f353d52586fcb94e20.svg": parseStaticData(static_pages.Static68()),
|
||||
"f5902d5ef961717ed263902fc429e6ae.woff": parseStaticData(static_pages.Static69()),
|
||||
"f75569f8a5fab0893fa712d8c0d9c3fe.woff2": parseStaticData(static_pages.Static70()),
|
||||
"index.html": parseStaticData(static_pages.Static71()),
|
||||
"manifest.json": parseStaticData(static_pages.Static72()),
|
||||
"robots.txt": parseStaticData(static_pages.Static73()),
|
||||
}
|
||||
)
|
||||
|
||||
// parseStaticData parses result from a static file returner and generate
|
||||
// a new `staticData` item
|
||||
func parseStaticData(
|
||||
fileStart int,
|
||||
fileEnd int,
|
||||
compressedStart int,
|
||||
compressedEnd int,
|
||||
contentHash string,
|
||||
compressedHash string,
|
||||
creation time.Time,
|
||||
data []byte,
|
||||
) staticData {
|
||||
return staticData{
|
||||
data: data[fileStart:fileEnd],
|
||||
dataHash: contentHash,
|
||||
compressd: data[compressedStart:compressedEnd],
|
||||
compressdHash: compressedHash,
|
||||
created: creation,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic0Data = `774f46320001000000011674001200000002b6b00001160e0001000000000000000000000000000000000000000000001a84621b81ca2e1cab10066000a446085c09833c110c0a87f26c8792640b941e00128a180136022403a838042005894107200c82585b507b9206a572f7d5f974a04946e826833af5df39b5ab50bc47d031b69dd488caaee1e18562ab2af880cccd590f9edb06b17fe1a0d434d9ffffffffffbf6c99c49a4d02de24d95d844251406dcfbf8fad77a0b90886234024474e4544203581759bd0742fa20f0caf63131ba2c396d31c8e11cb76b3dbedd9cb83bdbc898239a999fa7b75af3cac1bf1772a3970a4b404538cca09db9dab7e46aa965436848ddd0969d95fb03f224d3a57e7aa92e78cfcb243d26f3a6b3ff4bd920515faddf26d4c89fcc867840817b3e31881b14de8482c4b8ed00ca3beb8a3e483f848eabb68ed539ca272f765152d7d2bedc65b503c3e1f6283a544c0a5bb6b173311f80e8f2b5a11e9a29605474cc2062c443ec5cfeaccd51ef22c8b60ed7d859f3f87794b71c36bd188246ea011a3a45133338d2086c273c0b754ee62d0c6a3ce959bc52fb83c8775ff441151e1509db54d1903ccd62ece209c7a2c4610ee303771279c324833e1f1cc330a9268950ba671d3609344ae2fd73fcffd43bc2156ef55cd3b3177dd7b1d594fb55dbf8a16f851b972bff3677397c585c9de940ceaff18a070b0fa58fdb8ba19ff33c59d20ebb9c8a389b913c67a7eff37cf4184702f2209f72bdef6bb8c8bb530a3e662366dc6a4ec134c3e05c47173110c115359b616475cf1b456f5e5a9f0f71f7a7a7ade1310ef8a9973c054a5200200134656e54688ccfbef00adf33ec4fbc7977afd98a87851b53d266aba6798ea97f172c6185e0c4bac2c446ef356665143bc9e7f2fc308898894448988b15a450811e3a3b1568c2ab13a7e5bf5edead08d1aa5dddfec4775a055f551da6aac88d916b5668d9218b3ddf989d6f6f3e6cdeedd5e345587516003627cab080941311215b1401054508eb2288330b0bf122ad8188d82d99482c961830947bc9bfd9bdd4769a282155b49d4d87a121551c40228028a801d0451c4d24a62aa31d55493dc8f7a49bf5c49ae9516bddc2fe64a7e8e229b6c5135d03e1f121c466b04c6720316ad792f6c09a6d92d922289c29392844654c95a485755329d1cf4e2ce8bc4414c1fae69a8c04212de17846a6c91545eb84b0913dd769bb3936fe49c1b7cd17eff644df7a9beef2f123b60942ce43a20882352f1ab13a1a200ef34c5f7bbb7f70706b92931a3b6190742a18c9a26690bfd8614bbf59d0518608a41502ea14a0b9deb0f513a11baa6126ebc3a21939a15aae19af6094600e9e5ea5f4de8a9aaa82e68bb1758d19979ad9016806f07e05c1db1237a8893af890d4aa38317bc056dc14b5787d5b5e5bb56771df5efa387d7f37b4d05059592cfb4fd005229d581d86ebe195cd66cf3d1537f80bebbfb140e05351ac0ced40b52e6b274ff9cd63b73041d4a05241d2ffa618101e8a3a05e8707fe5259e928e97ede723eef76efaebdc54596e42e59b26cd1dce565f7b5f935a0669950b47aec6a110bbe6be708efdffb7b2bcfb984efbdfb083f8b5a1a204ded6ad68819761b39b2a3ad7cca0ac20ec20e4205e14c952b074a7b439b29b2c9f6a62fea64956e52611038493c4e10423c0221193ce7b6487aa42dea3f49945980fd70c7acd25555cf68080438cc4b747a206bdd7fcb3fd7c8cae8d02f53cbc1322050a1bab4ebb9fb9e64ceb0a5656161fec3f79b22c660eca119e74287b5c334fc7b1c0e9c0e24008a70ef9eceb994701446846e8afb0e560b01e110c2a321aadd7db3972885590811597bf8d6fb7e26398d70126f910683a1e066715a3e5e837d076c79115522c5d245b7e38b7fec2856272e210bf11690dc4f3f36ed1b865213d856d97fad65854b848b50cf08d0eaeedbf4ffb7005b68c342cf6443b8adcc2fa5f9afcd152e423e212364e6f8cc7f5badf1e9870f46371bac7a02c4a28cee5b549e7cf768b60266c6c27dd8359130e55fbfda3b0fe190cc2c656fd03778f4dea7b65d6a898a30f1e94abfef3ed2c598244100c0d19ca636118a4898b2aa43fcbb8271ad56b0cd157dc2f7afc7086c4398e7c1c1562db919f443dd97de3b96f78a8ea8440ef2cc3cddea80e87f85eab46d8a56642960da75e0ffca69a1dbbeffabba69cbb392076cf0b231c9da942c6f0abfea3734520b84062c2c27799686ba883737fa7071161adecc7d83bc294ade14aabb98d169c295cd32edd6fddbbbffac27942349060a12859f1a92cc99a3ddd15dfd8e567527306865d2c9a83b83c0f0c01824468aa4354966494f24e909f7cea433304780a1f3f40138739045043ebd9a95297ea33103ba1ac39d5aee795e15ef86677ce59c593937928f32e0fdfff101fc0fb009a03964379be4348d1fd3337bbbe43a024dce74931c63d7c87837e439eb8244c6662b650a550a129582e85ca62851925f298895a5ca63e5b1e0ffffef4dfd771da06d5b07f0babd3754521a0dc6e65b8ac5b5540a8687c78b79c9faf6470f08371bb6a37080975e2e0516601887f1f0ffcb6af6dd25d577ac70fddc969b128e8355d513eb918b1cfb1f54ab4d8a183446af3023db31466225468704cf7f6b7ddabacb2d2742e5c9912d6448fa9eeaffcfefbbbd44b368e785b8432c6ce25c85784198908a8c513a3c587b53aae72ad97b040496cad915a4cc7e2017ca43102e9b2519ea45bdc37884f9624d2b4beb110e7008f5a8d2a504e5890cfe7f53f56bef9d212013e07c7246de236d0ce56ed1bd012519dc94ab12bc98f105f166681a001d48d3819236fc1c75df0364cc1dc89f1cd156f8fa1b422e536af76cd7fb17e5b6d5b6eb7faa962d80f7ff06429a11449dc239f2921c8bdea54b95aeca134498b70bfc4b9493343a3ac42439715d6da9d27355e571d13923482097a5a54a252b563aa6092a816fab0b42f7928b3caf6ba3c5c60244ba0cffab6b4313841aa8b622a77ac0f9ec4244440ed96c0611f9e71562ceb7cf8ed5dec9de212c0fb108638c31c208234c088fe01edff59dbfbe7701fbf5de3eb3cb459c22418a9412c2a114890b4309a473ed12212b22ca18658c37eacd99458de4c7730ecfb1d9ab698209c6982084104511442f877e7f21a8bee18e8e4d54da3fc65c96b3895a25782881d93df5f1a96c7fb8fc77baed9b4cfc1c5a4ab14002a1f4ee87ce7f69f58fb16de3889ab12170700bf387b1e95864d8188d0b3012f8ff646afde0abd51eef9594bd38a1dad005a8b52789ff03051893efbf88327706e3a2350b1003938078d140ba3820533c902309b86e35704326506d1bd0660fd0e50034a41898741ab8eb3c30e72240711958760d58730378e036f0d83d60c303604b25b0ab063854071c7b0f7cf007f8ebffc0ffdc002870080e401183c40128b2910745210aa090430145356Line truncated
|
||||
|
||||
// Static0 returns static file
|
||||
func Static0() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic0Data)
|
||||
|
||||
rawStatic0Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 71284,
|
||||
71284, 142549,
|
||||
"Fgp89G5EqUE=", "pq6LwT5SUig=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic10Data = `89504e470d0a1a0a0000000d4948445200000090000000900806000000e746e2b8000043d0494441547801ccc10bd0eff95dd0f7d7e779cede4eaecbee26e11208e11a10080514826da74d8aa8d45228975ed419ca880d84764028085eb042128a112cb6cce0d83a2d30ad505b1c98a1b480152b041006181849084908975c369bbdef39e779beeffefebfdf59601844926c36bc5ee30fb9377dc9df7eea63b73cfa017376f682191fbef2c1572ece3fe8f2cae5b371179e81db702bcebc33c626330e93ddd8cdc4384c4e666c621cc626330e93dd303693ddd8c43063e17ad3b5e17ee36de757aebd755ddefaa6f32b17afbbbc38ff456767bf70cbed0fffdab3ffcbbff5903fc4c61f32eff8826fbffd6d4f7fdb272cebdfbbaddb3ef9f2fcf2e39aeec6154fa4c9c98cc364378ccdc4384c4e666c621cc626330e93dd303613e3303999b18971189bcc384c76e362a67bcfafdcf8f98b1b577e74cece7fe881db1ff88917bcec5b1ef587c8f843e0b55ffef23bc7f98badf51f39f362dced3d697232e330317633d98dc3e464c626c66118310e93dd3093dd384c4e666c621cc626330e93dd303693dd60b279fbe8079daf7fd4e5fcc0fbffa557bcc37bd9782f79ed977ef315e78f7dc2adebca17dcb872f159b8db9361323683b189b19bc96e1c26273336310ec388c1d8c4d8cd64370e9393199b188761c4384c76c3d84c7683c9c98cc36473eff9d9e5ffd1d9fcfd6ebdedd5effb17ffc685f782f124fbf9977df3ed77dcfae867cacbcc7c0ac693616c32e33036317633d98dc3e464c626c66132e33036317633d98dc3e464c626c66118310e93dd306313e3303999b1897118468c8c1f3fbffaf0b73ee3853ffeddb77dd2abaf79128d27c923cf7dc3ed0fffa7ffcbe73e78e3fcabe323309e2c63931987b189b19bc96e6c62ec666c621c26330e6313633793dd384cc6666c621c8611e330317633d98dc3e464c626c66118310e13a3d12f5dbdfac02b6efbf4efffaedb3ee08dd73c09c693e0755ff68a3fd9f806bcd0936d6c32e330d98ddd4c766313c3d88c4d0cc626330e6313633793ddd8c430366313e3309971189b18bb99ecc66132366313e3308c188c4d8cdd4c76e3679cadaf7dce4bbfe9fbbc878df7a037fef96fff90eb77dffbaae13370e6c93636997198ecc66e26bbb18961c661b21b9bcc384c76633793ddd8c4303683c96e6c32e33036317633d98dc3646cc626c661323683b189b19bc96e1ca6d5f47db75df8b2f7f9d26f7aadf790f11ef0a37ff5ebce9ef5e0d5979e9f5d7e1ddec77bc3d864c661b21bbb99ec069393199b1887b1c98cc364377633d98d4d0c330e93ddd864c6616c62189bc96e6c62189bb1897198cc388c4d8cdd4c76e330199bb1e9be4bfdf57bce1ff9bbb77cd1ff70e909369e60bffc15aff840cbb7e14f7a6f199bcc384c76c38c4d8cc3e464c626c6616c32e330d90d6333d90d2627330e93ddd864c6616c62189bc96e6c62189bb189c1d864c6616c62189bc96e1c2663333631189b7ee0ca597fe1aebff0aa377a029d7b02fdfa67fd6f2fbe78e67ddf877fc37bcbd864c6616230cc64370e9393199b1887b1c98cc364378ccd6437989ccc384c7663931987c96e189bc96e6c6298c160623036997198ec86b199ecc66132368389c1d864c687663eef6bbef87d7ff615dff18baff304194f80377ee52ba76b677fe9e2cae57f83dbbcb74c661cc626c66e26bb71989cccd8c4388c4d661c26bb616c26c66172326313e33036997198ec86b199ec069393199b1887b1c98cc364378ccd64373631cc384c7663931987b1e9fad9f9e55f9939ffa6bbbee055cbbbe9dcbbe9f52ffde6db2faf5c7ef33a5b7f1957bcb74c661cc626c66e26bb71989cccd8c4380c23330e1383612606e3303999b18971189bcc384c76c30c260683c9c98c4d8cc33032e330d90d6333d98d4d0c330e93dd3032e3303631ce75f692a57bbeea733efe87bef11ffde48577c3b977c3cfbdf45baf5ebdb8f29d97b75efb7318ef2d931987b189b19bc96e6c62ec666c621c2633180c26c66e26bb71989cccd8c4380c2333184c0c8699ecc66172326313e3308c1887c96e189bc96e3031cc384c76c3887198ec86b19966f8a4f32b373ee66bfef48bfef1cbbff7c76f78179d7b17bde62b5ffe8cdbce6f7cf7e56dd73ec37bcb6032e330d90dd94c9286d0249b213409a1c94943d2d09093348426d90c49434368121a4293931966300e93c18c4d8cc330621c26bb61061383c1e464c626c66118310e93dd3036138361ad2b1f79693ee12fff994ffdc7affcde7f7ecdbb60bc0b7efe2b5f71f5eaea7b6a3edd7bcb903cd88507ba707f171eeed2c3ebd2f52eddb0ac48ca4dd9953c2e3989ec9243ca261a843c2e51b2c92e3949948b7263e5d6b371c795334fbfe5dc336fbbe2ee3b6ef1ac3b6e71e7edb7381b0c23066313633793dd384cc6666c621c8611e330d90d3336310e93b1199bf503ab473ffb595ff0ed0f7b278d77d25b5ff203b73ffaa1bff45d379ef2f0677a922d79a04bbfd163debcaebb775d77ada5682244b22b0d8ac8498a91509908c9c944221a1491939c5488ecca268948c4c31797aeaf259b52c9a60c6e3f3ff3814fbfcdf39f71870fbff3aabbafdee2fc0c633793dd384cc6666c621c8611e330317633d98dc3646cc62686f32effcf5b1ebafaf94f7dd9373ee69d30de096ffcca57ce8d8bfe3be38b3d891ee8c2afac47fd6ad73cb06e38491221b229e4a46c227212914d39294c94dc547212d955c2a01226bb443949ca26223c70e386cb65934a36a5924d299233dc73f5167fe49ea7fa84e73ccd3d4fb9c56e1c26633336310e93b1198789b19bc96e1c26633336310e63d37f3f97575e76d717bc6af903bae29db0ae9f7f85f38b977a125ccaafaf6bfee57ac45bbba6c84944b929d9645788268ac84da52119848a1809e5904db2c96e95dd64d994c7550e11c565cbe54a36a548946c4a259b7289df78e89adf78f0313ff8bab779fe9d77f8b73ef04e2fb8e7aa2be7636cc626c66132e33036318ccd64370e93b1199b188761c4f82fce6e7bec0df8467f40e7fe807ee52ffe9d17afdbaefd3d5cf11eb4e4f5eb9a7f7e79bf5f5a8f78c8a51c2a879c846290248fcb269b9c944dca4d2937a5102695c7554e927158d96450d9456e2ae146b97e1952c9a61489122a4a362554defec8753ffd9b0ff8d9373fe88e5bce3dfba9b73a1b0c06931987b189616c26bb71988ccdd8c4380c33311853f36f7fd57ff2b13ff6ca7ff82f5ee70fe0dc1fc02f7ff92b3fb05b6f7c3f9ee93d24fc66d7fce8badf6bd6231eb34c3949645721e5a694433609e5106513936c72280d9541486493930a4336c926bbca6e9293945d716d5dba284ad9a4924d09152554485139a93c74fdc2cffcc6837eeecd0fbafb29b7baeb29b73a9bcc388c4d0c6333d98dc3646c061383c164c6616c629ccfLine truncated
|
||||
|
||||
// Static10 returns static file
|
||||
func Static10() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic10Data)
|
||||
|
||||
rawStatic10Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 20411,
|
||||
20411, 37993,
|
||||
"f3fDEgPVSRw=", "68RTbZyzbxE=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic11Data = `89504e470d0a1a0a0000000d49484452000000c0000000c0080600000052dc6c0700007b2f494441547801dcc10bb0b0f95dd0f7cfef9c772f095942081410904e0111641c1db48850a5339dd156ab48a78ea04ea776b45a2f954b50c45b1512a088a39d513ab54e5514b505abb48cadd52a2214c1b48a152131409020414836bbd9ddf7729e6fffcff39cf79c0de54e36d9f0f98c9fc65eff195ff0c85c5cfc8c8b4b1f7af5c087ceccbff5f8ddc7fecde71ebbfb81f17ec32bf13e780c8fe2515cf8a9184b76334e63c9611c6672639c260fcd384d6e8c256319a7b1c4b831931be334d90d9b718fee1977f1d6f40333f3af1f79fc99373fb8fb92efa6ef7cc9134fbde1d9a79ef8ae2e2edff4a1bfe7bfbaefa7a9f1d3c4eb7ff7ab1fb9f7e0c1fb3ffae8233ffb25f71effc4e71ebbfb8be2a38657e2bd71e1853696ccb835961cc6612637c669f2d08c25c6adb164c6adb1c4b831931be334d98d652c316e8d25336e4d1bde66fc00beedd1c79ffd87f7ee3efe8ddb76f54f2e2f1ff9fe0f7ed51fbdefa781f11eec75bff3d597af7cf695fff6934f3cf9cbb6d9fe3de363f172ef0e63c98c5b931be33093c3b835d98d652c316e8d25336e4d0ee3c64c0ee3d6643796b1c4388d6b99716b721887b14c0ee349e69f6eb3fdbd671e7de66fbed7b38f7ec387fc9e2f7ee03dd4780ff3bacf7af51333979f349b5f63fa14bcbf77b7b164c6adc961dc98c9615c8b7118cb5862dc1a4b66dc9a1cc6612c93c3b835d98d652c314ee35a66dc9a1cc6612c93c3b816e330e3fb4d5f3d7cd5d5d5f6b51ff2aa2f7aca7b90f11ee0f5bffb4beeccc5fd8f79f4c1639f76ef917bbf161f864b2f0663c98c5b93c3b83193c3b816e330e35a8c5b63c98cd358721887b14c0ee35a8cc38c6b314ee330629cc692c3388c657218d76218cbb816e38abefb91cbabafbceae22f5c3df2c83ffbe0dffef9f7bdc88d17b17ff199afbe33f915cde56f37fd523ceac5622cd9cdb835398cc3582687712dc661c6b518a7b16437e334961cc6612c93c3b816e330e35a8cd3583296711a4b0ee33096c9619c26bbb18c6b314e63c970dfc5fcbd99ed4fe9f2ab3ff0bf7cf5032f52e345e89fffce3ff1f2cb47ee7efaccf6bb879fe5c5662cd9cdb835398cc34c6e8c6b310e33aec5388d256319a7b1e4300e33b931aec538ccb816e334968c659cc692c338cc587218a7c96e2ce334b931968c659cc6d277bcf467ffd32f7efc9f7cec5f79ec555ff4162f32e345e4990ff9ae27defae97ff1d7dfdde633b6e623315e6cc692dd8cd35872188799dc18d7621c665c8b711a4bc6324e63c9611c6672635c8b612ce334b931968c659cc692c338cce4c6384d766319a7c98db1642ce3349618bb2ee6eaf58f3c7aef4fbcd7aff89ffffc631ff2c6a7bc488c1781effe8c2fbdb87f71f7d764fe303ed68bd558b29b711a4b0ee330931be3347968c692c3388d25336e8d25877198c98d719aecc6329618b7c69219b7c692c33096c98d719aecc6329618b7c69219b7c612e33096c961fc53d31f71d1577ee06ffb92cdbbd978377afd677efedc7bf0d28fbb73f9e08b2f2fb64fc678b11a4b76334e63c9611c6672639c260fcd5862dc1a4b66dc9adc188799dc18a7c96e2c6389716b2c99716b726318cbe4306e4d7663194b8c5bc388716b2c310e63991cc6435ddd99afbbdcb6cfbe330fbee9fd7edb1fcfbbc9a57793d77dd67ffd8ac77ef0fdfec0bcece93f75317d14c68bd558b29b711a4b0cc6612637c669f2d08c25c6adb164c6adc961300e33b9314e93dd0cc612e3d65832e3d6e43018c632398c5b93dd0cc612e3d63062dc9a1cc6612c93c3b835cd657dd88c4fbb7c70f9f2dff52b3fe1b55ffa355fffac7783f16ef0ed9ffd9a4f9aede2cb2ea69fe3c56e2c99716b2c316ecce4c6384d1e9ab1c4b83596ccb835398c1b33398c6b310e33aec5b83596ccb835398cc3582687712dc661c6b518b78611e334961cc6612c93c3b816c358c6b56cd3b7dee1b7beff6ffb635feb5d6cbc0bfd8b577de1cbe6caef6dbc0a8f7ab11b4b66dc9a1cc68d991cc6adc96e2c6389711ad732e3d6e4306ecce430aec538ccb816e33496ec66dc9a1cc6612c93c3b816e330e35a8cd3583296711a4b0ee33096c9615c8b612ce35a8cd3b8afbef491cb3eff7d7fcb973eed5de4d2bbc8f7fdf2fff523eebdff9bbfcaf834dcf1623796ccb835398c1b33398c6b310e33184b8cd3b89619b726877118cce430aec538ccb816e33496ec66dc9a1cc6610693c3b816e330e35a8cd3583296711a4b0ee33083c9615c8b612ce334314e63e972c627c627ff81cf7af9d7bde6cfbdfe07bc0b8c7781d77fd617fef2e1cfe083bd27184b669cc692c3b83193c3b816e330e35a8cd3b89619a7b1e4300e63991cc669f2d08c6b314e63c958c6692c398cc34c6e8c6b318c655c8b711a4bc6324e63c9611c6672639c26bbb18cd3e4c6583296711a6fba687ef3fbfde75ff2355e60e305f4c6cff9a28b8bb73ff2b9771fbff707f1a817bbb16437e334961cc6612c93c3b816e330e35a8cd358b29b711a4b0ee33096c9619c260fcdb816e334968c659cc692c338cce4c6384d7663194b0ee33496ccb835961cc6612637c669b21bcb5862dc1a4b66dc1a4b8c7b8fdcb9f747b71e7dcd2b7fd3975e79815c7a81bce1b35ff3b2adf9630fee5c7d0eee78b11b4b76334e63c9611c66629cc6b5188719a789711a4b06334e63c9611c66629cc669b21bcc384d8cd3583296711a4b0ee330931be334d98d652c3118a7b164c6adb1e4300c6672639c26bbb18c25c6ad6164c6adb1e4302edb2e3f799bdeff55bfeae3bff6bffe1bdf78cf0be0d20be0b99ff7da973ffd21fff22f7471f51b315eecc692dd8cd35872188799dc18a7897198719adc184bc6324e63c9611c6672639c26bbb18cd3e4c6583296711a4b0cc6612637c669b21bcb5862dc1a4b66dc9a1c06c3582637c669b29bc15862dc1a468c5b93c36018cb34c32fbc78e4fecff982573dfe37ffe89f7de373dec9c63bd91b3ef34b5e79557fe3e2e2ea177b4f3096ccb835961cc6612637c669f2d08c25c6adb164c6adb1e4300e33b9314e93dd58c612e3d65832e3d658621cc632398c5b93dd58c612e3d63062dc9a1cc6612c931b63897198712dc6ad61c4b835398cc358268771b8b47dfddbbde4577fe87ff685ffda3bd1a577a2d77dce6b3ef8425f35d32ff69e602c99716b7263c832d9243484a47108a149680889218486a42164998486109ae4d4903484d090184268484298c13096716bb21bcb58629c06c388716b721887b14c0e83b1c43098712dc669308c18b726877118cbe430aea5990f7dc4834ffadc5ff589ffdb17fd8d6f78ca3bc9782779c31ffc23afeced8ffc75e613bd27184b66d8f064f73ddd95a7b7079eeecadd36f7ba725fb6b22191e7c929651964979cf250b99653b2e4569828cf97ecb294e7Line truncated
|
||||
|
||||
// Static11 returns static file
|
||||
func Static11() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic11Data)
|
||||
|
||||
rawStatic11Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 32234,
|
||||
32234, 59013,
|
||||
"Qlz5csi7gH8=", "zjF5/KJnau4=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic12Data = `89504e470d0a1a0a0000000d49484452000001000000010008060000005c72a86600008000494441547801ecc109d0affb4117f6cff73de7dc7bb3deac246c098bcbb414a76c41749c763a524590295a829d2e881622512a424c2ca3c3614ac90254d41681d6aab4c294454152a5208242a824c860d884849bb0241492dc7b93bbdff3becfb7bfe7f93fffe779ff826342b6730f7c3ef1dbde656f78f14b9fda0b1f51671ff1d4b73fe539f7de79f773eaece9f419eae9e2e9b823dc516ec335dce6bd2156354bec62a8459c486a139794d82456254ec550b3c4a9d42636499d885dea28f1286ee051991e260fd3b785b735796bf56d773eedad6fbeef9e67bc29f2c689bb3ee4237fe657f2fc6faddff64e8bdff66f75cf7ffbf54fbafbce7b3e567cb4f6a32bbf277c149ee46610ab8a217631d4224e24b5895deab2c4aac4a9186a96d8c5509bd8247522562536894b4aec625531c42eeeabfe64f809f113e2b54f7aea5b7feccecffdbafbfdb6df50fcb6cdebbef0a51f92b3fc8176fabd6767679f848fc15537a3186a963815432d6213436a13bbd4510cb12a712a869a257631d42636496de292129bc4aa16b18b55254ec5508bd8840bf13335fd20f9e76767673ff8412ffa1fdee4b72de2b7b0d7fdb9afb876767b3ee98e471ef7a90fdffef027e3633c16c450b3c4a9d4263689a136b14b1dc510ab12bb58550cb18ba136b1496a139794d82456b5885d0c354b9c8aa116b1490cb589a39f7ef4ea8defbefde2da3f9e2e6efce087bce4158ff82d2a7e8b79dd8b5f7efbd9b9ff547c16fd743cc963490c354b9c4a6d6293d489d8a58e628855895dac2a86d8c5508bd8c490dac425251631c4aac4a9186a963895dac42631d42676a9a3f00e67d37769bef3ca595ff9acbff0b287fc1612bf05f433bf25773df7aedfdff67323ff199eecb128869a257631d42636499d8855894de29212bb58550cb18ba116b18921b5894b4a2c628855895331540cb18ba136b18821752276a9a3c42525dede4edf7996b3ffe3d94f78dbf7e505df50b7b8b885fdfc177ef5b39cddf893e273f0bb3d96c550b3c42e86dac426a913b12ab149ac6a11bb5855e2540cb5884d0ca94dec524731c4aac4a9182a86d8c5509b58c4903a11ab128b18e29212bb98bdfeec6cfabbd3d56b7fe783feec97ffb25b54dc82eefaa297fe1ebca4c967e29ac7b258d52cb18ba136b1496a139794d82456b5885d0c354b9c8aa116b18921b5895dea28865895d8c5aa62885d0cb589450ca94d5c52621143ac6a11bb584489d98d9cf55b3be5af7ee017beec47dd62e216f1a39ff7f579ca93eef9d4f0e7f107dd0a6255b3c42e86dac426a94d5c5262935895381543cd12a7529bd82486dac42e751443ac4aec625531c42e86dac42286d4262e29b1882156254ec55031c4a918faaa277ee2ab5efac4effe83ff28d7afd72d201ee37afd7aee79e4eaa7def3c8d52f151fef5611ab9a257631d4224e24b5894b4a6c12ab12a762a859e2546a139ba44ec42e7594b8a4c42e561543ec62a8456c62486de292128b186255e2540c15439c4a6d62f6da273ef19ebff2c427def35d79feb7d663583c86ddfd493ff487eefd7d3ff4a5e593dc4a6255895331d4224e24b5895deab2c4aac4a9186a96d8c5509bd8247522562536894b4aec625531c42e865ac42686d42676a9a3186255e2540c1543ec62a84d2c624895d73ce979affacb4ffcc4577d8fc7a8780cfa852ffaca7fef22175f5d3ec5ad26869a254ec5508bd8c490dac42e751443ac4aec6255b3c42e86dac426a94d5c52629358d52276b1aac4a9186a119b18529bd8a58e628855895331540cb18ba136b18821b509e27ba45ffcec177ee54f7a8c89c7909f7fd14b9f7a7e7eed4baf5e397f21aeb9d5c450b3c4a9d4263689a136b14b1dc510ab12bb58550cb18ba136b18821b5894b4a6c12ab5ac42e869a254ec5508bd82486dac42e751443ac4aec625531c42e86dac42286d4262ee9f9a3b75ff9866b372eae7fe00bbff22d1e23e231e2755ffc15fff599b3bf8aa7bb15c550b3c4a9d42636499d885dea287149895dac2a86d8c5508bd8c490dac425251631c4aac4a9186a963895dac42631d42676a9a31862556217ab8a217631d4223631a43671498945786b32bde899bff6a46fccf5eb75938b9bdc4f7dc1d73cf78edb1ff93aed1f76ab8aa166895d0cb5894d522762556293b8a4c42e561543ec62a8456c62486de292128b186255e2540c1543ec62a84d2c62489d885dea287149895dac2a86d8c5508bd8c490dac425251631c4a27cef23bdf1c2e7fed9af79bd9b58dca4befffaf53cf7be3b3ebfbc024f70ab8aa166895d0cb5894d529bb8a4c426b1aa45ec6255895331d4223631a436b14b1dc510ab12a762a8186217436d621143ea44ac4a2c62884b4aec6255895331d4223631a436b14b1dc510ab12b30726f992679fbdfd6fe405df5037a1b809ddf5452f7d26f9db8d4f75ab8a55cd12bb186a139ba4367149894d62558bd8c550b3c4a9186a119bc4509bd8a58e628855895dac2a86d8c5509b58c490dac425251631c4aa16b18b45943815432d6211abd42676a9a31862556217b4dfedcc9f7ed60bbefacd6e327193f9f9bff8b23f6af2bfe2596e55b1aa596217432de244529bb8a4c426b12a712a869a254ea536b1490cb5895dea28865895d8c5aa62885d0cb589450ca94d5c52621143ac4a9c8aa162885331d4221631c4509bd8a566b18a55895d2ca286b75cbde24f3ded73bffa956e227193f8d72f7ef99527bff143bffca10ffdc597206e55b1aa596217432de244529bb8a4c426b12a712a869a257631d42636499d885dea287149895dac2a86d8c5508bd8c490dac425251631c4aac4a9182a863895dac42286186a13bbd42c86b8a4c42e16518b98f5da07fdd257f5cd1ffe254f7bc1cbcfdd04e22670d75f78f9337ad66fc227bb95c5aa12a762a8459c486a13bbd4658955895331d42cb18ba136b149ea44ac4a6c129794d8c5aa12a762a8456c62486d62973a8a2156254ec55031c42e86dac42286d489d8a56631c4252576b1885ac42ea4fee994fe89677ddefff416ef6757bc9fddfda7fee6c73df4f887ff093ecead2c869a254ec5508bd804496d62973a0a12ab12bb20869a257631d42636496d825895d82456b5885dac2a712a865ac42686d42676a9a3186255e2540c1543ec62a84d2c62486d82589558c4109794d8c5224a10bb184a7c78f8ac2f7dfe7ff0cfbee21ffcd8ffe7fde88af7a337bce8159ffad01d0fbf121fe0561643cd12a7529bd824486d62973a8a21562576b1aa20b18ba136b10892dac4252536895509621743cd12a762a8456c12a436b14b1dc510ab12bb20868a217631d4261631a436714989450cb1aa45ec6211254ec5508b20ee3c3fbffdbf7ac967fcde9f78c577fe8b9ff37e72c5fbc95d2f7ae9e7b7be1177b895c550b3c4a9d4Line truncated
|
||||
|
||||
// Static12 returns static file
|
||||
func Static12() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic12Data)
|
||||
|
||||
rawStatic12Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 49101,
|
||||
49101, 87617,
|
||||
"w9qnzViK2AM=", "ohESouR9h2g=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic13Data = `89504e470d0a1a0a0000000d4948445200000024000000240806000000e100989800000002494441547801ec1a7ed200000a08494441547dc169ace6075987e1fb79de73665a60a6ed942e38b4b46317ca624c05278229a6da44842212714108b2a8e0071071f9208618515021316842c4981204898918a40494822545c512f6a580dd26941198b64c3bd34e7bdef3bf7f8f23d6306928d7557c0f37bfea4f36a8b9a25d5d990df703fb80dd40f3bf6aa81eaa077aa81eaa87ea8155a89e54cf915ae596de583e3ed3efedcdb9e6ec57bc61e12114dfc5575ff8d73d7b0ebf68e9bc06388fefa686eaa17aa81e580dd54375a087eaa17aa087eaa13a540fb5ca81d5ceadd7adb6765cb5e7157f161ea47890afbee4aff66e9f7af8ef80cb782835540fb51aaa077aa80ed5033d540fd543f540875a0dd5033d540fd5039deb364fb9eb797b7ef16f0e7282e204fff59b7f7ac98ab9869abd3c84fb4bee632115a8811eaa0235d0033554057ad8b5b3d9b5b3a91ee8a17aa80ed5033dd46a0e365e71fa4bdefc251e503ce0d6df78e3deb4d753b3970739320b5fc931bee67ddc936d26c34c48c2cc30099961126686241cde5aa3b26bb3b9e4f49379eab9a770f6ae4d6a35d043f5503d54cfc1da58efdff34b6f39c8712b8e3bf8bbafef6de66a8a27728285e1931ee563cb5ddcee16f76721194c48423298908424989084b572dfb210e5def5c281c3f7f2d1037772646b9b8bce7c181b1b503d54077a7657d5937eef658f79fbebfff686698edb5af78b80cb38c1fd840f2e77f2e5e51e166551342c8a9145599445590c8ba2b2285bcb828a8aca12d95ee4c337dece1b3e741347d76baa033dd46aa8d55c96c38f7c11c7d5cdbff5c71b4cdf089cc70316867fdebe933bdd22093321199230099930199230139261264cc2cc70cff636eb45549260240623319cb36727affde90b386967513d54077a0eac565cd8337d05701e27f8c472843b962d4c306131a8a86482864531b2282a8bb228dbca7a5950515151515159949bbf799477fcc76d540fd5811eaae7bca9b962a3e04a4e70d76cf3a5eda3989084494842129e74de2e9ef5c3677064bdf0814f1ee253371ec684c9301392c1c8b248125492604443221a1279ff67bec14f5eba8773cf3c89eaa17aa0e6ca06f673822f6edfc3a2a8a82c8a8a91cb2f3c8d4de1f49d9b3cff698fe6953ff3fd9c77d6c92ccaa22c2e6c2d0b2a8ba2b2282a2a2a2a2adbcbc2d59ff83ad543f5501d6a95fd0dece3ffd570ebf6bd98608209262c091ad806d6c07a601d1e73dac9bcea3917f1d2679ccf69bb3651d95e4445c5888a8a8a8a914551f9b71b6ea73a54077aa89e7d0dece6b8eae1582d1c5dd6a8a8a8a8a82cca47be72076ec1ac812d98f530ebe1d2f3f7f0872ffa019e7bf9b96c6e828a8a8acaa2a82c8a8a8aca370fdfc79df76cc16aa8d550abd9bd7ae5537ee20faa077ab82b6b3e7fec08312492842424210937df710f9f3b78378f3c7907a73f6c27c571c371435771e1a37773f9931ec5d6b270e36d77b1bd480c46623092041513a2fcf80f3d92334fdb41f5509deaea811eaa072ba8183161493062c4889103df3aca9bfef5cbfcf987becc6ddf3c066b600db31eb2865d1b9bbcf4a71ecb5fbefa47d9fff83331a2a2a2b2282a2a2adb4a75a80eac86a6875a855a052a6850591495c5b01816c362580c1a3e73dbb778cd7b3ec55baffd0adf3abc056b603dcc1a660d7b4f7d38af7df193f995673f0e95455151515151a142ad865a0dd543d72a540fd503158c98a0a2a2a2a2a2a2b2288bb25ee4c337fc37af7cc7c778d7476fe2d8d105d6035bc3ac812db8fc07cf41c5888a8a8aca12a143f5400fd5c346f5503dd00335a898908424444942129290842424210949b877097f7ffd4dbcf7d3b7f0bca75cc8339f7c3e35c3a4680b1513a298a0920423d4400fd5a156c346f550ab400f74d09088094948240931989084242421099390098b72cea9bbd977ea29b00606c830eb41c5888624a824c108156a15aa87ea61a356811eaa076a306242942424211113921043123221864c386de70e5e70e913b8fcb18fa67714ac610215581f934549444312549260840ad543f5400f1bf4503d540f545049829124684842121249421292b041f19c0bf6f1b38fdbc749276f50db30339440605986abfee5b3a824a221110d2624420dd5033dd42a6c540fb51aaa03154c504942221a92908444929084a79c7e162fbcf862cedc753258b00593a184097cfc96aff3a60f5dcf8ddfb8130d46623092040d8950a156811eaa878d5a85ea811e562b50494443128cc49084249cbff311bcf8dcc7f2b8d34e8306d640869982c0d7ee3aca9b3ff609aebdf100261889c1480c4692a0c1c8e60ea087eaa17ad8a89ed0d3d5c32927ad50498291188c24210957ee3e97173eea227aa3600d0c4ca002c7d66bdef6e52ff0ae2fdec0fddbdba824c1480c46623062421413ce3e6327d543f5c02ad9a8d51ca1e7d4eae1d487af78c46673f8d8364692a021110dcf3cf531d476310166a8c0043e70dbadbce5864f73e8d8bda824412509466230a2211113a29cb16707df77d64e6a3554077a8e6c54cf2d742ead1ee8e189673f826b6f3a8686443424c1c8ccf06d02035fb8fb0efee2d64ff1f9bb0ea121110d49301283110d896848c484284fbfec2c6a15aa077aa89e5bba56b9be7aa81eaa87cb2f3a9d49484483115d88f2ae435f617bc2a1f531fee8a6ffe4e59fbd86cfdf753b2a2a2a2a2a2a8ba2a2a26244456526fcea2f9c4ff5400fd5c371d76f54cfd5f4bc9c1eaa8773f6ece4b20bf6f0c12f7e8344926082ca7b6fbf99f71dba89b5b22889c460448391188c244143221a12314125092f79eef93cfec25dd46aa0866f2baeee94d754e74075a80ed5c3f37f642fe7ec39091316c5654145e5fe6561591654342ccaa2a8a8a8a8a8a82c8acaa2a824e10917ede60dbffd046a3550c3ff9903a4af59bde9fd1fcbef3c7bff3d553cab7aa087cd1dc5fe0b4ee553070e73e791fb49828a0989c4604214138cc4602406232644312106234978e2c5a770f55b9fca9ed336a18613bcba2e79cf279be336b636afa2e73a5643ad86eab067d7066f7cc1e379faa567928811150d8ba2b2445454545496888a8a8a8a11185efa73e773ed3b9ec6d967ee801a4e701d27ddfd368e2b1e70e7db5fb1979aebab676ff5400fd543ad865b0f1de5ddff7e1b1ff9dc210e1dbe0f95241889c18886444c8862429433f6ece0193ff6285ef6bc7d3cfea25d540f14df511ca456fbeba2771fe4b8e20477bfebd72fb1b8a69abdd54375a087eaa17aa0874377dfc7ed77dfc776841aa8400d54a0062a50c3e6263ceaac93d87bf64e6a35540f5503c5890eb2cc15f5847ffa120f281ee4f03ffcdadea6df49e769d5033d540fd5031d6a35540fd5033d540fd5811eaa87ea811e6a35540fd5811eaa8707b9Line truncated
|
||||
|
||||
// Static13 returns static file
|
||||
func Static13() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic13Data)
|
||||
|
||||
rawStatic13Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 2639,
|
||||
2639, 5200,
|
||||
"YRL1i66QSlw=", "IjkXdN2y5Jc=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic14Data = `89504e470d0a1a0a0000000d4948445200000180000001800806000000a4c7b5bf00008000494441547801ecc10bd4ad7941dff7ef77ef739b736618609811504a308652354a5630525cb63166c5a64616214b8d92d6466388b754d0802e93668cc8d5947a8b2bae906556929a8a355aad76a535bad26a88c6c4a880023388e08c0ccc859939d7f77df7afffe779ffcf739efffe6f1284237366667f3eb2f798f19e6f79cdeaf0901b0c37a2e712ce3dedfd4f3b77fedc434f7af0c6079f62d6b7c53c39700b722b9b3c79854fdec819e1b4702a700a38059c024e733d902a4c949e14a1211d0d1dd912908e14b210909e2c848114d29322cca42385a1235b02d2102ea35730570857205790cbc025c27de87dbaf940f05ec87d89f79c7dc2fdf7def884071ff8e0ef3ee33c7a11b8003c74e393eebbf0c4bff6fd07ec3d26c8dea3d6bb5ef69d4f71e52791d53322cf5aaf79ca66c32d84a701b7066e136e059e00ac7934922a4c949654a1211d0d1dd912908eb21046d293853090425a52859974a43074644b401a52c84218494faa50447818f920701ff08190bb4edf70e99e33379cbffbc1fb6eb933e67d78e27dcf78e5b77f90bd4725d97b54c817ff8877df76f7d3cf9fb9f082957e5ac2a74a9e093e01b8197822700690c70a29c2440a6949151ad2d1d0912d01e9280b61243d59080329a425559849470a43475a866d52c84218494faa3090427a12c825e07ee0c1e0839af740de8abeedd40de77fe1d64f78dfdd7ec99bc3de754ff6ae2beffc8657af576b6f66ed275cb97ce5d613274f3c7bb5f64f263e5ff843c09ac70329c244e949151ad290c2d0912d01e9280b61243da9c244e9491566d291c2d09196619b14b21046d2932a0ca4909e14a1210d6183dc8df995243fbbd9e4d7d6ebd5ef05ee5979f281a77ff3ed1bf6ae1bb2f788cb17ff8877dd76d72d976eb8f4c772983fa6fc51f43390670137f178225598283d2942471a52181ab243401a52c84218494faa30517a52848674a43034a467d826852c8491b464210ca4909e14a1210d290c5b1e42ee047e5d57bfb149de7670e2e057ee3d7bffddcf7be90f86bd4794ec3d62def90dafbe7175d23f75e6f20dffcd9593579ebb596f3e09b81538c3e3915461a2f4a4081d6968e8c80e016948210b61243da9c2400ae949111ad2518ad0909e619b14b21046d292853090427a52848634a4307464e93270df66b579efe1eaf0574f1d9dfaf91c1dfccc27bdf2f50fb0f78890bd8f8b77bee2752b37dcec864f543f276c5e04fc57c059f640aa30517a52848e34347464878034a4908580ec26551848213d2942431a52183ad2336c93421602d293853090427a52848634a43074644b401ac279e45fb1dafc38f24b6e7cdfcadcf7092f7bed86bd3f70b2f707eab75ef6aad3ebd58967839fa7791ee1b380e7b077955461a2f4a4080de968e8c896309286b22520bb49150652484f8ad0908614868ef40c4b52c89680f4642148253d29c24c3a52183ab225200d2964e9b7356fc1fce2d1113fb739dabcf33f7be5eb2fb3f70746f6fe40e48b7f6475e733eff8d3092f119f073c1338c75e4baa30517a528486743474644b184943590823d94daa3090425a52858634a43074644b401a52c89680f4642148252da9c24c1a52193ab225200d2964218c64701ef29e845f5fc19b9f7ae37d3fee4b7ff088bd6b4ef6ae89777ec3f7b83a71e9e68d479fba92cf07bf1c780e7b1f9e14612285f4a4080de968e8c896807494853092dda40a0329a425556848430a4347b604a421852c8491f4642148252da9c24c1a52193ad2322c49250b61243d017997e49fcae6678fd627deeea953f73efda5b787bd8f99ec7dccdefdb2573ffd28a7ffb4abc33f89f902e0e9ec7d78528589b29ba1230d290c1dd912908614b21046b29b1461a2f4a40a0d69486168c80e016948210b61243da9c2400ae9491566d290cad0909e61492a590823e9491506c2bd59f37fb15eff8b1339f87f6efbfad7dfc5dec744f63e6a77bcfcd54f00bf50f8ebd167034f0264efc3932a4c94dd0c1d692845e8c8968034a4908530929e54612085f4a4081d69486168c80e016948210b61243da9c2400ae9491566d290cad0909e61492a59082369c942904a0601eed7bc0bfc4158fdd853ffc757dfcfde4745f67e5f7ee31bbefbc61b4e5d7c16f025c05700cf60ef2323559828bb193ad2d0b0936c0948430a590823e949150652484f8ad0919914528486ec10908614b21046d2932a0ca4909e14a1210d29a4080de91996a492853092962c04a9a42745ee117ef8492ffee1375dfea7fffdbb9ff02daf7a98bd8f98ec7d4472fbedbeed834ffc9cf589c3bf70727df885c01f61ef2327559828bb191ad2d1b0932c849134a4908530929e54612085f4a4080d694861e8c80e019949250b01d94daa3090427a52848634a43074a46758924a1602d293852095f4a4080bef3875b8fae95387eb9fbaf159bff52ffd923787bdff24d9fb4fbaff5b5ff5ac8b47abafb978b4fa0bc0338093ec7de4a40a13a52745684847c34eb21046d250b68491f4a40a0329a427456848430a4347b68491cca4902d01d94daa2095f4a4080d694861e848cfb024856c09484f168254d29322cc647208fceee9d317df7ceae4a5bf7feec6fbeff04bde1cf63e2cd9dbe98e97bdfeecd37ef44b3ff9f7bef487ff6ac24b8027b3f7fb275598283d2942433a1a7692858074948530939e54612085f4a4080d694861e8c89630929914b22520bb4915a4929654a12133a90c1dd912908614b225203d590852494baa30938654e681907ff6e43fffbf7ddf7dfffccbee7cda37bcee227b1dd9ebdcf94daf7e76587f39e44b81e7b0f7d1912a4c949e14a1211d0d1dd912908eb21066d2932a0ca4909e14a1210d290c1dd912908614b21046b29b54412a6949151a3293cad0912d019949255b02d293852095b4a40a3369486558785bf0475d1dfdb3a77edd77bd9dbd86eccddefbb2fff9f481072f8cf936e0d9c00decfdfec94298283d2942433a1a3ab225201d6521cca425559828bb49111ad290c2d0912d016948210b6124bb49110652484faad09099548686ec10909954b21046d293998491f4a40a3369486568c8e012e41dc8eb58e5c79efa35df7589bd91ec71c737bde6a60b97cf7eded9d317bf11f85ce0047b1f1d590813a527456848474347b604a4a32c8499b4a40a13653743471a4a113ab225200d2964218ca427551848213da942436652191ab243406652c94218494faa2095f4a40a3399c982a121db8e30bf74fec6d3df7574c27ff9ec977cc7033ccec9e3d8bb5efeaa13ba7a2efa12e2ff003c91bd8f9e2c8489d29322cc64270d1dd912908eb21046d2932a4c94dd0c0de968d849b604a421852c8491f4a40a0329a42745e8c84c0a2942437608c84c2a5908c86e5205a9a4274568c84c2a2942437a86ea41e09fLine truncated
|
||||
|
||||
// Static14 returns static file
|
||||
func Static14() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic14Data)
|
||||
|
||||
rawStatic14Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 93590,
|
||||
93590, 170769,
|
||||
"t6ktFafVuB4=", "Pk5MjwTzgWM=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic15Data = `89504e470d0a1a0a0000000d49484452000000300000003008060000005702f98700000002494441547801ec1a7ed200000f2c4944415495c17910260479dff1eff3bcef5edccb423957c00d371e916883259251a9a6f4a4199dd6244d4d3aa9d836045a9d3ab5f58fa69aa622b523f983fc914e33d369aca3ce88d24ed592106324261291182e572e41ae3d6077d9f77dbebf6e22d3a17441f3f9147f01f7fcd2875e06b982aa4b0b2ea2d80e1c032c789eea4087aa4087aa404355a04375a04275a63a7ba83c589dafa7726b97379dfacf3f743f3fa0e2fbd8b7fddbf5c8dbfeeb5b495d93ca1b81e6c51454053a54053a54053a540315aa0315aa4355a04375a0a03a50b1db2ff6a683d71dfb373ef1b94da7df1f5e42f112eebbeafa0bb2e5c00dc0657c3f0555810e55810ed5810ad54085ea5015e8501da8501d28a80e54a80e74a80ae9fcf6925c75e2bbffc3377811c58bb8efea5f7d5716731db099efa7a02ad0a13a50a13a50a13a54011daa0315aa0315aa0315aa810e55810e55810e5581ce815eceb527fefcf5377018c50bdcfd9e0ff662b5fc707aaee60751a11aa84087aa4087aa4087aa4087ea404175a80ad5810e558186aa4087ea4085ea5015e85005b598ffb87079cdd69fffb03ccf921758ac161f4ecfd5bc0481477c96efe4004f7890bdae593998908424248148129290842424b27f3d9870dcc6e6d4233772cef15b387bdb16160d55810e55810ed54005aa7ed1c58a43aee6798ae7b9efea5f7d571673032f620877b98f6fce333ce39a242421911892908444929084242421861050f6ac561c1c51518972f4c6e6b233b7f286b38e63c312a8501d28a80e54a80ed5ebab8effa91b7e8de72c78ce5deff9e085453e012c398cc7b3e20bf3243b673f071d92900413544c30c188092698608206232a263cb35aa362828acabe836bee7c742f5f7d6837676cddccf1472da14335d0a13ad0a1aadef4beb7bffa531ffaef5f7d8c43161cf2ddb77cb656277ef7e3c00e0ee33ef773cb3cc57e87246830624212128921098924c1040d1a8c2421092be5d9f5a0a262828a8acade032bbeb4f3498e3f72c919db36434355a04375a8ce52fac27ff39ea3fff32fdff82d9a439eb9e0eb3f01bc81c3b8d7fdfcee7a17eb9151463183ca28e33023a38cc32833e2888a0e2aa38c72703d8c32ca2833c338a8a8a81c5c0d37defa6d7ee7de27a90ed5a13a54053a74e7b2f5ce73dfca21cd2176aee1301ecb417e6fb58b51465151999151545446196594514619651c46196594510ece1a1515151547c6611c4619653d72e32d3bb9fbd1bdd0a12ad0a13ad021cb5cc3218b7baffde0cba0ae078ae719c2ff5c3dc13e874492a0624214134c4802041d92a0c104232698a04183cafed59a518cc4a0a2a262444545c37ae41b0fede5f2576e63b184ea4085ea40e7ccf7fdbd8b7f6359e92b52695ee0cef5d3ec9a15312462421413a224e135671ecd5fbff804961b8b3fb87737ffe3abdf65cf332b92602409312492845146515131a2a241452511151595879ed8c74d7ff40857fee8c9d0a12ad0a12a0d5cd1562ee50524dcb1da8b8aca288e8ca2a272c486e2ca579dc0962a36a4b8e49cadfccbb79dcd9b7ef804ba83ca8ce830ca280767505151714445071d546664464619651c3ef99587994855a04355a8865a786957b8881778700ef0b46b54465131a2a232cab19b172ca6600dac022bd954c515af3d997ff58ef3b8f89ce34864141595d50c33c3388c328a238ea8e8a0838a232a2a8fed3ec01f7eeb29aa4375a80e74a8ce454db19de7abf0c0ecc391518c8c32232aa3a81c3838640d59016b6005ac02abb075cb46fee15f3d8bf7fefdf3d971da51ccc8ccb05e0f2a8ee8a0c328a3ccc828a3e8a0e2888aca57ee7a123a54053a54079aed0d1cc373aa43757874fd2c4654465199c8283a8cf2f0eefddcf3e833b086ac8015b0065621ab90159cb9ed48fec5dbcfe7aa2bcf66db719b582ba3a838a2a2830e2a8ea88c320ee33023a3fcc9037ba80e74a80e54a8ce314b60c121d5810ad561f7fa20a344d1908809518cc460e4635ffa166fdc7102979f7b229b372f204080841892a20217efd8c6ab766ce573b73dc46f7de15e763fbd4645c5884a14150d46545454541e7a621f54a80e1454073a8bc52fbefecd1fa80e74a80ea9f0e5bd4fb1565492a012c58424a824b21eb9ebb13ddc7adfe36cace6f4e38ea0282a7c4f80147fa6ab38e765c772f9eb4e633572f7034fb15e8b8a111515150d46a2a8a88cf2336fd94e2d4235d0a12a2caebef44d1fa04355a0031d7e7fef538ca26242149524a824c1888644f61f1c6e7fe8296edbf9045b376fe494a3b7501c12be27c59fa9c0c6e582d79c770297bde6541edfb59f9ddfd9832346545454544c5051e90a3ffb13dbe9866aa80ed5a1e95015e8501daa8323a3a8a88c62c2282aa338a2328aca280f3df50cd77ffe4efeed676ee7ee87f79035b002d68155c80ab2065670ea7147f2fe77be966bdff1c38cc38ca8a8a8a838830e2a2a74a80e74a80a74e8ea4087ea40052a1851194545c5195426a232ca2833320e2aa3a8fcc9c3bbf8d79ffc43aebff90e1e79623fac8015b00eac206b600dace0ad7ff90c4e39e10874981946196594511cd161942aa04355a043755852a13a54072a50414545839128466250311283911812d1908809514cf8ddbb1ee1cbf73cc2e5179ec6db2ed9c131476d84045244205081a3b76c404545c58806151595451774a8062a54072a2cab4375a0427548855154548cc46044250623311889c14814136230920495f5844ffec17ddcfcc73b79fb8f9ecd4f5ef243d432102045028e8ca2a212c5888a0615a7a80e1454072a54876575a04275a0435588324a221a545492a012c5844434443192049524a8244165ed70fa71c7f08a53b6c19aef0990400a479cc10415151515232a5a54856aa04355a80e4b3a54053a54855498888a4a14135492a062240695444c5089c14812a298b06dcb26fec1ebcee3c7cf3d8d5a16ac21810a10c0e0888a8a110d2a2a2a46c6820ed54085ea40876555a04375a042557044c5880951548cc4a0622406232a49504982cac66efeee053bb8f2153bd8b46941adf99e0086a44070c2438fef65141515235134a8a8d84575a0a12ad0a12a2ce9501da8501da8604445c5480ca34431a221110d518c24418584cb4e3d859fb9e83c4e386a3308ac2001124a40c07010f9c8cd5fe1b1dd4fa3414545c5888a8a062da8500574a80e54585687aa4087ea1082ca288938624443221a54a21831218aca39471fcbcf9d7b3ee76e3b0e1645d650812420d4122220dcf2cd07b8fe7f7d856f3fbe1b15235134a8a8185151d1a23ad0501da8501d96d5810ad58182aa1025ca2826c4a0a212c504232a51b62e37f1d3679dc365279f422f0b56400281a4a8004202f73db68b8ffcf66d7c79e7836850515131Line truncated
|
||||
|
||||
// Static15 returns static file
|
||||
func Static15() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic15Data)
|
||||
|
||||
rawStatic15Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 3955,
|
||||
3955, 7606,
|
||||
"3dDV9SNxnvs=", "M/TwBXU/b4w=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic16Data = `89504e470d0a1a0a0000000d4948445200000200000002000806000000f478d4fa00008000494441547801ecc10ff0ed6941dff7f7fbf7bbf7eeee05963fcbb280084a154d556a1c67d4c838b4759ca48a13c72c66aa8dd52a8c22c6ec2268adc97554d83ff82fb676a06da6696ca661355308d54ea3366dc3a855a7566a6db2ec35fe27c88259feedde7b7fe7d3e77c7fcf39fb9cf33c8f8af2677f77cfeb2507071f67b9fd4dc7bff509f73fe3da396e393e397fcbea28b724b9f5486e89dce22ab7446e91a35b422e10549e4211b8003c81534f002e70d64823b49439294247a6344cc94058c89014b2272c644e1a61430a9993227464480ac3944c04a4235c013f8080f900e10a45c81f1d490257c8eac170f4e0d1910fc2ea41c2bbe3f1bbe1e4c1e4f8c115571e7cdea7deff2e5f7adf0907071f477270f031f05bdff1baa75ebdcaf30dcfe788e79ba3e7873c1f7836e193908b3c1e4923b49439294247a6344cc94058c89032101632278db02185cc49113a322485614a06c2423a52c84058c89c34427155f81de00f30bf2f4797432e4b2e5fe3dce5e7fe5bbffe5bbef4be130e0e3e8ae4e0e023e8fe3bbeef138f72f4591cfb5959f942e5b38017003770b04b1aa1a58c49153a32a5614a06c24286943d614be6a41136a49031a9424786a4304cc9405848470a19080b99934658934ac6e411927f01bc3df0765cfd9a5e78fb735e73e9773938f8089183833f83dcfea6e3dffcc4cb9fb9329f677c618ef299c617024fe5e04f26556849216352858e4c69989281804c297bc296cc49236c48216352858e0c4961989281800c49217bc296cc4923ac49256352858ebc17f8b5b07abb1ebf3d9efcc2739e77ffaffbd2fb4e3838f830c9c1c19fc2af7ff3a527de78d38d9f8df942c28bc02f049ecac1874faad052e6a40a1d1992c2302503019952f6842d99932ab49439a9424786a4304cc9404086a4903d614be6a411d6a49039a942473ab2783ff27f23ff3ce46d27d74efef9f3bef3aef77270f02790838381fbbfe5b5b77ac12f16bf107911f099c031077f3e528596322745189221290c433211902129644fd89239a9424b99932a7464480ac3904c0464480ad913b6644eaab02185cc49153ad291cab0e784f06b1ce56d81b7e9859ff984575d7a3707077be4e0a0c8ed6f3a7ee0b90f7cb6f2c5ac8e5e82f902e088838f0c698496322745189221290c433211902129644fd8923169840d29644e8a3024435218866422204352c89eb02563d2081b52c89c54a1231da90c43d25a01ff17f833c0cffcc1cdeffadf3ef7e56fbccac1e39e1c3c6eddff2dafbdf5e8822f5ec94b8ef04b81a771f091278dd052e6a4084332a4614a2602322485ec095b32268db02185cc491186644829c2904c0464480ad913b6644c1a61430a9993220c49470a29c2904c0464ed3d929f85a39f599d5cfda9e7bce69edfe5e071490e1e572edff9fae7916bb7475e0a7c2e20071f3dd2082d654e8a3024431aa66422204352c89eb0903969840d29644e8a30241d290c533211902129644f58c89c34c2861432274518928e145284219908484708e4973cf24d393eb9efd97ff3eedfe6e071430eae7bf7bffaeee71c9de42b89b763fe1220071f7dd2082d654e8ad091290d53321016322485ec090b999346d89042e6a4081d1992c230251301e948257bc242e6a41136a4903929424786a4304cc944403a5249ebff0ddc77ee68f5dfddf6b7eebaccc1754d0eae4bffe26f7ddf279c3b3e7fbbe1a5219f0fc8c1c78e34424b99932274644ac3940c84850c2903612173d2081b52c89c14a123435218a664202ca423850c8485cc4923ac49257352848e0c49619892898074a49081b09015f0f384375dbb76f213cf7dcd3dbfcfc175470eae1bb9fd4dc7979ff7c0bf1b8e5e66f215c0390e3ef6a4115aca9854a123531aa664202c6448d913b6644e1a61430a19932a7464480ac3940c848574a49081b09039698435a9644caad0918e54862919080be94821036121fb56c0cf99bcf1994f7ccfffe8cbdf789583eb821c9c79eff8b6d77d8ae7f81a72f4f5904fe4e0e347aad09242c6a40a1d99d2302503019952f6842d999346d89042c6a40a1d1992c230250301199242f6842d99934658934ac6a40a1de948659892818074a49281b090390179a7f1ef1f1d5ffdaf6efbd67b1fe0e04c938333e9fe57fedd1b8ece7fe0cbd19701ff3e20071f5f528596322755e8c8901486291908c894b2276cc99c54a1a5cc49153a322485614a0602322485ec095b32278db02685cc49153ad291ca30250301e9482503612173d2086bc2afe48837e6c61b7ffc135e7ee9831c9c397270a6fcab6ffbfe679d1c1dbd527d59e0160e3efea4115aca9c14614886a4300cc9444086a4903d614be6a40a2d654eaad09121290c433211902129644fd89239a9c28614322755e848472ac3904c04a42395ec095b32278d20956cbc5b79c3d1b993fffc19afb8f79d1c9c19727026bce38ed7bee0085f11fd46e0260e1e1ba4115aca9c1461488694220cc9444086a4903d614bc6a41136a4903929c2900c4961189289800c49217bc2968c49236c48217352858e74a4320cc944403a52c99eb02563d2086b52c9c815c23ff2e8e89e67fecdd7fe3f1c3ce6c9c163da0377def522c86bc02f05e4e0b1431aa1a5cc4911866448c3944c0464480ad913b6644c1a61430a9993220c49470a29c2904c0464480ad913b6644c1a61430a9993220c49470a29c2904c04a42395ec095b32268db02695ccc9a99cbccda3a3bb6f7be5dd6f55c2c163921c3ce6fcf2cbde70fe294ffaa3ffd0acee405fc8c1638f34424b9993220cc99086299908c89014b2272c644e1a61430a9993220c49470ac3944c0464480ad9131632278db02185cc491186a423851461482602d2914af68485cc4923ac49257352850de15757c90f3ceb8f2efe0f5eba748d83c7143978ccc8a54b47971fbae12bd1ef073e9583c726698496322745e8c894862919080b199242f68485cc49236c48217352848e0c49619892898074a4923d612173d2081b52c89c14a123435218a66422201da9644f58c89c34c29a54322745e8c8c6bf4a7cddb39ef5c07fe34bef3be1e031410e3eee72e9d2d1e5876ef84af47b814fe3e0b14b1aa1a58c49153a32a5614a06c242869481b0903969840d29644e8ad09121290c53321016d2914206c242e6a411d6a4923929424786a4304cc944403a52c84058c89c34c29a54322745e8484f7ee328dcf58c675efeef7de97d271c7c5cc9c1c74d88bff9aabbbf8cf03d81bfc8c1639b34424b19932a74644ac3940c04644ad913b6644e1a61430a19932a7464480ac3940c848574a49081b09039698435a9644caad0918e54862919080be9482103612173d2086b52c99854a1231da90c905f0f7ccf33bfe5de9f50c2c1c7851c7c5cbce38e7bbe4c57df0b7c36078f7dLine truncated
|
||||
|
||||
// Static16 returns static file
|
||||
func Static16() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic16Data)
|
||||
|
||||
rawStatic16Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 137700,
|
||||
137700, 240735,
|
||||
"VBQdof1GPuQ=", "RfYGv81FnTY=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic17Data = `89504e470d0a1a0a0000000d494844520000004800000048080600000055edb347000019ca494441547801acc179f037085dd8f7d7e7fbfb3dcfde17b0b0bb42e43ea3565440204d3d12276aa46d4caad5142a4e4dd3883a82a4e974ea3f1e28a98d1a3336a947d344e3d47accc46a8c8da3462304bc50514158b9afbd58f6789edff7f3eeb32c7618e592e6f51aff81bce145df76c3f9e3f9bf70ff65f73dabf1b4c3f1f0d83dd99b702dce61fc49c34c4c0c333198ccc4603283c90c260e9991e9a271d7e1e4f84ebcdecc6bce5f7ecfafde77f18a5f7cd4d77fd36dfe0318ff3fbcfeeb5e76dd8cbf91bed4782ecef9584d663031ccc4603213c34c0c0e9989c1640613c34c4c0c333198ce4cbf74987e684efdc84d2ffad63b7c9cc6c7e13d5ff7f29bef389cbd182fc475feac263398186662629889610e3198ccc4603283896126268699184c6662988971d7e1fc85ffedca6b6f7ff9355ffefd6ff56734fe0c6e7dfe3fbee2eca1ef7989f1125cede33199c1c4301393191c629889c164260693194c4c663031ccc4301313c34c1c30998971b7432f3f7fd6b73de4452fbfd7c7687c8c5efb926f7ec6b93dfc009ee2e33599c164068798cc606298898961260693194c4c663099c1c4640613076662309989c16406b3bf7b6ef6050ff95bdff10a1f83131f833f7ae1f7fe1d97ddff43b8c9c76b328343e610074c663031ccc4c4301383c94c0c263398cc60e29039e010076662629889c1640613e3c6669effdf7fd953ef7cd98ffeda2b7c14e323f8adbffddd27579fbfef3bf6e4ecab7dbc8699184c66623099c1c4301313c34c0c263331ccc46032074c4c663031ccc4c4301383c90c26333198cc3027c7efbe6cfbda6bbef23b8f3e8cf161bce61bbef5e48aed9f685ee0e335dce3cc5d9db9b7a38bd60a31795088714992f79b8c24ef3749b69c3b19d79c3f78d8e5e75c77f909c34c4c0c3331ccc4c4301383c90c0e31197e70bdef850fff8a7f7cf4219cfa30aebef7fcff723c7fe105fe8ccee42d7bbf37ef7ddeb1f7b9b755a92849a550928aa8904ae50115a552b9f3e299e3ae2d95ab4f0f1e73dde59ef6b0ab3cf5c62b9d3f0cc34c4c0c33313864260693194ccf3f75c57bf1d53e84f121bce16b5efe77f6f4ecbbfc19dc6bbdf6f83eafdb7b5c6855944a222a950aa9144a52118952a93ca0b2bbeeb878a65d952d954abb2e3b3d78d6275cebb31e73836b2f3fe1c04c0c26333198cc606298c99c5e7cd143fecb7ff45dfe84137fc2ebbefe5b9fe1b03f8c131f8395dfde7bfcd2d91ddeb1f73b6b2545a552a92495a292542a8592548aa4520917765d381e6da9b4abb2a572f1b85e7fdbfbfcd2adb70b8f79e8e50e8761321383c90c263399c1641c3efbef7ef133fed5cb7ef4156ff1414e7c9037bff45bae38eefcdfb8c9c7e0cecefc9be3eddeb8f739964a45a924855651a92849a124954a51492a22a9dc7f5c1777b5abb2a5526b3795cad971bdf65deff59b6fbdcb131e7ea56b2f3f613099c164260693194ca7669ffbf7beead1dff7adfff477ce7cc0c107b9ff6c5e82a7f818bcb9fbfdf4d97bdcb617edae6deda6b265cb6edab565cbb62a5b76b3ad6ded66375bb6556b375bb6b5bbb65c381eb56bcb9676edaedd542abb6b77b5b9f5f67b7df3cfbece6fbcf52e339989c94c0c263338c4217398a7ec6d37bec40739f1016ff98aefbde5ec8afb7e08e77d146fd87bfddbe31dce4aa5a2542a4945292a1525a9544425518aca4aa552547673eff1a8d2ae2d954aaddd542a5b6ab5b978b65e79eb1d1e7ecd798f7ac8e5666270c81ce280c90c260e3ee37ffcf227ffc037fff06fdeed92830fb8effa3b5e8cab7d146fdafbfcf2d99dce36bbd95d952d5bb6b4d9cd6e76d7b6b6b56537bba96c6b5bbbd9cdb6b6d5aedd6cd9d6b62eee51bb76d7964aadddb59bcab6b6d5ae365bb675f1ece87b7fe156bff6a63b39e09099184c663031cc74f5f178e58b7dc0c125af7ff1375f677aa18fe28ecefcd2d91dce5ab56a5576d7eeda56bbb654b66c69d366776d6b5bbbd9cd965adbdacd6eb66c6b77ed66cbc5e3da5269d7eeda4d655bbbab4d9b2ddb6ad76eb65c3c1e7df7cfbdc19b6fbfd74c0c263398cc6426269aaf7cef8ffdadeb5c7270491dfe0b5ceb2338ca2f9cddeec2ae5a5bb66cd95269b3655bdbda5db5b66cd9b29b36dbdad66e76b3655bb576d76e76b3addd75b647edda5d5b2adbda5d6d2adbda56bb76b3a556adddbceffe33ffe05ffda18bbb663283c94c0c263398ae6dfc0d971c3c205feaa3f8adb3bbdd76bc605bbbecae7655da6cd9b26537bba9ece6fc29b5b655d9d66e76536b5bbbd9cd6eb66cabd6eedacdd9716da9ecaeddd5a6b2adddd56637dbaad5aeddeca6d6b6def0cef7f9f157bd8dc164260693194c1c628e5fea92935bbfe6efdfd0c97e274e7c18f774f4f3176fb3a552a914b52a95a296129e7acb959eff9fdce2f33ffd46cf7af2f5aeb8ecc41fbdeb1e17cf5645292a1552d42a92ca71d7855dbbab52a96cab4d654bad4a9b2db52a5bda546afdfedbeef6399ffc30575e766070c81c70884366301ef93ffcb5677cf7c9573ff7b33f0f5fe62378f5d97bbd7defd726a9542a958a52a9541e7be3155ef0dc9b5d75d981387feec4636ebed2339e7cbd0b67ebcdefbed71e93542a4552512ac5c5e33adb55a96cab4d654bad4a9b2db52abba9546a6da95c3c5b95a73ffe3a0e9989c164069319274ef7970fd33cd34770517eefec6ebbabb2bbdab5ad3695766d6bcb962dcf7dec750e8b238e718cb35c7dfed4173fe716dff0d71fefa99f788d4a9b36dbda5dedda5d5bb675b66b5bbb6b77b5d9b2ad76b5d9cdb66aed6637b56a6d6b376d76d7b67ee6d7dfe1be8b473331cc640693999838f4cc43faf33e825b8ff7b8b047956d55b6b4d9d6eedab29bddb5bb6add70f929471c71c4591ce32c1d79c47597fbaa2f7c8cffee798f73cb8d97dbd66e76b365cbeeda5d677bd4a6b2ad6db56b375bb6556b37bba9556bcb6edab5ad6d55dabcf7de8b7ee5f7dec3301383c94c0c2673b29f7418f3581fcee48d67f7d8cd962d5bb66ca954b6542a95dd38d211471c71c411c7388b633af2e4475ee3ef7ec993fdcdbffc68d75d756a5bbb6b37bb39eedacdb676579bdd6ca9d5aeddeca656adddeca65ddbdad2a65dbb6b5b957ffbdaf79889c16426069319ece131a74d8ff0a14c4cde72769fa4d2aea4a8b4ab9214b52ac59df79cb9e99acb1413f2a05034944ec6e1309efdd487f9b427dde0a75ff1363ff3ab6f75df8533958bbb7657654bad4a9b2d955a95dd546a6da9b4a9b5a552d94dad5f7ffd1d9219666230990326a69b0eb8d6071be69039705767ee3d9ed95dbb6bcb6e76d7eedab26537bb6b376d76d7afbcf1769de148473ae288238e38c6319da5231db9ec70e279cf7ea46ffa6f3ec5733ee94683e3716dd956ad36bbd956ad6ded6637b5b6b5a5Line truncated
|
||||
|
||||
// Static17 returns static file
|
||||
func Static17() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic17Data)
|
||||
|
||||
rawStatic17Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 7199,
|
||||
7199, 13633,
|
||||
"dp+5ZoW7PbM=", "N/vJeO87b8w=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic18Data = `89504e470d0a1a0a0000000d4948445200000060000000600806000000e29877380000179a494441547801bcc109d037885dd0f7cfefff3e7b269b7b97dc07470e2226e108964e0c48a69402ad5075a0839c76862282d23415ab156b49b0a222ada33d46a9b433c8a0ed54a716459c04713469a49c7224c4cd4160b3d96cb2e7fbbecffff7edff79364d80e148c2d2cf67fcffe05f7fc37f75f36d6e7be1d59b1efe8c99f994f2f187e33c67af743b1e879b70f09b99cc609cc4301383c98599180c33b93431cce4d26032634d57f181b972bc5b87775cb9e1dacf1f8f37fec48d373ff8e6871fbaf1a79ffd275ff7b0df61e377c85b5efdedb7cfd1171d1cbe700ffb4a3cc9c76a328389716926069371323118667269629889f188c90c26c6496630318c9389714f87fde143febe83bffff46f7edd5d7e078c47d15bbff9b5a32bbfef4a87af3b5e397e016ef1db3599c1c4b8341383c98c93184c66304e6298897112c30c2686118389619c4c0c26334e623c74e5b0ff700f87bf31cd0f3ef59b5e9b47c978143cf8ac3baffcd21ffcbe2f6e8e7f1a2ff168182799c1c430934b83c98c93184c66304e6298897112c30c26861183896126970693194c2e4d66301c6ebcfae3375fbff26d377fc9f7fddd9b9ef9f6a3dfa6f1dbf4d63ff1175fe170fc0ebcdca3659c640613c34c2e0d2633985c9acc609cc4301383c93899180c33b93431cce4d2603283c9a5c90c0693713231deb8675ef3f4affb6f5eefb7617c8c7ee63f7bdde36fbaff31dfb1b73ef8d5b8e2d132cce4d2c430934b83c90c2697263398189766623099711283612697268699182731cc607261260613c33899184c661c6ddf7d3c1c5ffdf4afff2bf7fa188c8fc1dbbee1afbc626fbafab7f15c8fa6612697268699182731cc60629c640613c33899184c669cc46032e31113c34c8c93186630318c184c0c334e623099711283e9ceb39baf7ec593bfeabf7b838fd2f828fcc29ff8afa7b9e11b4d7f013779344d66304e6298897112c30c26c6496630318c9389c164c6490c2633182731ccc460324e0613c388c1c430934b83c90c2697263318570fd39f7438fcd5a77ced77e42374c547e8e197feabb3fb3efecebf6afa3338f3689acc609cc43013e32486194c0c2333981866623098cc60623099c13889612606937132311866623031cce4d2603283c98599cc60309de1f31c8eb7bff63537fca33fff37dfbe3e02e323f0f3af79dd4dce0fdf7d98bed4a36d3283711283897112c34c8c93186662304e623099711283c98c474c0c8761260693713231186672696298897112c30c2617666230318c938961ecf75ee9ecab9ef847fed255bf85f15b78f8dffb0767eff8e49ff89e43f3a51e45d7e59eaeb9a7ebeeddebeeefe8e13dba6e6d21e524950b8972a19c24117292a472a92445f2c0f9d10d87f198b38327dc78c51db7dee8e98fb9d1336ebbc9cd67c338896126c64966309818460c268619273198cc38397eef13f7a13f7ce56bffa773bf89f19b78fb6bfec29c5fbdf2df7676fe473d0aae596fdf87bd7d1ff69ebde6dc528a442927a95c289444c94924ca85ca858a48945051ce37f79d9fab542a95ca0d87f19cc7ddec536e7f8cdffd718f75eb0d07069371329818460c2686995c1a4c6630b930fc357be58f3df96bfe727e03677e13c7eb876feaecfcebfd36dddbb99fd907dcb90f392fa450129158125228494ea29ca4222729272927a95c2a3929c5f55d5b2a954a45b97abe7ef6bdf7fb99bbeff3f77e767cea536ff3cae73ec1d36fbb8989c130934b13c34c2e0d3331985c9889f1f57376f52df84ebf812b7e03777ecddff8bdc75b1ffa9f71e663747f476fdafbbcf9f801f7ec7547272527ad729242494422125121892827a914899293482aa172e1e1e3d17193542a954aa55239ee7ae7fb1ff2cfdf71af5f7ee0aa673fe166b7dc78c54c2e4d0c33311866623031ccc4601a339ff3a7bef2856ff8f6effdb13bfd3aaef875fcc47ffedac75fb9e9ea0fe0293e06e15fef037ee478af7bf6ba155121950b95ca854aa82445251189a8909c6c7221159190424e523c783caa5524954aa552a9542abb79d7071ef6cfefbcd79503cf7bd22de6806126c64966309818460c268619675dbbe973fef41f7ad977bfeefbdf7cd5af71f0ebb8f538df81e7fa183cd0d10f9edfe3478ff7b96625955a5995ca964a52a9d4aab4542a952d5bb6b5b2a5cd4a654bb152292a6b6d39dfb5bb2ab5da55a9542a954aa55269f3d0b573dfffe3eff6975fff36ef7be8ba99184c66309818460c26869910e3b9c7f11d7e1d57fc1a6f7df5eb7eafe63b71f051baab6b7ee8f83ef7764ea99042840a292a4a2ea4502aa4a89072a942ca492a974a3949e54239c9b53dbabeab52a95492a252a9542a954a25b9fb816bde78e7bd3ee1f65b3ce9b1371827138361260613c34c0c86997078c9b7fc81cff8a7dffefd6f7abb5fe18a5fe1aecffb3faf5cbbe3aebf8367f928bdb3ab5e7f7eaf6bad225172522a892827ab9ca4509242a95c48947292ca85a2428a242944a2846bc7a3f34da5a2542a4951a9542a954aa55279e8fce85ffe9b7b3deb89377beae36f6430cce4d2c43013e3d24c0ca683e9c57ff6358ffb5bdff63fbe2d1f74f02b3cf8e29ff812bcdc47e91d7bd51bcedfe77a2b49944aad4aa5a8646da9eca6d6962d952dc996365b92dd145b6a552ab52a2d6db6d566cb6eae1f57a552d9b265cb6e76d7b66a552a954aa55269f3f0f5a3effaa76ff3a3effc00c34c0c2633ccc438c94c0c2686192f3ffff9177db15fe18a0f7acbabbf6d72f85ff1541f85bbbae6f5e7f73a4a516885ca85362427a5524e52b950499472924a4ea2422a170a251115928872922d0f1f57a552a9542a954a25a91415a552a9542ac7f2e63beff5a2a73dd6536ebb1199c1c4603283c1c43013839bafbfe0cffcd1a7fff7affd5b3fe7c2c1074d87cfa597f8283cd0d1ebcfef75bda32db5b216954aad644bbbb6ac245b2adbdad2b29b2d5b8a36b52a954aa5d696cab6922d2d5bb2b65cdfd5ae4aa552a9542a954a9b4aad5a5bb66cd9b2a5d2e6e1eb47dff98f7fc17befbf6a061383c938999818667269e278e525c7f73cf3737dd0c10765bece4761f186f3f77968cf854aa5a54da5d8a5525954da6cab92542a5949a5b2adca962dbbd9b29bca962d954a65adca6eda9c1f57a55db52a954aa552a954da542ab56a552a952d5b7673cf03d77cd73f7e9ba3653019271383612697263398185fe783ae3879cb37bfee8e99f96bb8c147e8278ff77bcbf1418592554e9293b285882d72b236972a9544544492888a9288440985921489501272f5b88ea5522145a552a9542a954a52a9542a45a552a9bce7beab6ebee1e085cf788c194c0c8699184c66303118cffb2fbeecd3ff87d77def9b1f3c3899992fc42d3e42f775eec7ceef53c94a8a4a9bca16a5d842928d4abbLine truncated
|
||||
|
||||
// Static18 returns static file
|
||||
func Static18() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic18Data)
|
||||
|
||||
rawStatic18Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 10866,
|
||||
10866, 20334,
|
||||
"tH6w3Rzh7Pw=", "pLYy8u/o3KM=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic19Data = `89504e470d0a1a0a0000000d49484452000000720000007208060000008fdd857d00002c72494441547801c4c169aceff97dd8f5d7e7dc3b9b6726f678196fe338b6d32c8e1d27c1a889b328499db6a2292a94a80d0ae4010889024a114215120f2c78003caa04488896a254051103265213474ee22cc58e1befeb78627becf18c3ddb9de5cedd9773fedf37bff33f7631c6dbd833edeb356dfc0b50e9d255d71e39e3fac3671c3e76d63c7ad9958b4fda5db9d2ba7a6d3adab1966fc964c68989b137136313c38c4d0cc62633189b1866b237981c9b5307e6f481b9e9e60e9e73f3dcfcfc9bcc6d2f72eaf977bae1452f75c39d2f6c6ebe6d36fe4538ed9fa38e765dffcc4373f1d3f7bafc99fb1c3d71568747be86f1744c669c98187b33313631ccd8c460183198ec0d33d91b4c8ecda09d0e773aba3e5d3eefd2e3980718c6e6f4a939fdfc17baf195af76e3abbfd72d77bdba39757afc7372dab3acb51c7efe114f7de8632e7fec53b32e5ff58c199bcc606c6298c9ded8c43063138361c460b237cc646f30199bc1646f32e3c4c4303613ebc8d1e30f3b7ae261573efc27cedf74d3dcfc7daf73eb0ffda8d32ff96e7370cab3e9b467c93a3cead247ee9973effa80eb0f9df18c1b9bcc606c6298c9de60726c0693bd61267b93bd6126c689c9d84c0cc626334e4c0c6333313631ccd8a4eb575db9fb03aedefd7ea7ef7ca95b7ff4cfbbf9fb7fa439b8693c0b4e7b86adc3a3aebcef1e4ffef1bbe7f0ec79cf8ab1c90cc6268699ec0d26c76630d91b66b23731f666629c98ccd8c4606c3283b18961267b83c9b1194cf68611c3d1e30f39f7cedf74e9bdef9cdb7fe267baf1353f6e4edf309e41a73d832edd735f67dffe4773fd91c73c6bc6263398ec0d33d91b4c8ecd60b23799716262eccdc4383199b189c1d864066313c34cf60693b1194cf68699ec4d0c83ddc5f39e7ae76fcfa90fbdcf6d3ff98bddfcdddf3f9e21a73d030ecf5df2d4fff9ee2edcf391f16c1a460c26c6de4cf60693633398ec4d669c9818c666626c6298b189c13062303631cc646f30199bc1646f32e3c4c4303613636f77f651e7dffe0fe6faabdfd0ad3ff557e7d4addfe53b75da77e8f2ddf73af3b6df6d9dbf389e4d93192726c6de4c8c1393b199188c4d669c9818666c626c6298b189c1306230d91b66b237988ccd60b23799716262189b89b18961c62657effbc81c9eb9b7db7efadf989bbee7877c270e7c9b3adaf5d4fff5a73df2eb6fb3ce5f1ccfa6c98c1313636f26c626263398188c4d6630981866420c2686194c0c8699184c0c8699ec0d2633184cf626334e4c0c6333313631ccd8c46058972fccf9dffb75973ff2b6da1de5db74dab7615db9e6b1ffe5b7e6d2a73eeb593799716262eccdc43831ccd8c4606c3283b18961267b83c9b1194cf626334e4c8cbd9918272633363118460cc62686199b184cc6666c6230cc646f964bef7fcf1c3dfaa4db7eee571cdc788ba7ebc0d3b47bfcaa87fffbb7baf4a9cf7ad64d669c98187b3331363199b189c1d864066313c34cf60693c10c267b9319272686c14c8c1393199b180c23066313c34c88c1646c06138361267b13c30cd7bf788ff3eff8ef74e5094fd781a7e1f0ec390ffd837fe4daa30f7b560d2633184c0c4b8e66399443cb911cc961cba11c5a8e5a8ee4d072d87268396a392c87e5b0e5a81cb61cb61c96c396a372b872d87258563131363199b189c13062303631cc646f30199bc1646f98c9dec4303613c3d1e38f78ea77fe47bb8b4f7a3a4efb161d3d75d1237fffad0e1f3bebd974dd72761d7aa2eb9e5a472e76e4d2dab9d6ce2a3996b249a1e458b22922d92bd96493e458452821a928e70f7766b8e5d481efbae194e7df7cda8b6fb9c14b6fbbc9cb6ebbd1734e1f3098ec0d33d91b4cc66630d99bcc3831318ccdc4383159171e73fef7fe07cffd4b7fcbc1ad77f8569cf62dd85db9e6d1bff79b0ecf9cf56cb8d4ce035df5e0baea8975e8c8222a442465936c8a4844227b896c5236494436452413495211bb72b896cad5c39d27af5ef7f9f3a9546e3c355e7edb4d5efb825bbdee45b779fe2da799182726633331189bcc3831318ccdc4d8c430639375e13117fee07ff25d7ff93f3437dee29b39ed9be868d763ffeb6fcdb5330f79262d79685df7e975c9a35db3b289a890b257399628e54b921c2b9b28a190cd72acec258a4842a288e2702d954a912895cad5a3dc7bf6b27b9fbce4b7ee3de37befb8c54fbee2797ef045b73a75c08c4d0c861183b18961c626c62633184cf686dd535f74f15dffd06d3ffbef36a74e8f6fe0b46fe2ecefbcc7e53ffbac67cac2fdebaa4fae8bce752411152242d9a46c2212259b72ac6c52362994c626d9946395c12a7be558f96792a3b5542aa1a2548aa4a2ac953f7bfc927b1ebbe825b7dde8175ef3023ff6b2db1d1c601831189b1866b237988ccd60b237cce4d8e1c39f74e513bfe5396ff8d77c23a77d0397eebed753ef7acf78869ce9ba0fed2e78b24395631552e35865af844224441439169188841c6bd94424222495bd4888287b872b9522a9289550a928495179e8fc55fff0c35ff4879fbbd95f7fdd8bbde605b730189b1866b237988ccd60b237cc646f62b8f6893f9ed32ff85e37def57a5fcf81afe3f0fc458fbded7793efd8a1bc6f77de1f1c9df5448756492ac50a2dab249555564b962c95ca2a59944aa592142d8aa4b24a25c9b24a51a9a5d2629564d7b25b4ba552a9542a954aa552542a95cafd67aff8bbeffabcb77ef46157773bc43093bdc1646c0693bdc94cf62686b199e5ca077ea375e59cafe7c0d7f1d43ffec3d6f98be33bf46487de71f484cfaccb76968a5254b2284b9416b524a29522a9548a4a252956a925592dad5492629516952c95505916a572b85b2a95a452a9542a954aa552a95456a9ecd6f247f73ee1bf7ae7677de1a92b66b23798cc603039369319272686b19918d695f373e5a3ff7bbe8e035fc3e53ffb6c173e72cff80e7d7e5df5fb474f3ad7914a8b4a52298a552a49b2a2b24a52292a496549d14a2d95a295225951a9a592a5d24a65b5545aac52395a4ba552a9542a49a552a9542a958aa8542a0f9dbfeabff983cf79df03e7184c666c6262988971626298c1c4d8642687f77f740e1fbe3b5fc381afb20e8f7ae2b7ff787c87ee5e97bc67f794c3964a428ab5a82ca9548ab5524ba5285a542a458b552a9525452b59924aa55259d1a24525545aac92a552395c4ba552a9542a45a552492a954ab24aa552a95c39dcf97bef7ec03b3e79c689180c2306838961c6260693190c26573efa9bd3ee305fe5c057b9fca7f7387ce471df898fad8b3ebcbb6095506951a98584562a649550546a61492ab554b228c56aa954428bb55259a5b2562a5996a5d2ca2a49a5c58add5a766ba9542a954aa552a9542a954aa5a2542a49a5b25bcb5b3ff8907ffcb1473418460cc626869910Line truncated
|
||||
|
||||
// Static19 returns static file
|
||||
func Static19() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic19Data)
|
||||
|
||||
rawStatic19Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 14051,
|
||||
14051, 26124,
|
||||
"Ootgj0ktSR4=", "OJO+lf7T5tQ=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic1Data = `774f46460001000000016ac0001200000002b1e800010001000000000000000000000000000000000000000047444546000001940000017300000262b442b08247504f530000030800002c6400005dccff1a12d74753554200002f6c00000b7c00001590eb82e4594f532f3200003ae80000005100000060971eb13c636d617000003b3c0000094d000012460177581e637674200000448c00000058000000582fbb049f6670676d000044e400000134000001bc7ffa22ab67617370000046180000000c0000000c00080013676c79660000462400010b1c0001fc30697c623568646d780001514000000194000005182f4b435a68656164000152d40000003600000036fc92d26d686865610001530c00000023000000240c931284686d74780001533000000a8c00001438dd71feaa6c6f636100015dbc000009b900000a1ef8c8728f6d617870000167780000002000000020073e02f66e616d650001679800000229000004b6c742e755706f7374000169c40000001500000020ff61006470726570000169dc000000e10000013fa231209278da0dd0030c584b0005d17b77dfb759dbb66ddbb619d736c21a516d06b5ed36aa6ddb984c72628daca0df25490a3915d44ad9545e5635b5c7c1648d266b2c5913c89a4cd654cdc2395a888bc95aae358ada40d6566dc35d64ed216b1f5987c83a46d6099dc4d33a83e7c8baa02b789dacdb64ddd57d7ca88ff899acafb6ece8883ffa27fcdfa931add3624667c6accea6e8dcce23bb888b627117c7322e8b955c156bb826d6713d6ce446d8d42db19ddb636777c6aeee8a3ddd137bbb2ff6777f1ce881b8d55b15bdcd7b147cd677643ff0037ce997f8daaff193bfc841c11843c41fc20ff853f805ff0a7fe1ff2125a60ea93167c88979421ecc17f261c150043b842e3824dcc0db71aa1ca7c7c5b8346ec4cd7107ee8a17f04abc82d7e25dbc1f1fe293f8025f25c3e464643212c72463717c32012725537166721acf26cff165f2013f259fe5ef7ef8ee379982a45f25e595f5bb96d30a5a49ab68b5569be7ceee1cb2bed3602dd61aadf1d66fc20369c10078da1487036e44011445cffbb5ad4158dbb615d6616dbb6115d65e478d65d4369750cf9feb8b00d644528c69766e71299aba91de76344dbd0d6d68da6bfa3bd1600af0ff8f02084a5d775f37f66d0dbd9db80202c654a960ae3822a0da52b5356678938ff085a5fa5c71c31d0f3cf14283161d7a7cf0c50f7f02082488604208258c702288248a686288258e7812482489645248a58126c698609269e65860897536d8648b6d76d8658f7d0e38e488634e38e58c732eb8e48a6b6eb8e58e7b1e78e489675e78e58d773e244ca22446e22441922443b224470aa4488aa552aa644d0c04c1837104000000b0fb6c5ddbb6dd8e50dbb66ddb7a250d81d6408758711224499622559a74193265c99623579e7c050a152956a2549972152a55a956a34b8f3e03868c183361ca8c390b96ac58b361cb8e3d078e9c3873eed2b55bf71e3d7bf5eed38f3f415186e1e920002800a0e8ab936ddb5ca0d9b26d63846c6384dc10f13f5dfc082245891127419214693264c991a7409112652a54a956ab5ea366fd060c1a326cc4a87113264d993663d69c790b162d59b662d59a751b366dd9b663d79e7d070e1d3976e2d49973172e5db976e3ce83272fde7cf88a8a8d4a8eca8c6a8bea8eea8f8e8d8e0f9121fc9fd09217227c85a81022fe282503c836a2308ecfa13db45bd786650ba96d5d2daba1bdf7ee7def092a2a000086a8620ec3c470260a8888381011c570002028086a66e6c0990180330005c140cdd9f7cfdbb3181bf5f3ddddbdefeef37dfffff763fdabc844b6fed33f0d4b3513b9ce55cf7f4d55aaaa3979b8eb9c4e36bc8d6f34d2aff44414615f5f6eb6558722996c2664ee7e2643460d29a2f37b5f74bcb52f9b7c3da648e75b039985a5cec3f2bebfbdb6e3ef5c57121d57c6950f641e0c1ebe7ff4a6d6ad0d6a496d5c4feae37abeebed263295e9e38f547d72f6f45414cf3ea107d9e22bb33f9529bfa5cf8f1b6b8d8bc6cd8bef727af0563683f6c1c5cb77141dde3934c15eb047d151f7e8869f189e6bc89dc7419b3bcee45414b2a9e680aa78b633da7391055d9101e38b6d71663c71a5aff5c2787ac1f72562a617d0c942a3b05c45b07e16dbb1adee08fbaab38a4c2cd0cfa1631d73cf1d1722b7c01999fc1d5cdf7000e79905e72e0cff3b7441e74b46404fd8cd188e02e331be5eac623c877b6705ae2cbf337e58da69311fb648f5f4a5edc6ed0fabd4170555c33e194cc873f664862c7c902dfc253357854e04eb2a0ae883bdd2b16cb24a53566602d0b37509d3412328018f458e9cf315199705388502a8295b3a76816f6e13a8f7bfb053f09cff083544972e6884ad2423535660ce0ab999580deb979ab106ec3f32d0eb8fbb4b6d23b889e99731612773b7b1c6b7db6bfc5f1cd503b0254a1004d1ac99cfb56ddbb66ddbb66ddbb66ddbb68dbbb6ededb79dc10eab0e8e05fc65c13f96084e081ce1adbf484832fe0eda7afba6261321c96245241bb98944410a1183a214231625ac3894b6e252960ac4a39295882a5662aa519324d4b65230cc4ac9242b1533add4ac652369d8cc5632b2ddcac24e7691953dec253bfb39484e0e738a3c9cb38a70815b1425c02b2af0c66ac0473ed3906f7ca7093f05cde4f5372d154cc168a3900a495b455134da299ee2d151a994864e418ad0559995991ecaaaacf4344fb2d3cb4429406f555005faaa922ad1cf64a9427fd5502d066880063258833594a1baa22b8cd0355d67a46eea26a315d01dc6e8995e304ebff48b892e940bc32497c6a561aa4befd233cd15740599ee0abb22cc08728a5926554fe6985613986bfecc61b39be716b2db2d73abd9ef36b81d1c358d7671ce44dac37953691f174ca6035c7487dc69fe8844c04cbac13d77cbdde2be0bb8000fcca7bb3c349f1e1164d4131e9b53cf786256bde0a979f58a6766d60f9ebb5fee175fbcbcf8eaedf8665e85e2bb0fe3c3f0c3dc0ac74ff32a0ebfccac84c2cc4aacbfccada4fadba7f659f48fcfef0b2b8c2fe94b2ba2afe02b288a6fe89b2aaa6fe95b2b96efe2bb28ae1fe4872b9e1fe5672ac96f8aca4149080000a2edec1be51a35ea37320671906d37cc363f21db7667dbb66d6370be5bfcc1c2affc4af3fdceefb4c01ffc410bfdc55fb468e2d7b478e2d7b4d47f1dace50e75b85639d2715aeb04276abd939da68dce71aeb63adff9daee42176a878b5da69dae749df6bac10d3aec16b7ea88bbdca563eef1a08e7bc4a33a8d406799c2545d6426337599d9ccd115e6b252b759cd6a7d652ddbf48d7dec53082739a7502e7041d15ce1aa62b8c10dc5718bdb8ae72e7795c87dee2b89873c5532cf79ae0c5ef24a99bce18db2f9c027e5f0852fcae71b3f54c02f7ea9983ffc5109ff0851296184a9864Line truncated
|
||||
|
||||
// Static1 returns static file
|
||||
func Static1() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic1Data)
|
||||
|
||||
rawStatic1Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 92864,
|
||||
92864, 185446,
|
||||
"kJ31lrJhpl0=", "JYO5XeVP+z8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic20Data = `89504e470d0a1a0a0000000d4948445200000078000000780806000000396436d200002c7f494441547801c4c16decee777dd8f7d7e77f8eedc331361808864080dc821b1a42a784266dba266595da4a5bd774cba46a8ab66ad2ba27d1a4690ff2289ab4077bb2a97b5469d236756b3ba95da6356dd3a6092424e48e70171c20e000c6188c6ff0f1b93fe7ffbfbeeffdaeebc203a110c0d8e4f59a36fe14b5b2ae5eefd6638fcfedcf3de1eca94b7cfeba9bd7bf6077ed46ebe6ade96cc75abe2e6393194713e36026c62686199b184793194713e360260783c9d89c3b31e7cf99bbeeeadcc58b73d7cbeee0e22bdd75ff4bcc7daf75e72bef6f2edc3d7372e24fd3797f0a76d76eb8fdd0a3ae7eec21373ff919a74f3e3dd6f2c718df88b1c90cc62686b199189b18666c621c4d661c4d8c8399184793b119b4d3e94e67b7a6eb979d3d89f9b46b36c39ccc9cbfefe5ee7cedebddf99ddfedc2777c979317dded5bedbc6f916e9fb9fee1875c79ff87dd78e861ddbaed79353699c1d8c4309383b18961c626066393194713e36026c6d164c6d1e46032e368621ccc44397bfa0967971e77e3c1f7b87ce79dee7cdd777ad19bdee2c2773d60eeb8d3b7c2792fb0b367aeb8fc1befefcaeffdbedd956be385303699c1e46098c9c160b237631383b1c90cc62686b199184793199b184793194713e360260783c9d80c9ddd72eb131f75eb931f75eee2c55ef4e61f72f12d3f34e7ee7e9917d2792f90dd93977de11dbfe5ca7b3fc46e375e286393194c0e86991c0c267b333631189bcc606c62189b89b18961c626066393194713e36026c6d1646c069383c90cebc6b5b9f67bef74edfdef72cf9bdeea456ffb31272fbedf0be1bce7d9eeda4dcfbcf3b77be6ddef9d4ecfbca026338e2607c34c0e0693bd199b188c4d66303631ccd8c4d8c430631383b1c98ca389616c26c6d164c626c6d164c6d1c460ed5cfdc87b5cfdf8075cfc813fdfc53ff71373eec245cfa7f39e2795ebbff790277ff197da5dbe3a5e6893194713e360260783c9de0c2607c388c1e46098c9c1d8c430631383b1c90cc62686b199184793199b184793194713c3d84c0e76a7ae7fe05d73ebe31fe89e1ff91b73e7f7fea099f17c38ef79b0bb7abdc7ffef7f33373ef4319bf1429bcc389a180733318e267b33981c4c661c4d0e86991c0c267b33363118460cc62686b199189b18666c623036997134318ccdc4389a0cd6f5cbf3cc3bfeb1bb3ef941f7fcd84f7672f19ef14d3aef9b74e3a39ff1f83ffde7b37be68a17dcd864c6d1c43898897134199bc1e46032e368621ccce46030d99bc1e4601831189b186672303631ccd8c46018318e2686b199184793199b1807b73ef5a0b3271f997bffca7fe48e57bdc937e3c47354b9fcabeff1b9ffedffb27be68a17dcd864068389713013e368328389c9c164c6d1c43898c9c1603298c1e4609889c1d8c4309383c1c43063138361c46030318ccdc4d8c464c626c6d1648675ed1997fee5ffeac6877e55e5b93aef39e8b49efa17ff762ebffbfdbe25c62633189b180733313631ccd8c4606c32e368621cccc4389a8ccd607230997134391866723098eccd6072308c188c4d0c3336313631ccd8c46018318e26dab9f63bbf6077e52977ffc8bfdfcc1de31b74de37689d9e7af2fff8d7ae7ef8c3be25c62633189b18c666626c6298b189c1d864c6d1c4389889713499b1897134997134310e667230988ccd6072308c188c4d0c3339184cf6666c62308c188c4d0c6333b9f9d17773fdcadcfd97ff8e397f876fc479df80757aeaf17ff8ffbafe913f1adf0a6393dde456cbb575e696e5d4b2247b39cac1f8a298086393bd646fd064ecc5907c498c4df692bbce9db8fb8e13f7dc79cec5f3e7dc796e981c0c3339981c0c3339184cc6666c62308c188c4d0c3336310e6e3ef241bdf3d48b7ffca7cdf93b7dbdcefb3a755a4ffca35f74fd237f345e60d7dbf97cb73dd92d4fae5357d7ce6d3b856c92ec55442212d9249bb25736d9abc841422a7250c9a624a7bb5c3ddb4994bd0be7c6cbee3aefd577dfe50df75ef05d2fbde025779d677230cce46030199bc1e4601831189b186672303699c170fbd13f70edd7ffa1bbffd27fd69c3b37be0ee77d1d2a4ffdc2bf9d6b0f7ec40be5ba9d87d74d0faf9b2ead533b4b985224b249d9a46c22b2297b89924d240765afb2573611f9a292944dc4e95a2aa452b9b6b87afbcca72fdff0db9fcdb919af7ef19d7ee0db5eecadafbac74b2e9c7330988ccd6072308c188c4d0c3339189bcc606c62b8f5c883e6f77e7e2efef0df3633be96f3be0e977fedbd2effe6fb3ddfc213ddf6d175dda3eba64a36259b9214d91491907254923091944db2098564934dca26891c956cca5ee5742d89522912a5124ed7f2f033373c7ce9ba7ff1d0e3beff1577fb4b6fb8cf77ddf722273683c9c1309383c9c1309383c1646cc62606c3c8ad8ffd8673f7becc8507fe8aafe5bcafe1c6471ff1d42ffeaae7db63ddf6e0baeaf1755b22079544362994ec652f9b4864934259f6b25728c95ed9442444a37c512a7bd99464572a4a2554944aa85494151ffcfc151ffcfc65df7ddf457fedfb5eee7b5f71d1c164c6d1e46098c9c160323683c9c13062305c7fffbf74eee5dfee8e573ee04f72de9f6077e55a8fffd35f18bb9de7cbd576debfaef8ccba69d91491904224222185484836a1247bc941c9a6ec954dca262247b51c4442443671b6b24a45a9848a52091525542a958f3f75cd43bf75d55b5e7d8ffff0fb5fe9e577dfe16062189bc9c160323683c9c130623036d1996beffec7eefd6bff6d2717ee195fc589afa2f2f8cfff9bd93d73c5f3217c7c5df78b674ff9f4ba6945254956aca82c4b92545649b224152bb524452b45a5d2a25825a954565952cb2a45a5964a8b15ad64395d4b45a914954a25542a954aa5422abb95f77ee619fffd3bfec8af7ff26989616c260683c9d80c2607c34c0c2664869974e3921beff92753f96a4e7c15d73ff811373ef471cf875b9677ed2ef9dddd65b7ed54b2545aac1616a552b4b25a12d14a51a9ac282a952595ca8a2c4b2aad541251292a4965a1b2244bd2e2742d954a25a928954aa592542a954aa552b9767be7ff7cefa3fec16f7ddaf5db3b26c6d1640683c9c164260713c30c2607c3ed477fdfe9a3bfebab39ef8fb1bb76dd93fffc9d617c939eeeccafef2eb9dc9983a8ec2507112a642f944dca26229b6c966c4a39a865af1c54c85ed9442444a342f62a227b49ced652512aa1a224454509954a65af524944e57d8f3ce3d14b37fc573ff63aaf79e9052633363118468ca389616c26c6d16470e37dbfe08e6f7bb3b9eb6e5fe9c41fe3d23b7ea7dde5abe39bf458b7fdcaee0b2e77aa524b25545aa92ca9548ab5528b52142d2a954ad1ca2ac92aa148b290a252a9ac52b4582d49b1565649b25476bbac52a9844aa552542a954aa59254Line truncated
|
||||
|
||||
// Static20 returns static file
|
||||
func Static20() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic20Data)
|
||||
|
||||
rawStatic20Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 15297,
|
||||
15297, 28518,
|
||||
"kR0IY3LYpHg=", "r130YHcTRvA=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic21Data = `89504e470d0a1a0a0000000d4948445200000090000000900806000000e746e2b8000042d4494441547801ccc15bacaff95dd8e7e7bbf69ea33d633bb6b12905832d43308190349426a489504b23454a5415b5f4a269aab477b98c54b597bdea457a5015f5ae0da169aa566d25a090109ba3b109188c03d81e3ce3c38cc7f6d89ed973dec7b5d6efd3f7ffbe336021023e8c6d9e67daf8136cddbee3e2d9173afffcb5397fea69e7d79ed3532fb873e305ebc62debd66d5d5ce8f2927c69c626330e93ddd8cdc4384c4e666c621cc626330e93dd303693ddd8c430335cb962ee3a7376cfbdceeebfdfd507ee76f6aa3fe5ae3ff51a575ef72657dff00d5d79e08139bbfb1e7f925df5274ce717dd7afcb373e3e18fbb7cf449b73efbd92e6e5c1f2bafa8c9c98cc364378ccdc4384c4e666c621cc626330e93dd303613e3303999b159aca5db5cdeb9edf285675d7cdee65126bbb3b3b972ffbdddf3a6d7cf9537bfcd3d6f799bbbbef15f7376f56e7f925cf527c0e58d5b6e3ef298ebbff5bbddfce863d68d9bbec078a54d4e661c26c66e26bb71989cccd8c4380c23c661b21b66b21b87c9c98c4d8cc3d864c661b21ba665ddb83e373f719d473fe9c55ffb7973ef7dee7dcbdbbaf7edef987bdef2edceeebdcfd7db555f275d2eb73ff559377ef5439effd043ad1b3707e3ab6d323683b189b19bc96e1c26273336310ec388c1d8c4d8cd64370e9393199b188761c4384c76c3d84c7683c9eef64db71efee0dc7ae477ccbdf779d5dbbfd33ddff57dee7ad3bf6eceaef87ab8ea6b6c9d5f74e3830fcf73ef797fb71ffbcc388cafb6b1c98cc3d8c4d8cd64370e9393199b1887c98cc3d8c4d8cd64370e9393199b188761c4384c76c38c4d8cc3e464c626c6aedb375dffe0fb5dffd0fbddf58ddfdcabfefcf7cd3d6ffdb3cdd9dde36be8aaaf916ed5ed0f7f709e7ad7afce9d279fb6195f2b63931987b189b19bc96e6c62ec666c621c26330e6313633793dd384cc6666c621c8611e330317633d98dc3e464c626c661183176e79ffde43cfbcf3ee9aed7fee23cf8fd7fd9d5b7fff966ee195f03577d0ddc78e8633dfdcfde3d773ef3795f7363931987c96eec66b21b9b18c6666c6230369971189b18bb99ecc62686b1199b1887c98cc3d8c4d8cd64370e93b1199b188761c4606c62ec2e9e7bcad3effc71573ff06bf3ea7febafb9e72ddfe9abedaaafa28bcf3fefc99f7a979b0f7d74e46b6f6c32e330d98ddd4c766313c38cc3643736997198ecc66e26bbb189616c0693ddd864c6616c62ec66b21b87c9d88c4d8cc3646c066313633793dd70f1d4139efde97fe4ee6ffdd31efc4b7fc395d7bec157cb555f05ad3cf7de0f78f69dbf6cddbce5eb626c32e330d98ddd4c7683c9c98c4d8cc3d864c661b21bbb99ecc626861987c96e6c32e33036318ccd643736318ccdd8c4384c661cc626c66e26bb71980cce1f7bc8d39ffd84fbffc20fb9ffcffc80393bf34abbea1576f1ccf39efc7fffb99bbffb715f3763931987c96e98b18971989cccd8c4388c4d661c26bb616c26bbc1e464c661b21b9bcc388c4d0c6333d98d4d0c63333631189bcc388c4d0c6333d98dc3646cc626ddb9e9fabff849e78f3fe481bffa1fbaf2ead779259d7905ddfeedcff9f43ff8c7ddfcdd8ffbba199bcc384c0c869910e3303999b18971189bcc384c76c3d84c7683c9c98cc364373699719810c3d84c766313c30c061383b1c98cc38418c666b21b87c9d80c26066393f34f3fecd91fff075d3cf55b5e4957bd022a2ffcfcaf7bea9defe6f2727cbd4c661cc626c66e26bb71989cccd8c4388c4d661c26bb616c26c66172326313e33036997198ec86b199ec069393199b1887b1c98cc364378ccd64373631cc384c76639319bb75f3f979e627fe89577fdf53eefdee1f3473e62b75d557a8f38baefdd42fccf3effd4d5f57931987b189b19bc96e1c26273336310ec388719818bb99ecc66172326313e33036997198ec86199b1887c9c98c4d8cc330621c26bb616c26bbb18961c661b21b468cc3d84497aebfef9fba7cf159affafebfd95cb96b7c05aefa0aac3be79efe5f7f769effd86ffbba9acc388c4d8cdd4c76631363376313e3309971189b18bb99ecc66172326313e3308c188c4d8cdd4c76e3303999b1897118468cc364378ccd6437989ccc384c76c3887198ec86b199dc7ae8bddcf9fcbcea07fe8eb9eb1e5faeabbe4c97376f79f27fff49373ef6095f3763931987c96ec866921887c9c90cd94c7e5f260c8af17ba618848998a1627c81fc9e3099381b8771988ccdd8c4380c23c661b21b666c621c26273336310ec3887198ec86b19918bb5b9f78d8e5ed1ff5e00ffe6d73f77dbe1c577d19d69d734ffe939f70e3238ffaba199217baf0fcbaf05c17ae77e9faba74a74be7961549794976252f4b4e22bbe490b28906212f4b946cb24b4e12e5a29cafdc7d36eebb7ae6c1bbae78ed3d57bde1bebb7cc37d7779ddbd7739b319460cc626c66e26bb71988ccdd8c4380c23c661b21b666c621c26838b273ee2855ffc471ef8c1bf63eebac797eaaa2f51772e7bfa47df39371e79d4d7da92e7bbf444b77c6edd716ddd71bba5682244b22b0d8ac8498a91509908c9c944221a1491939c5488ecca268948c4f58b4b77d6924da9645306f75e39f32d0fdee3adafb9cfb7bfee7e6fb8ff2e5706633793dd384cc6666c621c8611e330317633d98dc3646cc626e74f7cc4f577ff6f5ef557ffb3e6ea5de34b70d597a072eda77e6e9e7fe483be969eefc227d64d8f77dbf3ebdc4992bcac50c849d9c4222711d994501892bca42c27d945250c2a61b219897292944d44b868299b54b2299585ebe7173efcd4850f3df5a233bcf1febbfc9937bedabff1e607bcf15577d98dc3646cc626c6613236e330317633d98dc3646cc626c6eef6a73f64deffe373ffbff9c366ce7cb1aefa123cfff3bfeef95ff980af854bf9ccbaed23eb8627bbadc849447949b2c9ae104d149197948664102a6224944336c926bb55769365535e56394414972d972bd9942251b229956cca259e78f1b6275eb8e55d1f7fca5b5f779fbff22daff39d6fbcdfd52b636cc626c66132e33036318ccd64370e93b1199b188761e4f6c3ef71e581d7baf71d3fe48b75d517e9e6ef3eeeda3bdfedab6dc963ebb60faf173dd785fcbeca2127a11824c9cb0ad9e4a46cd2b24bca4bb24298545e563949c6612d9b0c2abbc84b4ab82865934a36a548945051b229a1f2d16bd77df4da756f7af5dd7ee86daff7e7bef101570683b1c98cc3d8c4303693dd384cc6666c621c8699ec861bfff29fbaf2fa6f72d79bdee18b71e68b70f1ccf33eff7ffd442e2f7db58427baed672e9ff62b97cf7ab60b8a52a99c542aab54c82a8585925442b1169524a9144ab20a4956292a954a61515945116ba5489664592514e76b492a8552499450514225a954c22a4fbc70cb8f7de0d3fefe7bLine truncated
|
||||
|
||||
// Static21 returns static file
|
||||
func Static21() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic21Data)
|
||||
|
||||
rawStatic21Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 20434,
|
||||
20434, 38093,
|
||||
"kOPMVw+ChsE=", "/06vtHtuvMo=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic22Data = `89504e470d0a1a0a0000000d494844520000009800000098080600000018c2202100004428494441547801d4c15dccf7f75dd8f7d7e7ba6fdb7112274e020446802c9042a065ac68eb3a21241074938a36a95bbb831eec685b356d27d3b6b31d4f9aba4dd31e3b54d64dd350352106b4ac4009090b9415276912ea85c489632771fc74fbd9f7d3755ddff77effdfef4e88109490d8317dbda68d7f0a74b95c5ebfd1c533cfcff9934f3bbff6bcb3c76fb871fd9a8bebd7ad976fb46e9f4f17975c5efa631b9b9ccc606c62ec66f2256313c38cc3e44b2663330e1363373693ddd8c4303657af98ab67e6aebb3b7bfdebe7ca1b5ee7756fbdbbf5ba6f76f737bc79aebcf55b5c79f35b3abbf7de99b32bfe6970d59f50958ba79f73fdd38fbaf5c863ce1f79dced679f9d6e9ffb438cafd6d864c6616c62ec66b21b87c9c98cc3e44b26330e631363373613e33039199bc1e58516ddbe3debfa8b2eaf71fb51c327999cccdd77cf5d6f7993abdff40e77bfe33bdcf38e7776e52d6f9d99337f125df5274897cbadcf3fd1cb1ff9b89bffdf67e6f633d77471e95535369971189b18bb99ecc6617232e330d98d4d661cc626c66e26bb71989c8ccd60b21b9bccf83d93dde0e2b6f3a79e72fef4536e3cf861ae9ccd95b7bcd5bdeffa9e5ef7eeef9dbbdefeade6ec8a3f29ae7a8d552eae3de7c6873ee1b90f7dc4c5d3cf8eaf97b1c98cc3d8c4d8cd64370e9393199b1887b1c98cc3d8c4d8cd64370e93931987c96e6c32e33036317633d98dc3c4bab49e79cacbcf3c352f7ff0d75db9ff6ddef09eef77cf77ff4057eeff86d9782d5df51a69e5e6c39ff5fcfb1f70e3930febfcc2d7d5d864c661b21bbb99ecc66172326313e330369971189b18bb99ecc66172326313e330369971189b18bb99ecc6617232e33039b97cfe9a177eebbde6815f9f7bdef9a7bcfefbffbcbbbfed5d66cebc16aefa3aeb72b9f1bb9f71ed973fd0f9e71f1fe5eb6e6c32e330d98ddd4c76e3303999b18971189bcc384c76633793dd384c4e666c621cc626330e6313633793dd384c4e661c26bbb1c90c2e2fdcfaf4836e7dfa41f77ccbb774df0ffed85c79e7779bb32bbe9eaefa3aa9dc7ce851cffffc03ae7fe1219bf15a989ccc384c76633793ddd8c4d8cdd8c4388c4d661c26bbb19bc96e1c26273336310e63931987b189616c26bb71988ccdd8c4388c4d661cc626865b8f3f36b77ff17f75f73bbfb9d7ff733f3177bfe3bbcc8caf87abbe0eceaf3de7995ffc7f7af9631f1f6b79cd4c4e661c26bbb19bc96e6c62ec666c621c8611e330d90d6333d98dc3e464c626c6616c32e330d90d6333d98dc3646cc626c66118310e6313c3d84c4e6e3ff2f8dc7ef4a7dcfdee3fdd9bfedcbf3a57def436afb6ab5e45ebfcb2eb7fffa179ea03bfa85bb7c76b69723283b189f12533d98d4d8cdd8c4d8cc330621c26bb616c26bbb189616cc626c66118310e93dd303693dd384cc6666c621c8611e330d90d6333d98d3b2e9d7ff223f3cc231f77df0ffe05f77cff9f6fae5c1daf92ab5e25b79ebad6d33ff3cb73eba147bda6c626330e631363373613e33039199bb1897198ccf83d93dd303613e38e18c6666c621c8611e330d90d6333d98d4d0c633336310ec3887198ec86b199ecc62686b1193abfe985fff7e7ddfde8efcc7d3ffc97baf296b78f57c1995758e5a5071ef485fff67f9f5b0f3dea3535369971189b18bb99981887c9c90c061383c164c6ef99180c333131ee88616c061383c164c4384c76c30c26bbb189616cc626c66132621c26bb616c26bbb189616cc626c6eef6e39ff6eccffd7773eba107545e6957bd82d6ad73d77ef17d5efccd0f91d7d6d864c6616c62ec66b21b87c9c98c4d8cc3d864c6616c62ec66b21b87c9c98cc36437369971189b18bb997cc9d8c430e38e1887c9d80cc626bb616c26bbb189616cc626c66118e9f60d2fbcf76fbbf78947bde15ffc8be6ae7bbc52ae7a855cbe74bda7fed6cfcff5cf3ce2353736997198ecc66e26bb71989cccd8c4388c4d661cc626c66e26bb71989ccc384c7663931987b189b19bc96e1c262733ee88c1d864c6616cb21bc666621c2627633336310ec34cbe64961b0ffe86cbe71e73df8ffedb9ddd7bdf78059c79059c3ff65c8ffd8fffc75cffcc235e7363931987c96eec66b21b87c9c98c4d8cc3d864c6616c62ec66b21b87c9c98cc36437369971189b18bb99ecc6617232e33031189bcc388c4d0c86194c8cc3e464068389c16032932f99180ce78f3fecf9bffbdfcfe58b8fe51570e66b74fbd1a73cfe933fedfc896b5e7363931987c96eec66b21b87c9c98c4d8cc3d864c6616c62ec66b21b87c9c98c4d4c7663931987b189b19bc96e1c2627330e93ddd864c6616c62ec66428cc3e464c661b21b9bcc380c26c66e26e4f285273dff0b3fe9f2c9cff95a5df535b8f9e8633dfe533f63bd747dbcd6c626330e93ddb06449c5204cc40cc2441894f1e5b20b1361102613066537eec88cc3d8c47036e3ea1963330e9393199b188761c4388c4d0c6333d98dc3646cc626c6616c32e33036317633d98dddbaf5dc3cf7ab7fa337ffd8bfe3ea377efbf82a5df555baf5f9c73df1bffc8cf5d2f5f11abb9cdce8d2739d7bae0b2f76eea5b55c5f976e75e952ca26d96493934464534e925dc950c821653394e4f7a4b28b6c4a4e5239b979b9dcbc5cee3e1bf75e3973dfdd57dc7ff7156f7bdd5ddefefabbbdfd0d77bbefae2bae5e1923c661b21bc666b21b87c9d88c4d8cc330621cc62686b199ecc6613236b75e9a177ef57fee4d3ff6efbafa0ddfeeab71d557e1f2732ff6e4dffc59972f5e1faf9197baf464b73cd62dcfac732faf0bcb269a0891ec4a83b28ba418099593899010d9a4dc1152d9457288ec2a2749d944dcbc5c2ed6727ec9cbe7179eba916c4a9872ff3d577ddb9b5ee7ddf7dfeb3befbfd75beebd6a378ccd64370e93b1199b188761c4388c4d0c6333d98dc3646cc6ae5b2fcd8bbff693bdf9c7ff0367f7bf7dfc315df5c774f9d2f51efbe9bf3de72fbee0ebed96e59175c3a3eb966bdd76592a8d4d06a1229b9c54768b9c44e42445616cb2dc11c9215f5409832299ecb2c92639496517ab5caea57252c9a61449e5dacd73d76edcf6e1275e70d7d978c77df7f8816f7aa37ffe9bef73ef5d6776e330199bb1897118468cc364378ccd64370e93b1199b18bb75e3c579e1fd7fd39bfec27fd8d9bdf78d3f86abfe18ba75eec9ffede7e7fc896bbe5ec2339dfbc4baeed175c36539494436cb2e295f5288c62627e58ee4245f54944d4e128d41d9e4a4ec2ad94c42d9e490b289ec8acbb24a36a56c52c9a664538ae4f6c5f2a967af7be89997fddc279ef4036fbfcf0f7dfbfddef1e67bcc30366313e3308c1887c96e189bc96e1c26633336310ec3c87ae1092f7fe0a7e68d3ff2d7ccd57b7ca5aefa0a559efec55f73e3d38ff87a084f75db3f5e2f7b7cddb2fc9eLine truncated
|
||||
|
||||
// Static22 returns static file
|
||||
func Static22() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic22Data)
|
||||
|
||||
rawStatic22Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 22232,
|
||||
22232, 41236,
|
||||
"jVT8zBrkX2g=", "3VYgkdGNarI=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic23Data = `89504e470d0a1a0a0000000d49484452000000a7000000a7080600000074164cec00005ce0494441547801d4c1d9efeff97dd0f7c7eb3767c69ef19298c489813864212c0105da0a1416092945a950512f5017556a7bd38b56a877bda82af51fa82a71d3bd14418b2a0a040494104a308b93ba2924d8f112c76becb1c71e2f331ecf9c3967e69cdfeffdecfbfbf99c993151025966ecc9e3316d7e836a2debee0bee3df965d74f7dc5fda7beda7cf17977ef3e33ebf9bb6e9ebf5bf7ee4fd737bab9a1fc9a8c2d335e31398cc34c0ee334b998f1408cd3d832e334b61887b14d0ee334b998abe1a187ccad2bf3f0233df4d86373f5d8631ef9e687f3e8db3dfc9bbec9236f7fdbccdbbec3d51bde68aeaefc4675cb6f1095ee5fbbf7b92f78e1534fb8fec417dc79f209d75f79d6d718ffbcf1eb35b6cc388d2d877198c9619c2617331e88711a5b669cc616e330b6c9619c26173328aeefeb865e7c71d6f3cf19b9f7b8e1238c2d8687defa4ddef85bdeeea16fff6e6ff88eeff2f0b7bd835b0f9b19bf11dcf23ad6cacd73cfbbf3e14fb8f7738f77fbd3bf603d7f777cbd8c2d334e63cb611c667218a7c9c58c07629cc69619a7b1c538ccd87218a7c9c58cd3e465c388719a1cc6613df755773ef20c1ff998e78679e3a36e7de7777aecbb7ea7377ecfef72f5a6379bb9f27a75cbebd0bafd82db1ffe98e7dff7612f7cf233ba7f6d1b5f4f63cb8cd3d862bc6c2687b1c538cc384d5e36b6cc388d2dc661262f1b5b8cc38cd3e465c388719a1cc661262f1b5b7af18efb1ffb79cf7efce73dfbd08f7ae49dbfcda3dff7031efdedbfcb3cfa66af37b7bc4eb4967b4f7cc9b33ff53ecf7fe8a3addb77c637cae462c669721887b14d0e638b7198b1c578c5e462c6696c310e3379d9d8621c666c315e3119db384d0ee33093c3782086b18d2dd67df73efd71f71effb8e7def3586ffcdedf3d8ffdc00fbaf5adbfd95c5d793db8e51bac9b9bee7cecd39efdc99f99bb1ffb1437cb36be11c6968b19a7c9611c6672180fc438ccd8629cc696b18dd3e4300e33398c07621c666c314e63cb8c574c0ee33093c3782086b18d2dc6696ce985e7e7ee877edadd0fff338fbcf37bbdf50ffffe1efa961f300fdd1adf40b77c83749deb8f7ea6a7fef14fcc9d4f7e967c638d2d17334e93c338cce4301e887198b1c5388d2d631ba7c9611c6672180fc430b6b1c5388d2d335e31398cc34c0ee38118c636b618a7b165c62bba71eff18ffaf2673e366ffcad3fe5cd7fe88ff4d03b7ecfccdcf28d70cb37c08b9ffd82a77fec1fbbfbd14f8df20d37b6cc78c5e4300e33398cd3e42533b618a7b165c62b26877198c9619c2617631b5b8cd3d832e334b61c86b14d0ee334b918dbd8629cc69619a7b1e5308cbcf8b94f7bf1af3f3e8fbcf3fbbcf9077fd8c3dff64e5f6fb77c1ddd3c7ba7a77efcff99e77ffafdba7fed75616c99f18ac9611c667218a7c9c5d8c616e334b6cc78c5e4308c6d7218a7c9c5d8c616e334b6cc388d2d87616c93c3384d2ec636b618a761c4388d2d87616c9353ee7de6a39efefc27bce1fbffa0b7fe6b7fbcabc7de3cbe4e6ef93a682dcf7fe0639ef91b3f39f79efbb2d78db165c6696c398cc34c0ee334b998f1408cd3d832e334b61887b14d0ee334b998f1408cd330629cc616e330b6c9619c2617334e93970d23c6696c310e639b1cc6693237d7ee7df03dbef2a90fcf637fe84f78e3f7fc80b9baf25abbe5357673fb4e5ffabfde3577defb61565e37c69619a7b1e5300e33398cd3e462c603314e63cb8cd3d8621cc636398cd3e462c603314ec388711a5b8cc3d82687719a5cccd862bc6218314e638b7118dbe430b618c6360e37cf3fedb977fd25d79ffe506ffac3ff96ab47df325e43b7bc86ee7eec715ffe6b7f77ee7ff92b5e57c69619a7b1c578d94c0ee334b998719abc6c6c99711a5b8cc38c2d87719a5ccc384d5e368c18a7c9611c666c398cd3e462c616e334b68c6d9c26877198b1e530b618c636b6180f2c773ffedeb9f7a5c7bdf58ffddb1efecddfe7b572e535d05abefa0fdfebc93ff723ee7ff92b5e57c69619a7b1c578d94c0e638bc9c58c2d262f1b5b669cc616e3301372185b4c2e669c262f1b468cd3e4300e332187b1c56430638b711a5bc6364e93c338cc841cc616c3d8c616e334b60cd6b34f79e6effe39773ff40fb496d7c22dafb2f5e23d5ff99177f9eafbde4f5e5f2617334e93c338ccd872185b8cc38c2dc6696cb998719a1cc6612687f1408cc38c2dc6696c99f18ac9611c6672180fc430b6b1c5388d2d335e31398cc34c0ee334b918dbd8629cc69619afb8beeff67bfe8e9ba73ee74d7fe8df350f3fe2d574cbabe8e6f69dbef017ffe6bcf089c7bdae8c2d17334e93c338cce465638b7198b1c5388d2d631ba7c9611c6672180fc430b6b1c5388d2d335e31398cc34c0ee38118c636b618a7b165c62b2687616c93c3384d2ec636b618a761c478c5e43079e1a3ef75fddc57bdf587fea3ae1e7dcb78955c7995dc7cfeae27ffcc5f9f173ef1b8d795b16530e334398cc34c5e36b61887195b8cd3d832b6719a1cc6612687719a18c636b618a7b165c66930390c83991cc6696218dbd8629cc69619a7c1e4308c6d7218a7c9c50cc616e3348c18a7c1e4308c6d72fde4273cfbae3f33ddf98257cb9557c1fd2f3ed5137ffe7ff7e2b34f785d195b66304e93c338cce430184c0c83195b8cd3d83283719a1cc6612687719a5c8c6d6c314e63cb8cd3d87218c636398cd3e4626c638b711a46669cc696c330b6c9619c2617331e88711a468cd3d87218c636390cd75ffcaaa77ff4cfba7ee68b7915dcf2eb74ef4b4ff5f9ffe52fcfcd33cf795d195b66585872cf8ddb37375eb4dcb35cb7dc20c969e415794963cbc52017394c4e2966108664bc2417d926f2cf9b9030088f5c8d471fbef2d8ad877cd31b1ef28687c6c357636610e3348c18a7b1c5388c6d7218a7c9d8c669f2b261c4388d2dc661c696c3384ddc7ecaedbff73fce5b7ef83feda16ffef6f1eb70cbafc3fda79ef5f9fff5afcecd33cf79bd08f72d5f5df77d79ddf374d79eeddaedaedd5b4b86422e72918b962da7648b5c44b6e4221aa46c19848a06b9484e11891cca96e4a27271ef66b973b354b2958b471fbaf2cd6fb8e5ed8f3eec1d8f3de29d6f79a377bce9616fbc75c5388d2dc6616c93c3384dc6364e93970d23c6696c310e33b61cc66932b6e1e6ce33befaaeff79bef987ffb4abb77cab5fab5b7e8d6e6edfe98bfffddf9a9b67bfea1b6de176d79ee8454fae177db97bee15e5a26c39b4e4251149b6c93492b2659c2af2b26c855c84b2e5a25944b66cb9482687ca45725139c4fd954ad952b63c7fffc6f3f7af7df6b9bbb295476f5df98eb7bcc1ef7cdb9bfcce6f79ccb73c7acbd5d5b898b1e5304e93b18d2dc6691c468cd3d8621c6672180fc430b6719a74fb69cffdf89ff5963ff19f75f5e85bc6Line truncated
|
||||
|
||||
// Static23 returns static file
|
||||
func Static23() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic23Data)
|
||||
|
||||
rawStatic23Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 25583,
|
||||
25583, 46848,
|
||||
"BTVf4ufhhA8=", "UAjDaY2kUC0=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic24Data = `89504e470d0a1a0a0000000d49484452000000b4000000b408060000003dcd063200005d9d494441547801dcc1d9afb8f95dd8f7d7e7cccf9e192f2c060c59cb928d2851846814255123458a5445ea45a5a65755ef7bd13fa2b7b9e95d2aa5551bb5cd4a131a85d0509600098bc160038ef18217bc8f3de3d97feb39e779f7fb3ccf99df1951763cf690d76b5afc47e4faee3d97cf3eefeac5975d7ef9254f3c73dfddfb5fb6ddbddff5bdfbb3dd7f58d7d7d3d535d7d7fe40c69219b726877198c963638971987123c6692c19cb384d0ee33096c961dc88612c779e304f5c983b779a279f9c8bb7bdad27def6f43cf5aeb7d89e7cb73bdff80d9efc96afe79ddfe689b7bddd7f4ceef843ecfafe038f9e794e9ffcb2bb9ffe54f7bff085b97ef9555d5d537e83711a5f0993dd8cd358721887993c369618871937629cc69219b726877118cbe4304e93dd5806d757dae8f2d1b87fcff54b2fcc953cfc84e557190cf3c41d17ef7ca7a7fee8b7f6d41fffb6996ffe2e6ff9e677bb78ea697f58ddf18748dbe6f2d917bafec8335efef847e7c1a73edbf5bdfb63cb32be1ac692dd8cd358721887991cc68d18871937629cc69219b726877118cbe4304e93dd58c612e334968c659cc612d1f5a5edc5e7dd7be9cb73ef43bfcac54fb878fae9ee7cdb1f9b3bdff59ddefec7ff4c77bef19b672e2efc6171c79b5c5b2e9f7fc1bd0f7eccdd0ffc5a8f3ef7cc7479e5c6f86a1a4b76334e6389f1d84c0ee3468cc38cd3e4b1b164c6adc9611c66f2d8384d7663194b8cd3583296711a4b8cc3582687419beddeabf3e8931f71f9c98fb8ff961f9db77ccbbb7bfa4fffc579f2bbbebb27befe5d331717deccee7893da1e5ebaffd14fb8f7731ff2ea273ea1479796f1b53296ec669cc612e3b1991cc68d1887194b8c5b63c98cd358721887993c364e93dd8c1b314e63c958c6692c310e63991cc669b21bcbe0ead2e5339f9dcb673ecbcffee8bced4f7ebb27bffb7bbdf53bfe9c8bb7bcd59bd11d6f32d7f7ee7bf5e73fe0a59f799fabe75ff2a63096ec669c2687f1d84c0ee33479cd8c25c6adb164c6692c398cc34c0ee3d66437e3468cd35832e3d6e4300e63991cc669b21bcb58629c06d797ee7ff2a3eefffa473df10deff2b6bff0973dfd17bfc7c55bbfde9bc91d6f12bdfa6a5ffe89f77bf53dbf38db8387de34c692dd8cd3e4301e9bc9619c26af99b1c4b83596cc388d25877198c961dc9aec66dc88711a4b66dc9a1cc661c692c3384d7663194b8cd358329671b87ee979affcf40f79f5177ed23bfffc5feee9effd6b336ffb066f06777c8d5ddfbbefee0f7ec40bbff293737dff813795b164c6adc9613c3693c3384d5e336389716b2c99711a4b0ee33093c3b811e330e334796c2c99716b721887993c364e93dd8c1b314e63c958c6692c31f4e8be577ee9dfcdab1ffe79eff8ab7fc153dff5b75d3cfd765f4b777c8d6c9757dd7ddf87e7851ff9f7ae5e7cd99bce5832e3d6e4300e33961cc669b21bcb58629cc692b18cd358721887991cc68d1887194b8c5b63c98c5b93c338cce4b1719aec66dc88711a4bc6324e63897118cba487f7bdf293ef75f7173eeaed7fe56f79ea4f7f8f8b3b6ff1b570c75759e5d1279eedcbffe687e7c1a73e47de7cc69219b726877198c963e334d9cdb811e334968c659c26877118cbe4306ec438cc5862dc1a4b66dc9a1cc661268f8dd36437e3468cd3583296719a1cc6612c93c3386cf75ef4ca8fff0b0f3ffcdedef957ff8b79e25bffa499f1d574c757d1f5fd875efcf19fefe59f7aeff4e8d29bd25832e334961cc661268f8d25c661c68d18a7b164c6adc9611cc632398cd3643796b1c4b8358c18a7b1e4308c65f2d858621c66dc88711a4bc6324e93c3388c657218a7c96ee4f2994fcd0b3ff03f7bf22ffef5def13d7f732e9e7cda57cb1d5f250f3ff7455ffce7ffa6abcf7c71bc198d25bb19a7b1e4300e33398c1b310e336ec4388d25336e4d0ee33096c9619c26bbb18c25c6692c19cb388d2587612c93c3b811c358c68d18a7b164c6adc9611cc632398cd3643796b1a4eb471efcd28fcff5e73ee21d7fe3bff6966ff9e3be1a2ebcc1daf2d24fffa2cfffbd7fe4ea335f1c6f4663c96ec6692c311887991cc68d188719a789711a4b66dc9a1cc661262687719aecc6329618a7b1642ce334961c86b14c0ee3460c6319a789711a4666dc9a1cc6610693c3384d7663194b8cd370f9dce7bcf8affe9efbffe1a7d4e68d76c71be8fafe03cf7dff8f76f7fd1f1c6f5663c96ec6692c311e9bc961dc887198b1c4b83596cc388d25877198c963e334d9cdb811e334968c659cc612e33096c961dc88612ce334796c18314e63c96118cbe4b1719aec66dc88711a4bc6727de9d59ff997aebef4ebbdfdafff5773f1e4d3de2877bc41ae9e79a12ffde31ff0e0f35f186f5663c98c5b93c3388c657218a7c96b662c316e8d25334e63c9611c667218b726bb1937629cc69219b7c612e33096c9619c26bbb18c25c6ad61c4388d2587612c93c3b811e330e3468cd35832e3d6e4c1c7df3fd72f7fd1d7fdcdffa68bafffb6f106b8f00678f089cff8fcfffa4fe7c1e7bf30deacc69219b72687716b7218a7c96b662c314e83b164c6692c398cc34c0ee3d66437e334314e63c98c5b13621c6630398cd3643796b1c4380d2623c6692c390c63991cc68d1806336ec4380d23336e4d0ec3e5739ff7e2bff95fe6f2998f7b235cf80a7bf8b39ff5cc3ff87e572fbcec4d6b2c99716b72188fcde4304e93d7cc58629cc68dcc388d25877198c961dc88c96ec669f2d85832e334981cc66126e4304e93dd0cc612e334968c659cc61283612c93c3b811c358c669629c8611e3d6e4300c66d8eebee0e51ff9df5c7dfee77ca55df80aa9bcf2be0ffbfcbffa67b6fb0fbc698d25336e4d0ee33098c9619c26bbc18c25c6692c21334e63c9611c66721837621c662c31796c2c99711a4b0ee33093c7c669b29b7123c6692c99c1388d25c6612c93c3384d0c63194b4c1e1b468cd3607218c63221bb2eef7bf147fe85871ffb0595af943bbe022aafbeef3f78f6fb7e88ebcd9bd65832e3d624cb905ccb265b31d8302863198489308811839c268f8d2587716b329871480ee34666dc9a1c868be1cec5b8639931c35826bb1937629cc69219b7c612e33096c9619c26bbb18c25c6691c468cd3587218c632398c5bdba5577ffa9f7a4779eb9ffa4fcd8c3fa83bbe02eefef2af7af6fb7e88ebcd9bd6b0d9bcdcb557b62b2f74e96e575edd36f7b66b0fbb7669531eabec0a934329af93c2440ee5908ca5843039540cca6b1291c8a12cc92e65c9e596bb57d7064f3d71e1e9272ebcf3ad4ff886b73ee15d4fbdc5bb9f7eab6f79fa2dbee9e93b2e0c63c98c5b93c338cc587218a7c96e2c6389711a8711e334961887b14c0ee3d6642c5d7bf567fea9b75ff0d477fd657f5077fc013dfcf94f7bf6fffe21ae376fLine truncated
|
||||
|
||||
// Static24 returns static file
|
||||
func Static24() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic24Data)
|
||||
|
||||
rawStatic24Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 29106,
|
||||
29106, 52979,
|
||||
"IJC29t3ww0k=", "YF7BAVFq/1c=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic25Data = `89504e470d0a1a0a0000000d49484452000000390000003908060000008c18838500000002494441547801ec1a7ed2000013ef4944415495c17beceff75dd8f7e7ebfdfb9efb39be5f63e28460377102497073a1219026744de9b8b46bd5aaa3652974a59a34b1218434697fac53b5abd452a995f647a7a1ac55d1ba0db5b4ac2eb4834062c8ad21ce3db19360c7368e6fe76a9ff3fb7e9ecf391341c1d824793ca6e7f04daab8f2e0a33cfbd9dfe1d9871ec6df3dc7e5f34fe3e5cb603cdfac60828159c1c44cb060269898150c303107c31c3fcab16b8f33d7dcdab197dc32476fbfa32337df36cfe19bb5e39bb03f7b9e0beffb6dce7de83ef64f9fe3eb1a9809266605034ccc0a0666828959c1c04cb00284cbcf70f9b14bcc979f98cb9fbb8f59bf3cebcc559cfaf6efe4c46bdfccc1a9abf946edf8066c179fe1dcbfb997a77febc3b4dff8860ccc0413b382012666051333c08a9960605630c1c42c6062265831034c74e9692e7ce0df71f1c3bfcaa9ef7c2327ef7e27ebf849be9e1d5fc7858f7e8627fecf5f6ebb7461f8460dcc042b6682819960051333c08a996062163031132c6062265831034ccc0a266678cec6c58fdccb339ff96867bef7cfcff157bc963fca8e17d1264ffec2af73f6377f93e70cdfa8891960c54c30302b98606216303113ac9801266605130ccc0a2666820533c1c40cb0828999e8f28539ff2bef667bfd9b39f986ff885907bc901d2fc0c37d5f7ef7bf9c8b9ffc34df9489196805230d3031130ccc440413333c272066e22b0e2666011333c18299606256303013ac60602658f1cc7df7b29d7f9a336f7b57b33b323ccf8ee769932fbffb17e7e2273fc33762231ef50a8ff42c4f7885f3eeb9ec86450545454445054545058585c9b92b7b8eade1da6307bce4d451eebcf604775e77822307c0c04cb082891960c54c3071f8e027b8f06b3f37a7dffe63cc3ae06bed789e27ffc5ffcbc54f7e86afe719e453db45eef71297dbc8a8a8a8a8a8a8a8a088a8a8a0a8a8a838540eb78dcbfb38fbec651e78fa22ef79f0094eec8637bde42adefe8a6bb9eaf80133c1022666821533c0c4e1973ec6331ffe054ebee12ff2b5767c8d0b1ffd3467dffb41fe28019ff222f76d17b8925450549860445454545454545054545450545cd936542c522c542e5c8e5fb9ff71def38527f8b3afbc9e77dc791d6b60265831034ccc0a262e7ffa3dec6ebe83a32f7d3d5fb5f83ddba56778fcfffe37f1477816f9b7fb27f9d0fe1c97dd5051d9944dd1d88a4dd91415151515954d515151d91495c3fd868a8a8a8a8a8aca3357f6fcb3df7e84bff76b9fe7c295435831034ccc0a26668015cf7ce89fe6e58b7cd5e2f73c7dcffbf0c2a5e1455c68e39ec32778c4cb5858a8a8a8a8a8a868686ccaa668a868a86ccaa668a86cca956dc34245454545454545e5138f9ee7efdcf3599eb8780556cc0a2666052b66a22b17e6f227ff155fb578cefeec05cefee6bfe7c53c8bfccafe49ceba474545c5c2424545454545454363533663533454343665330e151515150b15131513151395479f7e96fffe5f7f96f3cf1ec2c4ac606026583113571ef80d7cf669be62f19c73f77e18b68d1712f06b874f71d6434c34545454542c2c4c4c5454545454545436653354544cae6c1b2a2a2a2a2a2a2a2a2a2a2a268f3cfd2c3ffbcb0f10c1c0ac60c54cb078ce21870ffc3a5fb12a2e7cf0e3bc988f6f1778c4cba8a89868a8a8a86ccaa6686c8a8989898a898a8a89ca966c8acae17e43454545454543454545454545e5be87cef28b1f799459c1c44cb0602666e2ca43efa36277e5c147db3f7d6e780197daf8c8e1394c324a2a2a2a324c2a6ebaea08dff71dd771f5991d9ff9d245def3b127b87479a3a2a2a282a2a2a2a2e270db30d130c930d148b14831d128d130f9f97b1fe26dafb996eb4eef60c50c30c10a9e7d129ffe22bb673ef7c5e1457c6c7f812b8a4945454a458545c5e9a38b9f78db4b3879e2000e8697dd78823f71d735dcf3a1c778df279e60532a2a2a2a2a2a5436a542c524c344a344a344c324c542e5d2b3f10bef7f981fff532f65065831134cb0607be293accb0f3ec20bd9139f3ebc8089868a8a85c9a6a8a8bceae6939c5c07b007f6c1619c3eb2e32fbcf525fccc5fba9357df7e06151515151595c34d5454543454545454545454545454524ceef9c8ef72651356cc04132c9889eddc175a875f7e9217f2d0f60ccfba47c5c4424545a3c244e5e8401bb007f6c03ed8078771f3d5c7f95b3ff00afef33f7f07b7dd701c15151595c36d43454545454545454545454545434545e5ecc52b7ce881a7980956cc82996045971e9eb53f7b81e79b150f6dcf60a1a2a262a1a2b2292a26972e6fb08736600fec817db00f0ea33dbceab6abf8af7ee4d5fcb5777e2b579ddab1299bb277c344c544c5444345454545454545454345e5439f7d0a56cc0413ac9889ae9c6579f932bf6f605630f1d8fe322a16162a2a169ba2a2a1f1d187cf71eee21ef6d006ec813db007f6d13edac36cc35b5f7d237fe76fbc8e1f7aebb770e460d83651515151515131d13051315131515151d1f8e443e7980916b0622698182fb130fe7f0333c1c4ac786a7f050b15150b15150b131595f3970ff9d95fbf9f8f7de93c1d421bb487f6d01ed8477b691fede3f83ae0cf7df74bf91ffeb3bb79db77de0c848a8a8a8a8a8a8a8a868a8a8a8a898ac9838f5d8205333113ac98c573360e7ef22d7feabf61602658312bb6897bcf3f8549468945864945454a45c5f9cb7bdeffe0937ceef1f3dc7afa04571f3fc2570ccf37100c70e2d88e37befa46de70d78d3cfcf8451e79fc122a251a26192619262a152a152a16570e37fe9377be94b5801533c0c4acd8313103ac980926444c542a344a2a2a542a2a4a342a2a3ef1e8593ef1e8d3bce9f6ebf973afbb8debcf1c630202028a0e868209085e71f319fedbbff1063ef0a9c7f85fffc527f8e223e7b050a950c930d12851a950b1a0d8bb71e4c8820916cc0413bb59c0c44c30310b8650d128b1a848a930c9a828b1a8c828a978df038ff1fe2f7c99ef7be52dfcc06b6fe3e4891d131050700035104c3007f0a657ddc4ddafbc815fbaf78bfcdc2f7e82b3e79fc542a542c522c522c544038209265830134ccc8ac5c44cb0621630c1808a89458a8a8a8a868aca6668b8898ac6a66ccab3877bfee5471fe4a7ffd907b8e7a30f717859d8037b600f6cc11eda037b600f3b163ff4d66fe5effdd4f772f4c84245454545454545454545650666c14cb0625630b066821533c0c4ac60a242454543c54245c5c24445c5c464533434544cce5ebac2cfbdf773fcf4cfbf9ff77dfa77f110d8037b600bf6d01eda037b600f2fbbf10c6f79edada8a8a8a8a8a8a8a868a8a8b0820956cc0403b362c78a9960c14c3031132a151a252a151625192516192515161925151516190f3f7d81bffbafefLine truncated
|
||||
|
||||
// Static25 returns static file
|
||||
func Static25() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic25Data)
|
||||
|
||||
rawStatic25Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 5174,
|
||||
5174, 9826,
|
||||
"C7hzYkNSSDY=", "C3ZbSuud6d8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic26Data = `89504e470d0a1a0a0000000d494844520000003c0000003c08060000003afcd97200000002494441547801ec1a7ed200001581494441549dc10beceff75d98f7e7fdf9fdcfd5d773ec38f1151c6227711c120289d3101a5a046d40636302dad142b782c6aa4d6a2bc636a9689b8aba1569a21d48dd56b5546aa5892155656981642410aa900a931b18274e1b27bec5f7dbf139b6cfe5f77d9ed99ae942128784d76b7a017f026d5be7ee7b78cede7d3f673fff103d728a73a74fe1b973607c898959c0c44c30310b986062065831130ccc04bb618e1ee6c8e54739b8e24a76575dc7e1eb5fcde1575dd7ec76c39fc0015fa3f38f3cd1e90f7f7ccefcdea7d8ce3cc7576562163031134ccc022698980156cc0403b3820910ce3dcfb9c79ee3fce34fc0bffd3433ef675d7c11c76ebe95e36fbe8d8313afe46b71c057e9fca34ff4d4af7e689ebdf3ae215e347c156605130ccc042b6680092666011333c1c42c6082891960c54c303013acf0f9d3f3dcefff1b9ebbe3df70fca6d771fceddfddc189570c5f8503fe186d5b4fbfef77e6a9dffaf0b06d7c2d6605130ccc042b66808959c1040333c18a1960622658c0c44c30310b98606206583113cf7ff6939cbdf7aeb9e82ddfcef16ffe8e6677307c05077c05fba79ee1917ffa1eceddff79be260333c10403b382899960605630c1c04cb06206989809163031134ccc02266682054ccc0403b302f63cfbf15fe7c2437771c977fc08bb8b4ff072162fe3fc034ff0f99fff679dbbfff3c3d7626026989805b382899960c1ac60828159c18a19606256b082899960c52c60622658c0c44c30312b98988919b8f0d87d73ea5ffe5cdb53f7f3720ef832ce3ff8180ffec3ff139f3b3b7c9536e2892ef0a4e739dd9eb36e6c4804440544bc282a20202228222cce2bc70f862b8e1e70cdc587b9fed2231c2c6060265831034ccc040b9898099f7f7a4ebdf77fe7d23ff7d73838791d5fec802fb27fea191efa47bf94cf9d1dbe0a8f75817fe7b33cb09de57c42515151515141115151415151411052717e2fa7f77b522c528eec86d75f719c3f75dd65dc78f22833c0c4ac6080899960c50c74fe594e7fe01f76d977ffcd59179de00b1df005da6f3df24fdfc3f6cc99e18ff16417f8d8769a473c47454505454545444506444545450149414405c5793752344c2a9e3dbff1bb0f9ee2f6079ee21b4e1ee3fbde7015379c38021333c0042b66808999e8dca939f3a17fdc25dff93799b51b5eb2f8024f7de0c373eefecf0f5f81c0273ccd7bf74ff0b0e7b0b03031d98a2d3151d130d994cd50d150d90c13151595f3db868a498a4a8acaa67cfab133fccc07efe697ef7c040956b06206989815ac9889ed897be7ec9dbf367c81c54bce3ffa444fffc6eff0959c477e63ff247fb03fc3a6a8a8a86868a8686c86868a8686ca566c8989c9a6a8a8ec95fd262a2a2a2a262a152a1736f9953b1fe1ef7df0733c7f61cf4c30312b98980156b0e2dc5def677be69178c9e2254fffca87866de3e59c47debf7f8a873c878585858a89898a8a8a8a8a8a8a898a8a8a8a8acaa6a85cd83636c542c5424543454525c5e40f1e7c869ff9f5bb79eec2c6ac60620658c1c40cd005ceddf97f0f2f59bce0fc238f73e69377f172247e6bff348f6fe750515151b1d0d0b0303131d9922d3151315151d9140d158dcd38bf6da4a8a8a8a8a898a898a8a8a4dcfde819fefe073ecb96cc0256ccc44cb062565c78f01378e6f3bc68f182531ffe38c4cbfaf8769a07b7b3585868a8a8a8a8a8a868686868686c86868a8686caa66c8689c9854d54544a544c5434543454344c34eeb8ff14bff4bb0fc2c44c30c18299606226ce7ff6b779d16adb7aeef7ee8a97f17817b8737f060d1515130b0b130d15139383152a2a2a2a9bb2192a2a1a26269bb229fb6dc3424543254325c544c544454545e5973ff210773f7a0656b06026989815acd83f787bb9efe0dc7d0fcd76e6395eceed179e66532c3222324a2a2a2a2ade74fdc57ccf375fc925171f70ff93cff3be8f3dc6a7ee3b4d4545450545454545c5a66c4a854a854986498649868946894586c92f7cf03efea71f7a2d33c08a99606026baf0ccf8d43dacb39fb98f97f3b0e778783b87468a898a8985858acaab2e3dc40fbef52a2e39b4601fd79f38c68f7dd70dfce7effe3a5e75e2302a2a2a9bb2292a2a2a1736315131515151d150d130d128d1505151b9e3be53dcf9c033b0622618980956ccc0f6e4a759671f7c8497f3a9fd19544c2c34545454542c2c5e77d571d6066cc03ed807fb78ed3517f3933f70137ff1cf5cc725c776a8a8a86ccaa6685cd83632543454344c544c5454545454524c54547ef5a30f33130ccc0a56cc0413dbe97b38d83ff6245fce3672ef85e7d0a828b1a828c9a8a8a8d801ed61027640414030bbe11dafbb82b7dc7439ffcf471ee6d73ff230e72e484645c4de0d0d930c930c138d128d128b0c930c930c930fdff524e737397278606226186045cf3dc2da9f3ac3979878c4739c73c3c4c4222345c3c24245e5d9b31b6cd01ed8031bb007f6c13edac391b5e37bffd4b5fcedbffa466ebbe50a404cf6dbc6a6a8a8a868a86894689868a8a8a8a8a898a83c7bf6029f7ae01998980916cc8a99e8fcd32ccf9de30bcd8a59f1e8768e0c151515954d315151b1b0f8d8034ff3fcd90d36680fec810dd8807db08ff6d11e4e1c3bcc8fbefbd5fcad1fb9959bafbf84fd261a2a1a262a262a2a2a292a2a262a262a2a2a2a773d709a59c18299608215e3f32c8c3f342b9860e0d4761e130b0b15130b0d0b151595279f3bcfcf7de8737ceeb1e76883f6d01eda431bb40ff6d13eda077bf8faab2ee6bffb4bb7f237fec2ebb9fa8aa398a8a8a8a8a8a898a89864a864a858a858a83cf0f8b33031134cb0628617ec39e0450333c10403b3e23937344a2c2a2a522c2a2a4a2a32ee7bea59fe970ffe5bbee9dacbf8de5bafe115971e816002764040d16e28986076f02d375dc99b6f3ac9fb6e7f805f7cffdd3c7dfa1c261926192619261926152a152a16294f9e3ecf0cb06226186062561c3030134ccc022698b8e0864945894645458a454545494685c5edf73dc1c71e78923ffd0dafe07b6ebd868b8f1d40303b20a060073510b08383dde27bde7e03effaa6abf9bf3e7037eff9d79fe5dc5e4a344c2a542a542a542a4c322cce9ddfc38a9960828159c1c4ee6f7ceb77fc8f4ccc0a069898894f3e7f86a7ce5fa0a4c222a5a2c222a5a2a2a224c362bfc9dd8f9de65fffbb4718e0eb4f5ccc9a617841fcff1afed000870f76bce57557f2eddf7c0d4f3cf33cf73ef80c2629161a251a251629162916d75c7984ef7efb2b618205b382891958ac98150c30312b58506262a1926261a1a26261a1a2a2b115162a2aa7cf5ee0177ff71efedb7ffe517efbd38fe2856003f6c01ed8823db087f6c006ece1ea1317f153ffd95bf95b3ffa56283454Line truncated
|
||||
|
||||
// Static26 returns static file
|
||||
func Static26() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic26Data)
|
||||
|
||||
rawStatic26Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 5576,
|
||||
5576, 10623,
|
||||
"9WkDv09mrao=", "cSOEkmcLH8A=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic27Data = `89504e470d0a1a0a0000000d494844520000004800000048080600000055edb34700001a1f494441547801acc17bb0e68741d6f1eff37bdfb367f7ec3dbb4977d30dd9dc2f3509e90d484a3134c529ad04b13020456acbc0383ac0a820e33ff61f441947c74b717418145144b4b645a9ad6d6948696b364dd2b4699afb7d37b7ddec6ef6ec9edbfb7bbeee765b8c6d92a691cf279ec49f81f1c4326bf71fe0c4638fb9fad4c18c079f636df1985d5909637941814488104884009144081049804802441824012603c3fa79a79bd767b2ed0ce6cedce5fc9edd99db7d3ec38605fe2c4cf9ffd0a51516efb89bc5dbee62f9e1c7a1e5a4f07f8517134980088144081049844022041824110244122082232e1fcfdaca226b870eb2f2e03d59dc070c617ecf77b0e1d2ab5c7fc91519e637f04a4d7905fadc22876fdcc7b17d5fa4cb2b7cdb22091021900811028910c8200488244280480244082442844022048884b2baff21d60e3c98639ff9080b575ecdc6abdfccb0b09d6fd7946f4357671cbdf1668edc7833aeaef18a44122042201122093008814408104984009104881049800881440824428440220ce06c9913b77f96a52f7f9e85abdfccc6abff3c99cef1724d7999961e3de0c1dffb48d69e3ec42b16498048020c42240122041221422011024412204224012209102192001106488400914408385be1c4e73fceca035f60ebf7ff98d3b3ce0d2fc3c0cb70ec9377f2c4fb7f376b4f1fe2158b24c02019844188244084402244082442804822448824402401220c9201188401122142241102441220321e7d8ac37ff01b59bef793bc1c535e822dcf7ee8468e7ef6165eb140220488244280480244082442844022048824422011024432001122091021900811028910209200914408e08cc59b3ec2f8ec6116def82364187831535e842dcffc97ffc9e22d77f28a054e30e3b9ce5872648d520484c8690242384944be2a1244e4ab222255e62661f3ba819debe7d8ba7e028144881048844022440824428048020cb2f495cfe0da2a1baffd71320cbc90292fe2f0076e64f1963bf976cd90fd5de1f12ef3549759b2a8a8a088a828a088a820a880a8a89ca282a2a272746dc6d8524565d374e0bcadeb79cdce8d5c7ee602eb8640201122041221c02089102092c0ca83fb18d6ad63e1bbdec90b99f2029efbf4ed1cb9f916be1d4b94bbc7e3dcdf13ac5a545054441054545440541450445410445054544e5169cbacc516952a4757466e7f6a95db9e38c2fc74e0bb5fbd85ebcedbce96f51318201102441221402401220496effd34c3b61dacbfe43abed1946fb0fce8010ffe8f4f8497a9c85d3dc197c74566161511051415151411150514111514051411150411151481d5165baaa8d8a25245e5c4ea8c4f3c70909b1e3ec45b2fdcc15b2f3e83e9108824428048024412214064e9b6ffce74e7794e77ec0dcf33f03caeadf1ccef7d248ce5e538ea8c8fce0e71c7788c354b952a566ca9a58a962aadb4624b2dad58a9524b2dadb4524b5bac5469cbda58aad8624b952a5adad21695e5b5910fdff524fff08f1ee08963cb24428048024412214024015ce3f8fffe9d38aef27c03cf73e453fb587bfa102fc7e3aef0d1d9219eed1a6da9a515952a555ab1a54a955a54aab4524b2dadb452a5162dad54a9a52d5556c7115baa54b1a52dada8a8b4a52d561e39bcc43ff8f8fddc71e0391249844822048824c0200ce2e253acdcfd099e6fe06bc623c73972e3cdbc1c0f75899b668759b554a962454b5b6aa9454b9556da62a5965a6ab1d24a2d5a5a6965546a694b2bad8c6399b554b1a52d5554b4b4a52d2a556ab1e5c4ca8c7f71e3c37ceea1c3104884008364100621920091e57b3f41978ff075035f73e48f6fc6d535be95c7bacc67674799555a698b4a952a55acb4d24a5b6aa9a54a2bada8d4524b2badd4528b2dad54a9a596b58ed8d2962a2a5adad28a4a2db5d862a54a2d6bb3917f7dd323dcfed85118804112214024012204322eb37adfc7f9ba8193bab4cc73fbeee05b39e28c3f991d6166d1a245a52d6da9c5962a2a55aa58b1d2965a6a69a5952a5a6a69a5952ab5b4a5952a6b63a9a2624b5b5a51a9a52d56ac54a9c59656aaac8d23fff2930ff1f8e12512214024012289244264f5a1cfe2da12a70c9cb478c7ddbab2ca4b19919b6687596dd152a54a952a2a56aad4524b5bb454a952a5152bb5d4d24a2b556ad1d296565aa9a52db38ed8d2962a2ab5b4c58a4a2db5d8d24a152d5a5a39be32e39ffdaf07596b492401228910209200e3126bfb6fe5948193166fbf2b7c0b5f9a2df2ecb84a2d2db4c516152b55aa5469a5159556d64d414b2d2ab5b4d28a965a5a69a5952ab568694b2bb3b15451694b5baca8d4d2162badd4a2c596565ad152cb434f1fe743b73e0101228910209200110699eddfc729d39e5866f9a1fdbc94138e7c69760c15151515052d2a2a0a5a50042e3f7b811f7ced4e766c5bc7e2ca8c7df71de58fee7886a51551415150510151d0a29c242a634b95b6a8a8a8d46245a58a16152b55b4a854b1a2a2e503371fe0fa2b77b263d314020c92001122098c87efc3d5e30c4b0f3e062d2fe54bb345d62cad54a952a5962a5554b4a854396fe77a7ef27b76b163610a33d9b46ecaf75fb9835ff9b10bb9e6f2ed24d04a2db5d4d24a2d55b4b4a595b5b1b44545a596b658a9528b162badd4a2a59556ac68a9a5cad2cac8076f3e000330482244882440248c8ccfdec7b0f2c80179096bc83db345daa2d2165b6ab1a2624b2d55aa5479d3f95b190a8cc0288cc24c36ad9bf2ce6bcfe6977ff4422e3f77332a56acd4d2165bda52a596594b2d6d698b952ab5d862a5955ab4b4d28a162db5b462a52db57cec0b4fb1bc36920881441220920891f1e8830eab4f3d135ec223e309563ba2528b4a152bb5b4a54a2b6d698b96edeba7300223300233611466e208afdaba9e9f7bc779fc8d1b2ee0ec33d7534b2bad54a9d296b6cc3a6245a5965a6c69a54a2d5a5a69458b962aadd8524b2d2a568e2dadf1b97b0e4120110244122140c4e38f65981d3cca8b8a3c3c3b412b55aa54a9524545a58a8a8a4a2b8ce0088cc0088cc0088cc24c18c5112eddb3995ff9f14bf9a91fd8cbd68d536a694b2bad8c2dadd4d2162bad54d1624b2bad68d1d24a2bb6d452c58a2d6da945e533771f2211024412214024811e3fc474b6785c207ca30891fdb36544546c115150b1454544418b8ac2d11333766d9e472102729a808201c549188670cde53b79dd25dbf9e8be27f8d8cd07585e9da1b2d6d216952a5a54ac5451d1a2d28a8a962a2a56b45451516945cb171e38824802891020920188383be2d09595f07c810c92019e73c6d238a32d6da9d24a5bda52a54a2b6d69c54a5b3ef7f0619c01233882233002233002a3308a33710447981f26dc70cd1e7ef567afe2da2bce24c038962ab568b1d24a2d5a6a69Line truncated
|
||||
|
||||
// Static27 returns static file
|
||||
func Static27() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic27Data)
|
||||
|
||||
rawStatic27Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 7275,
|
||||
7275, 13680,
|
||||
"hh7ZThwrLPE=", "3RMdjDDWyXA=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic28Data = `89504e470d0a1a0a0000000d494844520000004c0000004c0806000000c797512b00001903494441547801acc179ec278859d8e7e7fdce6f667776d7c7e26bd7d8c6f8b6838ddd80438d395c2090004929542922098e1292e6afa4aa42aa566de91f95aa4a5184d22851a5288a9a36815651504201637353f0852f7c61afd7e7dadef5de33bb73fcbeefa7b36bb00d187c90e799aef11fc85eb9eaf2473eeef207ef70e51377d6272fb874e15efbf0a5e9f4947c7e93194c0c333198cc606232838961260693993167cf98f3d775ddcdd73b3cfe494e9e78eb9c7bead39dbdf5690e67cff90fe5c49fd05ebdeaa177dee6c25bdee5e1f77f4897aff85de38b3199c1c4301383c94c0c2633981866623099c1ac8e472e5e994b0f3dc01d779af96d863977d6755ff52ce75ff012d73feb85e6ec397f1227be4cc70b0fbbffd7dee481df7c6b7be1a1f1e598cc60629889c164260693194c0c333198ccc46032838961260613a7575cfec0bb5dbefd5dcedc7063377cedd7cd8d2f79a5397f932fc7892fd15e3dedfe5f79d3dcffbad7db2b975c33be1c93194c0c333131ccc4603283896126069399184c663099c1c4301313c34c0c7be9c25c7cc32f79e81dbfee8697bdca8d5ffb4dcdc9d9f12538f12578e8f68fb9e75fbd66aedc73a72fdb301383c9b8666232838961260693194c4c663031ccc460328389c90c268699184c6630e9f2150fbdfe675d79ef9be7a6577dbf73b73ecb17ebc417a15df7bff60dee79edafb2ebcb36ccc460321383c90c268699184c66623099c1c43013e39acc606232838961260693194c4c6630397de04ef7ffbb7feac6977f9bf32ff90e7338f8424e7c017bf9d4a77ee2a7bbf0f6f78c3f896126268699184c663031ccc460321383c90c268699184c66623099c1c4301383c90c2626e39a430c332117dff81ac7bb3fde4ddff2833327d7f9e39cf863eca5cb3ef9cffe8d876ffff0f8931866626258ebd3321e91478c7c5ac878441e3122d7e411333933184c663031ccc460321383c90c268699184c6672f9436f9ffdb98b1efb1d7fdd9cbbde1fe5c41fa1cba73ef1cfff8d4bb77fd897eb42479fecb24fed15f775d5853d7579d74a45494425111552514245a924578eeba1d3a3f3670e1e77ee8c279f3febe98fb9ce736ebedecde74f1866623099c1c4301383c94c0c26a777bddf03affbdf3df63bfe4b7372cee773e2f368d79d3ff1efbb74db87c797e8aadcbe0ffbc03ee49ebdaa524994a2a2848a925444a2946b5229d7a496b8725c57775d391edd77e98a0fde7fd1eb3f1ef2d49baef3f5b73ec69f7eea635d7f76cc606298898961260693194c4eeffa800bbffe2fbbe99b5e3d7338f8834e7c1ef7bff60d2ebefdbde34b702aefd987bce778d165476d1e51a92849a15412a5486c925cb34994724d2ab9a65cd9a376552a5b2a950fdff7900fde7bd14fbfef4edffacc9bbdead9373b7772301313c34c0c263398186672f5236f9d4beffe39e7ffd49ff3079df8031ebefda3ee79edaffa52dcd1656f383ee0e21e254aa5425a924a85141525119544a9e49a522185b2e5f4b8b6542aedaa6ca9542e5c3ef5efdef349bff6a17bfce04b6ff1a76eb99161260693194c4c6630315c7afbcf3afbe4e73979d2b37dae83cfb1574fbbfb277f865d5f8c95371f1ff44ba7f7bab0a7b6d566776dd9b29bb5b655a9ec665bb5b6b59b6d6dabcd6eb6b4d94d6537bbd97275d79636ed6ad7962d95caeeda5dbbf9d485cbfed1af7dd04fbeede3b66598c90c263399c1648699b01e7ad3bfd4f16a3ec7c1e7b8ff57de3057eebac717e3aafce2e97dde7dbce0582a956dadecae5adbdacd6eb6b5a5d266cb965a5bb66c6b5b6db6b5addd6ca9b5bbae1e8fdab5ad2d5b2aedda5dbbab52a96cebb8eb35efbecb8ffff2075d3a3d32319989c1640613c34cf6813b5d7eef2f8ccf71f0bbf6c14bee7fdd1b7d31aeca2f9cdee3e37b49d2665b5b2a6d2a5bb6542abb69d7b6b6eca6cd96ddb4d9b2655bbbabb2adddec66cbd5e3da52a9d5aeddb5a552d9d6b676579b365bdefeb1fbfd83d7dee6d2e9d14c0c26339818666262b8fcbe9fd1e507fd9e83df75dfafbfd15eb9e40b59f9e5d37bddb9576cd9cdb676d366375b2abb69b3ad2d5bb6ec665bb5b6eca65ddbda4d9b2d5b76d7b66a6d6b779dee6ad7eedacd964a655bbbab4d9bca966dd56af39e4f5cf0e3afbbdd693199c1c46426268699b87ac5e50ffca2df7370cd5ebdea81df7c6bbe086f3e3ee88ebd6c375bb6542adbdad6ee3a6e6a6dd94dbb6a6dd9d266cbb66a6d6b37b5b6b59b365b76b39b2da7bb8ebbb6542ab576d7ee6a53d9b2ad6db5abcd6eb6d47adb47eef77ffde647cd018738640e38c48139c401875cfdc0afd5f18a471c5c73f19defb7171e1a5fc047f7b2779f5eb0bb6a552abbd9d6964a256b635b952dbbd95db5b6eca6cd96dd6c6bcb965adbdacd6eb6b5bbae1e57a5d6eeda5dbba954b6b5ad76b569b3655bb56aed66373ffdb64f7acb87ee633283896126069319bafac09c7ee2ed1e7170cdc5b7bcdb17722abf71f53e5b2a5b76d7ee4a5a2a5bb6eca65d956d9d39707286ca6eb6b5ad2dbbd952d9cd6e76b3a556ad2d5baeeed1eeda4da552d9d6ee6ad366cb966dd5aaec6637955abbeb9fbeee832e9f2e13c34c0c2633313139fdd81b3de264af5cf5f0fb3ee80bf9edd3075de854a50da9542a954aa1152a8fbfe1c45ff8d34ff2fca7dfc081db3ff9b0d7bce52eb7dd715152a928458514954451b69c1e57a5b2ad36954a654bad4aa5cd964aadca964a9b3befbfeca7def4717fe91b9f6a26268699184c6638bdeb5d3abde270f9c377e8ca557f9c2bad779e5ed4a65dc9962ddbdab2a5526b655be7ce8cbff1cdb77ae1ade71d96c3f2ec5b6ef0b7fffc5779f59f7d9a273ef6acddb4d9cdb66aed665bdb6ad76e8ee5b8d9b2adddd5a652d9b2ad5a6d76b39b2db56a6dd94d9b36b5b6f5536ffcb887ae9c329961268699cc60325d76bcff7687cb1ffab82fe47dc7875cda53dbdad85dedda564ba55d5bb6eca6cdcb9e7e93279c3fcb11c738e23496af79c663fde87ffe5cdff7ca5b9dbfee604b9bdd6cab4d9b2ddb6ad7e91eedae36952ddbda56bbdaec664bad5ab576b39b36b5b6b5ad2d6d1e78e8aad7bde34e33981866623099c164efbdcde1cac7efcc1f67f89dd30b2a6d6a5536da6c6b7785366d2a5b9e7ce3398e38e288631ce3348e3933e35b5ffc44ffc35f79a157bdec490e07b66cd9d6b676579b2da7c755d9d6b6dad5a6cd966dd5aab59bddeca656ad6d6da9b469d7b6b6f59ab7dec9c4301383c94c4c4cf6a18f74b8faa9fbfc9186fbbbeaeed32bb6ac6ca96cab52a9ecae6dadb5bbb635a5238e38e288238e71c4693a72c3d933beff955fe9bfffab2ff2b2e73e9eb2ad2d5bb6b5bb4e77edae366d2a5bb655abcd6e7653a9556bcb6edab4d95ddbda52a9bcff8e0beeb8f7929998Line truncated
|
||||
|
||||
// Static28 returns static file
|
||||
func Static28() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic28Data)
|
||||
|
||||
rawStatic28Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 7878,
|
||||
7878, 14836,
|
||||
"94t8wN8VjWU=", "Pk19X3Kp/Iw=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic29Data = `89504e470d0a1a0a0000000d49484452000000b4000000b408060000003dcd063200005d9d494441547801dcc1d9afb8f95dd8f7d7e7cccf9e192f2c060c59cb928d2851846814255123458a5445ea45a5a65755ef7bd13fa2b7b9e95d2aa5551bb5cd4a131a85d0509600098bc160038ef18217bc8f3de3d97feb39e779f7fb3ccf99df1951763cf690d76b5afc47e4faee3d97cf3eefeac5975d7ef9254f3c73dfddfb5fb6ddbddff5bdfbb3dd7f58d7d7d3d535d7d7fe40c69219b726877198c963638971987123c6692c19cb384d0ee33096c961dc88612c779e304f5c983b779a279f9c8bb7bdad27def6f43cf5aeb7d89e7cb73bdff80d9efc96afe79ddfe689b7bddd7f4ceef843ecfafe038f9e794e9ffcb2bb9ffe54f7bff085b97ef9555d5d537e83711a5f0993dd8cd358721887993c369618871937629cc69219b726877118cbe4304e93dd5806d757dae8f2d1b87fcff54b2fcc953cfc84e557190cf3c41d17ef7ca7a7fee8b7f6d41fffb6996ffe2e6ff9e677bb78ea697f58ddf18748dbe6f2d917bafec8335efef847e7c1a73edbf5bdfb63cb32be1ac692dd8cd358721887991cc68d18871937629cc69219b726877118cbe4304e93dd58c612e334968c659cc612d1f5a5edc5e7dd7be9cb73ef43bfcac54fb878fae9ee7cdb1f9b3bdff59ddefec7ff4c77bef19b672e2efc6171c79b5c5b2e9f7fc1bd0f7eccdd0ffc5a8f3ef7cc7479e5c6f86a1a4b76334e6389f1d84c0ee3468cc38cd3e4b1b164c6adc9611c66f2d8384d7663194b8cd3583296711a4b8cc3582687419beddeabf3e8931f71f9c98fb8ff961f9db77ccbbb7bfa4fffc579f2bbbebb27befe5d331717deccee7893da1e5ebaffd14fb8f7731ff2ea273ea1479796f1b53296ec669cc612e3b1991cc68d1887194b8c5b63c98cd358721887993c364e93dd8c1b314e63c958c6692c310e63991cc669b21bcbe0ead2e5339f9dcb673ecbcffee8bced4f7ebb27bffb7bbdf53bfe9c8bb7bcd59bd11d6f32d7f7ee7bf5e73fe0a59f799fabe75ff2a63096ec669c2687f1d84c0ee33479cd8c25c6adb164c6692c398cc34c0ee3d66437e3468cd35832e3d6e4300e63991cc669b21bcb58629c06d797ee7ff2a3eefffa473df10deff2b6bff0973dfd17bfc7c55bbfde9bc91d6f12bdfa6a5ffe89f77bf53dbf38db8387de34c692dd8cd3e4301e9bc9619c26af99b1c4b83596cc388d25877198c961dc9aec66dc88711a4b66dc9a1cc661c692c3384d7663194b8cd358329671b87ee979affcf40f79f5177ed23bfffc5feee9effd6b336ffb066f06777c8d5ddfbbefee0f7ec40bbff293737dff813795b164c6adc9613c3693c3384d5e336389716b2c99711a4b0ee33093c3b811e330e334796c2c99716b721887993c364e93dd8c1b314e63c958c6692c31f4e8be577ee9dfcdab1ffe79eff8ab7fc153dff5b75d3cfd765f4b777c8d6c9757dd7ddf87e7851ff9f7ae5e7cd99bce5832e3d6e4300e33961cc669b21bcb58629cc692b18cd358721887991cc68d1887194b8c5b63c98c5b93c338cce4b1719aec66dc88711a4bc6324e63897118cba487f7bdf293ef75f7173eeaed7fe56f79ea4f7f8f8b3b6ff1b570c75759e5d1279eedcbffe687e7c1a73e47de7cc69219b726877198c963e334d9cdb811e334968c659c26877118cbe4306ec438cc5862dc1a4b66dc9a1cc661268f8dd36437e3468cd3583296719a1cc6612c93c3386cf75ef4ca8fff0b0f3ffcdedef957ff8b79e25bffa499f1d574c757d1f5fd875efcf19fefe59f7aeff4e8d29bd25832e334961cc661268f8d25c661c68d18a7b164c6adc9611cc632398cd3643796b1c4b8358c18a7b1e4308c65f2d858621c66dc88711a4bc6324e93c3388c657218a7c96ee4f2994fcd0b3ff03f7bf22ffef5def13d7f732e9e7cda57cb1d5f250f3ff7455ffce7ffa6abcf7c71bc198d25bb19a7b1e4300e33398c1b310e336ec4388d25336e4d0ee33096c9619c26bbb18c25c6692c19cb388d2587612c93c3b811c358c68d18a7b164c6adc9611cc632398cd3643796b1a4eb471efcd28fcff5e73ee21d7fe3bff6966ff9e3be1a2ebcc1daf2d24fffa2cfffbd7fe4ea335f1c6f4663c96ec6692c311887991cc68d188719a789711a4b66dc9a1cc661262687719aecc6329618a7b1642ce334961c86b14c0ee3460c6319a789711a4666dc9a1cc6610693c3384d7663194b8cd370f9dce7bcf8affe9efbffe1a7d4e68d76c71be8fafe03cf7dff8f76f7fd1f1c6f5663c96ec6692c311e9bc961dc887198b1c4b83596cc388d25877198c963e334d9cdb811e334968c659cc612e33096c961dc88612ce334796c18314e63c96118cbe4b1719aec66dc88711a4bc6727de9d59ff997aebef4ebbdfdafff5773f1e4d3de2877bc41ae9e79a12ffde31ff0e0f35f186f5663c98c5b93c3388c657218a7c96b662c316e8d25334e63c9611c667218b726bb1937629cc69219b7c612e33096c9619c26bbb18c25c6ad61c4388d2587612c93c3b811e330e3468cd35832e3d6e4c1c7df3fd72f7fd1d7fdcdffa68bafffb6f106b8f00678f089cff8fcfffa4fe7c1e7bf30deacc69219b72687716b7218a7c96b662c314e83b164c6692c398cc34c0ee3d66437e334314e63c98c5b13621c6630398cd3643796b1c4380d2623c6692c390c63991cc68d1806336ec4380d23336e4d0ec3e5739ff7e2bff95fe6f2998f7b235cf80a7bf8b39ff5cc3ff87e572fbcec4d6b2c99716b72188fcde4304e93d7cc58629cc68dcc388d25877198c961dc88c96ec669f2d85832e334981cc66126e4304e93dd0cc612e334968c659cc61283612c93c3b811c358c669629c8611e3d6e4300c66d8eebee0e51ff9df5c7dfee77ca55df80aa9bcf2be0ffbfcbffa67b6fb0fbc698d25336e4d0ee33098c9619c26bbc18c25c6692c21334e63c9611c66721837621c662c31796c2c99711a4b0ee33093c7c669b29b7123c6692c99c1388d25c6612c93c3384d0c63194b4c1e1b468cd3607218c63221bb2eef7bf147fe85871ffb0595af943bbe022aafbeef3f78f6fb7e88ebcd9bd65832e3d624cb905ccb265b31d8302863198489308811839c268f8d2587716b329871480ee34666dc9a1c868be1cec5b8639931c35826bb1937629cc69219b7c612e33096c9619c26bbb18c25c6691c468cd3587218c632398c5bdba5577ffa9f7a4779eb9ffa4fcd8c3fa83bbe02eefef2af7af6fb7e88ebcd9bd6b0d9bcdcb557b62b2f74e96e575edd36f7b66b0fbb7669531eabec0a934329af93c2440ee5908ca5843039540cca6b1291c8a12cc92e65c9e596bb57d7064f3d71e1e9272ebcf3ad4ff886b73ee15d4fbdc5bb9f7eab6f79fa2dbee9e93b2e0c63c98c5b93c338cc587218a7c96e2c6389711a8711e334961887b14c0ee3d6642c5d7bf567fea9b75ff0d477fd657f5077fc013dfcf94f7bf6fffe21ae376fLine truncated
|
||||
|
||||
// Static29 returns static file
|
||||
func Static29() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic29Data)
|
||||
|
||||
rawStatic29Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 29106,
|
||||
29106, 52979,
|
||||
"IJC29t3ww0k=", "YF7BAVFq/1c=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic2Data = `774f464600010000000151ac001200000002a02000010001000000000000000000000000000000000000000047444546000001940000017300000262b442b08247504f5300000308000030550000652ef96e4b86475355420000336000000b7c00001590eb82e4594f532f3200003edc000000530000006097e6b1ba636d617000003f300000094d000012460177581e63767420000048800000005c0000005c311c064b6670676d000048dc00000132000001bc87fc24ab6761737000004a100000000c0000000c00080013676c796600004a1c0000ee100001e33c2f1a87af68646d780001382c00000196000005186487749268656164000139c40000003600000036fc9fd27268686561000139fc00000020000000240aef0ac7686d747800013a1c00000a8900001438f2cb4df76c6f6361000144a8000009be00000a1eedc86ea86d61787000014e680000002000000020073e030f6e616d6500014e880000022000000468002de7c3706f7374000150a80000001300000020ff6d006470726570000150bc000000f0000001531a02a32978da0dd0030c584b0005d17b77dfb759dbb66ddbb619d736c21a516d06b5ed36aa6ddb984c72628daca0df25490a3915d44ad9545e5635b5c7c1648d266b2c5913c89a4cd654cdc2395a888bc95aae358ada40d6566dc35d64ed216b1f5987c83a46d6099dc4d33a83e7c8baa02b789dacdb64ddd57d7ca88ff899acafb6ece8883ffa27fcdfa931add3624667c6accea6e8dcce23bb888b627117c7322e8b955c156bb826d6713d6ce446d8d42db19ddb636777c6aeee8a3ddd137bbb2ff6777f1ce881b8d55b15bdcd7b147cd677643ff0037ce997f8daaff193bfc841c11843c41fc20ff853f805ff0a7fe1ff2125a60ea93167c88979421ecc17f261c150043b842e3824dcc0db71aa1ca7c7c5b8346ec4cd7107ee8a17f04abc82d7e25dbc1f1fe293f8025f25c3e464643212c72463717c32012725537166721acf26cff165f2013f259fe5ef7ef8ee379982a45f25e595f5bb96d30a5a49ab68b5569be7ceee1cb2bed3602dd61aadf1d66fc20369c10078da0c87834e40011885bf3fdbc6986ddb1af3986d37a6317bc878808cc7c8361f21778f0f02e8e047066a09491959d8147736d56053de545a8d4d4d614b1d36a801fcfda102082ac50dcd0d18549736d561060800a250050d152304146b29d6411d0752103e95af8319e658608915d6d8608b1df638e284332eb8e2863b1e78e285373ef8e2873f010412443021841246381144124529e574d34b1f030c33ca386bacb3c1265b6cb3c32e7bec73c021471c73c229679c73c125575c73c32d77dcf3c0234f3cf3c22b6fbc8bb7f84ba0044ba8844bacc44ba2a44aba64489ee4cbb4ccca92acfe13040fc861000000043b77b56d9b0fac1d3756f5841ab16ddbb6edecf284a73ce725af78cd1bdef28ef704104810c184104a181f08278248a288268658e2882781443ef29f64524927936c72c9a790624a29a7926a6aa9a791665a69a7936e7ae963802146186382296698638165565967d31de24e77bbd7fd1ef4b0473dee494f7bd6f35ef4b257bdee4d6f79c77b3ef09101061a64b021861a66b811461a65b431c61a67bc0926fad14f7ef68b5ffde6777ff8d35ffef68f7ffde77f934c36c554d34c37c34cb3cc36c75ceb6cb0c916279d76769b523280701b8ce278ee96d36edaeed6d69695c66c36b66db918bad6bd7c5fbe61660e710680430c0503c5b1619829a6608281030c4c30c554300073262002a28028869ae1ecbdbce65663e3fcfcd3e6fb9297effdff4fafe875bda5bfd45feb6fb62a5be7b54d4d435d5087dac6b985a66bdac68fca311860544eaa07c29355309525e2ea7339429af2807e95258f6a7aedbbccdd99bb04db4954bbfe44843282a4feaef1b5f14d063210998c6472f1d84db77b30c6ab2723656dbf770ce1614def92d1bcdc325abfda1fdcb47d24832b6faf1e76824ed8997666dd6977d6fd695ae6f4daa3ebb51b991cddb46f2560df06fa3e4cf08adc69de8df06e71efe3fd17d6a6e5ef3c85f94e0a633bb4d3079f65d4737baf1e7e198c65d47fdc8ffb27836783b1f04486a74e079f64e41830071bc6d81731a2ffdc1faf833148c020d470d7df0d950f0db5a7f6958fda634053fbe4112373acbf06982266f8c45cbdc44944b80e240c7957e2a66e8a95c25260129c0a247f0beb072886f362789d15e0bb59299914e484bb741237a5340b7c64889daee39794f7e8408359ad0f85c7dd16fde1048958b5f934e5ecc8dcc12ce5c8c14ea943ec33768cd5334d98d05b382571f93c9832079bfca19972316174698ece2c91e2cc9c127557f8844e50c660d25e992bed94bb05b84a0e504d98e0d32c76fb2cc27aff137721b27f4964ec3a0bbdc1a994012cd091263a74da1356e1bcaa322a660d77c8af3fe916de469426755f6889395aa7133b5c4deff03745f5006309000441b466ceb66ddbb66ddbb66ddbb66d5bd1d9b66def6eff54d8b1fae1ac21b482b0ca8844649c582a3469c84898c0cf6bcd465ea2905fc5a120c5884b19ca92980a542429955572aaa914d4a03629a9abd2525fa5a3214d484f339599892a0b73555696a86cec600fd9d9c701f27048e5e7882ac0714e509053aa30675411ce7181a25c5165b9c603caf1888fd4e4b36ac90f7ed18abffca32d4106ed2d9485a19345b48874b52816856e16df12d2dd525a4a7a5956cb4eef8023f49324f918284d0a3048a21462b04c29cd10ab6db5196675ad2ec3654b7d4658636bca481b6d631863e36c02e3ec96dd62a2ddb1bb4cb2fb769f29f6c81e33d5deda7ba65bb00533cba37a74667b76cfce3ccfe5b998ef65bc0c0bbc9c976761402a16cbaa212c9557b359268196b3c757fa1a8ef846dfc609dfed8739e747fd2897fcb81fe7b25c3ac915d9749aabf2e922d70226f1c0eff93d1efb037fc0137fe48f78ea4ffc09cf24d44b9e4ba9d7bc90546f7929addef34a627de4b5d4facf1b0ff6604228aa6700b1020088827ff3b68a6d3b55aad8b66ddbb6cd32b66ddbb66d1b67df4ddf4f384241044010496a520751a4256d104d7ad20731e4256f104b7e0a057114a18892518c6282e29496a9462da5a6018d9481e63457667ad0475918c020e56434a3958799cc535e16b2528559c31a9564031b548a4d6c5269b6b14d65926653d9a4d9549efd1c55458e73523538cd05d5e61297d590abdc5063ee715fcd79c843b5e4318fd58aa7bc506b5ef341edf9c42775e51bdfd58d3ffc510ffe11ad9ec411afc196ada14ee1941ae9b44eabd14eefac1ae3dcaea9c9aeeddadaeaba6ea56deee44e3ae2c11ea1a31ee5513aed711eaf339ee4493ae7299eaaf39eeee9bae8999ea94b5eece5baec955ea91b5eed35bae9755ea7dbdee42dbae36ddea6fbdee15d7ae03ddea3c7dee77d7ae2033ea6a73ee10486e92aaaae6b0dcLine truncated
|
||||
|
||||
// Static2 returns static file
|
||||
func Static2() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic2Data)
|
||||
|
||||
rawStatic2Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 86444,
|
||||
86444, 172767,
|
||||
"QRL7yZahC6I=", "DRktX7sxVRk=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic30Data = `89504e470d0a1a0a0000000d49484452000000b4000000b408060000003dcd063200005d9d494441547801dcc1d9afb8f95dd8f7d7e7cccf9e192f2c060c59cb928d2851846814255123458a5445ea45a5a65755ef7bd13fa2b7b9e95d2aa5551bb5cd4a131a85d0509600098bc160038ef18217bc8f3de3d97feb39e779f7fb3ccf99df1951763cf690d76b5afc47e4faee3d97cf3eefeac5975d7ef9254f3c73dfddfb5fb6ddbddff5bdfbb3dd7f58d7d7d3d535d7d7fe40c69219b726877198c963638971987123c6692c19cb384d0ee33096c961dc88612c779e304f5c983b779a279f9c8bb7bdad27def6f43cf5aeb7d89e7cb73bdff80d9efc96afe79ddfe689b7bddd7f4ceef843ecfafe038f9e794e9ffcb2bb9ffe54f7bff085b97ef9555d5d537e83711a5f0993dd8cd358721887993c369618871937629cc69219b726877118cbe4304e93dd5806d757dae8f2d1b87fcff54b2fcc953cfc84e557190cf3c41d17ef7ca7a7fee8b7f6d41fffb6996ffe2e6ff9e677bb78ea697f58ddf18748dbe6f2d917bafec8335efef847e7c1a73edbf5bdfb63cb32be1ac692dd8cd358721887991cc68d18871937629cc69219b726877118cbe4304e93dd58c612e334968c659cc612d1f5a5edc5e7dd7be9cb73ef43bfcac54fb878fae9ee7cdb1f9b3bdff59ddefec7ff4c77bef19b672e2efc6171c79b5c5b2e9f7fc1bd0f7eccdd0ffc5a8f3ef7cc7479e5c6f86a1a4b76334e6389f1d84c0ee3468cc38cd3e4b1b164c6adc9611c66f2d8384d7663194b8cd3583296711a4b8cc3582687419beddeabf3e8931f71f9c98fb8ff961f9db77ccbbb7bfa4fffc579f2bbbebb27befe5d331717deccee7893da1e5ebaffd14fb8f7731ff2ea273ea1479796f1b53296ec669cc612e3b1991cc68d1887194b8c5b63c98cd358721887993c364e93dd8c1b314e63c958c6692c310e63991cc669b21bcbe0ead2e5339f9dcb673ecbcffee8bced4f7ebb27bffb7bbdf53bfe9c8bb7bcd59bd11d6f32d7f7ee7bf5e73fe0a59f799fabe75ff2a63096ec669c2687f1d84c0ee33479cd8c25c6adb164c6692c398cc34c0ee3d66437e3468cd35832e3d6e4300e63991cc669b21bcb58629c06d797ee7ff2a3eefffa473df10deff2b6bff0973dfd17bfc7c55bbfde9bc91d6f12bdfa6a5ffe89f77bf53dbf38db8387de34c692dd8cd3e4301e9bc9619c26af99b1c4b83596cc388d25877198c961dc9aec66dc88711a4b66dc9a1cc661c692c3384d7663194b8cd358329671b87ee979affcf40f79f5177ed23bfffc5feee9effd6b336ffb066f06777c8d5ddfbbefee0f7ec40bbff293737dff813795b164c6adc9613c3693c3384d5e336389716b2c99711a4b0ee33093c3b811e330e334796c2c99716b721887993c364e93dd8c1b314e63c958c6692c31f4e8be577ee9dfcdab1ffe79eff8ab7fc153dff5b75d3cfd765f4b777c8d6c9757dd7ddf87e7851ff9f7ae5e7cd99bce5832e3d6e4300e33961cc669b21bcb58629cc692b18cd358721887991cc68d1887194b8c5b63c98c5b93c338cce4b1719aec66dc88711a4bc6324e63897118cba487f7bdf293ef75f7173eeaed7fe56f79ea4f7f8f8b3b6ff1b570c75759e5d1279eedcbffe687e7c1a73e47de7cc69219b726877198c963e334d9cdb811e334968c659c26877118cbe4306ec438cc5862dc1a4b66dc9a1cc661268f8dd36437e3468cd3583296719a1cc6612c93c3386cf75ef4ca8fff0b0f3ffcdedef957ff8b79e25bffa499f1d574c757d1f5fd875efcf19fefe59f7aeff4e8d29bd25832e334961cc661268f8d25c661c68d18a7b164c6adc9611cc632398cd3643796b1c4b8358c18a7b1e4308c65f2d858621c66dc88711a4bc6324e93c3388c657218a7c96ee4f2994fcd0b3ff03f7bf22ffef5def13d7f732e9e7cda57cb1d5f250f3ff7455ffce7ffa6abcf7c71bc198d25bb19a7b1e4300e33398c1b310e336ec4388d25336e4d0ee33096c9619c26bbb18c25c6692c19cb388d2587612c93c3b811c358c68d18a7b164c6adc9611cc632398cd3643796b1a4eb471efcd28fcff5e73ee21d7fe3bff6966ff9e3be1a2ebcc1daf2d24fffa2cfffbd7fe4ea335f1c6f4663c96ec6692c311887991cc68d188719a789711a4b66dc9a1cc661262687719aecc6329618a7b1642ce334961c86b14c0ee3460c6319a789711a4666dc9a1cc6610693c3384d7663194b8cd370f9dce7bcf8affe9efbffe1a7d4e68d76c71be8fafe03cf7dff8f76f7fd1f1c6f5663c96ec6692c311e9bc961dc887198b1c4b83596cc388d25877198c963e334d9cdb811e334968c659cc612e33096c961dc88612ce334796c18314e63c96118cbe4b1719aec66dc88711a4bc6727de9d59ff997aebef4ebbdfdafff5773f1e4d3de2877bc41ae9e79a12ffde31ff0e0f35f186f5663c98c5b93c3388c657218a7c96b662c316e8d25334e63c9611c667218b726bb1937629cc69219b7c612e33096c9619c26bbb18c25c6ad61c4388d2587612c93c3b811e330e3468cd35832e3d6e4c1c7df3fd72f7fd1d7fdcdffa68bafffb6f106b8f00678f089cff8fcfffa4fe7c1e7bf30deacc69219b72687716b7218a7c96b662c314e83b164c6692c398cc34c0ee3d66437e334314e63c98c5b13621c6630398cd3643796b1c4380d2623c6692c390c63991cc68d1806336ec4380d23336e4d0ec3e5739ff7e2bff95fe6f2998f7b235cf80a7bf8b39ff5cc3ff87e572fbcec4d6b2c99716b72188fcde4304e93d7cc58629cc68dcc388d25877198c961dc88c96ec669f2d85832e334981cc66126e4304e93dd0cc612e334968c659cc61283612c93c3b811c358c669629c8611e3d6e4300c66d8eebee0e51ff9df5c7dfee77ca55df80aa9bcf2be0ffbfcbffa67b6fb0fbc698d25336e4d0ee33098c9619c26bbc18c25c6692c21334e63c9611c66721837621c662c31796c2c99711a4b0ee33093c7c669b29b7123c6692c99c1388d25c6612c93c3384d0c63194b4c1e1b468cd3607218c63221bb2eef7bf147fe85871ffb0595af943bbe022aafbeef3f78f6fb7e88ebcd9bd65832e3d624cb905ccb265b31d8302863198489308811839c268f8d2587716b329871480ee34666dc9a1c868be1cec5b8639931c35826bb1937629cc69219b7c612e33096c9619c26bbb18c25c6691c468cd3587218c632398c5bdba5577ffa9f7a4779eb9ffa4fcd8c3fa83bbe02eefef2af7af6fb7e88ebcd9bd6b0d9bcdcb557b62b2f74e96e575edd36f7b66b0fbb7669531eabec0a934329af93c2440ee5908ca5843039540cca6b1291c8a12cc92e65c9e596bb57d7064f3d71e1e9272ebcf3ad4ff886b73ee15d4fbdc5bb9f7eab6f79fa2dbee9e93b2e0c63c98c5b93c338cc587218a7c96e2c6389711a8711e334961887b14c0ee3d6642c5d7bf567fea9b75ff0d477fd657f5077fc013dfcf94f7bf6fffe21ae376fLine truncated
|
||||
|
||||
// Static30 returns static file
|
||||
func Static30() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic30Data)
|
||||
|
||||
rawStatic30Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 29106,
|
||||
29106, 52979,
|
||||
"IJC29t3ww0k=", "YF7BAVFq/1c=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic31Data = `89504e470d0a1a0a0000000d494844520000049e000008a008060000007ec3e84300008000494441547801ecc1ed8e5b67961ed0676f9255928cc1009300c98fdcffade5c72018c0d3ae0ff2f0ec945c698fe4b6e4a2ecd79d6eafb56a5e04000000007e671d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d0000000058a003000000000b740000000060810e000000002cd00100000080053a00000000b040070000000016e800000000c0021d00Line truncated
|
||||
|
||||
// Static31 returns static file
|
||||
func Static31() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic31Data)
|
||||
|
||||
rawStatic31Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 451665,
|
||||
451665, 835006,
|
||||
"NAOKci1bVF0=", "IeoNj5cufy0=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic32Data = `89504e470d0a1a0a0000000d49484452000004da00000864080600000063eb133b00008000494441547801ecc18b925c677626d66fefccac02c0961c636962defff11c0a4bee265097cc93671b848a18340982a8fcbbedbeacb56a3e0a00000000b0a403000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cb3a00000000c0b20e00000000b0ac03000000002ceb0000000000cbLine truncated
|
||||
|
||||
// Static32 returns static file
|
||||
func Static32() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic32Data)
|
||||
|
||||
rawStatic32Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 445696,
|
||||
445696, 816599,
|
||||
"pI58IkopO3M=", "EbA5BPAVGKA=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic33Data = `89504e470d0a1a0a0000000d49484452000005d800000800080600000035f5518a00008000494441547801ecc1e17a5ce77925d8fd7e55055076e6e9247fe6fe2f70ba3bcfb4450055e7ec260159b1255ae641499413afb5a69f0400000000003864050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c050000000000386c05000000000038ec1c00e057d136699334e9d66cdbecb75bbb6d93db966c5bbaddd26d4bb75bba6dc9764bb72dd96ee9b625fbd6de6ed3ed966c5bba6de9b635db6dba6de9764bb62dddb676bb4d6f5bba6fc9b6a7fbd6b4c9be25ed244ddaa44ddba44ddb646fd2266dda266dd3a66dd2a6eda44dba276dda266dd2264dd22669fe4a73c0e48b9a5f47f3a3e66f99fca2e6d7d1fc0d93afd6fca8b943f31726efd6dcaf933f6beed0bcd3e447cdafaecddf31f9bb9a5f47f3059323dafc3a9abf307997e657Line truncated
|
||||
|
||||
// Static33 returns static file
|
||||
func Static33() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic33Data)
|
||||
|
||||
rawStatic33Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 618162,
|
||||
618162, 1139279,
|
||||
"2N083naKpjQ=", "N34lzYP54+w=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic34Data = `89504e470d0a1a0a0000000d4948445200000600000007d80806000000e8f4169d00008000494441547801ecc18b76e4d8796ed9f56d2022c82cc9769f6ef718fdfeef27d95595c98800f6febb4a9279208b3cbc24865c82d69ca95f2049922449922449920ea52149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea72149922449922449920ea7214992244992244992Line truncated
|
||||
|
||||
// Static34 returns static file
|
||||
func Static34() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic34Data)
|
||||
|
||||
rawStatic34Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 601867,
|
||||
601867, 1017175,
|
||||
"Tis6I5ztTXw=", "wYn+4mGWsdc=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic35Data = `89504e470d0a1a0a0000000d4948445200000140000001cc0806000000a4e2710900008000494441547801ecc1d9936de7619fe7f7b7bbfb8c00015024455294495994a8c1922caa4a66c58a24972a57bec86daa92cbfc37b9cd5d2a957212a75caeb02c914c2ccb22458a23388003380004490cc40c9c039c73faf4b8f77af3add56baf5e5f6f28e5b289717fcf130b9aa669b6d082a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db5a0699a664b2d689aa6d9520b9aa669b6d482a6699a2db54bf3a672b972757098d5fe01ddc121bbaf741c1fbecac9e13edddd23560787aef60fd21d1cd21d1de3aa83e552575d5cad70b90479e38491ac25d442219350496443981142256146089b4221bd50845a2864122a896c083342988490bd5dd859909d1db3b3137677585cbacce2da5576ae5d3357af6771f52abbf75ce6f27d7b2cf36e1757afb2b87a2d3bd7af93bd4b346f9e5d9ad79dab8eeee404972bbb83434e5fb89193176e70f2ec0bacee1ea43b3ca63b3ea13b3ab13b3e09ab1533615378338491ac25d44221935049644398114225612483b02914d20b45a8854226a192c8863023844928222e4f61096208831593104692c50eb9bc97c5de2572e9328bab97bcfcc09570ff87d97beffbd8fda5f7bab87295ecee267b7b64b143f3fadaa5795d74a74b972fbf121f7f85a3179ee3e0c5e738bdf16a96afde864efe01e1ad2a8ca497b0291432099544368473918b124632089b4221bd844da19049a824b221cc0861128a309241d81446120a5778b4627574c420e4e419819f30582cb2f3aefbd8bdff012e7ff03d5c7ecf0370ff47dc7dcffbb2d8bb44f38bb74bf35fcc4eba83434f6fdee2f8e9e739fac9931c3ffb62bac3233d3e8dcb256f6b6124bd844d914aa8245209b5c85c28c24806615328a497b02914320995442ae102214c42114632089b4221bd844da19049003b56b75ea1bbf50a274ffe8c3bbb0bb277298babd7d87bdf07bcfce15f67ef7d1fc8cebdf7b1b8769d2c1634ff657669feb375a74b8f7efa14cb1f3c93fd177f9e93e75eb63b380ce7c2db5d18492f6153a4122a8954422d32178a309241a88591f41236452aa19248255c20844928c24806a11646d24bd8140a998449284221ac56b83a64757cc8ead51b39faf1f7c995abec3ef01ef3a10fe49e0f7e944b1ffe288b4b9768fef3ecd2fc2773d5717af3558f9f7c2e771f7e94c39f3c198f4f9809ef246124bd844d914aa8245209b5c85c28c24806a11646d24bd814a9844928229570811026a1082319845a18492f6153a41226a1885442c5a3034e9f7f2a3cff14377990c5de252e7de4a35cf9f58fb1f7cbbfcaee03ef313b3ba1f94fb24bf3ffcb55c76aff2e474f3ecbddeffcc893e75ecae9cd5bb05af18e1646d24bd81499840d8954c28c102a09333208b530925ec2a6c824544211a98419198449c28c0c422d8c24146153a41226a18854c205429824e0f284e39ffc90e39f3dc2cebdf7b1f7cb1fe4cac7fe80bdf7ff0a3bd7ee313bbba1f907edd2bc26974b574fbc9cbbdf7fccdb8f3e92d3976e52846d1046d24ba8854226614322953023844ac28c0c422d8ca497500b854c422514914a98114225614606a11646128a500b8554c22414914a989141188422d4ba15abdb3759ddbe99a3c7becfcebbeee7fa473f962b1ffd5d16efff88d9d90dcd865d9a895dc7e9cbb73c7efce9dcfefa77387df106ddd17190ed110a594ba8854226a1128a4825cc08a192302383500b85ac25d4422193500945a41266845049989141a885918422d4422195300945a4126684300945b8400895d59d57b9fded07b9f3c3efb27bdf03b9fa7b7fece55ffd7576def5ee64b1a039b34b3358debac39daf7d97fdef3d92d3176f82866d1246b296500b854c4225a19049b840089584191984736124bd50845a2864122aa18854c28c102a09333208b550482f14a1160aa984492822953023844928c28c0c422d8c84e343962f1d72e7effe2a070fbc97ab1ffd1daffe937f969d7befa7815db6587772caf1cf9fe7ced7bfcbdd877f8c27a76ca53092b5845a2864122a8954c20542a824cc08a11646d20b45a8854226a192504825cc08a192302383702e8ca4178a500b8554c224a1904a9811c22414614606a1160ae985229c5156375f64ff1b2f66ffa12f72e523bfc5bdffe2b758ecfd3ed9bbc4b6da650b7972caf2b91778f9f30f79fcf89374fb07615b8591ac25d44221935049a4122e104225614608b530925e28422d1432099544368419214c42116684500b23e98522d4422193504964439811c224146146089b4221bd50845a2884d592a39f7e9f93e79ef0cafb1fcdb53ffa6376defbab64f70adb66972db37cfc496e7ded7bdcfede8ff17419b65918c95ac2b9309249a8245209b5c845092319845a18492f14a1160a99844a221bc28c1026a1083342a88591f442116aa19049988422b221cc0861128a3023844da1905e28422d1432097487fb3978fc610e7ffe08d73efa31affeee1f65f783bfcd36d9650bb85a79fcd4f3d9ffec23ec3ff130ddf131c8760b85ac25d4c24826a1924825d42217258c64106a6124bd508473612493504964433817990b4518c920d4c2487aa108b550c8244c4211d910ce45e642116684b02914d20b45a885422661128ad509078f3e9cc3c71fe3eaeffc1a977ffd5fb0f7be5f313bbbe11d6e9777b8d5dd436e7ff11bb9fdf5875dddde0f0d8442d6126aa1904a9884225209b5c85c28c24806a11646d24ba885914c4225914aa845e64211463208b530925ec2a650c8244c4211a9845a642e14612483b02914128ab029143209935044d63c39e2e0bb3fe2e8b1a7bdf25b1fe7fa3ffd531757ef09ef60bbbc43ad0e8eb9f5f51fb0ffe50759be729b2234100a594ba885422a6192504825d42273a1082319845a184928422d1452099350442aa116990b4518c920d4c2487a099b4221933009Line truncated
|
||||
|
||||
// Static35 returns static file
|
||||
func Static35() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic35Data)
|
||||
|
||||
rawStatic35Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 72236,
|
||||
72236, 130951,
|
||||
"nPND9XrJesE=", "cNheqjdSPy8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic36Data = `89504e470d0a1a0a0000000d494844520000028000000448080600000092a660c000008000494441547801ecc1499724d79de6e7df6be131e59c980992050ec52ab14aa7ea48ea85b4d04a1b7d5d6db590b4e9d3eaeaa3627126881999404e119131877bb8bbfd65e9b0085a585ebb3713004100f63e8fa281999999998d4685999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998d4a85999999998dca0433cb8a08982f599e9d514f67d46733eae92ceab3999667d388e94cf57416f574a6fa6c1af574a6faec9c582ea2211635717ece335107b158442c9722a09e2fa05e42f0fd263a823e8932d10806892c29281203824b6290688984604594899ee08268893cd10a92c420d15290250a02449254a1c91aac4d40a0f549a85a1312aa2ad858a7125055a1f50d6973136d6eb1b6b545b5b545b5b98936b7a8b6b6d1e626d5d616dadc626d6b136d6ea16a0d331b36c16cc4eaba66713e677a7a1ab3b3334d4f4e999d9e323b9bc6f4f454e7d329afc5363f9cdc645a1f462c968af992582c55cfe711f38562b120160bc57c19b1982be64b62b120ea101141042c96a21111445d8b3a58891a82ef37f1d5893cf1d58932512612821551267a82e7881714248932055f4d801816412c6b600104d4b5a212202482f91a35a0066b6b686d82d6272c2793a8d6d7a5b53598ac87d6d7a5b5094c26686d2dd6b6a46a3bf8fd8369d46beb5adfdc64736b9bad6bd7d8d8de66ebdab5d8dcbea6ad6bdb6c6c6d2309b3319a60f63d379fcf633e9b697a368de9f44cb3b329b3e994d974ca7a4dfce4fa2d7172c6e4e4946b27676c9e9c519f9c6979721acbb399ead3693c3c9b89a8c555e22af13c3166a227e893784141922892822f2f58115912038217267a822ed11065a21124892cd1505024060425a2a18058c262c933c1822f0401e2199122fe42888e10cf54153fdeda469b9b545b5b516d6d6b6dfb7ae8dab6aaed6baaae5d27ae6f31bf51f1f1ee024d36d8dade8acdad6d6d6e6db1b5bdcdfac606555561f67d35c1ec7b62b95cb25c2ea3ae6b96cba5eabaa6ae6b389d6ae364cafadebed83b60b273101b7bfb6c3f3d607972a687754d433c4f7c41d8cb133d419fc430d11124892229c81219c18ac89248082e8932d11374898618263a822491251a0a8ac48060450c120d3120b824f2444f7041754d7d7a22ce4e5882f882b842b0bec6ed1bb798dcb9cbda9dbb5abb7d97b5bbafa03baf70b036616d6393aaaaa8aa8ab5b5b5585b5b535555545585d977dd04b3efb88880651de7bbfb3a7dfc84e9Line truncated
|
||||
|
||||
// Static36 returns static file
|
||||
func Static36() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic36Data)
|
||||
|
||||
rawStatic36Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 199775,
|
||||
199775, 362450,
|
||||
"oxK4g7NeRzM=", "FZVkJgOjGc4=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic37Data = `89504e470d0a1a0a0000000d4948445200000280000003980806000000453f426100008000494441547801ecc1599324d79de6e7dfeb19b9d5be602308364876b32976cbba4d9a919974a12bdde8ebea561792cc6463a3e9919a4db24112fb5255a82df7352223c2fff20a78263d3d8f9f5305902080789f47d1c0cccccccc964685999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6542acccccccc6ca95498999999d952a930333333b3a55261666666664ba5c2cccccccc964a85999999992d950a333333335b2a1566666666b6544698595644c074cefcf4947a3ca13e9d508f27519f4e343f1d478c27aac793a8c713d5a7e3a8c713d5a767c47c160d31ab89b3335e883a88d92c623e1701f57406f51c821f36d111f44994894630486449419118105c1083444b24040ba24cf404e7444be489569024068996822c51102092a40a8d5660650402ad8e42d58a905055c1da2a9580aa0aadae49ebeb687d83958d0daa8d0daaf575b4be41b5b189d6d7a93636d0fa062b1beb687d03552b98d9b011664bacae6b666753c6272731393dd5f8f884c9c90993d3718c4f4e74361ef35a6cf2e3d14dc6f541c46cae98ce89d95cf5741a319d2966336236534ce711b3a9623a276633a20e111144c06c2e1a1141d4b5a88385a821f86113df9cc813df9c2813652221581065a227b842bca420499429f86602c4b008625e033320a0ae15950021114c57a801355859412b23b43a623e1a45b5ba2aadacc06835b4ba2aad8c6034422b2bb1b221559bc17b8fc751afac6a757d9df58d4d36ae5d636d73938d6bd7627df39a36ae6db2b6b18924cc96d108b31fb8e9741ad3c944e3d3718cc7a79a9c8e998cc74cc663566be2a7d76f89e35346c7275c3b3e65fdf894faf854f3e393989f4e549f8ce3c9e944442d2e139789abc432133d419fc44b0a924491147c7dc182c8921810bc34d11374898628138d20496489868222312028110d05c41c66735e08667c2508102f8814f12742748478a1aaf8c9c6265a5fa7dad8886a63532b9bd743d736556d5e5375ed3a717d83e98d8acfb66768b4c6c6e646ac6f6c6a7d63838dcd4d56d7d6a8aa0ab31faa11663f10f3f99cf97c1e755d339fcf55d735755dc3c9586bc7635677f6c4ce3ea3adfd58dbd96373779ff9f1a99ed4350d7195f88ab057277a823e8961a223481245529025328205912591105c1065a227e8120d314c740449224b3414148901c18218241a62407041e4899ee09cea9afae4589c1e3307f1157189607585db376e31ba7397953b77b572fb2e2b77efa13bf7d85f19b1b2b64e55555455c5caca4aacacaca8aa2aaaaac2ecfb6e84d9f75c44c0bc8eb3ed3d9d3c7bcef8f98ec63bbb31dede65bcb5c7cd1aad8782ba26e6b5a2aec57c4ed435d481fd058856d0275a6298e8089244911464898c00512491105c1065a227e8120d314c740449224b341414890101224b3444427089c8133dc139d112790a98cd981dec323f3a80c70f50b5125415aa2aedcd6be61b9bacdfbdcffadd7bacdfb9a7cdd7df60e3febdd0e64da9aa30fb3e1b61f63d52d735f3b329c73bbb1c3ddfe6e0d973eaed437e32d9d078b2cf6c724a3d39637572a695c934ae9d9d29e673e681b06f8768057d1265a223481283444b4196c80810451209c10551263a823e893cd11124892cd15050240604882cd11009c125224ff404e74443948956401d445dc30c02c40b829baad0fc0c9d9d86769f8bd535c6ebebccaf8f743a5ae1d178959bafbfc1cdd75ee7c6fdd7d9bc732756d7d685d9f7c408b3efa8f97cce7432617f6b270e777674b8bb471c9fc6bba36baa4f4e593d3ce6f6c151cc0f8eb473784ccce634c49f08fb768956d02751263a82243148b41464898c00512491105c1065a223e893c8131d4192c8120d0545624080c8120d91105c22f2444f704e344499680549e22b51136767c4d999383e620e08984a6875959f5cbbcecaf820aadd27d45fded4d36a558fce6a6edebd1b37eedcd5ad7bf7b87eeb76acaead09b3efa01166df11755d333e3de5e4e888a3834366c727bc15abac3ddbd6ad9d3d36b7f662b6bbcffee11104e7847d37886f46b48241a24cc120511020b244432404af4474047d12af20481259a2a1204b6404882cd11009c125e215045da221ca442b7855e25c4d4c27ccf727ccf777446b6575959fdeb8cde8Line truncated
|
||||
|
||||
// Static37 returns static file
|
||||
func Static37() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic37Data)
|
||||
|
||||
rawStatic37Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 198600,
|
||||
198600, 361080,
|
||||
"/LCDp9GGY0c=", "dCj7rbgKSJg=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic38Data = `89504e470d0a1a0a0000000d49484452000002ec000004000806000000ba760c3f00008000494441547801ecc189929c89791dd873b3162c8dde483629d2a4a5b03dd6fb3fca38621cb6249ba2ccb53774632bd49279079d5580d140e68f85a494a4be73d2678c31c618638c310ed2ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e360ad8c31c618638c310ed6ca18638c31c618e3601d1b63fc45e86643afba393fd7f38bf4e2dce6e25c2fcef5e25c2f2fba397f9a5e5ce8c5b9cdc5b95e5c74737e9e5e5eeafaaad657d18d6e36bad9b0dee866c366d36e36bad9c466ad9b0d9bd28dadda235ea8372bf5b2f89e7ab37a49ec54ea0dea995854cb1adfa905b520b6eaadb45e11afa937ab1bb14bebcdea46ec556fd4c6a27a83506f566a97f89efab7b55ac96ac5d14a562b8e56b55a591dad62b592d58aa395ac56ac56cdd1919c9c6475fbc4ead689d5e92db975dad5add3ac6e9f5add3ab5ba754b6e9d7675fb34abdba756b74e1dddbacdad135691c418e3b01d1b63fc9b69ebeaf2b2971717b9bcbce8e5f9792e2e2e7a797e9ecbcb0b97e7172e2ece5d5e5cf8c9bd95bfb97792f33375b9e6f2d2e6ea4aafae6a7d995e5da557977575955e5dead595cdd5a55e5d71b5d1cd556c36b4da4db5ac375ad1a6ddb0a976434bebcf21a83d825a16d48d227609ea4d8a786f298df757c4fb2be2fd15f1aa84d661086a59507f1d5aed46d6d596cd2656b1b95a35abe86a459e59853cb33ae2f8c2e6e991d5c9911c1fcbc97156c7277572949c1c5b1d9fc8c9b19c1ccbc9b1d5f19193d51deb1cfbdf175fba3ad2935bb7727a7aeaf8f4d4e9ad53a7b76e393e3d717a7acbe9ad53c727278e8e8f8d31fe6d1c1b63fcd9b4f59db6369b8d5ed35670926475fe34274f9f383a7b94d3278fdd79f2389bb347dd3c7992f5d9637df2d8fac963ebb3c7beb83867b389e7ea99c4ff15df17b54b3cd778aede55115b412d0b4a50dfa96bf14250cb82ba51c4f70425a83d827aa6889d825a964aa3f6886bb54749a8378a6bf5b2225e086a5950378a7855426bbfb8d622760a6a51526d2c0a6a8f2204b55f503b1471305ad655df597baec4bb89ef8b97851c1df9e483bb561fdcc9d107771dddbbdbd507777374efaee37b77adeedd7574ef8edcbbdbd5dde66abdb6a64924916b9248228931c69fc7b131c69fcdc5f953eba7679e3ef8d6f9c3073d7bf06dce1f7eebe9c307bd75719e9f9f9e586f2ead3757acd7ed7a1deb2bddacd3f59af5babdba4ad76bdd6cd86c7c4fd022f60a6abfd45623a81d82daa3aec55b094a50cf15f14250cb82ba51c4f7c4564aed11d43345ec14d4b2541ab520a83d4a422d0b4a502f2be29d0475a3885725b496052d62a7a01625d5c6a2a0f62842507b25b65aaf28622ba8bf7ea5ebb5f5e327d64fcf5d7df3b0393e92a3951c1fcbd111c72b393aaae3a39c9e1e79d44d7fbfb9caed8f3f72e7e30fddfef823b73ffed09d8f3feae947f77272e78ee3e363638c3fbd63638cf7b6d96c9c9f3d71f6f8b1278f1e393f7be2ecc913e7674f9c3d79ecb35b477e76f7d4d1d9993b4f9fe4d6d9139ba767dd3c7d92cdd3b33e7efa34ba712df1baa865418bd82ba8b712d40e412d0beacd8212d41f21a81b45ec12d41e413d53c44e412d4ba551efab24d4b2a07628622ba87754c4ab125acb8216b153508b926a6351507b1421a8f750c456507ffdLine truncated
|
||||
|
||||
// Static38 returns static file
|
||||
func Static38() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic38Data)
|
||||
|
||||
rawStatic38Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 243277,
|
||||
243277, 454847,
|
||||
"SE/ey5N6BL8=", "kuHZLnjTc/4=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic39Data = `89504e470d0a1a0a0000000d49484452000002ee0000050e080600000022feb6c600008000494441547801ecc1097b24879966d7fb061228d4ce55524bad6e8ddb2ddbcf638fffff7fb0c7e3e95964b5ba25922259fb0214b6cc8cfc9c84b2a028544646902c8a41f29e935a43922449d2a435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d9224499226af41922449d2e435489224499abc064992244993d72049922469f21a244992244d5e83244992a4c96b9024499234790d92244992266f86a41f8c5a155c2c682fce595dcca98b79adce1759cd2f589dcf599d5f50f305ab8b8b5a5dcc53e773561773561773ea6251b56aa9aab02a6abe80d58aafacda15b46d55db86b56a57d4b285d50aad856b8a6d12c6091b45af304a528c167628ae8441612df428ae8471c2164557580be385b5a257181436528c12462808fd12d23464b60f096902b3bd4a9ad0345c9aedd1cc662440d314b3599afd03727058cd8d8334376e90830372704073e390dcb8410e6e547370901cdca0393820370eaab97108cd5ed690347d33247daf56ab15edb2adc5629ef9f9452d2e2e32bf98d77c7e91c5c5bce6171759cce7b05cf19bfd0fb809cc57a7ac960b6ab14a2d97558b656ab164b558c0b2add562915ab4b05cb05a2cab166d6ad9a6562d975645b56d51c5576ab50aab4aad567ca5da1554a1b5f01d29fea6c23b13fe168a6f25bc3b29de9d62480aa882b68526d48ab555a02912be92b6c96ab120816a9aa469a8bd73323b67b53f23fbfb64b6476633323b20fbfbb0b747f6f7c9de8ccc6634371a0e6e91cf5ece7976ba62b6bfcf6c7f9ffd83030e0e6eb07fe3a00e0e6e64ffc60d0e6edc60ffe0a0f60f0eb286a4efc70c49dfa9aaa2aaa82aaa8afa0baa8aafac96cbecb795d9c9291c9f66f6ea84fde393dc3c39abf6f824edab53da93d35a9d9ee7e5ab539e5f2ca056748437853785ed82760b5b14db248c13d68a9dc22849314ad8a1b81206250c282e85f1c235c575612d8c13368a5e6150584b315ad8a1b8127a85af145451ed0a5afe620105e15271255c17b6095f09578ab590869bLine truncated
|
||||
|
||||
// Static39 returns static file
|
||||
func Static39() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic39Data)
|
||||
|
||||
rawStatic39Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 242397,
|
||||
242397, 441958,
|
||||
"lm63cKs0Xqk=", "pVRRcqjc4rk=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic3Data = `774f464600010000000151ec0012000000029dd800010001000000000000000000000000000000000000000047444546000001940000017300000262b442b08247504f5300000308000030550000652ef96e4b86475355420000336000000b7c00001590eb82e4594f532f3200003edc00000052000000609976b1d8636d617000003f300000094d000012460177581e63767420000048800000005a0000005a060d2e3d6670676d000048dc00000133000001bc83fb23ab6761737000004a100000000c0000000c00080013676c796600004a1c0000ee5c0001e11856870d0568646d780001387800000190000005188ea1a0b26865616400013a080000003600000036fd0dd2526868656100013a4000000020000000240b5d0aef686d747800013a6000000a9d000014385e93d1a16c6f636100014500000009c000000a1ec06e41d36d61787000014ec00000002000000020073e02e46e616d6500014ee00000021a000004604e5147fa706f7374000150fc0000001300000020ff6d00647072657000015110000000db0000013899c4144378da0dd0030c584b0005d17b77dfb759dbb66ddbb619d736c21a516d06b5ed36aa6ddb984c72628daca0df25490a3915d44ad9545e5635b5c7c1648d266b2c5913c89a4cd654cdc2395a888bc95aae358ada40d6566dc35d64ed216b1f5987c83a46d6099dc4d33a83e7c8baa02b789dacdb64ddd57d7ca88ff899acafb6ece8883ffa27fcdfa931add3624667c6accea6e8dcce23bb888b627117c7322e8b955c156bb826d6713d6ce446d8d42db19ddb636777c6aeee8a3ddd137bbb2ff6777f1ce881b8d55b15bdcd7b147cd677643ff0037ce997f8daaff193bfc841c11843c41fc20ff853f805ff0a7fe1ff2125a60ea93167c88979421ecc17f261c150043b842e3824dcc0db71aa1ca7c7c5b8346ec4cd7107ee8a17f04abc82d7e25dbc1f1fe293f8025f25c3e464643212c72463717c32012725537166721acf26cff165f2013f259fe5ef7ef8ee379982a45f25e595f5bb96d30a5a49ab68b5569be7ceee1cb2bed3602dd61aadf1d66fc20369c10078da0c87834e40011885bf3fdbc6986ddb1af3986d37a6317bc878808cc7c8361f21778f0f02e8e047066a09491959d8147736d56053de545a8d4d4d614b1d36a801fcfda102082ac50dcd0d18549736d561060800a250050d152304146b29d6411d0752103e95af8319e658608915d6d8608b1df638e284332eb8e2863b1e78e285373ef8e2873f010412443021841246381144124529e574d34b1f030c33ca386bacb3c1265b6cb3c32e7bec73c021471c73c229679c73c125575c73c32d77dcf3c0234f3cf3c22b6fbc8bb7f84ba0044ba8844bacc44ba2a44aba64489ee4cbb4ccca92acfe13040fc861000000043b77b56d9b0fac1d3756f5841ab16ddbb6edecf284a73ce725af78cd1bdef28ef704104810c184104a181f08278248a288268658e2882781443ef29f64524927936c72c9a790624a29a7926a6aa9a791665a69a7936e7ae963802146186382296698638165565967d31de24e77bbd7fd1ef4b0473dee494f7bd6f35ef4b257bdee4d6f79c77b3ef09101061a64b021861a66b811461a65b431c61a67bc0926fad14f7ef68b5ffde6777ff8d35ffef68f7ffde77f934c36c554d34c37c34cb3cc36c75ceb6cb0c916279d76769b523280701b8ce278ee96d36edaeed6d69695c66c36b66db918bad6bd7c5fbe61660e710680430c0503c5b1619829a6608281030c4c30c554300073262002a28028869ae1ecbdbce65663e3fcfcd3e6fb9297effdff4fafe875bda5bfd45feb6fb62a5be7b54d4d435d5087dac6b985a66bdac68fca311860544eaa07c29355309525e2ea7339429af2807e95258f6a7aedbbccdd99bb04db4954bbfe44843282a4feaef1b5f14d063210998c6472f1d84db77b30c6ab2723656dbf770ce1614def92d1bcdc325abfda1fdcb47d24832b6faf1e76824ed8997666dd6977d6fd695ae6f4daa3ebb51b991cddb46f2560df06fa3e4cf08adc69de8df06e71efe3fd17d6a6e5ef3c85f94e0a633bb4d3079f65d4737baf1e7e198c65d47fdc8ffb27836783b1f04486a74e079f64e41830071bc6d81731a2ffdc1faf833148c020d470d7df0d950f0db5a7f6958fda634053fbe4112373acbf06982266f8c45cbdc44944b80e240c7957e2a66e8a95c25260129c0a247f0beb072886f362789d15e0bb59299914e484bb741237a5340b7c64889daee39794f7e8408359ad0f85c7dd16fde1048958b5f934e5ecc8dcc12ce5c8c14ea943ec33768cd5334d98d05b382571f93c9832079bfca19972316174698ece2c91e2cc9c127557f8844e50c660d25e992bed94bb05b84a0e504d98e0d32c76fb2cc27aff137721b27f4964ec3a0bbdc1a994012cd091263a74da1356e1bcaa322a660d77c8af3fe916de469426755f6889395aa7133b5c4deff03745f5006309000441b466ceb66ddbb66ddbb66ddbb66d5bd1d9b66def6eff54d8b1fae1ac21b482b0ca8844649c582a3469c84898c0cf6bcd465ea2905fc5a120c5884b19ca92980a542429955572aaa914d4a03629a9abd2525fa5a3214d484f339599892a0b73555696a86cec600fd9d9c701f27048e5e7882ac0714e509053aa30675411ce7181a25c5165b9c603caf1888fd4e4b36ac90f7ed18abffca32d4106ed2d9485a19345b48874b52816856e16df12d2dd525a4a7a5956cb4eef8023f49324f918284d0a3048a21462b04c29cd10ab6db5196675ad2ec3654b7d4658636bca481b6d631863e36c02e3ec96dd62a2ddb1bb4cb2fb769f29f6c81e33d5deda7ba65bb00533cba37a74667b76cfce3ccfe5b998ef65bc0c0bbc9c976761402a16cbaa212c9557b359268196b3c757fa1a8ef846dfc609dfed8739e747fd2897fcb81fe7b25c3ac915d9749aabf2e922d70226f1c0eff93d1efb037fc0137fe48f78ea4ffc09cf24d44b9e4ba9d7bc90546f7929addef34a627de4b5d4facf1b0ff6604228aa6700b1020088827ff3b68a6d3b55aad8b66ddbb6cd32b66ddbb66d1b67df4ddf4f384241044010496a520751a4256d104d7ad20731e4256f104b7e0a057114a18892518c6282e29496a9462da5a6018d9481e63457667ad0475918c020e56434a3958799cc535e16b2528559c31a9564031b548a4d6c5269b6b14d65926653d9a4d9549efd1c55458e73523538cd05d5e61297d590abdc5063ee715fcd79c843b5e4318fd58aa7bc506b5ef341edf9c42775e51bdfd58d3ffc510ffe11ad9ec411afc196ada14ee1941ae9b44eabd14eefac1ae3dcaea9c9aeeddadaeaba6ea56deee44e3ae2c11ea1a31ee5513aed711eaf339ee4493ae7299eaaf39eeee9bae8999ea94b5eece5baec955ea91b5eed35bae9755ea7dbdee42dbae36ddea6fbdee15d7ae03ddea3c7dee77d7ae2033ea6a73ee10486e92aaaae6b0dcLine truncated
|
||||
|
||||
// Static3 returns static file
|
||||
func Static3() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic3Data)
|
||||
|
||||
rawStatic3Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 86508,
|
||||
86508, 172895,
|
||||
"lo9ACzCn7P0=", "4kMsZBpJZmI=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic40Data = `89504e470d0a1a0a0000000d4948445200000300000003ec0806000000f207db7700008000494441547801ecc1697724e97de6e7df1d99480005a0f65e2952a496f191bce81c7fff973e7e618f3d96662451a4d44bed1bf625f7f83b0806528144443c8fc466b3aaf3be2e45053333333333db08056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661ba3c0cccccccccc36468199999999996d8c023333333333db18056666666666b6310acccccccccc6c63149899999999d9c6283033333333b38d516066666666661b6388997dd222020594e329e574ca7236252673623aa79cce584ea6c47446cc6694d35994d399623a65399d11d339319d47944b224294c07c4e2c97fc4e94412c97118b85a84419c46201650981dd106b823612f94425e825b2484136d123581149a2263a042b228f681134899ac8236a412791246a0ab2880cc135d1492ad06000c321085414a1e140a80089dfd1d6100d0648405104c3a18aad111aed44b13d52b1bd8d4623341a518cb643a36d6934a2d81ea1d136da1a85b6471aec6c43b1858a0233fb740d31b38fd262b160b958309bce984fa7cc673366b359cc6733cda653e6b3198bf982fdd8e257a327cc96972c9613cac502664b62b1a45c2c88f99c72be80f922caf942b158c07c4eb95844cc978af95211254440402c974159f23b510694a5a22cb9560644406037c40f4fa4891f9ef8e1890ec18af80304adc47f50f08350f08313094194255a2e4110652928010512d7caa5a2289000490c06c4608a8613caad2d8aad2d180c42c3a134dc92b6b6d0702b341c88e1161a0ea5e120467be874bee4fba319c3ad2d86c32d065b4346a36db6465b8cb6b7d91a6db3351a311a8dd81a8d2806032461661f8f2166f6518ac582c164c6e8e28ac1f9255b17976c5f5c69797ec9f27c1ccb8b0b2dc713cacb31cfcfaf88e51222e8216e13ed84e5112d82361279442de824b24941169110ac8824891ec18ac827d604eb4445e41395a09748121505d9448f6045f412bf13104b62b1e446ccf81d712d5811ebc4bf1337c4ef885b42486834e2cf76ef51ecec50ecec52eceec6e0debe8abd3d8abdfd28eeeda9d8db63c001c55601518084997d3c8698d98f6e7c79c5e26acce4ec9cf1d939e3b33326a7178ccfce995e5c30bdb88c5f1c3cd4c3ad6d62be20e60b62b98c982f158b05b1582a168b88e552b15812cb2544603f22d122682391261a824e229b14641109c18a4892e810dc22f28935c13a511169a221e8259244454136d1235811bd444524042b228f68115c8b80f99cb2bca09c8cd1e02c180ca4c1100d07683894065bc170200db6d8ba57c6d932f4e252b17370a0ddfdfb6c1f1cb07370c0eec1fdd839b8afc1f6766c8d46c2cc7e3443ccec0715112ce68b984ec69a5c5d31b91ac77432d16432613a9e301d8ff96a6b97875130b81cc7eed558a38b310797572c2fc72cc79328af26e2ed05574193b84dd89f866811b49148130d4127914d0ab288846045244974086e11f9c49a609da88834d110f41249a2a2209be811ac885ea2221282159147b4086e884a591265098b3901e22e519b16d2606b8b5f6defa8985d525c9da1f37b31b8774fc5bd3d2d76f7e25fcf2f3591d8ded9657b6727b67776b5bdbbc3ceeebdd8b9b7abed9d5d2461663f9c2166f6c38a60382b555e4ce0fd0983a313ed1c9f71eff48cc5c919cba333cad99ca3654945dc25ece3251a8236a226d24443d0496493822c2221406493e810dc22f28935c13a511169a221e8259244454136d123b8269244457408ee1079448be086681069022288d98ce56ccaf2fc949af8777a3cdaa2d8dd63f0e02183fb0f34387818c3070f193c7aacad2dd0ce0e11200933fb610c31b3ff94c57c11f3f15893b3f3b83c3cd6c5d1119787277c3619b23f8f98cece55ce6611b3b9cad99c982f22667395f3399425f609120d411b897ca221e82492444d4116911020b24974086e11f94443d046228f68087a89245151904df408ae892451111d823b441ed122b8212a229f68083a0962b1a41c5f12f3592c4f8fa5e148dada42a311c3dd21a3bd82679705b3ad7dee3d7ac4dea3c7dc7bf838f61e3d96864386c32166f61f33c4cc7acde7f3984d26ba3cbf607c79c9f8f292f1e5154f07231d2c155c8db57d76c1f0f49cfdb30b96a717713a9e28164b2ae2df09fb748986a08d443ed110741249a2a6208b480810d9243a04b7887ca221682391473404bd4492a828c8267a04d74492a8880ec11d228fLine truncated
|
||||
|
||||
// Static40 returns static file
|
||||
func Static40() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic40Data)
|
||||
|
||||
rawStatic40Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 252229,
|
||||
252229, 443775,
|
||||
"JjbH5uyi5SI=", "PxqXshKz6HA=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic41Data = `89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff6100000002494441547801ec1a7ed2000002f5494441542dc14d689c551480e1f7def9ee4c7e6a930c8d9a1447512aad92fa035584d68516110a5310eaa62bbb510b8ae822e84610c1c69592aec42e8a0b372ed2080aa250248aa042a5d22ada1012a9689be94ce3cc7ce7dc7bbe6b167d1ec72d6b2f2dceda787f1e68032d5cf6bea870c1f0a1c21756b960eb3ed8e7b59dfd53b79f387d956d8e6dabafbf7f30bbea1cd03432d7b3a22e8137f046f6891032adc9827a23e383ddf085b5779df870c5fdf9c6a959071781e6956ac84fb1cb3045524a98252c19658cf4ca9280d1ded7e4d0fd13b8609d5a11e70a07f340f30f1bb0a21d528c9825524a5832cc127d514484ada87cf45d0ff3333cbd7faa49c1bc07da89cc0f650751a5b2c49b47eee6f89333dc360a4311066589882022880867ceaf925cc4d5aded81d6bf55c94d2d115506226c5e13e6a677f0d6b1bd3c776837356f880a228aa870bd3be0f2df5d6ac15ade15952f9d22aa94220c4ae1dd2f2ff1f1d757e85d130e3f30c3e22b4ff0ece3bb1115440451a1371ce2ebe6bd0f46e512a28a444554198af0cde5bf78f5ecf77cf2d5eff821bc7c648e50cb880a224276091f8cc2070349882a3146628aa4188931d17030966a84be27fb4c590a228aaa927dc207a3f0c1c83ea1aa688cc418b194786afa4e8e3fb88789a9069bff0cf9e0b31fd9ec6d1135a251c92ee18251b8ba55a38dec45158d919c12efdd7580fb9a13c48171f6b78b9cf9e502ddfe008d4a8c11556572d2e3eb56153ed8fabdd38d7b8233fe538154b18b11beddd86071ed67d66e76508d685454231a951da370e0e19df8a25af7ae6ecb8d91ccb147ef4054d92a071cbdb0c4fca5f3ac763729451011440451415579e7b57d8c8d032e2ffb50ab167c489dc3fb9b9c7ca645a356514a8988202a8828a28288323e9239fdf643bcf07c0b1c1d7c5e706cbbf1e9c983ae96cfb95035638efcbad1a13b2cc92e814b646f4c4d7a1e7b6492b171c7b60e70d4ed5d5a71dcd25b7a71d61736ef83b55d51b57c30ef82e143852b0c1faacad56c1ddc32355d707bbeb8cab6ff01f23ad711d68e17be0000000049454e44ae4260821f8b08000000000002ff003c03c3fc89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff6100000002494441547801ec1a7ed2000002f5494441542dc14d689c551480e1f7def9ee4c7e6a930c8d9a1447512aad92fa035584d68516110a5310eaa62bbb510b8ae822e84610c1c69592aec42e8a0b372ed2080aa250248aa042a5d22ada1012a9689be94ce3cc7ce7dc7bbe6b167d1ec72d6b2f2dceda787f1e68032d5cf6bea870c1f0a1c21756b960eb3ed8e7b59dfd53b79f387d956d8e6dabafbf7f30bbea1cd03432d7b3a22e8137f046f6891032adc9827a23e383ddf085b5779df870c5fdf9c6a959071781e6956ac84fb1cb3045524a98252c19658cf4ca9280d1ded7e4d0fd13b8609d5a11e70a07f340f30f1bb0a21d528c9825524a5832cc127d514484ada87cf45d0ff3333cbd7faa49c1bc07da89cc0f650751a5b2c49b47eee6f89333dc360a4311066589882022880867ceaf925cc4d5aded81d6bf55c94d2d115506226c5e13e6a677f0d6b1bd3c776837356f880a228aa870bd3be0f2df5d6ac15ade15952f9d22aa94220c4ae1dd2f2ff1f1d757e85d130e3f30c3e22b4ff0ece3bb1115440451a1371ce2ebe6bd0f46e512a28a444554198af0cde5bf78f5ecf77cf2d5eff821bc7c648e50cb880a224276091f8cc2070349882a3146628aa4188931d17030966a84be27fb4c590a228aaa927dc207a3f0c1c83ea1aa688cc418b194786afa4e8e3fb88789a9069bff0cf9e0b31fd9ec6d1135a251c92ee18251b8ba55a38dec45158d919c12efdd7580fb9a13c48171f6b78b9cf9e502ddfe008d4a8c11556572d2e3eb56153ed8fabdd38d7b8233fe538154b18b11beddd86071ed67d66e76508d685454231a951da370e0e19df8a25af7ae6ecb8d91ccb147ef4054d92a071cbdb0c4fca5f3ac763729451011440451415579e7b57d8c8d032e2ffb50ab167c489dc3fb9b9c7ca645a356514a8988202a8828a28288323e9239fdf643bcf07c0b1c1d7c5e706cbbf1e9c983ae96cfb95035638efcbad1a13b2cc92e814b646f4c4d7a1e7b6492b171c7b60e70d4ed5d5a71dcd25b7a71d61736ef83b55d51b57c30ef82e143852b0c1faacad56c1ddc32355d707bbeb8cab6ff01f23ad711d68e17be0000000049454e44ae426082000000ffff`
|
||||
|
||||
// Static41 returns static file
|
||||
func Static41() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic41Data)
|
||||
|
||||
rawStatic41Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 828,
|
||||
828, 1676,
|
||||
"DPkhEZBiqsE=", "H8/B3536RVw=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic42Data = `89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000002494441547801ec1a7ed20000088f4944415475c17f8c1f747dc7f1e7fbf3f95eefae772d2d5ccb15ac146da1562824c20601ff8066dd48466cf6c76066595087f3afc51f1813e71f6cd9d6984c139739ff80cc3fb63813ff5807d9af661b733361b52a829ba2b4883da087a5bd96f6aef7fd7edfafd77b756bb20bc1c723f8398e7fecb353441d888afbabd5edc076608a9f098866a215d10a7a11cd442fa215d1bc1abd16a2eb5b044fc40487b6fdeec155de42f0263ffce4c1b6eefcecc39e597e1498e7cd02a2996845f48266a215d18b68267a412ba215d14db422ba17dbcccaa36d34f9d8dc473e67d608d678e9a39fdbac965f256a3f6f258a6845f4225a4133d18b68453413bda015d14db4225a11ddd08a6845741f6e13f9e0dc07fe7489cb82cb5efe9d2f6e1ece9e7f0ab88537b950e2d55ae59c478c10554561c0140598aa625c223073d3036ebc6a9aab663ad10a7a11cd442ba2d5b38396f76c7ae8cf96b824b8e47b9ffae3b67edcff81a8fdac71b69267749e577411db948dcb948d5d5419db948dab58198f59192792b0c40d574d7360cf1cd76c5a47f4225a11cd44f7e17583d5fb661f7cdc8d4bd6677b98a8fdac71cc17f9fbf1eb2ce40a2991122991295222958c53a4444a6426c371a24c249112df3b798e3ffc9717f8c68f4f13cd4437f482c6fe8c8987b9248e3f72708a8a1f03f35cf68257787a7c16dbd8c636b6291bdbd8a6cad8a66cecc265ce0d47484212b2908c2564f1c1bbaee5de3d574237d18a68b5d87a5ddfa83800cc73d9528df9cfd15952222552421292b0454aa444a64889944825c371929948892494424a5249a678fceb2f716269996845f422bae76975a015dccf1a47c7e71849484212924889f7dfb9953ff88d9dfcfa7be7d930dd48894c314e9112c31c23894c914a522253a48494ac8ec67cf9eb3f217a11cd442f68be7f10703b97bd51c989f10a92b08d6d6cb369aaf3eeb9191815efb96e237b776ce05f9ffb29ff74f4242be3c42e46e3249548c612b290846424218ba32f9ce6e4b915ae9d9b249aa1d7ed0dd8cecf042c688594904c4aa4444a2c0fc768b560040c8b0905bf7ceb3cbfffd04ddc75f31c2e31ca4429a42495648a944825a9442952e2e80b678866e845b47a5b03a688229a39ad2129911692908424ce5d1cf2e52327583a3ba68650c3a28666b60ff8ad7dd7f3e807f772f33bae202532454a488952484212a9243379f1b5f3442fa215d13d3d208ae845b462d56324611959d8c63696387ae20ccf2c9c61df0d5bf8959bb631bdbe830b3b78db15337ce6376fe53bc75fe7f127becff197cf220b49484232b2b0c4f995117413ad8856f48fbe77dfa3d18ae8e6472b17786d7515d9584236b2908c6dc6299e5f3ccbbffd709109821d9b67695c524005d75cb59efbee7e3b93939d6ffed7abd846129290846caedf36cdbedbe6885e44372d9a896ea2152e230949a4842432454aa4442a4989a5e555fee23f7ec427be728423cfff1486c0a8a811b471f0c03dbbb872e32499494aa4444a64262e11dd4433d18b41f4225a11ddb88424646309d9584236b6b08d656c638b13a7dfe0e013df61e7d51bf8f0be7773c3db37510e300c0252c212b2908c245c227a11ad886606d18b68265ae13229611b49d84232b6b185646c611bdbd84636d7ccae676e729a1a42b8c0a014522219494842162e13ad886ea2158368267a41332e210959584616969185656c211bdb5866cfdc267efb17f7b073fe0a1804ac42194ac5b9e58b640a5958461292b0457413ada09941f4229aa1172e230949c8c61692b185646c219b2deb267968ef8ddc75dd365807b50aa88809b87071cc17fef928a7ce5e40329290852424e312d18ae886560ca21b5a11ada81229610bc948c216b2b1c43a1a0f5cfb4edeb7e37ad64d366a5850012e4ac593cf1ee38bfffe6d4e9d5f4612b29084642c218bc24437b4227a31a015d14db462b2079290842d24230bcbdc31bb850f5dbb9b2bd74fc1180a0803557cf7e4293e7fe49b7cffb5534842169691842c242109c9ccae6f442f68265a3188eed5683515bdb87a76024948421692b1c50c9d8f6ddd4b7750c3221c60585c5ee6cf9f7f86c32fbd882464211949c84212929185242c71c38e1968267a11ad2e0ea27b215aed8a56ec999f41cf0849c84232b298ec033a01020cab99fcf58b3fe02f5ffa6f56c64324230949c8423292b085242421195becbb6b0bd18b6845342f0c5aafa344ed8a5ecc6f9c60f7d6f53cf7ca5952421296786534e2c81b8bfcc2c6ab79eaf4025f5af82e272f9e272524210959584612b290846464210949dc7bc716de79dd7aa29b6805c4b706d1ea495abd3f9aa1170fde760dcf2d9c41296c2199b4f8f4f16fd00a56738c2524210bc9484212b29084646421094bc8a6b7e28f3e7113d14db4e27f453dd9e83a145d8bf4229ab96ecb140fddbd1d59648a54a24c52e2e2788432498994c814a92495a444a690849428852452c2169ffff42ddcbc7b03d18acb16a938d4ffe4ef9ece4fbdef8e0bf4fad5e845b462e7b66936cf0c387aec34e3142921095b484612b2908465642109494846169290c4c420f8c2676ee5430fec205af1ffea91d87de8c8804bd60d078f8d360c7f2d1afba39968c57defd9caeeedd37ce91f8f71e4f9d79184246c230949c842129291842c246109d9dc7be7560e3e72137bdfb511a258e3301bfa635c125c76f6af3eb2d96df054b4ba255a4133d18b68c5cb679679fa07a738f6ea1b9c5f19219b2ae1322e53655ca2301b663a37be63965fba7b2bbb76cc10bd208a359e652aee891d7fb3c425c11a4b5ffbf0e6a07d95c6fe68453413bd8856d08ae8265a11bd88666845f4229a8956442f68265a11bd885610c51a87e9f560ecfadb252eebacf1d9af7d7bf5f70edcf99598cc93d1ebb6e8351bada09be845b422ba8956d08ae8453413bd885ed04cf4227a11cd10fc9f60913e7c8489898fc7ce43175923f839969ff8c054f5762082fb99d06d11b53d069e8e56442f68265a11bd8866e845b4225a11ddab100bb4388afc248d4371e3a155dec2ff00dfa73e454fefc9e80000000049454e44ae4260821f8b08000000000002ff3c95695892e91ac76935b70c104ca951f0c58672296bd472d49140c16c192a53329752a419d44c2d05973986c5e206a9b96be8988deb98329a83e3aee5829c396e17a88d2b93a679a45c9373c15cd7f9f07e783fdcf7733fffffeffe3fec2b975c75b58cb44020902e91802381402013d577603f08040aa7d3152010683711e77c2d6ad7a251dcbf41a003a9aabfc8d6f824e388d8ee95f9add50d9fe5aa871616debdb00afde0e71e5f036dfb77297fa28c135c689fbbfd285e579eac56771a1f86ce1bd3c686b3dca1cfce2a7fea7312da41959e1a63d5Line truncated
|
||||
|
||||
// Static42 returns static file
|
||||
func Static42() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic42Data)
|
||||
|
||||
rawStatic42Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 2262,
|
||||
2262, 4501,
|
||||
"JVvuSLfkSks=", "XLf8MwS0lvM=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic43Data = `000001000500101000000100200028040000560000001818000001002000280900007e040000202000000100200028100000a60d0000303000000100200028240000ce1d0000404000000100200028400000f641000028000000100000002000000001002000000000000004000000000000000000000000000000000000000000000000000067b0f11a64b4f39161b9f5df5fbdf6fd5cc2f8ff59c7f9ff57ccfbff54d0fcff52d5fefd4fd8ffdf50d8ff914adbff1a0000000000000000000000006aa7ef3c69aaf0ed67aff1ff62aeecff5091c0ff4888b0ff4489afff408aafff3d8caeff3f9cbfff4fcdf5ff50d8ffff50d8ffed50d8ff3c00000000729aed1a6ea0eced6ca5eeff5279a7ff2c303eff22212bff1d1c25ff17171fff121119ff0c0c14ff07060eff07101aff32829eff50d8ffff50d8ffed4fdaff1a7497e891729beaff5a77aaff34333dff2e2d37ff2a2833ff24232cff1e1d26ff181820ff13121bff0d0d15ff08080fff03030aff32829eff50d7ffff50d8ff917791e7df7393e3ff434555ff3a3944ff383544ff7a58e4ff644db5ff312d48ff1f1f28ff1a1922ff14141cff0f0e16ff090910ff09121cff50ccf5ff51d7ffdf7a8ce5fd6c7ec1ff464450ff413f4aff3d3b49ff7258d0ff816af3ff7e72eeff555496ff252533ff1b1a23ff15151dff101018ff0a0a12ff429cc0ff53d3fdfd7d86e4ff6d77b8ff4c4a57ff474551ff42404cff3e3c49ff56518bff7b7ce6ff828df5ff798ce2ff444f72ff1c1c24ff17161fff111119ff408cb0ff56cdfbff8081e2ff7175b9ff52505dff4d4b58ff484753ff43424fff3f3d4aff3f3e51ff616da5ff82a3f3ff84b0f7ff292b37ff1e1d26ff181720ff448bb1ff59c8faff837ce0ff7573b9ff585664ff53525fff4f4d5bff4a4856ff454452ff434454ff5e719bff80aeeeff85bef8ff30333fff24242dff1f1e27ff4889b2ff5cc3f8ff8677deff7972bbff5e5c6bff595766ff555362ff514f5fff616d95ff7da3e6ff85b7f8ff80b7ecff58738fff31303aff2b2a34ff26252eff4c88b3ff5fbef6ff8873ddfd7f71c3ff646272ff605e6eff5c5b6cff7b98dbff84b1f9ff84b8f5ff6c8db4ff474a59ff3d3c47ff383641ff32313bff2d2b35ff5591c2ff62b8f4fd8873dddf8773d9ff6c6880ff666475ff636276ff82adeeff789cccff5c637bff515062ff4a4856ff44424eff3e3d48ff393742ff373b49ff65aaebff65b3f1df8873dd918873ddff7e70b8ff6c6a7cff676578ff636275ff5f5e71ff5c5a6eff58576bff525060ff4b4955ff45444fff403e49ff597bacff6aa9efff68adf0918873dc1a8873dded8873ddff7f71baff6f6c86ff6a687dff666479ff626176ff5f5d73ff5a586bff52505cff4f5061ff6179afff709fecff6da4eded68a8f01a000000008a72de3c8873dded8873ddff8773daff8172c6ff7d73c0ff7a75c0ff7777c0ff7379bfff727ec4ff768ee2ff7595e8ff729aeaee6f9eec3c0000000000000000000000009368e01a8873dd918873dddf8873ddfd8774ddff8578dfff827de0ff8082e2ff7d86e4fd7a8be5df7790e7926c9eea1a0000000000000000280000001800000030000000010020000000000000090000000000000000000000000000000000000000000000000000000000000000000065b3f31263b5f37562b8f5c360bcf5ef5ebff7fe5cc2f8ff5ac5f9ff59c9faff57ccfbff55cffcff53d2fdff52d5fefe50d8ffef51d8ffc350d8ff754dd9ff130000000000000000000000000000000000000000000000000000000066aff16267aff1ef65b2f2ff63b5f3ff61b9f4ff60bcf5ff5ebff7ff5cc2f8ff5ac5f9ff59c8faff57cbfbff55cffcff53d2fdff52d5feff50d7ffff50d8ffff50d8ffef52d9ff6300000000000000000000000000000000000000006aa7ef886aa8efff69acf0ff67aff1ff65b1f1ff5494c7ff44769cff3d6c8eff3a6c8cff386c8bff356b89ff326b88ff306b87ff327895ff41a3c6ff51d3fcff50d7ffff50d8ffff50d8ffff50d9ff880000000000000000000000006f9fec636ea2edff6ca5eeff6ba8efff5787bbff313c4eff24232cff201f28ff1d1c25ff191821ff15151dff111119ff0e0d15ff0a0a11ff06060eff03030aff0d212dff3a98b8ff51d7ffff50d8ffff50d8ffff51d9ff630000000067a3eb13729bebef709eecff6ea1edff53729fff302f3aff2c2b35ff282731ff25242dff212029ff1d1d26ff1a1922ff16151eff12121aff0f0e16ff0b0b12ff07070eff03030bff010209ff2d7690ff51d7ffff50d8ffff50d8ffef4adcff127595e9757498e9ff729beaff6181bcff383742ff34333dff312f39ff2d2c35ff2a2935ff26252eff22212bff1e1d26ff1b1a23ff17161fff13131bff0f0f17ff0c0b13ff08080fff04040cff010209ff3b98b8ff51d7ffff50d8ffff50d8ff757791e7c37694e8ff7497e8ff484c62ff3c3b46ff383742ff35333eff4e407eff7f5befff634bb2ff322d48ff23222bff1f1e27ff1b1b24ff181720ff14131cff101018ff0d0c14ff090910ff05050cff0f222fff52d2fcff51d6feff50d8ffc3798ee6ef7891e7ff6b82c6ff44424eff403f4aff3d3b46ff393842ff634cabff805df2ff8061f2ff7d66ecff554c94ff282635ff201f28ff1c1c24ff191821ff15141dff111119ff0d0d15ff0a0a11ff06060dff43a3c8ff53d3fdff51d6feef7b8ae5fe798de6ff6572a9ff484652ff44434eff413f4bff3d3c47ff484067ff765ddaff816bf3ff8171f3ff8178f4ff7776deff454773ff21202aff1d1c25ff191921ff16151eff12121aff0e0e16ff0b0a12ff357997ff55cffcff53d2fdfe7d87e4ff7b8ae5ff656da1ff4c4a56ff494753ff45434fff42404cff3e3d49ff3d3b4aff5a5395ff7d77eaff8182f4ff8289f5ff8290f5ff6d7cc8ff353a54ff1e1d26ff1a1a22ff17161eff13121bff0f0f17ff336d8aff57ccfbff55cffcff7f83e2ff7d86e3ff686da2ff504e5bff4d4b57ff494854ff464451ff43414dff3f3e4aff3c3b47ff403f54ff6569afff8292f4ff839af6ff83a0f7ff83a6f6ff465577ff1f1e27ff1b1a23ff17171fff14131cff366d8bff59c8faff57cbfbff8180e1ff7f83e2ff6b6da4ff54525fff514f5cff4d4c59ff4a4855ff474552ff44424fff413f4cff3e3c49ff3b3946ff464965ff7087c9ff84aaf7ff84b1f8ff5f7da9ff23222cff201f28ff1c1b24ff181820ff3a6e8dff5bc5f9ff59c8faff837ce0ff817fe1ff6e6da5ff585664ff555360ff51505dff4e4c5aff4b4957ff484654ff454451ff42414eff3f3e4bff44475bff6782b4ff84b3f8ff85baf8ff6284abff282731ff24232dff212029ff1d1c25ff3d6e8fff5dc1f7ff5bc4f8ff8579dfff837ce0ff716ea7ff5c5a68ff595765ff565462ff53515fff4f4e5cff4c4b59ff494856ff4a4b5dff6579a9ff82abLine truncated
|
||||
|
||||
// Static43 returns static file
|
||||
func Static43() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic43Data)
|
||||
|
||||
rawStatic43Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 33310,
|
||||
33310, 47862,
|
||||
"UIk6NTKu+xU=", "srmbuyaNSsk=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic44Data = `89504e470d0a1a0a0000000d4948445200000080000000800806000000c33e61cb00002c57494441547801ccc10dacef777dd8f7d7e79c6b5f3f803198271b1243088410c842c848612a252d95e8a66e4ac3123ab5db48298dbaad696250b6a80fd1aa0602a19dd6ad299d344d9ab2b12a8bb4498d16356993346ddaa290a84de832b0b103b810fc808dafafef3de77cdffbfdff7f3b01848d0143fa7a8d7f8bdcf3e6f71cdffb947b5f4c2f9b996f2ccf3f3e3bbaf9ec783d034fc735388f731eafb1c90cc626c6de4c8c83c9ce0c267b6393198c4d8cbd99ec0d263b334ee992f1a071d71c9f7ed23afee8f1b9d3dbcece8e7fd3f8974f7eda5dbff5943ffb77cefc5b62fc3efae07ff5a373cdbae6e50f9d7fe8f54baf3d9af9765ce78932997130d91bc666621c4cc66630d91b460cc626c6de4c8c83c9ce8c4d0cc626330e26c6de4c0fe09f99f9c5cbe72eff3f575cf6fee7fed03b97df27e3f7c1876e79fbb78ff94ff006dce42b6132233b93cd1866b2373631cc3898ec0da30cc6a6318ccdc438988ccd60b2378c180713636f267b83c9ce8c3b4d3fddea7f7bce5bdff12bbecac657c96d3ff8f66b97a33f33d39fc54b3db1c2d819d1cc3898ec0d33d91b9b18666c621c4c661c8c4d0c6333658c9da9610c267bc388c1d8c4303613e3603236631383c1f481399abf6bf53fdff817dff1695f05e32becd37fe9afddf0f10be76f393a5adf87a77ae285b1333699713031f666b2373631ccd8c43898cc3898ec0d33d91b0793b11999c6ce30623036318ccdc438988ccd60b2378c1807d37d57ddf4919fb8fae295efbeea3ffd5feef21534be426eff81775d73e5c79ef3b68b5ff3db3f88eb7ca58d4d661c4c8cbd99ec0d263b3336310e26330e267bc34cf6c62686199b1807c34cf6c62686b199180793b1194cf6861183b189616ca64f5ff9dc8fbcfbf2bf79ee8f3ffbcfbfeb82af80f11570eb2d6fff9e3a7ad74c5fe38911c6a3199bcc3898187b33d91b4c76666c62303699713031f666b2373631ccd8c43898cc3898ec0d33a2310e26633398ec0d23066313c3d84c8cbd8e7cec486f7dd69f7fd77b3dc1c613e8b7def6f6e71c9d1dfdc4d1f4c77d79c2783cc62633189b187b33d91b4c76666c62303699713031f666b23798ecccd8c43898cc3898ec0d33d91b9b18668431d91b460cc62686b199180793b119d2df3f77d4f73dfdfbdefd514f90f104b9f596b77f17f31edce04b17c6e3353699c1d8c4d89b897130d999c1646f6c32e36062eccd646f30d999b189c1d864c6c1646f98c9ded8c43063136327d3cc38189b18666c621c4cc66630d91bf71c4d7fee197feedd3fe50930be4cb7fdc08f5d71f4c0753f7e76dd7d7fc157d33062303631f666621c4c766630d91b9bcc606c62eccd646f30d999b189c1d864c6c1c4d89bc9ded8c4306313e36032e360b237cc646f1c4c661c4cf68611c3f193efff5ba70f3ce99667bde56f9ef8328c2fc3ed6f7be70d4efcf4d9f17a8dafa6c98c83c9de306313e360323683c9de3062303631f666621c4c76666c62303699713031f666b23798ecccd8c4606c32e360b237cc646f6c6298b1897130cc646f6c3247eb971c1dfd89677cefdfb8db97e8d897e893dff9532fb878fdddffb0a3bed5972607e38b31997130d91b66b2373631cc6030d91b460cc62686c14c8c83c9600613836164068389b13793bdc16467c6260663931907138361a6ec8c2186199b18079319076313c3ccdcacbef3affc999b7fe6edeffdcd7b7d09c697e0b6b7bef3256bf50f66bac957cbd864c6c1646f98c9ded8c4306313e36032e3606c62189b897130199bc1646f1831189b18c666621c4cc6666c62308c180713636f267b83c9ce8c4d8c83c98c83c9de3093bd6174e74957fcd11bdffcae0ff8228d2fd2ad6ffb6bdf685df18b7886af96b189e1d39dbad0990b9dbad47262392b0dcade44e46113f2886467240f0b9383903c228f48769255ce1f1fb9e6dc91a79c3ff6d4f3e73cf5aa2bcc646f18310e2686b199ec0d266333363118468c8389616c267b6313c3f04973f9b54f7fd3dffe802fc2f822dcf3ddef7dc13dcfbde39766bac957c1a97cbc4b7e675df6c975d9a7d68953218548483645247b259b6c122a13d9144345f6125236112249ca2697ce96074fcf64532ae1ca19cfbae60a5ffbe4ab7cddf55779c1f557bbf2dc1162189b897130199bb189c130621c4c0c6333d91b4cc6666c32d39d57af93d75cf3bd3f71abc7693c4e1fbae51d37e09f0e2ff215742a1f590fb9633de4e3eb922549655024ca4ed944247b9188ec2ce52012227b954754642f5176928aec3d707ae6f2d9422a45a254b229c7335ef8d4ab7dcbb39eec65cfbcd615c7c338988ccd60b2378c180713c3d84cf60693b1199b180ca30fce3a7ad5d3def4dfdded71188fc307dffa8e2bce9d1dfddc3a5aaff1c509e37178a033bfb51ef4e1f5a0cb2d3b89289b24b257114d94f2b06453768a0ad9a93014924df62a26a2f2880a91bdca7d27a7ce8a52c9a65442450995ca55e78ebcf2a6ebbce6e6a77ada35e78ccd60b2378c188c4d8c8631d91b4cc6666c62308c1866d62fc5eb6ef8d3ffc3892fe09cc7e1dcc5f33fbeaebaf41a5fbcf1057cba33bfb11e70fbba68d9c94ee52021114a76b253c826d9947250b21351f69a65279b229291d64864939db2974d59e56c85548a44a9848a122acac59333bf70fb3d7ee98e7bbce2a6ebfcb1173edd0dd79eb3378c188c4d0cc398180793b1199b180c23c65ee63573e5e577e32ff8028e7d01b7def263dfd5b9d3777b829dc8bf5c0ff895759f7b3a51d9a9900ca1e4612514b24976222ad989085392ec64a76cb25391bd6c22d98b84883071792d97d7a2544245091525542a4aa8b4f2d1fb1ff28f6fbfc7a5d3e5f94fbbda1547188c4d0c6333310e26633398180c2306838961d6f1b7ffd077bdf2377eeca7ffc5bff6188e3d867ff5433ffadc2bd6fc0caef604bab34b7ee1ec53ee5c9714c95e29bfab12465a24c948486493642f12d94b44d94bf6a27290440e2221a23c2cc9a5d3e5b42845a2544245091525542a3b95b3950fdd73c1fb3e729f1baf3bef194fbe1231cc60621c4cc66630d91b460cc62686b199187fe42fbfe19b7ff247ffcff77fdaa338f218ae3e9b9fc0d33c41cee47d67f7fb85d37b5de8449228958425ac525156c9924dac958a52295a14ab1461954a92654951a985542a2d8aca2a45b14a926595cae95a944a52a9848a122a95a452a9542a1571f785cbfefb5fbedd7b7fed4ea765c626c6c1640683c9de30623036318ccdc4d8b9e1a4f37fc76338f6286e7beb3bbe47f3c39e20179cf987a7f7fa68976513a249362142d964a71c44120695ec44c9269b944d120d253b21354476920c8a84283b6513521417cfce2845a25442450995ca4ea5428a4a222ac987efbee8373ffe692fbbf149aebef21831cc3898ec0d3331Line truncated
|
||||
|
||||
// Static44 returns static file
|
||||
func Static44() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic44Data)
|
||||
|
||||
rawStatic44Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 16793,
|
||||
16793, 31182,
|
||||
"zRLEpJpH9ZY=", "gGHbZ5ZNd9A=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic45Data = `89504e470d0a1a0a0000000d4948445200000200000002000806000000f478d4fa00008000494441547801ecc10dd0ee6941dff7eff779ce39bb7b8015589605443054d054a526e38c1a990c6d1d27a9e0c4318b996a63b50a238831bb0a5a6b721c15f6055f125b3bd026933436d3b09a29846aa7519bb661d48ad3144a6db2ec31f84a9005b3bced9e739ee7d7ebfe3fd77d9febbeafeb52c165d9e79cfbf391bdbd4fb3dcfee6c3f77ee6fd4fbf72865b0e8fcede727c905b92dc7a20b7446ef138b7446e91835b42ce11549e4c1138073c81134f00ce71da4823b49439294247a6344cc94058c89014b2232c644e1a614d0a9993227464480ac3944c04a4235c023f8a80f928e11245c81f1c480297c8f183e1e0c183031f84e307091f88871f80a30793c3078fb9f4e0739f7ffffb7dd97d47eced7d1ac9dede63e0bddff3faa75cbeccf30ccfe380e79983e7853c0f7816e1b391f35c8fa4115aca9c14a123531aa664202c644819080b999346589342e6a4081d1992c230250361211d2964202c644e1aa1b82cfc16f07b98df95838b21172517af70e6e273fe9d77bfd797dd77c4dedea790eced3d8aeebfe3873eeb20075fc8a15f98635fa87c21f002e006f6b64923b49431a94247a6344cc94058c890b2236cc89c34c29a14322655e8c89014862919080be9482103612173d2082b52c9983c42f22f817705de85c7efd473ef7af66b2ffc367b7b8f12d9dbfb24e4f6371ffec6675dfc8263f325c617e6205f607c21f014f6fe6852859614322655e8c89486291908c894b2236cc89c34c29a14322655e8c8901486291908c89014b2236cc89c34c28a54322655e8c887807786e377e9e1bbe2d12f3ffbb9f7bfdb97dd77c4dede2748f6f6fe18defdca0b4fbcf1a61bbf08f3e58417815f0e3c85bd4f9c54a1a5cc49153a322485614a060232a5ec081b32275568297352858e0c4961989281800c49213bc286cc4923ac48217352858e7464f111e4ff46fe79c8db8fae1cfdf3e77eef5d1f626fef8f207b7b03f77ffbeb6ef59c5f217e39f222e00b8043f6fe64a40a2d654e8a3024435218866422204352c88eb02173528596322755e8c8901486219908c89014b2236cc89c54614d0a99932a74a4239561c711e19d1ce4ed81b7ebb99fffccefbaf001f6f676c8de5e91dbdf7cf8c0731ef822e52b383e7829e6cb8003f61e1dd2082d654e8a3024435218866422204352c88eb02163d2086b52c89c14614886a4300cc9444086a4901d6143c6a411d6a49039a942473a521986a4750cfc5fe0cf033fff7b37bfff7ffbe257bce9327bd73dd9bb6eddffedafbbf5e09c2f3e96971ee057014f65efd1278dd052e6a4084332a4614a2602322485ec081b32268db02685cc491186644829c2904c0464480ad91136644c1a614d0a9993220c49470a29c2904c0464e583925f80839f3f3ebafcb3cf7eed3dbfcdde7549f6ae2b17ef7cc373c995db232f03be1890bd4f1d69849632274518925d01d43025e12ad908c85ab84a296447584800199146589342e6a40843d291c230251301199242768485cc4923ac492173528421e9482145189289807484407ed503df9cc3a3fb9ef5d7eefe4df6ae1bb277cdbbff35773ffbe0285f4bbc1df3e700d9fbd4934668297352841d41e4440081005268989281b0902129644758482b80400091950042589342e6a4081d1992c230251301e948253bc242e6a411d6a4903929424786a4304cc944403a5249ebff0ddc77e6e0f8bfbbedafdf7591bd6b9aec5d93fee55fffa1cf3c7378f676c3cb42be1490bdc78e34424b99932274644ac3940c84850c2903612173d2086b52c89c14a123435218a664202ca423850c8485cc4923ac48257352848e0c49619892898074a49081b09063e097086fbe72e5e8a79ff3da7b7e97bd6b8eec5d3372fb9b0f2f3ef7817f3f1cbcdce46b8033ec3df6642d10b92aca8aec922a74644ac3940c84850c293bc286cc4923ac49216352852a9c10590b209514862919080be9482103612173d2082b52c99854a1231da90c53321016d2914206c242761d03bf68f2a6673cf183ffa3af78d365f6ae09b277eabde73b5fff399ee11bc8c137433e8bbdc75a38211240082d29644caad091290d53321090296547d8903969843529644caad0912121188170425a32109021296447d89039698415a9644caad0918e548629190848472a19080b991390f719fffec1e1e5ffe6b6efb8f701f64e35d93b95ee7ff5dfbee1e0ec47bf1a7d39f01f02b2f758082057059015a9424b99932a7464480ac3940c04644ad91136644eaad052e6a40a1d1992c2b02380acc84a00d908c89014b2236cc89c34c28a14322755e848472ac3940c04a423950c8485cc4923ac08bf9603de941b6ffca9cf7cc5858fb177eac8dea9f2afbff3879f797470f06af5e5815bd8fb540a202702c88834424b9993220cc9901486219908c89014b2236cc89c54a1a5cc49153a32248561484602115909200d296447d89039a9c29a14322755e848472ac3904c04a42395ec081b32278d2095ac7d4079e3c199a3fff2e9afbaf77dec9d1ab2772abce78ed7bde0005f15fd56e026f63e1502c827421aa1a5cc491186644829c2904c0464480ad91136644c1a614d0a9993220cc9901486219908c8901044b6840d199346589342e6a40a1de948651892898074a4921d6143c6a41156a492914b847fe4c1c13dcff86baffb7fd87bdc93bdc7b507eebceb4590d7825f05c8dee38734424b9993220cc99086299908c89014b2236cc89834c29a1432274518928e145284219908c89014b2236cc89834c29a1432274518928e14528421990848472ad91136644c1a61452a999313397abb070777dff6eabbdfa684bdc725d97bdc79c7cbdf78f6c94ffa83ffd81cdf81be90bd475b00f993904668297352842119d230251301199242768485cc4923ac492173528421e94861989289800c49213bc242e6a411d6a4903929c29074a490220cc944403a52c98eb09039698415a9644eaab026fc8be3e4479ef907e7ff072f5cb8c2dee38aec3d6ee4c285838b0fddf0b5e80f03cf67efd110401e4dd2082d654e8ad091290d53321016322485ec080b999346589342e6a4081d1992c230251301e948253bc242e624802cc29a14322745e8c890148629990848472ad9111632278db02295cc49113ab2f6af135fffcc673ef0777cd97d47ec3d2ec8dea75d2e5c38b8f8d00d5f8bfe20f0b9ec3d5a02c8a3491aa1a58c49153a32a5614a06c242869481b0903969843529644e8ad09121290c53321016d2914206c242e6642d1029a4923929424786a4304cc944403a52c84058c89c34c28a54322745e8484f7efd20dcf5f4675cfcef7dd97d47ec7d5ac9dea74d88bff15d77bf84f003813fc3dee39b34424b19932a74644ac3940c04644ad91136644e1a614d0a19932a7464480ac3940c848574a49081Line truncated
|
||||
|
||||
// Static45 returns static file
|
||||
func Static45() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic45Data)
|
||||
|
||||
rawStatic45Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 138940,
|
||||
138940, 244802,
|
||||
"xIO/svK765g=", "0jpxQJnntO8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic46Data = `89504e470d0a1a0a0000000d494844520000003c0000003c08060000003afcd97200000002494441547801ec1a7ed20000156a494441549dc109f0e7f75d90f1e7fdf9fd7737497327b4391a24a5391ad2525a42d3526cd51914192fe4f00054a80a8c07220c683ba323961e3878e0581d15673c462c606dc50a8a5019044c2f682d256dd3364d1a9234577773eceefff77d1e93214268136c79bd86dfa10ffdd5d71c596bdd30cccbb7f18547dc5db5df6d9703e702077caa8959c0c44c31318b6182891960c54c303013acf64cc70f8e1cfedaac6eb6f52e99b74ddb4d977fd7eb0ef91d183e4bb7fcb5d75f3bd3b7367d1df00c3e1353b3806966828959c0041333c48a99868159c1041333c08a9960602658dd35d31be7986fb8e4db5eff7e3e0bc367e896ef78dd35d37a756bfb63c0e2a9050c8f9b154c303013ac9801269898054ccc0413b38009266688d5cc040333c10a266680c983ddfe4dfbb57be5a5dff6fa9bf90c0cff1f1ffe6baf39c2fed8ab3a7afabb81637c166605130ccc042b66808959c1040333c18a1960622658c0c44c30310b986062065831130ccc746ae8752c5ffdf46ffd81d3fc3686dfc647befdf5576cc31b6779234f2e7eddf0440333c10403b382899960605630c1c04cb06206989809163031134ccc0226668a054c33130ccc0a2698583b7f71e06b2ffef37fff369ec28ea770eb2bfed9f3b6331ff99999aee3d3050c30c0f0440333c1c42c98154ccc040b6605130ccc0a56cc0013b382150ccc042b66011333c162986626989ac530311333c0f04c86affd9b7fe2fafff1ba1f7bd75d3c89e1497ce4dbbfff79eeb69f062ee233b411f776c87d9de6447b4ebab12111101510f198a8808088a088b038ad9c75305c74c601979d7d942bce3dc6c10e18980956cc001333c1022666828959dcbbdaffbe0bbfe91fff329f62f8141ffd8eefbf629bed1780cbf90c7ca2433ee843dcbe9de47442515151515141115151415151411052717a2f27f67b522c528eed86e75c74162f7ee6795c79e119cc0013b382012666821533c0c44c1f9fe58b2ffc867f7c1b4fb0e3096ef98ed71f35de3ad375fc7fdcd721ff6bfb24efd94e70bf87ec938a8a8a8a888a8c888a8a0a839202098b8a93dbc67e130d938ad3fb8d8f9f38c92fde763f1fbcf7212e3bef18e79fb5838919980956cc001333c1e2dc59bef87bfef88bfef5ebfee34df2b8c513b4b657cef2463e5d3c4ee0973cc14fecefe54e4f61616162b2155b62a2a261b2299ba1a2a1b219262a2a2aa7b70d1593149514954db9f9130ff2bab7ddc27f7adf5d48b0821533c4c4ac60c54cc0dcc86e7b154fb0e3711ffcced75cb39a7f0b1cf0e986479d46deb6bf9f0f6f8f605151515151515161515151515121615151615151b1158fec37542c522c4a342a5436e303773fc887ee79882fbae21c8e1e0c0c332b98980156b062666efc1b5f7dc38fbcf647df7e2f8f5a3cee607ff06ae0184fe134f253fbfbf9354f616161a16262a2a2a2a2a2a2a262a2a2a2a2a2a2b2292a87dbc6a658a858a868a8a8a8a498fc9f3b8ef3baff7e0b0f1f6ecc0a266680154ccc00d3b1d9f96a1eb7e351b7fcf5d73ca7d50f02c39390f899fd03dcbd9da2a2a2a2a2a2a2a2a2a4a2c2c2a2a2a2a2a2c2a2a0a4c0e2d4b6b1dfc442a542a5c224c324c324e3be874e71cb3d0ff1a5579dcf6e37b06226668205b382e1da57fed9e7fcc86bfedd7bee593c2ae65b81c56f8a2778f776823bb693585868a8a8a8a8a8a868686868686c86868a8686caa66c8689c9e1262a2a252a262a1a2a1a2a1a261aefbded93bcf1ed77c0c44c30c18299606286b59d7adab7f0a8dd2ddff9da2303ff12389bdf6a78d43d1df2f3870fa0515251515151925012517164c17e938a8a0a0b8b8a8a8a880a0b8b93fb3d162a152a152a15261a251a251a2537dff1202fb8f25c2e3cf7082c98092666050bd6f479dff3275ff00f0fc6f5258dcfe037050c8fbbe9f00136c5222322a3a4a2a2a2e20baf389baf7ce1c59c73f601b7ddf7083ff9ae4ff0fe8f9da0a2a2a282a2a2a2a2625336a542a5c224c324c324c344a3c422c3e487def631beef4f5dc30cb0622618980956cf58ce972cf0e5fc56c3e3eef414776ea7d048315131b1b05051b9e4dc237ced0d4fe79c230bf671c50567f28a2fff5cfec257fc2e2eb9e0282a2a2a9bb2292a2a2a879b98a898a8a8a868a86898689468a8a8a8bcf7639fe47db71f871533c1c04cb06206d8f9b225bc80a7f0fefd83a8985868a8a8a8a858585cfbf4b3581bb001fb601fece39acbcee6bbbee62afec4ef7926e79cb943454565533645e370dbc850d150d130513151515151514931515179eb3bef6426189815ac980926d8f9c283355c1dbf216078d43672ebe1c368549458549464545454ec80f630013ba0202098ddf0926b2fe205579dcf7f7bc79dfcf777dcc9a943c9a888d8bba16192619261a251a25162916192619261f2f3bf7a1fa7373976746062261860c50c57afe0327e5dc0f09889bb3cc529374c4c2c3252342c2c54541e3ab9c106ed813db0017b601feca33d1c5b3bfef08b2fe7ef7cd37379d175170162b2df3636454545454345a344c3444345454545c544e5a19387bcfff6e33031132c985533c170d902cee5d70d8f9a15b3e2eeed14192a2a2a2a9b62a2a26261f1aedb1fe091931b6cd01ed8031bb001fb601feda33d5c70e651bef92b9ec52bbff17aaebee21cf69b68a86898a898a8a8a8a4a8a898a898a8a8a8a8fceaed2798152c9809a661c5acce59c0018f9b154c30f0c9ed342616162a26161a162a2a2af73d7c9a7ff4731fe1239f789836680feda13db441fb601feda37db087cf7bfad97ccf9fbe9e6fffbae770e9456760a2a2a2a2a2a262a26292a192a162a162a172fb3d0fc1c44c30c1aa19603a72c063066682090666c5c36e6894585454a45854549454647cecfe87f87b6ffb005f74f979fce1eb2fe373ce3d06c104ec8080a2dd5030c1ece08bafba98e75f75213f79d3edfcf04fddc203274e61926192619261926152a152a1629172df89d3cc002b668261989815070ccc0413b38009260edd30a928d1a8a848b1a8a828c9a8b0b8e963f7f2aedbefe3777ffee7f095d75fc6d9671e40303b20a060073510b08383dde22b6ffc5c5ef64597f21ffec72dbce5673fcca9bd94689854a854a854a8549864589c3abd871533c10403b38289ddb77fe9effbdb4ccd6a186062267ee59107b9fff4212515162915151629151515251916fb4d6ef9c4097ef6837731c0e75d70366b86e151f19b1afe9f018e1eec78c1b517f3f2175ec6bdc71fe1d63b8e639262a151a251629162916271d9c5c7f883373e032658302b989881c58a590d034ccc0a16949858a8a45858a8a85858a8a8686c85858aca899387fcf0db3fca77ffd83bf95f37df8d87c106ec813db0057b600fed810dd8c3a5173c8d57fdb9Line truncated
|
||||
|
||||
// Static46 returns static file
|
||||
func Static46() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic46Data)
|
||||
|
||||
rawStatic46Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 5553,
|
||||
5553, 10570,
|
||||
"nYzi/NcYjrA=", "uhTXKbFTt6I=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic47Data = `7b0a2020226e616d65223a202253737769667479222c0a20202273686f72745f6e616d65223a202253737769667479222c0a2020226465736372697074696f6e223a206e756c6c2c0a202022646972223a20226175746f222c0a2020226c616e67223a2022656e2d5553222c0a202022646973706c6179223a20227374616e64616c6f6e65222c0a2020226f7269656e746174696f6e223a2022616e79222c0a20202273746172745f75726c223a20222f3f686f6d6573637265656e3d31222c0a2020226261636b67726f756e645f636f6c6f72223a202223666666222c0a20202269636f6e73223a205b0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d33367833362e706e67222c0a2020202020202273697a6573223a20223336783336222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d34387834382e706e67222c0a2020202020202273697a6573223a20223438783438222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d37327837322e706e67222c0a2020202020202273697a6573223a20223732783732222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d39367839362e706e67222c0a2020202020202273697a6573223a20223936783936222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d313434783134342e706e67222c0a2020202020202273697a6573223a202231343478313434222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d313932783139322e706e67222c0a2020202020202273697a6573223a202231393278313932222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d323536783235362e706e67222c0a2020202020202273697a6573223a202232353678323536222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d333834783338342e706e67222c0a2020202020202273697a6573223a202233383478333834222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d2c0a202020207b0a20202020202022737263223a2022616e64726f69642d6368726f6d652d353132783531322e706e67222c0a2020202020202273697a6573223a202235313278353132222c0a2020202020202274797065223a2022696d6167652f706e67220a202020207d0a20205d0a7d1f8b08000000000002ffac90cd6eab301085f73c85e5bb4d6e04180291aa3e44d45555452e1862d58c9131aa699477affc537553ab5d78e3c5f966fc8dce2d4308039d183e217c5edef9a037bcb3e172954a5f7e443d5b3ac567cd25e0138255081f736547e9aaa59f1314469b30d83f9dc32a5f6641379b2e9a424f8504e691549c81a6e1574ce1eb104d95beac4ad8f4f0789593d533060fb91f78a5dddba8e40afda59342ba23fe0dc3e029ef242cf8849e338410bab9d7feaa3a6fe995e4fdbebb2a39b17d599bb2fe3fc3e876fd20ff60761f3bf69deb6d76cdf0898eec60571cb9effee2218d214dc4e35822cfb130c722e2712c91a7ad4d1bebcdb1449e9c1093131231059acad516266f63ed059ac85554b529aa5883812672950d316513eb30d044ae2a2f4c95c73a0cf4775786d04b76ff040000ffff`
|
||||
|
||||
// Static47 returns static file
|
||||
func Static47() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic47Data)
|
||||
|
||||
rawStatic47Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 1196,
|
||||
1196, 1511,
|
||||
"WdtgnBG8Sks=", "EKpkCbFqOGQ=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic48Data = `7b0a20202276657273696f6e223a2022312e30222c0a2020226e616d65223a202253737769667479222c0a2020226465736372697074696f6e223a206e756c6c2c0a20202269636f6e73223a207b0a20202020223630223a202266697265666f785f6170705f36307836302e706e67222c0a2020202022313238223a202266697265666f785f6170705f313238783132382e706e67222c0a2020202022353132223a202266697265666f785f6170705f353132783531322e706e67220a20207d2c0a202022646576656c6f706572223a207b0a20202020226e616d65223a206e756c6c2c0a202020202275726c223a206e756c6c0a20207d0a7d1f8b08000000000002ff5c8e410a83301444f79e62f8eb22f90145bc460f20626309a44948d4a614ef5ea29616b78f37c37b17002d2a44ed2cb5202e055d32b3fd4365708d4f3d4eaf1dde541c82f6d32edbd9980debc1d9482df21940b5c8c3510735bad4f5de77b548b528bdbd6f3700b16cce0ecb26b16cfead8ae5d9aa58a68ae56615c07a642dca38afc2afe1c8ff260234077380bc2bd60f000000ffff`
|
||||
|
||||
// Static48 returns static file
|
||||
func Static48() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic48Data)
|
||||
|
||||
rawStatic48Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 250,
|
||||
250, 410,
|
||||
"1dt/vqnONiQ=", "S7HxwGVBXUY=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic49Data = `2f2a2120546869732066696c6520697320612070617274206f662053736877696674792050726f6a6563742e204175746f6d61746963616c6c792067656e6572617465642061742031353a35323a353120474d542b303830302028474d542b30383a3030292c20444f204e4f54204d4f4449464959202a2f0a2f2a21206e6f726d616c697a652e6373732076382e302e31207c204d4954204c6963656e7365207c206769746875622e636f6d2f6e65636f6c61732f6e6f726d616c697a652e637373202a2f0a0a2f2a20446f63756d656e740a2020203d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202a2f0a0a2f2a2a0a202a20312e20436f727265637420746865206c696e652068656967687420696e20616c6c2062726f77736572732e0a202a20322e2050726576656e742061646a7573746d656e7473206f6620666f6e742073697a65206166746572206f7269656e746174696f6e206368616e67657320696e20694f532e0a202a2f0a0a68746d6c207b0a20206c696e652d6865696768743a20312e31353b202f2a2031202a2f0a20202d7765626b69742d746578742d73697a652d61646a7573743a20313030253b202f2a2032202a2f0a7d0a0a2f2a2053656374696f6e730a2020203d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202a2f0a0a2f2a2a0a202a2052656d6f766520746865206d617267696e20696e20616c6c2062726f77736572732e0a202a2f0a0a626f6479207b0a20206d617267696e3a20303b0a7d0a0a2f2a2a0a202a2052656e6465722074686520606d61696e6020656c656d656e7420636f6e73697374656e746c7920696e2049452e0a202a2f0a0a6d61696e207b0a2020646973706c61793a20626c6f636b3b0a7d0a0a2f2a2a0a202a20436f72726563742074686520666f6e742073697a6520616e64206d617267696e206f6e206068316020656c656d656e74732077697468696e206073656374696f6e6020616e640a202a206061727469636c656020636f6e746578747320696e204368726f6d652c2046697265666f782c20616e64205361666172692e0a202a2f0a0a6831207b0a2020666f6e742d73697a653a2032656d3b0a20206d617267696e3a20302e3637656d20303b0a7d0a0a2f2a2047726f7570696e6720636f6e74656e740a2020203d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202a2f0a0a2f2a2a0a202a20312e204164642074686520636f727265637420626f782073697a696e6720696e2046697265666f782e0a202a20322e2053686f7720746865206f766572666c6f7720696e204564676520616e642049452e0a202a2f0a0a6872207b0a2020626f782d73697a696e673a20636f6e74656e742d626f783b202f2a2031202a2f0a20206865696768743a20303b202f2a2031202a2f0a20206f766572666c6f773a2076697369626c653b202f2a2032202a2f0a7d0a0a2f2a2a0a202a20312e20436f72726563742074686520696e6865726974616e636520616e64207363616c696e67206f6620666f6e742073697a6520696e20616c6c2062726f77736572732e0a202a20322e20436f727265637420746865206f64642060656d6020666f6e742073697a696e6720696e20616c6c2062726f77736572732e0a202a2f0a0a707265207b0a2020666f6e742d66616d696c793a206d6f6e6f73706163652c206d6f6e6f73706163653b202f2a2031202a2f0a2020666f6e742d73697a653a2031656d3b202f2a2032202a2f0a7d0a0a2f2a20546578742d6c6576656c2073656d616e746963730a2020203d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202a2f0a0a2f2a2a0a202a2052656d6f7665207468652067726179206261636b67726f756e64206f6e20616374697665206c696e6b7320696e2049452031302e0a202a2f0a0a61207b0a20206261636b67726f756e642d636f6c6f723a207472616e73706172656e743b0a7d0a0a2f2a2a0a202a20312e2052656d6f76652074686520626f74746f6d20626f7264657220696e204368726f6d652035372d0a202a20322e204164642074686520636f72726563742074657874206465636f726174696f6e20696e204368726f6d652c20456467652c2049452c204f706572612c20616e64205361666172692e0a202a2f0a0a616262725b7469746c655d207b0a2020626f726465722d626f74746f6d3a206e6f6e653b202f2a2031202a2f0a2020746578742d6465636f726174696f6e3a20756e6465726c696e653b202f2a2032202a2f0a2020746578742d6465636f726174696f6e3a20756e6465726c696e6520646f747465643b202f2a2032202a2f0a7d0a0a2f2a2a0a202a204164642074686520636f727265637420666f6e742077656967687420696e204368726f6d652c20456467652c20616e64205361666172692e0a202a2f0a0a622c0a7374726f6e67207b0a2020666f6e742d7765696768743a20626f6c6465723b0a7d0a0a2f2a2a0a202a20312e20436f72726563742074686520696e6865726974616e636520616e64207363616c696e67206f6620666f6e742073697a6520696e20616c6c2062726f77736572732e0a202a20322e20436f727265637420746865206f64642060656d6020666f6e742073697a696e6720696e20616c6c2062726f77736572732e0a202a2f0a0a636f64652c0a6b62642c0a73616d70207b0a2020666f6e742d66616d696c793a206d6f6e6f73706163652c206d6f6e6f73706163653b202f2a2031202a2f0a2020666f6e742d73697a653a2031656d3b202f2a2032202a2f0a7d0a0a2f2a2a0a202a204164642074686520636f727265637420666f6e742073697a6520696e20616c6c2062726f77736572732e0a202a2f0a0a736d616c6c207b0a2020666f6e742d73697a653a203830253b0a7d0a0a2f2a2a0a202a2050726576656e7420607375626020616e6420607375706020656c656d656e74732066726f6d20616666656374696e6720746865206c696e652068656967687420696e0a202a20616c6c2062726f77736572732e0a202a2f0a0a7375622c0a737570207b0a2020666f6e742d73697a653a203735253b0a20206c696e652d6865696768743a20303b0a2020706f736974696fLine truncated
|
||||
|
||||
// Static49 returns static file
|
||||
func Static49() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic49Data)
|
||||
|
||||
rawStatic49Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 144656,
|
||||
144656, 174208,
|
||||
"GPEsJOp1S+s=", "dRX/w6sBW9o=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic4Data = `774f46460001000000014f740012000000029e9c00010001000000000000000000000000000000000000000047444546000001940000017300000262b442b08247504f530000030800002c6400005dccff1a12d74753554200002f6c00000b7c00001590eb82e4594f532f3200003ae800000052000000609782b1a8636d617000003b3c0000094d000012460177581e637674200000448c00000054000000542ba8079d6670676d000044e000000135000001bc77f860ab67617370000046180000000c0000000c00080013676c7966000046240000efcd0001e96c26ba0bf468646d78000135f40000019600000518557a607a686561640001378c0000003600000036fc6ad27a68686561000137c400000020000000240aba0aae686d7478000137e400000a8f00001438ae728f976c6f636100014274000009c900000a1e8077ffbb6d61787000014c400000002000000020073e03096e616d6500014c600000020700000426e6a41589706f737400014e680000001300000020ff6d00647072657000014e7c000000f700000149a266fac978da0dd0030c584b0005d17b77dfb759dbb66ddbb619d736c21a516d06b5ed36aa6ddb984c72628daca0df25490a3915d44ad9545e5635b5c7c1648d266b2c5913c89a4cd654cdc2395a888bc95aae358ada40d6566dc35d64ed216b1f5987c83a46d6099dc4d33a83e7c8baa02b789dacdb64ddd57d7ca88ff899acafb6ece8883ffa27fcdfa931add3624667c6accea6e8dcce23bb888b627117c7322e8b955c156bb826d6713d6ce446d8d42db19ddb636777c6aeee8a3ddd137bbb2ff6777f1ce881b8d55b15bdcd7b147cd677643ff0037ce997f8daaff193bfc841c11843c41fc20ff853f805ff0a7fe1ff2125a60ea93167c88979421ecc17f261c150043b842e3824dcc0db71aa1ca7c7c5b8346ec4cd7107ee8a17f04abc82d7e25dbc1f1fe293f8025f25c3e464643212c72463717c32012725537166721acf26cff165f2013f259fe5ef7ef8ee379982a45f25e595f5bb96d30a5a49ab68b5569be7ceee1cb2bed3602dd61aadf1d66fc20369c10078da1487036e44011445cffbb5ad4158dbb615d6616dbb6115d65e478d65d4369750cf9feb8b00d644528c69766e71299aba91de76344dbd0d6d68da6bfa3bd1600af0ff8f02084a5d775f37f66d0dbd9db80202c654a960ae3822a0da52b5356678938ff085a5fa5c71c31d0f3cf14283161d7a7cf0c50f7f02082488604208258c702288248a686288258e7812482489645248a58126c698609269e65860897536d8648b6d76d8658f7d0e38e488634e38e58c732eb8e48a6b6eb8e58e7b1e78e489675e78e58d773e244ca22446e22441922443b224470aa4488aa552aa644d0c04c1837104000000b0fb6c5ddbb6dd8e50dbb66ddb7a250d81d6408758711224499622559a74193265c99623579e7c050a152956a2549972152a55a956a34b8f3e03868c183361ca8c390b96ac58b361cb8e3d078e9c3873eed2b55bf71e3d7bf5eed38f3f415186e1e920002800a0e8ab936ddb5ca0d9b26d63846c6384dc10f13f5dfc082245891127419214693264c991a7409112652a54a956ab5ea366fd060c1a326cc4a87113264d993663d69c790b162d59b662d59a751b366dd9b663d79e7d070e1d3976e2d49973172e5db976e3ce83272fde7cf88a8a8d4a8eca8c6a8bea8eea8f8e8d8e0f9121fc9fd09217227c85a81022fe282503c836a2308ecfa13db45bd786650ba96d5d2daba1bdf7ee7def092a2a000086a8620ec3c470260a8888381011c570002028086a66e6c0990180330005c140cdd9f7cfdbb3181bf5f3ddddbdefeef37dfffff763fdabc844b6fed33f0d4b3513b9ce55cf7f4d55aaaa3979b8eb9c4e36bc8d6f34d2aff44414615f5f6eb6558722996c2664ee7e2643460d29a2f37b5f74bcb52f9b7c3da648e75b039985a5cec3f2bebfbdb6e3ef5c57121d57c6950f641e0c1ebe7ff4a6d6ad0d6a496d5c4feae37abeebed263295e9e38f547d72f6f45414cf3ea107d9e22bb33f9529bfa5cf8f1b6b8d8bc6cd8bef727af0563683f6c1c5cb77141dde3934c15eb047d151f7e8869f189e6bc89dc7419b3bcee45414b2a9e680aa78b633da7391055d9101e38b6d71663c71a5aff5c2787ac1f72562a617d0c942a3b05c45b07e16dbb1adee08fbaab38a4c2cd0cfa1631d73cf1d1722b7c01999fc1d5cdf7000e79905e72e0cff3b7441e74b46404fd8cd188e02e331be5eac623c877b6705ae2cbf337e58da69311fb648f5f4a5edc6ed0fabd4170555c33e194cc873f664862c7c902dfc253357854e04eb2a0ae883bdd2b16cb24a53566602d0b37509d3412328018f458e9cf315199705388502a8295b3a76816f6e13a8f7bfb053f09cff083544972e6884ad2423535660ce0ab999580deb979ab106ec3f32d0eb8fbb4b6d23b889e99731612773b7b1c6b7db6bfc5f1cd503b0254a1004d1ac99cfb56ddbb66ddbb66ddbb66ddbb68dbbb6ededb79dc10eab0e8e05fc65c13f96084e081ce1adbf484832fe0eda7afba6261321c96245241bb98944410a1183a214231625ac3894b6e252960ac4a39295882a5662aa519324d4b65230cc4ac9242b1533add4ac652369d8cc5632b2ddcac24e7691953dec253bfb39484e0e738a3c9cb38a70815b1425c02b2af0c66ac0473ed3906f7ca7093f05cde4f5372d154cc168a3900a495b455134da299ee2d151a994864e418ad0559995991ecaaaacf4344fb2d3cb4429406f555005faaa922ad1cf64a9427fd5502d066880063258833594a1baa22b8cd0355d67a46eea26a315d01dc6e8995e304ebff48b892e940bc32497c6a561aa4befd233cd15740599ee0abb22cc08728a5926554fe6985613986bfecc61b39be716b2db2d73abd9ef36b81d1c358d7671ce44dac37953691f174ca6035c7487dc69fe8844c04cbac13d77cbdde2be0bb8000fcca7bb3c349f1e1164d4131e9b53cf786256bde0a979f58a6766d60f9ebb5fee175fbcbcf8eaedf8665e85e2bb0fe3c3f0c3dc0ac74ff32a0ebfccac84c2cc4aacbfccada4fadba7f659f48fcfef0b2b8c2fe94b2ba2afe02b288a6fe89b2aaa6fe95b2b96efe2bb28ae1fe4872b9e1fe5672ac96f8aca4149080000a2edec1be51a35ea37320671906d37cc363f21db7667dbb66d6370be5bfcc1c2affc4af3fdceefb4c01ffc410bfdc55fb468e2d7b478e2d7b4d47f1dace50e75b85639d2715aeb04276abd939da68dce71aeb63adff9daee42176a878b5da69dae749df6bac10d3aec16b7ea88bbdca563eef1a08e7bc4a33a8d406799c2545d6426337599d9ccd115e6b252b759cd6a7d652ddbf48d7dec53082739a7502e7041d15ce1aa62b8c10dc5718bdb8ae72e7795c87dee2b89873c5532cf79ae0c5ef24a99bce18db2f9c027e5f0852fcae71b3f54c02f7ea9983ffc5109ff0851296184a9864Line truncated
|
||||
|
||||
// Static4 returns static file
|
||||
func Static4() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic4Data)
|
||||
|
||||
rawStatic4Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 85876,
|
||||
85876, 171474,
|
||||
"munWVF19fYI=", "QvEVEsg2TYs=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic50Data = `7b2276657273696f6e223a332c22736f7572636573223a5b5d2c226e616d6573223a5b5d2c226d617070696e6773223a22222c2266696c65223a223732333762303734343439313032343039376433642e637373222c22736f75726365526f6f74223a22227d1f8b08000000000002ffaa562a4b2d2acecccf53b232d6512ace2f2d4a4e2d56b28a8ed551ca4bcc853173130b0a32f3d28b95ac94947494d232735295ac94cc8d8ccd930ccc4d4c4c2c0d0d8c4c0c2ccd538c53f4928b8b95600605e5e79780b4d402000000ffff`
|
||||
|
||||
// Static50 returns static file
|
||||
func Static50() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic50Data)
|
||||
|
||||
rawStatic50Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 102,
|
||||
102, 206,
|
||||
"Pax14oQxroQ=", "aCysfJVxov4=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic51Data = `2166756e6374696f6e2865297b76617220743d7b7d3b66756e6374696f6e2072286e297b696628745b6e5d2972657475726e20745b6e5d2e6578706f7274733b76617220693d745b6e5d3d7b693a6e2c6c3a21312c6578706f7274733a7b7d7d3b72657475726e20655b6e5d2e63616c6c28692e6578706f7274732c692c692e6578706f7274732c72292c692e6c3d21302c692e6578706f7274737d722e6d3d652c722e633d742c722e643d66756e6374696f6e28652c742c6e297b722e6f28652c74297c7c4f626a6563742e646566696e6550726f706572747928652c742c7b656e756d657261626c653a21302c6765743a6e7d297d2c722e723d66756e6374696f6e2865297b22756e646566696e656422213d747970656f662053796d626f6c262653796d626f6c2e746f537472696e6754616726264f626a6563742e646566696e6550726f706572747928652c53796d626f6c2e746f537472696e675461672c7b76616c75653a224d6f64756c65227d292c4f626a6563742e646566696e6550726f706572747928652c225f5f65734d6f64756c65222c7b76616c75653a21307d297d2c722e743d66756e6374696f6e28652c74297b696628312674262628653d72286529292c3826742972657475726e20653b6966283426742626226f626a656374223d3d747970656f6620652626652626652e5f5f65734d6f64756c652972657475726e20653b766172206e3d4f626a6563742e637265617465286e756c6c293b696628722e72286e292c4f626a6563742e646566696e6550726f7065727479286e2c2264656661756c74222c7b656e756d657261626c653a21302c76616c75653a657d292c322674262622737472696e6722213d747970656f66206529666f7228766172206920696e206529722e64286e2c692c66756e6374696f6e2874297b72657475726e20655b745d7d2e62696e64286e756c6c2c6929293b72657475726e206e7d2c722e6e3d66756e6374696f6e2865297b76617220743d652626652e5f5f65734d6f64756c653f66756e6374696f6e28297b72657475726e20652e64656661756c747d3a66756e6374696f6e28297b72657475726e20657d3b72657475726e20722e6428742c2261222c74292c747d2c722e6f3d66756e6374696f6e28652c74297b72657475726e204f626a6563742e70726f746f747970652e6861734f776e50726f70657274792e63616c6c28652c74297d2c722e703d222f6173736574732f222c7228722e733d3530297d285b66756e6374696f6e28652c742c72297b652e6578706f7274733d72283136297d2c66756e6374696f6e28652c74297b66756e6374696f6e207228652c742c722c6e2c692c732c6f297b7472797b76617220613d655b735d286f292c633d612e76616c75657d63617463682865297b72657475726e20766f696420722865297d612e646f6e653f742863293a50726f6d6973652e7265736f6c76652863292e7468656e286e2c69297d652e6578706f7274733d66756e6374696f6e2865297b72657475726e2066756e6374696f6e28297b76617220743d746869732c6e3d617267756d656e74733b72657475726e206e65772050726f6d6973652866756e6374696f6e28692c73297b766172206f3d652e6170706c7928742c6e293b66756e6374696f6e20612865297b72286f2c692c732c612c632c226e657874222c65297d66756e6374696f6e20632865297b72286f2c692c732c612c632c227468726f77222c65297d6128766f69642030297d297d7d7d2c66756e6374696f6e28652c74297b66756e6374696f6e207228652c74297b666f722876617220723d303b723c742e6c656e6774683b722b2b297b766172206e3d745b725d3b6e2e656e756d657261626c653d6e2e656e756d657261626c657c7c21312c6e2e636f6e666967757261626c653d21302c2276616c756522696e206e2626286e2e7772697461626c653d2130292c4f626a6563742e646566696e6550726f706572747928652c6e2e6b65792c6e297d7d652e6578706f7274733d66756e6374696f6e28652c742c6e297b72657475726e207426267228652e70726f746f747970652c74292c6e26267228652c6e292c657d7d2c66756e6374696f6e28652c74297b652e6578706f7274733d66756e6374696f6e28652c74297b69662821286520696e7374616e63656f66207429297468726f77206e657720547970654572726f72282243616e6e6f742063616c6c206120636c61737320617320612066756e6374696f6e22297d7d2c66756e6374696f6e28652c742c72297b2275736520737472696374223b66756e6374696f6e206e28652c74297b666f722876617220723d5b5d2c6e3d7b7d2c693d303b693c742e6c656e6774683b692b2b297b76617220733d745b695d2c6f3d735b305d2c613d7b69643a652b223a222b692c6373733a735b315d2c6d656469613a735b325d2c736f757263654d61703a735b335d7d3b6e5b6f5d3f6e5b6f5d2e70617274732e707573682861293a722e70757368286e5b6f5d3d7b69643a6f2c70617274733a5b615d7d297d72657475726e20727d722e722874292c722e6428742c2264656661756c74222c66756e6374696f6e28297b72657475726e20707d293b76617220693d22756e646566696e656422213d747970656f6620646f63756d656e743b69662822756e646566696e656422213d747970656f662044454255472626444542554726262169297468726f77206e6577204572726f7228227675652d7374796c652d6c6f616465722063616e6e6f74206265207573656420696e2061206e6f6e2d62726f7773657220656e7669726f6e6d656e742e20557365207b207461726765743a20276e6f646527207d20696e20796f7572205765627061636b20636f6e66696720746f20696e6469636174652061207365727665722d72656e646572696e6720656e7669726f6e6d656e742e22293b76617220733d7b7d2c6f3d69262628646f63756d656e742e686561647c7c646f63756d656e742e676574456c656d656e747342795461674e616d6528226865616422295b305d292c613d6e756c6c2c633d302c6c3d21312c753d66756e6374696f6e28297b7d2c683d6e756c6c2c663d22646174612d7675652d7373722d6964222c643d22756e646566696e656422213d747970656f66206e6176696761746f7226262f6d736965205b362d395d5c622f2e74657374286e6176696761746f722e757365724167656e742e746f4c6f776572436173652829293b66756e6374696f6e207028652c742c722c69297b6c3d722c683d697c7c7b7d3b766172206f3d6e28652c74293b72657475726e2076286f292c66756e6374696f6e2874297b666f722876617220723d5b5d2c693d303b693c6f2e6c656e6774683b692b2b297b76617220613dLine truncated
|
||||
|
||||
// Static51 returns static file
|
||||
func Static51() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic51Data)
|
||||
|
||||
rawStatic51Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 478034,
|
||||
478034, 601315,
|
||||
"hNI8W7rK33A=", "fQ+OdVZVml0=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic52Data = `774f4632000100000000fc78001200000002a3540000fc130001000000000000000000000000000000000000000000001a84621b81bb4c1cab10066000a446085409833c110c0a87dc2486fb730b941e00128a180136022403a838042005882607200c82495bcb6792e6740c985a5f60adaca5db10a8779f335553781ccfa032860995c1d07b758ed53d78945c68312770676fc470db00a8666d4e892efbffffffffff97259318d34b804bf20f808222226a6d6d6b9ddd062a341a1ce148d902758336754adf44d6cc5472a36c3bd7b21c9471dc51db579253a9b902596fc6dd614646aede515d904e586554efac92e992126a247dd4598193da6f2ffb86708e8221bcbc238bee2fda64869a62b9625a7a2c2921296f0653cc106219237083ef6e6969b411ef6a346afba16d2753ef5134bb69864fd5db7952ea55eb2c0b1766e864e7de2b06d3882fd1041d8b49f2b639a933d260c8e9fb318c2202314b13864918c2851d89c6d91329cc889ae8dcb49f8d91a420090a9292829222a81a48cae79f8b634759efe5fd072fb8745801abc877123388d732a0c7437881cfe22cff89788ab6c8b63a4ff5b21ec4ca2bf6e5874ed5b029120556dd9583a0b8e1779da937c55af5704d2251bc2ae7c7db36c7dbc5028d588f0127b6b70f47807fd3dde5e0d91f747693ad4c75b743f3c84b249c3dce72d68da5ece440d54a5aa7fac384e36b8c6f9184bbdfafd3bf1a57fc077b6a2ea9f88097f29690e4afb71a31abac5c830d6a8d5a9a0d9466eab06fcb7e0d88706c0e401591544dd70dd3125b1c716d4f9b9fea17fae7f9b99c73effb3f98550cad985077581396bab3ad67c52d5b1783e4fd3c3fb73fe7befbde920163c2180346f5a8119576e1ef22d36e4ad0068b361afd82499a980503fc3affbd0b9d1bb36ab132165858e96fb6cff418a3a7e3449dbbc31dc7e9784fdd71ea54f42207689b1d626eea54cc9e99586021a880d11894810536da581898881d7313738273eae67473fbcd65baf845bbe801705be16c308e0809717198a68d450e307212229122a1a162d2bef3a85cb7a6f3c6f4ee731ece7ba5a5c10d3d22648b3870cc8629980c6528ae2ba89e3fd8bcdb0f62619004feff1fb0ddedbf13a621459605410521a1c29c722782a64d0e24b43c55306955cf26803bb4e385d13f38a7e98ee830270a0c00db03bb1587a5011971675839d633ba0d10e08415225cb3500930d57d860835466c84d6a7432766422f23200306087e7837ed25b074a998332a2e88079ab404ab0950b50035564f274ab693c289feedebeeefbe7eeecbac09020600de3bd7f7de19b1fadb13ea8c4155a78f1c7bd63c070abb1fb9cdc24fbb5d4abbe92499a69903bcb4a502035105c432009e01655a837efc951ce232ac7bd205808a2a7db8cca5ceff7fed4a962519a23832298ae3931ca0b9fb883b2e5f5d117ec4541fb803f44e9f108012e66c856d07985d7e488a240a4fca111bb191b9116ac66f2e988d44690cb8b37cfc3ddf07696c6024cfffcf1beefb55481cc308ca58d3ef257992b51625baaa2ac04ce47b5de4ffa1e3697766de06055f8fb0c021f53db00d06c9babfa9dcac6712a09a2a36a9dbd342c50215b39c29be550d543e2f54e65fd12fcf334d75ff7e6e0775c7ff0ff1ba79c2a740cb94ba10d192b721d7adff0db34432a5c2265b57032d7c50ce7283159dd9d70a6901f8c6cc0da714c689790c95bbe33f6952526a5a3220d12b3d1e080d808ab0a480957f2ee470cf232417fabe9ad16252ccac9448d9d36fee5eb7fd1a6d08425884d0901002b7ffb7ccaa1fc667b88c34b6b2b2b29c4a6a95a68ddbddd39cb3ebd839f579a8c5e701b38febcce37380158002b017b01ec01afeffdfb9ff3f80010c1911b98a29dd171356afb5fdbfea5f5bac3dc719de7f3afbbe4a09a8d245567b52883fc71b30b88d23606bfcfc5fdbdd48aa8d6476606f7f0c671f72905087996ca2b3ff0a062c59c1c698b86cc82f77ff9aeecc9c6ac96b265d43c70bf1136063540e7235f76fc0c1775007e8aa713ce1ee6d925720a18055a7ba4e5597d503dee35298f87713d37601106daddfe48432fccb0b0d2b0b039487affb574ddaffda5d3a58c03ade0d2dbe0dd002e663a94b2af630d829582386fd3f55abd22a029c06dd8e28edbe9576f70c6f4fe74c904dcf196793b0f0ab0a85aa026800506a82a20c2947b515a53152af2140f53b52ddb74fd27a9f9d71614badf53e3ee383d4863e8bf3e3019a7bb5c9808441a1d0fbdf775420701b4ba05c7f4a6a2415baaad90963c6f3ff7feffbfaf69896d0b2ab013c232ead9cb47e29d69a4528e8a57dfa7edf5cdaf97b579802a97b5517d7ac4abc4ba6b8a70a40ebca244ca5ccb92249407b556c8c29cffffff24be9db926cff8203585f369fa9007384bcfe9f1e4f9d29a572ee69a7d00f4ab91c42423663ae65d472ec65008d8d0400f132e7e6095ae357e7a13b78a8d7be686f88ede72e2c123a441abd124991f9d799aefaa710d2db1586b77719e57fbe4ab2ec9cec230c5b61967de4b343449bed437080d8498970045a81b7ae4b98d74e6bf7a15379edff996a95fedf4d70448038b24bb3363a6b83ac1a32f69c8942e8a39b1fec6a8012008e01c43194b8ce68e68c57fdeaa6d8d5a49600b5469cdd775a9db33e092f0976b3cb2f0c6e79e89b369df9d7d79a14ebae5186be8e08c7c3989c6a0a2941792203e87f4eb4ffe017ee954448d3d694c5844d8b5daa5a2d968b9db3046b46109dd81d3dcf8fa9beefae6457fa20ec4016b04eb42e50efe787105a4b9fe8cfe58dab9f8b057cbfe5bfd2b9b36e1da2e7d5a60e24f9e3b3472eadb00096204bdafd65943a4a7d46a10e6081011819fe3d89cafb2181adbb1a5563f5e662547d2756ef3ebb4d7a4cca2c4b18966006911a238c30c208634208eefca33788dbb847b0988d064b90710cc6416d1a65d6f63b8b2d44820439deba94cca528537c5146c47971d61a27c6584b955ef2d0531e28edb19ff27a70ac181e318066a0b24edf5a6dbfbb8ccd479685f66fbd8cda002f757a72889c02db2c20eb5f50183bac39ab5d86b37feb9e7c93139f434b8b069210e8768ccdffe7eafd885838752d2671c005f89e3dfdff932e96b3e8e2a9efaa7145555545451c31f732d7f7f09a7ba5bbbfd4ed80a02001929036c94c8a5ea2cbc626f9d2d238920e974137186cdc9a84ba55f7f3ef0a822001006c4b0893590984449801f9ddef904c99906cd9903c7990428590622b20abac876cb30db24b1d86468d9026cd90134e405ab440dab441ba7441ce3a0b39ef02e492cb906edd901bee40faf543860d43ee7b0879ec13f1459e189300c52003283e0a00a53f0528e594a054330765392b18d9cf0194fb3c4069a601e5377f5021f30415351f5071f30795b20050e90b07357d31a0e68c006ade48a0162d1154c652407db33450df8d0aaa293e46cd6d20Line truncated
|
||||
|
||||
// Static52 returns static file
|
||||
func Static52() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic52Data)
|
||||
|
||||
rawStatic52Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 64632,
|
||||
64632, 129263,
|
||||
"RxB0AdCts3U=", "/BqQFQ456ng=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic53Data = `774f46460001000000016c2c001200000002b2e000010001000000000000000000000000000000000000000047444546000001940000017300000262b442b08247504f5300000308000030550000652ef96e4b86475355420000336000000b7c00001590eb82e4594f532f3200003edc000000520000006097e6b164636d617000003f300000094d000012460177581e63767420000048800000005c0000005c311c064d6670676d000048dc00000132000001bc87fc24ab6761737000004a100000000c0000000c00080013676c796600004a1c000108970001f59a63e03c4768646d78000152b400000195000005184f736875686561640001544c0000003600000036fcdad276686865610001548400000023000000240cdb12b3686d7478000154a800000a6f0000143875df99806c6f636100015f18000009b800000a1eb00b2bb76d617870000168d00000002000000020073e031f6e616d65000168f000000230000004c1a1317c37706f737400016b200000001500000020ff6100647072657000016b38000000f40000015839dd89f578da0dd0030c584b0005d17b77dfb759dbb66ddbb619d736c21a516d06b5ed36aa6ddb984c72628daca0df25490a3915d44ad9545e5635b5c7c1648d266b2c5913c89a4cd654cdc2395a888bc95aae358ada40d6566dc35d64ed216b1f5987c83a46d6099dc4d33a83e7c8baa02b789dacdb64ddd57d7ca88ff899acafb6ece8883ffa27fcdfa931add3624667c6accea6e8dcce23bb888b627117c7322e8b955c156bb826d6713d6ce446d8d42db19ddb636777c6aeee8a3ddd137bbb2ff6777f1ce881b8d55b15bdcd7b147cd677643ff0037ce997f8daaff193bfc841c11843c41fc20ff853f805ff0a7fe1ff2125a60ea93167c88979421ecc17f261c150043b842e3824dcc0db71aa1ca7c7c5b8346ec4cd7107ee8a17f04abc82d7e25dbc1f1fe293f8025f25c3e464643212c72463717c32012725537166721acf26cff165f2013f259fe5ef7ef8ee379982a45f25e595f5bb96d30a5a49ab68b5569be7ceee1cb2bed3602dd61aadf1d66fc20369c10078da0c87834e40011885bf3fdbc6986ddb1af3986d37a6317bc878808cc7c8361f21778f0f02e8e047066a09491959d8147736d56053de545a8d4d4d614b1d36a801fcfda102082ac50dcd0d18549736d561060800a250050d152304146b29d6411d0752103e95af8319e658608915d6d8608b1df638e284332eb8e2863b1e78e285373ef8e2873f010412443021841246381144124529e574d34b1f030c33ca386bacb3c1265b6cb3c32e7bec73c021471c73c229679c73c125575c73c32d77dcf3c0234f3cf3c22b6fbc8bb7f84ba0044ba8844bacc44ba2a44aba64489ee4cbb4ccca92acfe13040fc861000000043b77b56d9b0fac1d3756f5841ab16ddbb6edecf284a73ce725af78cd1bdef28ef704104810c184104a181f08278248a288268658e2882781443ef29f64524927936c72c9a790624a29a7926a6aa9a791665a69a7936e7ae963802146186382296698638165565967d31de24e77bbd7fd1ef4b0473dee494f7bd6f35ef4b257bdee4d6f79c77b3ef09101061a64b021861a66b811461a65b431c61a67bc0926fad14f7ef68b5ffde6777ff8d35ffef68f7ffde77f934c36c554d34c37c34cb3cc36c75ceb6cb0c916279d76769b523280701b8ce278ee96d36edaeed6d69695c66c36b66db918bad6bd7c5fbe61660e710680430c0503c5b1619829a6608281030c4c30c554300073262002a28028869ae1ecbdbce65663e3fcfcd3e6fb9297effdff4fafe875bda5bfd45feb6fb62a5be7b54d4d435d5087dac6b985a66bdac68fca311860544eaa07c29355309525e2ea7339429af2807e95258f6a7aedbbccdd99bb04db4954bbfe44843282a4feaef1b5f14d063210998c6472f1d84db77b30c6ab2723656dbf770ce1614def92d1bcdc325abfda1fdcb47d24832b6faf1e76824ed8997666dd6977d6fd695ae6f4daa3ebb51b991cddb46f2560df06fa3e4cf08adc69de8df06e71efe3fd17d6a6e5ef3c85f94e0a633bb4d3079f65d4737baf1e7e198c65d47fdc8ffb27836783b1f04486a74e079f64e41830071bc6d81731a2ffdc1faf833148c020d470d7df0d950f0db5a7f6958fda634053fbe4112373acbf06982266f8c45cbdc44944b80e240c7957e2a66e8a95c25260129c0a247f0beb072886f362789d15e0bb59299914e484bb741237a5340b7c64889daee39794f7e8408359ad0f85c7dd16fde1048958b5f934e5ecc8dcc12ce5c8c14ea943ec33768cd5334d98d05b382571f93c9832079bfca19972316174698ece2c91e2cc9c127557f8844e50c660d25e992bed94bb05b84a0e504d98e0d32c76fb2cc27aff137721b27f4964ec3a0bbdc1a994012cd091263a74da1356e1bcaa322a660d77c8af3fe916de469426755f6889395aa7133b5c4deff03745f5006309000441b466ceb66ddbb66ddbb66ddbb66d5bd1d9b66def6eff54d8b1fae1ac21b482b0ca8844649c582a3469c84898c0cf6bcd465ea2905fc5a120c5884b19ca92980a542429955572aaa914d4a03629a9abd2525fa5a3214d484f339599892a0b73555696a86cec600fd9d9c701f27048e5e7882ac0714e509053aa30675411ce7181a25c5165b9c603caf1888fd4e4b36ac90f7ed18abffca32d4106ed2d9485a19345b48874b52816856e16df12d2dd525a4a7a5956cb4eef8023f49324f918284d0a3048a21462b04c29cd10ab6db5196675ad2ec3654b7d4658636bca481b6d631863e36c02e3ec96dd62a2ddb1bb4cb2fb769f29f6c81e33d5deda7ba65bb00533cba37a74667b76cfce3ccfe5b998ef65bc0c0bbc9c976761402a16cbaa212c9557b359268196b3c757fa1a8ef846dfc609dfed8739e747fd2897fcb81fe7b25c3ac915d9749aabf2e922d70226f1c0eff93d1efb037fc0137fe48f78ea4ffc09cf24d44b9e4ba9d7bc90546f7929addef34a627de4b5d4facf1b0ff6604228aa6700b1020088827ff3b68a6d3b55aad8b66ddbb6cd32b66ddbb66d1b67df4ddf4f384241044010496a520751a4256d104d7ad20731e4256f104b7e0a057114a18892518c6282e29496a9462da5a6018d9481e63457667ad0475918c020e56434a3958799cc535e16b2528559c31a9564031b548a4d6c5269b6b14d65926653d9a4d9549efd1c55458e73523538cd05d5e61297d590abdc5063ee715fcd79c843b5e4318fd58aa7bc506b5ef341edf9c42775e51bdfd58d3ffc510ffe11ad9ec411afc196ada14ee1941ae9b44eabd14eefac1ae3dcaea9c9aeeddadaeaba6ea56deee44e3ae2c11ea1a31ee5513aed711eaf339ee4493ae7299eaaf39eeee9bae8999ea94b5eece5baec955ea91b5eed35bae9755ea7dbdee42dbae36ddea6fbdee15d7ae03ddea3c7dee77d7ae2033ea6a73ee10486e92aaaae6b0dLine truncated
|
||||
|
||||
// Static53 returns static file
|
||||
func Static53() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic53Data)
|
||||
|
||||
rawStatic53Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 93228,
|
||||
93228, 186336,
|
||||
"mnOktlxkg6s=", "gbp1TGgcQl8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic54Data = `774f464600010000000162a0001200000002b0ac00010001000000000000000000000000000000000000000047444546000001940000017500000262b44cb08c47504f530000030c00002c8200005dd2fd1619e54753554200002f9000000b7600001590ebf4e4a84f532f3200003b08000000530000006096ecb127636d617000003b5c0000094d000012460177581e63767420000044ac00000048000000482e3201ca6670676d000044f400000133000001bc5ff21aab67617370000046280000000c0000000c00080013676c796600004634000103690001fb6455d527f868646d78000149a000000198000005181229252f6865616400014b380000003600000036fc7cd2836868656100014b7000000023000000240c7d1265686d747800014b9400000a440000143889b726516c6f6361000155d8000009b400000a1e6912e49f6d61787000015f8c0000002000000020073e02b36e616d6500015fac0000022d000004abc402e80b706f7374000161dc0000001500000020ff61006470726570000161f4000000aa000000e32b36c9bc78da0dd0030c58590005d17bdfffbbb56ddbb66ddb36e2da465823aacda0b6dd46b56d1b93494eac9115945c92a45050419d944fd565d553771c4dd664b2a6923583acd964cdd5225ca295b89aacf5daa2483bc8daab7d7888ac23641d23eb1459e7c8baa08b785957f01a59377407ef93f598aca77a8e2ff5137f93f5d7961d39c2844e84e99d19b33a2be6746ecceb7c8a5cd845649771592ceff258c555b196eb620337c4266e86addc0adbba23767377ecedded8d77d71a007e2600fc5e11e8e233d12f77aaf22eff311055ff353d92ffd123ff9137ef117fcedbf727008188718138684983824c5d42135660899304bc8820543412c128a60b1500c4b84d2d83df4c631e1013e8ee6cad1fc6835ae8d76e2eee8001e8a6ee09de80ede8b9ee2f3e825be893ee0a7789c1c4f8c27e294782a4e8f67e0ac782e2e8c2fe3d5f83d7e8c7fe0aff8b7fc5f82ff92c91424259554545672ada70db49136d1666d36cf9ddf0564fda7d15aad2ddae2bdff00d61769d500000078da1c88035245011486bf73b3ad8761b66d6b9887d976c334cc5e47c632b2cd25e46eef9cdf08604938851867661716a3a919ea6e45d3d05dd782a6b5aab71d0dc600bfbf2880a0d474f67462db52d7dd8eb361e15fd5573055ec115069aed212133cc945f8c05c6dceb8e08a1bee78a0418b0e3d5e78e3832f7ef813402041041342286184134124514413432c71c49340224924534703238c31ce2433ccb1c02a6bacb3c1265b6cb3c32e7bec73c021471c73c229679c73c125575c73c32d77dcf3c0234f3cf3c22b6f122211122531122709922619922579522085522e15b2f2c73038605b150000f0de99e76cdbda403bcb767d2bfb38dbb6edbe6d5b83f068782a3ccb5ad6b1814d6c660b5bd9c67676b0935dec660f7bd9c77e0e90463a196492453639e492473e051ce43a37b9cd5deef390c73ce5392f79cd5bdef391cf7ce53b3ff9cd5ffe534409a594534935b5d4d34833adb4d3450f7d0c18881163264c39d2d18e75bc139dec54a73bd3d9ce75be0b5de41297b9c255ee7497bbdde35ef7b9df34d3cd30d32cb3cd31d73cf32df0a0873cec118f7acef35ef0a297bcec15af7acdebdef0a6b7bced1def7acffb3ef0a18f7cec17bff9c35f36d8644b241e19159910d910d91ad9198d47930141307c6af5d420b425880441d8167f3f44291940b61185717c0edda1ddba36ecb690dad6d5b21ada7befdef79ea062020060882ae6304c0c67a28088880311510c07008282a066660e1c0600ce001404404decfbdfdbb3181bf5f3ddddbdefeebdeffbff3f918bfcee4fff345aa9b92874a1fafe5b0a28500bf270d705bddef436bfd358bfd1535146037db9d5515d8a65ba9592b9f7950c1935a298ceef7fd3c9f6816cf1f584625d6c0f651ead7411ad1ef83b1bbbfeee752dd5496d52fb44e6e1f0d1c7c7efeabdfab09ed6278db43169147bde5e2a33993df94cc1d3b367a7a27cfe0535c8365f998399ccf82d7b71d2dc685e346f5efe90b3c3f7b215760e2f5e7da0f8e8ce9109f7c37d8a8f7bc737fcc4705f23ae3c093b5c712e67a2942db50014e0d9f668d7451ef6440e8c2f76c499f1c495bed64be3e925df2bc45c2fa19385c6d16a1dc1fa596cc57677473450dd75646a817e0e9de8846beeba108505cec8f4efe0fd0d07709e59b0eec2f0bf2317745e31067aca6e267014188ff1f5721de339dc3b2b7065f99df1b9caaa5bf48729527d7d69ab71f3c32a0d4449413420830eb9cfbecc91850fb28dbf64aefaee7bc1ba8a12fa60ae74225bacd28c959902d46c5d4277d0084ac0635120e77c45c6650156a100f6946d9db8c037b709ecf7bf401738e71fc1e7a34a1734c6549291192bb060855c4fac86f54bcd5903f61f19e8f5c7dd4adb186ea2fb2aa6ec64e126d6f8767a8dff8ba37a001604888120dab37bb66ddbb66ddbb66ddbb66ddbb66ddb76fea58b296b1e8e4504b220882542120a47442b10894941e080adb76f5ab2109a6c56647290972814a608b1284e09e250ca8a47592b3ee5a94402aa5849a86625a506b549465d2b1523acd44cb1d230db4acb7a36938ead6c27333bad6cec660fd9d9c77e727290c3e4e62867c8c705ab1897b84371eef1964abcb71af1856f34e627bf68c61f410b7905a6b5422804ed145aa169af688a41072550023a2b8dd2d1254011ba2babb2d24bd9959ddee6494efa982885e8ab4aaa447f55511506982cd518a85aaac3200dd260866aa886335cd7759d51baa95b8cd61ddd61aceeeb01e3f44a6f98e07030d98575e199e2d2bab44c77195c0666b8c2ae08335d71579cd9014e31c7a4eacd3cd36a12f3cd9f796c750bdc62f6ba156e2d07dd26b78be3a6d11e2e9848fbb8682a1de092c97488cbee883bcb7f91b86726dde2a1bbe3eef0c86cbac763f3e9014fcca7a70418f59c67e6d44b9e9b55af79615ebde5a599f59b57eeaffbcb772f2f7e783b7e9a5761f8e5c3f970fc36b722f0c7bc8ac75f332bb130b3922a90b9955c817d5a9f4d417c415f54e17c695f56917d255f49d17c63df5cd17d6bdf56717c37df4df1fd103f5209fc183f5bc9fe51540ec85a0000106e67bf51ae51a3ae91ed06d976c36cf308d9b6ed9e6ddb36064f3f163758f89eef69bc1ff99126f8899f68a25ff88526857f4d93c3bfa6a9fee8ef9aee9ffead79feeb282d748c63b5d8f14ed2526738532b9ded6cad76ae73b5c6f92ed25a97ba4a1b5de31a6d77831bb5c36d6ed32e77b857bb3de080f623d0418630544719c9481d6734637482b1ccd579e6335f2f59c82abd62139bf483bd1cd24f8e7044ff39c149457086338ae21ce715cd452e2a96cb5c561c57b9a9786e735b29dce59e5279c003a5f38467cae0052f94cd2bde288777bc533e1ff8a0023ef1Line truncated
|
||||
|
||||
// Static54 returns static file
|
||||
func Static54() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic54Data)
|
||||
|
||||
rawStatic54Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 90784,
|
||||
90784, 181419,
|
||||
"rojMVxRXfn8=", "ACtyu142e1o=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic55Data = `774f4632000100000000ffcc001200000002a4540000ff660001000000000000000000000000000000000000000000001a84621b81ca2e1cab10066000a446085c09833c110c0a87ce7086ee400b941e00128a180136022403a838042005886807200c82535bce68920aa923d6eb063ec480a801cdeb36845e35755af61e3cef1be2947524e7886ad7f0f2220d9b29a707d0db062fdcad2a900580cefeffffffffffff95c9e499f32f7978491e5344718155ab1debb77f810692309a53b808914b5451d7a269333a8d62d923af9a3c04d6d8e46edceef6fd61dcd5fa5e711cdd26b399b10934218268dcb08af55cad4b5866271c07ef1122c6d343271cde55ac6c7bce2855a215212c99d43dc12fbb2aea2bd1f238201e9349952cccb1077b51ded6b0408b487ee0e2b41db68d09f6b21177617e16d778d2a81fb315d4af94eb7311777dd6a9535f634bf9d24e545e93bba369992af9a41996aa6f9533b21f94d9bd8dc7b7c8c4bb7c7647c8de5d5b99e54a9c03a6be258d17dc65a5dd418d68520926cc17ed518e32b817153e42bb839a810995687220e4198eacbde1490ee2fd412e4553b883fa67fa460c14ab28fa0bd4287a8cca2ff536a82c35523d5135aae4ac193eb41b4639c9590eb74257daa49fb0568f1549727774499a196a8a30c548dda8b9c3cd083704bbd7f28a1771c080fbbd41874678c2299dc551d960faee6a3c0d22f4bc80ef39238bdde27de8446c4599e20bf313f8bdefc5cf57ee293735ac428570d4938bbc0c7c96a8d0feb1527395fa1f7dc756f48888eed865d1e693caa45a6e4d58da459dcee366392d45adff2cdea580cf45f92ee8afa04e492a6451ff4ed37e1621dc5d8470f716f3b1c46cff613de5802c4ad76664dde4fe9cb5134ab54c9e8a7f0a0cc6e51fb38454da76ced539d213c218e54b45edf760cfdf0ba1b0c046a662a32214b177ac40d80813cdf0fce7f9b5fdaf7d6e0c330c2131202230482a430d6d25e550c69026d8013ca215c698a7c83cacc4eaffc5a840ccc40a6680f4ec2e62468808220882881d33a446c5a855d5da35aa2d1d5397d965c58cdd2ffa3a75e9b70d1d6fad9aa12a562835225a31a362ac01709ba0bfd279cec993171f3efe13411010be802272c48b8468477fd6b76b6a6668df3d5fc7dae9efd46eb977a4b32d6b536ee50ac7c9f3e6ce8bf3a65c9b8db0cd468c88290c672fe2552a2b53f429fa40416b7b423659e616b5a416baa5ecad93804f5a7ba897a42a3dbb0708e4d89fb1e7011d8145d00b7fd268e1a53b4219d8df97d3be6a89abba256bfc1798df9d50605b9938683bf67066c692ea2225372b392ed215e1f6910403bbbce8b4060456b7019bd2935c6bdb2fd3b36d734ead35933d41c42abeef215b12ad34cd81a1e199b6f3b3ef8e9cc9a2dfef3e621284dad73a6cbbefe75724ee2c1d3a70d8b61e27724ef3225644bf7b79c5310fc543aecdc482b87c27c1c3eeea9bbf300d2e2f3acb1ec564f97bdb67efb908ddb7895e3f9c37a8d1c2ac7e30fa68a20c4799c34fa929021c0791e520536e5290b84aaa72e59b395d8766210aab2d5d9d3bf302467a0eebaa83fcdefb119ad5017ee22563e0ea756790a4d2696516dfdbd099ba9797650f219829c8633b919b66354983689d529b79d89c66ee74f31701bfcc049dbd09d5d7ecdd9479d099be9099c1343acf9f9baf70a6c65729e0eafe98c200ede5afd11cd5ac24b013de2845edb64930c440ee51438ae7fbdfef41f79c3f736f00858b8e8c4cca0ec1d658d0158e84895015b64256982a5ebefc6680ec76ff6fecf0c62a256aa3a2818a8c55d69a6f8eb7dfdcffd69bebffad55a8ac6297fd870845055e547536472fa40fc0192ce5ee93120f80a64e2c73fadd01ccff9cced84a87b31192751e1925d94955515563fd8e0de9eb589a81730abd1af00070e1653d2b3033040a408082dad831cb0388f21ab2217443e9aa3595a66b6ed9b2692f2800073db4ef2fd4030c181f51dcb473817e8af214d68d48a093429fce1ad8068364dd1fff3cdcd7eeac2dcb42107082e17c100a3c8ee89d8290d86fead714db53dc64f738cac471fadfa22ba5c0c37401cb02b6075800fc7adca89391afca7a409523b0a520cde4b897c0c0e2980ef0497b607725cf6dd7030d48b91bb9b152086d07465c136c4c909b86e3d9c9701ea35d45fd2f9d55b7b96512914146989905d61e0044f9a6c1fbaf54ba1b5a735369881e13ff7f5466e637474453e369d0161a291222506e4a1ab0289871762974d8c6fcf1786417d53593f5ec66f77228b0b038c8fd3c218b1ed14111dc182490df3b2d47a356b7b5a7bdbb94ee00e605cc007d02648cc241521616e6ff4cb54aab00b4d4a0883724c761d763f78ca8f541469d3126caba7f5575755575038d6e80a641d080e4482064c97104c7c0501a80e0c88fe3b935d610d23827cd3aa739eb7c10dae8f2c447cebdfca2e8f2f8f2f878feebbed4e97a40c7ae06b0dd7e0f6d1b0dd88c65b1c47159291882f0441f258fa103c21f2dd89fcd0ad86a6932f51216b8823a9eff7e6fbdd2bbfeff92fa324d09907f999be901e608f99b3723a9b79e533b8fc629f4711ee77608019a7015773b8ff358485865064c99cbc4d79fc86fd6128a9d78c0a294a91e7ec9f4005b2b20f7ffd4b44aff07d894d824564249f3c4791b9d71997d79019266a8733edc24a43e1afa4d14206aba9b634869384b8aeb8cf69ce9aa424bc40739cbc6681c4f6bbce68c8bf63267421326f72e322e882f8ad665e77fa9a6ed2ede7e8bc40233b7c469083b433a38a65a2e3a942a6a17956e81358eb7fb954025726438c4c473c2b9a23a8d2b8fab36c4cae3a28df0c4cf2def1efe6bb9e1b18b1dfe1b64b112d8d206891835146222f54c82409b28f5a9a9644f090185930a00c8c21cfd8357bbe1eff7bedeb728db68b3370b2ab0016e22033ccb4ceab24c1a5637656b63d4ef7278f42bacc0a8f1eb7cbf6525d5ef9a70214334b3bac48ed1bdeaa9534f2aa7001321462ba977df4dc9b1d7008d8d4c085ac353ed75f68ede85450897799bbb4dadd053c60789fb4bad5233be59cc1fefcc5d143af85d1477c4c88bf1dbdefeeb1d656e66497acfdbbae55264440a29a490424442b097af0dfebd7af8aa732fd39b69866831224a94788bf518df9c6fbc5572dbbdbf7a78af50f26e134c3041182186c115d96319d332212c3b3845a9ad54d9f7630d948d81d6200fd29787c1a583cbe2e1fd72f66f604d48c5894fc9944c0965a99ef6cbe154fb91a97e878b3366677e736d1a0fb0614b4880b49f56c6ff32351ff1dd754da7db17523bc1183c98121aeb7f0d46fb3fae08630e707b1a8496066ba09e8281668a06ca978f142a444a9420e5ca91391621d56a91d55623eb6dc6d96e3b72c041a45e3d724423d031cd40a7b4019dd30574410fd0653f80ae6102dd350ef4c824d03333402ffc017a631bf9eb2fLine truncated
|
||||
|
||||
// Static55 returns static file
|
||||
func Static55() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic55Data)
|
||||
|
||||
rawStatic55Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 65484,
|
||||
65484, 130945,
|
||||
"lgJf6dtleNg=", "l8EOKzeGkeA=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic56Data = `774f463200010000000112d8001200000002afb4000112730001000000000000000000000000000000000000000000001a84621b81ca2e1cab10066000a446084a09833c110c0a87e57886ff460b941e00128a180136022403a838042005887107200c822e5b26719209a54376ffa30b1d60559d9aa9db10e0c6acb94c2cf8894fe0c670a086f5db35bcf1c2a236296a899ccc94bb5bd595990442d9ffffffffffff6f4b2631d5931e4e7ac634d8e001c48993d4ab2d288c7037441099c3445e94115154b58ba661eb254581d624ad25ba0873c244bfd3861aa3e8852737e80cdf8b5c72571ca6712e50a4e7a8f63b59f3447126fcb2cc71edf699c8365f9b4c64b53461a88f1fd7acdb110be1c4201cf18325269497c1f1a918328dd448aa4c8ca2be5ce6a0984afb42a718e212d4a4e6d6c3f12d0e475428b33e0bf841a7516d3c7c0b3f5d706abe85076ee2d7822f0c2e7e8ab38b3fe6a216c7bb388bfec3a5c3477fc4d290e1269ec24c255eea57b74c9b7164c4a385e39e25565335ea9b5acfdaf03ab68d89221e7e7374eb69ca73d1e1ec70e170afde1d6e555ee503feee90a148e29dcc2d05c3c85692ea83eaa7d3683498628ca076a766068a96cab6d63739ca5a4ca60e010c1d0246dd9a9c4d270ead46e4e20d1a514b1a3533d308e273c218b1b420c9097b75260e8aa5cfc41db3e876d8d009d7fd843c909efcfed095a2c03575e3eb1feedaebb9f432ea0ff5f55a235af91096f4493cefc250efd1ca4c8fc1038317b5ddcf3348f13fbd2b9e1ad377d5df3fb030a34a594826d82c972731adc29c8e28cc99c56dcb114df04ccd25358281bd5e1195bc9ab023d61847162a41490b6fb587804c6eea60891ad32d8e71c5937ea17feaafff2f62e5ce53ef43baef036043a3ee193cb279abf2e7f9b9fdb9efbd6d30426a83c184110b6acd60540a82c4a832c0fc8ac1ff62148a886234a82046827f6883f6474cbec2f783854db7db10adad89dd8bbd68e082e8a3520441f00189b608052c4a4522a552a44c4445400941c543c4482c8c7ec5c6a8468fe7b7d59ff73e20298a09caeaae91d881364aab802008a28d18195be946d4ed6d5eee5def65ee45e400bfcebfe74ee41d77f2444f6e360bac7077220f87138773aa4f444c9e3c1553356c7a4cf4c4c26c53c3b1108bfa7fa0d940edcb6b1a6b114435e27405ed48506e02f1fbf173db7b889542882cb5cb78166f7a3fa3a91ea92d2296a8538a6cb53e75e6df90e0305aa3d4d4ff9e96f6d6e64ea06579a16ad2d6539a0bf0ac78ae5b2fc29f2ab8cd8625a401f0df5fb6aff22555526565166601ff5f9f1b667a7610044047ee46f4d8629ab5457d86b7b22ee4edd9624b6eafc031c433b8d9bff6fbadeaeaabaa9ffa15ae423dd5b5ecdcaefbae636db8c971b70397dc2690c14a2004a2ba28aa452df776bae735465a8cc3780c415c55800045ed6635ba7f0d35e15a002080e0f56bbf4532c9eca67f95e4de1f7bf7f58961a59288241299c4742289442291482467ba8d5b7f7eaa26fd6580875dd1b213c6e4854c985ae52bad00784b82d272776993165dda1c97c40ff9bb3bf92b4d51bddaec5c2b92d31ab0e08daed9d746e69608b5dc10939b586234229544e4f879bf7bf0f4c912934281da28b6edb1cbb504a03c638936d9a4c8e3519daa02d49d57afcaaab20ae98c789539f55379530938c0bbadd7b06d1ce10467486b6212ceaf846be47936a4a4b1c8b19ab6152d1bd62d772868a7b82a51ab43622cd1ef0a11b04c5390610ae8ce7bd3e7961fe86e2a2f06a4a21e6c7a2a5ac32a58e5da9b9ecccfceece546a9664d12ec90eea4e66cdb4fc05f90fe5778b5c59b277eceece795caaa0254c08f4076806ce24b6b7ed50780f68c6261d2263b996ecabbed9420bb4f9df1404e7c6180f6ffb2a6b56c665bbb0f18c07cb000cd0b60aeda16c021dceda207788007b854c9867bcf10acae91b6ea866a5e530730b3d6dcdc9e11f64ba018a6b695c849e69bd1115212dc513fdcaf9c202c61b6fad01528f62afc3362be56b5beb65870db73422d9635ff3d18854012c21015d71bebb7fbd8c3b958d199db9107291197fffffee075df7720b10f24c182484b5ee97817514b19be064d02296b8bb2dc1b96ff3f9d96fcae9b39ec1296ad85f218ad23faa08db26b3b3ee2244bbf28b768af28096866bee0c08e94f8009e6fa76882030c31c30c5f221f76bfeefa83fe6a7705b67d67d6dbb2131f39ac345195346de73cf40f74d1cff900b603d82c60f3015b3d1e42d754c28d57276452b342e1ff7b9df92519659299b45ac01029c42d3745526f5bdc77e68f336080c0ff7f35cdf68394b44349474b3a721d52e575a52d3aad2a97de72ab0eb8ef3f7ce07f00048199d110436a29cc50471a518143c5917cce00247586b399eb9072e5e34ae4a64c39a4d0b43eaeec3e57dd1655eda22a5d14b579b0bff1bf809e4d039c5b59dd80021c7691841e85613c3c5da9eed173ec2f3dd1d4692634e93d0dc86230d1d4a5583c4e2c9683e579bee55bd2bab3e917b30053b1fd6c1a3047c8fbb73467fa4d3bb5b3564e41e5bc9bbf4308d0267801696739eb2c607646d0001ae190303501c47f99ab37edd7af5b1a98a544335c017bdfa113c572f24176a548cac8426873c36cf7dbfd2c70570bcb71e63bcefb458e95a57e74526483cc87df9948c656ae205190e9ef6d9aedfb9661573e025d08a5a03c291a5f2a275dca146d8a4afaa6bf2203a04c78da106245ac950f641f6a8f700f11ba20f6dd01709ba2ead2f4f1ff33d5bef45d34410d4971a96e8dcfd699704f5e0d8833d0773e0aa96a341f8002280900352b401c438dbe3363d658bdaa0689ae063404c8d191fecc9ea3ef357f9df3a18bf6c7eb32e3b39d24d824772ecd368e3608c2e5f9eac67f9e5d7496782e4dba139d342d60180fff5dbebcefa68fcadb4d452e75d2c7f2c17222b24bbf50102b48c0231e700f813456dacc637260c4c907210495d2ee8a3c585fab9629ddbe93ea1c3260464cfa76a2664cb50aa314d81bbbcc4344de9957b8ed53460e115023660091fdd84ffff30c087283296289a2c228c82bf56bb75bf3adb794b4b1f7b05f4ee71ac4d0384234a2118d688430835186f9320b9f5378d67707fe450709122494124a28bb93c3d7a6622f67183bfc303d2594504c3087304218619e44d2dcdefffe4cfcf859288bf7254b29a588888837480843f671bfdfbe5ff0f646792b111dc4118630be5f9dffa77b884eff1f09e94ad2be998e4588016f2cdbd23ee94e03fafe988fb9ec1feebd97747fd9987667e24576a94a1b9881a945962318bafcfd5f51b2231809b0f10411402a881c72406ca604482e6540f2a804b283a54076b206c8515a809ca103c805b683a9a41f481507803ce00890473c02f18427206aa905f19297205e5307e20d6f4134d000e203cd20bef10dc42f7e8168a51d442793207ef3Line truncated
|
||||
|
||||
// Static56 returns static file
|
||||
func Static56() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic56Data)
|
||||
|
||||
rawStatic56Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 70360,
|
||||
70360, 140647,
|
||||
"ydWg5ih6tsA=", "ZswncxEtMv0=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic57Data = `2320446570656e64656e636573204f662053736877696674790a0a53736877696674792075736573206d616e792074686972642d706172747920636f6d706f6e656e74732e2054686f736520636f6d706f6e656e747320697320726571756972656420696e6f726465720a666f7220537368776966747920746f2066756e6374696f6e2e0a0a41206c697374206f66207573656420636f6d706f6e656e74732063616e20626520666f756e6420696e7369646520607061636b6167652e6a736f6e6020616e642060676f2e6d6f64602066696c652e0a0a4d616a6f7220646570656e64656e63657320696e636c756465733a0a0a232320466f722066726f6e742d656e64206170706c69636174696f6e0a0a2d205b5675655d2868747470733a2f2f7675656a732e6f7267292c204c6963656e73656420756e646572204d4954206c6963656e73650a2d205b426162656c5d2868747470733a2f2f626162656c6a732e696f2f292c204c6963656e73656420756e646572204d4954206c6963656e73650a2d205b585465726d2e6a735d2868747470733a2f2f787465726d6a732e6f72672f292c204c6963656e73656420756e646572204d4954206c6963656e73650a2d205b6e6f726d616c697a652e6373735d2868747470733a2f2f6769746875622e636f6d2f6e65636f6c61732f6e6f726d616c697a652e637373292c204c6963656e73656420756e646572204d4954206c6963656e73650a2d205b526f626f746f20666f6e745d2868747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f526f626f746f292c204c6963656e73656420756e64657220417061636865206c6963656e73652e0a20205061636b61676564206279205b43687269737469616e20486f66666d6569737465725d2868747470733a2f2f6769746875622e636f6d2f63686f66666d6569737465722f726f626f746f2d666f6e74666163652d626f776572292c204c6963656e73656420756e6465722041706163686520322e300a0a232320466f72206261636b2d656e64206170706c69636174696f6e0a0a2d20606769746875622e636f6d2f676f72696c6c612f776562736f636b6574602c204c6963656e73656420756e646572204253442d322d4361757365206c6963656e73650a2d2060676f6c616e672e6f72672f782f6e65742f70726f787960205b56696577206c6963656e73655d2868747470733a2f2f6769746875622e636f6d2f676f6c616e672f6e65742f626c6f622f6d61737465722f4c4943454e5345290a2d2060676f6c616e672e6f72672f782f63727970746f602c205b56696577206c6963656e73655d2868747470733a2f2f6769746875622e636f6d2f676f6c616e672f63727970746f2f626c6f622f6d61737465722f4c4943454e5345291f8b08000000000002ff8c914f6bdc3c1087effa1403b9bc81587ec931b7fc2b0d246d699650580a96a5b13dbbf28c2bc9dd753f7df19acdbaec96ed4d12f33cbf19cd053c6087ec902d46f85cc16b6c3654a541a9fd09fa88115ac303a48682cb3a13d20056da4e1839450d8b4622ce5e802204fcd1534007c4121c06554978b74312a87ab68984b552b7e02926906acc727391350c2542253d8fa6480ea1e88c5d9b1af52a0a1760d841518b6ec515509147add48b594900371b8dd8fade61bc51eae2023e48802a08a70cd981e93a4fd68ccd2895c1f2adc7efff352975f126cf7ff6b88a5a427d7905cf6491c70e7b7618e0e569017e7a1ab13b53a23f80e5785d454d929f45bf2d30b47a150ff4366168a7e0f3384b688da75fa86d9c396a4a4d5f6a2b6dce68c59b98ff5179d6fb554a1937259c0e5664bda13575e8c8ecda1b6ff9547a6cbced8c6d702fd50ae0cbb43d07e500cbfb26504c64183e4a55b54831613839816d0e0579d8a565636395b19895b2c1f0d7f06bfdfffbd64b63d7a7965ecca26a09e4bdc9375846b16b4cc591f9eef521bbceee4d1f71f661452dde70bdfb956dce98f22ec8762860f946b8d9179e1c6f22774ce9a5cc5bb31bf4f9e9fef1d3ebe3e591dc86a14b525cfdbb7a224eda7f030000ffff`
|
||||
|
||||
// Static57 returns static file
|
||||
func Static57() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic57Data)
|
||||
|
||||
rawStatic57Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 1030,
|
||||
1030, 1507,
|
||||
"ZkFdpk2P7P0=", "tqmXI4zYPC8=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic58Data = `23232320474e552041464645524f2047454e4552414c205055424c4943204c4943454e53450a0a56657273696f6e20332c203139204e6f76656d62657220323030370a0a436f70797269676874202843292032303037204672656520536f66747761726520466f756e646174696f6e2c20496e632e0a3c68747470733a2f2f6673662e6f72672f3e0a0a45766572796f6e65206973207065726d697474656420746f20636f707920616e64206469737472696275746520766572626174696d20636f70696573206f6620746869730a6c6963656e736520646f63756d656e742c20627574206368616e67696e67206974206973206e6f7420616c6c6f7765642e0a0a23232320507265616d626c650a0a54686520474e552041666665726f2047656e6572616c205075626c6963204c6963656e7365206973206120667265652c20636f70796c656674206c6963656e736520666f720a736f66747761726520616e64206f74686572206b696e6473206f6620776f726b732c207370656369666963616c6c792064657369676e656420746f20656e737572650a636f6f7065726174696f6e20776974682074686520636f6d6d756e69747920696e207468652063617365206f66206e6574776f726b2073657276657220736f6674776172652e0a0a546865206c6963656e73657320666f72206d6f737420736f66747761726520616e64206f746865722070726163746963616c20776f726b73206172652064657369676e65640a746f2074616b65206177617920796f75722066726565646f6d20746f20736861726520616e64206368616e67652074686520776f726b732e20427920636f6e74726173742c0a6f75722047656e6572616c205075626c6963204c6963656e7365732061726520696e74656e64656420746f2067756172616e74656520796f75722066726565646f6d20746f0a736861726520616e64206368616e676520616c6c2076657273696f6e73206f6620612070726f6772616d2d2d746f206d616b6520737572652069742072656d61696e730a6672656520736f66747761726520666f7220616c6c206974732075736572732e0a0a5768656e20776520737065616b206f66206672656520736f6674776172652c2077652061726520726566657272696e6720746f2066726565646f6d2c206e6f740a70726963652e204f75722047656e6572616c205075626c6963204c6963656e736573206172652064657369676e656420746f206d616b652073757265207468617420796f750a68617665207468652066726565646f6d20746f206469737472696275746520636f70696573206f66206672656520736f6674776172652028616e642063686172676520666f720a7468656d20696620796f752077697368292c207468617420796f75207265636569766520736f7572636520636f6465206f722063616e2067657420697420696620796f750a77616e742069742c207468617420796f752063616e206368616e67652074686520736f667477617265206f722075736520706965636573206f6620697420696e206e65770a667265652070726f6772616d732c20616e64207468617420796f75206b6e6f7720796f752063616e20646f207468657365207468696e67732e0a0a446576656c6f70657273207468617420757365206f75722047656e6572616c205075626c6963204c6963656e7365732070726f7465637420796f7572207269676874730a776974682074776f2073746570733a202831292061737365727420636f70797269676874206f6e2074686520736f6674776172652c20616e6420283229206f666665720a796f752074686973204c6963656e736520776869636820676976657320796f75206c6567616c207065726d697373696f6e20746f20636f70792c20646973747269627574650a616e642f6f72206d6f646966792074686520736f6674776172652e0a0a41207365636f6e646172792062656e65666974206f6620646566656e64696e6720616c6c207573657273272066726565646f6d20697320746861740a696d70726f76656d656e7473206d61646520696e20616c7465726e6174652076657273696f6e73206f66207468652070726f6772616d2c20696620746865790a726563656976652077696465737072656164207573652c206265636f6d6520617661696c61626c6520666f72206f7468657220646576656c6f7065727320746f0a696e636f72706f726174652e204d616e7920646576656c6f70657273206f66206672656520736f66747761726520617265206865617274656e656420616e640a656e636f7572616765642062792074686520726573756c74696e6720636f6f7065726174696f6e2e20486f77657665722c20696e207468652063617365206f660a736f6674776172652075736564206f6e206e6574776f726b20736572766572732c207468697320726573756c74206d6179206661696c20746f20636f6d652061626f75742e0a54686520474e552047656e6572616c205075626c6963204c6963656e7365207065726d697473206d616b696e672061206d6f6469666965642076657273696f6e20616e640a6c657474696e6720746865207075626c696320616363657373206974206f6e20612073657276657220776974686f757420657665722072656c656173696e67206974730a736f7572636520636f646520746f20746865207075626c69632e0a0a54686520474e552041666665726f2047656e6572616c205075626c6963204c6963656e73652069732064657369676e6564207370656369666963616c6c7920746f0a656e7375726520746861742c20696e20737563682063617365732c20746865206d6f64696669656420736f7572636520636f6465206265636f6d657320617661696c61626c650a746f2074686520636f6d6d756e6974792e20497420726571756972657320746865206f70657261746f72206f662061206e6574776f726b2073657276657220746f0a70726f766964652074686520736f7572636520636f6465206f6620746865206d6f6469666965642076657273696f6e2072756e6e696e6720746865726520746f207468650a7573657273206f662074686174207365727665722e205468657265666f72652c207075626c696320757365206f662061206d6f6469666965642076657273696f6e2c206f6e0a61207075626c69636c792061636365737369626c65207365727665722c20676976657320746865207075626c69632061636365737320746f2074686520736f757263650a636f6465206f6620746865206d6f6469666965642076657273696f6e2e0a0a416e206f6c646572206c6963656e73652c2063616c6c6564207468652041666665726f2047656e6572616c205075626c6963204c6963656e736520616e640aLine truncated
|
||||
|
||||
// Static58 returns static file
|
||||
func Static58() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic58Data)
|
||||
|
||||
rawStatic58Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 34283,
|
||||
34283, 45976,
|
||||
"rYWNU8rgXu0=", "m13BqrGfIaE=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic59Data = `23205373687769667479205765622053534820436c69656e740a0a215b57656220496e746572666163655d2853637265656e73686f742e706e67290a0a537368776966747920697320612053534820636c69656e7420746861742070726f766964657320612077656220696e746572666163652e20596f752063616e206465706c6f79206974206f6e0a796f757220636f6d7075746572206f72207365727665722c20736f20796f752063616e20616363657373205353482073657276657273207669612061207765622062726f777365722e0a0a232320496e7374616c6c0a0a2323232042696e6172790a0a596f752063616e20646f776e6c6f616420636f6d70696c65642062696e6172696573206174205b52656c656173655d2073656374696f6e206f662074686520706167652e0a0a506c65617365206e6f74656420746861742074686f73652062696e6172696573207761732067656e65726174656420627920616e206175746f6d617469632070726f63636573732c20616e64207468650a617574686f72206f6620746869732070726f6a6563742077696c6c204e4f5420766572696679207468656d2e20596f75206861766520746f2074727920697420617420796f7572206f776b0a7269736b2e0a0a5b72656c656173655d3a2068747470733a2f2f6769746875622e636f6d2f6e69727569782f73736877696674792f72656c65617365730a0a23232320446f636b657220496d6167650a0a496620796f752068617665205b446f636b65725d20696e7374616c6c6564206f6e20796f7572206d616368696e652c20796f752063616e206469726563746c79207573652074686520446f636b65720a696d61676520627920657865637574696e6720666f6c6c6f77696e6720636f6d6d616e643a0a0a6060600a2420646f636b65722072756e202d2d646574616368205c0a20202d2d726573746172743d616c77617973205c0a20202d2d7075626c69736820383138323a38313832205c0a20202d2d6e616d65207373687769667479205c0a20206e69727569782f73736877696674793a6c61746573740a6060600a0a5b446f636b65725d3a2068747470733a2f2f7777772e646f636b65722e636f6d0a0a23232320436f6d70696c652066726f6d20736f7572636520636f64650a0a496e206f7264657220746f207573652074686520736f7572636520636f64652c20796f75206e65656420746f20696e7374616c6c20666f6c6c6f77696e6720746f6f6c733a0a0a2d20606769746020746f20646f776e6c6f61642074686520736f7572636520636f64650a2d20606e706d6020746f20636f6d70696c652066726f6e742d656e64206170706c69636174696f6e0a2d2060676f6020746f20636f6d70696c65206261636b2d656e64206170706c69636174696f6e0a0a416674657220796f75206861766520696e7374616c6c65642074686f736520746f6f6c732c2072756e20666f6c6c6f77696e6720636f6d6d616e6420746f20646f776e6c6f61642074686520636f64650a746f20796f757220636f6d70757465722c20616e6420737461727420746865206275696c642070726f63636573733a0a0a6060600a242067697420636c6f6e652068747470733a2f2f6769746875622e636f6d2f6e69727569782f73736877696674790a242063642073736877696674790a24206e706d20696e7374616c6c0a24206e706d2072756e206275696c640a6060600a0a49662074686520636f6d6d616e6420737563636565642c20796f752077696c6c20666f756e6420746865206e65776c792067656e65726174656420607373687769667479602062696e6172790a756e6465722063757272656e7420776f726b696e67206469726563746f72792e0a0a232323204465706c6f79206f6e2074686520636c6f75640a0a546f206465706c6f7920746869732070726f6a656374206f6e746f2074686520636c6f75642c20476f6f676c652041707020456e67696e65206f72204865726f6b7520666f72206578616d706c652c0a796f75206e65656420746f20666972737420646f776e6c6f61642074686520736f7572636520636f64652c206275696c64206974206c6f63616c6c792c207468656e2074727920746f206465706c6f790a69742e0a0a54686520606e706d2072756e206275696c64602077696c6c206275696c6420616c6c207374617469632066696c65732c207468656e206175746f6d61746963616c6c792063616c6c0a60676f2067656e6572617465202e2f2e2e2e6020746f2062696e642074686f7365207374617469632066696c6573206469726563746c7920696e746f2070726f6772616d20736f757263650a636f64652e20596f75206e6565642074686f73652067656e65726174656420736f7572636520636f646520746f20676574206170706c69636174696f6e20746f2066756e6374696f6e2e20416c736f0a62656361757365206f6620746869732c206469726563746c792063616c6c2060676f206275696c64202e60206f6e20746865206e65776c7920646f776e6c6f6164656420736f75636520636f64650a77696c6c20726573756c742061206661696c7572652e0a0a232320436f6e6669677572650a0a53736877696674792063616e20626520636f6e666967757265642074686f756768206569746865722066696c65206f7220656e7669726f6e6d656e74207661726961626c65732e2042790a64656661756c742c2074686520636f6e66696775726174696f6e206c6f616465722077696c6c2074727920746f206c6f61642066696c652066726f6d2064656661756c742070617468730a66697273742c207468656e2074727920656e7669726f6e6d656e74207661726961626c65732e0a0a596f752063616e20616c736f207370656369666320796f7572206f776e20636f6e66696775726174696f6e2066696c652062792073657474696e67206053534857494654595f434f4e464947600a656e7669726f6e6d656e74207661726961626c65732e20466f72206578616d706c653a0a0a6060600a242053534857494654595f434f4e4649473d2e2f73736877696674792e636f6e662e6a736f6e202e2f73736877696674790a6060600a0a5468656e2c2053736877696674792077696c6c206c6f61642074686520636f6e66696775726174696f6e2066726f6d2066696c6520602e2f73736877696674792e636f6e662e6a736f6e602c20616e640a77696c6c206e657665722074727920666f7220656e7669726f6e6d656e74207661726961626c652e0a0a23232320436f6e66696775726174696f6e2066696c650a0a4865726520697320746865206f7074696f6e7320746861742063616e206265207573656420696e206120636f6e66696775726174696f6e2066696c65Line truncated
|
||||
|
||||
// Static59 returns static file
|
||||
func Static59() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic59Data)
|
||||
|
||||
rawStatic59Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 6066,
|
||||
6066, 8507,
|
||||
"FxndXIL9Ycw=", "2aC1wMu89yk=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic5Data = `774f46320001000000011288001200000002ab4c000112200001000000000000000000000000000000000000000000001a84621b81bb4c1cab10066000a446085209833c110c0a87ec04878c590b941e00128a180136022403a838042005884707200c82445b4b70920ce942966b876f58a9ea4399a2ba0d014a53a7ad7ac1114ed0e2f02a5e6c76c92e1ec45ccbaafc09f4f61dafe06e5582802cd1b2ffffffffffffffd7257b64cebf7b817b49580e645444adb5b5fb0fc821c4947296e1a83c729d3c0a4d22472bf28c6478676e4cdfd056d4ec1cfb1e7e1846739a79c351a66449e6d3d1ae164814a7d93821169614aee0655ccfd6c54ee1db02d3757a0e4aa5bc55b2e31414cd462568cc17dd4faf23928c95bcb857853e271cc58d50891c277a4b8811033d3c0a3345bf0ae71e739df3fd291ff7759dcc1bcebbf580633a25f49b76873cdaabe932a5e2df8f686b8ee5737c405409a3d8e7504196204b107570aeed813ea9dd2d6738f55d68864215d2d07b0d9f0fcd18ddcf3207d9299324179cb34b70b1e4eef027d41ed33999f382de68ab12b87da22faecd953bea30153816310664cba3a9f239ed70f3efed1913441eb086abb0beeaf8130f3da119aebbbe7a1cebc3959267cbdd5480cc43f8fbfe34d105a97c3f667375bc8ca33084275b85e56eb22ed02478c25bc4bc264ab7dd8a2d724ecd19193977d57aca55f68605e900977c3934db95f3802caeec5795e639ee67f1f4eb56afe055568d3fe4566f5eec9657daf6e3a19f22fd2deec55671335a7e86976d830bf5a25190f8ae6f053aefa21955c8efbca779837fd16897f9fbeb77a09f84a6768a22f1873b6e77ba27dc3e7413351d16dcf0defd7b2c1f2ff8a1948e54518cd537864ce93f7527f11599be222fd523a4e1afb6f46f01510ea306b70f3195b2f6b99f78a2c52fa2b5f2a4af3cffff63bff67dff209a5924a25887e825b944122913a2698d3693f8797e6e7fcf3df7bdedbd050b186c5408a8188dd518d8188d98a46261115f0969c5c6f8a08435848184840546046244c2f0fcdc7aefbfbffa4b16c44649558dc8512306bd8d881690b408b11291a108587d675fa9777a515e79a7577aa73a51537d0f6068d9c2396701870faa0e81dbfe0f1ca808222e34412434372a0ec095202a6ec4b1d3ddd034c5ac5eafa9963b4743cd9f95f5cbc63273afc6d332d11cb372e5d8a940ffbdcebe27c928a34c920c3cc09e4fa8c5d4e96e944f1a9cdb75cbc8c06d1c6c86c7646d16ac3504ffa7bebbac4d9670508b65f8085d6073f27cdf21e0df9d9d994de9c70312d088442de0210ae644acdb076ae511e436a05014f067288950936e5a4d66eef865f9592fe5ceaf439aee99bcb3b34ae972401f5d004c87936dc07c80e9037607901740193021630328a8a77bddbbd99fdea98360905a374e84df00b84d14df47bc5999a7d6b5ec2cab4d05fd080a9ae7723ce807fde0c1970a8a5c153c0fdf014cf1fc344ff93a564b33ab6d7dadb5ee905ef568cf4f95dfbd2b56a2ca831c68cdac926c32372bbc00ffdfb5cf9705a0393be7261f28b3e880337f9192c502eb5ac225a3aaf88d2b907035b6b6a7aa4c34b9b6fb00358194138e6db3f9dc16837566358562e6be0751c6b60ba966e980018093fc3ffd3dbf7dfefbe0df2d883309c3286d42cc9366c2eea2826ecdd2db7dea09e7876bbd338185f061fe61befa2defd99615a915ea1931d1aa5e74739af0c79c8e7722d952e633528048112d41bdff5f5dea5ba5e246e0f4652e4f00f0c12fbee3721034755f816549960abad8792e0081ffbf9cbe689773ef14c60dfd40beb049edfa29a5dff7eec0600d4d060bc9ca377618b81bb465f6bf2a16faa4ecd265af922e39adbc9987ad55fae06fda3f11fb52b17ddedd53f39ee938d3765b3b699dd6079e401212484279a203f30cb54fd421a432bfcfcde7d7105f2040268bc49ee8fdae7d6faa9568e6f4f0cfffeff7fce63af77ec12bd91ade21a949888cce60740d19cfe2d1422294ff36fcfbbff6fffd4cb292baaf01902410c8562459f568e1181d2aa04f786ac797d799b45d81685c9448b17ea280f9b71c90fd8af32d4b61d9bb4c8700eaa6ec7a5ec534cc890a6eebc91dc249045373dbea086926915b4244ea4b0bab11953651f83d441226eafe1d72892d5b9231408fe05361ea3235ea13224202746824c112b99fc6bda17efca97f2c4a0216e0b1858ea2f7299a47d5a38e4d5ac3eeff7ebf6f521dc9ea9d219ac443595a1912bd3476edec216221910103046d20006032656161fcff37d52afd5500a60b2421c7ee39947a8cdb5d0dd707d9d893af7141b841f6ebfef7eb57fd5f05167e012401902d0a045702d58ea02c49f5a040f69c22d57b0ec535de8622c74a3dce676b7d90accf5d10667b364a3609e3fd73bfd2ee5b387229101f8cdf3238d1cbe5df9bdc9bec1e157f59f517d0f12659e00292d03b275481a4acab30559ec8eb3a5f21647988ee53cd715366e961005bb7d9d2e23f403e600e4b5d52bb448205ae8095f8eff756496faefd6fe599603f36c5e603266321abae9e99ad337fdd976f959ce9075bb64bde43094071055741c9772c8042822250101b37ff3acdf5ff73fc225d492eb20ed0376cee96b5d3d009e56fa71138c08e43e8202805e609802487500afb50c9a17d5c60d80170d93a8c9dc603f41579edb0ac9d3bd5ff7fd3ccd2fbaa00cc349a50b38ab29989b41b4941f60be8e13467d6d92843bf2af447d707c016aa5b869896a1913394d6c9f67f1f9841fd2ace6914c931e49a91b59914adf561b447a1a27561200268add5db9d17c3da954e282fb520bef8e297689a20a4fb648918217520c29dd61ee82cd1dccada1e281edcefd9d71d54b893670946c11082da26bb617cbfffa95ab6001ffe8c44ace604723d949ca90b748845b7a54b95aeca5b1030cf02fe25ee45ce1d9db21cd3ca89dba9dcb9ca7355e5719709aa654a4f420189454604e83326f56c50748a4ca1b8df4cc83b0a09d99045406c6ac080a16f4b5ee72d5f2f152a2212244d97453c9c4b8939dfafda92d9e41ec9d1cb109a219846e48c3146186184312134dedec70df37550ce3d5f6723be3917b12284104a79429d39b37f3bcee19883bba5dbfb4b4d30c6042384180611f227eafabee10a6c636606726c03b294b5133bb1bbd4df53b125cb99ab54320f83cbfdbd555394c2b4747a496e3a08f176ffe6d8bfe3ea65b078b86fdb8b4e94af82141ada54683a95c369f0b6c9d48e167e8e8e9d9684b16cb04192258ff07f8cedfdf9a66bf7b37c8d368a0d78c419fb9b154ae98fff13a58dc34c60cc07d45f1668b90650942820460cb0ce3a205e3cb0de26608b4c205b3690eb2054a00028530e54a9026ad400279c006ad5221274ce39a00b2e025d7605e89a6b40773d04aa570ff4cc33a0175e01bdf127d0bffe056a220824042490a4201048ba1982643Line truncated
|
||||
|
||||
// Static5 returns static file
|
||||
func Static5() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic5Data)
|
||||
|
||||
rawStatic5Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 70280,
|
||||
70280, 140488,
|
||||
"iE5lTO8AIkE=", "9NhlKB3Vp70=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic60Data = `774f4632000100000000f648001200000002a30c0000f5e00001000000000000000000000000000000000000000000001a84621b81bb521cab10066000a446084809833c110c0a87dc1886fb000b941e00128a180136022403a838042005885807200c81635b1e679206ea44b49c8ed065c53fec705b8777b7e1ab2f01dbec9fc08de188149f573d8c6ea5d8fc014f8dcccd7912723bf0ceedfc7664ffffffffffffa2642163bbffc1fd6f8321820888aa6a9555a062307311536e5ad14a3314d1c143a8ec0c865ea67d372865af930a31b2a7384cb139a48909c98e257b42caf138e7cc9c44f1d8461011310ea3b290d3aab86ed4a932fca4da26169c7189135a9c84075cb1855a85b73ed06a9d31850d75b81b8a78a8f17e46930f22d76ebd7833e3292eb2159606f555a349ddf38abec0dd642fbcba0f866e9bd63d4debed6a25e63e677816e6844b1a318ae51123da541841752c9f5ff7fdb788782f71138de83dcedd33a3cbc4b9ec881789284e2612bcd51f68941907ca997853daaaeda88ea0f6499574cd50822efaabd25cc98fb676e74d5832f99bec4ac599a87e533a78a330c14c2dc5060e8f9d88676dbbdd56c56bf850337387619790842b56bd55505aedab7e5126719d6c1aac7364fd2b7c082f01ae2e7fd2c4c17647eca457922ad9fff0cd2bfc768841f105d37fa8d93a27ac5ad2da0a3eb519acdbf221ff199c19f40792147b9a5534aebd76fa7d9fc52c6c41d447799fe1153f05c471d3030c255a9b96ad1c952b7972bff03dec8fefdc99f7612d14f28604216e88005d3dc4cfedefdede1e638c016312252123460938a2444124a5c3c442fcfc2f289216d19fcf27a6208c1a3824d26220b368291541010501c1c4028bffaef7ab4f779fd90d78c568436e00fd09370f5040f8edcc0c4f73fb1b1b4829d1b97763448dd139227a23aa25a44a1d20d14a9485943622e057311015f3ebf0eff9fe03f4b5bd2f513378edcda5834249d37322775027c8cd024b835dd605152c844352ba76404d3358501289c186a858ae29daaf741b89e75d4fc3966632a3265d8d17cf104a134dc136a867ae921f4b3e80608bd9d3a59e3bc67222d9ef76db2dad8a32fcdfb97c9d0b966e1899a17bf6615d884e02a2f0f871b0b7ed1760600963805977c11427905edb1b6b37382fd7413a1b2040202881ac335758267c3df95ffbfd0e9299fed39bfe5512ae7db94f741d93904944129e494c27924824128944729eaf36b6efb31412c805d36971c692cc064bb684a0f0fdff9a2a1b29529072855c610a9aaf2e818eea0b00cdcf66cecaf2fcffdf07e8beffdd7b5f5680129061c699021c9b81a22950ad5c2ecfd6559bc027f02ecf7c08a30b2797b50a6901f8035fdf7e4fdeeaaa9ef77703240c928b0656a40940459a4448221d2392e3b3d33f5b7beffe6f16e2c4b36848a6c84c4adb95b0d25dd39238f080373b83cb99ffae255b9664c7deacd78a13e73adfb5bfc7710052488b8b0a1b000be0037487878235930c97fcd03a5fa34d39911d98e743cd93758b22b8d85a4f5d96e41487799479e02187ddfcb5df57df49840b79091fd62beeaac6885926c5edd68e92ade428f9851cb9722dd0c366df6fc104122058a34ed469fd9df65f0e9f1075193eb15070ac4edb9c3b3ea7f66f04869927aabb84984f20b0ad749dc46695d3c492e662c537ab395c3f314ad612a8b4e6bb1f11b4bd6488464f28b3fdf6cb923f2e5310b207c20053922920c7f5dc821387eecea8fff968775f1b0354e479f3d9a894a90e552cd36d07230707a3c7c4614bd39974e5d72c532171fa8c403bbc00fffb36bf1ea6219f408842cc9ab469e831ddd96a3fb3dc9f7bea1554c18927faa94800a00adb81da42550cb8958a6c279bee50e6c630fd32a408d987e7b7f97f2f18807351ef6ffb7bcbb40e336a11e55c39dd7cce46c52054042b286d42b1281bb431b063662d0bca98ab159a20b3b9f6891549149e94e600e4e16be9ec1d9baed8534f2224f1ee6f54a99708131919c08137e04ab3914806a31cc6e2d39b6a95fe0fa025f448d815394e3acf9ae218af0b22e9ac8b762f8abadfffbf3ffeef6ea0d1dd100943520449cd80a20c218d2139338b6e505a90d24e915c2b9df116d43a729df1d15913dda517dd06e925e9a5e1d585175f10e697c74750ddf8e7305a7b0df0dcca9a0e2869267c8e24d630d278e87fe92b9debbac30c0d35cccbb480ba40fe4b1bdb294b531ad283625f2ce9348486e7f0087ee68282c350e0f95a96d27eca5b429213fe4c0b07b03380666cae6f5d9a57ad94a6c6297da73c75c8295399314f192d3ce890a001c021f9ff6f6a56fa2e0a804480584d157b4f6b8d8b7695ad3bf92f1449c9afb151487d54e981a82a742f00ca100d5147ec1e675ab3c6f3fd0f50a85f60378966cbb4596b4cb45934ca66239fe51ce3826c832c5c846899e25db9de21b303d4d880ecbf2b84ad8c5b62f7c5699d958a5c906168080bac8004f0201e184471507870bf509b473b48d8d588938513421c7319ff8bb0ee7f55cd159f1f782605e9c5105da8745e63cad5614ba91bc664da7420683806bee5a66bcc99d7db765d694af7cb54eb9c61ca65cb980c3f67be4d068c1981505333028d7cf7729035070ce998b8698f7a5c18413bee98c85bc42fbf70ea7f47140bc0e7145efd4ef44fc924c2518c70852bbc4c31b7effbef56729fbb33fb1a0ecdd2c8204d2322414444420822e77fff56d534450a10bb6e18a933971fefa2bb65df4f2cd4cbebec9dbd14f18b8422122484d0d99cd28378fbda7444ea307670fc5144ca23a51ca14808c73dc6ac4070d4561b775a69653f86e155d876c2ac8350ad1e3ffeb68c8960f455902efa2dd838ff6e199ad9cbfeb5f2a34d93dbf6794c6c64492081c91fa26a86f2b7757e585df26fe5e558b116257283d807e03048b085febd9526116cde0caddef9ffae10209001006a07c1873273106b8120d1a241122480244902b9ec32c835d74052e58314280129570e52a50e8e060d201d3a41eeb907f2c003102e2e489f3e90279e803cd30f32680864c408c894699059b320f3e641de5904f9e017e20f17b12503307010076010203f802126373064e40586bcc2c0d8a118b8505706187aaa0283210086891ac0b014070c1b8d8061af39305cb40686bb4ec008d01d18a17a03e3a0bec0386a2030c20d05c629c381116124303a3205179db905899130607c8800c6972ca3f8163b8a3f418a04110440a1080aa00808014011111280a2c40c94785c4049c703946a9240d193014a3339a0b453062a306fa0627a056a7e5b41a7af13346bc3a09b360bfade9e809e5e1ef4cc18d08b1340af4e47fe02b62f80e87f1d07a2bd3a0944fbf665101dd0a9203ab60741f454af83e8ebfe09a291fe03e21dcd0a08a0c440006403e80242a64a956ad56ad4a8558b8d1d51c5145702089e68e5ead4650a0490892e07Line truncated
|
||||
|
||||
// Static60 returns static file
|
||||
func Static60() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic60Data)
|
||||
|
||||
rawStatic60Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 63048,
|
||||
63048, 126099,
|
||||
"YblkJ5RJZvs=", "Pt3VwKF83LM=", created, data
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package static_pages
|
||||
|
||||
// This file is part of Sshwifty Project
|
||||
//
|
||||
// Copyright (C) 2019 Rui NI (nirui@gmx.com)
|
||||
//
|
||||
// https://github.com/niruix/sshwifty
|
||||
//
|
||||
// This file is generated at Wed, 07 Aug 2019 15:54:10 CST
|
||||
// by "go generate", DO NOT EDIT! Also, do not open this file, it maybe too large
|
||||
// for your editor. You've been warned.
|
||||
//
|
||||
// This file may contain third-party binaries. See DEPENDENCES for detail.
|
||||
|
||||
import (
|
||||
"time"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
var rawStatic61Data = `774f4632000100000000fce40012000000029f140000fc7d0001000000000000000000000000000000000000000000001a84621b81ca2e1cab10066000a446084809833c110c0a87c51c86e0450b941e00128a180136022403a838042005883507200c82295b62619209a572f7e325da152381d04d0694deeb66fed9a1755f601319b8ba7be91c4bf941426a1ac6d6b0dd0de36e2991107905b2ffffffffffffdf974c624c2f012ef97f40400554942a6a5b5b6db70d34d02d8410135359a52cb546535796d9a859dda0edd66213da8ed273d8ea757e3d068a7137a2274678c88d545966de1fb434814a178eb609fb78629acd40c111cd5b40196b5f9d4d3692828a1b0e3a2f69b9a2452af22decaf9996e21c549e46a4942a94c5dd6d70a0bc0f20dfc5202cf5e21c325f99358a1d45a4304a120449aaa4a4d89869b7c6147f6b43886312c72e393e4a8f265dd8e7678a8f754af059bc87af181577578e6e08f8168e5e7fa8cbad5b53747816a7d5476d6e76da7dab92aa3f4d336a6e27ef15c73dc34b1b2e3a8b5bca9564def70c956eae361c241f1ec40934622d69d4cc4c0b666877d80798faf3aa707f97bfa97b58f385cba8ff16e681e7172ef8e827f468c590a1cdcefca8ded6cd09c9c5a8ff295e7f490761f0e22dea6aa9d135b620644f3a73fb6d5e4e59515635161733a8fe480e942b506fa85ed425ff244985cc7bc656f6b0a26de673831785e1ef33fc4b6d29628ce579f3bf44a218066a2626d30cb3526d11e4ea504e8ad7acaeb3cb0f4c388941183a4c66094711718b22ca096d9fb1cb90942d4c23589497c0185c3630c454e9b46c75d4154f7c31b00d7b1f30288512048fd08440b28909a3670d0338b7ed41d52951819f90929456a2444a1450c120252c24ca205ae0544af66989e8d3f113725a400001e6f6dd9360168f883c6321d338d525d46af3cef5be4ccd491266ea2b35e166dc5898ebbdb90f3461da434c7b80812629a69026030c8179de4d0b56878680d75896755299c004366754d89cda1bd0f96973a3f638e1eaa4c2cca08fb77e9df47e2b4c2901ca4499a69d291c2729a59d6680e6d68d0106212508521bad03891c31608c15ab82012bd89a0d068c1cd10a488a49b5208a6234f6bf89f146a1af62bca85fa6ad9632fbaddb281b631570ad508117ce266f15d202706e73ae2ad9f3237ec5ecd311277d0a80ffdf7cfddf3e614ec833e74c4877666e96ae2ccbcef2ff6011cc2367bf0eb25c932b3a96deea59e8159d29e9fc56ff5345ab8e164ab2ff77ac9d88ef80bf21b6a14d7c87ea865ad2aa5e12afff6b47a3453a095f5a379edb33b46a450016ecaef5001a68c87043762cbd18837eb5f6f9ba7b667678673fc1ed5154848a132d5470cf98801304e51361888c237f4ce51bf21201018da9a6fed6c75ba643d934520f61f750d549750620fce1136bdfbfa7a492fbce07044ab262803520bd69fb88dcfc9fdd3b40016b8034ca6982829f668e6e43e8968601ede9df9002791163bae191fe4937e9fa31926e4aa9aff5aaf03cbed77792dea68f2b6116fa82c8d959520dcf977be1f5acdeaee4d2b13b6a157a3cbc0162f409360c41613c0805250095a64bcffbe777acf27f69525b615ea23b53b6e5dccfe46d357011f5c5625abd6a997456541465b4a981b8960b7388e92f7e81ffef75895f5a04d112782d038042dc725324b553f6f79df963d8068364dd9f457366fbcfc20588e66eb604aa424765646ea176dad50c19f73aad974680024296613c60b0f3863c3f8454febabca2db2dbadba2db2dba9bd763e2724d584b4978a110f6342b152ef5e3afc2058d56f84f53273c2a2a4257c8382c0aa1aa5051d8ad10ea8c468df5daad60ffebb836abe37af7497e97665157654daeb233dd238224070e88fd5c2e54dd0377c7ecc481066882b6998b626514b86e8cc620ac97fd3c643ff945b1cac07a1eee301beb79f8f761d4327151580585b268dbf612de1d42091c08af998488904801807f42d754c28d57276452b342336080c089e82c3ff3a8b9faef6ac0505d05c3fa5308d798082ace38511dddecbe15a80bb83799395c7e0c11e5c74060bbed6fe0bcf3117741e74180558000943856291ce3330ad7d8c70a35466ce13f3dfbaf49b1e403b6233c1a2dd9a7ea2b8c57a86cc3fc033407a1485bd5ea0ae56e2713ae4c2dd36e60f76e1687fd22c0ff7a501eb2842c1964fc8b3e957151b63bbb4bec60777158183a1067c07320ded09ca1fb13cd59cabdb146d600e439903204def2ee2defe4bd096da63431ce650aa25891142994cfa76ad60ea8901c653f9fba4ba17251ca7275a5bb6ef067068399014072402a80dc04aed6abb45e914ea21c08905a93d40569ed4b29ac7421a4f2aa5cd431165dacbaeafafa08aa9b7673406baf019e5b593307f480cf91a41a86f1d07731ed956c63b3f48170365a6c030af0d27239c2800f03b778fefbbdf949ef9ad8978d00d365d3ec3fc03ca6e8e949bf7eef794eedac9153d0719ec9ed9ca94df014773bcb5935c8d81941431c92ff9fa9f5e5be8b24c8225839acccee3fd5a3a535c78f0458d5ac51da1cc72403c87e242213ac06c0ee69b2d8826c7e256a5609463c240b8800ab0bc9ead992a385b74a08c75f6fd713d2f0771dff8f37866b2e0f7ccb9ccdcc4fdd55e746d8c83c84d93baa94773dc9d087be9ad65da92a454562310a642b0ee1311e89d21a0581b6d0a8474d253bba101018e90000bd30b75eb0afbcff69ad4c25bdffe7684115029623f2dc0c558e1d6fe8b0b310d4c8cd8ef44dcd32f880c2f8382f8898ac43e28d42079979de76401f137ce7818db10904d80d94827f9dfe9b732de12519508a78df520bb94c9dfbf79bacbef6a576740f5d7af848d334a1096e088514a10845082292b99d0bbecd1ed23703bb97420b1e3c880409e1536be6f739d566730e18e2fcccc3cc1a4718218411a2e9141547cce11266b2c7d8fa6f0706ec0dd2401ea93fa2eefe17b7f74f793015b67d056f694bc56237b992400797c5c353369ba8e1c5be1c32a5069efc3136ffa3e26f7bd63640893aee14f4f7ff32b57a385732d7b63ae79de20933f1c4946683914042a5fd2f60f75fae08041500c64a64c8e680aa19b83981172f201f3e40fefc817ef905142c16285e3250962ca03cc5a0ca9401d5a9076ad60cd4da04dadb40771fe81f0383336064098cbbc0ec195821c00607b62260e737fcf7839b02c0a02014002301490130c6a4e84ee9883d1871368d145f39482c05926801926d09522c013d0e833423a06751907e6cf4b634649600592442d649d08714e84b2af43535aaeb0c68f5793c692c01842f063a4ad149165dd5a0e9001f4008268070cc0191580392e38654c4211d69c8d18c90939c9047f242aec843de1366f4179e93d546c108ba2c24a772a4b246a4b95964b14564b92d04d70eb2df2111cc37ff8064707b4032ac7d2019Line truncated
|
||||
|
||||
// Static61 returns static file
|
||||
func Static61() (
|
||||
int, // FileStart
|
||||
int, // FileEnd
|
||||
int, // CompressedStart
|
||||
int, // CompressedEnd
|
||||
string, // ContentHash
|
||||
string, // CompressedHash
|
||||
time.Time, // Time of creation
|
||||
[]byte, // Data
|
||||
) {
|
||||
created, createErr := time.Parse(
|
||||
time.RFC1123, "Wed, 07 Aug 2019 15:54:10 CST")
|
||||
|
||||
if createErr != nil {
|
||||
panic(createErr)
|
||||
}
|
||||
|
||||
data, dataErr := hex.DecodeString(rawStatic61Data)
|
||||
|
||||
rawStatic61Data = ""
|
||||
|
||||
if dataErr != nil {
|
||||
panic(dataErr)
|
||||
}
|
||||
|
||||
return 0, 64740,
|
||||
64740, 129436,
|
||||
"jkQ3a3NdzJA=", "0cSRx1xcspo=", created, data
|
||||
}
|
||||
Loaded 100 of 206 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user