@bergetai/ui 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +724 -503
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +82 -1
- package/dist/index.d.ts +82 -1
- package/dist/index.js +697 -479
- package/dist/index.js.map +1 -1
- package/dist/neural-flow.cjs +1015 -0
- package/dist/neural-flow.cjs.map +1 -0
- package/dist/neural-flow.d.cts +47 -0
- package/dist/neural-flow.d.ts +47 -0
- package/dist/neural-flow.js +978 -0
- package/dist/neural-flow.js.map +1 -0
- package/package.json +20 -2
|
@@ -0,0 +1,1015 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/components/neural-flow/index.ts
|
|
31
|
+
var neural_flow_exports = {};
|
|
32
|
+
__export(neural_flow_exports, {
|
|
33
|
+
NeuralFlow: () => NeuralFlow
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(neural_flow_exports);
|
|
36
|
+
|
|
37
|
+
// src/components/neural-flow/NeuralFlow.tsx
|
|
38
|
+
var import_fiber = require("@react-three/fiber");
|
|
39
|
+
var import_react = require("react");
|
|
40
|
+
var THREE = __toESM(require("three"), 1);
|
|
41
|
+
|
|
42
|
+
// src/components/neural-flow/mnist-samples.ts
|
|
43
|
+
var MNIST_SAMPLES = {
|
|
44
|
+
0: [
|
|
45
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4tgAAAAAAAAAAAAAAff_-gAAAAAAAAAAAACv____8IAAAAAAAAAAD7_2v__-gAAAAAAAAAC3_-wAv__UAAAAAAAAAr_-yAGz_9QAAAAAAAAf_9wAAAu_1AAAAAAAALv-hAAAAb_kQAAAAAALf-wAAAABf_RAAAAAAA__iAAAAAF_-IAAAAAAG_4AAAAAAf_8wAAAAAAr_cAAAAAPv_AAAAAAACv8AAAAACP_VAAAAAAAK_wAAAACP_1AAAAAAAAr_AAAAB__6AAAAAAAACv9gAAKf_9EAAAAAAAAK_7iL___-YAAAAAAAAAb______7IAAAAAAAAAAY7___6kAAAAAAAAAAAABI35gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
46
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzKIAAAAAAAAAAAAAAE3_-wAAAAAAAAAAAAAE3__2AAAAAAAAAAAAAC3____HEAAAAAAAAAAEv__t__-gAAAAAAAAAAj9z6FL__YAAAAAAAAADfgXYAF__kAAAAAAAAA-0QAAABf_0AAAAAAAA9-AAAAAA__gAAAAAAAF_zAAAAAAn-AAAAAAAAn5AAAAAAG_4AAAAAAADvcAAAAABP-AAAAAAAAO9wAAAAA-_AAAAAAAAA76AAAAAJ_3AAAAAAAADvwAAAAZ_6AAAAAAAAAO_RAAAb_6AAAAAAAAAA7_1Cd9_6AAAAAAAAAADP_____6AAAAAAAAAAAE7____WAAAAAAAAAAAABIr_tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
47
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHuAAAAAAAAAAAAAAAAU7_oAAAAAAAAAAAAAAG__9RAAAAAAAAAAAAAD7___ySAAAAAAAAAAAAn_____5SAAAAAAAAAAHP_XREXvsQAAAAAAAACf_zAAAE74AAAAAAAAAu__EAAAC_4QAAAAAAAG_9gQAAAL_0AAAAAAABz_cAAAAAv_gAAAAAAAn_kQAAAALf-AAAAAAAHP8wAAAACP_xAAAAAAB_-wAAAABP_6EAAAAAAL_7AAAAB9_8EAAAAAAAz_oAAAAf__UAAAAAAACf9AAABc__YQAAAAAAAJ_6AAWP_-UQAAAAAAAAb_52j__6IAAAAAAAAAAK____-UEAAAAAAAAAAAAjashAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
48
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1VaYAAAAAAAAAAAAAed___lAAAAAAAAAAADj____bYAAAAAAAAAAAz_-Xz7EAAAAAAAAAAAj_-RB__BAAAAAAAAAAP_-QAAj_gAAAAAAAAAG_-hAAAZ_jAAAAAAAAK__lAAAAXvgAAAAAAAC__2AAAAAF_gAAAAAAAO_4AAAAAAL-MAAAAAAG_9MAAAAAAv-QAAAAAAn_kAAAAAAC_5AAAAAACf8gAAAAAAj_kAAAAAAJ_yAAAAAAf_4QAAAAAAn_IAAAAAfP-QAAAAAACf-yAAASj_2BAAAAAAAF__-Hd8__sQAAAAAAAADf______wgAAAAAAAAAAXv___9kQAAAAAAAAAAAEr7VVMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
49
|
+
],
|
|
50
|
+
1: [
|
|
51
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeyAAAAAAAAAAAAAAAAB_oAAAAAAAAAAAAAAAAH-wAAAAAAAAAAAAAAAAf8EAAAAAAAAAAAAAAACP8QAAAAAAAAAAAAAAAd_RAAAAAAAAAAAAAAAF_7AAAAAAAAAAAAAAAAj_sAAAAAAAAAAAAAAACv9wAAAAAAAAAAAAAAAO_1AAAAAAAAAAAAAAAD__EAAAAAAAAAAAAAAAj_sAAAAAAAAAAAAAAACv9gAAAAAAAAAAAAAAAe_iAAAAAAAAAAAAAAAI_5AAAAAAAAAAAAAAAAv_YAAAAAAAAAAAAAAAC_4gAAAAAAAAAAAAAAAf9wAAAAAAAAAAAAAAAB7SAAAAAAAAAAAAAAAAC3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
52
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAAAAAAAAAAAAAAf9AAAAAAAAAAAAAAAALf0AAAAAAAAAAAAAAABPlTAAAAAAAAAAAAAAAG_lAAAAAAAAAAAAAAAD_9EAAAAAAAAAAAAAAAr_oAAAAAAAAAAAAAAADP9QAAAAAAAAAAAAAAAM_1AAAAAAAAAAAAAAAD79EAAAAAAAAAAAAAAAb_wAAAAAAAAAAAAAAAPv9gAAAAAAAAAAAAAABv_RAAAAAAAAAAAAAAAd_7AAAAAAAAAAAAAAAF_-YAAAAAAAAAAAAAAAb4gAAAAAAAAAAAAAAADfogAAAAAAAAAAAAAAA-tgAAAAAAAAAAAAAAADrBAAAAAAAAAAAAAAAANJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
53
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpAAAAAAAAAAAAAAAAAL9wAAAAAAAAAAAAAAAAv6AAAAAAAAAAAAAAAADPoAAAAAAAAAAAAAAABP-QAAAAAAAAAAAAAAAF_RAAAAAAAAAAAAAAAAv_MAAAAAAAAAAAAAAAC_wQAAAAAAAAAAAAAAAu-wAAAAAAAAAAAAAAAD_7AAAAAAAAAAAAAAAAP_UAAAAAAAAAAAAAAAA_wQAAAAAAAAAAAAAAAJ-QAAAAAAAAAAAAAAAF70AAAAAAAAAAAAAAAAr-IAAAAAAAAAAAAAAACvgAAAAAAAAAAAAAAAAK9AAAAAAAAAAAAAAAAArAAAAAAAAAAAAAAAAACWAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
54
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAAAC7QAAAAAAAAAAAAAAAAP-IAAAAAAAAAAAAAAACP9AAAAAAAAAAAAAAAAJ_QAAAAAAAAAAAAAAAAn9AAAAAAAAAAAAAAAADvoAAAAAAAAAAAAAAAAP8gAAAAAAAAAAAAAAAA_wAAAAAAAAAAAAAAAAr-AAAAAAAAAAAAAAAADfkAAAAAAAAAAAAAAAAN-QAAAAAAAAAAAAAAAB31AAAAAAAAAAAAAAAAT_MAAAAAAAAAAAAAAACPwAAAAAAAAAAAAAAAAK-wAAAAAAAAAAAAAAAAr2AAAAAAAAAAAAAAAAA-YAAAAAAAAAAAAAAAAAZwAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
55
|
+
],
|
|
56
|
+
2: [
|
|
57
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABu3cQAAAAAAAAAAAAABv__-IAAAAAAAAAAAAAX3af-xAAAAAAAAAAAACHEAj_oAAAAAAAAAAAABEAAc-wAAAAAAAAAAAAAAAAb7AAAAAAAAAAAAAAAABf4wAAAAAAAAAAAAAAAA30AAAAAAAAAAAAAAAAPtIAAAAAAAAAAAAAAABvsAAAAAAAAAAAAAAAAJ-wAAAAAAAAAAAAAAAG_7AAAAAAAAAAAAAAAAn_QAAAAAAAAAAABEAAXvgQAAAAAAAAAANu7Mz_8gAAAAAAAAAAHf_u___EEAAAAAAAAAB_933___-0IQAAAAAAAI_73_1t3u7ZAAAAAAAADP__kAACUwAAAAAAAAAF_-YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
58
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd-RAAAAAAAAAAAAAAff-_0gAAAAAAAAAAAAT__Bn8AAAAAAAAAAAAA_-hAM-AAAAAAAAAAAAAcwAAf3AAAAAAAAAAAAAAAABvoAAAAAAAAAAAAAAAAG-gAAAAAAAAAAAAAAAAb6AAAAAAAAAAAAAAAABvgAAAAAAAAAAAAAAAAG4gAAAAAAAAAAAAAAAC3AAAAAAAAAAAAAAAKb78AAAAAAAAAAARAnU___4gAAAAAAAAB-3P_9___4AAAAAAAAAHKfkiJcePUAAAAAAAAAicgQFN9G9wAAAAAAAACvoFnf9wTaAAAAAAAAAK-l_P_BACUAAAAAAAAAPP__-wAAAAAAAAAAAAAEz5lhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
59
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHAAAAAAAAAAAAAAAAb_9wAAAAAAAAAAAAAAB-X8AAAAAAAAAAAAAAAMgM4AAAAAAAAAAAAAAC5w2QAAAAAAAAAAAAAACBP5AAAAAAAAAAAAAAABB_kAAAAAAAAAAAAAAAAH9gAAAAAAAAAAAAAAAAviAAAAAAAAAAAAAAAAHdAAAAAAAAAAAAAAAABvgAAAAAAAAAAAAAAAAK9gAAAAAAAAAAAAACEB3RAAAAAAAAAAAAAH_Xf4AAAAAAAAAAAAAF_u__QAAAAAAAAAAAAC2gLP-RAAAAAAAAAAAAn2BO__21AAAAAAAAAAB_Mc9ie5QAAAAAAAAAAC_N-QAAAAAAAAAAAAAAB-9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
60
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACv9MAAAAAAAAAAAAAAD7__SAAAAAAAAAAAAAB7qN_0QAAAAAAAAAAAAj1AAn2AAAAAAAAAAAAAVAAAM0QAAAAAAAAAAAAAAAAbyAAAAAAAAAAAAAAAABPIAAAAAAAAAAAAAAAAH4gAAAAAAAAAAAAAAAArAAAAAAAAAAAAAAAAAP5AAAAAAAAAAAAAAAACtIAAAAAAAAAAAAAFHyvcAAAAAAAAAAAAEnf__-RAAAAAAAAAAAG__zP_foAAAAAAAAAAC38Mb-AeQAAAAAAAAAAv7EZ9wAAAAAAAAAAAADOIb-gAAAAAAAAAAAAAdo7-iAAAAAAAAAAAAAAz_-iAAAAAAAAAAAAAACOswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
61
|
+
],
|
|
62
|
+
3: [
|
|
63
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs8wAAAAAAAAAAAAAAF5_9cyAAAAAAAAAAAACf___7-gAAAAAAAAAAAH_93HjvkAAAAAAAAAAAbHEQAe-AAAAAAAAAAAAAAABO-yAAAAAAAAAAAAAACf_CAAAAAAAAAAAAE4q_9xAAAAAAAAAAAAB____SAAAAAAAAAAAAAH___4MAAAAAAAAAAAAAbNhb5QAAAAAAAAAAAAAAAAAosAAAAAAAAAAAAAAAAADWAAAAAAAAAAAAAAAAALkAAAAAAAAAAAAAAAAA6QAAAAAAAAAAAAAAAAr4AAAAAAAAFwAAAAAAH_MAAAAAAAAv54ZERK_ccAAAAAAAAAj______6EQAAAAAAAAAEaN_f-zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
64
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa___2BAAAAAAAAAAAACv____wQAAAAAAAAAAAG__7uv5AAAAAAAAAAAAFmUABvkAAAAAAAAAAAAAAAFO-QAAAAAAAAAAAAAAGf_4AAAAAAAAAAAAABOf_qEAAAAAAAAAAAA0v__1AAAAAAAAAAAAB_____kgAAAAAAAAAAAE7__O_NMAAAAAAAAAAABLthNBmQAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAA0QAAAAAAAAAAAAAAAADUAAAAAAAAAAAAAAAABeYAAAAAAAAAAAAAAAKP0QAAAAAAAAAXlmZmzv-QAAAAAAAAAI_______2AAAAAAAAAAX_____1RAAAAAAAAAAAYubpgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
65
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPvpolhAAAAAAAAAAAE7P____1AAAAAAAAAAAK3jpV-_1AAAAAAAAAAABQAAAH_0AAAAAAAAAAAAAAASv9QAAAAAAAAAAAAAAXv_UAAAAAAAAAAAAAGj_-xAAAAAAAAAAAAAF__5AAAAAAAAAAAAAAATv_DAAAAAAAAAAAAAAAG__5QAAAAAAAAAAAAAABf_7EAAAAAAAAAAAAAAAO_-hAAAAAAAAAAAAAAAD7_QAAAAAAAAAAAAAAACv9AAAAAAAAAAAAAAAAb_0AAAAAAAAAAAAAAG8_8EAAAAAAAAAAAADjP__YAAAAAAAAAAAKq7__-UAAAAAAAAAAABv_9wzMAAAAAAAAAAAAI_3EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
66
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYjugxAAAAAAAAAAAALP____wAAAAAAAAAAAA__Jn__0AAAAAAAAAAACcQABv-IAAAAAAAAAAAAAAAX_wAAAAAAAAAAAAAAAf_9QAAAAAAAAAAAAAAj_-QAAAAAAAAAAAAAj3_9gAAAAAAAAAAAABO__-1EAAAAAAAAAAAAK_____cUAAAAAAAAAAAPf___v_0AAAAAAAAAAAARVVDXvoAAAAAAAAAAAAAAAAv-gAAAAAAAAAAAAAAA9_zAAAAAAAAAAAAAAA9_3EAAAAAAAAAAAAAKO_5AAAAAAAAAAAABnfP_mAAAAAAAAAAAABP__-yAAAAAAAAAAAAAe__6AAAAAAAAAAAAAAAj8QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
67
|
+
],
|
|
68
|
+
4: [
|
|
69
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4QAAAAAAAAAAAAAAAAj3AAAAAAAAAAAAAAAADPcAAAAAAAAAAAAAAAAd8wAAAAAAAAAAAnMAAG_iAAAAAAAAAAAa9gAAj6AAAAAAAAAAAa_jAADPcAAAAAAAAAAa_3AABv9AAAAAAAAAAG_3AAAI_BAAAAAAAAAB78AAAB74cwAAAAAAAACv-3VXz__7AAAAAAAAABn______ZMAAAAAAAAAAEmcq_-hAAAAAAAAAAAAAAAG_0AAAAAAAAAAAAAAABz6AAAAAAAAAAAAAAAAX_UAAAAAAAAAAAAAAAHPoAAAAAAAAAAAAAAABP9AAAAAAAAAAAAAAAAJ-gAAAAAAAAAAAAAAAAbSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
70
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAG-QAAAAAAAAAAAAAAAAb5AAAAAAAAAAALIAAACPYAAAAAAAAAAC5wAAAJ8wAAAAAAAAAABRAAAAqwAAAAAAAAAAJAAAAAFhAAAAAAAAAACVAAAABvgAAAAAAAAABPcAAABL9SAAAAAAAAANUAAAAq_8kAAAAAAAA6sRdXjO__-QAAAAAAAJ_93_7___tjAAAAAAAAK93dyHdMkQAAAAAAAAAAAAAAAW5QAAAAAAAAAAAAAAAHfhAAAAAAAAAAAAAAACnWAAAAAAAAAAAAAAAAiJAAAAAAAAAAAAAAAAOpYAAAAAAAAAAAAAAAAEoAAAAAAAAAAAAAAAAEswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
71
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtgAAAAAAAAAAAAAAAAHmAAAAAAAAAAABcAAABPYAAAAAAAAAAAfiAAAJ8gAAAAAAAAAACbAAAA7AAAAAAAAAAABPQAAAP3AAAAAAAAAAAJ0QAACPYAAAAAAAAAAE-AAAAL4QAAAAAAAAABz2IAAD-QAAAAAAAAAAb__tynv2AAAAAAAAAABv7-____YAAAAAAAAAABISEiJe4QAAAAAAAAAAAAAAAD9wAAAAAAAAAAAAAAAAb3AAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAL9wAAAAAAAAAAAAAAAA3yAAAAAAAAAAAAAAAADdEAAAAAAAAAAAAAAAAuwAAAAAAAAAAAAAAAAB5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
72
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtEAAAAAAAAAAAAAAAAG4gAAAAAAAAAAABoQAAbzAAAAAAAAAAAAX2AABvMAAAAAAAAAAACvYAAG0QAAAAAAAAAAAvwQAAbRAAAAAAAAAAAK-AAACsAAAAAAAAAAAB2hAAAMwAAAAAAAAAAAf2AAAE_AAAAAAAAAAACfgAAAn3AAAAAAAAAAAJ__-p7_IAAAAAAAAAAAf_____oAAAAAAAAAAAAFrbiv5QAAAAAAAAAAAAABAD-gAAAAAAAAAAAAAAAA32AAAAAAAAAAAAAAAAD_EAAAAAAAAAAAAAAAB_kAAAAAAAAAAAAAAAAd9wAAAAAAAAAAAAAAAD-wAAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
73
|
+
],
|
|
74
|
+
5: [
|
|
75
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsgAAAAAAAAAAAAAAAF-oQAAAAAAAAB5IAAkjtYAAAAAAAAAAC38zP-1AAAAAAAAAAAACcqqUgAAAAAAAAAAAAAtcAAAAAAAAAAAAAAAAH9AAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAAX-3VAAAAAAAAAAAAAABf_L-AAAAAAAAAAAAAADtQCfUAAAAAAAAAAAAAAAAB6QAAAAAAAAAAAAAAAACeEAAAAAAAAAAAAAAAAE9wAAAAAAAAAAAAAAAAT3AAAAAAAAAAAAAAAAB_QAAAAAAAAAAFAAAABewQAAAAAAAAAAexAAGv4gAAAAAAAAAAAa65v_kgAAAAAAAAAAAAF8_KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
76
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALYAAAAAAAAAAAAAAABc5AAAAAAAAAAAAAAAKu0gAAAAAAAAAAAAABfvoQAAAAAAAAAAAAAFz8MAAAAAAAAAAAAAAr_nAAAAAAAAAAAAAAAr6yAAAAAAAAAAAAAAAG9gAAAAAAAAAAAAAAAAL_2WEAAAAAAAAAAAAAADjf_rUAAAAAAAAAAAAAAAA535AAAAAAAAAAAAAAAAAK9AAAAAAAAAAAAAAAAAHmAAAAAAAAAAAAAAAAANoAAAAAAAAAAAAAAAAB5gAAAAAAAAAAAAAAABr0AAAAAAAAAAAAAAABz3AAAAAAAAAAAAAAADz3AAAAAAAAAAAAAAJa7UAAAAAAAAAAAAAACfthAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
77
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfxAAAAAAAAAAAAAAAAC_wQAAAAAAAAAAAAAAB-38EAAAAAAAAAAAAABewHoQAAAAAAAAAAAAAc4wAAAAAAAAAAAAAAAJ-AAAAAAAAAAAAAAAAA3zAAAAAAAAAAAAAAAAT6EgAAAAAAAAAAAAAABP_e1gAAAAAAAAAAAAAAXNzfgAAAAAAAAAAAAAAAEB_2AAAAAAAAAAAAAAAACPcAAAAAAAAAAAAAAAAC-QAAAAAAAAAAAAAAAAL3AAAAAAAAAAAAAAAACfcAAAAAAAAAAAAAAAAP5AAAAAAAAAAAAAAAAG9gAAAAAAAAAAAAAAAG7SAAAAAAAAAAAAAAAp6QAAAAAAAAAAAAAAAItQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
78
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsEAAAAAAAAAAAAAAAAG8gAAAAAAAAAAAAAAAAmgB2AAAAAAAAAAAAAALYWfkAAAAAAAAAAAAAK__9kQAAAAAAAAAAAAB_6WEAAAAAAAAAAAAAAc0gAAAAAAAAAAAAAAAJ9AAAAAAAAAAAAAAAAq9gAAAAAAAAAAAAAABu_6mWMAAAAAAAAAAAAJ6e7u_5IAAAAAAAAAAAAAAAA4-QAAAAAAAAAAAAAAAAB_QAAAAAAAAAAAAAAAAJ9AAAAAAAAAAAAAAAAI-QAAAAAAAAAAAAAAAI-xAAAAAAAAAAAANQBt-QAAAAAAAAAAAAfiS_swAAAAAAAAAAAAX-z9YAAAAAAAAAAAAABf6nEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
79
|
+
],
|
|
80
|
+
6: [
|
|
81
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAAAE_1AAAAAAAAAAAAAAABn-EAAAAAAAAAAAAAAAL_kAAAAAAAAAAAAAAAGv0wAAAAAAAAAAAAAACP9AAAAAAAAAAAAAAAAM-AAAAAAAAAAAAAAAAI_iAAAAAAAAAAAAAAAB73AAAAAAAAAAAAAAAAj8AAAgAAAAAAAAAAAAT_UABNxwAAAAAAAAAACPkABM_-UAAAAAAAAAAM8QXv___AAAAAAAAAAAzxn_7HT9IAAAAAAAAALpD_wQAvwAAAAAAAAABv9_0AAc_AAAAAAAAAAG___mR9_WAAAAAAAAAAPv_____EAAAAAAAAAAAE7____xAAAAAAAAAAAAAYjNhRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
82
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-kAAAAAAAAAAAAAAAAL9AAAAAAAAAAAAAAAAa-QAAAAAAAAAAAAAAAI_iAAAAAAAAAAAAAAAC72AAAAAAAAAAAAAAAAX_AAAAAAAAAAAAAAAACfsAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAI_QAAAAAAAAAAAAAAAD7zAAAAAAAAAAAAAAAAf9EAAAAAAAAAAAAAAACvoAAXyDAAAAAAAAAABO4wCO__9wAAAAAAAAAH-QGv_Lz_EAAAAAAAAAf3Pf-RBP0QAAAAAAAAA_3v1AAE-AAAAAAAAAAB7_9gIlzgAAAAAAAAAACP__vv_3AAAAAAAAAAAAr____nAAAAAAAAAAAAAp__-1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
83
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8cAAAAAAAAAAAAAAAAbwAAAAAAAAAAAAAAAAb9QAAAAAAAAAAAAAAAJ-AAAAAAAAAAAAAAAAF-yAAAAAAAAAAAAAAAF7TAAAAAAAAAAAAAAAD7kAAAAAAAAAAAAAAABv3AAAAAAAAAAAAAAAAj6AAAAAAAAAAAAAAAATdIAAAAAAAAAAAAAAAG_QAAFdzAAAAAAAAAABvgABc__9AAAAAAAAAAb8gGf_nPJAAAAAAAAAF9wK-cxALkAAAAAAAAAf2CuUAAD5wAAAAAAAABPZfUAAAnBAAAAAAAAAB6IsQAAbkAAAAAAAAAACv5wAAXnAAAAAAAAAAADz9mq33AAAAAAAAAAAAAY7_xzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
84
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7QAAAAAAAAAAAAAAABziAAAAAAAAAAAAAAAAj2AAAAAAAAAAAAAAAAPrAAAAAAAAAAAAAAAACOMAAAAAAAAAAAAAAAA_kAAAAAAAAAAAAAAAAL9AAAAAAAAAAAAAAAAD-AAAAAAAAAAAAAAAAArSAAAAAAAAAAAAAAAAX4AAAAAAAAAAAAAAAADOAAAAAAAAAAAAAAAAAekAABIgAAAAAAAAAAAF9AAK3_sQAAAAAAAAAAzzA866n0AAAAAAAAAADuA-9wAOkAAAAAAAAAAO4J-AAA7QAAAAAAAAAAz0mQAAn0AAAAAAAAAABfmLIDv4AAAAAAAAAAAAz9_t7mAAAAAAAAAAAAAp__mSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
85
|
+
],
|
|
86
|
+
7: [
|
|
87
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnef-QAAAAAAAAAABq_____-MAAAAAAAAAAN____6v9gAAAAAAAAAAr_-pMW_9AAAAAAAAAAAUkwAAr_oAAAAAAAAAAAAAAAHP5AAAAAAAAAAAAAAAA__QAAAAAAAAAAAAAAAF_7AAAAAAAAAAAAAAABz_UAAAAAAAAAAAAAAAX_sQAAAAAAAAAAAAAAHP9QAAAAAAAAAAAAAACf-xAAAAAAAAAAAAAAA-_RAAAAAAAAAAAAAAAE_8AAAAAAAAAAAAAAAAT_cAAAAAAAAAAAAAAACf9AAAAAAAAAAAAAAAAM9wAAAAAAAAAAAAAAAD70AAAAAAAAAAAAAAAAX_sAAAAAAAAAAAAAAAAI9AAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
88
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASHERif_EAAAAAAAAAAB_______cAAAAAAAAAAF____7P9wAAAAAAAAAAA5lDMh33AAAAAAAAAAAAAAAADPEAAAAAAAAAAAAAAABf8AAAAAAAAAAAAAAAAL-wAAAAAAAAAAAAAAAC74AAAAAAAAAAAAAAAAX_MAAAAAAAAAAAAAAAHPoAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAI_BAAAAAAAAAAAAAAAC32AAAAAAAAAAAAAAAAn9EAAAAAAAAAAAAAAADvwAAAAAAAAAAAAAAAAe4gAAAAAAAAAAAAAAAF-QAAAAAAAAAAAAAAAAr3AAAAAAAAAAAAAAAALfcAAAAAAAAAAAAAAABPwQAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
89
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOJn_EAAAAAAAAAAFfM7___9AAAAAAAAABpv__WZN-AAAAAAAAAAI__oxAE3iAAAAAAAAAALFAAAAX9EAAAAAAAAAAAAAAACvcAAAAAAAAAAAAAAABPsgAAAAAAAAAAAAAAAI-wAAAAAAAAAAAAAAABj6AAAAAAAAAAAAAAAAX6EAAAAAAAAAAAAAAAC_oAAAAAAAAAAAAAAAAO9QAAAAAAAAAAAAAAAK9wAAAAAAAAAAAAAAAB30AAAAAAAAAAAAAAAATqEAAAAAAAAAAAAAAACvQAAAAAAAAAAAAAAAAv0gAAAAAAAAAAAAAAAC-AAAAAAAAAAAAAAAAAj7AAAAAAAAAAAAAAAABtIAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
90
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEn7mdpAAAAAAAAAAAAF_____9MAAAAAAAAAAF3_____9QAAAAAAAAAAnu__3Mz5AAAAAAAAAAACJEQQAvsAAAAAAAAAAAAAAAAL-AAAAAAAAAAAAAAAAE_iAAAAAAAAAAAAAAAAr4AAAAAAAAAAAAAAAAr_QAAAAAAAAAAAAAAAX_gAAAAAAAAAAAAAAABf8wAAAAAAAAAAAAAAAW-wAAAAAAAAAAAAAAAL_gAAAAAAAAAAAAAAAJ_2AAAAAAAAAAAAAAAB76AAAAAAAAAAAAAAAAn-QAAAAAAAAAAAAAAAXvkAAAAAAAAAAAAAAADP4gAAAAAAAAAAAAAAAf9gAAAAAAAAAAAAAAAA3RAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
91
|
+
],
|
|
92
|
+
8: [
|
|
93
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP_9MAAAAAAAAAAAAAXv___BAAAAAAAAAAAAn__6rvMAAAAAAAAAAAf_tQAI9wAAAAAAAAAATvsQAAv3AAAAAAAAAADf9AAALvMAAAAAAAAAAG_2AALvsQAAAAAAAAAAC_sgTv4wAAAAAAAAAAAF_9bv5AAAAAAAAAAAAAB-__9AAAAAAAAAAAAAAB3_-wAAAAAAAAAAAAACv__9EAAAAAAAAAAAAAv-uO-QAAAAAAAAAAAAj_YAX-IAAAAAAAAAAADfYAAK8wAAAAAAAAAAANsAABz3AAAAAAAAAAAA34EF3_MAAAAAAAAAAACP____oQAAAAAAAAAAAAr__-MAAAAAAAAAAAAAAHz4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
94
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGv_qxAAAAAAAAAAAAAK____swcgAAAAAAAAAE_8iI78eAAAAAAAAAAC34AAAc_0AAAAAAAAAAP_YAACv5AAAAAAAAAAAv9gABv8EAAAAAAAAAAAf6EBz9QAAAAAAAAAAAAe9gr8UAAAAAAAAAAAAAr-j_QAAAAAAAAAAAAAAL__UAAAAAAAAAAAAAAAn_8wAAAAAAAAAAAAAAf-73AAAAAAAAAAAAABr_Zv8gAAAAAAAAAAAAP_oR33AAAAAAAAAAAABv4wCvcAAAAAAAAAAAAJ9AAI_AAAAAAAAAAAAAn0AAb4AAAAAAAAAAAACP9Cj_cAAAAAAAAAAAAC7___0wAAAAAAAAAAAAAo_-kwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
95
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI6_9MAAAAAAAAAAAAYz___-zAAAAAAAAAAAI_-pb_99QAAAAAAAAAC75EAf8HXAAAAAAAAAAj-EACvdfYAAAAAAAAACPsAANwaoAAAAAAAAAAG_5IAla8wAAAAAAAAAACv_VA7_RAAAAAAAAAAACnv2L-RAAAAAAAAAAAAAC3_9wAAAAAAAAAAAAAATf_wAAAAAAAAAAAAAAf_z_AAAAAAAAAAAAAAf-M_9wAAAAAAAAAAAAC-MD_3AAAAAAAAAAAAB-QALfcAAAAAAAAAAAAOwAA_9AAAAAAAAAAAAE-QAt_wAAAAAAAAAAAAf-id_5AAAAAAAAAAAAAd___5AAAAAAAAAAAAAAWN_nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
96
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACt9AAAAAAAAAAAAmu1vf_4AAAAAAAAAAAt_u_6dTYAAAAAAAAAAF-iXkAASAAAAAAAAAAArkAKAAPoAAAAAAAAAACaAAEAbfgAAAAAAAAAAE8QAAr_-AAAAAAAAAAACVAAf_5WAAAAAAAAAAAAiUj_wQMAAAAAAAAAAAAK7_wQAAAAAAAAAAAAAATP9QAAAAAAAAAAAAAAB_7YAAAAAAAAAAAAAAA95I4QAAAAAAAAAAAAAK-gb2AAAAAAAAAAAAADzABPkAAAAAAAAAAAAAT5AI9wAAAAAAAAAAAABPcE_lAAAAAAAAAAAAAE-QipAAAAAAAAAAAAAAL8OlIAAAAAAAAAAAAAAE78MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
97
|
+
],
|
|
98
|
+
9: [
|
|
99
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ74UgAAAAAAAAAAAASv___2AAAAAAAAAAAATulmd-kAAAAAAAAAAAHsIAAAewAAAAAAAAAABsEAAABbYQAAAAAAAAAHQAAAAJ_yAAAAAAAAAB5AAAAAz9EAAAAAAAAAHdQAAVv_UAAAAAAAAAAG_-ruzfYAAAAAAAAAAABHy3MH9QAAAAAAAAAAAAAAAAuQAAAAAAAAAAAAAAAAPxAAAAAAAAAAAAAAAACtAAAAAAAAAAAAAAAAAdQAAAAAAAAAAAAAAAAK4gAAAAAAAAAAAAAAAB1gAAAAAAAAAAAAAAAAXiAAAAAAAAAAAAAAAADIAAAAAAAAAAAAAAAAAuMAAAAAAAAAAAAAAAAJsQAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
100
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAny0AAAAAAAAAAAAAAGP_d-QAAAAAAAAAAAALfkwG_QAAAAAAAAAAALPcAAH-wAAAAAAAAAAGvYAAAv8AAAAAAAAAABvgAAALvYAAAAAAAAAAcsAAAG_0QAAAAAAAAAD-QAALP9gAAAAAAAAAAL7AATv_hAAAAAAAAAAAJ-5z9f4AAAAAAAAAAAAO-62CvIAAAAAAAAAAAAAEgA-oAAAAAAAAAAAAAAAAI9AAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAAH7AAAAAAAAAAAAAAAABvUAAAAAAAAAAAAAAAAM0AAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAP3FwAAAAAAAAAAAAAAA_noAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
101
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGO_pMAAAAAAAAAAAAAC____5ABIAAAAAAAAAB_tCJ9-QYwAAAAAAAABP4QAAL7BjAAAAAAAAAs4wAAC_sGMAAAAAAAAJ9wAABf9QUgAAAAAAAC7iAABO_QBQAAAAAAAAP_qZnf_4AAAAAAAAAAA-____7-EAAAAAAAAAAASIiGM_wAAAAAAAAAAAAAAAAI9wAAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAAAT9AAAAAAAAAAAAAAAACvYAAAAAAAAAAAAAAAAM8QAAAAAAAAAAAAAAAD_AAAAAAAAAAAAAAAAAr3AAAAAAAAAAAAAAAAHvIAAAAAAAAAAAAAAABf0AAAAAAAAAAAAAAAAD-AAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
|
|
102
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzz_xAAAAAAAAAAAAAHP_u_9QAAAAAAAAAAAHP0wA2_jAAAAAAAAAAB_1AAAb_QAAAAAAAAAAK-AAAHf4QAAAAAAAAAAriAACf4wAAAAAAAAAACuMABN-QAAAAAAAAAAAK_IjP_SAAAAAAAAAAAATv___4AAAAAAAAAAAAADbIbfcAAAAAAAAAAAAAAAA-wAAAAAAAAAAAAAAAAJ9gAAAAAAAAAAAAAAAA72AAAAAAAAAAAAAAAAL_IAAAAAAAAAAAAAAABvkAAAAAAAAAAAAAAAAd8wAAAAAAAAAAAAAAAG_RAAAAAAAAAAAAAAAAj0AAAAAAAAAAAAAAAAPvAAAAAAAAAAAAAAAAAaoAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
103
|
+
]
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// src/components/neural-flow/sparse-weights.ts
|
|
107
|
+
var SPARSE_WEIGHTS = {
|
|
108
|
+
weights1: "TQClvUogOIHCAKG_UKnRvng1HL8HxGO-Ld02P9eMJr8noC2_PhN0vxBR87yTra8-bI4jv3CFvwAnfvq-K9BdvWF3AAGq2gK8j6FFP1uQ8Dznlyg_lHEXPwhi9z5moF8-vxf6PjbLrbwcMDo-Gi7WvgJuOADm5Ni-fOuLvzj9nD6UJ-48Zvl_PYodsD7697u8gwYyvg0oLgFX7Yw_6AOSP0tz2z0H1a--RKWTv9rrJb9R08i8RM6EPqwOf7-Osh-8Rc5VPzwSTD-dPgY-4SxcPw7FujweAuG_qjNav_xOrTtx2_8-tDkjP9uLd75dX6G7-4tXPfGnDT-z9g6--NsVvuwyZz73R7K_PqjfPpWlQr_UJjW_EUETvz9b0b6xRtw9GFwEgRb0ZD6TAiU_FxN_vdk9QrvPswQ_XrgjPgKyAwBaTAg9U9gIABJnyzqphsU-pGbMPoMq5z6LlXY_GybiPcWCJD8iEpG_zOKrPVFsyztWWgw_UaLuvyOMR74L_zK-HQMfPgwON7-l8a89nYOWP5kddj6MEIY9s2oDAaagLj5oLJ-_GxbQPUJfJj-j2q6-0ciSPhv9ArlBoHq-Zleev1lJtD2SKMk8g5PlgARdJD_DR6G-h8vQPhfXKr7A-hS_VwKiPebfHD_Bw-C-doZ7v4D9Iz4WAQS__CopPnA2Hz-XlWW_kRInP8juFj5UFie_gZ0wPBZczz3HDxM6F3MjP28onb8hadi2LYABv-yaK76_sI2_GiIPPvYd3L7Vauq-1WMvgNT3NL_9aQo_pOaZgHPwFj10IGA_XNZgP_cbMT_Pv5u-M58Cv910Fb-acs69n_kkveYuLz60sUAAr_xAPOpZQoAATDo-ayKBOaadOD_Mn0e_CxNIv-m7Yj2S2A2-wTw1P_TQjL-ldpM-4QyCv8iG8r7_tWy-dasrP1Fagj_L9kc-ElqrvjyUpj1rnvO-11aLOYIaYru4oDaBYK0Dv3CPlr8AUgo6gNDhs2Za5T6ZqdK9NqZxP0otlz1hVYO_8rtJP0zPuT6kg_6_z8FWvlutrz335wo-L3Snvmog_L4Hq6A-k3LDPtE_K73jlx-_79D7vmYnagCbLEM_RIFMvPhwmD1P5qO-vvWIOobl0r3_Oem2ERIjPwUIjr-FXtA-6r2zPncPtT9n1LA9mt38PbnRzr3qyN898XvZPbL17726LCY-hWa5PwMBsD6xzZI8-0nHPjTrLD6GrLO-LbS9vX59w76EJWu-J93_vqHNwz6lieg_ncvAPdOmg77EhIo-r_yJvg6q277IU4c-i69Wv8JOAb7leqKAjolTP5YoooBJOeSAUOQ7gARger507oY-nW5LvrOdMzh7hkg_VBanP3w_2L4DqBY_kL8iP15nbLLRWxa9p-aCAH-vlr7oore3asQTv_AT1T3cbey-9GnCPHxkiT--x6AArvcnPk_ydb_TEkI_ziZfPzqYaD7Sx9C-ex34PWLYGb9BHks9XD5fPZNniYA8Iiu-2joHP5pHtr72j5k_L19WvWCIar5LE-CAgmedPS0z4r0NAJO9QKocP1ZXML7r_yK_yhypPkFTmby_8ja_wCAPATrr175F-Oy-iXoHP2tmBr5effI-anNEPxDzK71q9PW8hLgVPdL6IoE_JVK-3cRbP7YcFz9cOCA-rsEDP0HITb_3NaK_bMWPvlu70j6Lv-69TuBEvgkzZb_wDfwAwIJIP69TBj-l784q49OHP2AhhL6OFTK-w-gEACKaib-Idg89od8EPy1Le79CiG2_TgKpPo_eM7_yZHm8oRR4PmROOz5l_BUAaqM2v-Ps3z3oeu282xkkPkRDAL8KNyk9Qllqvu79zL8W4FE_eEdmPW-5HL384oE-ScZeP-py-D0Hcpy7H02UPYYIeb9Ngoi_5HkIPzL_NjzlPjU_Rsl5vyCx5j1jUjU9VB9IPoeWkb6RDq4-8wHiviKWEz9HrVa-ex6NP-wDiwF3g1w_OA9RACODab7fxS2_JfdIPyj0KT2q6bw-VII5vmahpj7SE8E-8h1lP79vhT8DZYS-trt9gIEpCD40CSm_orwYAZBNBrF8WwuACuC2Pz_Es77sGwC_HJi-vkiKfT4W_-k4EfOUvzjPCj0HIw-__t7APumcGj-gXNg-6uMRPwJ6Mb5uxyC-a-gdv2zdXz4X0gQ_iafnPtsVwr6MrxQ9_slQvZzb2712toG-H2rhvjTXB70Xgia_zIwIPkd4eb_re4e9KU4fP52cSoDt7oGzEVkSPgdj3Dxn08s-k0K_PlIEUDirrICAhjoNPxTMLz6yXTC7rzyPv6-H6b4kPQw7xE_eOQIdID-K16eABfWBPkC1jL253I09dQXQPsntsT4hHRo-xFKYPnX8or0OFuc6hH5Zv6PVBD0xTNi9JzYzP9coi70ylB090PUAvomQlzyhSjQ_qTTOv6o9Wz6djK0-WsftvUxPNbzWCgq_kZ6oPoqRmL-SuBw_FHlxP9KqSACg0uO_5MAYPy4nuj2LYh4_zC6Ovqh6Fr9d1gzA4rIfP7P5lz6AqCk-IaqPvw3nKQDTu-Q-dGoPP-S8Ar_SyTm_B1S9vAtONT47xeM-NIHLvr7nND-XHVe_R8ufP6AJDD5Z4Pq-5PCPvnMphj7BMBO_HCJnv9F1xT7P1u09AxV_P2D_HIEnuv2-vdPVvJkePoA9Xoe_NT_6vRWRhwD_j8U-tHRIAJ_urD6q5Aq_3VTuPgo3JL60tRGBgPIEgdjpTTqUWDaA-GuhAHPHEjjxcmwAzQSsAEkbGABHi7uwvp7EPRuQJD4AQZU-9B1VMQSQYb_0wm4_k-GLPDzpf763Qhw_YmSVvyIbyzz0fQs__uFYv2avnoBq2Z4-u7_avghoc74ROZa9mExugDjf8QB3Iha_2Bv9vPfwW4DtbVo_oTkvv2Gkhrq0D22-nvujPkphkj0WVes-82g4vorblrx1c_c_1YgNAH65Nb8lQDw93wNNv9ZaK7_CDS2_G61AP0WabL6O-k2_xrz7vsOCXzwZQ4s-J_1IP_xO0z_oYwS_786wvlnEjz4i06w_RXCePyZoBr2fIwQ_ODoYgWqlTz6pXgE_leP4PofYrr8Tc-mA4_f4vkOJOz_FDPi-YjEsAJjRc4BoXgAB3qo0AOCDfIAL5hcAG-F1gBuGhyARNn4AG7OaP98ZMD9M0OY_wOLMP9DEfr5iiGE9OdvtPjT1Oj_p_gw--9v9vaxPZr18k7S_lnadP_XDvD_efsO96sU3gBh64b66ZjS3212dP0YmJr6QbaG-iccxPzozKT8RM7Y-4D7_PSvsMT8xtx2-28dXgGaeib_XGMy7P0RQPttnnb213qQ_beQ4PyPZSj4P2w6ABibeO_2HdzzNFYkuUobsrYX9MrQVpCmmFQYtgFmK07khIjABfcSrOyBucj_H1x0_7so2P6oGcb4xz3i_FGdGgIL_7D29avS9CtB5P-_LFwBPQuc-uF-gP4IwXIB4GkKAmviHPngSzjz3Eco9ilNCvh5Z-wBnWh05rgVBP72Qlr55v6o3iZOvPvD9p74zSpq-rWQZPvFcmj_tPT24oTkkPUKLfDhN2hk_nUTGvnzp4T0tWVi_6S8RQO0eKj-t6w69tCDrvhrCJr91SxC_1OtDP1NLEr2bfIi_Ia4rvNeoMr5W-w07wyoiv6Pyq74-Vlc_jZq9P5wgAr8eeWs9uYaHN13jn76SvN67w4_bv1E-2j8ZKW2-_p2Hu2i5Cj6jXZ0-JuaXtS2QdL_Kv9k-gv6AOJlyBz--wUo_wGt5Pvq1ob8OvTo_Q5INv8cG2DokplE4NFD2Pp2im7zQqFo_Z1QDvt0lsj8i2U2-HyrovI-RQD1ggDK_YgKVPotBNT9kDWC8_kDwv2ZzTj6lhji_nThav4DKy72mRZM-t4oPvqdKmDsIKL06zeALPiX_nT-CMBOAiOkyP1QhV4DR1Y--EV6hvUufx73KryW_XhQiP4y4vT_BBy0_dntGPlimST9V6EgAyOh2v1dzq71aMEc_BkBLOLSNIr_yQJG-31qcP3Mc3j3BIcW-YST0PRjrQL7pySk_QVZwPKdJZD3hefw9tT2vP8JnBb4PDJ4_vuH7vijJ_L6q848-l1GxgNzYiT85GUK_VJvRvnP1Gj6CRWu_A5uvPpTY-D73NtE_lfphv3TrmwC3TJY8rnCdP6uoQz5hLcC-Fh4oPafbUL80Y_u9LRu2vnQDt74fsPM-Jsg_PtCS-71H6HC_qW8HPua2PD0jqCq_SvIHvSrORD-MQJu-zZEUPRsIo7yf6R2_51A2LjQS2r4h8S655J44gYwzBL_TAWc_fmYhP0JyIYFJaJq-VpIjgCoXP7_2Sd0wGUjNgIeoFDhOJOS-jD4TPcVGhj4u86m_veeKvpBRU766ZoA_0Nz6vU66uj5YiDi_H_DBAGde074kg30-5ulVPzAodj6ApXC8eJ6uPjrPkD5naWa_2f2avwsPGr_L5Dg_7xSyP1spmT2mP2a_inZdAFLRbD1XvZO-zooJADpUpb4U5Km_sTHLvy8b7Dzkmh--V3ipvY758T0OIq8-RYq9P7Xfe74MExM-zwMdPbOTMD6O4yA8-pPJOb97Tr54d8o_l3aLv-07pL7BGbW-l82xttveAj9ddkk_COX3vjzOlr6NcWm_jp-JABVCB7_ddO-_u6v_PcRZvL7nLJcAh29yvCtyKD49W3m_IMImAcYb0T4eDBC_vOSIvsSD4T5KQ64-rcbmPjzlv4CxWfM8rncpAVZ-R713zxAA71W-PoYIvz6vha--EWR2Pkgjij4oexa_DSD2PhlKJj9jP5e-MLByPzLQY74P_hwAVM1wPgByTL-d9PC-iwzPu2C1ZT9U-XA9yWmxtL83Vz9iijO-C5GuPvMlY78erBsBeLjou5sQbD_i1DS9e7uwPvz5Iz_vN2y-ppQGgPlp7Tel9F2__eF4OsvMZoDgOfWoAp8LAJrbubPQw3qAz38VgDBspoBHcGK2tjP7PbQqz7uKHoA_lRGePseINgGkaw2A0JAPvhcHlL_VZRU-bJ4CvIh1e7-3_0e_AG0EPqRBXbtTJtq29GiGvueE7T6ukTe_h4r4u9ckej6dGJW_chzcPrxPtb6DfwI_pyb0PW_FoL-yZ7W_QWYsvL3OZD_oWR4_AzaoPuw5B4D-Ay-yoNafvubqJ75MbkK_bXlhPg7hm70WsOS-71tCP2NfrrmgeW6-s4VOPf03jT-ZC04-oakPPwrhoj5Z1BC-f5tIvpLziT7xZqc-a907ACyjLrmscU6_MjA1gU6ugIBpKdGsv_8XNlRZlyGU2oKA3-NrAG_5sQAr4lkAPo2KP_hAEL8slOS-TE6aPl6mFj90BtU-269TP_scJj7FcYq98mItvhOPvzoIMLO5pUbtPVSZJj9Oml69xILys-I7Gj9pg4SAbrfVgC-2gT40XGw8tNhxvwE88L30gIg_aGvHPriBmT0u_s6-4kA9u_zNar_mJX6_HP2DPn_0kz3Rexq_f2xvP64rUD-_6cK-rMIzgM-GoD8q3zK-36r5vqFiMr3dbjU_niUAP6cBnzMFQVqA5g5VPrcZab8VlCg_MLtigHMH8r0BBca6Y5TBPD2QFj9SYqE-QDGHP2VIUb6NIS6_xNw_PNkiHb6bkYQAqeTXvh_AS7_q9mc_QY6_voketb3WlUs7k78uPfpXVb5_acI-Qa-zPkZcyD31m4g_ZPoZPXugKT9Qlc-8tATEvkDZR77qVjM_JP69ugauv77WvyaBNNlXvcc7vD6Vl9--HgflAVxjrr4wsRU-QNNVvjxJWD8iaOc-hqpfv3N7Pz-4UAa_m3DqPqRwHj5oEbG-dn6KvoYzpz4MaYg_PLAjvwd7jr9V40-_e-e2Pn3xW7_AI0IAOIfZv9W6275_u-E-rzFbvhXRAMCiiLi4sEPyPijEL4BFNjs_afKyPD-FtL4j5wiABvVCvnGwOL_0mZy-TRkyPZbh0z5S_j29ZHz2vRWlGj5tTZw-vocNAe02ToDewnQAIGFxAIvYAoDYvwosR6DVACF6qADxwPQAIJKqPtdFAj5ZSMY_BBaxvdaGyj7P_LE85DubP_KbpD741CSAkGVLvgmzID-80Jo-sl7yPqKUgD9yMWo_FKfEvuVokz-p2VO-uBZAv8mzWD5QUjUBqTCYvqjyEb9Kv_479uogN-bk_j3Gwe88-AoBP1n2UbykJM8-McRQvFA7HYBsmQs_NhmgPgcJHQACGJm_tqA2vyDnHb8UJP-A7FcNP2dlJb5R0Oa_k7_Rv0jLh7735bQ_DWmHvZ3iij__VOaArZjzPiz3E4DPFZ8-kJMJvuoCh77oOHuAD0FoP7pXGD_tdjw_8P92vWz2J77UJII0AZMgP7aKCL077JO2ccFHAFTkGwAcJUkAoQq9AHSWUYDIUmeASZvirhEcj4C9sgABvT9vP9hShz589UY9nuFGvsjqCb94Vga7I01kPuYwHz_2TGc9rJMxuudrjT8kszCBOlqZvGUa5TB3pTW_d5nAPmuYJTcYsga_w4VNP9ZCCT_mC30-vxobOVq3r79XyBa-UvPRvFb0Wz7D5n-_JL4VP4-KXz1lzIA-vhG2PsKuwj4re4G_DTrIvfDc8T6a-sU_GOeOvmaOFb-Lsly-T_PhvlEC0L-VtWO_UjbiPpM7Tj-IjxYBivj6PiYIwb4TyfM9WYR0PiXCKT-ZJY09FtVZvrkGtL-OrL2A8NHtvll3cj4JKGg9VxbyPgzu1b2Bs3i_iS_LP7noYj8cMKc_SjYevhUkrT1-Qbo3v6qvP7StnT7h4Ks-iqDIP7wwBb8FXyY-lQwEv4nyvT7RBr09PD8APoPyTj-AzIAAFE-qvz4NjDtyrAk_Qad2vgYZMD0Ux0c-b6uaP9HPBD7sMiiAV6nXPuKnjz3G2jUBkTMTPqVN4T68Sre7fVKZuJMnCD9Du5M_S8yAP9QihrwqIsy-o2N6uCkqOj9g5cQ9hhDePvjXgT-INHW8yVTtPpDOCMD27yM-U4ZCAL32-74RT-Y-eZK_vvvbxrxWr1E_kzBEvkQ0hL7-xyy_QlYHvqmfg77nzoU_Xm7CPC1hmr7YZnE_QFsTv1UT-T6a2U0_7v1mveP1Hz87bhU99TouPyRiGT89PZm70FA8AelxkADCxc48abeTv8xTPz4ba-0-dXAYvHL2lTxOEVq_CcdIPx_tyb6hqAO_40IpPyoznL4w8Xg_FRxBPx2vjT4VNBU_n7bMvTtSIT2UUou-35arvmtCITyiwymB5b_2PUUZvzpGkYg-BXl-PsCM2AADE4U-K_JKvmh-CoDElx0_iLLRvAjndIDOT8w-FaCeP3OTeT8i9kq-Ud9bPjsVFAGxrHI_LQ1eP54HIz7QXzK_Z9ruPMxvWb8zWtu-Sp4Iu95Srb59OpO_jTMoPwIqn7_9nzs-BWKPPsgJpj5m_bS-87mFPPbZaz5UcQcBVByuvph43z1_ByO_gYt1vv5zsb3z1Bo-gLCnvMKhgT_vc3w_yNqjv0mQCL4Q_Bw-BwAzP_YHsD_T_Vq-6_94PqqGgz4NOUK9x4g6PttuCT0JO1a_UuWUP7qKiz51giq-ZNmLPnD0XD-Wx-M-QeuCgKTDCr1AFm6AmyzqPo61Wj7RIxs-4RGfADKYKoHeTjEAUrVYgF2miIDOggQAxEblAMTORoAYvSOA_B1Zv-jFXT4MSgs-SEU8gChbTb9v2mu_TdVFPyyiKb6kwdk--J27Pq_tFD9YoUs_ubQGvkOdqAAd4I09CIBavO1xmb8h-h0_tcuCPzKqx765wAi_coDPPdsnAT5A8WQ-IxKRvsc0Fz8xhRK_GQCkPxhRgL3TqZO-JZLhPRNdiz_2SU-8q5HNPkKbbT_yM14_9aiNv85bbD_NNgm79XOqPpigYb1F4YE_8mM4AR1Iqb_UpMM-xdyru7baSz6ielk_Rs0UuEQDj7_X83M_0pDzPqdIr77PnoW-jhuoP1AO6r4hjVM_TtooPwTB0j5vTe4-r76FPeLRt74Mau4-OSx_vRxyNr7BatQ-Wf4hAW9NPj8t4Dm_zH7zvuBHgL3hegg-rr4sP9RsBz8wy9G-YXeOPM1tmL9bqy8-4rGkvh9K6Tvsi60-zNopvmIK4r0hWLG85KtTv_o8hb6xbwy_wab3vuAMmbZ14hI-iGhTPY6rXz4Ywb8-bztOPyj3CL64iFo-5AaPvhrQBADw7Bw-MfW9PinU8wDH4nI_w56Qv99OYr5d1Yw-0UXGgLQGPr9a9Hc-x1KOvjfzwD6nyoE_LihEv_Rx-b4-CqWAA84SgFozhYAyqXm_AW6GvcFa4j42Yqc9QrJkPowJ9T6gVByA9Q5zPuqFeAADYS6_pN1Lv2zgRTng2XY-8fRPuVew0DwWzyM_jOWzPw_l7z7JvJQ7S58ovbbJh79OOMe-9o8RPbfZdYBs4Ow7QsduPuoeKT-2EtA-l4pMPi_2Rz8RTEwAS2seP1mnHoBA9l6_kbqXPd-wD7_QODG-gHs8P_Qr1j5U4IG3LQMIO3H9OT6ewoY_fEDStDq_Uj6wkgS96Tn2PpDKoDsDFPe970IGsztPXj78kEq_XZ7WvAxIF75hZFU_4ILGPvyMsr7EgRy_d5Bjv4ww4D2wAWg-7r_vvb6NIr8A-zk9gs5Ns-jGFzVgSi8_jozgv3lsPgBS0YA_r16YP-a_SD6QHAO-3TKRvha6_j6xCwk_s9SmPpYAwz5i9gI_FuREgEfPQL9ivKU-UN1htXFuhj4BSAI-8sCAPwXvC75PM8K-fvoRP3Dr3IDEZOi-aJahPkoYZztyyZs_yuujPq3KHADYC_i-1fu6vj7LzL76qdo-msuwvpyepj7AhuC-B1WZPoNSKT5ySoc6atAjv8JHgz8POlQ-FNz3Prc7Pz_RB2k-TVDPvwbKBj8XYgW_WmRAvrbkub5221A-aGkMgZ-4bi_eTIA4cy0YgNl2CwGw52iAmuENgTmCCIG51iKATOakvgfvDYDmx5g-qUyrvc7g9L5Q1DGAAfOfPiZ8dT9bRxK-QJYcP0_6GD0Xdg4BOFM3v4qtiT7KdRoBAkUhvrn1ejy1ble_VOvDPGK6B7-KTiK_kPpHAIrsrD6r_cY-pnCtPrqKJ4HbHQfANZlogA1oZj9oUxo9O_rBvj_gh7_sFH-_H2C9v5iVNT9Gl9g8G9fbvupBC7-atb26bmNCvka6rACUUQs_KKMCPzU8Bz-mRGi-Yl2KPUOMgj8-H_O9NuG1v7WkGL8gO6m8oMN6vjhfPQALvja9h5fJvSD_Bz8agveAA_NXP1cYjj2kfRA92vm7Pm9zoL9eBDWAOybDvrMhTD_Io7A-VDOhvolCRb6KbiU_gMSkvV17k76R7YS0SaEHwGvhIz_n2Py-stbSv6-9sz7Ixa67RlqiOip_fT03dlU_NbYEv7aUd76PgtU-zn0ygVMpAD4Vb44_aMeSvtRscDyx5yY_Ny_gvoH4Kr_GApu_fmpYv_kdfD9XM3C9I9ygPlS3CAGmTbg9xI8PP_RCZj8masm86WDNvtMKDAH0gcW-6O2svkZfDz8atj-8RnI6vYcRuT1aTwC-AJqLPfeUGD8Z8ZK-30Y8gbYyrD2HsKc-rYnJPsG7Jz56h98-bbHAPj1GiT7_lAc_6B1-PZHpM75mGb4_9iYRP1INKb-Hejs_NBN_vY6aSD6UY5g_YUqKvFqHGb8H_4O_uF3nrhGEHwHvstY87cBRAK8gKgH4sBG0gdTJtcW3UDr1MwaBMRyivENX_byaBQ8Ba0UfP8S7nL8iHAGBvz-xtahFmT__oK-86pTjPoQRIT9VrIA-hBJiP2W7tr4s4JA_i_SzAJ3bP794HFc_8jonP_rI_j4w9mo-6O2ov1cBcz_Gnpc-i1jcPuLzIT7Bcaw9J8onv4TS1jzvIFA_xQrBPqNIQj76ZPI-inWuPgns-L5a5vk-tv9YtTHhnD3EvMU-3QoePaYoBb2ueUu_JzRbvx3kE77hWMM-LYOjPeWrUb0xsHo_mZ7uPgSr34AczUI-ClxFP3Dqej-S2BUAOoV6vgBYzT6vH3q8KQcFwFosaT5QMRCBa6arv788EIH4e428Z4ljPlHJoD_8hek-4x86P2v_HT8PDF2AfQ_-vs08074cgbyBa8TyPVU5mj953gk-lVguPr83CjyBxZ07fRnxPjv0ob-inUCAU6ofP361Oj9O5zi2GznigKjk2oBgBFg9GYzlvmpnf74PR_g-EyiQPQqSXD-Jfpo_lu8qALjlBT-bwYQ8Xd4_P9n5XAAfkUg-VQiqvUq5Gz48ZdW-jxe-v4bPM7-xzgw_JEwTv2SBEr_iFCc-KX6Qv_sWcr0ofmG-Fc6PPjXBZb9GRaC-lgniv5Oegj46s-y-5dNzvAzrV4CB7Fc_0gFZva90OT4Ppzw-Tx7hvLbVlT5zJWY5FPQav9VMh783qi4_OkACgQkAuD5vdWG9Id4dvaN_2j4PIK--7CLnvh7tMj_gM6W-v3mEPqyLEr1zYJQ_u8KVvwcdST7lVKa-SnKov2ei1YAgkJu_7AVUvxBRULsq2FO95qP8PJ7YDj8Phjc_nxQFv6ACR7qN-8U9MHxEvu5_zb9S4yuBrhPJvrg9uAAjcmW_PhMvvULamz6ZQCo-4YjAP4X11DfhEgo-L3OOPDsC0b5DWa8_h9wOvLvfg7zfhkO-zxJtvU6GtL4PPOi9KtfTP8ffOj5f0hk-4OceP7ahXL7yqFI_LM54PHdfA78WMsU-AFABvrRUcz9qZAe-KHW8PoiyJwBRXrW_-2sxPSerurZCikW8xdaKP14Bsj_NEAu_k3eqPRgHpT4CzCc-WfihPo5HVDm17Bc5tWVQv0NFqT5fPVa7GGwmv27jyL57hYs_yfkjvqW5qj1ITse-uG8Xv3F2ET_d18c-iE6_PrktPz8fN5A8i1ipPsggGAHgSX4-DiWTvfeGLT4IRv4A5dMKARsssr9dCyw-WnR4PUqSuS_Mln-_R1uMviza8r1g5aq9MVnCveGZkD62xvE_GXnfPm-wC76L7IS-x8YpP0-6kj7DDsQ9eMiAP2nEJz8FghO-fkQYP-nYeT8N926--luHPR8Jbb9DORY_Kg7WPibBVz8Qw4G9apB2vxOlrT5uK1i_T7mHvoxkiD0FeS8_-paAvr7xmT0jtRQ91AmDPj1lmj7p2wS_Qh3cvlNoLb5KWNM2XoqlP-AMhL326uo2a9nWPkj5Iz-ycVm9ooLyvga1vD7kXka_cUHVPxRHo734OhSANG5zOsAc877XNli7oOyjvqUQET8WDuk8I1xrPuDFzz60rZu-60eygMrmBz7ITEgAAjQWP0KcYr5SyG0_OHCAPaqzrgAlogC_gpKVP-Y2W71RhaM9ktudvgE6Hz9KRVi_fD6JPspXAIHLOqk-KTsOvshSBgGQUV0_5CTSPskaVjo0D10_JhVsvvUhMr5Qiko_iHKqvbmxMIF5kIi-JeXZPmA-HD_EJ8Y9B57UPqGVWT9seb0-Z4xuvjz1PrwHa8m-_vPhPqapmbzyTvq9e4nFPmC_mb_vnkK_8vGdvu0WJD6h8h-_1l5Dv0o20L6hTE0_nrfBPk-6_T5vCsk-6qwGP9RQsb1Qsos8x_U-v-s6RDwm1BI_ERaaP1c2AwDD4Fw_wh-nOI2x-D4kOIc-32eRgNpUkL_NgJG-70CMvwROEL0xzwo-mrCpPlpSPD5APZG_HKzmgBr1nT7awE6AgCVcm6SbHwCqzRqBwUQbAHvX4zfSwQEBRd6fgE4GIQDiBYMAPg8ePMIXk7744Q6-KBsMgVsHpD-KlXI5TzidPcT-BwHNNMa9ylzoPRPVWr8wV0E_IoA0AV_aR79RsT6_xrcdvmXcvr2E336AdVnDPNciQz-Bjhm_h_c5P8ASvT7aD_--BQjTO8zrJz5jyn489P9bPXe7mb8INqG4_KNjP0IBgL_SvFu6KiK3PkIOlIDvXY69zIWLPsQcvz7fILCA4D_qPk8IoT8iTlC-hx45vWc5oT-o1_E2ACz_PrtHFT6WuIc_W6-BAA07CD9H98G_xtxBveGGY70deRO8kc0XgcEnhwDycC4B1hO8KCKxAYFsA0OAsCzcAKL0MwGq9wiBwqI3PkG_er5QnVC-_cR5vm93_T4Fn8KA8_4Zv_MDqb-fpNA-ko6fP4gLIr7kpK0-rMLUPfx8ML4g3EK-Uxq5PsevGYDN2Yi-R1Vku832dT-8tZe_PDdxP4lhyD3BBRY_S0d3vhDjED4yUss-5IpVOyrqBT-cFXw_s8krv8thEb_mKWQ_zB0GAGVBbD68TCWB",
|
|
109
|
+
weights2: "UkZ7PkU_WT89J8I-yWs6KocFsz7U-rm-Okpfv7VFQ75JwDS_whZUP8HTxz9WoGU_bRLBvsNvG7_z6BI_UlcPP78wpr9grmo-SGldvXq-rD6k21Y_IWPrPlJlO75Oj3A-YQdNADfr7j41yIc-laBPv3Kbkj6GnW2_nUqHv1vZHz54w4M_g_2BP7RhvD0WHTG_jZUZP0cG7r6fpRg-xSPavih4rj4vPHC_tiRNP_ihBj-aioo-6FBdP2LQcD-2Gg2_QHGTPifpgL8KmRU6zNZ2P7G2m7-5_Ze-_XsfP8gZWYB_QUE-s5RtAAj9g7zgnty-gsS4vti1Lz__GqW_qdhPP0HVWz4PoM6-XudFP4FAH75_-Sc-TsORPwAGsr-efH0-fckcP9rZ676a6Oi9DQc4Pw3CDj_IelK_m0I1P6E8XwDCXa4_buoCPxGX5wBzHIC-ZFUJv7S1sD5d2xq_Bc5KvuJKBj99PGA_kHycPyhBET-YH6Q_5Dkiv_bgvz8oc8Y-v-xKAIo2kb8DFTa-04ROP7NwyD4xdy-_k-SMPwBzGz1PciE_mr06v3M5gL9qR2U_qqowv2aNxTs-uQ4_1xFmv5yNxL7eTDo_vKRGP3iRvD6eIWK_OFUaPzCHJLvcUsS-2TA6v5MtCD-BLGa__sMtP51VpL5amwo_V52IPtQGvL6OHQ6-y8VNP48WOD5bd8W-YuUXvq70ED9Tphq_HkFRvzwmNgEmK4c9-7hZP39nc79clV4_rCxRv7p6gr-ydHu-krLUvREogr9NLsa9XIXfvZBBFD-BFEI_kGRAvzj7MzsRTD0-rVM5v8dCjz6r1kQ-YX3NPmkJTj_mssA-nO3APLd4x745UJ8-uwkiv8XBjj_WDlU_Pf8qP9t5VT9NjcI-RgxSv_D0qb_COea_nxeoPc9eET5RPiY_NNhjvp515b9dtUU8pVUXP4JhDr41ZkQ_qy26PAB0AL7OqpC99F2BP4iVqr687CQ_gtcFP_uchz6ksv4-zTpXv01VjD-u0AS7_kl-PxR8Qz9eTto9AnmivaGKtb6KaJ4_i_YZP-Ysqz5Sees-3XqcvzwRCz-RCRO_PGuXP1pC-D6PV90-ja9hvk3tWz3zJVo_ANO-urrorrmvPLK6Ybmuu45qhD3c8T26LwUKgAlVhwCnBa-6X-bOtmf1sb1_V8o-6VuYP3sINj1bHYQ-j5abgAAlwr5g9Zy96xiRPu_dHr9--se_Ao9NP3SJFD-WeSQ-7HKjv-qN6b6Z2k8_Z5fYvra6rD5jLZq-iCggPsMI0z5HTQi_0EJsPmXItL77HD--byXZvvB7WT-RPZO-HLtPPntZIoBUMuIAcwokAWWb6YDKJjwBVsoaAMmwBYDz23sABvfsAOghHYAW0qy8Maquv9WzJz-Md-U-ofRHP8Lek75PsOY9kFqDvioJur9Uiwq_CTMYP1OQd7_t-Qo_RjqnPimyjb82CRC_nkSIP5flRj6KCcw-Zv2JPhNcW74Lijq_3WSKP9dzXD_WdVi_b3BvP4Kdpb1tZTm_Lg7OPggMmz1EmiA-qKmevjNK-L4ekqM-LggBP0Y8Gb-7SyU_43_qPYqfYD8Rwne_EZeOvQxooD8TLUi-W8olPjgD7z6ZTcY-StGVvkvDYT-G3EQ_U6aiv1HmUj--Kvo-c4IcP746FD8C7NE-soTOve0nmb6wQvq-YUdhvnVtkr_aeU0_j0VnP5tkAD8exgY_MTmWPrSyY7-NaPM-8Zcxv3K1XT9Gigk-mpyeP5K0GD-Bb1M9UEg1Pwbew76bm0e-aqh0P8w6FT_6CXw_jchrP7OapD25aZs91V0Cvy-DCz8ZbvW-1l4tP-nqiz8uHKU-b0d3PZ8QqT7Cs6U-FvN0v5gDVb-KUp2_rhJNv5USaT-I14u-i-QNvT9ooj-ciyq_6SB_gAn6Gz_HUS--rYsUPnrimL-8vek8uuPzPmNfYz9_Kei9uOxHPJaXgA681ySA1wscgci35oDy-OGHZ_YVgZjpgaw5VCqADY4FAX-xxYBEuvC-_gB1P2DhYj9zm20_nGfAv3lVjj9zpAq_v25MP0QLvr4Ws0e_rzEYvxd6uj4qFXs_TjCLP0m-jj2GM6w-qGx6PtcRdL-32wy_1Zqev2JAjT-iXeQ-MmF5P-2dlL2Jnsw9qzPpvn383D7O8oi_KAdgP9nftz3nTSo_lDXqPoNeXD87nhw_p8ZYPwXrhD8fOzK9tRgLv2-vyL6JX3i804gOP_ZAFr5ZWEQ--fsmPwV58jx6IIu-bUr7P7ZIHD-ffvs-dLzFvt4BGj-alO4-qQdFvybYjD-k7tU-kWhBP49AHL9F33E_nkPlPcfM1r7RCPg-69zgveiJIb_QueW_XcBcP18z4b4gsrw9p2TXPlylRz_xvLw9nUfuvqaHgr7iVI8-ctjmPupWG76fVjq--e3Kv4Xh8L5jna4_jV2sPmFm5D6KkL6-50OJPmShMj-w_Z68JQI2P2TTAz6P8q-_ACpJPxjwMj7wjEE_txuIPgpxGj8QVpk98s7bPt2FTb-msX8_auU1v5qyuwAiAuQ9en9Fv7ibFL0A5zu-ZZILvtbNvT8uelI_bissPL6PL79Hq2A_70Vbvlc9h79OvFg_L1rlPtvGnT-X0MQ-p5NBvzOyoj5nwXc_WfCOvuRGeb_cPwY_6D8Uv3UjaT6nu5c-1awFPubVlD_PjZI_z8X7PVNPu74RwNy-OBMovx7ERj8njUO_oqmCPwtNar675fE9hCO7v4IdCr8egaO-7UE2P2_CXIAmKwCA_tuqgGYxUKewZPAx76i6r9bvNx181D-BLB1pgFn5F4Am2-w-r3WWO4ZVjb_8VTk_mkMyP5hn8z5UVvs-D8KCvSCaTz4hKG6-7aebgIKjZYA5oi8BHbcWgO_7aABv3lIAYbWMgGCxNgAFP12As1T1ABQYIyVS-A--1QeOv7fXSL4Kij0_lz-Gv1_7XTs_554-J3ANP4VZzD8V5gG9f-eTPzkPSL74mRK_m8Q8PU_Zkz1j24Y9UxqIvcVlKD5AVHc_ADp-NV5UmS36fkKlA4zFoSpNGwCj08exf2ilstrTczuxa-Ktc8Pxsb5BkL_xEKE-yukgrZsk9T4Lad0-oZUfP-jiiL6Mpcc-lqCXP9dljT4bxNY_HYkUv53dGr8mfNI_-z0JP-FglL-tHpg--zRvvsfZmT8BmEw_sZkIvYOFFD-g_hI_9ughP2ipmj_H1D0_uDs3Pz3mhD-f8XW9_cgGP37YNK-6tXC_LFbCO7RrJzIThRs_qryaOl9x5by45YI-r9lFv6_wi77BkIg-gCCJPo9-fj7HiJm_GW15vwSAk7-Hr1O-pD_wvdwUDTg2x9g_-x4HPqfUAj8tXJw_eUfWvg3fMT8wR3I-oHlpPiAHbr-ajco-nW8nP6Px7b4nhoU_X6jYO9TbTr-g1V2-z5CXv6GcpL-YYSO_L2J5vRlrP7-zkpE-L7QDPr6A5j_OOp6__9fjPj2VVr_FR4m_nxlYv4WOaj_bdUE-QktnPnvRr4DZnW-9A1cDP07khDwP3gq8ZQnSvsUlm78csAq_Uk1JvifMVb_voi-_ySiMvZpwLT1Sghe_opfIvy4pPD-Vzac-g28vP61-Bj0yqw8AjHy6AKY0lQC27iYBvGEUARdBKIAC8CYBAqRhANstAABD4jIASc8NPn56jz87JgY_NVABK4JrR78w0yg_f0OWPnfZPj0lDJw-ln3rPgg4pD3X3rg-GFgBv5ga3z3mCIW-b-PQvZCvzr7RSYK_lIMEP1qmcj7d7li_s6jDPv_XEz1gPBk_v2ooPpKKMj9Czau-DQqBP6dxIDxYbZU-mTGOv0u0Oz9zTpU-Edd2vlGYgj2msyS_neoRv_XcKb8bxW--n7iys_j4b7-Chi4_VOn3vZKRZL54DRO_H1eOPtGLXD4yEA8_k-ZUvo2MDT7YfgU_dXwLPvP2Ez_Jny2_kurKPnNooz_69bu-8v22P3KZ3z4_7EI_O13ZvmnDyT0Z8_A-jFecv3lKFr62LXi_7CxtPz9pJT8xqxs_UINSP9JDgjr-UOK-pCmJPwQBjb--i4E_2FQEP1BDID9aMIa_yIYRvt2LlT7WHy--3wy4vaV8WT0K3DE_gNGWP5nGRD79Fdm-va17P4gUsD7tvi8_K_JsvxvbeT9Qcwi-XLQaP3VqK74f26o9bhAUvzRiq783BSE_r9ogP5d5A7_d8Ts_qbuJP7UCuz4Mh28_U_2Uv7yaXz5prF8_SZ6mPqhdIT91waQ_HlKHPwXsAD9R84GAnqeKP1ReDz8yD1M_ngzQP5tFYr8xMna9ZyvRv6GEBD5zxka_2MJyP8YLsT679QeBCtrXvnl01j50n9U-lsIqP7VNEb_rMsw-HtEHHuaIHr1DuL8-qkcIvxvaLz6ex_S9ULG-vPwQj72EVpi_SNp5PyhOfb97QUA_4euSvos-R79I40a__TZav0CcYj4IVME_7HOIIdibHgE1dGWAXn-7J8pRLgHPXYwAGGtAKKzbgowV8v0K3vAwASiD2j8io3g-OD8Pv9Av9D7m2xU_6rlRvxjCLr90xDe-gO98PfrZzz0RJxC-OvGIvfdxSL-rx0a_hQxiP1gQfj_I6Xw9XHTZP1K0nL4bhRS_ED0XP4KuSz9bkLQ-WBoDvz5ZA75W0Bo9sSdQv_I5m7ylwRs_KcEwv30M8b5Qxkg-K-4VPyutAz9tFeC-_78-Pmy95j7X1Zk_uQAaP1MrK7-xLj2_dVg7Pwq4WL-STEQ-Bnm6PYaLiL_VE4q_x0XEPg1FtL4V2Sg_CQDcvLKkEb937b894smLv_x3EL9NRYU_tFRmPwxMYL8skGc_IbYPAeNs5ACwXw-AmZwlAZlJJYFFeegAsLPZgH5XFQFi5ReAjez4AKkEr4C8-6S_Vb17v4ZL0T8rzhM-IrN6vmocXL9WoIw-uqtYPxuzAj9szZa-_vUeP94Zrj5NSi6_JsuWPgeVLT-YoJU9txCSv0V2Z79i3uA9ktR2P9_4xb2aazg_lyM6PlUPDT__vag_yCcZv5zXLD67dpG_Kcb3vrWqor7mjEYo7t3tPnYo3j48Dno_JgmoPYctc7-WhKg_9JvwPbc3cb9SHoY-pCROPyjXZz5iSNA9lLfDPnFsRD9zYkm-gvR6PmGKbD3WzKG-sOn1PgeTEj_60A4_erGhPwQqKb95s4A8gaclP_-DgL_KdIs9gwizPuVjMT_iJM-8Py1UvxwXSD9xUXy_rsO1v1XuNT5vLnY_bDsRPpyBlT5UrJy89hQlPr_09b9hj1g88jDjvoqawz9Kt0c_xg22vqGA1L1r0K-_Pi9Pvu8evT4rEi6-6jqUvgGuIz93TGQ_DiAJvhwSgr80gQM-raUIv6AqiC5E-6Y-FuVfP3I8Fr_oPYYA8bcovwTg9j7UcnO_FZaKP5oiGbwB_ts-uEAqvkyVUT8HjnO_eoCvP2jtcL7xeLE9rpTEP7fJ_j5z7dE-5sU5vMiLBr9p9_u9MV2Avd2vAr_45rG-lVIBv-xdQYBNf9Q-XScsPwtuQz9DvcW9Xp41PzyFF70jkzG_EsXfPgQFK79CI-O-LqnjPnRQSr6GllC_-0iavyKJ3j63Q7E-37Sovj0n0L7UUoc9s7LgP6j8ZT-tmC6-Kd_KPlLxmb5GVZs9PZClPm2LXb70zn-_ZznEABKAnT4JyAu---yAv16FaD9h0h4_5oSfIp60iD7ZE8S-4JyWvzc54z8mOQs_hKSpPJI38r0u2py8Yfh5PZP0hD5134A_XqFpPs369D1Yjpu_IjAIP3CnwL-_xV8_bH0Bv0DART-wRLY-90XkPoT4Xr8puqW_GCNdv_rc6z4hvVG_Urx3ADm3s72mBzW-nHa0Pox2Lz_h5o89bs5Rvr3tT794a8y_qfCXv5Hsij9MRbu_QRvqvgeRwr9zT-S-vP5hPRSccb_V-Gi_Ccz9Ps9rqr9hpv0-OAeVv_1ihYDEMcmALmKRAKaiGwBSwwEBcMZDADMmKwEW1z6AtcFjgMIyUYBAm50_87uIvjPeJD-LKZM_oWaVvq2RT7_RpP098ZjauxOycT7-Mj-_L9A5P9QdZj9NYIM_c_wqP3YuAz8XFLo-nHr7vmDqVb8JQnw-e0H7PhAhBj5qJuk9x3DxPt_zMz9Ev1Y_UYIuv_0SgL8v-04-hoFmADaPfD8_Rz0_F6SfPPbdOzzEEcYcBtsGP7PmhT7xI3g-QQCTP6-dRT9Yymc-M07jgJPA-YBFkniAFwECAKhDpwD4aXkAnZH0gBxduYC2mxSA5ADhAKyImz0ldjw-slKXP20goz4rijk_psYHPw5YEz-QXpy_obhAvoqwg75ehNK_DolVP9AWv79xqxoOL9Gov6FRhb3NKmW-45AQP8v4nD6CRR2_xtAlP2l2VL1n_li__apGv1XOr74X-Gg_m46svMlS5ICe_e8A3kAFvxo5OD3ubJQ_3Ti3vrRbmT7iBUI_0x0vPxdlND1yiEu_39Jvvpid4D38kOMA3hVMgF4bVIAdfRcBrFkKAEmYr4CIzQgAKLALAbbPWQAAqQ2BZCbovidyRr_k38E-ZrybPmwL1j6fJowhEUVzP_r1r76dEiO_ay3BPrsIiz9jD-0-NUOCPvCB0T_ggBm_UoEqP9TZQj44kwo8W_OuPsYYeT5vk42-ALerv9tbrD492o-_JQUDPh-SxzyzRFe_ohuXvZlyhj9YXwU9HfkdP7Pnr7679u2-8bxCP8XzVD94Oxo_CJpZP8GgGD_TpNc-BQmjvsdNFT_ZNgk_UcSXP0mFoL4oWkY_qqTZvsgQ5Lox3-y_47x1PkV3G78=",
|
|
110
|
+
weights3: "w8mivx24Qb_1lfY-x7snPhfhJD0wJVm-n5WWv-cBjL9Bsb6-upd-P1ST9z7Q1Xg_NCngvrtkV78AbEO_oEUOP0YW4b6jn3E-o4vvvdrMRD4y7-Q-IF8UvZKplb4AEas9CwLAPjiOAT_JlK2_KumLP6HqhL3jo_i-dNUAACRjWYDSKzgB_hMcAabRtYDQF2iAOKbdgPki04DQqmIALIGGgJcIkj76_X6_g1iQP_Lgrz0kll-_etlhgBkgpT_3XRO_duGAPwlOiT90QGc_yNYzPqEnWL86wBY_ZVUvAUZJor_20mm-tL-DP1vw0754O4q9PlGAAOoW2QDILA4BCeMugUTjJoCSxLUBfEnCgJT1LYB4vX0AdJjsgEDmvgF0RicALOgrgV9J2AA8FwkBb3UEAM158IASeh0BraSqgL67NIDOLGcACoIyAEqcIAH0b0UAiQwcgIdBfYAqXA4BWlvngA2yRQCS95yAQ3UDPlAM1z5mfEw_GR2kvuksez8ywIk_J_5KP--FgL_8_A27eYZ0v26tzL6hKZc_B08PQJwmAL_WB0s_iC2jPlIhUj5VZN8_wAQNPTgd4j6AoBqBiF1EgJqqJ4C2yhsB_uA1AHfbn4DlkaYAKO2OACisWYAk5MuAI_OZPoviir9zO5a_mPTRv3R83j4xnbu-NnJ4P1Qviz9z4N08GeC2Pu5w-wDonBMA0E4sAfGeXAAIPoeACGMygYyETIA-nvCAoddmgMSiVAAkh8q-UhQ6PzWiEr-I5Rg_ggf-Puimhb-zpLW-8cmKPyq1-j4ZoX4-Pok2gS8uK747L4M_qkYyPooo-j6qVACAO_skvtqJkr35KI0-a7C3vUK2Nz9iKPk8BMC2PyF2K7_I-hG_IxJXP7Lkz7583Ra-L8w9PPUk8D4Qex2Ahg4PgCDChoCmvguBBsVNgDzEEoGS1xGAsNQDAV_8pgDA7qUAlp-_PqZerj6O4b2_yFtjPmr3tD_00hk9LHzoPqL8CL9e7hc_ufKqvqDR8j4WUcC85YhnPycvkT_FO3yA5dTbPZd7Sb8es2k_03OpP75-sL8i-FQ--CoCv2RVCT9xkj6_KeVqP04-TT3Xwbe_RKXZPh3umr6RpH6_81yVPnfA0r9q4-k-4UwTP3X9A0Bj2gw_jD2Iv-Vcv77UzzU_ectbP1uiBwCUBcSAbYx5ANvIKwBgpOCAhnMfgIynBAH1DR4B6kpuAK76BIBmgmg_EPZnPzKZpr8vY74_10XTPgc4gb_jHzg_SeJuv-xaaD6I1Om9505lgFyuFYHv-ZmAx51zgEam5gBwqR2BUGpHAKtxMgCOom4Ah4-XgAg5yL_mCG27__W7vhdCfz-Wzec-izphPAMhUr4Uf42_TrdGOMv2tL_lzPM-fqaBP_nhh7-Ewv4-Xj5iPLIC-z7Eyts6SEFEPxJDLL4Uris9-F_CAC4qU4DxSF0AFBsOgDZ0RAAy2BqBRLMiASyUNoAY-sWAqc0hAHCzj71IUYM_xJKmgOs4vT6dUxM_0UfRvE50wj6ZraQ_PNd4P5L-WD-GTgy_RA2nvzSMELsGWD6_p4FpP20OVD8WHAxAPp4BP4e9YT9IJZM_Q7KEgOKhMYBc3wKAtTmtACAFJoHHS6cA6MHngMLMdoDMRxEAuqMGAd_yLwDI0CYBNooLAXLDJQCAth0BGtkIgZiXjoCedbcAKehbgOyb9gDT1eU-QTCNOdAUQb_lc4k_iSeZPJUAlj-gcby8fjRQv5H9qb9Fibq_MCoZv_KVxb--6pc_eN99v3iL1b1BbYW_GSmTPsoCJj9VVWw_Y_eKv4f0BwGyxQKBq0m_gDzgGwE8ORqAqB0sgK5EMoGkXxIBQ2AAgOYnaoCUayCAOQu-AERVP4ADYikAebfhANYm1gAH_RkBcRoHAfW0FYHCwD4ACs9kvex5kT-B5-Y-mUcOvYzfaZlQrp4_5mvmPiz1Xz-fR_S-9Tq8vpMUO799Vrm_ExBRPQtbH7-tBf-9ZiO9PpyNnT7fy1c_oWmKP45yCD9aPjU_0cjAvr11ST8PP_u-G7DJv3YHiT2hgGkAUe0evpGQoT14Bzi-sSVev65O4j5-OhG-ukaVvinhjb58XK-_TKw0PhVJY79z_py_mip9P8zqGb9tfvQ-fn8kvtFbFj_-drQ-Mms0v1noLD5zWlI_0kjVvQKPrD4LB3c_w6yQP_9ok7-zCgw-c5q8v7-g2r7Og4-_HjBIPnAws71a6_O_8i4TgJTzd4DAnb6AlKK8ALF5XYCvlCeAYfKkgLoENgAdhSkA9vMiAVStuwANNc0AYNUGAToxFgANUbqALXOfgHqgvoCfSsIAU3QTgILH6YBlx4I_il1_v4VsB8Bo9Wa9I0tfP4TNXD8_5qM_4rvivoqglL94AJc_VEAHgQgMHwBN9HIAY23egNieLYDdmzaBWBc8gXmZNABujg2BtI0mATtyfYBxEBYAfyhlgOssqoCbFKyA-_upAEJC8YBe91cAzghogByy5ICqKgmBuy8UAa0UVAACIRcBTRW-gKhgJQCjEK2A9rnHgBjReQA2NO-AF8jsAEB0P4HkNSyB0UrQgF8_KADI7KgA6gZPAEUL2QAG1RuB14UcgRL5pwfk36k_nlk6PxK2uz_bzA2-_4HovQ7Ehr9k30I-8kvevkQuQDzrKKU_KxodO1Ge2r4PYhU_abKov2--Fz-feI4_m3HEPZxBOgFpXa4-GnhGgO9SGIGwiLKAPtMuAfDBBYEanMSAYl1cAFw7BgAOTegAiADagKmnb7961R-_8SrqPyugCL94qY4_Jd1OvuLeSr89J4e_ubrEPbftnr9Smlw-_ZOOP9Ueg74npbs_sAU1voQpLz9CI2s_2mFTv7KxZb92OpGAQhyJvgTBIz7aTCQ-EELiKPT9OL1eMrC-r6IsP0uPgL2I5Ym-F9z_vAR8JoCgAlyAww9lADh2FAEATneAkyW5AGobMgDRHmuAkxwbAFBIbACwZyu_lFFdP57Qob-6tj48bUBXP83MLL-fmw4_EIXBgI8trz87yZA_SE7ZPBiIST69LO4-CeMuv4c_fD-9lmA_ERanv0J5cT_yisG_LRfHvzF_aT_P51M_98QmPFQBYD8w0IY_tHMWPnQ_YT9Hc0e8f0Rkv4YfFb_Xe0C9vKmOP12QI71kdgo_egCBP5Bxs782y8k_Lp1DP6uFn79ajh0_4l3KPHM88j7ceaQ-fs5bP_g67b_r6Fu_gu0xv9PNsD6NE00-Lo5tgAHK6gAXPh2B49U-gPvZ24BKQtEAqho4gGhVL4FAK58AL0MTAbuzPoD9GGe_QIY-Pqtbaj9YGcs_kyTKPVNyYD_G61U-Vyrxv4Kj-j7DHgU-AhDvPncKwD781YE_OKs_v1yujz-6HaO_wfSFv5sI_j3P_xA9IJdIPw==",
|
|
111
|
+
weights4: "gu1Wv-fgtb-3SkE_xEOnv-A4ij_-05u_cvM3P1sgzj9wh5a-rS20v_zLiL63nA29A4SBP8u42j8OYi-_UPH0vzHVor6TlNg_vLqUPwAE6T6Zvr6_XViNv5uOr79ybXQ_ckpHvwCXvL-zNZ6_PKQZP39AeL-zmEa-nToNvZkjgD6BrmE-mWUyPz-AxT_9hYG_cmGfPvaRvD_FXd4_qbnvv8fSK7-WoLC-gd2sP82M1j83SNe_-2AwP39FXb-siUy_iVYBgSn2OT8QGN6-_4KlvwiPNL_BzZ6_8wbEP6hC7L9Ccyo_816WP_gTOT-N5D2_NHSeP1tKjL7EfIy_iz8NPtAhXT9x5p2_5pPlvn2e1r-NJKC_L4cCPw==",
|
|
112
|
+
biases1: "HaMhPSUacD4uCSc-waqzPlqCDT8oeeS9s8JDvMixgD9G0HU99_TOPmoqOT84tao9RdMQP5MqVTsb8UY-2EtmPnX_kT5d104_rO4BP0MByL7C_rs9ou2hPg6RqD61UzA_V7EKvpCxoz1787A-PqvcPY_jBD8cQK4-njzbPcUuzz3Y-as-Y6Y1O7-htj4EdBM-OqgtPisOBj9ZUis_WFRmPq23jj5ZKG4-z0FTPnM8Hb2pfqw9dTMTPjuQOj6zPoc_CfUDP4of6D72AXo-AXZlPjhNHz85-mI-YZ4MP0Ydbj8Egra-dB8mvvPa_D3H5zk_gpZaO_ckIT_HUPk-cHj9uzlXR7sYwTe-ds8QPyiXLT6p3R0_P-DxPmGGc75olzs8Mg9cvTF7lD7v01k8-GPWPtNmG7v3Ars-1C4hPxUtrz753i4_zFtWPRq2Oj77BYg-Chj7PrV6wjsYsRA_QANTPrLnsj4Nk0w7ebDDPq5J8D5bTds-5j5vPmJVOz8693c9v3rNPjZAJT__FtQ-N45XP5DoDT6aKw8901n7Pnr-o714t_e7bq-GP1qwzj5BkRM-WugkPr2vhj6PCPu9AMu7POzDgj4gWtk-07c_Pmb6Rz5aOpY8DTi5PntEtT4pMAI8PPuwPgrqED1Y3g4_iw3JPpeWrj7X3m6-bvjhPpD3k74T3wc_gBtoP4CGHD7JUoI-eAODO4Ko_7yYG6c-vQibPjt0Hz3nPwo_6lYPPRcYhL7UGPA-FZArPBI93D15MXg-iOYxPtoUeD2vp0M_hpGPPcM69j0dFfQ-ZXrtPUYKIL2Kml86dmvsOzwZ8z7fkWA-HASOPujnjj5_Wim8w0LevOWA_j22SNY-y1JrP5sbSj9-4wc_gCeqPqN3yz5EvUA-jnw_Pmaf0j5XGLO-XaJIvtiqqD4dbuQ-k71jvr1AuD7D_gm83xsXPqDoKj_Jr_I-qGiHPQKXwD49e7c9wpJiPiIk3D6-lY4-Oj0Evt7yEj-kEUA-wH0lPxv4bj4GXRU_V5nRPdTrkrmUuZ4-sm7JPagP_b2BV_I-f63MPnp8sL6rCPA-8lKjvC4ISr5j8L66i7W9PtxOSj0Ztfs-GHCdPkHXCj4bmgw_KMIyP8U1lz4wJLU-zwjSPovdX71is7M-f9L1vVAWrzywRM-7zugNPgj3GD-LPUQ-GzR3Ppz5Kz-ojwa9Ttm5ukuVqzzaCuG-Bc0lP1NCsD5PDr8-PQbsu0x4RD5eP3u8d41VPshsFT8WXe8-v4-sPuQyPTxAt8Y-hZ9ZP3JegLnbLLw-lBYFP6-IjL3Ff5Q9OdC2PfUMPD2dfSe8lPazPvr40D7KB8e9eNKKPh2ytL2LJh29m5QRvA==",
|
|
113
|
+
biases2: "_Q9ZPZ8GQr68UR8_IbJ2Pgn0QD3ybP--wAe3Pr8LPDyG5vE-JygwPw57CD6dyKc-PvBtO3AsXz5wQkM-8ta2PVgSHj0EG8M9oeQHvYAlIj6P-K4-rgdMvv3T1r78Nwg_WJPNvmNOPrs7Z1M-YfB_vmU6hD31XyO-gwFPvuIWVT7RnG4-LEsBu6rKJL1BSMs9kpOqPvgulb3bshQ_GH-EPly16j1bVQ-9dRfdPb4vpj1SrMC-VjyfPi5kDT_e3bE-YF5Pvnm-DD4nKps-r736PiXlib3QgRq9CR5NvrL8Y72raiG-F2VEvtp2jj0rrZ0-eedGPif4LT1RsNM-yPdjPuEGyj6QCbU9cdj3PvQ_sz4KySa8dQtJPxBaHz_t12O-aAIuvrLxT73b_Is-ec-IPggFAj6QyTM-V3DdPh-MzT3kryY_cRhcvs7eCr5QbPE-R0ElvfyJYr3bJmI-Mug7P5pC1D2vgVw-OWerPpKaaDxWOMU-mbuzPsbRDj4k0oG-KY4bPkFV3L3lR1W95YmoPr6wm74Sw849kR5XPny7ZD3-VIc9YRnrvkyBKT687LK7zJ1cPn5RPT58iKM-j7JUP35YBbtj2xM-5iTiPpbGlD7Fg98-sfPwOVsRtj7kJw8_8ROJPvw9gr1riY-9352XvikwIT6I4Ys-PaVDP-hO-z4=",
|
|
114
|
+
biases3: "wYidPj2HAT5ogRE_KJy5vPa4CT-Bw5o9fDn-Oqwr6bs28Pe7EmigvVmRFT9nnR-8PpSnPjyxt7oQA3Q9QS4dPbM4HD_csA67n_nVPdZlV734fBc-0ZiGPaXTm7xPqHM-WuOeOvb70T5tSAo9RrB3O_T07z6yJgU-NlsJvfWmYTxowio-sYzsPuR6aDuZaA46p4vsvpKSMz-GgnO9G2TCPpUkeL4rqak-TXy1O3wymbz6qIQ-Ik91Ow-Qyru3IQs7masouyAwmz4H_DQ-F-jruzb_6z6gV-E-IElNPfpB5Tu0ASk-0nQZPmGwbT1yjG4-sLBAPhSGRDzcpq4-dqjMPg==",
|
|
115
|
+
biases4: "W7ejPKPttb42hDE9X2Z1PoV_Bb_msGG96ga8vgCSVz8b6KO-1rKUPg=="
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// src/components/neural-flow/NeuralFlow.tsx
|
|
119
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
120
|
+
var LAYER_SIZES = [784, 256, 128, 64, 10];
|
|
121
|
+
var LAYER_GRID = [
|
|
122
|
+
[28, 28],
|
|
123
|
+
[16, 16],
|
|
124
|
+
[16, 8],
|
|
125
|
+
[8, 8],
|
|
126
|
+
[10, 1]
|
|
127
|
+
];
|
|
128
|
+
var LAYER_X = 1.35;
|
|
129
|
+
var CELL = 0.05;
|
|
130
|
+
var TOKEN_POOL = 1800;
|
|
131
|
+
var SAMPLE_INTERVAL = 6.5;
|
|
132
|
+
var SAMPLE_WINDOW = 2.6;
|
|
133
|
+
var SAMPLE_RATE = 420;
|
|
134
|
+
var TRICKLE_RATE = 40;
|
|
135
|
+
var CLASSES = 10;
|
|
136
|
+
var DIGITS = [
|
|
137
|
+
[".###.", "#...#", "#..##", "#.#.#", "##..#", "#...#", ".###."],
|
|
138
|
+
["..#..", ".##..", "..#..", "..#..", "..#..", "..#..", "#####"],
|
|
139
|
+
[".###.", "#...#", "....#", "...#.", "..#..", ".#...", "#####"],
|
|
140
|
+
["#####", "...#.", "..#..", "...#.", "....#", "#...#", ".###."],
|
|
141
|
+
["...#.", "..##.", ".#.#.", "#..#.", "#####", "...#.", "...#."],
|
|
142
|
+
["#####", "#....", "####.", "....#", "....#", "#...#", ".###."],
|
|
143
|
+
["..##.", ".#...", "#....", "####.", "#...#", "#...#", ".###."],
|
|
144
|
+
["#####", "....#", "...#.", "..#..", ".#...", ".#...", ".#..."],
|
|
145
|
+
[".###.", "#...#", "#...#", ".###.", "#...#", "#...#", ".###."],
|
|
146
|
+
[".###.", "#...#", "#...#", ".####", "....#", "...#.", ".##.."]
|
|
147
|
+
];
|
|
148
|
+
var PALETTE = {
|
|
149
|
+
deep: [0.027, 0.235, 0.2],
|
|
150
|
+
mid: [0.051, 0.42, 0.322],
|
|
151
|
+
crest: [0.137, 0.627, 0.36],
|
|
152
|
+
slate: [0.12, 0.17, 0.19],
|
|
153
|
+
white: [0.85, 1, 0.9]
|
|
154
|
+
};
|
|
155
|
+
var BACKDROP = "radial-gradient(120% 95% at 28% 58%, var(--berget-brand-moss-900) 0%, var(--berget-brand-moss-950) 55%, var(--berget-brand-granite-950) 100%)";
|
|
156
|
+
function mulberry32(seed) {
|
|
157
|
+
let a = seed >>> 0;
|
|
158
|
+
return () => {
|
|
159
|
+
a |= 0;
|
|
160
|
+
a = a + 1831565813 | 0;
|
|
161
|
+
let t = Math.imul(a ^ a >>> 15, 1 | a);
|
|
162
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
163
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function buildNetwork(seed, orientation) {
|
|
167
|
+
const rng = mulberry32(seed);
|
|
168
|
+
const nodeCount = LAYER_SIZES.reduce((a, b) => a + b, 0);
|
|
169
|
+
const positions = new Float32Array(nodeCount * 3);
|
|
170
|
+
const layerStart = [];
|
|
171
|
+
let flat = 0;
|
|
172
|
+
LAYER_SIZES.forEach((size, li) => {
|
|
173
|
+
layerStart.push(flat);
|
|
174
|
+
const [rows, cols] = LAYER_GRID[li];
|
|
175
|
+
for (let i = 0; i < size; i++) {
|
|
176
|
+
const r = Math.floor(i / cols);
|
|
177
|
+
const c = i % cols;
|
|
178
|
+
const o = flat * 3;
|
|
179
|
+
if (orientation === "vertical") {
|
|
180
|
+
positions[o] = (c - (cols - 1) / 2) * CELL;
|
|
181
|
+
positions[o + 1] = li * LAYER_X;
|
|
182
|
+
positions[o + 2] = (r - (rows - 1) / 2) * CELL;
|
|
183
|
+
} else {
|
|
184
|
+
positions[o] = li * LAYER_X;
|
|
185
|
+
positions[o + 1] = (r - (rows - 1) / 2) * CELL;
|
|
186
|
+
positions[o + 2] = (c - (cols - 1) / 2) * CELL;
|
|
187
|
+
}
|
|
188
|
+
flat++;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
const fanIn = [0, 9, 10, 10, 7];
|
|
192
|
+
const inEdges = [];
|
|
193
|
+
for (let i = 0; i < nodeCount; i++) inEdges.push([]);
|
|
194
|
+
for (let li = 1; li < LAYER_SIZES.length; li++) {
|
|
195
|
+
const srcBase = layerStart[li - 1];
|
|
196
|
+
const dstBase = layerStart[li];
|
|
197
|
+
for (let d = 0; d < LAYER_SIZES[li]; d++) {
|
|
198
|
+
const k = fanIn[li];
|
|
199
|
+
for (let e = 0; e < k; e++) {
|
|
200
|
+
const src = srcBase + Math.floor(rng() * LAYER_SIZES[li - 1]);
|
|
201
|
+
const excitatory = rng() < 0.85;
|
|
202
|
+
const w = excitatory ? 0.75 + 0.9 * rng() : -(0.35 + 0.35 * rng());
|
|
203
|
+
inEdges[dstBase + d].push({ src, w });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const out = [];
|
|
208
|
+
for (let i = 0; i < nodeCount; i++) out.push({ dst: [], w: [] });
|
|
209
|
+
let edgeCount = 0;
|
|
210
|
+
for (let d = 0; d < nodeCount; d++) edgeCount += inEdges[d].length;
|
|
211
|
+
const edgePositions = new Float32Array(edgeCount * 2 * 3);
|
|
212
|
+
const edgeWeights = new Float32Array(edgeCount * 2);
|
|
213
|
+
let eo = 0;
|
|
214
|
+
for (let d = 0; d < nodeCount; d++) {
|
|
215
|
+
for (const e of inEdges[d]) {
|
|
216
|
+
out[e.src].dst.push(d);
|
|
217
|
+
out[e.src].w.push(e.w);
|
|
218
|
+
edgePositions[eo * 6] = positions[e.src * 3];
|
|
219
|
+
edgePositions[eo * 6 + 1] = positions[e.src * 3 + 1];
|
|
220
|
+
edgePositions[eo * 6 + 2] = positions[e.src * 3 + 2];
|
|
221
|
+
edgePositions[eo * 6 + 3] = positions[d * 3];
|
|
222
|
+
edgePositions[eo * 6 + 4] = positions[d * 3 + 1];
|
|
223
|
+
edgePositions[eo * 6 + 5] = positions[d * 3 + 2];
|
|
224
|
+
const a = Math.min(1, Math.abs(e.w) * 1.6);
|
|
225
|
+
edgeWeights[eo * 2] = a;
|
|
226
|
+
edgeWeights[eo * 2 + 1] = a;
|
|
227
|
+
eo++;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
positions,
|
|
232
|
+
nodeCount,
|
|
233
|
+
layerStart,
|
|
234
|
+
out,
|
|
235
|
+
inEdges,
|
|
236
|
+
edgePositions,
|
|
237
|
+
edgeWeights,
|
|
238
|
+
edgeCount
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
var FlowSim = class {
|
|
242
|
+
constructor(seed = 1337, orientation = "horizontal", blobs = glyphBlobs(), images = [], trained = decodeWeights()) {
|
|
243
|
+
this.predictedClass = 0;
|
|
244
|
+
this.rng = mulberry32(12648430);
|
|
245
|
+
this.tokens = [];
|
|
246
|
+
this.time = 0;
|
|
247
|
+
this.nextSample = 0.8;
|
|
248
|
+
this.sampleUntil = -10;
|
|
249
|
+
// far past
|
|
250
|
+
this.sampleClass = 0;
|
|
251
|
+
this.sampleVariant = 0;
|
|
252
|
+
this.emitAcc = 0;
|
|
253
|
+
this.net = buildNetwork(seed, orientation);
|
|
254
|
+
attachWeights(this.net, trained);
|
|
255
|
+
this.blobs = blobs;
|
|
256
|
+
this.images = images;
|
|
257
|
+
this.trained = trained;
|
|
258
|
+
this.energy = new Float32Array(this.net.nodeCount);
|
|
259
|
+
this.act = new Float32Array(this.net.nodeCount);
|
|
260
|
+
this.nodeAttr = new Float32Array(this.net.nodeCount);
|
|
261
|
+
this.tokenPos = new Float32Array(TOKEN_POOL * 3);
|
|
262
|
+
this.tokenGain = new Float32Array(TOKEN_POOL);
|
|
263
|
+
for (let i = 0; i < TOKEN_POOL; i++) this.tokens.push(null);
|
|
264
|
+
}
|
|
265
|
+
get network() {
|
|
266
|
+
return this.net;
|
|
267
|
+
}
|
|
268
|
+
/** Advance the whole inference world by dt seconds (clamped internally). */
|
|
269
|
+
step(dt, intensity) {
|
|
270
|
+
dt = Math.min(dt, 0.12);
|
|
271
|
+
this.time += dt;
|
|
272
|
+
const decay = Math.pow(0.42, dt);
|
|
273
|
+
const inDecay = Math.pow(0.6, dt);
|
|
274
|
+
const outDecay = Math.pow(0.3, dt);
|
|
275
|
+
const inEnd = this.net.layerStart[1];
|
|
276
|
+
const outStart = this.net.layerStart[LAYER_SIZES.length - 1];
|
|
277
|
+
for (let i = 0; i < this.act.length; i++) {
|
|
278
|
+
this.act[i] = this.act[i] * (i >= outStart ? outDecay : i < inEnd ? inDecay : decay);
|
|
279
|
+
}
|
|
280
|
+
if (this.time >= this.nextSample) {
|
|
281
|
+
this.sampleClass = Math.floor(this.rng() * CLASSES);
|
|
282
|
+
const variants = this.blobs[this.sampleClass];
|
|
283
|
+
this.sampleVariant = Math.floor(this.rng() * variants.length);
|
|
284
|
+
this.sampleUntil = this.time + SAMPLE_WINDOW;
|
|
285
|
+
this.nextSample = this.time + SAMPLE_INTERVAL;
|
|
286
|
+
const { predicted, energy } = forwardPass(
|
|
287
|
+
this.net,
|
|
288
|
+
this.trained,
|
|
289
|
+
this.imageOf(this.sampleClass, this.sampleVariant)
|
|
290
|
+
);
|
|
291
|
+
this.predictedClass = predicted;
|
|
292
|
+
this.energy = energy;
|
|
293
|
+
}
|
|
294
|
+
const fade = Math.pow(0.55, dt);
|
|
295
|
+
if (this.time > this.sampleUntil) {
|
|
296
|
+
for (let i = 0; i < this.energy.length; i++) this.energy[i] = this.energy[i] * fade;
|
|
297
|
+
}
|
|
298
|
+
const inSample = this.time < this.sampleUntil;
|
|
299
|
+
const rate = (inSample ? SAMPLE_RATE : TRICKLE_RATE) * intensity;
|
|
300
|
+
this.emitAcc += rate * dt;
|
|
301
|
+
while (this.emitAcc >= 1) {
|
|
302
|
+
this.emitAcc -= 1;
|
|
303
|
+
this.inject(inSample);
|
|
304
|
+
}
|
|
305
|
+
for (let i = 0; i < TOKEN_POOL; i++) {
|
|
306
|
+
const tok = this.tokens[i];
|
|
307
|
+
if (!tok) continue;
|
|
308
|
+
tok.t += tok.rate * dt;
|
|
309
|
+
const p = this.net.positions;
|
|
310
|
+
const s3 = tok.src * 3;
|
|
311
|
+
const d3 = tok.dst * 3;
|
|
312
|
+
const t = Math.min(tok.t, 1);
|
|
313
|
+
tok.pos = [
|
|
314
|
+
p[s3] + (p[d3] - p[s3]) * t,
|
|
315
|
+
p[s3 + 1] + (p[d3 + 1] - p[s3 + 1]) * t,
|
|
316
|
+
p[s3 + 2] + (p[d3 + 2] - p[s3 + 2]) * t
|
|
317
|
+
];
|
|
318
|
+
if (tok.t < 1) continue;
|
|
319
|
+
const isFinal = tok.layer === LAYER_SIZES.length - 2;
|
|
320
|
+
let pulse = tok.gain * 0.55;
|
|
321
|
+
if (isFinal) {
|
|
322
|
+
const c = tok.dst - this.net.layerStart[LAYER_SIZES.length - 1];
|
|
323
|
+
if (c === this.predictedClass) pulse *= 3.8;
|
|
324
|
+
}
|
|
325
|
+
this.act[tok.dst] = Math.min(2, Math.max(-2, this.act[tok.dst] + pulse));
|
|
326
|
+
const energyHere = this.energy[tok.dst];
|
|
327
|
+
if (inSample && !isFinal && energyHere < 0.1 && this.rng() < 0.7) {
|
|
328
|
+
this.tokens[i] = null;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const gain = Math.min(0.25 + 1.6 * energyHere, 2.4);
|
|
332
|
+
if (isFinal) {
|
|
333
|
+
this.tokens[i] = null;
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const outs = this.net.out[tok.dst];
|
|
337
|
+
if (outs.dst.length === 0) {
|
|
338
|
+
this.tokens[i] = null;
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const pick = Math.floor(this.rng() * outs.dst.length);
|
|
342
|
+
tok.src = tok.dst;
|
|
343
|
+
tok.dst = outs.dst[pick];
|
|
344
|
+
tok.w = outs.w[pick];
|
|
345
|
+
tok.layer += 1;
|
|
346
|
+
tok.t = 0;
|
|
347
|
+
const len = edgeLen(this.net.positions, tok.src, tok.dst);
|
|
348
|
+
tok.rate = 1.35 / Math.max(len, 0.05) * (0.75 + this.rng() * 0.5);
|
|
349
|
+
tok.gain = gain;
|
|
350
|
+
}
|
|
351
|
+
for (let i = 0; i < this.act.length; i++) this.nodeAttr[i] = this.act[i];
|
|
352
|
+
}
|
|
353
|
+
/** The 784-vector for a class variant: real image if we have one,
|
|
354
|
+
otherwise intensities derived from the blob shape. */
|
|
355
|
+
imageOf(cls, variant) {
|
|
356
|
+
const list = this.images[cls];
|
|
357
|
+
if (list && list.length > 0) return list[Math.min(variant, list.length - 1)];
|
|
358
|
+
const img = new Float32Array(784);
|
|
359
|
+
const blob = this.blobs[cls][Math.min(variant, this.blobs[cls].length - 1)];
|
|
360
|
+
for (const c of blob) img[c.i] = Math.min(1, c.w + 0.25);
|
|
361
|
+
return img;
|
|
362
|
+
}
|
|
363
|
+
inject(fromBlob) {
|
|
364
|
+
const slot = this.tokens.indexOf(null);
|
|
365
|
+
if (slot < 0) return;
|
|
366
|
+
const rng = this.rng;
|
|
367
|
+
let src;
|
|
368
|
+
if (fromBlob) {
|
|
369
|
+
const variants = this.blobs[this.sampleClass];
|
|
370
|
+
const blob = variants[Math.min(this.sampleVariant, variants.length - 1)];
|
|
371
|
+
src = pickWeightedBlob(blob, rng());
|
|
372
|
+
} else {
|
|
373
|
+
src = Math.floor(rng() * LAYER_SIZES[0]);
|
|
374
|
+
}
|
|
375
|
+
const outs = this.net.out[src];
|
|
376
|
+
if (outs.dst.length === 0) return;
|
|
377
|
+
const pick = Math.floor(rng() * outs.dst.length);
|
|
378
|
+
const len = edgeLen(this.net.positions, src, outs.dst[pick]);
|
|
379
|
+
this.tokens[slot] = {
|
|
380
|
+
src,
|
|
381
|
+
dst: outs.dst[pick],
|
|
382
|
+
w: outs.w[pick],
|
|
383
|
+
layer: 0,
|
|
384
|
+
t: 0,
|
|
385
|
+
rate: 1.35 / Math.max(len, 0.05) * (0.75 + rng() * 0.5),
|
|
386
|
+
gain: fromBlob ? 1 : 0.6,
|
|
387
|
+
pos: [0, 0, 0]
|
|
388
|
+
};
|
|
389
|
+
this.act[src] = Math.min(2, this.act[src] + (fromBlob ? 0.9 : 0.12));
|
|
390
|
+
}
|
|
391
|
+
/** Write live token rows into the point buffers (dead rows stay 0). */
|
|
392
|
+
writeTokenBuffers() {
|
|
393
|
+
for (let i = 0; i < TOKEN_POOL; i++) {
|
|
394
|
+
const tok = this.tokens[i];
|
|
395
|
+
const o = i * 3;
|
|
396
|
+
if (!tok) {
|
|
397
|
+
this.tokenGain[i] = 0;
|
|
398
|
+
this.tokenPos[o] = 0;
|
|
399
|
+
this.tokenPos[o + 1] = 0;
|
|
400
|
+
this.tokenPos[o + 2] = 0;
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
this.tokenPos[o] = tok.pos[0];
|
|
404
|
+
this.tokenPos[o + 1] = tok.pos[1];
|
|
405
|
+
this.tokenPos[o + 2] = tok.pos[2];
|
|
406
|
+
this.tokenGain[i] = tok.gain;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
function glyphBlobs() {
|
|
411
|
+
const rng = mulberry32(857623);
|
|
412
|
+
const all = [];
|
|
413
|
+
for (let cls = 0; cls < CLASSES; cls++) {
|
|
414
|
+
const field = new Float32Array(28 * 28);
|
|
415
|
+
const glyph = DIGITS[cls];
|
|
416
|
+
const dx = 4 + Math.floor(rng() * 3);
|
|
417
|
+
const dy = Math.floor(rng() * 3) - 1;
|
|
418
|
+
for (let gr = 0; gr < 7; gr++) {
|
|
419
|
+
const row = glyph[gr];
|
|
420
|
+
for (let gc = 0; gc < 5; gc++) {
|
|
421
|
+
if (row[gc] !== "#") continue;
|
|
422
|
+
for (let k = 0; k < 4; k++) {
|
|
423
|
+
for (let l = 0; l < 4; l++) {
|
|
424
|
+
const r = gr * 4 + l + dy;
|
|
425
|
+
const c = gc * 4 + k + dx;
|
|
426
|
+
if (r < 28 && c < 28) field[r * 28 + c] = 1;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
const blob = [];
|
|
432
|
+
for (let i = 0; i < 784; i++) {
|
|
433
|
+
if (field[i] > 0) blob.push({ i, w: 1 });
|
|
434
|
+
}
|
|
435
|
+
for (let k = 0; k < 8; k++) blob.push({ i: Math.floor(rng() * 784), w: 0.15 });
|
|
436
|
+
all.push([blob]);
|
|
437
|
+
}
|
|
438
|
+
return all;
|
|
439
|
+
}
|
|
440
|
+
function decodeB64(b64) {
|
|
441
|
+
const bin = atob(b64.replace(/-/g, "+").replace(/_/g, "/"));
|
|
442
|
+
const buf = new Uint8Array(bin.length);
|
|
443
|
+
for (let i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
|
|
444
|
+
return buf;
|
|
445
|
+
}
|
|
446
|
+
function decodeF32(b64) {
|
|
447
|
+
return new Float32Array(decodeB64(b64).buffer);
|
|
448
|
+
}
|
|
449
|
+
function decodeWeights() {
|
|
450
|
+
return {
|
|
451
|
+
w: [
|
|
452
|
+
decodeF32(SPARSE_WEIGHTS.weights1),
|
|
453
|
+
decodeF32(SPARSE_WEIGHTS.weights2),
|
|
454
|
+
decodeF32(SPARSE_WEIGHTS.weights3),
|
|
455
|
+
decodeF32(SPARSE_WEIGHTS.weights4)
|
|
456
|
+
],
|
|
457
|
+
b: [
|
|
458
|
+
decodeF32(SPARSE_WEIGHTS.biases1),
|
|
459
|
+
decodeF32(SPARSE_WEIGHTS.biases2),
|
|
460
|
+
decodeF32(SPARSE_WEIGHTS.biases3),
|
|
461
|
+
decodeF32(SPARSE_WEIGHTS.biases4)
|
|
462
|
+
]
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
function attachWeights(net, trained) {
|
|
466
|
+
const layerStart = net.layerStart;
|
|
467
|
+
for (let li = 1; li < 5; li++) {
|
|
468
|
+
const base = layerStart[li];
|
|
469
|
+
const w = trained.w[li - 1];
|
|
470
|
+
let eo2 = 0;
|
|
471
|
+
const nextBase = li < 4 ? layerStart[li + 1] : net.nodeCount;
|
|
472
|
+
for (let dlocal = 0; dlocal < nextBase - base; dlocal++) {
|
|
473
|
+
const dst = base + dlocal;
|
|
474
|
+
const list = net.inEdges[dst];
|
|
475
|
+
for (const e of list) {
|
|
476
|
+
e.w = w[eo2];
|
|
477
|
+
eo2++;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (eo2 !== w.length) throw new Error(`layer ${li}: expected ${w.length} edges, got ${eo2}`);
|
|
481
|
+
}
|
|
482
|
+
for (const o of net.out) {
|
|
483
|
+
o.dst.length = 0;
|
|
484
|
+
o.w.length = 0;
|
|
485
|
+
}
|
|
486
|
+
let eo = 0;
|
|
487
|
+
for (let d = 0; d < net.nodeCount; d++) {
|
|
488
|
+
for (const e of net.inEdges[d]) {
|
|
489
|
+
net.out[e.src].dst.push(d);
|
|
490
|
+
net.out[e.src].w.push(e.w);
|
|
491
|
+
net.edgeWeights[eo * 2] = Math.min(1, Math.abs(e.w) * 1.7);
|
|
492
|
+
net.edgeWeights[eo * 2 + 1] = Math.min(1, Math.abs(e.w) * 1.7);
|
|
493
|
+
eo++;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function forwardPass(net, trained, img) {
|
|
498
|
+
const act = new Float32Array(net.nodeCount);
|
|
499
|
+
act.set(img);
|
|
500
|
+
const layerStart = net.layerStart;
|
|
501
|
+
for (let li = 1; li < 5; li++) {
|
|
502
|
+
const base = layerStart[li];
|
|
503
|
+
const size = LAYER_SIZES[li];
|
|
504
|
+
const bias = trained.b[li - 1];
|
|
505
|
+
for (let dl = 0; dl < size; dl++) {
|
|
506
|
+
let z = bias[dl];
|
|
507
|
+
for (const e of net.inEdges[base + dl]) z += act[e.src] * e.w;
|
|
508
|
+
act[base + dl] = li < 4 ? Math.max(z, 0) : z;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
const energy = new Float32Array(act.length);
|
|
512
|
+
for (let li = 0; li < 5; li++) {
|
|
513
|
+
const base = layerStart[li];
|
|
514
|
+
const size = LAYER_SIZES[li];
|
|
515
|
+
let max = 1e-4;
|
|
516
|
+
for (let i = base; i < base + size; i++) max = Math.max(max, act[i]);
|
|
517
|
+
for (let i = base; i < base + size; i++) energy[i] = Math.max(act[i], 0) / max;
|
|
518
|
+
}
|
|
519
|
+
const outBase = layerStart[4];
|
|
520
|
+
let predicted = 0;
|
|
521
|
+
let top = -1e9;
|
|
522
|
+
for (let c = 0; c < CLASSES; c++) {
|
|
523
|
+
if (act[outBase + c] > top) {
|
|
524
|
+
top = act[outBase + c];
|
|
525
|
+
predicted = c;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return { predicted, energy };
|
|
529
|
+
}
|
|
530
|
+
function decodeAll(samples) {
|
|
531
|
+
const blobs = [];
|
|
532
|
+
const images = [];
|
|
533
|
+
for (let c = 0; c < CLASSES; c++) {
|
|
534
|
+
const cellList = [];
|
|
535
|
+
const imgList = [];
|
|
536
|
+
for (const b64 of samples[c] ?? []) {
|
|
537
|
+
const buf = decodeB64(b64);
|
|
538
|
+
const cells = [];
|
|
539
|
+
const img = new Float32Array(784);
|
|
540
|
+
for (let n = 0; n < 784; n++) {
|
|
541
|
+
const byte = buf[n >> 1];
|
|
542
|
+
const v = n & 1 ? byte & 15 : byte >> 4;
|
|
543
|
+
if (v >= 5) cells.push({ i: n, w: (v - 4) / 11 });
|
|
544
|
+
img[n] = v / 15;
|
|
545
|
+
}
|
|
546
|
+
cellList.push(cells);
|
|
547
|
+
imgList.push(img);
|
|
548
|
+
}
|
|
549
|
+
blobs.push(cellList);
|
|
550
|
+
images.push(imgList);
|
|
551
|
+
}
|
|
552
|
+
return { blobs, images };
|
|
553
|
+
}
|
|
554
|
+
function pickWeightedBlob(blob, r) {
|
|
555
|
+
let total = 0;
|
|
556
|
+
for (const c of blob) total += c.w;
|
|
557
|
+
let acc = r * total;
|
|
558
|
+
for (const c of blob) {
|
|
559
|
+
acc -= c.w;
|
|
560
|
+
if (acc <= 0) return c.i;
|
|
561
|
+
}
|
|
562
|
+
return blob[blob.length - 1].i;
|
|
563
|
+
}
|
|
564
|
+
function edgeLen(p, a, b) {
|
|
565
|
+
const a3 = a * 3;
|
|
566
|
+
const b3 = b * 3;
|
|
567
|
+
const dx = p[b3] - p[a3];
|
|
568
|
+
const dy = p[b3 + 1] - p[a3 + 1];
|
|
569
|
+
const dz = p[b3 + 2] - p[a3 + 2];
|
|
570
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
571
|
+
}
|
|
572
|
+
var POINT_VERT = (
|
|
573
|
+
/* glsl */
|
|
574
|
+
`
|
|
575
|
+
attribute float aAct; // node activation, or token gain for tokens
|
|
576
|
+
uniform float uHeightPx, uFovTan, uDpr, uFocusDist, uBlurK;
|
|
577
|
+
uniform float uBaseSize;
|
|
578
|
+
varying float vAct;
|
|
579
|
+
varying float vFade;
|
|
580
|
+
void main() {
|
|
581
|
+
vec4 mv = modelViewMatrix * vec4(position, 1.0);
|
|
582
|
+
float dist = max(-mv.z, 0.001);
|
|
583
|
+
vAct = aAct;
|
|
584
|
+
float a = max(aAct, 0.0);
|
|
585
|
+
float worldSize = uBaseSize * (1.0 + clamp(a, 0.0, 2.0) * 0.9);
|
|
586
|
+
// uHeightPx is the drawing-buffer height (already device px), so the
|
|
587
|
+
// world-size term needs no uDpr; the pixel-space defocus offset does.
|
|
588
|
+
float px = worldSize * (uHeightPx * 0.5) / (uFovTan * dist);
|
|
589
|
+
float dz = dist - uFocusDist;
|
|
590
|
+
px += (dz < 0.0 ? -dz * 0.55 : dz * 0.8) * uBlurK * uDpr;
|
|
591
|
+
gl_PointSize = min(px, 90.0 * uDpr);
|
|
592
|
+
vFade = clamp(1.0 - abs(dz) * 0.16, 0.25, 1.0);
|
|
593
|
+
gl_Position = projectionMatrix * mv;
|
|
594
|
+
}
|
|
595
|
+
`
|
|
596
|
+
);
|
|
597
|
+
var NODE_FRAG = (
|
|
598
|
+
/* glsl */
|
|
599
|
+
`
|
|
600
|
+
uniform float uExposure;
|
|
601
|
+
varying float vAct;
|
|
602
|
+
varying float vFade;
|
|
603
|
+
const vec3 DEEP = vec3(${PALETTE.deep.join(",")});
|
|
604
|
+
const vec3 MID = vec3(${PALETTE.mid.join(",")});
|
|
605
|
+
const vec3 CREST = vec3(${PALETTE.crest.join(",")});
|
|
606
|
+
const vec3 SLATE = vec3(${PALETTE.slate.join(",")});
|
|
607
|
+
const vec3 WHITE = vec3(${PALETTE.white.join(",")});
|
|
608
|
+
void main() {
|
|
609
|
+
float d = length(gl_PointCoord - 0.5) * 2.0;
|
|
610
|
+
float disc = smoothstep(1.0, 0.35, d);
|
|
611
|
+
if (disc < 0.01) discard;
|
|
612
|
+
float a = vAct;
|
|
613
|
+
vec3 col;
|
|
614
|
+
float glow;
|
|
615
|
+
if (a >= 0.0) {
|
|
616
|
+
col = mix(MID, CREST, clamp(a, 0.0, 1.0));
|
|
617
|
+
// Overdriven nodes bloom toward the brand's crystal white-green.
|
|
618
|
+
float bloom = smoothstep(1.05, 1.9, a);
|
|
619
|
+
col = mix(col, WHITE, bloom);
|
|
620
|
+
glow = 0.36 + 0.64 * clamp(a, 0.0, 1.0) + bloom * 0.9;
|
|
621
|
+
} else {
|
|
622
|
+
col = mix(DEEP, SLATE, clamp(-a, 0.0, 1.0));
|
|
623
|
+
glow = 0.16 + 0.25 * clamp(-a, 0.0, 1.0);
|
|
624
|
+
}
|
|
625
|
+
gl_FragColor = vec4(col * uExposure, disc * 0.62 * glow * vFade);
|
|
626
|
+
}
|
|
627
|
+
`
|
|
628
|
+
);
|
|
629
|
+
var TOKEN_FRAG = (
|
|
630
|
+
/* glsl */
|
|
631
|
+
`
|
|
632
|
+
uniform float uExposure;
|
|
633
|
+
varying float vAct;
|
|
634
|
+
varying float vFade;
|
|
635
|
+
const vec3 CREST = vec3(${PALETTE.crest.join(",")});
|
|
636
|
+
const vec3 WHITE = vec3(${PALETTE.white.join(",")});
|
|
637
|
+
void main() {
|
|
638
|
+
float g = vAct;
|
|
639
|
+
if (g < 0.004) discard;
|
|
640
|
+
float d = length(gl_PointCoord - 0.5) * 2.0;
|
|
641
|
+
float core = smoothstep(0.55, 0.05, d);
|
|
642
|
+
float halo = smoothstep(1.0, 0.3, d) * 0.45;
|
|
643
|
+
if (core + halo < 0.01) discard;
|
|
644
|
+
// Amplified tokens run hot toward white-green.
|
|
645
|
+
vec3 col = mix(CREST, WHITE, smoothstep(1.1, 2.1, g));
|
|
646
|
+
float b = (0.35 + 0.65 * clamp(g, 0.0, 1.6)) * (core + halo);
|
|
647
|
+
gl_FragColor = vec4(col * uExposure, b * 0.78 * vFade);
|
|
648
|
+
}
|
|
649
|
+
`
|
|
650
|
+
);
|
|
651
|
+
var EDGE_VERT = (
|
|
652
|
+
/* glsl */
|
|
653
|
+
`
|
|
654
|
+
attribute float aEdgeW;
|
|
655
|
+
varying float vW;
|
|
656
|
+
void main() {
|
|
657
|
+
vW = aEdgeW;
|
|
658
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
659
|
+
}
|
|
660
|
+
`
|
|
661
|
+
);
|
|
662
|
+
var EDGE_FRAG = (
|
|
663
|
+
/* glsl */
|
|
664
|
+
`
|
|
665
|
+
varying float vW;
|
|
666
|
+
const vec3 DEEP = vec3(${PALETTE.crest.join(",")});
|
|
667
|
+
void main() {
|
|
668
|
+
gl_FragColor = vec4(DEEP, 0.02 + 0.05 * vW);
|
|
669
|
+
}
|
|
670
|
+
`
|
|
671
|
+
);
|
|
672
|
+
var FOG_VERT = (
|
|
673
|
+
/* glsl */
|
|
674
|
+
`
|
|
675
|
+
varying vec2 vUv;
|
|
676
|
+
void main() {
|
|
677
|
+
vUv = uv;
|
|
678
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
679
|
+
}
|
|
680
|
+
`
|
|
681
|
+
);
|
|
682
|
+
var FOG_FRAG = (
|
|
683
|
+
/* glsl */
|
|
684
|
+
`
|
|
685
|
+
uniform float uTime;
|
|
686
|
+
varying vec2 vUv;
|
|
687
|
+
|
|
688
|
+
float hash(vec2 p) {
|
|
689
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
|
690
|
+
}
|
|
691
|
+
float noise(vec2 p) {
|
|
692
|
+
vec2 i = floor(p);
|
|
693
|
+
vec2 f = fract(p);
|
|
694
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
695
|
+
return mix(
|
|
696
|
+
mix(hash(i), hash(i + vec2(1, 0)), f.x),
|
|
697
|
+
mix(hash(i + vec2(0, 1)), hash(i + vec2(1, 1)), f.x),
|
|
698
|
+
f.y
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
void main() {
|
|
703
|
+
vec2 c = vUv - 0.5;
|
|
704
|
+
float r = length(c) * 2.0;
|
|
705
|
+
// Soft brand-green well behind the stack, vignetted to darkness.
|
|
706
|
+
vec3 col = vec3(0.012, 0.05, 0.04) * max(1.0 - r, 0.0);
|
|
707
|
+
col += vec3(0.01, 0.06, 0.045) * max(1.5 - r * 1.25, 0.0);
|
|
708
|
+
// Slow drifting wisps crossing in front of the black.
|
|
709
|
+
float w = noise(vec2(vUv.x * 3.0 - uTime * 0.02, vUv.y * 6.0 + uTime * 0.013));
|
|
710
|
+
w = pow(w, 3.0) * 0.5;
|
|
711
|
+
col += vec3(0.05, 0.11, 0.09) * w * (1.0 - smoothstep(0.6, 1.2, r));
|
|
712
|
+
gl_FragColor = vec4(col, 1.0);
|
|
713
|
+
}
|
|
714
|
+
`
|
|
715
|
+
);
|
|
716
|
+
var DEFAULT_KNOBS = {
|
|
717
|
+
zoom: 1,
|
|
718
|
+
exposure: 1.45,
|
|
719
|
+
focus: 8,
|
|
720
|
+
blurK: 4,
|
|
721
|
+
speed: 1,
|
|
722
|
+
intensity: 1,
|
|
723
|
+
drift: 1,
|
|
724
|
+
spin: 0.02
|
|
725
|
+
};
|
|
726
|
+
var BASE_FOV = 36;
|
|
727
|
+
function camFor(orientation) {
|
|
728
|
+
return orientation === "vertical" ? {
|
|
729
|
+
base: new THREE.Vector3(0.7, 3.5, 9.6),
|
|
730
|
+
target: new THREE.Vector3(0, 2.45, 0),
|
|
731
|
+
center: new THREE.Vector3(0, 2.7, 0),
|
|
732
|
+
fogSize: [13, 15],
|
|
733
|
+
fogPos: new THREE.Vector3(1.5, 2.7, -6.5),
|
|
734
|
+
fogRot: 0
|
|
735
|
+
} : {
|
|
736
|
+
base: new THREE.Vector3(-0.9, 0.88, 6.1),
|
|
737
|
+
target: new THREE.Vector3(2.35, -0.08, -0.2),
|
|
738
|
+
center: new THREE.Vector3(2.7, 0, 0),
|
|
739
|
+
fogSize: [14, 8],
|
|
740
|
+
fogPos: new THREE.Vector3(7.2, 0, 0),
|
|
741
|
+
fogRot: -Math.PI / 2
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
function SceneContent({
|
|
745
|
+
knobs: knobsRef,
|
|
746
|
+
orientation,
|
|
747
|
+
blobs,
|
|
748
|
+
images
|
|
749
|
+
}) {
|
|
750
|
+
const { invalidate } = (0, import_fiber.useThree)();
|
|
751
|
+
const trained = (0, import_react.useMemo)(() => decodeWeights(), []);
|
|
752
|
+
const sim = (0, import_react.useMemo)(
|
|
753
|
+
() => new FlowSim(1337, orientation, blobs, images, trained),
|
|
754
|
+
[orientation, blobs, images, trained]
|
|
755
|
+
);
|
|
756
|
+
const camCfg = (0, import_react.useMemo)(() => camFor(orientation), [orientation]);
|
|
757
|
+
const fogPlane = (0, import_react.useMemo)(
|
|
758
|
+
() => new THREE.PlaneGeometry(camCfg.fogSize[0], camCfg.fogSize[1]),
|
|
759
|
+
[camCfg]
|
|
760
|
+
);
|
|
761
|
+
const geos = (0, import_react.useMemo)(() => {
|
|
762
|
+
const net = sim.network;
|
|
763
|
+
const nodes = new THREE.BufferGeometry();
|
|
764
|
+
nodes.setAttribute("position", new THREE.BufferAttribute(net.positions, 3));
|
|
765
|
+
const actAttr = new THREE.BufferAttribute(sim.nodeAttr, 1);
|
|
766
|
+
actAttr.setUsage(THREE.DynamicDrawUsage);
|
|
767
|
+
nodes.setAttribute("aAct", actAttr);
|
|
768
|
+
const tokens = new THREE.BufferGeometry();
|
|
769
|
+
const posAttr = new THREE.BufferAttribute(sim.tokenPos, 3);
|
|
770
|
+
posAttr.setUsage(THREE.DynamicDrawUsage);
|
|
771
|
+
tokens.setAttribute("position", posAttr);
|
|
772
|
+
const gainAttr = new THREE.BufferAttribute(sim.tokenGain, 1);
|
|
773
|
+
gainAttr.setUsage(THREE.DynamicDrawUsage);
|
|
774
|
+
tokens.setAttribute("aAct", gainAttr);
|
|
775
|
+
const b = 6;
|
|
776
|
+
nodes.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);
|
|
777
|
+
tokens.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);
|
|
778
|
+
const edges = new THREE.BufferGeometry();
|
|
779
|
+
edges.setAttribute("position", new THREE.BufferAttribute(net.edgePositions, 3));
|
|
780
|
+
edges.setAttribute("aEdgeW", new THREE.BufferAttribute(net.edgeWeights, 1));
|
|
781
|
+
edges.boundingSphere = new THREE.Sphere(camCfg.center.clone(), b);
|
|
782
|
+
return [nodes, tokens, edges];
|
|
783
|
+
}, [sim, camCfg]);
|
|
784
|
+
const nodeMat = (0, import_react.useMemo)(() => makePointMaterial(), []);
|
|
785
|
+
const tokenMat = (0, import_react.useMemo)(() => makeTokenMaterial(), []);
|
|
786
|
+
const edgeMat = (0, import_react.useMemo)(
|
|
787
|
+
() => new THREE.ShaderMaterial({
|
|
788
|
+
vertexShader: EDGE_VERT,
|
|
789
|
+
fragmentShader: EDGE_FRAG,
|
|
790
|
+
transparent: true,
|
|
791
|
+
depthWrite: false,
|
|
792
|
+
blending: THREE.AdditiveBlending,
|
|
793
|
+
uniforms: {}
|
|
794
|
+
}),
|
|
795
|
+
[]
|
|
796
|
+
);
|
|
797
|
+
const fogMat = (0, import_react.useMemo)(
|
|
798
|
+
() => new THREE.ShaderMaterial({
|
|
799
|
+
vertexShader: FOG_VERT,
|
|
800
|
+
fragmentShader: FOG_FRAG,
|
|
801
|
+
depthWrite: false,
|
|
802
|
+
blending: THREE.NoBlending,
|
|
803
|
+
uniforms: { uTime: { value: 0 } }
|
|
804
|
+
}),
|
|
805
|
+
[]
|
|
806
|
+
);
|
|
807
|
+
(0, import_react.useEffect)(
|
|
808
|
+
() => () => {
|
|
809
|
+
for (const g of geos) g.dispose();
|
|
810
|
+
fogPlane.dispose();
|
|
811
|
+
nodeMat.dispose();
|
|
812
|
+
tokenMat.dispose();
|
|
813
|
+
edgeMat.dispose();
|
|
814
|
+
fogMat.dispose();
|
|
815
|
+
},
|
|
816
|
+
[geos, fogPlane, nodeMat, tokenMat, edgeMat, fogMat]
|
|
817
|
+
);
|
|
818
|
+
const worldTimeRef = (0, import_react.useRef)(0);
|
|
819
|
+
const lastElapsedRef = (0, import_react.useRef)(0);
|
|
820
|
+
const warmedSimRef = (0, import_react.useRef)(null);
|
|
821
|
+
const spinRef = (0, import_react.useRef)(null);
|
|
822
|
+
(0, import_fiber.useFrame)((state) => {
|
|
823
|
+
const speed = reduced() ? 0 : knobsRef.current.speed;
|
|
824
|
+
const dt = Math.min(state.clock.elapsedTime - lastElapsedRef.current, 0.25);
|
|
825
|
+
lastElapsedRef.current = state.clock.elapsedTime;
|
|
826
|
+
worldTimeRef.current += dt * Math.max(speed, 0);
|
|
827
|
+
const t = reduced() ? 8 : worldTimeRef.current;
|
|
828
|
+
const justWarmed = warmedSimRef.current !== sim;
|
|
829
|
+
if (justWarmed) {
|
|
830
|
+
for (let i = 0; i < 120; i++) sim.step(1 / 30, 1);
|
|
831
|
+
warmedSimRef.current = sim;
|
|
832
|
+
} else if (!reduced()) {
|
|
833
|
+
sim.step(dt * Math.max(speed, 0), knobsRef.current.intensity);
|
|
834
|
+
}
|
|
835
|
+
sim.writeTokenBuffers();
|
|
836
|
+
for (const [geo, attr] of [
|
|
837
|
+
[geos[0], "aAct"],
|
|
838
|
+
[geos[1], "position"],
|
|
839
|
+
[geos[1], "aAct"]
|
|
840
|
+
]) {
|
|
841
|
+
const a = geo.getAttribute(attr);
|
|
842
|
+
a.needsUpdate = true;
|
|
843
|
+
}
|
|
844
|
+
const cam = state.camera;
|
|
845
|
+
const fov = BASE_FOV / Math.max(knobsRef.current.zoom, 0.05);
|
|
846
|
+
if (Math.abs(cam.fov - fov) > 0.01) {
|
|
847
|
+
cam.fov = fov;
|
|
848
|
+
cam.updateProjectionMatrix();
|
|
849
|
+
}
|
|
850
|
+
const drift = knobsRef.current.drift;
|
|
851
|
+
cam.position.set(
|
|
852
|
+
camCfg.base.x + Math.sin(t * 0.11) * 0.16 * drift,
|
|
853
|
+
camCfg.base.y + Math.sin(t * 0.073 + 2) * 0.09 * drift,
|
|
854
|
+
camCfg.base.z + Math.cos(t * 0.091) * 0.16 * drift
|
|
855
|
+
);
|
|
856
|
+
cam.lookAt(camCfg.target);
|
|
857
|
+
const height = state.gl.domElement.height;
|
|
858
|
+
const fovTan = Math.tan(THREE.MathUtils.degToRad(cam.fov * 0.5));
|
|
859
|
+
for (const m of [nodeMat, tokenMat]) {
|
|
860
|
+
m.uniforms.uHeightPx.value = height;
|
|
861
|
+
m.uniforms.uFovTan.value = fovTan;
|
|
862
|
+
m.uniforms.uDpr.value = state.gl.getPixelRatio();
|
|
863
|
+
m.uniforms.uFocusDist.value = knobsRef.current.focus;
|
|
864
|
+
m.uniforms.uBlurK.value = knobsRef.current.blurK;
|
|
865
|
+
m.uniforms.uExposure.value = knobsRef.current.exposure;
|
|
866
|
+
}
|
|
867
|
+
if (spinRef.current) spinRef.current.rotation.y = t * knobsRef.current.spin;
|
|
868
|
+
fogMat.uniforms.uTime.value = t;
|
|
869
|
+
if (!reduced() || justWarmed) invalidate();
|
|
870
|
+
});
|
|
871
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("group", { children: [
|
|
872
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
873
|
+
"mesh",
|
|
874
|
+
{
|
|
875
|
+
geometry: fogPlane,
|
|
876
|
+
material: fogMat,
|
|
877
|
+
position: camCfg.fogPos.toArray(),
|
|
878
|
+
rotation: [0, camCfg.fogRot, 0],
|
|
879
|
+
renderOrder: 0
|
|
880
|
+
},
|
|
881
|
+
orientation
|
|
882
|
+
),
|
|
883
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("group", { ref: spinRef, position: camCfg.center.toArray(), children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("group", { position: camCfg.center.clone().negate().toArray(), children: [
|
|
884
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("lineSegments", { geometry: geos[2], material: edgeMat, renderOrder: 1 }),
|
|
885
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("points", { geometry: geos[0], material: nodeMat, renderOrder: 2 }),
|
|
886
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("points", { geometry: geos[1], material: tokenMat, renderOrder: 3 })
|
|
887
|
+
] }) })
|
|
888
|
+
] });
|
|
889
|
+
}
|
|
890
|
+
function makePointMaterial() {
|
|
891
|
+
return new THREE.ShaderMaterial({
|
|
892
|
+
vertexShader: POINT_VERT,
|
|
893
|
+
fragmentShader: NODE_FRAG,
|
|
894
|
+
transparent: true,
|
|
895
|
+
depthWrite: false,
|
|
896
|
+
blending: THREE.AdditiveBlending,
|
|
897
|
+
uniforms: {
|
|
898
|
+
uHeightPx: { value: 600 },
|
|
899
|
+
uFovTan: { value: 0.3 },
|
|
900
|
+
uDpr: { value: 1 },
|
|
901
|
+
uFocusDist: { value: 8 },
|
|
902
|
+
uBlurK: { value: 4 },
|
|
903
|
+
uBaseSize: { value: 0.025 },
|
|
904
|
+
uExposure: { value: 1.45 }
|
|
905
|
+
}
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
function makeTokenMaterial() {
|
|
909
|
+
return new THREE.ShaderMaterial({
|
|
910
|
+
vertexShader: POINT_VERT,
|
|
911
|
+
fragmentShader: TOKEN_FRAG,
|
|
912
|
+
transparent: true,
|
|
913
|
+
depthWrite: false,
|
|
914
|
+
blending: THREE.AdditiveBlending,
|
|
915
|
+
uniforms: {
|
|
916
|
+
uHeightPx: { value: 600 },
|
|
917
|
+
uFovTan: { value: 0.3 },
|
|
918
|
+
uDpr: { value: 1 },
|
|
919
|
+
uFocusDist: { value: 8 },
|
|
920
|
+
uBlurK: { value: 4 },
|
|
921
|
+
uBaseSize: { value: 0.011 },
|
|
922
|
+
uExposure: { value: 1.35 }
|
|
923
|
+
}
|
|
924
|
+
});
|
|
925
|
+
}
|
|
926
|
+
function reduced() {
|
|
927
|
+
return typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
928
|
+
}
|
|
929
|
+
var NeuralFlow = ({
|
|
930
|
+
className,
|
|
931
|
+
style,
|
|
932
|
+
orientation = "horizontal",
|
|
933
|
+
inputSamples,
|
|
934
|
+
zoom,
|
|
935
|
+
exposure,
|
|
936
|
+
focus,
|
|
937
|
+
blurK,
|
|
938
|
+
speed,
|
|
939
|
+
intensity,
|
|
940
|
+
drift,
|
|
941
|
+
spin
|
|
942
|
+
}) => {
|
|
943
|
+
const noAtob = typeof atob === "undefined";
|
|
944
|
+
const { blobs, images } = (0, import_react.useMemo)(() => {
|
|
945
|
+
const src = inputSamples === void 0 ? MNIST_SAMPLES : inputSamples;
|
|
946
|
+
if (noAtob || Object.keys(src).length === 0) {
|
|
947
|
+
return { blobs: glyphBlobs(), images: [] };
|
|
948
|
+
}
|
|
949
|
+
const decoded = decodeAll(src);
|
|
950
|
+
return decoded.blobs.every((v) => v.length > 0) ? decoded : { blobs: glyphBlobs(), images: [] };
|
|
951
|
+
}, [inputSamples, noAtob]);
|
|
952
|
+
const knobs = (0, import_react.useRef)({ ...DEFAULT_KNOBS });
|
|
953
|
+
(0, import_react.useEffect)(() => {
|
|
954
|
+
knobs.current = {
|
|
955
|
+
zoom: zoom ?? DEFAULT_KNOBS.zoom,
|
|
956
|
+
exposure: exposure ?? DEFAULT_KNOBS.exposure,
|
|
957
|
+
focus: focus ?? DEFAULT_KNOBS.focus,
|
|
958
|
+
blurK: blurK ?? DEFAULT_KNOBS.blurK,
|
|
959
|
+
speed: speed ?? DEFAULT_KNOBS.speed,
|
|
960
|
+
intensity: intensity ?? DEFAULT_KNOBS.intensity,
|
|
961
|
+
drift: drift ?? DEFAULT_KNOBS.drift,
|
|
962
|
+
spin: spin ?? DEFAULT_KNOBS.spin
|
|
963
|
+
};
|
|
964
|
+
}, [zoom, exposure, focus, blurK, speed, intensity, drift, spin]);
|
|
965
|
+
if (noAtob) {
|
|
966
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
967
|
+
"div",
|
|
968
|
+
{
|
|
969
|
+
"aria-hidden": "true",
|
|
970
|
+
className,
|
|
971
|
+
style: { ...style, position: "absolute", inset: 0, background: BACKDROP }
|
|
972
|
+
}
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
976
|
+
"div",
|
|
977
|
+
{
|
|
978
|
+
className,
|
|
979
|
+
style: {
|
|
980
|
+
...style,
|
|
981
|
+
position: "absolute",
|
|
982
|
+
inset: 0,
|
|
983
|
+
background: BACKDROP
|
|
984
|
+
},
|
|
985
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
986
|
+
import_fiber.Canvas,
|
|
987
|
+
{
|
|
988
|
+
"aria-hidden": "true",
|
|
989
|
+
dpr: [1, 2],
|
|
990
|
+
frameloop: reduced() ? "demand" : "always",
|
|
991
|
+
camera: { position: camFor(orientation).base.toArray(), fov: BASE_FOV },
|
|
992
|
+
gl: {
|
|
993
|
+
// Opaque canvas — sidesteps compositing quirks around
|
|
994
|
+
// premultiplied additive pixels (renders black-transparent on
|
|
995
|
+
// some stacks, stalls readback on others). The backdrop tone
|
|
996
|
+
// comes from the clear color + fog plane instead.
|
|
997
|
+
alpha: false,
|
|
998
|
+
antialias: true,
|
|
999
|
+
powerPreference: "high-performance",
|
|
1000
|
+
preserveDrawingBuffer: true
|
|
1001
|
+
},
|
|
1002
|
+
onCreated: ({ gl }) => {
|
|
1003
|
+
gl.setClearColor(67590, 1);
|
|
1004
|
+
},
|
|
1005
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SceneContent, { knobs, orientation, blobs, images })
|
|
1006
|
+
}
|
|
1007
|
+
)
|
|
1008
|
+
}
|
|
1009
|
+
);
|
|
1010
|
+
};
|
|
1011
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1012
|
+
0 && (module.exports = {
|
|
1013
|
+
NeuralFlow
|
|
1014
|
+
});
|
|
1015
|
+
//# sourceMappingURL=neural-flow.cjs.map
|