├── googlec4a86b31fbab23b8.html
├── README.md
├── script.js
├── script2.js
├── style.css
├── index2.html
└── index.html
/googlec4a86b31fbab23b8.html:
--------------------------------------------------------------------------------
1 | google-site-verification: googlec4a86b31fbab23b8.html
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JMS579
2 | JMS577/8/9 Firmware Customizer by Zibri
3 |
4 | https://zibri.github.io/JMS579/
5 |
6 | 
7 |
--------------------------------------------------------------------------------
/script.js:
--------------------------------------------------------------------------------
1 | function dl(data, fileName) {
2 | (blob = new Blob([data], { type: "octet/stream" })),
3 | (url = window.URL.createObjectURL(blob));
4 | a = document.createElement("a");
5 | a.href = url;
6 | a.download = fileName;
7 | a.click();
8 | window.URL.revokeObjectURL(url);
9 | }
10 | const sliderProps = {
11 | fill: "#0B1EDF",
12 | background: "rgba(255, 255, 255, 0.214)"
13 | };
14 |
15 | // Selecting the Range Slider container which will effect the LENGTH property of the password.
16 | const slider = document.querySelector(".range__slider");
17 |
18 | // Text which will show the value of the range slider.
19 | const sliderValue = document.querySelector(".length__title");
20 |
21 | // Using Event Listener to apply the fill and also change the value of the text.
22 | slider.querySelector("input").addEventListener("input", (event) => {
23 | sliderValue.setAttribute("data-length", event.target.value);
24 | applyFill(event.target);
25 | });
26 | // Selecting the range input and passing it in the applyFill func.
27 | applyFill(slider.querySelector("input"));
28 | // This function is responsible to create the trailing color and setting the fill.
29 | function applyFill(slider) {
30 | const percentage =
31 | (100 * (slider.value - slider.min)) / (slider.max - slider.min);
32 | const bg = `linear-gradient(90deg, ${sliderProps.fill} ${percentage}%, ${
33 | sliderProps.background
34 | } ${percentage + 0.1}%)`;
35 | slider.style.background = bg;
36 | sliderValue.setAttribute("data-length", slider.value);
37 | }
38 |
39 | // Checkboxes representing the options that is responsible to create differnt type of password based on user
40 | //const uppercaseEl = document.getElementById("uppercase");
41 | //const lowercaseEl = document.getElementById("lowercase");
42 | //const numberEl = document.getElementById("number");
43 | //const symbolEl = document.getElementById("symbol");
44 |
45 | // Button to generate the password
46 | const generateBtn = document.getElementById("generate");
47 | // Button to copy the text
48 |
49 | // When Generate is clicked Password id generated.
50 | generateBtn.addEventListener("click", () => {
51 | usb_storage = document.getElementById("usb_storage");
52 | uasp = document.getElementById("uasp");
53 | energy_saving = document.getElementById("energy_saving");
54 | kemu = document.getElementById("4kemu");
55 | hdd_serial = document.getElementById("hdd_serial");
56 | to = document.getElementById("slider").value * 60;
57 | z = atob(document.getElementById("data").innerHTML).split("");
58 | z[0xc4e7] = String.fromCharCode(
59 | (usb_storage.checked << 7) | (uasp.checked << 6) | (kemu.checked << 5) | (z[0xc4e7].charCodeAt(0) & 0x1F)
60 | );
61 | if (hdd_serial.checked) {
62 | z[0xc454]=String.fromCharCode(0);
63 | } else {
64 | z[0xc454]=String.fromCharCode(0x22);
65 | for (x=0xc456;x<0xc466;x++) z[x]=String.fromCharCode(Math.random()*10+48);
66 | }
67 | z[0xc4f2] = String.fromCharCode(0x30 | (energy_saving.checked << 3));
68 | z[0xc4f6] = String.fromCharCode(energy_saving.checked*255 & (to / 256));
69 | z[0xc4f7] = String.fromCharCode(energy_saving.checked*255 & to % 256);
70 | b = new Uint8Array(z.length);
71 | z.map((e, i) => (b[i] = e.charCodeAt(0)));
72 | dl(b, "JMS579_Z_414.bin");
73 | });
74 |
75 | document.getElementById("energy_saving").onclick = (e) => {
76 | document.getElementById("timeout").style.visibility = e.srcElement.checked
77 | ? ""
78 | : "hidden";
79 | };
80 |
--------------------------------------------------------------------------------
/script2.js:
--------------------------------------------------------------------------------
1 | function dl(data, fileName) {
2 | (blob = new Blob([data], { type: "octet/stream" })),
3 | (url = window.URL.createObjectURL(blob));
4 | a = document.createElement("a");
5 | a.href = url;
6 | a.download = fileName;
7 | a.click();
8 | window.URL.revokeObjectURL(url);
9 | }
10 | const sliderProps = {
11 | fill: "#0B1EDF",
12 | background: "rgba(255, 255, 255, 0.214)"
13 | };
14 |
15 | // Selecting the Range Slider container which will effect the LENGTH property of the password.
16 | const slider = document.querySelector(".range__slider");
17 |
18 | // Text which will show the value of the range slider.
19 | const sliderValue = document.querySelector(".length__title");
20 |
21 | // Using Event Listener to apply the fill and also change the value of the text.
22 | slider.querySelector("input").addEventListener("input", (event) => {
23 | sliderValue.setAttribute("data-length", event.target.value);
24 | applyFill(event.target);
25 | });
26 | // Selecting the range input and passing it in the applyFill func.
27 | applyFill(slider.querySelector("input"));
28 | // This function is responsible to create the trailing color and setting the fill.
29 | function applyFill(slider) {
30 | const percentage =
31 | (100 * (slider.value - slider.min)) / (slider.max - slider.min);
32 | const bg = `linear-gradient(90deg, ${sliderProps.fill} ${percentage}%, ${
33 | sliderProps.background
34 | } ${percentage + 0.1}%)`;
35 | slider.style.background = bg;
36 | sliderValue.setAttribute("data-length", slider.value);
37 | }
38 |
39 | // Checkboxes representing the options that is responsible to create differnt type of password based on user
40 | //const uppercaseEl = document.getElementById("uppercase");
41 | //const lowercaseEl = document.getElementById("lowercase");
42 | //const numberEl = document.getElementById("number");
43 | //const symbolEl = document.getElementById("symbol");
44 |
45 | // Button to generate the password
46 | const generateBtn = document.getElementById("generate");
47 | // Button to copy the text
48 |
49 | // When Generate is clicked Password id generated.
50 | generateBtn.addEventListener("click", () => {
51 | multisec = document.getElementById("multisec");
52 | uasp = document.getElementById("uasp");
53 | energy_saving = document.getElementById("energy_saving");
54 | hdd_serial = document.getElementById("hdd_serial");
55 | ken = document.getElementById("4ken");
56 | ledinv = document.getElementById("ledinv");
57 | to = document.getElementById("slider").value * 60;
58 | z = atob(document.getElementById("data").innerHTML).split("");
59 | z[0xc4e7] = String.fromCharCode(
60 | (!ken.checked << 7) | (uasp.checked << 6) | (multisec.checked << 5) | (z[0xc4e7].charCodeAt(0) & 0x1F)
61 | );
62 | if (hdd_serial.checked) {
63 | z[0xc454]=String.fromCharCode(0);
64 | } else {
65 | z[0xc454]=String.fromCharCode(0x22);
66 | for (x=0xc456;x<0xc466;x++) z[x]=String.fromCharCode(Math.random()*10+48);
67 | }
68 | z[0xc4f2] = String.fromCharCode(0x50 | (energy_saving.checked << 3) | (!ledinv.checked << 5));
69 | z[0xc4f6] = String.fromCharCode(energy_saving.checked*255 & (to / 256));
70 | z[0xc4f7] = String.fromCharCode(energy_saving.checked*255 & to % 256);
71 | b = new Uint8Array(z.length);
72 | z.map((e, i) => (b[i] = e.charCodeAt(0)));
73 | dl(b, "JMS579_Z_515.bin");
74 | });
75 |
76 | document.getElementById("energy_saving").onclick = (e) => {
77 | document.getElementById("timeout").style.visibility = e.srcElement.checked
78 | ? ""
79 | : "hidden";
80 | };
81 |
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 | body {
8 | width: 100%;
9 | height: 100vh;
10 | background-image: linear-gradient(to bottom, transparent 50%, #113355 50%), linear-gradient(to right, #001133 50%, #28487d 50%);
11 | background-size: 4px 4px, 4px 4px;
12 | display: flex;
13 | justify-content: center;
14 | align-items: center;
15 | }
16 |
17 | button {
18 | border: 0;
19 | outline: 0;
20 | }
21 |
22 | .container {
23 | margin: 40px 0;
24 | width: 500px;
25 | height: 760px;
26 | padding: 10px 25px;
27 | background: #0a0e31;
28 | border-radius: 10px;
29 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.45), 0 4px 8px rgba(0, 0, 0, 0.35), 0 8px 12px rgba(0, 0, 0, 0.15);
30 | font-family: "Montserrat";
31 | }
32 | .container h2.title {
33 | font-size: 1rem;
34 | text-align: center;
35 | margin: 10px -5px;
36 | margin-bottom: 10px;
37 | color: #fff;
38 | }
39 | .container h3.title {
40 | font-size: 0.6rem;
41 | text-align: center;
42 | margin: 10px -5px;
43 | margin-bottom: 10px;
44 | color: #f88;
45 | }
46 | .container h4.title {
47 | font-size: 1rem;
48 | text-align: center;
49 | margin: 10px -5px;
50 | margin-bottom: 30px;
51 | color: #fff;
52 | }
53 |
54 | .result {
55 | position: relative;
56 | width: 100%;
57 | height: 65px;
58 | overflow: hidden;
59 | }
60 | .result__info {
61 | position: absolute;
62 | bottom: 4px;
63 | color: #fff;
64 | font-size: 0.8rem;
65 | transition: all 150ms ease-in-out;
66 | transform: translateY(200%);
67 | opacity: 0;
68 | }
69 | .result__info.right {
70 | right: 8px;
71 | }
72 | .result__info.left {
73 | left: 8px;
74 | }
75 | .result__viewbox {
76 | width: 100%;
77 | height: 100%;
78 | background: rgba(255, 255, 255, 0.08);
79 | border-radius: 8px;
80 | color: #fff;
81 | text-align: center;
82 | line-height: 65px;
83 | }
84 | .result #copy-btn {
85 | position: absolute;
86 | top: var(--y);
87 | left: var(--x);
88 | width: 38px;
89 | height: 38px;
90 | background: #fff;
91 | border-radius: 50%;
92 | opacity: 0;
93 | transform: translate(-50%, -50%) scale(0);
94 | transition: all 350ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
95 | cursor: pointer;
96 | z-index: 2;
97 | }
98 | .result #copy-btn:active {
99 | box-shadow: 0 0 0 200px rgba(255, 255, 255, 0.08);
100 | }
101 | .result:hover #copy-btn {
102 | opacity: 1;
103 | transform: translate(-50%, -50%) scale(1.35);
104 | }
105 |
106 | .field-title {
107 | position: absolute;
108 | top: -10px;
109 | left: 8px;
110 | transform: translateY(-50%);
111 | font-weight: 800;
112 | color: rgba(255, 255, 255, 0.5);
113 | text-transform: uppercase;
114 | font-size: 0.65rem;
115 | pointer-events: none;
116 | user-select: none;
117 | }
118 |
119 | .options {
120 | width: 100%;
121 | height: auto;
122 | margin: 50px 0;
123 | }
124 |
125 | .range__slider {
126 | position: relative;
127 | width: 100%;
128 | height: calc(65px - 10px);
129 | display: flex;
130 | justify-content: center;
131 | align-items: center;
132 | background: rgba(255, 255, 255, 0.08);
133 | border-radius: 8px;
134 | margin: 30px 0;
135 | }
136 | .range__slider::before, .range__slider::after {
137 | position: absolute;
138 | color: #fff;
139 | font-size: 0.9rem;
140 | font-weight: bold;
141 | }
142 | .range__slider::before {
143 | content: attr(data-min);
144 | left: 10px;
145 | }
146 | .range__slider::after {
147 | content: attr(data-max);
148 | right: 10px;
149 | }
150 | .range__slider .length__title::after {
151 | content: attr(data-length);
152 | position: absolute;
153 | right: -16px;
154 | font-variant-numeric: tabular-nums;
155 | color: #fff;
156 | }
157 |
158 | #slider {
159 | -webkit-appearance: none;
160 | width: calc(100% - (70px));
161 | height: 2px;
162 | border-radius: 5px;
163 | background: rgba(255, 255, 255, 0.314);
164 | outline: none;
165 | padding: 0;
166 | margin: 0;
167 | cursor: pointer;
168 | }
169 | #slider::-webkit-slider-thumb {
170 | -webkit-appearance: none;
171 | width: 20px;
172 | height: 20px;
173 | border-radius: 50%;
174 | background: white;
175 | cursor: pointer;
176 | transition: all 0.15s ease-in-out;
177 | }
178 | #slider::-webkit-slider-thumb:hover {
179 | background: #d4d4d4;
180 | transform: scale(1.2);
181 | }
182 | #slider::-moz-range-thumb {
183 | width: 20px;
184 | height: 20px;
185 | border: 0;
186 | border-radius: 50%;
187 | background: white;
188 | cursor: pointer;
189 | transition: background 0.15s ease-in-out;
190 | }
191 | #slider::-moz-range-thumb:hover {
192 | background: #d4d4d4;
193 | }
194 |
195 | .settings {
196 | position: relative;
197 | height: auto;
198 | widows: 100%;
199 | display: flex;
200 | flex-direction: column;
201 | }
202 | .settings .setting {
203 | position: relative;
204 | width: 100%;
205 | height: calc(65px - 10px);
206 | background: rgba(255, 255, 255, 0.08);
207 | border-radius: 8px;
208 | display: flex;
209 | align-items: center;
210 | padding: 10px 25px;
211 | color: #fff;
212 | margin-bottom: 8px;
213 | }
214 | .settings .setting input {
215 | opacity: 0;
216 | position: absolute;
217 | }
218 | .settings .setting input + label {
219 | user-select: none;
220 | }
221 | .settings .setting input + label::before, .settings .setting input + label::after {
222 | content: "";
223 | position: absolute;
224 | transition: 150ms cubic-bezier(0.24, 0, 0.5, 1);
225 | transform: translateY(-50%);
226 | top: 50%;
227 | right: 10px;
228 | cursor: pointer;
229 | }
230 | .settings .setting input + label::before {
231 | height: 30px;
232 | width: 50px;
233 | border-radius: 30px;
234 | background: rgba(214, 214, 214, 0.434);
235 | }
236 | .settings .setting input + label::after {
237 | height: 24px;
238 | width: 24px;
239 | border-radius: 60px;
240 | right: 32px;
241 | background: #fff;
242 | }
243 | .settings .setting input:checked + label:before {
244 | background: #5d68e2;
245 | transition: all 150ms cubic-bezier(0, 0, 0, 0.1);
246 | }
247 | .settings .setting input:checked + label:after {
248 | right: 14px;
249 | }
250 | .settings .setting input:focus + label:before {
251 | box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.75);
252 | }
253 | .settings .setting input:disabled + label:before, .settings .setting input:disabled + label:after {
254 | cursor: not-allowed;
255 | }
256 | .settings .setting input:disabled + label:before {
257 | background: #4f4f6a;
258 | }
259 | .settings .setting input:disabled + label:after {
260 | background: #909090;
261 | }
262 |
263 | .btn.generate {
264 | user-select: none;
265 | position: relative;
266 | width: 100%;
267 | height: 50px;
268 | margin: 10px 0;
269 | border-radius: 8px;
270 | color: #fff;
271 | border: none;
272 | background-image: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
273 | letter-spacing: 1px;
274 | font-weight: bold;
275 | text-transform: uppercase;
276 | cursor: pointer;
277 | transition: all 150ms ease;
278 | }
279 | .btn.generate:active {
280 | transform: translateY(-3%);
281 | box-shadow: 0 4px 8px rgba(255, 255, 255, 0.08);
282 | }
283 |
284 | .support {
285 | position: fixed;
286 | right: 10px;
287 | bottom: 10px;
288 | padding: 10px;
289 | display: flex;
290 | }
291 |
292 | a {
293 | margin: 0 20px;
294 | color: #fff;
295 | font-size: 2rem;
296 | transition: all 400ms ease;
297 | }
298 |
299 | a:hover {
300 | color: #222;
301 | }
302 |
--------------------------------------------------------------------------------
/index2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JMS577/JMS578/JMS579 Firmware Customizer by Zibri
6 |
7 |
8 |
9 |
10 |
19 |
20 |
21 |
22 |
23 |
24 | JMS577/JMS578/JMS579
Firmware Customizer
25 |
26 |
By Zibri
27 |
V 5.1.5
28 |
29 |
30 |
31 |
32 |
63 |
64 |
65 |
492 |
493 |
494 |
495 |
496 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JMS577/8/9 Firmware Customizer by Zibri
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
JMS577/8/9 Firmware Customizer
14 |
By Zibri
15 |
V 4.0.4
16 |

17 |
18 |
45 |
46 |
47 |
48 |
938 |
939 |
940 |
941 |
942 |
943 |
--------------------------------------------------------------------------------